ccxt
Version:
1,133 lines (1,131 loc) • 271 kB
JavaScript
'use strict';
var mexc$1 = require('./abstract/mexc.js');
var errors = require('./base/errors.js');
var number = require('./base/functions/number.js');
var Precise = require('./base/Precise.js');
var sha256 = require('./static_dependencies/noble-hashes/sha256.js');
// ----------------------------------------------------------------------------
// ---------------------------------------------------------------------------
/**
* @class mexc
* @augments Exchange
*/
class mexc extends mexc$1 {
describe() {
return this.deepExtend(super.describe(), {
'id': 'mexc',
'name': 'MEXC Global',
'countries': ['SC'],
'rateLimit': 50,
'version': 'v3',
'certified': true,
'pro': true,
'has': {
'CORS': undefined,
'spot': true,
'margin': true,
'swap': true,
'future': false,
'option': false,
'addMargin': true,
'borrowCrossMargin': false,
'borrowIsolatedMargin': false,
'borrowMargin': false,
'cancelAllOrders': true,
'cancelOrder': true,
'cancelOrders': undefined,
'closeAllPositions': false,
'closePosition': false,
'createDepositAddress': true,
'createMarketBuyOrderWithCost': true,
'createMarketOrderWithCost': true,
'createMarketSellOrderWithCost': true,
'createOrder': true,
'createOrders': true,
'createPostOnlyOrder': true,
'createReduceOnlyOrder': true,
'createStopLimitOrder': true,
'createStopMarketOrder': true,
'createStopOrder': true,
'createTriggerOrder': true,
'deposit': undefined,
'editOrder': undefined,
'fetchAccounts': true,
'fetchBalance': true,
'fetchBidsAsks': true,
'fetchBorrowInterest': false,
'fetchBorrowRate': false,
'fetchBorrowRateHistories': false,
'fetchBorrowRateHistory': false,
'fetchBorrowRates': false,
'fetchBorrowRatesPerSymbol': false,
'fetchCanceledOrders': true,
'fetchClosedOrder': undefined,
'fetchClosedOrders': true,
'fetchCrossBorrowRate': false,
'fetchCrossBorrowRates': false,
'fetchCurrencies': true,
'fetchDeposit': undefined,
'fetchDepositAddress': true,
'fetchDepositAddresses': undefined,
'fetchDepositAddressesByNetwork': true,
'fetchDeposits': true,
'fetchDepositWithdrawFee': 'emulated',
'fetchDepositWithdrawFees': true,
'fetchFundingHistory': true,
'fetchFundingInterval': true,
'fetchFundingIntervals': false,
'fetchFundingRate': true,
'fetchFundingRateHistory': true,
'fetchFundingRates': false,
'fetchIndexOHLCV': true,
'fetchIsolatedBorrowRate': false,
'fetchIsolatedBorrowRates': false,
'fetchIsolatedPositions': false,
'fetchL2OrderBook': true,
'fetchLedger': undefined,
'fetchLedgerEntry': undefined,
'fetchLeverage': true,
'fetchLeverages': false,
'fetchLeverageTiers': true,
'fetchMarginAdjustmentHistory': false,
'fetchMarginMode': false,
'fetchMarketLeverageTiers': 'emulated',
'fetchMarkets': true,
'fetchMarkOHLCV': true,
'fetchMyTrades': true,
'fetchOHLCV': true,
'fetchOpenInterest': false,
'fetchOpenInterestHistory': false,
'fetchOpenOrder': undefined,
'fetchOpenOrders': true,
'fetchOrder': true,
'fetchOrderBook': true,
'fetchOrderBooks': undefined,
'fetchOrders': true,
'fetchOrderTrades': true,
'fetchPosition': 'emulated',
'fetchPositionHistory': 'emulated',
'fetchPositionMode': true,
'fetchPositions': true,
'fetchPositionsHistory': true,
'fetchPositionsRisk': undefined,
'fetchPremiumIndexOHLCV': false,
'fetchStatus': true,
'fetchTicker': true,
'fetchTickers': true,
'fetchTime': true,
'fetchTrades': true,
'fetchTradingFee': true,
'fetchTradingFees': false,
'fetchTradingLimits': undefined,
'fetchTransactionFee': 'emulated',
'fetchTransactionFees': true,
'fetchTransactions': undefined,
'fetchTransfer': true,
'fetchTransfers': true,
'fetchWithdrawal': undefined,
'fetchWithdrawals': true,
'reduceMargin': true,
'repayCrossMargin': false,
'repayIsolatedMargin': false,
'setLeverage': true,
'setMarginMode': true,
'setPositionMode': true,
'signIn': undefined,
'transfer': undefined,
'withdraw': true,
},
'urls': {
'logo': 'https://user-images.githubusercontent.com/1294454/137283979-8b2a818d-8633-461b-bfca-de89e8c446b2.jpg',
'api': {
'spot': {
'public': 'https://api.mexc.com',
'private': 'https://api.mexc.com',
},
'spot2': {
'public': 'https://www.mexc.com/open/api/v2',
'private': 'https://www.mexc.com/open/api/v2',
},
'contract': {
'public': 'https://contract.mexc.com/api/v1/contract',
'private': 'https://contract.mexc.com/api/v1/private',
},
'broker': {
'private': 'https://api.mexc.com/api/v3/broker',
},
},
'www': 'https://www.mexc.com/',
'doc': [
'https://mexcdevelop.github.io/apidocs/',
],
'fees': [
'https://www.mexc.com/fee',
],
'referral': 'https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1',
},
'api': {
'spot': {
'public': {
'get': {
'ping': 1,
'time': 1,
'exchangeInfo': 10,
'depth': 1,
'trades': 5,
'historicalTrades': 1,
'aggTrades': 1,
'klines': 1,
'avgPrice': 1,
'ticker/24hr': 1,
'ticker/price': 1,
'ticker/bookTicker': 1,
'etf/info': 1,
},
},
'private': {
'get': {
'order': 2,
'openOrders': 3,
'allOrders': 10,
'account': 10,
'myTrades': 10,
'tradeFee': 10,
'sub-account/list': 1,
'sub-account/apiKey': 1,
'capital/config/getall': 10,
'capital/deposit/hisrec': 1,
'capital/withdraw/history': 1,
'capital/withdraw/address': 10,
'capital/deposit/address': 10,
'capital/transfer': 1,
'capital/transfer/tranId': 1,
'capital/transfer/internal': 1,
'capital/sub-account/universalTransfer': 1,
'capital/convert': 1,
'capital/convert/list': 1,
'margin/loan': 1,
'margin/allOrders': 1,
'margin/myTrades': 1,
'margin/openOrders': 1,
'margin/maxTransferable': 1,
'margin/priceIndex': 1,
'margin/order': 1,
'margin/isolated/account': 1,
'margin/maxBorrowable': 1,
'margin/repay': 1,
'margin/isolated/pair': 1,
'margin/forceLiquidationRec': 1,
'margin/isolatedMarginData': 1,
'margin/isolatedMarginTier': 1,
'rebate/taxQuery': 1,
'rebate/detail': 1,
'rebate/detail/kickback': 1,
'rebate/referCode': 1,
'rebate/affiliate/commission': 1,
'rebate/affiliate/withdraw': 1,
'rebate/affiliate/commission/detail': 1,
'mxDeduct/enable': 1,
'userDataStream': 1,
'selfSymbols': 1,
},
'post': {
'order': 1,
'order/test': 1,
'sub-account/virtualSubAccount': 1,
'sub-account/apiKey': 1,
'sub-account/futures': 1,
'sub-account/margin': 1,
'batchOrders': 10,
'capital/withdraw/apply': 1,
'capital/withdraw': 1,
'capital/transfer': 1,
'capital/transfer/internal': 1,
'capital/deposit/address': 1,
'capital/sub-account/universalTransfer': 1,
'capital/convert': 10,
'mxDeduct/enable': 1,
'userDataStream': 1,
},
'put': {
'userDataStream': 1,
},
'delete': {
'order': 1,
'openOrders': 1,
'sub-account/apiKey': 1,
'margin/order': 1,
'margin/openOrders': 1,
'userDataStream': 1,
'capital/withdraw': 1,
},
},
},
'contract': {
'public': {
'get': {
'ping': 2,
'detail': 100,
'support_currencies': 2,
'depth/{symbol}': 2,
'depth_commits/{symbol}/{limit}': 2,
'index_price/{symbol}': 2,
'fair_price/{symbol}': 2,
'funding_rate/{symbol}': 2,
'kline/{symbol}': 2,
'kline/index_price/{symbol}': 2,
'kline/fair_price/{symbol}': 2,
'deals/{symbol}': 2,
'ticker': 2,
'risk_reverse': 2,
'risk_reverse/history': 2,
'funding_rate/history': 2,
},
},
'private': {
'get': {
'account/assets': 2,
'account/asset/{currency}': 2,
'account/transfer_record': 2,
'position/list/history_positions': 2,
'position/open_positions': 2,
'position/funding_records': 2,
'position/position_mode': 2,
'order/list/open_orders/{symbol}': 2,
'order/list/history_orders': 2,
'order/external/{symbol}/{external_oid}': 2,
'order/get/{order_id}': 2,
'order/batch_query': 8,
'order/deal_details/{order_id}': 2,
'order/list/order_deals': 2,
'planorder/list/orders': 2,
'stoporder/list/orders': 2,
'stoporder/order_details/{stop_order_id}': 2,
'account/risk_limit': 2,
'account/tiered_fee_rate': 2,
'position/leverage': 2,
},
'post': {
'position/change_margin': 2,
'position/change_leverage': 2,
'position/change_position_mode': 2,
'order/submit': 2,
'order/submit_batch': 40,
'order/cancel': 2,
'order/cancel_with_external': 2,
'order/cancel_all': 2,
'account/change_risk_level': 2,
'planorder/place': 2,
'planorder/cancel': 2,
'planorder/cancel_all': 2,
'stoporder/cancel': 2,
'stoporder/cancel_all': 2,
'stoporder/change_price': 2,
'stoporder/change_plan_price': 2,
},
},
},
'spot2': {
'public': {
'get': {
'market/symbols': 1,
'market/coin/list': 2,
'common/timestamp': 1,
'common/ping': 2,
'market/ticker': 1,
'market/depth': 1,
'market/deals': 1,
'market/kline': 1,
'market/api_default_symbols': 2,
},
},
'private': {
'get': {
'account/info': 1,
'order/open_orders': 1,
'order/list': 1,
'order/query': 1,
'order/deals': 1,
'order/deal_detail': 1,
'asset/deposit/address/list': 2,
'asset/deposit/list': 2,
'asset/address/list': 2,
'asset/withdraw/list': 2,
'asset/internal/transfer/record': 10,
'account/balance': 10,
'asset/internal/transfer/info': 10,
'market/api_symbols': 2,
},
'post': {
'order/place': 1,
'order/place_batch': 1,
'order/advanced/place_batch': 1,
'asset/withdraw': 2,
'asset/internal/transfer': 10,
},
'delete': {
'order/cancel': 1,
'order/cancel_by_symbol': 1,
'asset/withdraw': 2,
},
},
},
'broker': {
'private': {
'get': {
'sub-account/universalTransfer': 1,
'sub-account/list': 1,
'sub-account/apiKey': 1,
'capital/deposit/subAddress': 1,
'capital/deposit/subHisrec': 1,
'capital/deposit/subHisrec/getall': 1,
},
'post': {
'sub-account/virtualSubAccount': 1,
'sub-account/apiKey': 1,
'capital/deposit/subAddress': 1,
'capital/withdraw/apply': 1,
'sub-account/universalTransfer': 1,
'sub-account/futures': 1,
},
'delete': {
'sub-account/apiKey': 1,
},
},
},
},
'precisionMode': number.TICK_SIZE,
'timeframes': {
'1m': '1m',
'5m': '5m',
'15m': '15m',
'30m': '30m',
'1h': '1h',
'4h': '4h',
'8h': '8h',
'1d': '1d',
'1w': '1w',
'1M': '1M', // spot, swap
},
'fees': {
'trading': {
'tierBased': false,
'percentage': true,
'maker': this.parseNumber('0.002'),
'taker': this.parseNumber('0.002'),
},
},
'options': {
'adjustForTimeDifference': false,
'timeDifference': 0,
'unavailableContracts': {
'BTC/USDT:USDT': true,
'LTC/USDT:USDT': true,
'ETH/USDT:USDT': true,
},
'fetchMarkets': {
'types': {
'spot': true,
'swap': {
'linear': true,
'inverse': false,
},
},
},
'timeframes': {
'spot': {
'1m': '1m',
'5m': '5m',
'15m': '15m',
'30m': '30m',
'1h': '60m',
'4h': '4h',
'1d': '1d',
'1w': '1W',
'1M': '1M',
},
'swap': {
'1m': 'Min1',
'5m': 'Min5',
'15m': 'Min15',
'30m': 'Min30',
'1h': 'Min60',
'4h': 'Hour4',
'8h': 'Hour8',
'1d': 'Day1',
'1w': 'Week1',
'1M': 'Month1',
},
},
'defaultType': 'spot',
'defaultNetwork': 'ETH',
'defaultNetworks': {
'ETH': 'ETH',
'USDT': 'ERC20',
'USDC': 'ERC20',
'BTC': 'BTC',
'LTC': 'LTC',
},
'networks': {
'ZKSYNC': 'ZKSYNCERA',
'TRC20': 'TRX',
'TON': 'TONCOIN',
'AVAXC': 'AVAX_CCHAIN',
'ERC20': 'ETH',
'ACA': 'ACALA',
'BEP20': 'BSC',
'OPTIMISM': 'OP',
// 'ADA': 'Cardano(ADA)',
// 'AE': 'AE',
// 'ALGO': 'Algorand(ALGO)',
// 'ALPH': 'Alephium(ALPH)',
// 'ARB': 'Arbitrum One(ARB)',
// 'ARBONE': 'ArbitrumOne(ARB)',
'ASTR': 'ASTAR',
// 'ATOM': 'Cosmos(ATOM)',
// 'AVAXC': 'Avalanche C Chain(AVAX CCHAIN)',
// 'AVAXX': 'Avalanche X Chain(AVAX XCHAIN)',
// 'AZERO': 'Aleph Zero(AZERO)',
// 'BCH': 'Bitcoin Cash(BCH)',
// 'BNCDOT': 'BNCPOLKA',
// 'BSV': 'Bitcoin SV(BSV)',
// 'BTC': 'Bitcoin(BTC)',
'BTM': 'BTM2',
// 'CHZ': 'Chiliz Legacy Chain(CHZ)',
// 'CHZ2': 'Chiliz Chain(CHZ2)',
// 'CLORE': 'Clore.ai(CLORE)',
'CRC20': 'CRONOS',
// 'DC': 'Dogechain(DC)',
// 'DNX': 'Dynex(DNX)',
// 'DOGE': 'Dogecoin(DOGE)',
// 'DOT': 'Polkadot(DOT)',
// 'DYM': 'Dymension(DYM)',
'ETHF': 'ETF',
'HRC20': 'HECO',
// 'KLAY': 'Klaytn(KLAY)',
'OASIS': 'ROSE',
'OKC': 'OKT',
'RSK': 'RBTC',
// 'RVN': 'Ravencoin(RVN)',
// 'SATOX': 'Satoxcoin(SATOX)',
// 'SC': 'SC',
// 'SCRT': 'SCRT',
// 'SDN': 'SDN',
// 'SGB': 'SGB',
// 'SOL': 'Solana(SOL)',
// 'STAR': 'STAR',
// 'STARK': 'Starknet(STARK)',
// 'STEEM': 'STEEM',
// 'SYS': 'SYS',
// 'TAO': 'Bittensor(TAO)',
// 'TIA': 'Celestia(TIA)',
// 'TOMO': 'TOMO',
// 'TON': 'Toncoin(TON)',
// 'TRC10': 'TRC10',
// 'TRC20': 'Tron(TRC20)',
// 'UGAS': 'UGAS(Ultrain)',
// 'VET': 'VeChain(VET)',
// 'VEX': 'Vexanium(VEX)',
// 'VSYS': 'VSYS',
// 'WAVES': 'WAVES',
// 'WAX': 'WAX',
// 'WEMIX': 'WEMIX',
// 'XCH': 'Chia(XCH)',
// 'XDC': 'XDC',
// 'XEC': 'XEC',
// 'XLM': 'Stellar(XLM)',
// 'XMR': 'Monero(XMR)',
// 'XNA': 'Neurai(XNA)',
// 'XPR': 'XPR Network',
// 'XRD': 'XRD',
// 'XRP': 'Ripple(XRP)',
// 'XTZ': 'XTZ',
// 'XVG': 'XVG',
// 'XYM': 'XYM',
// 'ZEC': 'ZEC',
// 'ZEN': 'ZEN',
// 'ZIL': 'Zilliqa(ZIL)',
// 'ZTG': 'ZTG',
// todo: uncomment below after concensus
// 'ALAYA': 'ATP',
// 'ANDUSCHAIN': 'DEB',
// 'ASSETMANTLE': 'MNTL',
// 'AXE': 'AXE',
// 'BITCOINHD': 'BHD',
// 'BITCOINVAULT': 'BTCV',
// 'BITKUB': 'KUB',
// 'BITSHARES_OLD': 'BTS',
// 'BITSHARES': 'NBS',
// 'BYTZ': 'BYTZ',
// 'CANTO': 'CANTO', // CANTOEVM
// 'CENNZ': 'CENNZ',
// 'CHAINX': 'PCX',
// 'CONCODRIUM': 'CCD',
// 'CONTENTVALUENETWORK': 'CVNT',
// 'CORTEX': 'CTXC',
// 'CYPHERIUM': 'CPH',
// 'DANGNN': 'DGC',
// 'DARWINIASMARTCHAIN': 'Darwinia Smart Chain',
// 'DHEALTH': 'DHP',
// 'DOGECOIN': [ 'DOGE', 'DOGECHAIN' ], // todo after unification
// 'DRAC': 'DRAC',
// 'DRAKEN': 'DRK',
// 'ECOCHAIN': 'ECOC',
// 'ELECTRAPROTOCOL': 'XEP',
// 'EMERALD': 'EMERALD', // sits on top of OASIS
// 'EVMOS': 'EVMOS', // EVMOSETH is different
// 'EXOSAMA': 'SAMA',
// 'FIBOS': 'FO',
// 'FILECASH': 'FIC',
// 'FIRMACHAIN': 'FCT',
// 'FIRO': 'XZC',
// 'FNCY': 'FNCY',
// 'FRUITS': 'FRTS',
// 'GLEEC': 'GLEEC',
// 'GXCHAIN': 'GXC',
// 'HANDSHAKE': 'HNS',
// 'HPB': 'HPB',
// 'HSHARE': 'HC',
// 'HUAHUA': 'HUAHUA',
// 'HUPAYX': 'HPX',
// 'INDEXCHAIN': 'IDX',
// 'INTCHAIN': 'INT',
// 'INTEGRITEE': 'TEER',
// 'INTERLAY': 'INTR',
// 'IOEX': 'IOEX',
// 'JUNO': 'JUNO',
// 'KASPA': 'KASPA',
// 'KEKCHAIN': 'KEKCHAIN',
// 'KINTSUGI': 'KINT',
// 'KOINOS': 'KOINOS',
// 'KONSTELLATION': 'DARC',
// 'KUJIRA': 'KUJI',
// 'KULUPU': 'KLP',
// 'LBRY': 'LBC',
// 'LEDGIS': 'LED',
// 'LIGHTNINGBITCOIN': 'LBTC',
// 'LINE': 'LINE',
// 'MDNA': 'DNA',
// 'MDUKEY': 'MDU',
// 'METAMUI': 'MMUI',
// 'METAVERSE_ETP': 'ETP',
// 'METER': 'MTRG',
// 'MEVERSE': 'MEVerse',
// 'NEWTON': 'NEW',
// 'NODLE': 'NODLE',
// 'ORIGYN': 'OGY',
// 'PAC': 'PAC',
// 'PASTEL': 'PSL',
// 'PHALA': 'Khala',
// 'PLEX': 'PLEX',
// 'PMG': 'PMG',
// 'POINT': 'POINT', // POINTEVM is different
// 'PROOFOFMEMES': 'POM',
// 'PROXIMAX': 'XPX',
// 'RCHAIN': 'REV',
// 'REBUS': 'REBUS', // REBUSEVM is different
// 'RIZON': 'ATOLO',
// 'SENTINEL': 'DVPN',
// 'SERO': 'SERO',
// 'TECHPAY': 'TPC',
// 'TELOSCOIN': 'TLOS', // todo
// 'TERRA': 'LUNA2',
// 'TERRACLASSIC': 'LUNC',
// 'TLOS': 'TELOS', // todo
// 'TOMAINFO': 'TON',
// 'TONGTONG': 'TTC',
// 'TURTLECOIN': 'TRTL',
// 'ULORD': 'UT',
// 'ULTRAIN': 'UGAS',
// 'UMEE': 'UMEE',
// 'VDIMENSION': 'VOLLAR',
// 'VEXANIUM': 'VEX',
// 'VNT': 'VNT',
// 'WAYKICHAIN': 'WICC',
// 'WHITECOIN': 'XWC',
// 'WITNET': 'WIT',
// 'XDAI': 'XDAI',
// 'XX': 'XX',
// 'YAS': 'YAS',
// 'ZENITH': 'ZENITH',
// 'ZKSYNC': 'ZKSYNC',
// // 'BAJUN': '',
// OKB <> OKT (for usdt it's exception) for OKC, PMEER, FLARE, STRD, ZEL, FUND, "NONE", CRING, FREETON, QTZ (probably unique network is meant), HT, BSC(RACAV1), BSC(RACAV2), AMBROSUS, BAJUN, NOM. their individual info is at https://www.mexc.com/api/platform/asset/spot/{COINNAME}
},
'networksById': {
'BNB Smart Chain(BEP20-RACAV1)': 'BSC',
'BNB Smart Chain(BEP20-RACAV2)': 'BSC',
'BNB Smart Chain(BEP20)': 'BSC',
// TODO: uncomment below after deciding unified name
// 'PEPE COIN BSC':
// 'SMART BLOCKCHAIN':
// 'f(x)Core':
// 'Syscoin Rollux':
// 'Syscoin UTXO':
// 'zkSync Era':
// 'zkSync Lite':
// 'Darwinia Smart Chain':
// 'Arbitrum One(ARB-Bridged)':
// 'Optimism(OP-Bridged)':
// 'Polygon(MATIC-Bridged)':
},
'recvWindow': 5 * 1000,
'maxTimeTillEnd': 90 * 86400 * 1000 - 1,
'broker': 'CCXT',
},
'features': {
'default': {
'sandbox': false,
'createOrder': {
'marginMode': true,
'triggerPrice': false,
'triggerDirection': false,
'triggerPriceType': {
'last': false,
'mark': false,
'index': false,
},
'stopLossPrice': false,
'takeProfitPrice': false,
'attachedStopLossTakeProfit': undefined,
'timeInForce': {
'IOC': true,
'FOK': true,
'PO': true,
'GTD': false,
},
'hedged': true,
'trailing': false,
'leverage': true,
'marketBuyByCost': true,
'marketBuyRequiresPrice': false,
'selfTradePrevention': false,
'iceberg': false,
},
'createOrders': {
'max': 20,
},
'fetchMyTrades': {
'marginMode': false,
'limit': 100,
'daysBack': 30,
'untilDays': undefined,
'symbolRequired': true,
},
'fetchOrder': {
'marginMode': false,
'trigger': false,
'trailing': false,
'symbolRequired': true,
},
'fetchOpenOrders': {
'marginMode': true,
'limit': undefined,
'trigger': false,
'trailing': false,
'symbolRequired': true,
},
'fetchOrders': {
'marginMode': true,
'limit': 1000,
'daysBack': 7,
'untilDays': 7,
'trigger': false,
'trailing': false,
'symbolRequired': true,
},
'fetchClosedOrders': {
'marginMode': true,
'limit': 1000,
'daysBack': 7,
'daysBackCanceled': 7,
'untilDays': 7,
'trigger': false,
'trailing': false,
'symbolRequired': true,
},
'fetchOHLCV': {
'limit': 1000,
},
},
'spot': {
'extends': 'default',
},
'forDerivs': {
'extends': 'default',
'createOrder': {
'triggerPrice': true,
'triggerPriceType': {
'last': true,
'mark': true,
'index': true,
},
'triggerDirection': true,
'stopLossPrice': false,
'takeProfitPrice': false,
'hedged': true,
'leverage': true,
'marketBuyByCost': false,
},
'createOrders': undefined,
'fetchMyTrades': {
'marginMode': false,
'limit': 100,
'daysBack': 90,
'untilDays': 90,
},
'fetchOrder': {
'marginMode': false,
},
'fetchOpenOrders': {
'marginMode': false,
'limit': 100,
'trigger': true,
'trailing': false,
},
'fetchOrders': {
'marginMode': false,
'limit': 100,
'daysBack': 90,
'untilDays': 90,
'trigger': true,
'trailing': false,
},
'fetchClosedOrders': {
'marginMode': false,
'limit': 100,
'daysBack': 90,
'daysBackCanceled': undefined,
'untilDays': 90,
'trigger': true,
'trailing': false,
},
'fetchOHLCV': {
'limit': 2000,
},
},
'swap': {
'linear': {
'extends': 'forDerivs',
},
'inverse': {
'extends': 'forDerivs',
},
},
'future': {
'linear': undefined,
'inverse': undefined,
},
},
'commonCurrencies': {
'BEYONDPROTOCOL': 'BEYOND',
'BIFI': 'BIFIF',
'BYN': 'BEYONDFI',
'COFI': 'COFIX',
'DFI': 'DFISTARTER',
'DFT': 'DFUTURE',
'DRK': 'DRK',
'EGC': 'EGORASCREDIT',
'FLUX1': 'FLUX',
'FLUX': 'FLUX1',
'FREE': 'FREEROSSDAO',
'GAS': 'GASDAO',
'GASNEO': 'GAS',
'GMT': 'GMTTOKEN',
'STEPN': 'GMT',
'HERO': 'STEPHERO',
'MIMO': 'MIMOSA',
'PROS': 'PROSFINANCE',
'SIN': 'SINCITYTOKEN',
'SOUL': 'SOULSWAP',
},
'exceptions': {
'exact': {
// until mexc migrates fully to v3, it might be worth to note the version & market aside errors, not easily remove obsolete version's exceptions in future
'-1128': errors.BadRequest,
'-2011': errors.BadRequest,
'-1121': errors.BadSymbol,
'10101': errors.InsufficientFunds,
'2009': errors.InvalidOrder,
'2011': errors.BadRequest,
'30004': errors.InsufficientFunds,
'33333': errors.BadRequest,
'44444': errors.BadRequest,
'1002': errors.InvalidOrder,
'30019': errors.BadRequest,
'30005': errors.InvalidOrder,
'2003': errors.InvalidOrder,
'2005': errors.InsufficientFunds,
'400': errors.BadRequest,
// '500': OnMaintenance, // {"code": 500,"message": "Under maintenance, please try again later","announcement": "https://www.mexc.com/support/articles/17827791510263"}
'600': errors.BadRequest,
'70011': errors.PermissionDenied,
'88004': errors.InsufficientFunds,
'88009': errors.ExchangeError,
'88013': errors.InvalidOrder,
'88015': errors.InsufficientFunds,
'700003': errors.InvalidNonce,
'26': errors.ExchangeError,
'602': errors.AuthenticationError,
'10001': errors.AuthenticationError,
'10007': errors.BadSymbol,
'10015': errors.BadRequest,
'10072': errors.BadRequest,
'10073': errors.BadRequest,
'10095': errors.InvalidOrder,
'10096': errors.InvalidOrder,
'10097': errors.InvalidOrder,
'10098': errors.InvalidOrder,
'10099': errors.BadRequest,
'10100': errors.BadRequest,
'10102': errors.InvalidOrder,
'10103': errors.ExchangeError,
'10200': errors.BadRequest,
'10201': errors.BadRequest,
'10202': errors.BadRequest,
'10206': errors.BadRequest,
'10211': errors.BadRequest,
'10212': errors.BadRequest,
'10216': errors.ExchangeError,
'10219': errors.ExchangeError,
'10222': errors.BadRequest,
'10232': errors.BadRequest,
'10259': errors.ExchangeError,
'10265': errors.ExchangeError,
'10268': errors.BadRequest,
'20001': errors.ExchangeError,
'20002': errors.ExchangeError,
'22222': errors.BadRequest,
'30000': errors.ExchangeError,
'30001': errors.InvalidOrder,
'30002': errors.InvalidOrder,
'30003': errors.InvalidOrder,
'30010': errors.InvalidOrder,
'30014': errors.InvalidOrder,
'30016': errors.InvalidOrder,
'30018': errors.AccountSuspended,
'30020': errors.AuthenticationError,
'30021': errors.BadRequest,
'30025': errors.InvalidOrder,
'30026': errors.BadRequest,
'30027': errors.InvalidOrder,
'30028': errors.InvalidOrder,
'30029': errors.InvalidOrder,
'30032': errors.InvalidOrder,
'30041': errors.InvalidOrder,
'60005': errors.ExchangeError,
'700001': errors.AuthenticationError,
'700002': errors.AuthenticationError,
'700004': errors.BadRequest,
'700005': errors.InvalidNonce,
'700006': errors.BadRequest,
'700007': errors.AuthenticationError,
'700008': errors.BadRequest,
'700013': errors.AuthenticationError,
'730001': errors.BadRequest,
'730002': errors.BadRequest,
'730000': errors.ExchangeError,
'730003': errors.ExchangeError,
'730100': errors.ExchangeError,
'730600': errors.BadRequest,
'730601': errors.BadRequest,
'730602': errors.BadRequest,
'730700': errors.BadRequest,
'730701': errors.BadRequest,
'730702': errors.BadRequest,
'730703': errors.BadRequest,
'730704': errors.BadRequest,
'730705': errors.BadRequest,
'730706': errors.BadRequest,
'730707': errors.BadRequest,
'730101': errors.BadRequest,
'140001': errors.BadRequest,
'140002': errors.AuthenticationError, // sub account is forbidden
},
'broad': {
'Order quantity error, please try to modify.': errors.BadRequest,
'Combination of optional parameters invalid': errors.BadRequest,
'api market order is disabled': errors.BadRequest,
'Contract not allow place order!': errors.InvalidOrder,
'Oversold': errors.InsufficientFunds,
'Insufficient position': errors.InsufficientFunds,
'Insufficient balance!': errors.InsufficientFunds,
'Bid price is great than max allow price': errors.InvalidOrder,
'Invalid symbol.': errors.BadSymbol,
'Param error!': errors.BadRequest,
'maintenance': errors.OnMaintenance, // {"code": 500,"message": "Under maintenance, please try again later","announcement": "https://www.mexc.com/support/articles/17827791510263"}
},
},
});
}
/**
* @method
* @name mexc#fetchStatus
* @description the latest known information on the availability of the exchange API
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#test-connectivity
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-server-time
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
*/
async fetchStatus(params = {}) {
const [marketType, query] = this.handleMarketTypeAndParams('fetchStatus', undefined, params);
let response = undefined;
let status = undefined;
let updated = undefined;
if (marketType === 'spot') {
response = await this.spotPublicGetPing(query);
//
// {}
//
const keys = Object.keys(response);
const length = keys.length;
status = length ? this.json(response) : 'ok';
}
else if (marketType === 'swap') {
response = await this.contractPublicGetPing(query);
//
// {"success":true,"code":"0","data":"1648124374985"}
//
status = this.safeValue(response, 'success') ? 'ok' : this.json(response);
updated = this.safeInteger(response, 'data');
}
return {
'status': status,
'updated': updated,
'url': undefined,
'eta': undefined,
'info': response,
};
}
/**
* @method
* @name mexc#fetchTime
* @description fetches the current integer timestamp in milliseconds from the exchange server
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#check-server-time
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-server-time
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {int} the current integer timestamp in milliseconds from the exchange server
*/
async fetchTime(params = {}) {
const [marketType, query] = this.handleMarketTypeAndParams('fetchTime', undefined, params);
let response = undefined;
if (marketType === 'spot') {
response = await this.spotPublicGetTime(query);
//
// {"serverTime": "1647519277579"}
//
return this.safeInteger(response, 'serverTime');
}
else if (marketType === 'swap') {
response = await this.contractPublicGetPing(query);
//
// {"success":true,"code":"0","data":"1648124374985"}
//
return this.safeInteger(response, 'data');
}
return undefined;
}
/**
* @method
* @name mexc#fetchCurrencies
* @description fetches all available currencies on an exchange
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-the-currency-information
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an associative dictionary of currencies
*/
async fetchCurrencies(params = {}) {
// this endpoint requires authentication
// while fetchCurrencies is a public API method by design
// therefore we check the keys here
// and fallback to generating the currencies from the markets
if (!this.checkRequiredCredentials(false)) {
return undefined;
}
const response = await this.spotPrivateGetCapitalConfigGetall(params);
//
// {
// "coin": "QANX",
// "name": "QANplatform",
// "networkList": [
// {
// "coin": "QANX",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "QANplatform",
// "network": "BEP20(BSC)",
// "withdrawEnable": false,
// "withdrawFee": "42.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "24000000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0xAAA7A10a8ee237ea61E8AC46C50A8Db8bCC1baaa"
// },
// {
// "coin": "QANX",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "QANplatform",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "2732.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "24000000.000000000000000000",
// "withdrawMin": "240.000000000000000000",
// "sameAddress": false,
// "contract": "0xAAA7A10a8ee237ea61E8AC46C50A8Db8bCC1baaa"
// }
// ]
// }
//
const result = {};
for (let i = 0; i < response.length; i++) {
const currency = response[i];
const id = this.safeString(currency, 'coin');
const code = this.safeCurrencyCode(id);
const name = this.safeString(currency, 'name');
let currencyActive = false;
let currencyFee = undefined;
let currencyWithdrawMin = undefined;
let currencyWithdrawMax = undefined;
let depositEnabled = false;
let withdrawEnabled = false;
const networks = {};
const chains = this.safeValue(currency, 'networkList', []);
for (let j = 0; j < chains.length; j++) {
const chain = chains[j];
const networkId = this.safeString2(chain, 'netWork', 'network');
const network = this.networkIdToCode(networkId);
const isDepositEnabled = this.safeBool(chain, 'depositEnable', false);
const isWithdrawEnabled = this.safeBool(chain, 'withdrawEnable', false);
const active = (isDepositEnabled && isWithdrawEnabled);
currencyActive = active || currencyActive;
const withdrawMin = this.safeString(chain, 'withdrawMin');
const withdrawMax = this.safeString(chain, 'withdrawMax');
currencyWithdrawMin = (currencyWithdrawMin === undefined) ? withdrawMin : currencyWithdrawMin;
currencyWithdrawMax = (currencyWithdrawMax === undefined) ? withdrawMax : currencyWithdrawMax;
const fee = this.safeNumber(chain, 'withdrawFee');
currencyFee = (currencyFee === undefined) ? fee : currencyFee;
if (Precise["default"].stringGt(currencyWithdrawMin, withdrawMin)) {
currencyWithdrawMin = withdrawMin;
}
if (Precise["default"].stringLt(currencyWithdrawMax, withdrawMax)) {
currencyWithdrawMax = withdrawMax;
}
if (isDepositEnabled) {
depositEnabled = true;
}
if (isWithdrawEnabled) {
withdrawEnabled = true;
}
networks[network] = {
'info': chain,
'id': networkId,
'network': network,
'active': active,
'deposit': isDepositEnabled,
'withdraw': isWithdrawEnabled,
'fee': fee,
'prec