consequunturatque
Version:
A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges
1,122 lines (1,094 loc) • 53.4 kB
JavaScript
'use strict';
// ---------------------------------------------------------------------------
const Exchange = require ('./base/Exchange');
const { RateLimitExceeded, BadSymbol, OrderNotFound, ExchangeError, AuthenticationError, ArgumentsRequired, ExchangeNotAvailable } = require ('./base/errors');
const Precise = require ('./base/Precise');
// ---------------------------------------------------------------------------
module.exports = class bw extends Exchange {
describe () {
return this.deepExtend (super.describe (), {
'id': 'bw',
'name': 'BW',
'countries': [ 'CN' ],
'rateLimit': 1500,
'version': 'v1',
'has': {
'cancelAllOrders': false,
'cancelOrder': true,
'cancelOrders': false,
'CORS': false,
'createDepositAddress': false,
'createLimitOrder': true,
'createMarketOrder': false,
'createOrder': true,
'deposit': false,
'editOrder': false,
'fetchBalance': true,
'fetchBidsAsks': false,
'fetchClosedOrders': true,
'fetchCurrencies': true,
'fetchDepositAddress': true,
'fetchDeposits': true,
'fetchFundingFees': false,
'fetchL2OrderBook': false,
'fetchLedger': false,
'fetchMarkets': true,
'fetchMyTrades': false,
'fetchOHLCV': true,
'fetchOpenOrders': true,
'fetchOrder': true,
'fetchOrderBook': true,
'fetchOrderBooks': false,
'fetchOrders': true,
'fetchTicker': true,
'fetchTickers': true,
'fetchTrades': true,
'fetchTradingFee': false,
'fetchTradingFees': false,
'fetchTradingLimits': false,
'fetchTransactions': false,
'fetchWithdrawals': true,
'privateAPI': false,
'publicAPI': false,
'withdraw': false,
},
'timeframes': {
'1m': '1M',
'5m': '5M',
'15m': '15M',
'30m': '30M',
'1h': '1H',
'1w': '1W',
},
'hostname': 'bw.com', // set to 'bw.io' for China mainland
'urls': {
'logo': 'https://user-images.githubusercontent.com/1294454/69436317-31128c80-0d52-11ea-91d1-eb7bb5818812.jpg',
'api': 'https://www.{hostname}',
'www': 'https://www.bw.com',
'doc': 'https://github.com/bw-exchange/api_docs_en/wiki',
'fees': 'https://www.bw.com/feesRate',
'referral': 'https://www.bw.com/regGetCommission/N3JuT1R3bWxKTE0',
},
'requiredCredentials': {
'apiKey': true,
'secret': true,
},
'fees': {
'trading': {
'tierBased': false,
'percentage': true,
'taker': 0.2 / 100,
'maker': 0.2 / 100,
},
'funding': {
},
},
'exceptions': {
'exact': {
'999': AuthenticationError,
'1000': ExchangeNotAvailable, // {"datas":null,"resMsg":{"message":"getKlines error:data not exitsts\uff0cplease wait ,dataType=4002_KLINE_1M","method":null,"code":"1000"}}
'2012': OrderNotFound, // {"datas":null,"resMsg":{"message":"entrust not exists or on dealing with system","method":null,"code":"2012"}}
'5017': BadSymbol, // {"datas":null,"resMsg":{"message":"market not exist","method":null,"code":"5017"}}
'10001': RateLimitExceeded, // {"resMsg":{"code":"10001","message":"API frequency limit"}}
},
},
'api': {
'public': {
'get': [
'api/data/v1/klines',
'api/data/v1/ticker',
'api/data/v1/tickers',
'api/data/v1/trades',
'api/data/v1/entrusts',
'exchange/config/controller/website/marketcontroller/getByWebId',
'exchange/config/controller/website/currencycontroller/getCurrencyList',
],
},
'private': {
'get': [
'exchange/entrust/controller/website/EntrustController/getEntrustById',
'exchange/entrust/controller/website/EntrustController/getUserEntrustRecordFromCacheWithPage',
'exchange/entrust/controller/website/EntrustController/getUserEntrustList',
'exchange/fund/controller/website/fundwebsitecontroller/getwithdrawaddress',
'exchange/fund/controller/website/fundwebsitecontroller/getpayoutcoinrecord',
'exchange/entrust/controller/website/EntrustController/getUserEntrustList',
// the docs say that the following URLs are HTTP POST
// in the docs header and HTTP GET in the docs body
// the docs contradict themselves, a typo most likely
// the actual HTTP method is POST for this endpoint
// 'exchange/fund/controller/website/fundcontroller/getPayinAddress',
// 'exchange/fund/controller/website/fundcontroller/getPayinCoinRecord',
],
'post': [
'exchange/fund/controller/website/fundcontroller/getPayinAddress', // see the comment above
'exchange/fund/controller/website/fundcontroller/getPayinCoinRecord', // see the comment above
'exchange/fund/controller/website/fundcontroller/findbypage',
'exchange/entrust/controller/website/EntrustController/addEntrust',
'exchange/entrust/controller/website/EntrustController/cancelEntrust',
],
},
},
});
}
async fetchMarkets (params = {}) {
const response = await this.publicGetExchangeConfigControllerWebsiteMarketcontrollerGetByWebId (params);
//
// {
// "datas": [
// {
// "orderNum":null,
// "leverEnable":true,
// "leverMultiple":10,
// "marketId":"291",
// "webId":"102",
// "serverId":"entrust_bw_23",
// "name":"eos_usdt",
// "leverType":"2",
// "buyerCurrencyId":"11",
// "sellerCurrencyId":"7",
// "amountDecimal":4,
// "priceDecimal":3,
// "minAmount":"0.0100000000",
// "state":1,
// "openTime":1572537600000,
// "defaultFee":"0.00200000",
// "createUid":null,
// "createTime":0,
// "modifyUid":null,
// "modifyTime":1574160113735,
// "combineMarketId":"",
// "isCombine":0,
// "isMining":0
// }
// ],
// "resMsg": { "message":"success !", "method":null, "code":"1" }
// }
//
const markets = this.safeValue (response, 'datas', []);
const result = [];
for (let i = 0; i < markets.length; i++) {
const market = markets[i];
const id = this.safeString (market, 'marketId');
const numericId = parseInt (id);
const name = this.safeStringUpper (market, 'name');
let [ base, quote ] = name.split ('_');
base = this.safeCurrencyCode (base);
quote = this.safeCurrencyCode (quote);
const baseId = this.safeString (market, 'sellerCurrencyId');
const quoteId = this.safeString (market, 'buyerCurrencyId');
const baseNumericId = parseInt (baseId);
const quoteNumericId = parseInt (quoteId);
const symbol = base + '/' + quote;
const state = this.safeInteger (market, 'state');
const active = (state === 1);
const fee = this.safeNumber (market, 'defaultFee');
result.push ({
'id': id,
'active': active,
'numericId': numericId,
'symbol': symbol,
'base': base,
'quote': quote,
'baseId': baseId,
'quoteId': quoteId,
'baseNumericId': baseNumericId,
'quoteNumericId': quoteNumericId,
'maker': fee,
'taker': fee,
'info': market,
'precision': {
'amount': this.safeInteger (market, 'amountDecimal'),
'price': this.safeInteger (market, 'priceDecimal'),
},
'limits': {
'amount': {
'min': this.safeNumber (market, 'minAmount'),
'max': undefined,
},
'price': {
'min': 0,
'max': undefined,
},
'cost': {
'min': 0,
'max': undefined,
},
},
});
}
return result;
}
async fetchCurrencies (params = {}) {
const response = await this.publicGetExchangeConfigControllerWebsiteCurrencycontrollerGetCurrencyList (params);
//
// {
// "datas":[
// {
// "currencyId":"456",
// "name":"pan",
// "alias":"pan",
// "logo":"pan.svg",
// "description":"pan",
// "descriptionEnglish":"pan",
// "defaultDecimal":2,
// "createUid":null,
// "createTime":1574068133762,
// "modifyUid":null,
// "modifyTime":0,
// "state":1,
// "mark":"pan",
// "totalNumber":"0",
// "publishNumber":"0",
// "marketValue":"0",
// "isLegalCoin":0,
// "needBlockUrl":1,
// "blockChainUrl":"https://etherscan.io/tx/",
// "tradeSearchUrl":null,
// "tokenCoinsId":0,
// "isMining":"0",
// "arithmetic":null,
// "founder":"bw_nxwal",
// "teamAddress":null,
// "remark":null,
// "tokenName":"ethw2",
// "isMemo":0,
// "websiteCurrencyId":"7rhqoHLohkG",
// "drawFlag":0,
// "rechargeFlag":1,
// "drawFee":"0.03000000",
// "onceDrawLimit":100,
// "dailyDrawLimit":500,
// "timesFreetrial":"0",
// "hourFreetrial":"0",
// "dayFreetrial":"0",
// "minFee":"0",
// "inConfigTimes":7,
// "outConfigTimes":7,
// "minCash":"0.06000000",
// "limitAmount":"0",
// "zbExist":false,
// "zone":1
// },
// ],
// "resMsg": { "message":"success !", "method":null, "code":"1" }
// }
//
const currencies = this.safeValue (response, 'datas', []);
const result = {};
for (let i = 0; i < currencies.length; i++) {
const currency = currencies[i];
const id = this.safeString (currency, 'currencyId');
const code = this.safeCurrencyCode (this.safeStringUpper (currency, 'name'));
const state = this.safeInteger (currency, 'state');
const active = state === 1;
result[code] = {
'id': id,
'code': code,
'info': currency,
'name': code,
'active': active,
'fee': this.safeNumber (currency, 'drawFee'),
'precision': undefined,
'limits': {
'amount': {
'min': this.safeNumber (currency, 'limitAmount', 0),
'max': undefined,
},
'withdraw': {
'min': undefined,
'max': this.safeNumber (currency, 'onceDrawLimit'),
},
},
};
}
return result;
}
parseTicker (ticker, market = undefined) {
//
// [
// "281", // market id
// "9754.4", // last
// "9968.8", // high
// "9631.5", // low
// "47865.6432", // base volume
// "-2.28", // change
// // closing price for last 6 hours
// "[[1, 9750.1], [2, 9737.1], [3, 9727.5], [4, 9722], [5, 9722.1], [6, 9754.4]]",
// "9752.12", // bid
// "9756.69", // ask
// "469849357.2364" // quote volume
// ]
//
const marketId = this.safeString (ticker, 0);
const symbol = this.safeSymbol (marketId, market);
const timestamp = this.milliseconds ();
const close = parseFloat (this.safeValue (ticker, 1));
const bid = this.safeValue (ticker, 'bid', {});
const ask = this.safeValue (ticker, 'ask', {});
return {
'symbol': symbol,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'high': parseFloat (this.safeValue (ticker, 2)),
'low': parseFloat (this.safeValue (ticker, 3)),
'bid': parseFloat (this.safeValue (ticker, 7)),
'bidVolume': this.safeNumber (bid, 'quantity'),
'ask': parseFloat (this.safeValue (ticker, 8)),
'askVolume': this.safeNumber (ask, 'quantity'),
'vwap': undefined,
'open': undefined,
'close': close,
'last': close,
'previousClose': undefined,
'change': parseFloat (this.safeValue (ticker, 5)),
'percentage': undefined,
'average': undefined,
'baseVolume': parseFloat (this.safeValue (ticker, 4)),
'quoteVolume': parseFloat (this.safeValue (ticker, 9)),
'info': ticker,
};
}
async fetchTicker (symbol, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
};
const response = await this.publicGetApiDataV1Ticker (this.extend (request, params));
//
// {
// "datas": [
// "281",
// "7601.99",
// "8126.5",
// "7474.68",
// "47004.8708",
// "-6.18",
// "[[1, 7800.34], [2, 7626.41], [3, 7609.97], [4, 7569.04], [5, 7577.93], [6, 7601.99]]",
// "7600.24",
// "7603.69",
// "371968300.0119",
// ],
// "resMsg": { "message": "success !", "method": null, "code": "1" }
// }
//
const ticker = this.safeValue (response, 'datas', []);
return this.parseTicker (ticker, market);
}
async fetchTickers (symbols = undefined, params = {}) {
await this.loadMarkets ();
const response = await this.publicGetApiDataV1Tickers (params);
//
// {
// "datas": [
// [
// "4051",
// "0.00194",
// "0.00863",
// "0.0012",
// "1519020",
// "-38.22",
// "[[1, 0.0023], [2, 0.00198], [3, 0.00199], [4, 0.00195], [5, 0.00199], [6, 0.00194]]",
// "0.00123",
// "0.0045",
// "4466.8104",
// ],
// ],
// "resMsg": { "message": "success !", "method": null, "code": "1" },
// }
//
const datas = this.safeValue (response, 'datas', []);
const result = {};
for (let i = 0; i < datas.length; i++) {
const ticker = this.parseTicker (datas[i]);
const symbol = ticker['symbol'];
if ((symbols === undefined) || this.inArray (symbol, symbols)) {
result[symbol] = ticker;
}
}
return this.filterByArray (result, 'symbol', symbols);
}
async fetchOrderBook (symbol, limit = undefined, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
};
if (limit !== undefined) {
request['dataSize'] = limit;
}
const response = await this.publicGetApiDataV1Entrusts (this.extend (request, params));
//
// {
// "datas": {
// "asks": [
// [ "9740.43", "0.0083" ],
// ],
// "bids": [
// [ "9734.33", "0.0133" ],
// ],
// "timestamp": "1569303520",
// },
// "resMsg": {
// "message": "success !",
// "method": null,
// "code": "1",
// },
// }
//
const orderbook = this.safeValue (response, 'datas', []);
const timestamp = this.safeTimestamp (orderbook, 'timestamp');
return this.parseOrderBook (orderbook, symbol, timestamp);
}
parseTrade (trade, market = undefined) {
//
// fetchTrades (public)
//
// [
// "T", // trade
// "281", // market id
// "1569303302", // timestamp
// "BTC_USDT", // market name
// "ask", // side
// "9745.08", // price
// "0.0026" // amount
// ]
//
// fetchMyTrades (private)
//
// ...
//
const timestamp = this.safeTimestamp (trade, 2);
const priceString = this.safeString (trade, 5);
const amountString = this.safeString (trade, 6);
const price = this.parseNumber (priceString);
const amount = this.parseNumber (amountString);
const cost = this.parseNumber (Precise.stringMul (priceString, amountString));
const marketId = this.safeString (trade, 1);
let symbol = undefined;
if (marketId !== undefined) {
if (marketId in this.markets_by_id) {
market = this.markets_by_id[marketId];
} else {
const marketName = this.safeString (trade, 3);
const [ baseId, quoteId ] = marketName.split ('_');
const base = this.safeCurrencyCode (baseId);
const quote = this.safeCurrencyCode (quoteId);
symbol = base + '/' + quote;
}
}
if ((symbol === undefined) && (market !== undefined)) {
symbol = market['symbol'];
}
const sideString = this.safeString (trade, 4);
const side = (sideString === 'ask') ? 'sell' : 'buy';
return {
'id': undefined,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'symbol': symbol,
'order': undefined,
'type': 'limit',
'side': side,
'takerOrMaker': undefined,
'price': price,
'amount': amount,
'cost': cost,
'fee': undefined,
'info': trade,
};
}
async fetchTrades (symbol, since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
};
if (limit !== undefined) {
request['dataSize'] = limit; // max 20
}
const response = await this.publicGetApiDataV1Trades (this.extend (request, params));
//
// {
// "datas": [
// [
// "T", // trade
// "281", // market id
// "1569303302", // timestamp
// "BTC_USDT", // market name
// "ask", // side
// "9745.08", // price
// "0.0026" // amount
// ],
// ],
// "resMsg": { "code": "1", "method": null, "message": "success !" },
// }
//
const trades = this.safeValue (response, 'datas', []);
return this.parseTrades (trades, market, since, limit);
}
parseOHLCV (ohlcv, market = undefined) {
//
// [
// "K",
// "305",
// "eth_btc",
// "1591511280",
// "0.02504",
// "0.02504",
// "0.02504",
// "0.02504",
// "0.0123",
// "0",
// "285740.17",
// "1M",
// "false",
// "0.000308"
// ]
//
return [
this.safeTimestamp (ohlcv, 3),
this.safeNumber (ohlcv, 4),
this.safeNumber (ohlcv, 5),
this.safeNumber (ohlcv, 6),
this.safeNumber (ohlcv, 7),
this.safeNumber (ohlcv, 8),
];
}
async fetchOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
'type': this.timeframes[timeframe],
'dataSize': 500,
};
if (limit !== undefined) {
request['dataSize'] = limit;
}
const response = await this.publicGetApiDataV1Klines (this.extend (request, params));
//
// {
// "datas":[
// ["K","305","eth_btc","1591511280","0.02504","0.02504","0.02504","0.02504","0.0123","0","285740.17","1M","false","0.000308"],
// ["K","305","eth_btc","1591511220","0.02504","0.02504","0.02504","0.02504","0.0006","0","285740.17","1M","false","0.00001502"],
// ["K","305","eth_btc","1591511100","0.02505","0.02505","0.02504","0.02504","0.0012","-0.0399","285740.17","1M","false","0.00003005"],
// ],
// "resMsg":{"code":"1","method":null,"message":"success !"}
// }
//
const data = this.safeValue (response, 'datas', []);
return this.parseOHLCVs (data, market, timeframe, since, limit);
}
async fetchBalance (params = {}) {
await this.loadMarkets ();
const response = await this.privatePostExchangeFundControllerWebsiteFundcontrollerFindbypage (params);
//
// {
// "datas": {
// "totalRow": 6,
// "pageSize": 99,
// "list": [
// {
// "amount": "0.000090000000000000", // The current number of tokens available
// "currencyTypeId": 2, // Token ID
// "freeze": "0.009900000000000000", // Current token freezing quantity
// },
// ],
// "pageNum": 1,
// },
// "resMsg": { "code": "1", "message": "success !" }
// }
//
const data = this.safeValue (response, 'datas', {});
const balances = this.safeValue (data, 'list', []);
const result = { 'info': response };
for (let i = 0; i < balances.length; i++) {
const balance = balances[i];
const currencyId = this.safeString (balance, 'currencyTypeId');
const code = this.safeCurrencyCode (currencyId);
const account = this.account ();
account['free'] = this.safeString (balance, 'amount');
account['used'] = this.safeString (balance, 'freeze');
result[code] = account;
}
return this.parseBalance (result, false);
}
async createOrder (symbol, type, side, amount, price = undefined, params = {}) {
if (price === undefined) {
throw new ExchangeError (this.id + ' allows limit orders only');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'amount': this.amountToPrecision (symbol, amount),
'price': this.priceToPrecision (symbol, price),
'type': (side === 'buy') ? 1 : 0,
'rangeType': 0, // limit order
'marketId': market['id'],
};
const response = await this.privatePostExchangeEntrustControllerWebsiteEntrustControllerAddEntrust (this.extend (request, params));
//
// {
// "datas": {
// "entrustId": "E6581105708337483776",
// },
// "resMsg": {
// "message": "success !",
// "method": null,
// "code": "1"
// }
// }
//
const data = this.safeValue (response, 'datas');
const id = this.safeString (data, 'entrustId');
return {
'id': id,
'info': response,
'timestamp': undefined,
'datetime': undefined,
'lastTradeTimestamp': undefined,
'symbol': symbol,
'type': type,
'side': side,
'price': price,
'amount': amount,
'cost': undefined,
'average': undefined,
'filled': undefined,
'remaining': undefined,
'status': 'open',
'fee': undefined,
'trades': undefined,
'clientOrderId': undefined,
};
}
parseOrderStatus (status) {
const statuses = {
'-3': 'canceled',
'-2': 'canceled',
'-1': 'canceled',
'0': 'open',
'1': 'canceled',
'2': 'closed',
'3': 'open',
'4': 'canceled',
};
return this.safeString (statuses, status, status);
}
parseOrder (order, market = undefined) {
//
// fetchOrder, fetchOpenOrders, fetchClosedOrders
//
// {
// "entrustId": "E6581108027628212224", // Order id
// "price": "1450", // price
// "rangeType": 0, // Commission type 0: limit price commission 1: interval commission
// "amount": "14.05", // Order quantity
// "totalMoney": "20372.50", // Total order amount
// "completeAmount": "0", // Quantity sold
// "completeTotalMoney": "0", // Total dealt amount
// "type": 1, // 0 = sell, 1 = buy, -1 = cancel
// "entrustType": 0, // 0 = ordinary current price commission, 1 = lever commission
// "status": 0, //
// "marketId": "318", // The market id
// "createTime": 1569058424861, // Create time
// "availabelAmount": "14.05" // Outstanding quantity, typo in the docs or in the API, availabel vs available
// }
//
const marketId = this.safeString (order, 'marketId');
const symbol = this.safeSymbol (marketId, market);
const timestamp = this.safeInteger (order, 'createTime');
let side = this.safeString (order, 'type');
if (side === '0') {
side = 'sell';
} else if (side === '1') {
side = 'buy';
}
const amount = this.safeNumber (order, 'amount');
const price = this.safeNumber (order, 'price');
const filled = this.safeNumber (order, 'completeAmount');
const remaining = this.safeNumber2 (order, 'availabelAmount', 'availableAmount'); // typo in the docs or in the API, availabel vs available
const cost = this.safeNumber (order, 'totalMoney');
const status = this.parseOrderStatus (this.safeString (order, 'status'));
return this.safeOrder ({
'info': order,
'id': this.safeString (order, 'entrustId'),
'clientOrderId': undefined,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'lastTradeTimestamp': undefined,
'symbol': symbol,
'type': 'limit',
'timeInForce': undefined,
'postOnly': undefined,
'side': side,
'price': price,
'stopPrice': undefined,
'amount': amount,
'cost': cost,
'average': undefined,
'filled': filled,
'remaining': remaining,
'status': status,
'fee': undefined,
'trades': undefined,
});
}
async fetchOrder (id, symbol = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired (this.id + ' fetchOrder() requires a symbol argument');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
'entrustId': id,
};
const response = await this.privateGetExchangeEntrustControllerWebsiteEntrustControllerGetEntrustById (this.extend (request, params));
//
// {
// "datas": {
// "entrustId": "E6581108027628212224", // Order id
// "price": "1450", // price
// "rangeType": 0, // Commission type 0: limit price commission 1: interval commission
// "amount": "14.05", // Order quantity
// "totalMoney": "20372.50", // Total order amount
// "completeAmount": "0", // Quantity sold
// "completeTotalMoney": "0", // Total dealt amount
// "type": 1, // Trade direction, 0: sell, 1: buy, -1: cancel
// "entrustType": 0, // Commission type, 0: ordinary current price commission, 1: lever commission
// "status": 0, // Order status,-3:fund Freeze exception,Order status to be confirmed -2: fund freeze failure, order failure, -1: insufficient funds, order failure, 0: pending order, 1: cancelled, 2: dealt, 3: partially dealt
// "marketId": "318", // The market id
// "createTime": 1569058424861, // Create time
// "availabelAmount": "14.05" // Outstanding quantity
// },
// "resMsg": { "message": "success !", "method": null, "code": "1" }
// }
//
const order = this.safeValue (response, 'datas', {});
return this.parseOrder (order, market);
}
async cancelOrder (id, symbol = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired (this.id + ' cancelOrder() requires a symbol argument');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
'entrustId': id,
};
const response = await this.privatePostExchangeEntrustControllerWebsiteEntrustControllerCancelEntrust (this.extend (request, params));
//
// {
// "datas": null,
// "resMsg": { "message": "success !", "method": null, "code": "1" }
// }
//
return {
'info': response,
'id': id,
};
}
async fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired (this.id + ' fetchOpenOrders() requires a symbol argument');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
// 'pageSize': limit, // documented as required, but it works without it
// 'pageIndex': 0, // also works without it, most likely a typo in the docs
};
if (limit !== undefined) {
request['pageSize'] = limit; // default limit is 20
}
const response = await this.privateGetExchangeEntrustControllerWebsiteEntrustControllerGetUserEntrustRecordFromCacheWithPage (this.extend (request, params));
//
// {
// "datas": {
// "pageNum": 1,
// "pageSize": 2,
// "totalPage": 20,
// "totalRow": 40,
// "entrustList": [
// {
// "amount": "14.050000000000000000", // Order quantity
// "rangeType": 0, // Commission type 0: limit price commission 1: interval commission
// "totalMoney": "20372.500000000000000000", // Total order amount
// "entrustId": "E6581108027628212224", // Order id
// "type": 1, // Trade direction, 0: sell, 1: buy, -1: cancel
// "completeAmount": "0", // Quantity sold
// "marketId": "318", // The market id
// "createTime": 1569058424861, // Create time
// "price": "1450.000000000", // price
// "completeTotalMoney": "0", // Quantity sold
// "entrustType": 0, // Commission type, 0: ordinary current price commission, 1: lever commission
// "status": 0 // Order status,-3:fund Freeze exception,Order status to be confirmed -2: fund freeze failure, order failure, -1: insufficient funds, order failure, 0: pending order, 1: cancelled, 2: dealt, 3: partially dealt
// },
// ],
// },
// "resMsg": { "message": "success !", "method": null, "code": "1" },
// }
//
const data = this.safeValue (response, 'datas', {});
const orders = this.safeValue (data, 'entrustList', []);
return this.parseOrders (orders, market, since, limit);
}
async fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired (this.id + ' fetchClosedOrders() requires a symbol argument');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
};
if (limit !== undefined) {
request['pageSize'] = limit; // default limit is 20
}
if (since !== undefined) {
request['startDateTime'] = since;
}
const response = await this.privateGetExchangeEntrustControllerWebsiteEntrustControllerGetUserEntrustList (this.extend (request, params));
const data = this.safeValue (response, 'datas', {});
const orders = this.safeValue (data, 'entrustList', []);
return this.parseOrders (orders, market, since, limit);
}
async fetchOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired (this.id + ' fetchOpenOrders() requires a symbol argument');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'marketId': market['id'],
// 'pageSize': limit, // documented as required, but it works without it
// 'pageIndex': 0, // also works without it, most likely a typo in the docs
// 'type': 0, // 0 = sell, 1 = buy, -1 = cancel
// 'status': -1, // -1 = insufficient funds, failed orders, 0 = pending orders, 1 = canceled, 2 = closed, 3 = partial
// 'startDateTime': since,
// 'endDateTime': this.milliseconds (),
};
if (since !== undefined) {
request['startDateTime'] = since;
}
if (limit !== undefined) {
request['pageSize'] = limit; // default limit is 20
}
const response = await this.privateGetExchangeEntrustControllerWebsiteEntrustControllerGetUserEntrustList (this.extend (request, params));
//
// {
// "datas": {
// "pageNum": 1,
// "pageSize": 2,
// "totalPage": 20,
// "totalRow": 40,
// "entrustList": [
// {
// "amount": "14.050000000000000000", // Order quantity
// "rangeType": 0, // Commission type 0: limit price commission 1: interval commission
// "totalMoney": "20372.500000000000000000", // Total order amount
// "entrustId": "E6581108027628212224", // Order id
// "type": 1, // Trade direction, 0: sell, 1: buy, -1: cancel
// "completeAmount": "0", // Quantity sold
// "marketId": "318", // The market id
// "createTime": 1569058424861, // Create time
// "price": "1450.000000000", // price
// "completeTotalMoney": "0", // Quantity sold
// "entrustType": 0, // Commission type, 0: ordinary current price commission, 1: lever commission
// "status": 0 // Order status,-3:fund Freeze exception,Order status to be confirmed -2: fund freeze failure, order failure, -1: insufficient funds, order failure, 0: pending order, 1: cancelled, 2: dealt, 3: partially dealt
// },
// ],
// },
// "resMsg": { "message": "success !", "method": null, "code": "1" },
// }
//
const data = this.safeValue (response, 'datas', {});
const orders = this.safeValue (data, 'entrustList', []);
return this.parseOrders (orders, market, since, limit);
}
sign (path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
let url = this.implodeParams (this.urls['api'], { 'hostname': this.hostname }) + '/' + path;
if (method === 'GET') {
if (Object.keys (params).length) {
url += '?' + this.urlencode (params);
}
} else {
body = this.json (params);
}
if (api === 'private') {
const ms = this.milliseconds ().toString ();
let content = '';
if (method === 'GET') {
const sortedParams = this.keysort (params);
const keys = Object.keys (sortedParams);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
content += key + sortedParams[key].toString ();
}
} else {
content = body;
}
const signature = this.apiKey + ms + content + this.secret;
const hash = this.hash (this.encode (signature), 'md5');
if (!headers) {
headers = {};
}
headers['Apiid'] = this.apiKey;
headers['Timestamp'] = ms;
headers['Sign'] = hash;
}
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
}
async fetchDepositAddress (code, params = {}) {
await this.loadMarkets ();
const currency = this.currency (code);
const request = {
'currencyTypeName': currency['name'],
};
const response = await this.privatePostExchangeFundControllerWebsiteFundcontrollerGetPayinAddress (this.extend (request, params));
//
// {
// "datas": {
// "isMemo": true, // 是否为memo 格式,false:否,true :是
// "address": "bweosdeposit_787928102918558272", // 充币地址
// "memo": "787928102918558272", // 币种memo
// "account": "bweosdeposit" // 币种账户
// },
// "resMsg": { "message": "success !", "method": null, "code": "1" }
// }
//
const data = this.safeValue (response, 'datas', {});
const address = this.safeString (data, 'address');
const tag = this.safeString (data, 'memo');
this.checkAddress (address);
return {
'currency': code,
'address': this.checkAddress (address),
'tag': tag,
'info': response,
};
}
parseTransactionStatus (status) {
const statuses = {
'-1': 'canceled', // or auditing failed
'0': 'pending',
'1': 'ok',
};
return this.safeString (statuses, status, status);
}
parseTransaction (transaction, currency = undefined) {
//
// fetchDeposits
//
// {
// "depositId": "D6574268549744189441", // Deposit ID
// "amount": "54.753589700000000000", // Deposit amount
// "txId": "INNER_SYSTEM_TRANSFER_1198941", // Trading ID
// "confirmTimes": 0, // Confirmation number
// "depositAddress": "bweosdeposit_787928102918558272", // Deposit address
// "createTime": "2019-09-02 20:36:08.0", // Deposit time
// "status": 1, // Deposit status, 0: not received, 1: received
// "currencyTypeId": 7, // Token ID
// }
//
// fetchWithdrawals
//
// {
// "withdrawalId": "W6527498439872634880", // Withdrawal ID
// "fees": "0.500000000000000000", // Withdrawal fee
// "withdrawalAddress": "okbtothemoon_941657", // Withdrawal address
// "currencyId": "7", // Token ID
// "amount": "10.000000000000000000", // Withdrawal amount
// "state": 1, // Status, 1: normal, -1: delete
// "verifyStatus": 1, // Audit status, 0: to be audited, 1: auditing passed, -1: auditing failed
// "createTime": 1556276903656, // WIthdrawal time
// "actuallyAmount": "9.500000000000000000", // Actual amount received
// }
//
const id = this.safeString (transaction, 'depositId', 'withdrawalId');
const address = this.safeString2 (transaction, 'depositAddress', 'withdrawalAddress');
const currencyId = this.safeString2 (transaction, 'currencyId', 'currencyTypeId');
let code = undefined;
if (currencyId in this.currencies_by_id) {
currency = this.currencies_by_id[currencyId];
}
if ((code === undefined) && (currency !== undefined)) {
code = currency['code'];
}
const type = ('depositId' in transaction) ? 'deposit' : 'withdrawal';
const amount = this.safeNumber2 (transaction, 'actuallyAmount', 'amount');
const status = this.parseTransactionStatus (this.safeString2 (transaction, 'verifyStatus', 'state'));
const timestamp = this.safeInteger (transaction, 'createTime');
const txid = this.safeString (transaction, 'txId');
let fee = undefined;
const feeCost = this.safeNumber (transaction, 'fees');
if (feeCost !== undefined) {
fee = {
'cost': feeCost,
'currency': code,
};
}
return {
'info': transaction,
'id': id,
'txid': txid,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'addressFrom': undefined,
'address': address,
'addressTo': undefined,
'tagFrom': undefined,
'tag': undefined,
'tagTo': undefined,
'type': type,
'amount': amount,
'currency': code,
'status': status,
'updated': undefined,
'fee': fee,
};
}
async fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {}) {
if (code === undefined) {
throw new ArgumentsRequired (this.id + ' fetchDeposits() requires a currency code argument');
}
await this.loadMarkets ();
const currency = this.currency (code);
const request = {
'currencyTypeName': currency['name'],
// 'pageSize': limit, // documented as required, but it works without it
// 'pageNum': 0, // also works without it, most likely a typo in the docs
// 'sort': 1, // 1 = asc, 0 = desc
};
if (limit !== undefined) {
request['pageSize'] = limit; // default 50
}
const response = await this.privatePostExchangeFundControllerWebsiteFundcontrollerGetPayinCoinRecord (this.extend (request, params));
//
// {
// "datas": {
// "totalRow":2,
// "totalPage": 1,
// "pageSize": 2,
// "pageNum": 1,
// "list": [
// {
// "depositId": "D6574268549744189441", // Deposit ID
// "amount": "54.753589700000000000", // Deposit amount
// "txId": "INNER_SYSTEM_TRANSFER_1198941", // Trading ID
// "confirmTimes": 0, // Confirmation number
// "depositAddress": "bweosdeposit_787928102918558272", // Deposit address
// "createTime": "2019-09-02 20:36:08.0", // Deposit time
// "status": 1, // Deposit status, 0: not received, 1: received
// "currencyTypeId": 7, // Token ID
// },
// ]
// },
// "resMsg": { "message": "success !", "method": null, "code": "1" },
// }
//
const data =