remsed
Version:
A JavaScript cryptocurrency trading library with support for fairdesk.com
1,170 lines (1,168 loc) • 185 kB
JavaScript
// ----------------------------------------------------------------------------
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
// ---------------------------------------------------------------------------
import { Exchange } from './base/Exchange.js';
import { ExchangeError, ExchangeNotAvailable, NotSupported, OnMaintenance, ArgumentsRequired, BadRequest, AccountSuspended, InvalidAddress, PermissionDenied, DDoSProtection, InsufficientFunds, InvalidNonce, CancelPending, InvalidOrder, OrderNotFound, AuthenticationError, RequestTimeout, BadSymbol, RateLimitExceeded } from './base/errors.js';
import { Precise } from './base/Precise.js';
import { TICK_SIZE } from './base/functions/number.js';
// ---------------------------------------------------------------------------
export default class bitget extends Exchange {
describe() {
return this.deepExtend(super.describe(), {
'id': 'bitget',
'name': 'Bitget',
'countries': ['SG'],
'version': 'v1',
'rateLimit': 50,
'certified': true,
'pro': true,
'has': {
'CORS': undefined,
'spot': true,
'margin': false,
'swap': true,
'future': true,
'option': false,
'addMargin': true,
'cancelAllOrders': true,
'cancelOrder': true,
'cancelOrders': true,
'createOrder': true,
'createReduceOnlyOrder': false,
'editOrder': true,
'fetchAccounts': false,
'fetchBalance': true,
'fetchBorrowRate': false,
'fetchBorrowRateHistories': false,
'fetchBorrowRateHistory': false,
'fetchBorrowRates': false,
'fetchBorrowRatesPerSymbol': false,
'fetchCanceledOrders': true,
'fetchClosedOrders': true,
'fetchCurrencies': true,
'fetchDepositAddress': true,
'fetchDepositAddresses': false,
'fetchDeposits': true,
'fetchFundingHistory': true,
'fetchFundingRate': true,
'fetchFundingRateHistory': true,
'fetchFundingRates': false,
'fetchIndexOHLCV': false,
'fetchLedger': true,
'fetchLeverage': true,
'fetchLeverageTiers': false,
'fetchMarginMode': undefined,
'fetchMarketLeverageTiers': false,
'fetchMarkets': true,
'fetchMarkOHLCV': false,
'fetchMyTrades': true,
'fetchOHLCV': true,
'fetchOpenInterest': true,
'fetchOpenInterestHistory': false,
'fetchOpenOrders': true,
'fetchOrder': true,
'fetchOrderBook': true,
'fetchOrders': false,
'fetchOrderTrades': true,
'fetchPosition': true,
'fetchPositionMode': false,
'fetchPositions': true,
'fetchPositionsRisk': false,
'fetchPremiumIndexOHLCV': false,
'fetchTicker': true,
'fetchTickers': true,
'fetchTime': true,
'fetchTrades': true,
'fetchTradingFee': true,
'fetchTradingFees': true,
'fetchTransfer': false,
'fetchTransfers': true,
'fetchWithdrawal': false,
'fetchWithdrawals': true,
'reduceMargin': true,
'setLeverage': true,
'setMarginMode': true,
'setPositionMode': true,
'transfer': true,
'withdraw': false,
},
'timeframes': {
'1m': '1m',
'3m': '3m',
'5m': '5m',
'15m': '15m',
'30m': '30m',
'1h': '1h',
'2h': '2h',
'4h': '4h',
'6h': '6h',
'12h': '12h',
'1d': '1d',
'3d': '3d',
'1w': '1w',
'1M': '1M',
},
'hostname': 'bitget.com',
'urls': {
'logo': 'https://user-images.githubusercontent.com/1294454/195989417-4253ddb0-afbe-4a1c-9dea-9dbcd121fa5d.jpg',
'api': {
'spot': 'https://api.{hostname}',
'mix': 'https://api.{hostname}',
},
'www': 'https://www.bitget.com',
'doc': [
'https://bitgetlimited.github.io/apidoc/en/mix',
'https://bitgetlimited.github.io/apidoc/en/spot',
'https://bitgetlimited.github.io/apidoc/en/broker',
],
'fees': 'https://www.bitget.cc/zh-CN/rate?tab=1',
'referral': 'https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j',
},
'api': {
'public': {
'spot': {
'get': {
'public/time': 1,
'public/currencies': 1,
'public/products': 1,
'public/product': 1,
'market/ticker': 1,
'market/tickers': 1,
'market/fills': 1,
'market/candles': 1,
'market/depth': 1,
'market/spot-vip-level': 2,
},
},
'mix': {
'get': {
'market/contracts': 1,
'market/depth': 1,
'market/ticker': 1,
'market/tickers': 1,
'market/fills': 1,
'market/candles': 1,
'market/index': 1,
'market/funding-time': 1,
'market/history-fundRate': 1,
'market/current-fundRate': 1,
'market/open-interest': 1,
'market/mark-price': 1,
'market/symbol-leverage': 1,
'market/contract-vip-level': 2,
},
},
},
'private': {
'spot': {
'get': {
'account/getInfo': 20,
'account/assets': 2,
'account/transferRecords': 4,
'wallet/deposit-address': 4,
'wallet/withdrawal-inner': 4,
'wallet/withdrawal-list': 1,
'wallet/deposit-list': 1,
},
'post': {
'account/bills': 2,
'account/sub-account-spot-assets': 200,
'trade/orders': 2,
'trade/batch-orders': 4,
'trade/cancel-order': 2,
'trade/cancel-batch-orders': 4,
'trade/orderInfo': 1,
'trade/open-orders': 1,
'trade/history': 1,
'trade/fills': 1,
'wallet/transfer': 4,
'wallet/withdrawal': 4,
'wallet/subTransfer': 10,
'plan/placePlan': 1,
'plan/modifyPlan': 1,
'plan/cancelPlan': 1,
'plan/currentPlan': 1,
'plan/historyPlan': 1,
},
},
'mix': {
'get': {
'account/account': 2,
'account/accounts': 2,
'account/accountBill': 2,
'account/accountBusinessBill': 4,
'account/open-count': 1,
'order/current': 2,
'order/history': 2,
'order/detail': 2,
'order/fills': 2,
'order/historyProductType': 8,
'order/allFills': 2,
'plan/currentPlan': 2,
'plan/historyPlan': 2,
'position/singlePosition': 2,
'position/allPosition': 2,
'trace/currentTrack': 2,
'trace/followerOrder': 2,
'trace/historyTrack': 2,
'trace/summary': 2,
'trace/profitSettleTokenIdGroup': 2,
'trace/profitDateGroupList': 2,
'trade/profitDateList': 2,
'trace/waitProfitDateList': 2,
'trace/traderSymbols': 2,
'order/marginCoinCurrent': 2,
},
'post': {
'account/setLeverage': 8,
'account/setMargin': 8,
'account/setMarginMode': 8,
'account/setPositionMode': 8,
'order/placeOrder': 2,
'order/batch-orders': 2,
'order/cancel-order': 2,
'order/cancel-all-orders': 2,
'order/cancel-batch-orders': 2,
'plan/placePlan': 2,
'plan/modifyPlan': 2,
'plan/modifyPlanPreset': 2,
'plan/placeTPSL': 2,
'plan/placeTrailStop': 2,
'plan/placePositionsTPSL': 2,
'plan/modifyTPSLPlan': 2,
'plan/cancelPlan': 2,
'plan/cancelAllPlan': 2,
'trace/closeTrackOrder': 2,
'trace/setUpCopySymbols': 2,
},
},
},
},
'fees': {
'spot': {
'taker': this.parseNumber('0.002'),
'maker': this.parseNumber('0.002'),
},
'swap': {
'taker': this.parseNumber('0.0006'),
'maker': this.parseNumber('0.0004'),
},
},
'requiredCredentials': {
'apiKey': true,
'secret': true,
'password': true,
},
'exceptions': {
// http error codes
// 400 Bad Request — Invalid request format
// 401 Unauthorized — Invalid API Key
// 403 Forbidden — You do not have access to the requested resource
// 404 Not Found
// 500 Internal Server Error — We had a problem with our server
'exact': {
'1': ExchangeError,
// undocumented
'failure to get a peer from the ring-balancer': ExchangeNotAvailable,
'4010': PermissionDenied,
// common
// '0': ExchangeError, // 200 successful,when the order placement / cancellation / operation is successful
'4001': ExchangeError,
'4002': ExchangeError,
// --------------------------------------------------------
'30001': AuthenticationError,
'30002': AuthenticationError,
'30003': AuthenticationError,
'30004': AuthenticationError,
'30005': InvalidNonce,
'30006': AuthenticationError,
'30007': BadRequest,
'30008': RequestTimeout,
'30009': ExchangeError,
'30010': AuthenticationError,
'30011': PermissionDenied,
'30012': AuthenticationError,
'30013': AuthenticationError,
'30014': DDoSProtection,
'30015': AuthenticationError,
'30016': ExchangeError,
'30017': ExchangeError,
'30018': ExchangeError,
'30019': ExchangeNotAvailable,
'30020': BadRequest,
'30021': BadRequest,
'30022': PermissionDenied,
'30023': BadRequest,
'30024': BadSymbol,
'30025': BadRequest,
'30026': DDoSProtection,
'30027': AuthenticationError,
'30028': PermissionDenied,
'30029': AccountSuspended,
'30030': ExchangeError,
'30031': BadRequest,
'30032': BadSymbol,
'30033': BadRequest,
'30034': ExchangeError,
'30035': ExchangeError,
'30036': ExchangeError,
'30037': ExchangeNotAvailable,
// '30038': AuthenticationError, // { "code": 30038, "message": "user does not exist" }
'30038': OnMaintenance,
// futures
'32001': AccountSuspended,
'32002': PermissionDenied,
'32003': CancelPending,
'32004': ExchangeError,
'32005': InvalidOrder,
'32006': InvalidOrder,
'32007': InvalidOrder,
'32008': InvalidOrder,
'32009': InvalidOrder,
'32010': ExchangeError,
'32011': ExchangeError,
'32012': ExchangeError,
'32013': ExchangeError,
'32014': ExchangeError,
'32015': ExchangeError,
'32016': ExchangeError,
'32017': ExchangeError,
'32018': ExchangeError,
'32019': ExchangeError,
'32020': ExchangeError,
'32021': ExchangeError,
'32022': ExchangeError,
'32023': ExchangeError,
'32024': ExchangeError,
'32025': ExchangeError,
'32026': ExchangeError,
'32027': ExchangeError,
'32028': AccountSuspended,
'32029': ExchangeError,
'32030': InvalidOrder,
'32031': ArgumentsRequired,
'32038': AuthenticationError,
'32040': ExchangeError,
'32044': ExchangeError,
'32045': ExchangeError,
'32046': ExchangeError,
'32047': ExchangeError,
'32048': InvalidOrder,
'32049': ExchangeError,
'32050': InvalidOrder,
'32051': InvalidOrder,
'32052': ExchangeError,
'32053': ExchangeError,
'32057': ExchangeError,
'32054': ExchangeError,
'32055': InvalidOrder,
'32056': ExchangeError,
'32058': ExchangeError,
'32059': InvalidOrder,
'32060': InvalidOrder,
'32061': InvalidOrder,
'32062': InvalidOrder,
'32063': InvalidOrder,
'32064': ExchangeError,
'32065': ExchangeError,
'32066': ExchangeError,
'32067': ExchangeError,
'32068': ExchangeError,
'32069': ExchangeError,
'32070': ExchangeError,
'32071': ExchangeError,
'32072': ExchangeError,
'32073': ExchangeError,
'32074': ExchangeError,
'32075': ExchangeError,
'32076': ExchangeError,
'32077': ExchangeError,
'32078': ExchangeError,
'32079': ExchangeError,
'32080': ExchangeError,
'32083': ExchangeError,
// token and margin trading
'33001': PermissionDenied,
'33002': AccountSuspended,
'33003': InsufficientFunds,
'33004': ExchangeError,
'33005': ExchangeError,
'33006': ExchangeError,
'33007': ExchangeError,
'33008': InsufficientFunds,
'33009': ExchangeError,
'33010': ExchangeError,
'33011': ExchangeError,
'33012': ExchangeError,
'33013': InvalidOrder,
'33014': OrderNotFound,
'33015': InvalidOrder,
'33016': ExchangeError,
'33017': InsufficientFunds,
'33018': ExchangeError,
'33020': ExchangeError,
'33021': BadRequest,
'33022': InvalidOrder,
'33023': ExchangeError,
'33024': InvalidOrder,
'33025': InvalidOrder,
'33026': ExchangeError,
'33027': InvalidOrder,
'33028': InvalidOrder,
'33029': InvalidOrder,
'33034': ExchangeError,
'33035': ExchangeError,
'33036': ExchangeError,
'33037': ExchangeError,
'33038': ExchangeError,
'33039': ExchangeError,
'33040': ExchangeError,
'33041': ExchangeError,
'33042': ExchangeError,
'33043': ExchangeError,
'33044': ExchangeError,
'33045': ExchangeError,
'33046': ExchangeError,
'33047': ExchangeError,
'33048': ExchangeError,
'33049': ExchangeError,
'33050': ExchangeError,
'33051': ExchangeError,
'33059': BadRequest,
'33060': BadRequest,
'33061': ExchangeError,
'33062': ExchangeError,
'33063': ExchangeError,
'33064': ExchangeError,
'33065': ExchangeError,
// account
'21009': ExchangeError,
'34001': PermissionDenied,
'34002': InvalidAddress,
'34003': ExchangeError,
'34004': ExchangeError,
'34005': ExchangeError,
'34006': ExchangeError,
'34007': ExchangeError,
'34008': InsufficientFunds,
'34009': ExchangeError,
'34010': ExchangeError,
'34011': ExchangeError,
'34012': ExchangeError,
'34013': ExchangeError,
'34014': ExchangeError,
'34015': ExchangeError,
'34016': PermissionDenied,
'34017': AccountSuspended,
'34018': AuthenticationError,
'34019': PermissionDenied,
'34020': PermissionDenied,
'34021': InvalidAddress,
'34022': ExchangeError,
'34023': PermissionDenied,
'34026': ExchangeError,
'34036': ExchangeError,
'34037': ExchangeError,
'34038': ExchangeError,
'34039': ExchangeError,
// swap
'35001': ExchangeError,
'35002': ExchangeError,
'35003': ExchangeError,
'35004': ExchangeError,
'35005': AuthenticationError,
'35008': InvalidOrder,
'35010': InvalidOrder,
'35012': InvalidOrder,
'35014': InvalidOrder,
'35015': InvalidOrder,
'35017': ExchangeError,
'35019': InvalidOrder,
'35020': InvalidOrder,
'35021': InvalidOrder,
'35022': ExchangeError,
'35024': ExchangeError,
'35025': InsufficientFunds,
'35026': ExchangeError,
'35029': OrderNotFound,
'35030': InvalidOrder,
'35031': InvalidOrder,
'35032': ExchangeError,
'35037': ExchangeError,
'35039': ExchangeError,
'35040': InvalidOrder,
'35044': ExchangeError,
'35046': InsufficientFunds,
'35047': InsufficientFunds,
'35048': ExchangeError,
'35049': InvalidOrder,
'35050': InvalidOrder,
'35052': InsufficientFunds,
'35053': ExchangeError,
'35055': InsufficientFunds,
'35057': ExchangeError,
'35058': ExchangeError,
'35059': BadRequest,
'35060': BadRequest,
'35061': BadRequest,
'35062': InvalidOrder,
'35063': InvalidOrder,
'35064': InvalidOrder,
'35066': InvalidOrder,
'35067': InvalidOrder,
'35068': InvalidOrder,
'35069': InvalidOrder,
'35070': InvalidOrder,
'35071': InvalidOrder,
'35072': InvalidOrder,
'35073': InvalidOrder,
'35074': InvalidOrder,
'35075': InvalidOrder,
'35076': InvalidOrder,
'35077': InvalidOrder,
'35078': InvalidOrder,
'35079': InvalidOrder,
'35080': InvalidOrder,
'35081': InvalidOrder,
'35082': InvalidOrder,
'35083': InvalidOrder,
'35084': InvalidOrder,
'35085': InvalidOrder,
'35086': InvalidOrder,
'35087': InvalidOrder,
'35088': InvalidOrder,
'35089': InvalidOrder,
'35090': ExchangeError,
'35091': ExchangeError,
'35092': ExchangeError,
'35093': ExchangeError,
'35094': ExchangeError,
'35095': BadRequest,
'35096': ExchangeError,
'35097': ExchangeError,
'35098': ExchangeError,
'35099': ExchangeError,
// option
'36001': BadRequest,
'36002': BadRequest,
'36005': ExchangeError,
'36101': AuthenticationError,
'36102': PermissionDenied,
'36103': AccountSuspended,
'36104': PermissionDenied,
'36105': PermissionDenied,
'36106': AccountSuspended,
'36107': PermissionDenied,
'36108': InsufficientFunds,
'36109': PermissionDenied,
'36201': PermissionDenied,
'36202': PermissionDenied,
'36203': InvalidOrder,
'36204': ExchangeError,
'36205': BadRequest,
'36206': BadRequest,
'36207': InvalidOrder,
'36208': InvalidOrder,
'36209': InvalidOrder,
'36210': InvalidOrder,
'36211': InvalidOrder,
'36212': InvalidOrder,
'36213': InvalidOrder,
'36214': ExchangeError,
'36216': OrderNotFound,
'36217': InvalidOrder,
'36218': InvalidOrder,
'36219': InvalidOrder,
'36220': InvalidOrder,
'36221': InvalidOrder,
'36222': InvalidOrder,
'36223': InvalidOrder,
'36224': InvalidOrder,
'36225': InvalidOrder,
'36226': InvalidOrder,
'36227': InvalidOrder,
'36228': InvalidOrder,
'36229': InvalidOrder,
'36230': InvalidOrder,
// --------------------------------------------------------
// swap
'400': BadRequest,
'401': AuthenticationError,
'403': PermissionDenied,
'404': BadRequest,
'405': BadRequest,
'415': BadRequest,
'429': DDoSProtection,
'500': ExchangeNotAvailable,
'1001': RateLimitExceeded,
'1002': ExchangeError,
'1003': ExchangeError,
// '00000': ExchangeError, // success
'40001': AuthenticationError,
'40002': AuthenticationError,
'40003': AuthenticationError,
'40004': InvalidNonce,
'40005': InvalidNonce,
'40006': AuthenticationError,
'40007': BadRequest,
'40008': InvalidNonce,
'40009': AuthenticationError,
'40010': AuthenticationError,
'40011': AuthenticationError,
'40012': AuthenticationError,
'40013': ExchangeError,
'40014': PermissionDenied,
'40015': ExchangeError,
'40016': PermissionDenied,
'40017': ExchangeError,
'40018': PermissionDenied,
'40019': InvalidOrder,
'40102': BadRequest,
'40103': BadRequest,
'40104': ExchangeError,
'40105': ExchangeError,
'40106': ExchangeError,
'40107': ExchangeError,
'40108': InvalidOrder,
'40109': OrderNotFound,
'40200': OnMaintenance,
'40201': InvalidOrder,
'40202': ExchangeError,
'40203': BadRequest,
'40204': BadRequest,
'40205': BadRequest,
'40206': BadRequest,
'40207': BadRequest,
'40208': BadRequest,
'40209': BadRequest,
'40300': ExchangeError,
'40301': PermissionDenied,
'40302': BadRequest,
'40303': BadRequest,
'40304': BadRequest,
'40305': BadRequest,
'40306': ExchangeError,
'40308': OnMaintenance,
'40309': BadSymbol,
'40400': ExchangeError,
'40401': ExchangeError,
'40402': BadRequest,
'40403': BadRequest,
'40404': BadRequest,
'40405': BadRequest,
'40406': BadRequest,
'40407': ExchangeError,
'40408': ExchangeError,
'40409': ExchangeError,
'40500': InvalidOrder,
'40501': ExchangeError,
'40502': ExchangeError,
'40503': ExchangeError,
'40504': ExchangeError,
'40505': ExchangeError,
'40506': AuthenticationError,
'40507': AuthenticationError,
'40508': ExchangeError,
'40509': ExchangeError,
'40600': ExchangeError,
'40601': ExchangeError,
'40602': ExchangeError,
'40603': ExchangeError,
'40604': ExchangeNotAvailable,
'40605': ExchangeError,
'40606': ExchangeError,
'40607': ExchangeError,
'40608': ExchangeError,
'40609': ExchangeError,
'40700': BadRequest,
'40701': ExchangeError,
'40702': ExchangeError,
'40703': ExchangeError,
'40704': ExchangeError,
'40705': BadRequest,
'40706': InvalidOrder,
'40707': BadRequest,
'40708': BadRequest,
'40709': ExchangeError,
'40710': ExchangeError,
'40711': InsufficientFunds,
'40712': InsufficientFunds,
'40713': ExchangeError,
'40714': ExchangeError,
'41114': OnMaintenance,
'43011': InvalidOrder,
'43025': InvalidOrder,
'45110': InvalidOrder,
// spot
'invalid sign': AuthenticationError,
'invalid currency': BadSymbol,
'invalid symbol': BadSymbol,
'invalid period': BadRequest,
'invalid user': ExchangeError,
'invalid amount': InvalidOrder,
'invalid type': InvalidOrder,
'invalid orderId': InvalidOrder,
'invalid record': ExchangeError,
'invalid accountId': BadRequest,
'invalid address': BadRequest,
'accesskey not null': AuthenticationError,
'illegal accesskey': AuthenticationError,
'sign not null': AuthenticationError,
'req_time is too much difference from server time': InvalidNonce,
'permissions not right': PermissionDenied,
'illegal sign invalid': AuthenticationError,
'user locked': AccountSuspended,
'Request Frequency Is Too High': RateLimitExceeded,
'more than a daily rate of cash': BadRequest,
'more than the maximum daily withdrawal amount': BadRequest,
'need to bind email or mobile': ExchangeError,
'user forbid': PermissionDenied,
'User Prohibited Cash Withdrawal': PermissionDenied,
'Cash Withdrawal Is Less Than The Minimum Value': BadRequest,
'Cash Withdrawal Is More Than The Maximum Value': BadRequest,
'the account with in 24 hours ban coin': PermissionDenied,
'order cancel fail': BadRequest,
'base symbol error': BadSymbol,
'base date error': ExchangeError,
'api signature not valid': AuthenticationError,
'gateway internal error': ExchangeError,
'audit failed': ExchangeError,
'order queryorder invalid': BadRequest,
'market no need price': InvalidOrder,
'limit need price': InvalidOrder,
'userid not equal to account_id': ExchangeError,
'your balance is low': InsufficientFunds,
'address invalid cointype': ExchangeError,
'system exception': ExchangeError,
'50003': ExchangeError,
'50004': BadSymbol,
'50006': PermissionDenied,
'50007': PermissionDenied,
'50008': RequestTimeout,
'50009': RateLimitExceeded,
'50010': ExchangeError,
'50014': InvalidOrder,
'50015': InvalidOrder,
'50016': InvalidOrder,
'50017': InvalidOrder,
'50018': InvalidOrder,
'50019': InvalidOrder,
'50020': InsufficientFunds,
'50021': InvalidOrder,
'50026': InvalidOrder,
'invalid order query time': ExchangeError,
'invalid start time': BadRequest,
'invalid end time': BadRequest,
'20003': ExchangeError,
'01001': ExchangeError,
'43111': PermissionDenied, // {"code":"43111","msg":"参数错误 address not in address book","requestTime":1665394201164,"data":null}
},
'broad': {
'invalid size, valid range': ExchangeError,
},
},
'precisionMode': TICK_SIZE,
'commonCurrencies': {
'JADE': 'Jade Protocol',
},
'options': {
'timeframes': {
'spot': {
'1m': '1m',
'5m': '5m',
'15m': '15m',
'30m': '30m',
'1h': '1h',
'4h': '4h',
'6h': '6Hutc',
'12h': '12Hutc',
'1d': '1Dutc',
'3d': '3Dutc',
'1w': '1Wutc',
'1M': '1Mutc',
},
'swap': {
'1m': '1m',
'3m': '3m',
'5m': '5m',
'15m': '15m',
'30m': '30m',
'1h': '1H',
'2h': '2H',
'4h': '4H',
'6h': '6Hutc',
'12h': '12Hutc',
'1d': '1Dutc',
'3d': '3Dutc',
'1w': '1Wutc',
'1M': '1Mutc',
},
},
'fetchMarkets': [
'spot',
'swap',
],
'defaultType': 'spot',
'defaultSubType': 'linear',
'createMarketBuyOrderRequiresPrice': true,
'broker': 'p4sve',
'withdraw': {
'fillResponseFromRequest': true,
},
'accountsByType': {
'main': 'EXCHANGE',
'spot': 'EXCHANGE',
'future': 'USDT_MIX',
'contract': 'CONTRACT',
'mix': 'USD_MIX',
},
'accountsById': {
'EXCHANGE': 'spot',
'USDT_MIX': 'future',
'CONTRACT': 'swap',
'USD_MIX': 'swap',
},
'sandboxMode': false,
'networks': {
'TRX': 'TRC20',
'ETH': 'ERC20',
'BSC': 'BEP20',
},
'networksById': {
'TRC20': 'TRX',
'BSC': 'BEP20',
},
},
});
}
setSandboxMode(enabled) {
this.options['sandboxMode'] = enabled;
}
async fetchTime(params = {}) {
/**
* @method
* @name bitget#fetchTime
* @description fetches the current integer timestamp in milliseconds from the exchange server
* @param {object} params extra parameters specific to the bitget api endpoint
* @returns {int} the current integer timestamp in milliseconds from the exchange server
*/
const response = await this.publicSpotGetPublicTime(params);
//
// {
// code: '00000',
// msg: 'success',
// requestTime: 1645837773501,
// data: '1645837773501'
// }
//
return this.safeInteger(response, 'data');
}
async fetchMarkets(params = {}) {
/**
* @method
* @name bitget#fetchMarkets
* @description retrieves data on all markets for bitget
* @param {object} params extra parameters specific to the exchange api endpoint
* @returns {[object]} an array of objects representing market data
*/
const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
let types = this.safeValue(this.options, 'fetchMarkets', ['spot', 'swap']);
if (sandboxMode) {
types = ['swap'];
}
let promises = [];
for (let i = 0; i < types.length; i++) {
const type = types[i];
if (type === 'swap') {
let subTypes = undefined;
if (sandboxMode) {
// the following are simulated trading markets [ 'sumcbl', 'sdmcbl', 'scmcbl' ];
subTypes = ['sumcbl', 'sdmcbl', 'scmcbl'];
}
else {
subTypes = ['umcbl', 'dmcbl', 'cmcbl'];
}
for (let j = 0; j < subTypes.length; j++) {
promises.push(this.fetchMarketsByType(type, this.extend(params, {
'productType': subTypes[j],
})));
}
}
else {
promises.push(this.fetchMarketsByType(types[i], params));
}
}
promises = await Promise.all(promises);
let result = promises[0];
for (let i = 1; i < promises.length; i++) {
result = this.arrayConcat(result, promises[i]);
}
return result;
}
parseMarkets(markets) {
const result = [];
for (let i = 0; i < markets.length; i++) {
result.push(this.parseMarket(markets[i]));
}
return result;
}
parseMarket(market) {
//
// spot
//
// {
// symbol: 'ALPHAUSDT_SPBL',
// symbolName: 'ALPHAUSDT',
// baseCoin: 'ALPHA',
// quoteCoin: 'USDT',
// minTradeAmount: '2',
// maxTradeAmount: '0',
// minTradeUSDT": '5',
// takerFeeRate: '0.001',
// makerFeeRate: '0.001',
// priceScale: '4',
// quantityScale: '4',
// status: 'online'
// }
//
// swap
//
// {
// symbol: 'BTCUSDT_UMCBL',
// makerFeeRate: '0.0002',
// takerFeeRate: '0.0006',
// feeRateUpRatio: '0.005',
// openCostUpRatio: '0.01',
// quoteCoin: 'USDT',
// baseCoin: 'BTC',
// buyLimitPriceRatio: '0.01',
// sellLimitPriceRatio: '0.01',
// supportMarginCoins: [ 'USDT' ],
// minTradeNum: '0.001',
// priceEndStep: '5',
// volumePlace: '3',
// pricePlace: '1',
// symbolStatus: "normal",
// offTime: "-1",
// limitOpenTime: "-1"
// }
//
const marketId = this.safeString(market, 'symbol');
const quoteId = this.safeString(market, 'quoteCoin');
const baseId = this.safeString(market, 'baseCoin');
const quote = this.safeCurrencyCode(quoteId);
const base = this.safeCurrencyCode(baseId);
const supportMarginCoins = this.safeValue(market, 'supportMarginCoins', []);
const settleId = this.safeString(supportMarginCoins, 0);
const settle = this.safeCurrencyCode(settleId);
let symbol = base + '/' + quote;
const parts = marketId.split('_');
const typeId = this.safeString(parts, 1);
let type = undefined;
let swap = false;
let spot = false;
let future = false;
let contract = false;
let pricePrecision = undefined;
let amountPrecision = undefined;
let linear = undefined;
let inverse = undefined;
let expiry = undefined;
let expiryDatetime = undefined;
if (typeId === 'SPBL') {
type = 'spot';
spot = true;
pricePrecision = this.parseNumber(this.parsePrecision(this.safeString(market, 'priceScale')));
amountPrecision = this.parseNumber(this.parsePrecision(this.safeString(market, 'quantityScale')));
}
else {
const expiryString = this.safeString(parts, 2);
if (expiryString !== undefined) {
const year = '20' + expiryString.slice(0, 2);
const month = expiryString.slice(2, 4);
const day = expiryString.slice(4, 6);
expiryDatetime = year + '-' + month + '-' + day + 'T00:00:00Z';
expiry = this.parse8601(expiryDatetime);
type = 'future';
future = true;
symbol = symbol + ':' + settle + '-' + expiryString;
}
else {
type = 'swap';
swap = true;
symbol = symbol + ':' + settle;
}
contract = true;
linear = (typeId === 'UMCBL') || (typeId === 'CMCBL') || (typeId === 'SUMCBL') || (typeId === 'SCMCBL');
inverse = !linear;
const priceDecimals = this.safeInteger(market, 'pricePlace');
const amountDecimals = this.safeInteger(market, 'volumePlace');
const priceStep = this.safeString(market, 'priceEndStep');
const amountStep = this.safeString(market, 'minTradeNum');
const precisePrice = new Precise(priceStep);
precisePrice.decimals = Math.max(precisePrice.decimals, priceDecimals);
precisePrice.reduce();
const priceString = precisePrice.toString();
pricePrecision = this.parseNumber(priceString);
const preciseAmount = new Precise(amountStep);
preciseAmount.decimals = Math.max(preciseAmount.decimals, amountDecimals);
preciseAmount.reduce();
const amountString = preciseAmount.toString();
amountPrecision = this.parseNumber(amountString);
}
const status = this.safeString2(market, 'status', 'symbolStatus');
let active = undefined;
if (status !== undefined) {
active = (status === 'online' || status === 'normal');
}
let minCost = undefined;
if (quote === 'USDT') {
minCost = this.safeNumber(market, 'minTradeUSDT');
}
return {
'id': marketId,
'symbol': symbol,
'base': base,
'quote': quote,
'settle': settle,
'baseId': baseId,
'quoteId': quoteId,
'settleId': settleId,
'type': type,
'spot': spot,
'margin': false,
'swap': swap,
'future': future,
'option': false,
'active': active,
'contract': contract,
'linear': linear,
'inverse': inverse,
'taker': this.safeNumber(market, 'takerFeeRate'),
'maker': this.safeNumber(market, 'makerFeeRate'),
'contractSize': 1,
'expiry': expiry,
'expiryDatetime': expiryDatetime,
'strike': undefined,
'optionType': undefined,
'precision': {
'amount': amountPrecision,
'price': pricePrecision,
},
'limits': {
'leverage': {
'min': undefined,
'max': undefined,
},
'amount': {
'min': this.safeNumber2(market, 'minTradeNum', 'minTradeAmount'),
'max': this.safeNumber(market, 'maxTradeAmount'),
},
'price': {
'min': undefined,
'max': undefined,
},
'cost': {
'min': minCost,
'max': undefined,
},
},
'info': market,
};
}
async fetchMarketsByType(type, params = {}) {
const method = this.getSupportedMapping(type, {
'spot': 'publicSpotGetPublicProducts',
'swap': 'publicMixGetMarketContracts',
});
const response = await this[method](params);
//
// spot
//
// {
// code: '00000',
// msg: 'success',
// requestTime: 1645840064031,
// data: [
// {
// symbol: 'ALPHAUSDT_SPBL',
// symbolName: 'ALPHAUSDT',
// baseCoin: 'ALPHA',
// quoteCoin: 'USDT',
// minTradeAmount: '2',
// maxTradeAmount: '0',
// takerFeeRate: '0.001',
// makerFeeRate: '0.001',
// priceScale: '4',
// quantityScale: '4',
// status: 'online'
// }
// ]
// }
//
// swap
//
// {
// code: '00000',
// msg: 'success',
// requestTime: 1645840821493,
// data: [
// {
// symbol: 'BTCUSDT_UMCBL',
// makerFeeRate: '0.0002',
// takerFeeRate: '0.0006',
// feeRateUpRatio: '0.005',
// openCostUpRatio: '0.01',
// quoteCoin: 'USDT',
// baseCoin: 'BTC',
// buyLimitPriceRatio: '0.01',
// sellLimitPriceRatio: '0.01',
// supportMarginCoins: [Array],
// minTradeNum: '0.001',
// priceEndStep: '5',
// volumePlace: '3',
// pricePlace: '1'
// }
// ]
// }
//
const data = this.safeValue(response, 'data', []);
return this.parseMarkets(data);
}
async fetchCurrencies(params = {}) {
/**
* @method
* @name bitget#fetchCurrencies
* @description fetches all available currencies on an exchange
* @param {object} params extra parameters specific to the bitget api endpoint
* @returns {object} an associative dictionary of currencies
*/
const response = await this.publicSpotGetPublicCurrencies(params);
//
// {
// code: '00000',
// msg: 'success',
// requestTime: 1645935668288,
// data: [
// {
// coinId: '230',
// coinName: 'KIN',
// transfer: 'false',
// chains: [
// {
// chain: 'SOL',
// needTag: 'false',
// withdrawable: 'true',
// rechargeable: 'true',
// withdrawFee: '187500',
// depositConfirm: '100',
// withdrawConfirm: '100',
// minDepositAmount: '12500',
// minWithdrawAmount: '250000',
// browserUrl: 'https://explorer.solana.com/tx/'
// }
// ]
// }
//