From 5bdf1581bd2c1dfaae80cbb96de6ab21bd25a340 Mon Sep 17 00:00:00 2001 From: JKorf Date: Sun, 1 Feb 2026 15:38:16 +0100 Subject: [PATCH 1/8] wip --- .../CoinExRestClientFuturesApiShared.cs | 37 +++++++++++++++++++ .../CoinExRestClientSpotApiShared.cs | 37 +++++++++++++++++++ CoinEx.Net/CoinEx.Net.csproj | 4 +- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs index ff0f63c..527d530 100644 --- a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs +++ b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs @@ -162,7 +162,44 @@ async Task> IFuturesSymbolRestClient.Ge ExchangeSymbolCache.UpdateSymbolInfo(_topicId, response.Data); return response; } + public async Task> GetFuturesSymbolsForBaseAssetAsync(string baseAsset) + { + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, baseAsset)); + } + public async Task> SupportsFuturesSymbolAsync(SharedSymbol symbol) + { + if (symbol.TradingMode == TradingMode.Spot) + throw new ArgumentException(nameof(symbol), "Spot symbols not allowed"); + + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol)); + } + + public async Task> SupportsFuturesSymbolAsync(string symbolName) + { + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbolName)); + } #endregion #region Futures Order Client diff --git a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs index a7c8441..a79fe94 100644 --- a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs +++ b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs @@ -116,7 +116,44 @@ async Task> ISpotSymbolRestClient.GetSpotS ExchangeSymbolCache.UpdateSymbolInfo(_topicId, response.Data); return response; } + public async Task> GetSpotSymbolsForBaseAssetAsync(string baseAsset) + { + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, baseAsset)); + } + public async Task> SupportsSpotSymbolAsync(SharedSymbol symbol) + { + if (symbol.TradingMode != TradingMode.Spot) + throw new ArgumentException(nameof(symbol), "Only Spot symbols allowed"); + + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol)); + } + + public async Task> SupportsSpotSymbolAsync(string symbolName) + { + if (!ExchangeSymbolCache.HasCached(_topicId)) + { + var symbols = await ((ISpotSymbolRestClient)this).GetSpotSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false); + if (!symbols) + return new ExchangeResult(Exchange, symbols.Error!); + } + + return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbolName)); + } #endregion #region Ticker client diff --git a/CoinEx.Net/CoinEx.Net.csproj b/CoinEx.Net/CoinEx.Net.csproj index c384a38..1c2e35d 100644 --- a/CoinEx.Net/CoinEx.Net.csproj +++ b/CoinEx.Net/CoinEx.Net.csproj @@ -54,10 +54,12 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - all runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file From 67816009e3381f659012075dba1f1e4a034534a0 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 2 Feb 2026 09:38:49 +0100 Subject: [PATCH 2/8] Added check for disposed client in UserClientProvider --- CoinEx.Net/Clients/CoinExUserClientProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CoinEx.Net/Clients/CoinExUserClientProvider.cs b/CoinEx.Net/Clients/CoinExUserClientProvider.cs index 1554c0f..7f2bed5 100644 --- a/CoinEx.Net/Clients/CoinExUserClientProvider.cs +++ b/CoinEx.Net/Clients/CoinExUserClientProvider.cs @@ -66,7 +66,7 @@ public void ClearUserClients(string userIdentifier) /// public ICoinExRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, CoinExEnvironment? 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; @@ -75,7 +75,7 @@ public ICoinExRestClient GetRestClient(string userIdentifier, ApiCredentials? cr /// public ICoinExSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, CoinExEnvironment? 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 e95ce73d440886ee1ecfd97d4f9570ace4b98d86 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 2 Feb 2026 16:35:36 +0100 Subject: [PATCH 3/8] wip --- .../Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs | 1 + .../Clients/FuturesApi/CoinExSocketClientFuturesApiShared.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs index 527d530..63fb4bd 100644 --- a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs +++ b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs @@ -477,6 +477,7 @@ async Task> IFuturesOrderRestClient.GetPosit Leverage = x.Leverage, StopLossPrice = x.StopLossPrice == 0 ? null : x.StopLossPrice, TakeProfitPrice = x.TakeProfitPrice == 0 ? null : x.TakeProfitPrice, + PositionMode = SharedPositionMode.OneWay, PositionSide = x.Side == PositionSide.Short ? SharedPositionSide.Short : SharedPositionSide.Long }).ToArray()); } diff --git a/CoinEx.Net/Clients/FuturesApi/CoinExSocketClientFuturesApiShared.cs b/CoinEx.Net/Clients/FuturesApi/CoinExSocketClientFuturesApiShared.cs index e4614ad..0603d67 100644 --- a/CoinEx.Net/Clients/FuturesApi/CoinExSocketClientFuturesApiShared.cs +++ b/CoinEx.Net/Clients/FuturesApi/CoinExSocketClientFuturesApiShared.cs @@ -221,6 +221,7 @@ async Task> IPositionSocketClient.SubscribeTo update => handler(update.ToType(new[] { new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicId, update.Data.Position.Symbol), update.Data.Position.Symbol, update.Data.Position.OpenInterest, update.Data.Position.UpdateTime) { AverageOpenPrice = update.Data.Position.AverageEntryPrice, + PositionMode = SharedPositionMode.OneWay, PositionSide = update.Data.Position.Side == Enums.PositionSide.Short ? SharedPositionSide.Short : SharedPositionSide.Long, LiquidationPrice = update.Data.Position.LiquidationPrice, Leverage = update.Data.Position.Leverage, From 7d4b79a137845c3072037fae0299f46808326efb Mon Sep 17 00:00:00 2001 From: JKorf Date: Tue, 3 Feb 2026 20:35:53 +0100 Subject: [PATCH 4/8] wip --- .../Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs | 6 +++--- .../Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs index 63fb4bd..832dd2c 100644 --- a/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs +++ b/CoinEx.Net/Clients/FuturesApi/CoinExRestClientFuturesApiShared.cs @@ -162,7 +162,7 @@ async Task> IFuturesSymbolRestClient.Ge ExchangeSymbolCache.UpdateSymbolInfo(_topicId, response.Data); return response; } - public async Task> GetFuturesSymbolsForBaseAssetAsync(string baseAsset) + async Task> IFuturesSymbolRestClient.GetFuturesSymbolsForBaseAssetAsync(string baseAsset) { if (!ExchangeSymbolCache.HasCached(_topicId)) { @@ -174,7 +174,7 @@ public async Task> GetFuturesSymbolsForBaseAssetA return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, 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"); @@ -189,7 +189,7 @@ public async Task> SupportsFuturesSymbolAsync(SharedSymbol return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol)); } - public async Task> SupportsFuturesSymbolAsync(string symbolName) + async Task> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(string symbolName) { if (!ExchangeSymbolCache.HasCached(_topicId)) { diff --git a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs index a79fe94..4286e68 100644 --- a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs +++ b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs @@ -116,7 +116,7 @@ async Task> ISpotSymbolRestClient.GetSpotS ExchangeSymbolCache.UpdateSymbolInfo(_topicId, response.Data); return response; } - public async Task> GetSpotSymbolsForBaseAssetAsync(string baseAsset) + async Task> ISpotSymbolRestClient.GetSpotSymbolsForBaseAssetAsync(string baseAsset) { if (!ExchangeSymbolCache.HasCached(_topicId)) { @@ -128,7 +128,7 @@ public async Task> GetSpotSymbolsForBaseAssetAsyn return new ExchangeResult(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, 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"); @@ -143,7 +143,7 @@ public async Task> SupportsSpotSymbolAsync(SharedSymbol sym return new ExchangeResult(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol)); } - public async Task> SupportsSpotSymbolAsync(string symbolName) + async Task> ISpotSymbolRestClient.SupportsSpotSymbolAsync(string symbolName) { if (!ExchangeSymbolCache.HasCached(_topicId)) { From 96ff81e1acecf5e7a4cdf9c80079dfca1345171f Mon Sep 17 00:00:00 2001 From: Jkorf Date: Wed, 4 Feb 2026 16:32:16 +0100 Subject: [PATCH 5/8] wip --- CoinEx.Net/CoinEx.Net.xml | 61 ++++++++++++++++++ CoinEx.Net/CoinExTrackerFactory.cs | 62 ++++++++++++++++++ CoinEx.Net/CoinExUserDataTracker.cs | 63 +++++++++++++++++++ .../Interfaces/ICoinExTrackerFactory.cs | 32 +++++++++- 4 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 CoinEx.Net/CoinExUserDataTracker.cs diff --git a/CoinEx.Net/CoinEx.Net.xml b/CoinEx.Net/CoinEx.Net.xml index 1d18d24..437727a 100644 --- a/CoinEx.Net/CoinEx.Net.xml +++ b/CoinEx.Net/CoinEx.Net.xml @@ -796,6 +796,37 @@ + + + + + + + + + + + + + + + + + + ctor + + + + + + + + + + + ctor + + Defines the source generated JSON serialization contract metadata for a given type. @@ -4559,6 +4590,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 usable for the CoinEx clients diff --git a/CoinEx.Net/CoinExTrackerFactory.cs b/CoinEx.Net/CoinExTrackerFactory.cs index 241a5c6..a02841a 100644 --- a/CoinEx.Net/CoinExTrackerFactory.cs +++ b/CoinEx.Net/CoinExTrackerFactory.cs @@ -1,11 +1,15 @@ using CoinEx.Net.Clients; using CoinEx.Net.Interfaces; using CoinEx.Net.Interfaces.Clients; +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 Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using System; namespace CoinEx.Net @@ -70,5 +74,63 @@ public ITradeTracker CreateTradeTracker(SharedSymbol symbol, int? limit = null, period ); } + + /// + public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig config) + { + var restClient = _serviceProvider?.GetRequiredService() ?? new CoinExRestClient(); + var socketClient = _serviceProvider?.GetRequiredService() ?? new CoinExSocketClient(); + return new CoinExUserSpotDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + null, + config + ); + } + + /// + public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null) + { + var clientProvider = _serviceProvider?.GetRequiredService() ?? new CoinExUserClientProvider(); + var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); + var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment); + return new CoinExUserSpotDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + userIdentifier, + config + ); + } + + /// + public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config) + { + var restClient = _serviceProvider?.GetRequiredService() ?? new CoinExRestClient(); + var socketClient = _serviceProvider?.GetRequiredService() ?? new CoinExSocketClient(); + return new CoinExUserFuturesDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + null, + config + ); + } + + /// + public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null) + { + var clientProvider = _serviceProvider?.GetRequiredService() ?? new CoinExUserClientProvider(); + var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); + var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment); + return new CoinExUserFuturesDataTracker( + _serviceProvider?.GetRequiredService>() ?? new NullLogger(), + restClient, + socketClient, + userIdentifier, + config + ); + } } } diff --git a/CoinEx.Net/CoinExUserDataTracker.cs b/CoinEx.Net/CoinExUserDataTracker.cs new file mode 100644 index 0000000..4919460 --- /dev/null +++ b/CoinEx.Net/CoinExUserDataTracker.cs @@ -0,0 +1,63 @@ +using CoinEx.Net.Interfaces.Clients; +using CryptoExchange.Net.SharedApis; +using CryptoExchange.Net.Trackers.UserData; +using CryptoExchange.Net.Trackers.UserData.Objects; +using Microsoft.Extensions.Logging; + +namespace CoinEx.Net +{ + /// + public class CoinExUserSpotDataTracker : UserSpotDataTracker + { + /// + /// ctor + /// + public CoinExUserSpotDataTracker( + ILogger logger, + ICoinExRestClient restClient, + ICoinExSocketClient socketClient, + string? userIdentifier, + SpotUserDataTrackerConfig config) : base( + logger, + restClient.SpotApiV2.SharedClient, + null, + restClient.SpotApiV2.SharedClient, + socketClient.SpotApiV2.SharedClient, + restClient.SpotApiV2.SharedClient, + socketClient.SpotApiV2.SharedClient, + socketClient.SpotApiV2.SharedClient, + userIdentifier, + config) + { + } + } + + /// + public class CoinExUserFuturesDataTracker : UserFuturesDataTracker + { + /// + protected override bool WebsocketPositionUpdatesAreFullSnapshots => false; + + /// + /// ctor + /// + public CoinExUserFuturesDataTracker( + ILogger logger, + ICoinExRestClient restClient, + ICoinExSocketClient socketClient, + string? userIdentifier, + FuturesUserDataTrackerConfig config) : base(logger, + restClient.FuturesApi.SharedClient, + null, + restClient.FuturesApi.SharedClient, + socketClient.FuturesApi.SharedClient, + restClient.FuturesApi.SharedClient, + socketClient.FuturesApi.SharedClient, + socketClient.FuturesApi.SharedClient, + socketClient.FuturesApi.SharedClient, + userIdentifier, + config) + { + } + } +} diff --git a/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs b/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs index 8bc14f2..98b8f16 100644 --- a/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs +++ b/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs @@ -1,7 +1,10 @@ -using CryptoExchange.Net.Interfaces; +using CryptoExchange.Net.Authentication; +using CryptoExchange.Net.Interfaces; 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 System; using System.Collections.Generic; using System.Text; @@ -13,5 +16,32 @@ namespace CoinEx.Net.Interfaces /// public interface ICoinExTrackerFactory : ITrackerFactory { + /// + /// Create a new Spot user data tracker + /// + /// User identifier + /// Configuration + /// Credentials + /// Environment + IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? 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, CoinExEnvironment? environment = null); + /// + /// Create a new futures user data tracker + /// + /// Configuration + IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config); } } From ea190ed6aeb440ba18fd11dfe2243c4840b92a36 Mon Sep 17 00:00:00 2001 From: JKorf Date: Wed, 4 Feb 2026 21:45:46 +0100 Subject: [PATCH 6/8] Added shared deposit status --- .../Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs index 4286e68..1466c44 100644 --- a/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs +++ b/CoinEx.Net/Clients/SpotApiV2/CoinExRestClientSpotApiShared.cs @@ -765,7 +765,15 @@ async Task> IDepositRestClient.GetDepositsAsy if (deposits.Data.HasNext == true) nextToken = new PageToken(page + 1, pageSize); - return deposits.AsExchangeResult(Exchange, TradingMode.Spot, deposits.Data.Items.Select(x => new SharedDeposit(x.Asset, x.Quantity, x.Status == DepositStatus.Finished, x.CreateTime) + return deposits.AsExchangeResult(Exchange, TradingMode.Spot, deposits.Data.Items.Select(x => + new SharedDeposit( + x.Asset, + x.Quantity, + x.Status == DepositStatus.Finished, + x.CreateTime, + x.Status == DepositStatus.Finished ? SharedTransferStatus.Completed + : x.Status == DepositStatus.Processing || x.Status == DepositStatus.Confirming ? SharedTransferStatus.InProgress + : SharedTransferStatus.Failed) { Id = x.Id.ToString(), Confirmations = x.Confirmations, From 0274b98f38689cd02f994917b514c99f11750fad Mon Sep 17 00:00:00 2001 From: Jkorf Date: Thu, 5 Feb 2026 16:27:45 +0100 Subject: [PATCH 7/8] wip --- CoinEx.Net/CoinEx.Net.xml | 8 ++++---- CoinEx.Net/CoinExTrackerFactory.cs | 8 ++++---- CoinEx.Net/CoinExUserDataTracker.cs | 8 ++++---- CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CoinEx.Net/CoinEx.Net.xml b/CoinEx.Net/CoinEx.Net.xml index 437727a..ef96646 100644 --- a/CoinEx.Net/CoinEx.Net.xml +++ b/CoinEx.Net/CoinEx.Net.xml @@ -799,13 +799,13 @@ - + - + @@ -4590,7 +4590,7 @@ Tracker factory - + Create a new Spot user data tracker @@ -4605,7 +4605,7 @@ Configuration - + Create a new futures user data tracker diff --git a/CoinEx.Net/CoinExTrackerFactory.cs b/CoinEx.Net/CoinExTrackerFactory.cs index a02841a..efd40ed 100644 --- a/CoinEx.Net/CoinExTrackerFactory.cs +++ b/CoinEx.Net/CoinExTrackerFactory.cs @@ -76,7 +76,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 CoinExRestClient(); var socketClient = _serviceProvider?.GetRequiredService() ?? new CoinExSocketClient(); @@ -90,7 +90,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig } /// - public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null) + public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, CoinExEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new CoinExUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); @@ -105,7 +105,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, Spo } /// - public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config) + public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig? config = null) { var restClient = _serviceProvider?.GetRequiredService() ?? new CoinExRestClient(); var socketClient = _serviceProvider?.GetRequiredService() ?? new CoinExSocketClient(); @@ -119,7 +119,7 @@ public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrack } /// - public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null) + public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, CoinExEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new CoinExUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); diff --git a/CoinEx.Net/CoinExUserDataTracker.cs b/CoinEx.Net/CoinExUserDataTracker.cs index 4919460..b9f4d92 100644 --- a/CoinEx.Net/CoinExUserDataTracker.cs +++ b/CoinEx.Net/CoinExUserDataTracker.cs @@ -17,7 +17,7 @@ public CoinExUserSpotDataTracker( ICoinExRestClient restClient, ICoinExSocketClient socketClient, string? userIdentifier, - SpotUserDataTrackerConfig config) : base( + SpotUserDataTrackerConfig? config) : base( logger, restClient.SpotApiV2.SharedClient, null, @@ -27,7 +27,7 @@ public CoinExUserSpotDataTracker( socketClient.SpotApiV2.SharedClient, socketClient.SpotApiV2.SharedClient, userIdentifier, - config) + config ?? new SpotUserDataTrackerConfig()) { } } @@ -46,7 +46,7 @@ public CoinExUserFuturesDataTracker( ICoinExRestClient restClient, ICoinExSocketClient socketClient, string? userIdentifier, - FuturesUserDataTrackerConfig config) : base(logger, + FuturesUserDataTrackerConfig? config) : base(logger, restClient.FuturesApi.SharedClient, null, restClient.FuturesApi.SharedClient, @@ -56,7 +56,7 @@ public CoinExUserFuturesDataTracker( socketClient.FuturesApi.SharedClient, socketClient.FuturesApi.SharedClient, userIdentifier, - config) + config ?? new FuturesUserDataTrackerConfig()) { } } diff --git a/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs b/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs index 98b8f16..88516c3 100644 --- a/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs +++ b/CoinEx.Net/Interfaces/ICoinExTrackerFactory.cs @@ -23,12 +23,12 @@ public interface ICoinExTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, SpotUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null); + IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, CoinExEnvironment? 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 @@ -37,11 +37,11 @@ public interface ICoinExTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, FuturesUserDataTrackerConfig config, ApiCredentials credentials, CoinExEnvironment? environment = null); + IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, CoinExEnvironment? environment = null); /// /// Create a new futures user data tracker /// /// Configuration - IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig config); + IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrackerConfig? config = null); } } From 6328707494ee1e64717158aac18379c868a46d97 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Fri, 6 Feb 2026 13:10:28 +0100 Subject: [PATCH 8/8] CryptoExchange.Net update --- CoinEx.Net/CoinEx.Net.csproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CoinEx.Net/CoinEx.Net.csproj b/CoinEx.Net/CoinEx.Net.csproj index 1c2e35d..6ccc382 100644 --- a/CoinEx.Net/CoinEx.Net.csproj +++ b/CoinEx.Net/CoinEx.Net.csproj @@ -54,12 +54,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file