Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion BitMEX.Net.UnitTests/BitMEXRestClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
3 changes: 2 additions & 1 deletion BitMEX.Net.UnitTests/BitMEXRestIntegrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using BitMEX.Net.Objects.Options;
using System.Threading;
using BitMEX.Net.SymbolOrderBooks;
using CryptoExchange.Net.Authentication;

namespace BitMEX.Net.UnitTests
{
Expand All @@ -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
}));
}

Expand Down
3 changes: 2 additions & 1 deletion BitMEX.Net.UnitTests/BitMEXSocketIntegrationTests.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down
7 changes: 4 additions & 3 deletions BitMEX.Net.UnitTests/RestRequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Threading.Tasks;
using BitMEX.Net.Clients;
using System.Linq;
using CryptoExchange.Net.Authentication;

namespace BitMEX.Net.UnitTests
{
Expand All @@ -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<BitMEXRestClient>(client, "Endpoints/Exchange/Account", "https://www.bitmex.com", IsAuthenticated);
await tester.ValidateAsync(client => client.ExchangeApi.Account.GetUserEventsAsync(), "GetUserEvents", nestedJsonProperty: "userEvents");
Expand All @@ -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<BitMEXRestClient>(client, "Endpoints/Exchange/ExchangeData", "https://www.bitmex.com", IsAuthenticated);
await tester.ValidateAsync(client => client.ExchangeApi.ExchangeData.GetActiveSymbolsAsync(), "GetActiveSymbols", ignoreProperties: ["publishInterval", "fundingInterval", "rebalanceInterval"]);
Expand All @@ -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<BitMEXRestClient>(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<string> { "text" });
Expand Down
3 changes: 2 additions & 1 deletion BitMEX.Net.UnitTests/SocketSubscriptionTests.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<BitMEXSocketClient>(client, "Subscriptions/Exchange", "wss://ws.bitmex.com/");
Expand Down
3 changes: 2 additions & 1 deletion BitMEX.Net/BitMEX.Net.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>
<PackageReleaseNotes>https://github.com/JKorf/BitMEX.Net?tab=readme-ov-file#release-notes</PackageReleaseNotes>
<NoWarn>$(NoWarn);SYSLIB1100;SYSLIB1101</NoWarn>
</PropertyGroup>
<PropertyGroup Label="AOT" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net7.0'))">
<IsAotCompatible>true</IsAotCompatible>
Expand Down Expand Up @@ -52,7 +53,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="CryptoExchange.Net" Version="10.8.0" />
<PackageReference Include="CryptoExchange.Net" Version="11.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.101">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
7 changes: 3 additions & 4 deletions BitMEX.Net/BitMEXAuthenticationProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@

namespace BitMEX.Net
{
internal class BitMEXAuthenticationProvider : AuthenticationProvider
internal class BitMEXAuthenticationProvider : AuthenticationProvider<BitMEXCredentials, BitMEXCredentials>
{
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)
{
}

Expand All @@ -26,7 +25,7 @@ public override void ProcessRequest(RestApiClient apiClient, RestRequestConfigur
var expires = DateTimeConverter.ConvertToSeconds(timestamp.AddSeconds(5))!;
request.Headers ??= new Dictionary<string, string>();
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);
Expand Down
47 changes: 47 additions & 0 deletions BitMEX.Net/BitMEXCredentials.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using CryptoExchange.Net.Authentication;
using System;

namespace BitMEX.Net
{
/// <summary>
/// BitMEX API credentials
/// </summary>
public class BitMEXCredentials : HMACCredential
{
/// <summary>
/// Create new credentials
/// </summary>
public BitMEXCredentials() { }

/// <summary>
/// Create new credentials providing credentials in HMAC format
/// </summary>
/// <param name="key">API key</param>
/// <param name="secret">API secret</param>
public BitMEXCredentials(string key, string secret) : base(key, secret)
{
}

/// <summary>
/// Create new credentials providing HMAC credentials
/// </summary>
/// <param name="credential">HMAC Credentials</param>
public BitMEXCredentials(HMACCredential credential) : base(credential.Key, credential.Secret)
{
}

/// <summary>
/// Specify the HMAC credentials
/// </summary>
/// <param name="key">API key</param>
/// <param name="secret">API secret</param>
public BitMEXCredentials WithHMAC(string key, string secret)
{
if (!string.IsNullOrEmpty(Key)) throw new InvalidOperationException("Credentials already set");

Key = key;
Secret = secret;
return this;
}
}
}
4 changes: 2 additions & 2 deletions BitMEX.Net/BitMEXTrackerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig?
}

/// <inheritdoc />
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<IBitMEXUserClientProvider>() ?? new BitMEXUserClientProvider();
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
Expand Down Expand Up @@ -109,7 +109,7 @@ public IUserFuturesDataTracker CreateUserFuturesDataTracker(FuturesUserDataTrack
}

/// <inheritdoc />
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<IBitMEXUserClientProvider>() ?? new BitMEXUserClientProvider();
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
Expand Down
13 changes: 1 addition & 12 deletions BitMEX.Net/Clients/BitMEXRestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace BitMEX.Net.Clients
{
/// <inheritdoc cref="IBitMEXRestClient" />
public class BitMEXRestClient : BaseRestClient, IBitMEXRestClient
public class BitMEXRestClient : BaseRestClient<BitMEXEnvironment, BitMEXCredentials>, IBitMEXRestClient
{
#region Api clients

Expand Down Expand Up @@ -50,12 +50,6 @@ public BitMEXRestClient(HttpClient? httpClient, ILoggerFactory? loggerFactory, I

#endregion

/// <inheritdoc />
public void SetOptions(UpdateOptions options)
{
ExchangeApi.SetOptions(options);
}

/// <summary>
/// Set the default options to be used when creating new clients
/// </summary>
Expand All @@ -65,10 +59,5 @@ public static void SetDefaultOptions(Action<BitMEXRestOptions> optionsDelegate)
BitMEXRestOptions.Default = ApplyOptionsDelegate(optionsDelegate);
}

/// <inheritdoc />
public void SetApiCredentials(ApiCredentials credentials)
{
ExchangeApi.SetApiCredentials(credentials);
}
}
}
16 changes: 1 addition & 15 deletions BitMEX.Net/Clients/BitMEXSocketClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
namespace BitMEX.Net.Clients
{
/// <inheritdoc cref="IBitMEXSocketClient" />
public class BitMEXSocketClient : BaseSocketClient, IBitMEXSocketClient
public class BitMEXSocketClient : BaseSocketClient<BitMEXEnvironment, BitMEXCredentials>, IBitMEXSocketClient
{
#region fields
#endregion
Expand Down Expand Up @@ -52,12 +52,6 @@ public BitMEXSocketClient(IOptions<BitMEXSocketOptions> options, ILoggerFactory?
}
#endregion

/// <inheritdoc />
public void SetOptions(UpdateOptions options)
{
ExchangeApi.SetOptions(options);
}

/// <summary>
/// Set the default options to be used when creating new clients
/// </summary>
Expand All @@ -66,13 +60,5 @@ public static void SetDefaultOptions(Action<BitMEXSocketOptions> optionsDelegate
{
BitMEXSocketOptions.Default = ApplyOptionsDelegate(optionsDelegate);
}

/// <inheritdoc />
public void SetApiCredentials(ApiCredentials credentials)
{

ExchangeApi.SetApiCredentials(credentials);

}
}
}
10 changes: 5 additions & 5 deletions BitMEX.Net/Clients/BitMEXUserClientProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public BitMEXUserClientProvider(
}

/// <inheritdoc />
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);
Expand All @@ -63,7 +63,7 @@ public void ClearUserClients(string userIdentifier)
}

/// <inheritdoc />
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);
Expand All @@ -72,15 +72,15 @@ public IBitMEXRestClient GetRestClient(string userIdentifier, ApiCredentials? cr
}

/// <inheritdoc />
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);

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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions BitMEX.Net/Clients/ExchangeApi/BitMEXRestClientExchangeApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
namespace BitMEX.Net.Clients.ExchangeApi
{
/// <inheritdoc cref="IBitMEXRestClientExchangeApi" />
internal partial class BitMEXRestClientExchangeApi : RestApiClient, IBitMEXRestClientExchangeApi
internal partial class BitMEXRestClientExchangeApi : RestApiClient<BitMEXEnvironment, BitMEXAuthenticationProvider, BitMEXCredentials>, IBitMEXRestClientExchangeApi
{
#region fields
public new BitMEXRestOptions ClientOptions => (BitMEXRestOptions)base.ClientOptions;
Expand Down Expand Up @@ -57,7 +57,7 @@ internal BitMEXRestClientExchangeApi(ILogger logger, HttpClient? httpClient, Bit
protected override IMessageSerializer CreateSerializer() => new SystemTextJsonMessageSerializer(SerializerOptions.WithConverters(BitMEXExchange._serializerContext));

/// <inheritdoc />
protected override AuthenticationProvider CreateAuthenticationProvider(ApiCredentials credentials)
protected override BitMEXAuthenticationProvider CreateAuthenticationProvider(BitMEXCredentials credentials)
=> new BitMEXAuthenticationProvider(credentials);

internal Task<WebCallResult> SendAsync(RequestDefinition definition, ParameterCollection? parameters, CancellationToken cancellationToken, int? weight = null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ async Task<ExchangeWebResult<SharedDeposit[]>> 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,
Expand All @@ -204,6 +204,17 @@ async Task<ExchangeWebResult<SharedDeposit[]>> 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
Expand Down Expand Up @@ -993,9 +1004,11 @@ async Task<ExchangeWebResult<SharedId>> 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)
Expand Down Expand Up @@ -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<CancelOrderRequest> ISpotTriggerOrderRestClient.CancelSpotTriggerOrderOptions { get; } = new EndpointOptions<CancelOrderRequest>(true);
Expand Down
Loading
Loading