diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs index 392a0019..3693c145 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs @@ -22,14 +22,9 @@ namespace ExchangeSharp.BinanceGroup { public abstract class BinanceGroupCommon : ExchangeAPI { - public abstract string BaseUrlPrivate { get; set; } - public abstract string WithdrawalUrlPrivate { get; set; } - /// - /// base address for APIs used by the Binance website and not published in the API docs - /// - public abstract string BaseWebUrl { get; set; } + public string BaseUrlApi => $"{BaseUrl}/api/v3"; - public const string GetCurrenciesUrl = "/assetWithdraw/getAllAsset.html"; + public string BaseUrlSApi => $"{BaseUrl}/sapi/v1"; protected async Task GetWebSocketStreamUrlForSymbolsAsync(string suffix, params string[] marketSymbols) { @@ -90,6 +85,25 @@ public async Task> GetMyTradesAsync(string? mar return await OnGetMyTradesAsync(marketSymbol, afterDate); } + protected override async Task> OnGetCurrenciesAsync() + { + var result = await MakeJsonRequestAsync>("/capital/config/getall", BaseUrlSApi); + + return result.ToDictionary(x => x.Coin.ToUpper(), x => { + var network = x.NetworkList.FirstOrDefault(x => x.IsDefault); + return new ExchangeCurrency + { + Name = x.Coin, + FullName = x.Name, + DepositEnabled = network?.DepositEnable ?? x.DepositAllEnable, + WithdrawalEnabled = network?.WithdrawEnable ?? x.WithdrawAllEnable, + MinConfirmations = network?.MinConfirm ?? 0, + MinWithdrawalSize = decimal.Parse(network?.WithdrawMin ?? "0"), + TxFee = decimal.Parse(network?.WithdrawFee ?? "0") + }; + }); + } + protected override async Task> OnGetMarketSymbolsAsync() { List symbols = new List(); @@ -189,30 +203,6 @@ protected internal override async Task> OnGetMarketS return markets; } - protected override async Task> OnGetCurrenciesAsync() - { - // https://www.binance.com/assetWithdraw/getAllAsset.html - Dictionary allCoins = new Dictionary(StringComparer.OrdinalIgnoreCase); - - List currencies = await MakeJsonRequestAsync>(GetCurrenciesUrl, BaseWebUrl); - foreach (Currency coin in currencies) - { - allCoins[coin.AssetCode] = new ExchangeCurrency - { - CoinType = coin.ParentCode, - DepositEnabled = coin.EnableCharge, - FullName = coin.AssetName, - MinConfirmations = coin.ConfirmTimes.ConvertInvariant(), - Name = coin.AssetCode, - TxFee = coin.TransactionFee, - WithdrawalEnabled = coin.EnableWithdraw, - MinWithdrawalSize = coin.MinProductWithdraw.ConvertInvariant(), - }; - } - - return allCoins; - } - protected override async Task OnGetTickerAsync(string marketSymbol) { JToken obj = await MakeJsonRequestAsync("/ticker/24hr?symbol=" + marketSymbol); @@ -517,7 +507,7 @@ protected override async Task> OnGetCandlesAsync(strin protected override async Task> OnGetAmountsAsync() { - JToken token = await MakeJsonRequestAsync("/account", BaseUrlPrivate, await GetNoncePayloadAsync()); + JToken token = await MakeJsonRequestAsync("/account", BaseUrlApi, await GetNoncePayloadAsync()); Dictionary balances = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (JToken balance in token["balances"]) { @@ -532,7 +522,7 @@ protected override async Task> OnGetAmountsAsync() protected override async Task> OnGetAmountsAvailableToTradeAsync() { - JToken token = await MakeJsonRequestAsync("/account", BaseUrlPrivate, await GetNoncePayloadAsync()); + JToken token = await MakeJsonRequestAsync("/account", BaseUrlApi, await GetNoncePayloadAsync()); Dictionary balances = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (JToken balance in token["balances"]) { @@ -577,7 +567,7 @@ protected override async Task OnPlaceOrderAsync(ExchangeOrd } order.ExtraParameters.CopyTo(payload); - JToken? token = await MakeJsonRequestAsync("/order", BaseUrlPrivate, payload, "POST"); + JToken? token = await MakeJsonRequestAsync("/order", BaseUrlApi, payload, "POST"); if (token is null) { return null; @@ -599,13 +589,13 @@ protected override async Task OnGetOrderDetailsAsync(string else payload["orderId"] = orderId; - JToken token = await MakeJsonRequestAsync("/order", BaseUrlPrivate, payload); + JToken token = await MakeJsonRequestAsync("/order", BaseUrlApi, payload); ExchangeOrderResult result = ParseOrder(token); // Add up the fees from each trade in the order Dictionary feesPayload = await GetNoncePayloadAsync(); feesPayload["symbol"] = marketSymbol!; - JToken feesToken = await MakeJsonRequestAsync("/myTrades", BaseUrlPrivate, feesPayload); + JToken feesToken = await MakeJsonRequestAsync("/myTrades", BaseUrlApi, feesPayload); ParseFees(feesToken, result); return result; @@ -640,7 +630,7 @@ protected override async Task> OnGetOpenOrderDe { payload["symbol"] = marketSymbol!; } - JToken token = await MakeJsonRequestAsync("/openOrders", BaseUrlPrivate, payload); + JToken token = await MakeJsonRequestAsync("/openOrders", BaseUrlApi, payload); foreach (JToken order in token) { orders.Add(ParseOrder(order)); @@ -703,74 +693,13 @@ protected override async Task> OnGetCompletedOr { payload["startTime"] = afterDate.Value.UnixTimestampFromDateTimeMilliseconds(); } - JToken token = await MakeJsonRequestAsync("/myTrades", BaseUrlPrivate, payload); + JToken token = await MakeJsonRequestAsync("/myTrades", BaseUrlApi, payload); foreach (JToken trade in token) { trades.Add(ParseTrade(trade, marketSymbol!)); } } return trades; - - //old way - - //List orders = new List(); - //if (string.IsNullOrWhiteSpace(marketSymbol)) - //{ - // orders.AddRange(await GetCompletedOrdersForAllSymbolsAsync(afterDate)); - //} - //else - //{ - // Dictionary payload = await GetNoncePayloadAsync(); - // payload["symbol"] = marketSymbol; - // if (afterDate != null) - // { - // payload["startTime"] = Math.Round(afterDate.Value.UnixTimestampFromDateTimeMilliseconds()); - // } - // JToken token = await MakeJsonRequestAsync("/allOrders", BaseUrlPrivate, payload); - // foreach (JToken order in token) - // { - // orders.Add(ParseOrder(order)); - // } - //} - //return orders; - } - - private async Task> GetMyTradesForAllSymbols(DateTime? afterDate) - { - // TODO: This is a HACK, Binance API needs to add a single API call to get all orders for all symbols, terrible... - List trades = new List(); - Exception? ex = null; - string? failedSymbol = null; - Parallel.ForEach((await GetMarketSymbolsAsync()).Where(s => s.IndexOf("BTC", StringComparison.OrdinalIgnoreCase) >= 0), async (s) => - { - try - { - foreach (ExchangeOrderResult trade in (await GetMyTradesAsync(s, afterDate))) - { - lock (trades) - { - trades.Add(trade); - } - } - } - catch (Exception _ex) - { - failedSymbol = s; - ex = _ex; - } - }); - - if (ex != null) - { - throw new APIException("Failed to get my trades for symbol " + failedSymbol, ex); - } - - // sort timestamp desc - trades.Sort((o1, o2) => - { - return o2.OrderDate.CompareTo(o1.OrderDate); - }); - return trades; } private async Task> OnGetMyTradesAsync(string? marketSymbol = null, DateTime? afterDate = null) @@ -788,7 +717,7 @@ private async Task> OnGetMyTradesAsync(string? { payload["timestamp"] = afterDate.Value.UnixTimestampFromDateTimeMilliseconds(); } - JToken token = await MakeJsonRequestAsync("/myTrades", BaseUrlPrivate, payload); + JToken token = await MakeJsonRequestAsync("/myTrades", BaseUrlApi, payload); foreach (JToken trade in token) { trades.Add(ParseTrade(trade, marketSymbol!)); @@ -806,7 +735,7 @@ protected override async Task OnCancelOrderAsync(string orderId, string? marketS } payload["symbol"] = marketSymbol!; payload["orderId"] = orderId; - _ = await MakeJsonRequestAsync("/order", BaseUrlPrivate, payload, "DELETE"); + _ = await MakeJsonRequestAsync("/order", BaseUrlApi, payload, "DELETE"); } /// A withdrawal request. Fee is automatically subtracted from the amount. @@ -828,17 +757,21 @@ protected override async Task OnWithdrawAsync(Exchan } Dictionary payload = await GetNoncePayloadAsync(); - payload["asset"] = withdrawalRequest.Currency; + payload["coin"] = withdrawalRequest.Currency; payload["address"] = withdrawalRequest.Address; payload["amount"] = withdrawalRequest.Amount; - payload["name"] = withdrawalRequest.Description ?? "apiwithdrawal"; // Contrary to what the API docs say, name is required + + if (!string.IsNullOrWhiteSpace(withdrawalRequest.Description)) + { + payload["name"] = withdrawalRequest.Description; + } if (!string.IsNullOrWhiteSpace(withdrawalRequest.AddressTag)) { payload["addressTag"] = withdrawalRequest.AddressTag; } - JToken response = await MakeJsonRequestAsync("/withdraw.html", WithdrawalUrlPrivate, payload, "POST"); + JToken response = await MakeJsonRequestAsync("/capital/withdraw/apply", BaseUrlSApi, payload, "POST"); ExchangeWithdrawalResponse withdrawalResponse = new ExchangeWithdrawalResponse { Id = response["id"].ToStringInvariant(), @@ -1079,14 +1012,14 @@ protected override async Task OnGetDepositAddressAsync(s */ Dictionary payload = await GetNoncePayloadAsync(); - payload["asset"] = currency; + payload["coin"] = currency; - JToken response = await MakeJsonRequestAsync("/depositAddress.html", WithdrawalUrlPrivate, payload); + JToken response = await MakeJsonRequestAsync("/capital/deposit/address", BaseUrlSApi, payload); ExchangeDepositDetails depositDetails = new ExchangeDepositDetails { - Currency = response["asset"].ToStringInvariant(), + Currency = response["coin"].ToStringInvariant(), Address = response["address"].ToStringInvariant(), - AddressTag = response["addressTag"].ToStringInvariant() + AddressTag = response["tag"].ToStringInvariant() }; return depositDetails; @@ -1098,44 +1031,33 @@ protected override async Task OnGetDepositAddressAsync(s protected override async Task> OnGetDepositHistoryAsync(string currency) { // TODO: API supports searching on status, startTime, endTime - Dictionary payload = await GetNoncePayloadAsync(); + var payload = await GetNoncePayloadAsync(); + if (!string.IsNullOrWhiteSpace(currency)) { - payload["asset"] = currency; + payload["coin"] = currency; } - JToken response = await MakeJsonRequestAsync("/depositHistory.html", WithdrawalUrlPrivate, payload); + var response = await MakeJsonRequestAsync>("/capital/deposit/hisrec", BaseUrlSApi, payload); var transactions = new List(); - foreach (JToken token in response["depositList"]) + + foreach (var item in response) { - var transaction = new ExchangeTransaction - { - Timestamp = token["insertTime"].ConvertInvariant().UnixTimeStampToDateTimeMilliseconds(), - Amount = token["amount"].ConvertInvariant(), - Currency = token["asset"].ToStringUpperInvariant(), - Address = token["address"].ToStringInvariant(), - AddressTag = token["addressTag"].ToStringInvariant(), - BlockchainTxId = token["txId"].ToStringInvariant() - }; - int status = token["status"].ConvertInvariant(); - switch (status) + transactions.Add(new ExchangeTransaction { - case 0: - transaction.Status = TransactionStatus.Processing; - break; - - case 1: - transaction.Status = TransactionStatus.Complete; - break; - - default: - // If new states are added, see https://github.com/binance-exchange/binance-official-api-docs/blob/master/wapi-api.md - transaction.Status = TransactionStatus.Unknown; - transaction.Notes = "Unknown transaction status: " + status; - break; - } - - transactions.Add(transaction); + Timestamp = item.InsertTime.UnixTimeStampToDateTimeMilliseconds(), + Amount = decimal.Parse(item.Amount), + Currency = item.Coin.ToUpperInvariant(), + Address = item.Address, + AddressTag = item.AddressTag, + BlockchainTxId = item.TxId, + Status = item.Status switch + { + 0 => TransactionStatus.Processing, + 1 => TransactionStatus.Complete, + _ => TransactionStatus.Unknown + } + }); } return transactions; @@ -1168,7 +1090,7 @@ protected override async Task OnUserDataWebSocketAsync(Action GetListenKeyAsync() { - JToken response = await MakeJsonRequestAsync("/userDataStream", BaseUrl, null, "POST"); + JToken response = await MakeJsonRequestAsync("/userDataStream", BaseUrlApi, null, "POST"); var listenKey = response["listenKey"].ToStringInvariant(); return listenKey; } diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceAPI.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceAPI.cs index 26183265..81221609 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceAPI.cs @@ -16,11 +16,8 @@ namespace ExchangeSharp { public sealed class ExchangeBinanceAPI : BinanceGroupCommon { - public override string BaseUrl { get; set; } = "https://api.binance.com/api/v1"; + public override string BaseUrl { get; set; } = "https://api.binance.com"; public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.com:9443"; - public override string BaseUrlPrivate { get; set; } = "https://api.binance.com/api/v3"; - public override string WithdrawalUrlPrivate { get; set; } = "https://api.binance.com/wapi/v3"; - public override string BaseWebUrl { get; set; } = "https://www.binance.com"; } public partial class ExchangeName { public const string Binance = "Binance"; } diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceJerseyAPI.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceJerseyAPI.cs index c46b0823..3f53b4ee 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceJerseyAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceJerseyAPI.cs @@ -16,11 +16,8 @@ namespace ExchangeSharp { public class ExchangeBinanceJerseyAPI : BinanceGroupCommon { - public override string BaseUrl { get; set; } = "https://api.binance.je/api/v1"; + public override string BaseUrl { get; set; } = "https://api.binance.je"; public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.je:9443"; - public override string BaseUrlPrivate { get; set; } = "https://api.binance.je/api/v3"; - public override string WithdrawalUrlPrivate { get; set; } = "https://api.binance.je/wapi/v3"; - public override string BaseWebUrl { get; set; } = "https://www.binance.je"; } public partial class ExchangeName { public const string BinanceJersey = "BinanceJersey"; } diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceUSAPI.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceUSAPI.cs index ca3cfff2..24ddace3 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceUSAPI.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/ExchangeBinanceUSAPI.cs @@ -16,11 +16,8 @@ namespace ExchangeSharp { public sealed class ExchangeBinanceUSAPI : BinanceGroupCommon { - public override string BaseUrl { get; set; } = "https://api.binance.us/api/v1"; + public override string BaseUrl { get; set; } = "https://api.binance.us"; public override string BaseUrlWebSocket { get; set; } = "wss://stream.binance.us:9443"; - public override string BaseUrlPrivate { get; set; } = "https://api.binance.us/api/v3"; - public override string WithdrawalUrlPrivate { get; set; } = "https://api.binance.us/wapi/v3"; - public override string BaseWebUrl { get; set; } = "https://www.binance.us"; } public partial class ExchangeName { public const string BinanceUS = "BinanceUS"; } diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/Currency.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/Currency.cs index de77ad52..5c36e73b 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/Currency.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/Currency.cs @@ -1,154 +1,49 @@ -/* -MIT LICENSE +using Newtonsoft.Json; -Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -#nullable enable namespace ExchangeSharp.BinanceGroup { - using Newtonsoft.Json; - - internal class Currency - { - [JsonProperty("id")] - public string? Id { get; set; } - - [JsonProperty("assetCode")] - public string? AssetCode { get; set; } - - [JsonProperty("assetName")] - public string? AssetName { get; set; } - - [JsonProperty("unit")] - public string? Unit { get; set; } - - [JsonProperty("transactionFee")] - public decimal TransactionFee { get; set; } - - [JsonProperty("commissionRate")] - public decimal CommissionRate { get; set; } - - [JsonProperty("freeAuditWithdrawAmt")] - public decimal FreeAuditWithdrawAmt { get; set; } - - [JsonProperty("freeUserChargeAmount")] - public long FreeUserChargeAmount { get; set; } - - [JsonProperty("minProductWithdraw")] - public string? MinProductWithdraw { get; set; } - - [JsonProperty("withdrawIntegerMultiple")] - public string? WithdrawIntegerMultiple { get; set; } - - [JsonProperty("confirmTimes")] - public string? ConfirmTimes { get; set; } - - [JsonProperty("chargeLockConfirmTimes")] - public string? ChargeLockConfirmTimes { get; set; } - - [JsonProperty("url")] - public string? Url { get; set; } - - [JsonProperty("addressUrl")] - public string? AddressUrl { get; set; } - - [JsonProperty("blockUrl")] - public string? BlockUrl { get; set; } - - [JsonProperty("enableCharge")] - public bool EnableCharge { get; set; } - - [JsonProperty("enableWithdraw")] - public bool EnableWithdraw { get; set; } - - [JsonProperty("regEx")] - public string? RegEx { get; set; } - - [JsonProperty("regExTag")] - public string? RegExTag { get; set; } - - [JsonProperty("gas")] - public decimal Gas { get; set; } - - [JsonProperty("parentCode")] - public string? ParentCode { get; set; } - - [JsonProperty("isLegalMoney")] - public bool IsLegalMoney { get; set; } - - [JsonProperty("reconciliationAmount")] - public decimal ReconciliationAmount { get; set; } - - [JsonProperty("seqNum")] - public string? SeqNum { get; set; } - - [JsonProperty("chineseName")] - public string? ChineseName { get; set; } - - [JsonProperty("cnLink")] - public string? CnLink { get; set; } - - [JsonProperty("enLink")] - public string? EnLink { get; set; } - - [JsonProperty("logoUrl")] - public string? LogoUrl { get; set; } - - [JsonProperty("fullLogoUrl")] - public string? FullLogoUrl { get; set; } - - [JsonProperty("forceStatus")] - public bool ForceStatus { get; set; } - - [JsonProperty("resetAddressStatus")] - public bool ResetAddressStatus { get; set; } - - [JsonProperty("chargeDescCn")] - public object? ChargeDescCn { get; set; } + public class Currency + { + [JsonProperty("coin")] + public string Coin { get; set; } - [JsonProperty("chargeDescEn")] - public object? ChargeDescEn { get; set; } + [JsonProperty("depositAllEnable")] + public bool DepositAllEnable { get; set; } - [JsonProperty("assetLabel")] - public object? AssetLabel { get; set; } + [JsonProperty("free")] + public string Free { get; set; } - [JsonProperty("sameAddress")] - public bool SameAddress { get; set; } + [JsonProperty("freeze")] + public string Freeze { get; set; } - [JsonProperty("depositTipStatus")] - public bool DepositTipStatus { get; set; } + [JsonProperty("ipoable")] + public string Ipoable { get; set; } - [JsonProperty("dynamicFeeStatus")] - public bool DynamicFeeStatus { get; set; } + [JsonProperty("ipoing")] + public string Ipoing { get; set; } - [JsonProperty("depositTipEn")] - public object? DepositTipEn { get; set; } + [JsonProperty("isLegalMoney")] + public bool IsLegalMoney { get; set; } - [JsonProperty("depositTipCn")] - public object? DepositTipCn { get; set; } + [JsonProperty("locked")] + public string Locked { get; set; } - [JsonProperty("assetLabelEn")] - public object? AssetLabelEn { get; set; } + [JsonProperty("name")] + public string Name { get; set; } - [JsonProperty("supportMarket")] - public object? SupportMarket { get; set; } + [JsonProperty("storage")] + public string Storage { get; set; } - [JsonProperty("feeReferenceAsset")] - public string? FeeReferenceAsset { get; set; } + [JsonProperty("trading")] + public bool Trading { get; set; } - [JsonProperty("feeRate")] - public decimal? FeeRate { get; set; } + [JsonProperty("withdrawAllEnable")] + public bool WithdrawAllEnable { get; set; } - [JsonProperty("feeDigit")] - public int? FeeDigit { get; set; } + [JsonProperty("withdrawing")] + public string Withdrawing { get; set; } - [JsonProperty("legalMoney")] - public bool LegalMoney { get; set; } - } + [JsonProperty("networkList")] + public CurrencyNetwork[] NetworkList { get; set; } + } } diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/CurrencyNetwork.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/CurrencyNetwork.cs new file mode 100644 index 00000000..de777865 --- /dev/null +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/CurrencyNetwork.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; + +namespace ExchangeSharp.BinanceGroup +{ + public class CurrencyNetwork + { + [JsonProperty("addressRegex")] + public string AddressRegex { get; set; } + + [JsonProperty("coin")] + public string Coin { get; set; } + + [JsonProperty("depositDesc")] + public string DepositDesc { get; set; } + + [JsonProperty("depositEnable")] + public bool DepositEnable { get; set; } + + [JsonProperty("isDefault")] + public bool IsDefault { get; set; } + + [JsonProperty("memoRegex")] + public string MemoRegex { get; set; } + + [JsonProperty("minConfirm")] + public int MinConfirm { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("network")] + public string Network { get; set; } + + [JsonProperty("resetAddressStatus")] + public bool ResetAddressStatus { get; set; } + + [JsonProperty("specialTips")] + public string SpecialTips { get; set; } + + [JsonProperty("unLockConfirm")] + public int UnLockConfirm { get; set; } + + [JsonProperty("withdrawDesc")] + public string WithdrawDesc { get; set; } + + [JsonProperty("withdrawEnable")] + public bool WithdrawEnable { get; set; } + + [JsonProperty("withdrawFee")] + public string WithdrawFee { get; set; } + + [JsonProperty("withdrawIntegerMultiple")] + public string WithdrawIntegerMultiple { get; set; } + + [JsonProperty("withdrawMax")] + public string WithdrawMax { get; set; } + + [JsonProperty("withdrawMin")] + public string WithdrawMin { get; set; } + + [JsonProperty("sameAddress")] + public bool SameAddress { get; set; } + } +} diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/HistoryRecord.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/HistoryRecord.cs new file mode 100644 index 00000000..2a91b68c --- /dev/null +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/Models/HistoryRecord.cs @@ -0,0 +1,40 @@ +using Newtonsoft.Json; + +namespace ExchangeSharp.BinanceGroup +{ + public class HistoryRecord + { + [JsonProperty("amount")] + public string Amount { get; set; } + + [JsonProperty("coin")] + public string Coin { get; set; } + + [JsonProperty("network")] + public string Network { get; set; } + + [JsonProperty("status")] + public int Status { get; set; } + + [JsonProperty("address")] + public string Address { get; set; } + + [JsonProperty("addressTag")] + public string AddressTag { get; set; } + + [JsonProperty("txId")] + public string TxId { get; set; } + + [JsonProperty("insertTime")] + public long InsertTime { get; set; } + + [JsonProperty("transferType")] + public int TransferType { get; set; } + + [JsonProperty("unlockConfirm")] + public string UnlockConfirm { get; set; } + + [JsonProperty("confirmTimes")] + public string ConfirmTimes { get; set; } + } +}