Skip to content

Commit 5c01c9a

Browse files
authored
CryptoExchange.Net update (#44)
Updated CryptoExchange.Net to version 10.4.0 Added GateIoUserSpotDataTracker and GateIoUserFuturesDataTracker Added additional methods for requesting supported symbols to Shared ISpotSymbolRestClient/IFuturesSymbolRestClient interfaces Added PositionMode mapping on SharedPosition models Added Status mapping for SharedDeposit models Fixed disposed clients getting returned from UserClientProvider
1 parent fef57d9 commit 5c01c9a

9 files changed

Lines changed: 329 additions & 6 deletions

GateIo.Net/Clients/FuturesApi/GateIoRestClientPerpetualFuturesApiShared.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,44 @@ async Task<ExchangeWebResult<SharedFuturesSymbol[]>> IFuturesSymbolRestClient.Ge
215215
return response;
216216
}
217217

218+
async Task<ExchangeResult<SharedSymbol[]>> IFuturesSymbolRestClient.GetFuturesSymbolsForBaseAssetAsync(string baseAsset)
219+
{
220+
if (!ExchangeSymbolCache.HasCached(_topicId))
221+
{
222+
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
223+
if (!symbols)
224+
return new ExchangeResult<SharedSymbol[]>(Exchange, symbols.Error!);
225+
}
226+
227+
return new ExchangeResult<SharedSymbol[]>(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, baseAsset));
228+
}
229+
230+
async Task<ExchangeResult<bool>> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(SharedSymbol symbol)
231+
{
232+
if (symbol.TradingMode == TradingMode.Spot)
233+
throw new ArgumentException(nameof(symbol), "Spot symbols not allowed");
234+
235+
if (!ExchangeSymbolCache.HasCached(_topicId))
236+
{
237+
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
238+
if (!symbols)
239+
return new ExchangeResult<bool>(Exchange, symbols.Error!);
240+
}
241+
242+
return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol));
243+
}
244+
245+
async Task<ExchangeResult<bool>> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(string symbolName)
246+
{
247+
if (!ExchangeSymbolCache.HasCached(_topicId))
248+
{
249+
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
250+
if (!symbols)
251+
return new ExchangeResult<bool>(Exchange, symbols.Error!);
252+
}
253+
254+
return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbolName));
255+
}
218256
#endregion
219257

220258
#region Futures Order Client
@@ -537,6 +575,7 @@ async Task<ExchangeWebResult<SharedPosition[]>> IFuturesOrderRestClient.GetPosit
537575
LiquidationPrice = x.LiquidationPrice,
538576
AverageOpenPrice = x.EntryPrice,
539577
Leverage = x.Leverage,
578+
PositionMode = x.PositionMode == PositionMode.Single ? SharedPositionMode.OneWay : SharedPositionMode.HedgeMode,
540579
PositionSide = x.PositionMode == PositionMode.Single ? (x.Size > 0 ? SharedPositionSide.Long : SharedPositionSide.Short) : x.PositionMode == PositionMode.DualShort ? SharedPositionSide.Short : SharedPositionSide.Long
541580
}).ToArray());
542581
}
@@ -552,6 +591,7 @@ async Task<ExchangeWebResult<SharedPosition[]>> IFuturesOrderRestClient.GetPosit
552591
LiquidationPrice = result.Data.LiquidationPrice,
553592
AverageOpenPrice = result.Data.EntryPrice,
554593
Leverage = result.Data.Leverage,
594+
PositionMode = result.Data.PositionMode == PositionMode.Single ? SharedPositionMode.OneWay : SharedPositionMode.HedgeMode,
555595
PositionSide = result.Data.PositionMode == PositionMode.Single ? (result.Data.Size > 0 ? SharedPositionSide.Long : SharedPositionSide.Short) : result.Data.PositionMode == PositionMode.DualShort ? SharedPositionSide.Short : SharedPositionSide.Long
556596
} });
557597
}

GateIo.Net/Clients/FuturesApi/GateIoSocketClientPerpetualFuturesApiShared.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ async Task<ExchangeResult<UpdateSubscription>> IPositionSocketClient.SubscribeTo
298298
update => handler(update.ToType<SharedPosition[]>(update.Data.Select(x => new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicId, x.Contract), x.Contract, Math.Abs(x.Size), update.DataTime ?? update.ReceiveTime)
299299
{
300300
AverageOpenPrice = x.EntryPrice == 0 ? null : x.EntryPrice,
301+
PositionMode = x.PositionMode == Enums.PositionMode.Single ? SharedPositionMode.OneWay : SharedPositionMode.HedgeMode,
301302
PositionSide = x.PositionMode == Enums.PositionMode.Single ? (x.Size > 0 ? SharedPositionSide.Long : SharedPositionSide.Short) : x.PositionMode == Enums.PositionMode.DualShort ? SharedPositionSide.Short : SharedPositionSide.Long,
302303
LiquidationPrice = x.LiquidationPrice == 0 ? null : x.LiquidationPrice,
303304
Leverage = x.Leverage == 0 ? null : x.Leverage

GateIo.Net/Clients/GateIoUserClientProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void ClearUserClients(string userIdentifier)
6464
/// <inheritdoc />
6565
public IGateIoRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, GateIoEnvironment? environment = null)
6666
{
67-
if (!_restClients.TryGetValue(userIdentifier, out var client))
67+
if (!_restClients.TryGetValue(userIdentifier, out var client) || client.Disposed)
6868
client = CreateRestClient(userIdentifier, credentials, environment);
6969

7070
return client;
@@ -73,7 +73,7 @@ public IGateIoRestClient GetRestClient(string userIdentifier, ApiCredentials? cr
7373
/// <inheritdoc />
7474
public IGateIoSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, GateIoEnvironment? environment = null)
7575
{
76-
if (!_socketClients.TryGetValue(userIdentifier, out var client))
76+
if (!_socketClients.TryGetValue(userIdentifier, out var client) || client.Disposed)
7777
client = CreateSocketClient(userIdentifier, credentials, environment);
7878

7979
return client;

GateIo.Net/Clients/SpotApi/GateIoRestClientSpotApiShared.cs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,44 @@ async Task<ExchangeWebResult<SharedSpotSymbol[]>> ISpotSymbolRestClient.GetSpotS
117117
return response;
118118
}
119119

120+
async Task<ExchangeResult<SharedSymbol[]>> ISpotSymbolRestClient.GetSpotSymbolsForBaseAssetAsync(string baseAsset)
121+
{
122+
if (!ExchangeSymbolCache.HasCached(_topicId))
123+
{
124+
var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
125+
if (!symbols)
126+
return new ExchangeResult<SharedSymbol[]>(Exchange, symbols.Error!);
127+
}
128+
129+
return new ExchangeResult<SharedSymbol[]>(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, baseAsset));
130+
}
131+
132+
async Task<ExchangeResult<bool>> ISpotSymbolRestClient.SupportsSpotSymbolAsync(SharedSymbol symbol)
133+
{
134+
if (symbol.TradingMode != TradingMode.Spot)
135+
throw new ArgumentException(nameof(symbol), "Only Spot symbols allowed");
136+
137+
if (!ExchangeSymbolCache.HasCached(_topicId))
138+
{
139+
var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
140+
if (!symbols)
141+
return new ExchangeResult<bool>(Exchange, symbols.Error!);
142+
}
143+
144+
return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol));
145+
}
146+
147+
async Task<ExchangeResult<bool>> ISpotSymbolRestClient.SupportsSpotSymbolAsync(string symbolName)
148+
{
149+
if (!ExchangeSymbolCache.HasCached(_topicId))
150+
{
151+
var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
152+
if (!symbols)
153+
return new ExchangeResult<bool>(Exchange, symbols.Error!);
154+
}
155+
156+
return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbolName));
157+
}
120158
#endregion
121159

122160
#region Ticker client
@@ -691,7 +729,15 @@ async Task<ExchangeWebResult<SharedDeposit[]>> IDepositRestClient.GetDepositsAsy
691729
if (deposits.Data.Count() == (request.Limit ?? 100))
692730
nextToken = new OffsetToken((offset ?? 0) + deposits.Data.Count());
693731

694-
return deposits.AsExchangeResult<SharedDeposit[]>(Exchange, TradingMode.Spot, deposits.Data.Select(x => new SharedDeposit(x.Asset, x.Quantity, x.Status == WithdrawalStatus.Done, x.Timestamp)
732+
return deposits.AsExchangeResult<SharedDeposit[]>(Exchange, TradingMode.Spot, deposits.Data.Select(x =>
733+
new SharedDeposit(
734+
x.Asset,
735+
x.Quantity,
736+
x.Status == WithdrawalStatus.Done,
737+
x.Timestamp,
738+
x.Status == WithdrawalStatus.Done || x.Status == WithdrawalStatus.Final || x.Status == WithdrawalStatus.Credited ? SharedTransferStatus.Completed
739+
: x.Status == WithdrawalStatus.Blocked || x.Status == WithdrawalStatus.Invalid || x.Status == WithdrawalStatus.FailedConfirmation || x.Status == WithdrawalStatus.Canceled ? SharedTransferStatus.Failed
740+
: SharedTransferStatus.InProgress)
695741
{
696742
Network = x.Network,
697743
TransactionId = x.TransactionId,

GateIo.Net/GateIo.Net.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
<PrivateAssets>all</PrivateAssets>
5353
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5454
</PackageReference>
55-
<PackageReference Include="CryptoExchange.Net" Version="10.3.0" />
55+
<PackageReference Include="CryptoExchange.Net" Version="10.4.0" />
5656
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.101">
5757
<PrivateAssets>all</PrivateAssets>
5858
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

GateIo.Net/GateIo.Net.xml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4600,6 +4600,37 @@
46004600
<member name="M:GateIo.Net.GateIoTrackerFactory.CreateTradeTracker(CryptoExchange.Net.SharedApis.SharedSymbol,System.Nullable{System.Int32},System.Nullable{System.TimeSpan})">
46014601
<inheritdoc />
46024602
</member>
4603+
<member name="M:GateIo.Net.GateIoTrackerFactory.CreateUserSpotDataTracker(CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
4604+
<inheritdoc />
4605+
</member>
4606+
<member name="M:GateIo.Net.GateIoTrackerFactory.CreateUserSpotDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig,GateIo.Net.GateIoEnvironment)">
4607+
<inheritdoc />
4608+
</member>
4609+
<member name="M:GateIo.Net.GateIoTrackerFactory.CreateUserPerpetualFuturesDataTracker(System.String,System.Int64,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig)">
4610+
<inheritdoc />
4611+
</member>
4612+
<member name="M:GateIo.Net.GateIoTrackerFactory.CreateUserPerpetualFuturesDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,System.String,System.Int64,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,GateIo.Net.GateIoEnvironment)">
4613+
<inheritdoc />
4614+
</member>
4615+
<member name="T:GateIo.Net.GateIoUserSpotDataTracker">
4616+
<inheritdoc/>
4617+
</member>
4618+
<member name="M:GateIo.Net.GateIoUserSpotDataTracker.#ctor(Microsoft.Extensions.Logging.ILogger{GateIo.Net.GateIoUserSpotDataTracker},GateIo.Net.Interfaces.Clients.IGateIoRestClient,GateIo.Net.Interfaces.Clients.IGateIoSocketClient,System.String,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
4619+
<summary>
4620+
ctor
4621+
</summary>
4622+
</member>
4623+
<member name="T:GateIo.Net.GateIoUserPerpetualFuturesDataTracker">
4624+
<inheritdoc/>
4625+
</member>
4626+
<member name="P:GateIo.Net.GateIoUserPerpetualFuturesDataTracker.WebsocketPositionUpdatesAreFullSnapshots">
4627+
<inheritdoc/>
4628+
</member>
4629+
<member name="M:GateIo.Net.GateIoUserPerpetualFuturesDataTracker.#ctor(Microsoft.Extensions.Logging.ILogger{GateIo.Net.GateIoUserPerpetualFuturesDataTracker},GateIo.Net.Interfaces.Clients.IGateIoRestClient,GateIo.Net.Interfaces.Clients.IGateIoSocketClient,System.String,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,CryptoExchange.Net.SharedApis.ExchangeParameters)">
4630+
<summary>
4631+
ctor
4632+
</summary>
4633+
</member>
46034634
<member name="T:GateIo.Net.Interfaces.Clients.RebateApi.IGateIoRestClientAlphaApi">
46044635
<summary>
46054636
GateIo Alpha API endpoints
@@ -7210,6 +7241,40 @@
72107241
Tracker factory
72117242
</summary>
72127243
</member>
7244+
<member name="M:GateIo.Net.Interfaces.IGateIoTrackerFactory.CreateUserSpotDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig,GateIo.Net.GateIoEnvironment)">
7245+
<summary>
7246+
Create a new Spot user data tracker
7247+
</summary>
7248+
<param name="userIdentifier">User identifier</param>
7249+
<param name="config">Configuration</param>
7250+
<param name="credentials">Credentials</param>
7251+
<param name="environment">Environment</param>
7252+
</member>
7253+
<member name="M:GateIo.Net.Interfaces.IGateIoTrackerFactory.CreateUserSpotDataTracker(CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
7254+
<summary>
7255+
Create a new spot user data tracker
7256+
</summary>
7257+
<param name="config">Configuration</param>
7258+
</member>
7259+
<member name="M:GateIo.Net.Interfaces.IGateIoTrackerFactory.CreateUserPerpetualFuturesDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,System.String,System.Int64,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,GateIo.Net.GateIoEnvironment)">
7260+
<summary>
7261+
Create a new futures user data tracker
7262+
</summary>
7263+
<param name="userIdentifier">User identifier</param>
7264+
<param name="settleAsset">Settlement asset, for example `usdt`</param>
7265+
<param name="userId">The user id</param>
7266+
<param name="config">Configuration</param>
7267+
<param name="credentials">Credentials</param>
7268+
<param name="environment">Environment</param>
7269+
</member>
7270+
<member name="M:GateIo.Net.Interfaces.IGateIoTrackerFactory.CreateUserPerpetualFuturesDataTracker(System.String,System.Int64,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig)">
7271+
<summary>
7272+
Create a new futures user data tracker
7273+
</summary>
7274+
<param name="settleAsset">Settlement asset, for example `usdt`</param>
7275+
<param name="userId">The user id</param>
7276+
<param name="config">Configuration</param>
7277+
</member>
72137278
<member name="T:GateIo.Net.Objects.GateIoApiAddresses">
72147279
<summary>
72157280
Api addresses

GateIo.Net/GateIoTrackerFactory.cs

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
using CryptoExchange.Net.SharedApis;
1+
using CryptoExchange.Net.Authentication;
2+
using CryptoExchange.Net.SharedApis;
23
using CryptoExchange.Net.Trackers.Klines;
34
using CryptoExchange.Net.Trackers.Trades;
5+
using CryptoExchange.Net.Trackers.UserData.Interfaces;
6+
using CryptoExchange.Net.Trackers.UserData.Objects;
47
using GateIo.Net.Clients;
58
using GateIo.Net.Interfaces;
69
using GateIo.Net.Interfaces.Clients;
710
using Microsoft.Extensions.DependencyInjection;
811
using Microsoft.Extensions.Logging;
12+
using Microsoft.Extensions.Logging.Abstractions;
913
using System;
1014

1115
namespace GateIo.Net
@@ -100,5 +104,73 @@ public ITradeTracker CreateTradeTracker(SharedSymbol symbol, int? limit = null,
100104
period
101105
);
102106
}
107+
108+
/// <inheritdoc />
109+
public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig? config = null)
110+
{
111+
var restClient = _serviceProvider?.GetRequiredService<IGateIoRestClient>() ?? new GateIoRestClient();
112+
var socketClient = _serviceProvider?.GetRequiredService<IGateIoSocketClient>() ?? new GateIoSocketClient();
113+
return new GateIoUserSpotDataTracker(
114+
_serviceProvider?.GetRequiredService<ILogger<GateIoUserSpotDataTracker>>() ?? new NullLogger<GateIoUserSpotDataTracker>(),
115+
restClient,
116+
socketClient,
117+
null,
118+
config
119+
);
120+
}
121+
122+
/// <inheritdoc />
123+
public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, GateIoEnvironment? environment = null)
124+
{
125+
var clientProvider = _serviceProvider?.GetRequiredService<IGateIoUserClientProvider>() ?? new GateIoUserClientProvider();
126+
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
127+
var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment);
128+
return new GateIoUserSpotDataTracker(
129+
_serviceProvider?.GetRequiredService<ILogger<GateIoUserSpotDataTracker>>() ?? new NullLogger<GateIoUserSpotDataTracker>(),
130+
restClient,
131+
socketClient,
132+
userIdentifier,
133+
config
134+
);
135+
}
136+
137+
/// <inheritdoc />
138+
public IUserFuturesDataTracker CreateUserPerpetualFuturesDataTracker(string settleAsset, long userId, FuturesUserDataTrackerConfig? config = null)
139+
{
140+
var exchangeParams = new ExchangeParameters(
141+
new ExchangeParameter("GateIo", "SettleAsset", settleAsset),
142+
new ExchangeParameter("GateIo", "UserId", userId));
143+
144+
var restClient = _serviceProvider?.GetRequiredService<IGateIoRestClient>() ?? new GateIoRestClient();
145+
var socketClient = _serviceProvider?.GetRequiredService<IGateIoSocketClient>() ?? new GateIoSocketClient();
146+
return new GateIoUserPerpetualFuturesDataTracker(
147+
_serviceProvider?.GetRequiredService<ILogger<GateIoUserPerpetualFuturesDataTracker>>() ?? new NullLogger<GateIoUserPerpetualFuturesDataTracker>(),
148+
restClient,
149+
socketClient,
150+
null,
151+
config,
152+
exchangeParams
153+
);
154+
}
155+
156+
/// <inheritdoc />
157+
public IUserFuturesDataTracker CreateUserPerpetualFuturesDataTracker(string userIdentifier, ApiCredentials credentials, string settleAsset, long userId, FuturesUserDataTrackerConfig? config = null, GateIoEnvironment? environment = null)
158+
{
159+
var exchangeParams = new ExchangeParameters(
160+
new ExchangeParameter("GateIo", "SettleAsset", settleAsset),
161+
new ExchangeParameter("GateIo", "UserId", userId));
162+
163+
var clientProvider = _serviceProvider?.GetRequiredService<IGateIoUserClientProvider>() ?? new GateIoUserClientProvider();
164+
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
165+
var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment);
166+
return new GateIoUserPerpetualFuturesDataTracker(
167+
_serviceProvider?.GetRequiredService<ILogger<GateIoUserPerpetualFuturesDataTracker>>() ?? new NullLogger<GateIoUserPerpetualFuturesDataTracker>(),
168+
restClient,
169+
socketClient,
170+
userIdentifier,
171+
config,
172+
exchangeParams
173+
);
174+
}
103175
}
104176
}

0 commit comments

Comments
 (0)