UNPKG

ccxt

Version:

A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges

1,133 lines (1,131 loc) • 271 kB
'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