diff --git a/BitMEX.Net.UnitTests/BitMEXRestClientTests.cs b/BitMEX.Net.UnitTests/BitMEXRestClientTests.cs index ac0be0b..9859fe5 100644 --- a/BitMEX.Net.UnitTests/BitMEXRestClientTests.cs +++ b/BitMEX.Net.UnitTests/BitMEXRestClientTests.cs @@ -14,7 +14,7 @@ public class BitMEXRestClientTests [Test] public void CheckSignatureExample1() { - var authProvider = new BitMEXAuthenticationProvider(new ApiCredentials("XXX", "XXX")); + var authProvider = new BitMEXAuthenticationProvider(new BitMEXCredentials("XXX", "XXX")); var client = (RestApiClient)new BitMEXRestClient().ExchangeApi; CryptoExchange.Net.Testing.TestHelpers.CheckSignature( diff --git a/BitMEX.Net.UnitTests/BitMEXRestIntegrationTests.cs b/BitMEX.Net.UnitTests/BitMEXRestIntegrationTests.cs index 6d04010..d1525f7 100644 --- a/BitMEX.Net.UnitTests/BitMEXRestIntegrationTests.cs +++ b/BitMEX.Net.UnitTests/BitMEXRestIntegrationTests.cs @@ -8,6 +8,7 @@ using BitMEX.Net.Objects.Options; using System.Threading; using BitMEX.Net.SymbolOrderBooks; +using CryptoExchange.Net.Authentication; namespace BitMEX.Net.UnitTests { @@ -26,7 +27,7 @@ public override BitMEXRestClient GetClient(ILoggerFactory loggerFactory) { AutoTimestamp = false, OutputOriginalData = true, - ApiCredentials = Authenticated ? new CryptoExchange.Net.Authentication.ApiCredentials(key, sec) : null + ApiCredentials = Authenticated ? new BitMEXCredentials(key, sec) : null })); } diff --git a/BitMEX.Net.UnitTests/BitMEXSocketIntegrationTests.cs b/BitMEX.Net.UnitTests/BitMEXSocketIntegrationTests.cs index aed857a..23817ab 100644 --- a/BitMEX.Net.UnitTests/BitMEXSocketIntegrationTests.cs +++ b/BitMEX.Net.UnitTests/BitMEXSocketIntegrationTests.cs @@ -1,6 +1,7 @@ using BitMEX.Net.Clients; using BitMEX.Net.Objects.Models; using BitMEX.Net.Objects.Options; +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Testing; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -28,7 +29,7 @@ public override BitMEXSocketClient GetClient(ILoggerFactory loggerFactory) return new BitMEXSocketClient(Options.Create(new BitMEXSocketOptions { OutputOriginalData = true, - ApiCredentials = Authenticated ? new CryptoExchange.Net.Authentication.ApiCredentials(key, sec) : null + ApiCredentials = Authenticated ? new BitMEXCredentials(key, sec) : null }), loggerFactory); } diff --git a/BitMEX.Net.UnitTests/RestRequestTests.cs b/BitMEX.Net.UnitTests/RestRequestTests.cs index 9cfec8d..54bf1c8 100644 --- a/BitMEX.Net.UnitTests/RestRequestTests.cs +++ b/BitMEX.Net.UnitTests/RestRequestTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using BitMEX.Net.Clients; using System.Linq; +using CryptoExchange.Net.Authentication; namespace BitMEX.Net.UnitTests { @@ -18,7 +19,7 @@ public async Task ValidateAccountCalls() var client = new BitMEXRestClient(opts => { opts.AutoTimestamp = false; - opts.ApiCredentials = new CryptoExchange.Net.Authentication.ApiCredentials("123", "456"); + opts.ApiCredentials = new BitMEXCredentials("123", "456"); }); var tester = new RestRequestValidator(client, "Endpoints/Exchange/Account", "https://www.bitmex.com", IsAuthenticated); await tester.ValidateAsync(client => client.ExchangeApi.Account.GetUserEventsAsync(), "GetUserEvents", nestedJsonProperty: "userEvents"); @@ -33,7 +34,7 @@ public async Task ValidateExchangeDataCalls() var client = new BitMEXRestClient(opts => { opts.AutoTimestamp = false; - opts.ApiCredentials = new CryptoExchange.Net.Authentication.ApiCredentials("123", "456"); + opts.ApiCredentials = new BitMEXCredentials("123", "456"); }); var tester = new RestRequestValidator(client, "Endpoints/Exchange/ExchangeData", "https://www.bitmex.com", IsAuthenticated); await tester.ValidateAsync(client => client.ExchangeApi.ExchangeData.GetActiveSymbolsAsync(), "GetActiveSymbols", ignoreProperties: ["publishInterval", "fundingInterval", "rebalanceInterval"]); @@ -60,7 +61,7 @@ public async Task ValidateTradingCalls() var client = new BitMEXRestClient(opts => { opts.AutoTimestamp = false; - opts.ApiCredentials = new CryptoExchange.Net.Authentication.ApiCredentials("123", "456"); + opts.ApiCredentials = new BitMEXCredentials("123", "456"); }); var tester = new RestRequestValidator(client, "Endpoints/Exchange/Trading", "https://www.bitmex.com", IsAuthenticated); await tester.ValidateAsync(client => client.ExchangeApi.Trading.PlaceOrderAsync("ETHUSDT", Enums.OrderSide.Buy, Enums.OrderType.LimitIfTouched), "PlaceOrder", ignoreProperties: new List { "text" }); diff --git a/BitMEX.Net.UnitTests/SocketSubscriptionTests.cs b/BitMEX.Net.UnitTests/SocketSubscriptionTests.cs index 23ff566..363fd84 100644 --- a/BitMEX.Net.UnitTests/SocketSubscriptionTests.cs +++ b/BitMEX.Net.UnitTests/SocketSubscriptionTests.cs @@ -1,6 +1,7 @@ using BitMEX.Net.Clients; using BitMEX.Net.Objects.Models; using BitMEX.Net.Objects.Options; +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Objects; using CryptoExchange.Net.Testing; using Microsoft.Extensions.Logging; @@ -42,7 +43,7 @@ public async Task ValidateSpotExchangeDataSubscriptions() var client = new BitMEXSocketClient(Options.Create(new BitMEXSocketOptions { - ApiCredentials = new CryptoExchange.Net.Authentication.ApiCredentials("123", "456", "789"), + ApiCredentials = new BitMEXCredentials("123", "456"), OutputOriginalData = true }), logger); var tester = new SocketSubscriptionValidator(client, "Subscriptions/Exchange", "wss://ws.bitmex.com/"); diff --git a/BitMEX.Net/BitMEX.Net.csproj b/BitMEX.Net/BitMEX.Net.csproj index 71164a1..f61aebb 100644 --- a/BitMEX.Net/BitMEX.Net.csproj +++ b/BitMEX.Net/BitMEX.Net.csproj @@ -23,6 +23,7 @@ true true https://github.com/JKorf/BitMEX.Net?tab=readme-ov-file#release-notes + $(NoWarn);SYSLIB1100;SYSLIB1101 true @@ -52,7 +53,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/BitMEX.Net/BitMEXAuthenticationProvider.cs b/BitMEX.Net/BitMEXAuthenticationProvider.cs index b5877cc..17d43a1 100644 --- a/BitMEX.Net/BitMEXAuthenticationProvider.cs +++ b/BitMEX.Net/BitMEXAuthenticationProvider.cs @@ -7,12 +7,11 @@ namespace BitMEX.Net { - internal class BitMEXAuthenticationProvider : AuthenticationProvider + internal class BitMEXAuthenticationProvider : AuthenticationProvider { private static readonly IMessageSerializer _serializer = new SystemTextJsonMessageSerializer(SerializerOptions.WithConverters(BitMEXExchange._serializerContext)); - public override ApiCredentialsType[] SupportedCredentialTypes => [ApiCredentialsType.Hmac]; - public BitMEXAuthenticationProvider(ApiCredentials credentials) : base(credentials) + public BitMEXAuthenticationProvider(BitMEXCredentials credentials) : base(credentials, credentials) { } @@ -26,7 +25,7 @@ public override void ProcessRequest(RestApiClient apiClient, RestRequestConfigur var expires = DateTimeConverter.ConvertToSeconds(timestamp.AddSeconds(5))!; request.Headers ??= new Dictionary(); request.Headers.Add("api-expires", expires.Value.ToString()); - request.Headers.Add("api-key", ApiKey); + request.Headers.Add("api-key", Credential.Key); var body = (request.BodyParameters == null || request.BodyParameters.Count == 0) ? "" : GetSerializedBody(_serializer, request.BodyParameters); var queryParams = request.GetQueryString(true); diff --git a/BitMEX.Net/BitMEXCredentials.cs b/BitMEX.Net/BitMEXCredentials.cs new file mode 100644 index 0000000..802e7e9 --- /dev/null +++ b/BitMEX.Net/BitMEXCredentials.cs @@ -0,0 +1,47 @@ +using CryptoExchange.Net.Authentication; +using System; + +namespace BitMEX.Net +{ + /// + /// BitMEX API credentials + /// + public class BitMEXCredentials : HMACCredential + { + /// + /// Create new credentials + /// + public BitMEXCredentials() { } + + /// + /// Create new credentials providing credentials in HMAC format + /// + /// API key + /// API secret + public BitMEXCredentials(string key, string secret) : base(key, secret) + { + } + + /// + /// Create new credentials providing HMAC credentials + /// + /// HMAC Credentials + public BitMEXCredentials(HMACCredential credential) : base(credential.Key, credential.Secret) + { + } + + /// + /// Specify the HMAC credentials + /// + /// API key + /// API secret + public BitMEXCredentials WithHMAC(string key, string secret) + { + if (!string.IsNullOrEmpty(Key)) throw new InvalidOperationException("Credentials already set"); + + Key = key; + Secret = secret; + return this; + } + } +} diff --git a/BitMEX.Net/BitMEXTrackerFactory.cs b/BitMEX.Net/BitMEXTrackerFactory.cs index 8045b32..56c971b 100644 --- a/BitMEX.Net/BitMEXTrackerFactory.cs +++ b/BitMEX.Net/BitMEXTrackerFactory.cs @@ -80,7 +80,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig? } /// - public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null) + public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, BitMEXCredentials credentials, SpotUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new BitMEXUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); @@ -109,7 +109,7 @@ public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrack } /// - public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null) + public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, BitMEXCredentials credentials, FuturesUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null) { var clientProvider = _serviceProvider?.GetRequiredService() ?? new BitMEXUserClientProvider(); var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment); diff --git a/BitMEX.Net/Clients/BitMEXRestClient.cs b/BitMEX.Net/Clients/BitMEXRestClient.cs index 1bbb46b..88ec0ca 100644 --- a/BitMEX.Net/Clients/BitMEXRestClient.cs +++ b/BitMEX.Net/Clients/BitMEXRestClient.cs @@ -13,7 +13,7 @@ namespace BitMEX.Net.Clients { /// - public class BitMEXRestClient : BaseRestClient, IBitMEXRestClient + public class BitMEXRestClient : BaseRestClient, IBitMEXRestClient { #region Api clients @@ -50,12 +50,6 @@ public BitMEXRestClient(HttpClient? httpClient, ILoggerFactory? loggerFactory, I #endregion - /// - public void SetOptions(UpdateOptions options) - { - ExchangeApi.SetOptions(options); - } - /// /// Set the default options to be used when creating new clients /// @@ -65,10 +59,5 @@ public static void SetDefaultOptions(Action optionsDelegate) BitMEXRestOptions.Default = ApplyOptionsDelegate(optionsDelegate); } - /// - public void SetApiCredentials(ApiCredentials credentials) - { - ExchangeApi.SetApiCredentials(credentials); - } } } diff --git a/BitMEX.Net/Clients/BitMEXSocketClient.cs b/BitMEX.Net/Clients/BitMEXSocketClient.cs index 90e2edf..a03756f 100644 --- a/BitMEX.Net/Clients/BitMEXSocketClient.cs +++ b/BitMEX.Net/Clients/BitMEXSocketClient.cs @@ -12,7 +12,7 @@ namespace BitMEX.Net.Clients { /// - public class BitMEXSocketClient : BaseSocketClient, IBitMEXSocketClient + public class BitMEXSocketClient : BaseSocketClient, IBitMEXSocketClient { #region fields #endregion @@ -52,12 +52,6 @@ public BitMEXSocketClient(IOptions options, ILoggerFactory? } #endregion - /// - public void SetOptions(UpdateOptions options) - { - ExchangeApi.SetOptions(options); - } - /// /// Set the default options to be used when creating new clients /// @@ -66,13 +60,5 @@ public static void SetDefaultOptions(Action optionsDelegate { BitMEXSocketOptions.Default = ApplyOptionsDelegate(optionsDelegate); } - - /// - public void SetApiCredentials(ApiCredentials credentials) - { - - ExchangeApi.SetApiCredentials(credentials); - - } } } diff --git a/BitMEX.Net/Clients/BitMEXUserClientProvider.cs b/BitMEX.Net/Clients/BitMEXUserClientProvider.cs index 701bf8f..d5dec86 100644 --- a/BitMEX.Net/Clients/BitMEXUserClientProvider.cs +++ b/BitMEX.Net/Clients/BitMEXUserClientProvider.cs @@ -49,7 +49,7 @@ public BitMEXUserClientProvider( } /// - public void InitializeUserClient(string userIdentifier, ApiCredentials credentials, BitMEXEnvironment? environment = null) + public void InitializeUserClient(string userIdentifier, BitMEXCredentials credentials, BitMEXEnvironment? environment = null) { CreateRestClient(userIdentifier, credentials, environment); CreateSocketClient(userIdentifier, credentials, environment); @@ -63,7 +63,7 @@ public void ClearUserClients(string userIdentifier) } /// - public IBitMEXRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, BitMEXEnvironment? environment = null) + public IBitMEXRestClient GetRestClient(string userIdentifier, BitMEXCredentials? credentials = null, BitMEXEnvironment? environment = null) { if (!_restClients.TryGetValue(userIdentifier, out var client) || client.Disposed) client = CreateRestClient(userIdentifier, credentials, environment); @@ -72,7 +72,7 @@ public IBitMEXRestClient GetRestClient(string userIdentifier, ApiCredentials? cr } /// - public IBitMEXSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, BitMEXEnvironment? environment = null) + public IBitMEXSocketClient GetSocketClient(string userIdentifier, BitMEXCredentials? credentials = null, BitMEXEnvironment? environment = null) { if (!_socketClients.TryGetValue(userIdentifier, out var client) || client.Disposed) client = CreateSocketClient(userIdentifier, credentials, environment); @@ -80,7 +80,7 @@ public IBitMEXSocketClient GetSocketClient(string userIdentifier, ApiCredentials return client; } - private IBitMEXRestClient CreateRestClient(string userIdentifier, ApiCredentials? credentials, BitMEXEnvironment? environment) + private IBitMEXRestClient CreateRestClient(string userIdentifier, BitMEXCredentials? credentials, BitMEXEnvironment? environment) { var clientRestOptions = SetRestEnvironment(environment); var client = new BitMEXRestClient(_httpClient, _loggerFactory, clientRestOptions); @@ -92,7 +92,7 @@ private IBitMEXRestClient CreateRestClient(string userIdentifier, ApiCredentials return client; } - private IBitMEXSocketClient CreateSocketClient(string userIdentifier, ApiCredentials? credentials, BitMEXEnvironment? environment) + private IBitMEXSocketClient CreateSocketClient(string userIdentifier, BitMEXCredentials? credentials, BitMEXEnvironment? environment) { var clientSocketOptions = SetSocketEnvironment(environment); var client = new BitMEXSocketClient(clientSocketOptions!, _loggerFactory); diff --git a/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApi.cs b/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApi.cs index d41b529..9c303a9 100644 --- a/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApi.cs +++ b/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApi.cs @@ -20,7 +20,7 @@ namespace BitMEX.Net.Clients.ExchangeApi { /// - internal partial class BitMEXRestClientExchangeApi : RestApiClient, IBitMEXRestClientExchangeApi + internal partial class BitMEXRestClientExchangeApi : RestApiClient, IBitMEXRestClientExchangeApi { #region fields public new BitMEXRestOptions ClientOptions => (BitMEXRestOptions)base.ClientOptions; @@ -57,7 +57,7 @@ internal BitMEXRestClientExchangeApi(ILogger logger, HttpClient? httpClient, Bit protected override IMessageSerializer CreateSerializer() => new SystemTextJsonMessageSerializer(SerializerOptions.WithConverters(BitMEXExchange._serializerContext)); /// - protected override AuthenticationProvider CreateAuthenticationProvider(ApiCredentials credentials) + protected override BitMEXAuthenticationProvider CreateAuthenticationProvider(BitMEXCredentials credentials) => new BitMEXAuthenticationProvider(credentials); internal Task SendAsync(RequestDefinition definition, ParameterCollection? parameters, CancellationToken cancellationToken, int? weight = null) diff --git a/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApiShared.cs b/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApiShared.cs index 3254601..c22a684 100644 --- a/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApiShared.cs +++ b/BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApiShared.cs @@ -194,7 +194,7 @@ async Task> IDepositRestClient.GetDepositsAsy x.Quantity.ToSharedAssetQuantity(x.Currency), x.TransactionStatus == TransactionStatus.Completed, x.TransactionTime, - x.TransactionStatus == TransactionStatus.Completed ? SharedTransferStatus.Completed : SharedTransferStatus.Failed) + ParseTransferStatus(x.TransactionStatus)) { Network = x.Network, TransactionId = x.Transaction, @@ -204,6 +204,17 @@ async Task> IDepositRestClient.GetDepositsAsy .ToArray(), nextPageRequest); } + private SharedTransferStatus ParseTransferStatus(TransactionStatus status) + { + if (status == TransactionStatus.Completed) + return SharedTransferStatus.Completed; + + if (status == TransactionStatus.Canceled) + return SharedTransferStatus.Failed; + + return SharedTransferStatus.Unknown; + } + #endregion #region Fee Client @@ -993,9 +1004,11 @@ async Task> ISpotOrderRestClient.CancelSpotOrderAsyn private SharedOrderStatus ParseOrderStatus(OrderStatus status) { - if (status == OrderStatus.New) return SharedOrderStatus.Open; - if (status == OrderStatus.Canceled || status == OrderStatus.Rejected) return SharedOrderStatus.Canceled; - return SharedOrderStatus.Filled; + if (status == OrderStatus.New || status == OrderStatus.PartiallyFilled) return SharedOrderStatus.Open; + if (status == OrderStatus.Rejected || status == OrderStatus.Canceled) return SharedOrderStatus.Canceled; + if (status == OrderStatus.Filled) return SharedOrderStatus.Filled; + + return SharedOrderStatus.Unknown; } private SharedOrderType ParseOrderType(OrderType type, ExecutionInstruction[]? executionInstruction) @@ -2016,7 +2029,10 @@ private SharedTriggerOrderStatus ParseTriggerOrderStatus(OrderStatus status) if (status == OrderStatus.Canceled || status == OrderStatus.Rejected) return SharedTriggerOrderStatus.CanceledOrRejected; - return SharedTriggerOrderStatus.Active; + if (status == OrderStatus.New || status == OrderStatus.PartiallyFilled) + return SharedTriggerOrderStatus.Active; + + return SharedTriggerOrderStatus.Unknown; } EndpointOptions ISpotTriggerOrderRestClient.CancelSpotTriggerOrderOptions { get; } = new EndpointOptions(true); diff --git a/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApi.cs b/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApi.cs index fe3e5c2..3316110 100644 --- a/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApi.cs +++ b/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApi.cs @@ -33,7 +33,7 @@ namespace BitMEX.Net.Clients.ExchangeApi /// /// Client providing access to the BitMEX Exchange websocket Api /// - internal partial class BitMEXSocketClientExchangeApi : SocketApiClient, IBitMEXSocketClientExchangeApi + internal partial class BitMEXSocketClientExchangeApi : SocketApiClient, IBitMEXSocketClientExchangeApi { #region fields protected override ErrorMapping ErrorMapping => BitMEXErrors.SocketErrors; @@ -66,7 +66,7 @@ internal BitMEXSocketClientExchangeApi(ILogger logger, BitMEXSocketOptions optio public override ISocketMessageHandler CreateMessageConverter(WebSocketMessageType messageType) => new BitMexSocketExchangeMessageHandler(); /// - protected override AuthenticationProvider CreateAuthenticationProvider(ApiCredentials credentials) + protected override BitMEXAuthenticationProvider CreateAuthenticationProvider(BitMEXCredentials credentials) => new BitMEXAuthenticationProvider(credentials); /// @@ -544,7 +544,7 @@ public async Task> SubscribeToUserTradeUpdatesAsy var provider = (BitMEXAuthenticationProvider)AuthenticationProvider; var expires = DateTimeConverter.ConvertToSeconds(DateTime.UtcNow.AddSeconds(5)); - var queryParams = $"api-key={provider.ApiKey}&api-signature={provider.GetSignature("GET", "/realtime", expires.Value, "")}&api-expires={expires}"; + var queryParams = $"api-key={provider.Key}&api-signature={provider.GetSignature("GET", "/realtime", expires.Value, "")}&api-expires={expires}"; return BaseAddress.AppendPath("realtime?" + queryParams); } diff --git a/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApiShared.cs b/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApiShared.cs index 80b5406..b918439 100644 --- a/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApiShared.cs +++ b/BitMEX.Net/Clients/ExchangeApi/BitMEXSocketClientExchangeApiShared.cs @@ -87,7 +87,9 @@ private SharedOrderStatus ParseOrderStatus(OrderStatus status) { if (status == OrderStatus.New || status == OrderStatus.PartiallyFilled) return SharedOrderStatus.Open; if (status == OrderStatus.Rejected || status == OrderStatus.Canceled) return SharedOrderStatus.Canceled; - return SharedOrderStatus.Filled; + if (status == OrderStatus.Filled) return SharedOrderStatus.Filled; + + return SharedOrderStatus.Unknown; } private SharedOrderType ParseOrderType(OrderType orderType, ExecutionInstruction[]? executionInstruction) diff --git a/BitMEX.Net/ExtensionMethods/CryptoClientExtensions.cs b/BitMEX.Net/ExtensionMethods/CryptoClientExtensions.cs deleted file mode 100644 index f79a2a2..0000000 --- a/BitMEX.Net/ExtensionMethods/CryptoClientExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -using BitMEX.Net.Clients; -using BitMEX.Net.Interfaces.Clients; -using CryptoExchange.Net.Interfaces.Clients; - -namespace CryptoExchange.Net.Interfaces -{ - /// - /// Extensions for the ICryptoRestClient and ICryptoSocketClient interfaces - /// - public static class CryptoClientExtensions - { - /// - /// Get the BitMEX REST Api client - /// - /// - /// - public static IBitMEXRestClient BitMEX(this ICryptoRestClient baseClient) => baseClient.TryGet(() => new BitMEXRestClient()); - - /// - /// Get the BitMEX Websocket Api client - /// - /// - /// - public static IBitMEXSocketClient BitMEX(this ICryptoSocketClient baseClient) => baseClient.TryGet(() => new BitMEXSocketClient()); - } -} diff --git a/BitMEX.Net/ExtensionMethods/ServiceCollectionExtensions.cs b/BitMEX.Net/ExtensionMethods/ServiceCollectionExtensions.cs index 587a3bb..03ce97d 100644 --- a/BitMEX.Net/ExtensionMethods/ServiceCollectionExtensions.cs +++ b/BitMEX.Net/ExtensionMethods/ServiceCollectionExtensions.cs @@ -24,7 +24,8 @@ public static class ServiceCollectionExtensions { /// - /// Add services such as the IBitMEXRestClient and IBitMEXSocketClient. Configures the services based on the provided configuration. + /// Add services such as the IBitMEXRestClient and IBitMEXSocketClient. Configures the services based on the provided configuration.
+ /// See for an example of how to set up the configuration. ///
/// The service collection /// The configuration(section) containing the options @@ -37,7 +38,15 @@ public static IServiceCollection AddBitMEX( // Reset environment so we know if they're overridden options.Rest.Environment = null!; options.Socket.Environment = null!; - configuration.Bind(options); + + try + { + configuration.Bind(options); + } + catch (InvalidOperationException ex) + { + throw new InvalidOperationException("Invalid configuration provided", ex); + } if (options.Rest == null || options.Socket == null) throw new ArgumentException("Options null"); @@ -100,8 +109,6 @@ private static IServiceCollection AddBitMEXCore( }).SetHandlerLifetime(Timeout.InfiniteTimeSpan); services.Add(new ServiceDescriptor(typeof(IBitMEXSocketClient), x => { return new BitMEXSocketClient(x.GetRequiredService>(), x.GetRequiredService()); }, socketClientLifeTime ?? ServiceLifetime.Singleton)); - services.AddTransient(); - services.AddSingleton(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXRestClientExchangeApi.cs b/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXRestClientExchangeApi.cs index 2320476..0197a23 100644 --- a/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXRestClientExchangeApi.cs +++ b/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXRestClientExchangeApi.cs @@ -1,3 +1,4 @@ +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Interfaces.Clients; using System; @@ -6,7 +7,7 @@ namespace BitMEX.Net.Interfaces.Clients.ExchangeApi /// /// BitMEX Exchange API endpoints /// - public interface IBitMEXRestClientExchangeApi : IRestApiClient, IDisposable + public interface IBitMEXRestClientExchangeApi : IRestApiClient, IDisposable { /// /// Endpoints related to account settings, info or actions diff --git a/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXSocketClientExchangeApi.cs b/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXSocketClientExchangeApi.cs index a8d0abc..9c8d3b0 100644 --- a/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXSocketClientExchangeApi.cs +++ b/BitMEX.Net/Interfaces/Clients/ExchangeApi/IBitMEXSocketClientExchangeApi.cs @@ -7,13 +7,14 @@ using System.Collections.Generic; using BitMEX.Net.Enums; using CryptoExchange.Net.Interfaces.Clients; +using CryptoExchange.Net.Authentication; namespace BitMEX.Net.Interfaces.Clients.ExchangeApi { /// /// BitMEX Exchange streams /// - public interface IBitMEXSocketClientExchangeApi : ISocketApiClient, IDisposable + public interface IBitMEXSocketClientExchangeApi : ISocketApiClient, IDisposable { /// /// Subscribe to trade updates diff --git a/BitMEX.Net/Interfaces/Clients/IBitMEXRestClient.cs b/BitMEX.Net/Interfaces/Clients/IBitMEXRestClient.cs index 819ea08..abc4cc5 100644 --- a/BitMEX.Net/Interfaces/Clients/IBitMEXRestClient.cs +++ b/BitMEX.Net/Interfaces/Clients/IBitMEXRestClient.cs @@ -8,7 +8,7 @@ namespace BitMEX.Net.Interfaces.Clients /// /// Client for accessing the BitMEX Rest API. /// - public interface IBitMEXRestClient : IRestClient + public interface IBitMEXRestClient : IRestClient { /// @@ -17,16 +17,5 @@ public interface IBitMEXRestClient : IRestClient /// public IBitMEXRestClientExchangeApi ExchangeApi { get; } - /// - /// Update specific options - /// - /// Options to update. Only specific options are changeable after the client has been created - void SetOptions(UpdateOptions options); - - /// - /// Set the API credentials for this client. All Api clients in this client will use the new credentials, regardless of earlier set options. - /// - /// The credentials to set - void SetApiCredentials(ApiCredentials credentials); } } diff --git a/BitMEX.Net/Interfaces/Clients/IBitMEXSocketClient.cs b/BitMEX.Net/Interfaces/Clients/IBitMEXSocketClient.cs index 8081794..44416aa 100644 --- a/BitMEX.Net/Interfaces/Clients/IBitMEXSocketClient.cs +++ b/BitMEX.Net/Interfaces/Clients/IBitMEXSocketClient.cs @@ -8,25 +8,12 @@ namespace BitMEX.Net.Interfaces.Clients /// /// Client for accessing the BitMEX websocket API /// - public interface IBitMEXSocketClient : ISocketClient + public interface IBitMEXSocketClient : ISocketClient { - /// /// Exchange API endpoints /// /// public IBitMEXSocketClientExchangeApi ExchangeApi { get; } - - /// - /// Update specific options - /// - /// Options to update. Only specific options are changeable after the client has been created - void SetOptions(UpdateOptions options); - - /// - /// Set the API credentials for this client. All Api clients in this client will use the new credentials, regardless of earlier set options. - /// - /// The credentials to set - void SetApiCredentials(ApiCredentials credentials); } } diff --git a/BitMEX.Net/Interfaces/Clients/IBitMEXUserClientProvider.cs b/BitMEX.Net/Interfaces/Clients/IBitMEXUserClientProvider.cs index 2225049..12253a5 100644 --- a/BitMEX.Net/Interfaces/Clients/IBitMEXUserClientProvider.cs +++ b/BitMEX.Net/Interfaces/Clients/IBitMEXUserClientProvider.cs @@ -14,7 +14,7 @@ public interface IBitMEXUserClientProvider : IExchangeService /// The identifier for the user /// The credentials for the user /// The environment to use - void InitializeUserClient(string userIdentifier, ApiCredentials credentials, BitMEXEnvironment? environment = null); + void InitializeUserClient(string userIdentifier, BitMEXCredentials credentials, BitMEXEnvironment? environment = null); /// /// Reset the cached clients for a user. This can be useful when a user changes API credentials. @@ -27,7 +27,7 @@ public interface IBitMEXUserClientProvider : IExchangeService /// The identifier for user /// The credentials for the user. Required the first time a client is requested for this user unless has been called prior for this user. /// The environment to use - IBitMEXRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, BitMEXEnvironment? environment = null); + IBitMEXRestClient GetRestClient(string userIdentifier, BitMEXCredentials? credentials = null, BitMEXEnvironment? environment = null); /// /// Get the Socket client for a specific user. In case the client does not exist yet it will be created and the should be provided, unless has been called prior for this user. @@ -35,6 +35,6 @@ public interface IBitMEXUserClientProvider : IExchangeService /// The identifier for user /// The credentials for the user. Required the first time a client is requested for this user unless has been called prior for this user. /// The environment to use - IBitMEXSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, BitMEXEnvironment? environment = null); + IBitMEXSocketClient GetSocketClient(string userIdentifier, BitMEXCredentials? credentials = null, BitMEXEnvironment? environment = null); } } \ No newline at end of file diff --git a/BitMEX.Net/Interfaces/IBitMEXTrackerFactory.cs b/BitMEX.Net/Interfaces/IBitMEXTrackerFactory.cs index 0a15911..7bf8ed0 100644 --- a/BitMEX.Net/Interfaces/IBitMEXTrackerFactory.cs +++ b/BitMEX.Net/Interfaces/IBitMEXTrackerFactory.cs @@ -18,7 +18,7 @@ public interface IBitMEXTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null); + IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, BitMEXCredentials credentials, SpotUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null); /// /// Create a new spot user data tracker /// @@ -32,7 +32,7 @@ public interface IBitMEXTrackerFactory : ITrackerFactory /// Configuration /// Credentials /// Environment - IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, FuturesUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null); + IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, BitMEXCredentials credentials, FuturesUserDataTrackerConfig? config = null, BitMEXEnvironment? environment = null); /// /// Create a new futures user data tracker /// diff --git a/BitMEX.Net/Objects/Options/BitMEXOptions.cs b/BitMEX.Net/Objects/Options/BitMEXOptions.cs index 48b3bad..5cd7275 100644 --- a/BitMEX.Net/Objects/Options/BitMEXOptions.cs +++ b/BitMEX.Net/Objects/Options/BitMEXOptions.cs @@ -6,7 +6,7 @@ namespace BitMEX.Net.Objects.Options /// /// BitMEX options /// - public class BitMEXOptions : LibraryOptions + public class BitMEXOptions : LibraryOptions { } } diff --git a/BitMEX.Net/Objects/Options/BitMEXRestOptions.cs b/BitMEX.Net/Objects/Options/BitMEXRestOptions.cs index b17561c..7f0d368 100644 --- a/BitMEX.Net/Objects/Options/BitMEXRestOptions.cs +++ b/BitMEX.Net/Objects/Options/BitMEXRestOptions.cs @@ -1,3 +1,4 @@ +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Objects.Options; namespace BitMEX.Net.Objects.Options @@ -5,7 +6,7 @@ namespace BitMEX.Net.Objects.Options /// /// Options for the BitMEXRestClient /// - public class BitMEXRestOptions : RestExchangeOptions + public class BitMEXRestOptions : RestExchangeOptions { /// /// Default options for new clients @@ -34,13 +35,10 @@ public BitMEXRestOptions() /// public RestApiOptions ExchangeOptions { get; private set; } = new RestApiOptions(); - internal BitMEXRestOptions Set(BitMEXRestOptions targetOptions) { - targetOptions = base.Set(targetOptions); - + targetOptions = base.Set(targetOptions); targetOptions.ExchangeOptions = ExchangeOptions.Set(targetOptions.ExchangeOptions); - return targetOptions; } } diff --git a/BitMEX.Net/Objects/Options/BitMEXSocketOptions.cs b/BitMEX.Net/Objects/Options/BitMEXSocketOptions.cs index 2e1f4ae..9b6c23b 100644 --- a/BitMEX.Net/Objects/Options/BitMEXSocketOptions.cs +++ b/BitMEX.Net/Objects/Options/BitMEXSocketOptions.cs @@ -1,3 +1,4 @@ +using CryptoExchange.Net.Authentication; using CryptoExchange.Net.Objects.Options; namespace BitMEX.Net.Objects.Options @@ -5,7 +6,7 @@ namespace BitMEX.Net.Objects.Options /// /// Options for the BitMEXSocketClient /// - public class BitMEXSocketOptions : SocketExchangeOptions + public class BitMEXSocketOptions : SocketExchangeOptions { /// /// Default options for new clients @@ -16,7 +17,6 @@ public class BitMEXSocketOptions : SocketExchangeOptions SocketSubscriptionsCombineTarget = 10 }; - /// /// ctor /// @@ -24,21 +24,16 @@ public BitMEXSocketOptions() { Default?.Set(this); } - - - /// + /// /// Exchange API options /// public SocketApiOptions ExchangeOptions { get; private set; } = new SocketApiOptions(); - internal BitMEXSocketOptions Set(BitMEXSocketOptions targetOptions) { - targetOptions = base.Set(targetOptions); - + targetOptions = base.Set(targetOptions); targetOptions.ExchangeOptions = ExchangeOptions.Set(targetOptions.ExchangeOptions); - return targetOptions; } } diff --git a/Examples/example-config.json b/Examples/example-config.json new file mode 100644 index 0000000..23f7ce3 --- /dev/null +++ b/Examples/example-config.json @@ -0,0 +1,31 @@ +{ + // Options section, select this section during DI registration using Configuration.GetSection("BitMEX") + "BitMEX": { + // API credentials for both REST and Websocket client + "ApiCredentials": { + "Key": "APIKEY", + "Secret": "APISECRET" + }, + // Set the environment by name + "Environment": { + "name": "live" + }, + // REST client options + "Rest": { + "RequestTimeout": "00:00:20", + "CachingEnabled": true, + "OutputOriginalData": true, + "Proxy": { + "Host": "https://127.0.0.1", + "Port": 8080, + "Login": "User", + "Password": "Pass" + } + }, + // Socket client options + "Socket": { + "RequestTimeout": "00:00:05", + "SocketSubscriptionsCombineTarget": 15 + } + } +} \ No newline at end of file