From 9725a93848a03222147fb07f3461c6e90de01585 Mon Sep 17 00:00:00 2001 From: JKorf Date: Sun, 1 Feb 2026 15:39:01 +0100 Subject: [PATCH 1/8] wip --- .../DeepCoinRestClientExchangeApiShared.cs | 75 +++++++++++++++++++ DeepCoin.Net/DeepCoin.Net.csproj | 4 +- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs index dd31b8d..333f47a 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs @@ -350,6 +350,44 @@ async Task> ISpotSymbolRestClient.GetSpotS return response; } + public async Task> GetSpotSymbolsForBaseAssetAsync(string baseAsset) + { + if (!ExchangeSymbolCache.HasCached(_topicSpotId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicSpotId, baseAsset)); + } + + public async Task> SupportsSpotSymbolAsync(SharedSymbol symbol) + { + if (symbol.TradingMode != TradingMode.Spot) + throw new ArgumentException(nameof(symbol), "Only Spot symbols allowed"); + + if (!ExchangeSymbolCache.HasCached(_topicSpotId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicSpotId, symbol)); + } + + public async Task> SupportsSpotSymbolAsync(string symbolName) + { + if (!ExchangeSymbolCache.HasCached(_topicSpotId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicSpotId, symbolName)); + } #endregion #region Spot Order Client @@ -749,7 +787,44 @@ async Task> IFuturesSymbolRestClient.Ge ExchangeSymbolCache.UpdateSymbolInfo(_topicFuturesId, response.Data); return response; } + public async Task> GetFuturesSymbolsForBaseAssetAsync(string baseAsset) + { + if (!ExchangeSymbolCache.HasCached(_topicFuturesId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicFuturesId, baseAsset)); + } + public async Task> SupportsFuturesSymbolAsync(SharedSymbol symbol) + { + if (symbol.TradingMode == TradingMode.Spot) + throw new ArgumentException(nameof(symbol), "Spot symbols not allowed"); + + if (!ExchangeSymbolCache.HasCached(_topicFuturesId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicFuturesId, symbol)); + } + + public async Task> SupportsFuturesSymbolAsync(string symbolName) + { + if (!ExchangeSymbolCache.HasCached(_topicFuturesId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicFuturesId, symbolName)); + } #endregion #region Futures Order Client diff --git a/DeepCoin.Net/DeepCoin.Net.csproj b/DeepCoin.Net/DeepCoin.Net.csproj index cdc02b7..71843a2 100644 --- a/DeepCoin.Net/DeepCoin.Net.csproj +++ b/DeepCoin.Net/DeepCoin.Net.csproj @@ -52,10 +52,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - all runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file From 76136f6027a3ff59c3962c62511729b6b3ad5d3b Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 2 Feb 2026 09:39:35 +0100 Subject: [PATCH 2/8] Added check for disposed client in UserClientProvider --- DeepCoin.Net/Clients/DeepCoinUserClientProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeepCoin.Net/Clients/DeepCoinUserClientProvider.cs b/DeepCoin.Net/Clients/DeepCoinUserClientProvider.cs index a4b6bd5..4073120 100644 --- a/DeepCoin.Net/Clients/DeepCoinUserClientProvider.cs +++ b/DeepCoin.Net/Clients/DeepCoinUserClientProvider.cs @@ -64,7 +64,7 @@ public void ClearUserClients(string userIdentifier) /// public IDeepCoinRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, DeepCoinEnvironment? environment = null) { - if (!_restClients.TryGetValue(userIdentifier, out var client)) + if (!_restClients.TryGetValue(userIdentifier, out var client) || client.Disposed) client = CreateRestClient(userIdentifier, credentials, environment); return client; @@ -73,7 +73,7 @@ public IDeepCoinRestClient GetRestClient(string userIdentifier, ApiCredentials? /// public IDeepCoinSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, DeepCoinEnvironment? environment = null) { - if (!_socketClients.TryGetValue(userIdentifier, out var client)) + if (!_socketClients.TryGetValue(userIdentifier, out var client) || client.Disposed) client = CreateSocketClient(userIdentifier, credentials, environment); return client; From 7e0da723f5a9af308b39aa029fc5f1e5d1f8e473 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 2 Feb 2026 16:36:06 +0100 Subject: [PATCH 3/8] wip --- .../Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs | 3 ++- .../ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs index 333f47a..db16372 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs @@ -1139,7 +1139,8 @@ async Task> IFuturesOrderRestClient.GetPosit { LiquidationPrice = x.LiquidationPrice == 0 ? null : x.LiquidationPrice, Leverage = x.Leverage, - AverageOpenPrice = x.AveragePrice, + AverageOpenPrice = x.AveragePrice, + PositionMode = SharedPositionMode.HedgeMode, PositionSide = x.PositionSide == PositionSide.Long ? SharedPositionSide.Long : SharedPositionSide.Short }).ToArray()); } diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs index cb0b3f5..da3f82e 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs @@ -222,6 +222,7 @@ async Task> IPositionSocketClient.SubscribeTo onPositionMessage: update => handler(update.ToType(update.Data.Select(x => new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicSpotId, x.Symbol), x.Symbol, x.PositionSize, x.UpdateTime) { AverageOpenPrice = x.OpenPrice, + PositionMode = SharedPositionMode.HedgeMode, PositionSide = x.PositionSide == Enums.PositionSide.Short ? SharedPositionSide.Short : SharedPositionSide.Long, Leverage = x.Leverage }).ToArray())), From cca159675a8b884ba7947cb71b0e33c5cd79fd3e Mon Sep 17 00:00:00 2001 From: JKorf Date: Tue, 3 Feb 2026 21:08:11 +0100 Subject: [PATCH 4/8] wip --- .../DeepCoinRestClientExchangeApiShared.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs index db16372..0177ef8 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs @@ -350,7 +350,7 @@ async Task> ISpotSymbolRestClient.GetSpotS return response; } - public async Task> GetSpotSymbolsForBaseAssetAsync(string baseAsset) + async Task> ISpotSymbolRestClient.GetSpotSymbolsForBaseAssetAsync(string baseAsset) { if (!ExchangeSymbolCache.HasCached(_topicSpotId)) { @@ -362,7 +362,7 @@ public async Task> GetSpotSymbolsForBaseAssetAsyn return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicSpotId, baseAsset)); } - public async Task> SupportsSpotSymbolAsync(SharedSymbol symbol) + async Task> ISpotSymbolRestClient.SupportsSpotSymbolAsync(SharedSymbol symbol) { if (symbol.TradingMode != TradingMode.Spot) throw new ArgumentException(nameof(symbol), "Only Spot symbols allowed"); @@ -377,7 +377,7 @@ public async Task> SupportsSpotSymbolAsync(SharedSymbol sym return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicSpotId, symbol)); } - public async Task> SupportsSpotSymbolAsync(string symbolName) + async Task> ISpotSymbolRestClient.SupportsSpotSymbolAsync(string symbolName) { if (!ExchangeSymbolCache.HasCached(_topicSpotId)) { @@ -787,7 +787,7 @@ async Task> IFuturesSymbolRestClient.Ge ExchangeSymbolCache.UpdateSymbolInfo(_topicFuturesId, response.Data); return response; } - public async Task> GetFuturesSymbolsForBaseAssetAsync(string baseAsset) + async Task> IFuturesSymbolRestClient.GetFuturesSymbolsForBaseAssetAsync(string baseAsset) { if (!ExchangeSymbolCache.HasCached(_topicFuturesId)) { @@ -799,7 +799,7 @@ public async Task> GetFuturesSymbolsForBaseAssetA return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicFuturesId, baseAsset)); } - public async Task> SupportsFuturesSymbolAsync(SharedSymbol symbol) + async Task> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(SharedSymbol symbol) { if (symbol.TradingMode == TradingMode.Spot) throw new ArgumentException(nameof(symbol), "Spot symbols not allowed"); @@ -814,7 +814,7 @@ public async Task> SupportsFuturesSymbolAsync(SharedSymbol return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicFuturesId, symbol)); } - public async Task> SupportsFuturesSymbolAsync(string symbolName) + async Task> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(string symbolName) { if (!ExchangeSymbolCache.HasCached(_topicFuturesId)) { From 8a0a7c50c4a64fdb5bf10b5ad1b0f865d273204c Mon Sep 17 00:00:00 2001 From: Jkorf Date: Wed, 4 Feb 2026 16:31:37 +0100 Subject: [PATCH 5/8] wip --- .../DeepCoinRestClientExchangeApiShared.cs | 6 +- .../DeepCoinSocketClientExchangeApiShared.cs | 4 +- DeepCoin.Net/DeepCoin.Net.xml | 61 ++++++++++++++++++ DeepCoin.Net/DeepCoinTrackerFactory.cs | 64 ++++++++++++++++++- DeepCoin.Net/DeepCoinUserDataTracker.cs | 63 ++++++++++++++++++ .../Interfaces/IDeepCoinTrackerFactory.cs | 30 +++++++++ 6 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 DeepCoin.Net/DeepCoinUserDataTracker.cs diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs index 0177ef8..934f3fe 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs @@ -784,7 +784,11 @@ async Task> IFuturesSymbolRestClient.Ge MaxShortLeverage = s.MaxLeverage }).ToArray()); - ExchangeSymbolCache.UpdateSymbolInfo(_topicFuturesId, response.Data); + // Also register [BaseAsset][QuoteAsset] as they might be returned for websocket updates + var symbolRegistrations = response.Data + .Concat(response.Data.Select(x => new SharedSpotSymbol(x.BaseAsset, x.QuoteAsset, x.BaseAsset + x.QuoteAsset, x.Trading, x.TradingMode))).ToArray(); + + ExchangeSymbolCache.UpdateSymbolInfo(_topicFuturesId, symbolRegistrations); return response; } async Task> IFuturesSymbolRestClient.GetFuturesSymbolsForBaseAssetAsync(string baseAsset) diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs index da3f82e..3fc2384 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinSocketClientExchangeApiShared.cs @@ -219,7 +219,7 @@ async Task> IPositionSocketClient.SubscribeTo return new ExchangeResult(Exchange, validationError); var result = await SubscribeToUserDataUpdatesAsync(request.ListenKey!, - onPositionMessage: update => handler(update.ToType(update.Data.Select(x => new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicSpotId, x.Symbol), x.Symbol, x.PositionSize, x.UpdateTime) + onPositionMessage: update => handler(update.ToType(update.Data.Select(x => new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicFuturesId, x.Symbol), x.Symbol, x.PositionSize, x.UpdateTime) { AverageOpenPrice = x.OpenPrice, PositionMode = SharedPositionMode.HedgeMode, @@ -252,7 +252,7 @@ async Task> IUserTradeSocketClient.SubscribeT request.ListenKey!, onUserTradeMessage: update => handler(update.ToType(update.Data.Select(x => new SharedUserTrade( - ExchangeSymbolCache.ParseSymbol(_topicFuturesId, x.Symbol) ?? ExchangeSymbolCache.ParseSymbol(_topicSpotId, x.Symbol), + ExchangeSymbolCache.ParseSymbol(_topicFuturesId, x.Symbol) ?? ExchangeSymbolCache.ParseSymbol(_topicFuturesId, x.Symbol), x.Symbol, x.OrderId.ToString(), x.TradeId.ToString(), diff --git a/DeepCoin.Net/DeepCoin.Net.xml b/DeepCoin.Net/DeepCoin.Net.xml index 9307076..3470a36 100644 --- a/DeepCoin.Net/DeepCoin.Net.xml +++ b/DeepCoin.Net/DeepCoin.Net.xml @@ -1209,6 +1209,37 @@ + + + + + + + + + + + + + + + + + + ctor + + + + + + + + + + + ctor + + Account type @@ -2104,6 +2135,36 @@ Tracker factory + + + Create a new Spot user data tracker + + User identifier + Configuration + Credentials + Environment + + + + Create a new spot user data tracker + + Configuration + + + + Create a new futures user data tracker + + User identifier + Configuration + Credentials + Environment + + + + Create a new futures user data tracker + + Configuration + Api addresses diff --git a/DeepCoin.Net/DeepCoinTrackerFactory.cs b/DeepCoin.Net/DeepCoinTrackerFactory.cs index 5a3a623..983540c 100644 --- a/DeepCoin.Net/DeepCoinTrackerFactory.cs +++ b/DeepCoin.Net/DeepCoinTrackerFactory.cs @@ -1,12 +1,16 @@ +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.SharedApis; using CryptoExchange.Net.Trackers.Klines; using CryptoExchange.Net.Trackers.Trades; +using CryptoExchange.Net.Trackers.UserData.Interfaces; +using CryptoExchange.Net.Trackers.UserData.Objects; +using DeepCoin.Net.Clients; using DeepCoin.Net.Interfaces; using DeepCoin.Net.Interfaces.Clients; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using System; -using DeepCoin.Net.Clients; namespace DeepCoin.Net { @@ -73,5 +77,63 @@ public ITradeTracker CreateTradeTracker(SharedSymbol symbol, int? limit = null, period ); } + + /// + public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig config) + { + var restClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinRestClient(); + var socketClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinSocketClient(); + return new DeepCoinUserSpotDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + null, + config + ); + } + + /// + public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null) + { + var clientProvider = _serviceProvider?.GetRequiredService() ?? new DeepCoinUserClientProvider(); + var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); + var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment); + return new DeepCoinUserSpotDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + userIdentifier, + config + ); + } + + /// + public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config) + { + var restClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinRestClient(); + var socketClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinSocketClient(); + return new DeepCoinUserFuturesDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + null, + config + ); + } + + /// + public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null) + { + var clientProvider = _serviceProvider?.GetRequiredService() ?? new DeepCoinUserClientProvider(); + var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); + var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment); + return new DeepCoinUserFuturesDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + userIdentifier, + config + ); + } } } diff --git a/DeepCoin.Net/DeepCoinUserDataTracker.cs b/DeepCoin.Net/DeepCoinUserDataTracker.cs new file mode 100644 index 0000000..6a7079c --- /dev/null +++ b/DeepCoin.Net/DeepCoinUserDataTracker.cs @@ -0,0 +1,63 @@ +using DeepCoin.Net.Interfaces.Clients; +using CryptoExchange.Net.SharedApis; +using CryptoExchange.Net.Trackers.UserData; +using CryptoExchange.Net.Trackers.UserData.Objects; +using Microsoft.Extensions.Logging; + +namespace DeepCoin.Net +{ + /// + public class DeepCoinUserSpotDataTracker : UserSpotDataTracker + { + /// + /// ctor + /// + public DeepCoinUserSpotDataTracker( + ILogger logger, + IDeepCoinRestClient restClient, + IDeepCoinSocketClient socketClient, + string? userIdentifier, + SpotUserDataTrackerConfig config) : base( + logger, + restClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + userIdentifier, + config) + { + } + } + + /// + public class DeepCoinUserFuturesDataTracker : UserFuturesDataTracker + { + /// + protected override bool WebsocketPositionUpdatesAreFullSnapshots => false; + + /// + /// ctor + /// + public DeepCoinUserFuturesDataTracker( + ILogger logger, + IDeepCoinRestClient restClient, + IDeepCoinSocketClient socketClient, + string? userIdentifier, + FuturesUserDataTrackerConfig config) : base(logger, + restClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + restClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + socketClient.ExchangeApi.SharedClient, + userIdentifier, + config) + { + } + } +} diff --git a/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs b/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs index 3cc15ef..52e9052 100644 --- a/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs +++ b/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs @@ -1,4 +1,7 @@ +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Interfaces; +using CryptoExchange.Net.Trackers.UserData.Interfaces; +using CryptoExchange.Net.Trackers.UserData.Objects; namespace DeepCoin.Net.Interfaces { @@ -7,5 +10,32 @@ namespace DeepCoin.Net.Interfaces /// public interface IDeepCoinTrackerFactory : ITrackerFactory { + /// + /// Create a new Spot user data tracker + /// + /// User identifier + /// Configuration + /// Credentials + /// Environment + IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null); + /// + /// Create a new spot user data tracker + /// + /// Configuration + IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig config); + + /// + /// Create a new futures user data tracker + /// + /// User identifier + /// Configuration + /// Credentials + /// Environment + IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null); + /// + /// Create a new futures user data tracker + /// + /// Configuration + IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config); } } From d87e58e9c7b782471500f3646c6357622d51fbdb Mon Sep 17 00:00:00 2001 From: JKorf Date: Wed, 4 Feb 2026 21:46:20 +0100 Subject: [PATCH 6/8] Added shared deposit status --- .../ExchangeApi/DeepCoinRestClientExchangeApiShared.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs index 934f3fe..fb55251 100644 --- a/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs +++ b/DeepCoin.Net/Clients/ExchangeApi/DeepCoinRestClientExchangeApiShared.cs @@ -86,7 +86,15 @@ async Task> IDepositRestClient.GetDepositsAsy if (result.Data.Total > (result.Data.Page * result.Data.PageSize)) nextToken = new PageToken(page++, pageSize); - return result.AsExchangeResult(Exchange, TradingMode.Spot, result.Data.Data.Select(x => new SharedDeposit(x.Asset, x.Quantity, x.DepositStatus == Enums.DepositStatus.Success, x.CreateTime) + return result.AsExchangeResult(Exchange, TradingMode.Spot, result.Data.Data.Select(x => + new SharedDeposit( + x.Asset, + x.Quantity, + x.DepositStatus == Enums.DepositStatus.Success, + x.CreateTime, + x.DepositStatus == DepositStatus.Success ? SharedTransferStatus.Completed + : x.DepositStatus == DepositStatus.Confirming ? SharedTransferStatus.InProgress + : SharedTransferStatus.Failed) { TransactionId = x.TransactionHash, Network = x.NetworkName, From f0829a9795546952781e26277725100c092caa71 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Thu, 5 Feb 2026 16:28:23 +0100 Subject: [PATCH 7/8] wip --- DeepCoin.Net/DeepCoin.Net.xml | 8 ++++---- DeepCoin.Net/DeepCoinTrackerFactory.cs | 8 ++++---- DeepCoin.Net/DeepCoinUserDataTracker.cs | 8 ++++---- DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DeepCoin.Net/DeepCoin.Net.xml b/DeepCoin.Net/DeepCoin.Net.xml index 3470a36..2afd10b 100644 --- a/DeepCoin.Net/DeepCoin.Net.xml +++ b/DeepCoin.Net/DeepCoin.Net.xml @@ -1212,13 +1212,13 @@ - + - + @@ -2135,7 +2135,7 @@ Tracker factory - + Create a new Spot user data tracker @@ -2150,7 +2150,7 @@ Configuration - + Create a new futures user data tracker diff --git a/DeepCoin.Net/DeepCoinTrackerFactory.cs b/DeepCoin.Net/DeepCoinTrackerFactory.cs index 983540c..7e14a10 100644 --- a/DeepCoin.Net/DeepCoinTrackerFactory.cs +++ b/DeepCoin.Net/DeepCoinTrackerFactory.cs @@ -79,7 +79,7 @@ public ITradeTracker CreateTradeTracker(SharedSymbol symbol, int? limit = null, } /// - public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig config) + public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig? config = null) { var restClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinRestClient(); var socketClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinSocketClient(); @@ -93,7 +93,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig } /// - public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null) + public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, DeepCoinEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new DeepCoinUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); @@ -108,7 +108,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, Spo } /// - public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config) + public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig? config = null) { var restClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinRestClient(); var socketClient = _serviceProvider?.GetRequiredService() ?? new DeepCoinSocketClient(); @@ -122,7 +122,7 @@ public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrack } /// - public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null) + public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, DeepCoinEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new DeepCoinUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); diff --git a/DeepCoin.Net/DeepCoinUserDataTracker.cs b/DeepCoin.Net/DeepCoinUserDataTracker.cs index 6a7079c..98c1180 100644 --- a/DeepCoin.Net/DeepCoinUserDataTracker.cs +++ b/DeepCoin.Net/DeepCoinUserDataTracker.cs @@ -17,7 +17,7 @@ public DeepCoinUserSpotDataTracker( IDeepCoinRestClient restClient, IDeepCoinSocketClient socketClient, string? userIdentifier, - SpotUserDataTrackerConfig config) : base( + SpotUserDataTrackerConfig? config) : base( logger, restClient.ExchangeApi.SharedClient, restClient.ExchangeApi.SharedClient, @@ -27,7 +27,7 @@ public DeepCoinUserSpotDataTracker( socketClient.ExchangeApi.SharedClient, socketClient.ExchangeApi.SharedClient, userIdentifier, - config) + config ?? new SpotUserDataTrackerConfig()) { } } @@ -46,7 +46,7 @@ public DeepCoinUserFuturesDataTracker( IDeepCoinRestClient restClient, IDeepCoinSocketClient socketClient, string? userIdentifier, - FuturesUserDataTrackerConfig config) : base(logger, + FuturesUserDataTrackerConfig? config) : base(logger, restClient.ExchangeApi.SharedClient, restClient.ExchangeApi.SharedClient, restClient.ExchangeApi.SharedClient, @@ -56,7 +56,7 @@ public DeepCoinUserFuturesDataTracker( socketClient.ExchangeApi.SharedClient, socketClient.ExchangeApi.SharedClient, userIdentifier, - config) + config ?? new FuturesUserDataTrackerConfig()) { } } diff --git a/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs b/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs index 52e9052..8688a7c 100644 --- a/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs +++ b/DeepCoin.Net/Interfaces/IDeepCoinTrackerFactory.cs @@ -17,12 +17,12 @@ public interface IDeepCoinTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null); + IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, DeepCoinEnvironment? environment = null); /// /// Create a new spot user data tracker /// /// Configuration - IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig config); + IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig? config = null); /// /// Create a new futures user data tracker @@ -31,11 +31,11 @@ public interface IDeepCoinTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, DeepCoinEnvironment? environment = null); + IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, DeepCoinEnvironment? environment = null); /// /// Create a new futures user data tracker /// /// Configuration - IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config); + IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig? config = null); } } From 2e0a8fc17039a87ee8ae455a15f01be27872789f Mon Sep 17 00:00:00 2001 From: Jkorf Date: Fri, 6 Feb 2026 13:10:48 +0100 Subject: [PATCH 8/8] CryptoExchange.Net update --- DeepCoin.Net/DeepCoin.Net.csproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/DeepCoin.Net/DeepCoin.Net.csproj b/DeepCoin.Net/DeepCoin.Net.csproj index 71843a2..f57786e 100644 --- a/DeepCoin.Net/DeepCoin.Net.csproj +++ b/DeepCoin.Net/DeepCoin.Net.csproj @@ -52,12 +52,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file