Skip to content

Commit c8b2a2d

Browse files
authored
Binance.US: added exchange support (#481)
* Binance.US: added exchange support - since Binance and Binance.US share the same API, they inherit from BinanceGroupCommon - this is similar to the refactoring in OKGroup #418 - fixed bug in ExchangeGlobalCurrencyReplacements in BitBank - added trade stream (websockets) support for Binance DEX - unfortunately, Binance DEX doesn't share the same API as Binance and Binance.US - now that a new ExchangeBinanceDEXAPI class is created, others are free to contribute additional implementation details * skip Binance.US, Binance DEX, and BitMEX in GlobalSymbol testing * include TickerType in BinanceDEXTrade.ToString() * make BinanceGroup specific models internal * fix GetSymbol() test to correctly ignore Binance for now
1 parent d3484ec commit c8b2a2d

16 files changed

+280
-51
lines changed

ExchangeSharp/API/Exchanges/Binance/ExchangeBinanceAPI.cs renamed to ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,36 @@ The above copyright notice and this permission notice shall be included in all c
1010
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1111
*/
1212
#nullable enable
13+
using Newtonsoft.Json;
14+
using Newtonsoft.Json.Linq;
1315
using System;
1416
using System.Collections.Generic;
1517
using System.Linq;
16-
using System.Net;
1718
using System.Text;
1819
using System.Threading.Tasks;
19-
using System.Web;
20-
using ExchangeSharp.Binance;
21-
using Newtonsoft.Json;
22-
using Newtonsoft.Json.Linq;
2320

24-
namespace ExchangeSharp
21+
namespace ExchangeSharp.BinanceGroup
2522
{
26-
using ExchangeSharp.Binance;
27-
28-
public sealed partial class ExchangeBinanceAPI : ExchangeAPI
23+
public abstract class BinanceGroupCommon : ExchangeAPI
2924
{
30-
public override string BaseUrl { get; set; } = "https://api.binance.com/api/v1";
31-
public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.com:9443";
32-
public string BaseUrlPrivate { get; set; } = "https://api.binance.com/api/v3";
33-
public string WithdrawalUrlPrivate { get; set; } = "https://api.binance.com/wapi/v3";
34-
35-
// base address for APIs used by the Binance website and not published in the API docs
36-
public const string BaseWebUrl = "https://www.binance.com";
25+
public abstract string BaseUrlPrivate { get; set; }
26+
public abstract string WithdrawalUrlPrivate { get; set; }
27+
/// <summary>
28+
/// base address for APIs used by the Binance website and not published in the API docs
29+
/// </summary>
30+
public abstract string BaseWebUrl { get; set; }
3731

3832
public const string GetCurrenciesUrl = "/assetWithdraw/getAllAsset.html";
3933

40-
static ExchangeBinanceAPI()
34+
static BinanceGroupCommon()
4135
{
42-
ExchangeGlobalCurrencyReplacements[typeof(ExchangeBinanceAPI)] = new KeyValuePair<string, string>[]
36+
ExchangeGlobalCurrencyReplacements[typeof(BinanceGroupCommon)] = new KeyValuePair<string, string>[]
4337
{
4438
new KeyValuePair<string, string>("BCC", "BCH")
4539
};
4640
}
4741

48-
private async Task<string> GetWebSocketStreamUrlForSymbolsAsync(string suffix, params string[] marketSymbols)
42+
protected async Task<string> GetWebSocketStreamUrlForSymbolsAsync(string suffix, params string[] marketSymbols)
4943
{
5044
if (marketSymbols == null || marketSymbols.Length == 0)
5145
{
@@ -65,7 +59,7 @@ private async Task<string> GetWebSocketStreamUrlForSymbolsAsync(string suffix, p
6559
return streams.ToString();
6660
}
6761

68-
public ExchangeBinanceAPI()
62+
protected BinanceGroupCommon()
6963
{
7064
// give binance plenty of room to accept requests
7165
RequestWindow = TimeSpan.FromMilliseconds(60000); // 60000 is max value = max request time window of 60 seconds
@@ -287,7 +281,7 @@ protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(Func<KeyValu
287281
marketSymbols = (await GetMarketSymbolsAsync()).ToArray();
288282
}
289283
string url = await GetWebSocketStreamUrlForSymbolsAsync("@aggTrade", marketSymbols);
290-
return await ConnectWebSocketAsync(url, async (_socket, msg) =>
284+
return await ConnectWebSocketAsync(url, messageCallback: async (_socket, msg) =>
291285
{
292286
JToken token = JToken.Parse(msg.ToStringFromUTF8());
293287
string name = token["stream"].ToStringInvariant();
@@ -296,7 +290,10 @@ protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(Func<KeyValu
296290

297291
// buy=0 -> m = true (The buyer is maker, while the seller is taker).
298292
// buy=1 -> m = false(The seller is maker, while the buyer is taker).
299-
await callback(new KeyValuePair<string, ExchangeTrade>(marketSymbol, token.ParseTradeBinance("q", "p", "m", "E", TimestampType.UnixMilliseconds, "a", "false")));
293+
await callback(new KeyValuePair<string, ExchangeTrade>(marketSymbol,
294+
token.ParseTradeBinance(amountKey: "q", priceKey: "p", typeKey: "m",
295+
timestampKey: "T", // use trade time (T) instead of event time (E)
296+
timestampType: TimestampType.UnixMilliseconds, idKey: "a", typeKeyIsBuyValue: "false")));
300297
});
301298
}
302299

@@ -1095,6 +1092,4 @@ public async Task<string> GetListenKeyAsync()
10951092
return listenKey;
10961093
}
10971094
}
1098-
1099-
public partial class ExchangeName { public const string Binance = "Binance"; }
11001095
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
MIT LICENSE
3+
4+
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7+
8+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11+
*/
12+
13+
using ExchangeSharp.BinanceGroup;
14+
15+
namespace ExchangeSharp
16+
{
17+
public sealed class ExchangeBinanceAPI : BinanceGroupCommon
18+
{
19+
public override string BaseUrl { get; set; } = "https://api.binance.com/api/v1";
20+
public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.com:9443";
21+
public override string BaseUrlPrivate { get; set; } = "https://api.binance.com/api/v3";
22+
public override string WithdrawalUrlPrivate { get; set; } = "https://api.binance.com/wapi/v3";
23+
public override string BaseWebUrl { get; set; } = "https://www.binance.com";
24+
}
25+
26+
public partial class ExchangeName { public const string Binance = "Binance"; }
27+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/*
2+
MIT LICENSE
3+
4+
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7+
8+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11+
*/
12+
13+
using ExchangeSharp.BinanceGroup;
14+
using Newtonsoft.Json.Linq;
15+
using System;
16+
using System.Collections.Generic;
17+
using System.Linq;
18+
using System.Threading.Tasks;
19+
20+
namespace ExchangeSharp
21+
{
22+
public sealed class ExchangeBinanceDEXAPI : ExchangeAPI
23+
{ // unfortunately, Binance DEX doesn't share the same API as Binance and Binance.US, so it shouldn't inherit from BinanceGroupCommon
24+
public override string BaseUrl { get; set; } = "https://dex.binance.org/api/v1";
25+
public override string BaseUrlWebSocket { get; set; } = "wss://dex.binance.org/api/ws";
26+
//public override string BaseUrlPrivate { get; set; } = "https://dex.binance.org/api/v3";
27+
//public override string WithdrawalUrlPrivate { get; set; } = "https://dex.binance.org/wapi/v3";
28+
29+
protected override async Task<IEnumerable<string>> OnGetMarketSymbolsAsync() =>
30+
(await GetMarketSymbolsMetadataAsync()).Select(msm => msm.MarketSymbol);
31+
32+
public override async Task<IEnumerable<ExchangeMarket>> GetMarketSymbolsMetadataAsync()
33+
{
34+
// [{"base_asset_symbol":"AERGO-46B","list_price":"0.00350000","lot_size":"1.00000000","quote_asset_symbol":"BNB","tick_size":"0.00000001"}, ...
35+
var markets = new List<ExchangeMarket>();
36+
JToken allSymbols = await MakeJsonRequestAsync<JToken>("/markets");
37+
foreach (JToken marketSymbolToken in allSymbols)
38+
{
39+
var QuoteCurrency = marketSymbolToken["quote_asset_symbol"].ToStringUpperInvariant();
40+
var BaseCurrency = marketSymbolToken["base_asset_symbol"].ToStringUpperInvariant();
41+
var market = new ExchangeMarket
42+
{
43+
MarketSymbol = BaseCurrency + '_' + QuoteCurrency,
44+
IsActive = true,
45+
BaseCurrency = BaseCurrency,
46+
QuoteCurrency = QuoteCurrency,
47+
};
48+
market.MinTradeSize = marketSymbolToken["lot_size"].ConvertInvariant<decimal>();
49+
market.QuantityStepSize = marketSymbolToken["lot_size"].ConvertInvariant<decimal>();
50+
51+
market.MinPrice = marketSymbolToken["tick_size"].ConvertInvariant<decimal>();
52+
market.PriceStepSize = marketSymbolToken["tick_size"].ConvertInvariant<decimal>();
53+
54+
markets.Add(market);
55+
}
56+
57+
return markets;
58+
}
59+
60+
/// <summary>
61+
/// Binance DEX doesn't suppport streaming aggregate trades like Binance/US
62+
/// </summary>
63+
/// <param name="callback"></param>
64+
/// <param name="marketSymbols"></param>
65+
/// <returns></returns>
66+
protected override async Task<IWebSocket> OnGetTradesWebSocketAsync(Func<KeyValuePair<string, ExchangeTrade>, Task> callback, params string[] marketSymbols)
67+
{
68+
/* actual data, followed by example data
69+
{
70+
"stream": "trades",
71+
"data": [{
72+
"e": "trade",
73+
"E": 47515444,
74+
"s": "CBM-4B2_BNB",
75+
"t": "47515444-0",
76+
"p": "0.00000722",
77+
"q": "24000.00000000",
78+
"b": "F36B58E668004610B5D1DB23A40B496DF27A4D91-91340",
79+
"a": "E9F71B7AFD3325590624A692B7DF5B449AA9BA19-91463",
80+
"T": 1573417196130225520,
81+
"sa": "bnb1a8m3k7haxvj4jp3y56ft0h6mgjd2nwsel6xsx8",
82+
"ba": "bnb17d443engqprppdw3mv36gz6fdhe85nv37p2xq4",
83+
"tt": 1
84+
},
85+
{
86+
"e": "trade", // Event type
87+
"E": 123456795, // Event time
88+
"s": "BNB_BTC", // Symbol
89+
"t": "12348", // Trade ID
90+
"p": "0.001", // Price
91+
"q": "100", // Quantity
92+
"b": "88", // Buyer order ID
93+
"a": "52", // Seller order ID
94+
"T": 123456795, // Trade time
95+
"sa": "bnb1me5u083m2spzt8pw8vunprnctc8syy64hegrcp", // SellerAddress
96+
"ba": "bnb1kdr00ydr8xj3ydcd3a8ej2xxn8lkuja7mdunr5" // BuyerAddress
97+
"tt": 1 //tiekertype 0: Unknown 1: SellTaker 2: BuyTaker 3: BuySurplus 4: SellSurplus 5: Neutral
98+
}]
99+
}
100+
*/
101+
102+
if (marketSymbols == null || marketSymbols.Length == 0)
103+
{
104+
marketSymbols = (await GetMarketSymbolsAsync()).ToArray();
105+
}
106+
return await ConnectWebSocketAsync(string.Empty, messageCallback: async (_socket, msg) =>
107+
{
108+
JToken token = JToken.Parse(msg.ToStringFromUTF8());
109+
if (token["stream"].ToStringLowerInvariant() == "trades")
110+
{
111+
foreach (var data in token["data"])
112+
{
113+
string name = data["s"].ToStringInvariant();
114+
string marketSymbol = NormalizeMarketSymbol(name);
115+
116+
await callback(new KeyValuePair<string, ExchangeTrade>(marketSymbol,
117+
data.ParseTradeBinanceDEX(amountKey: "q", priceKey: "p", typeKey: "tt",
118+
timestampKey: "T", // use trade time (T) instead of event time (E)
119+
timestampType: TimestampType.UnixNanoseconds, idKey: "t", typeKeyIsBuyValue: "BuyTaker")));
120+
}
121+
}
122+
else if (token["error"] != null)
123+
{ // {{ "method": "subscribe", "error": { "error": "Invalid symbol(s)" }}}
124+
Logger.Info(token["error"]["error"].ToStringInvariant());
125+
}
126+
}, connectCallback: async (_socket) =>
127+
{
128+
await _socket.SendMessageAsync(new { method = "subscribe", topic = "trades", symbols = marketSymbols });
129+
});
130+
}
131+
}
132+
133+
public partial class ExchangeName { public const string BinanceDEX = "BinanceDEX"; }
134+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
MIT LICENSE
3+
4+
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7+
8+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11+
*/
12+
13+
using ExchangeSharp.BinanceGroup;
14+
15+
namespace ExchangeSharp
16+
{
17+
public sealed class ExchangeBinanceUSAPI : BinanceGroupCommon
18+
{
19+
public override string BaseUrl { get; set; } = "https://api.binance.us/api/v1";
20+
public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.us:9443";
21+
public override string BaseUrlPrivate { get; set; } = "https://api.binance.us/api/v3";
22+
public override string WithdrawalUrlPrivate { get; set; } = "https://api.binance.us/wapi/v3";
23+
public override string BaseWebUrl { get; set; } = "https://www.binance.us";
24+
}
25+
26+
public partial class ExchangeName { public const string BinanceUS = "BinanceUS"; }
27+
}

ExchangeSharp/API/Exchanges/Binance/Models/BinanceAggregateTrade.cs renamed to ExchangeSharp/API/Exchanges/BinanceGroup/Models/BinanceAggregateTrade.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
MIT LICENSE
33
44
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
@@ -10,13 +10,7 @@ The above copyright notice and this permission notice shall be included in all c
1010
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1111
*/
1212

13-
using System;
14-
using System.Collections.Generic;
15-
using System.Linq;
16-
using System.Text;
17-
using System.Threading.Tasks;
18-
19-
namespace ExchangeSharp.Binance
13+
namespace ExchangeSharp.BinanceGroup
2014
{
2115
public class BinanceAggregateTrade : ExchangeTrade
2216
{
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
MIT LICENSE
3+
4+
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7+
8+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11+
*/
12+
13+
namespace ExchangeSharp.BinanceGroup
14+
{
15+
/// <summary>
16+
/// Binance DEX doesn't suppport streaming aggregate trades like Binance/US
17+
/// </summary>
18+
public class BinanceDEXTrade : ExchangeTrade
19+
{
20+
public string BuyerOrderId { get; set; }
21+
public string SellerOrderId { get; set; }
22+
public string BuyerAddress { get; set; }
23+
public string SellerAddress { get; set; }
24+
public TickerType TickerType { get; set; }
25+
public override string ToString()
26+
{
27+
return string.Format("{0},{1},{2},{3},{4},{5}", base.ToString(), BuyerOrderId, SellerOrderId, BuyerAddress, SellerAddress, TickerType);
28+
}
29+
}
30+
31+
public enum TickerType : byte
32+
{ // tiekertype 0: Unknown 1: SellTaker 2: BuyTaker 3: BuySurplus 4: SellSurplus 5: Neutral
33+
Unknown = 0, SellTaker = 1, BuyTaker = 2, BuySurplus = 3, SellSurplus = 4, Neutral = 5
34+
}
35+
}

ExchangeSharp/API/Exchanges/Binance/Models/Currency.cs renamed to ExchangeSharp/API/Exchanges/BinanceGroup/Models/Currency.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The above copyright notice and this permission notice shall be included in all c
1010
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1111
*/
1212
#nullable enable
13-
namespace ExchangeSharp.Binance
13+
namespace ExchangeSharp.BinanceGroup
1414
{
1515
using Newtonsoft.Json;
1616

ExchangeSharp/API/Exchanges/Binance/Models/MarketDepthDiffUpdate.cs renamed to ExchangeSharp/API/Exchanges/BinanceGroup/Models/MarketDepthDiffUpdate.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The above copyright notice and this permission notice shall be included in all c
1010
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1111
*/
1212

13-
namespace ExchangeSharp.Binance
13+
namespace ExchangeSharp.BinanceGroup
1414
{
1515
using System.Collections.Generic;
1616

ExchangeSharp/API/Exchanges/Binance/Models/MultiDepthStream.cs renamed to ExchangeSharp/API/Exchanges/BinanceGroup/Models/MultiDepthStream.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The above copyright notice and this permission notice shall be included in all c
1010
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1111
*/
1212

13-
namespace ExchangeSharp.Binance
13+
namespace ExchangeSharp.BinanceGroup
1414
{
1515
using Newtonsoft.Json;
1616

0 commit comments

Comments
 (0)