Enter API credentials to login
Don't have api key?
Create one in Binance API management
Welcome
Logout
List of CCXT supported exchanges
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"ace",name:"ACE",countries:["TW"],version:"v2",rateLimit:100,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createOrder:!0,editOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDepositAddress:!1,fetchDeposits:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!1,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,setLeverage:!1,setMarginMode:!1,transfer:!1,withdraw:!1,ws:!1},timeframes:{"1m":1,"5m":5,"10m":10,"30m":10,"1h":60,"2h":120,"4h":240,"8h":480,"12h":720,"1d":24,"1w":70,"1M":31},urls:{logo:"https://github.com/user-attachments/assets/115f1e4a-0fd0-4b76-85d5-a49ebf64d1c8",api:{public:"https://ace.io/polarisex",private:"https://ace.io/polarisex/open"},www:"https://ace.io/",doc:["https://github.com/ace-exchange/ace-offical-api-docs"],fees:"https://helpcenter.ace.io/hc/zh-tw/articles/360018609132-%E8%B2%BB%E7%8E%87%E8%AA%AA%E6%98%8E"},requiredCredentials:{apiKey:!0,secret:!0},api:{public:{get:["oapi/v2/list/tradePrice","oapi/v2/list/marketPair","open/v2/public/getOrderBook"]},private:{post:["v2/coin/customerAccount","v2/kline/getKline","v2/order/order","v2/order/cancel","v2/order/getOrderList","v2/order/showOrderStatus","v2/order/showOrderHistory","v2/order/getTradeList"]}},fees:{trading:{percentage:!0,maker:this.parseNumber("0.0005"),taker:this.parseNumber("0.001")}},options:{brokerId:"ccxt"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:2e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{2003:r.InvalidOrder,2004:r.InvalidOrder,2005:r.InvalidOrder,2021:r.InsufficientFunds,2036:r.InvalidOrder,2039:r.InvalidOrder,2053:r.InvalidOrder,2061:r.BadRequest,2063:r.InvalidOrder,9996:r.BadRequest,10012:r.AuthenticationError,20182:r.AuthenticationError,20183:r.InvalidOrder},broad:{}},commonCurrencies:{}})}async fetchMarkets(e={}){const t=await this.publicGetOapiV2ListMarketPair();return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"baseCurrencyId"),i=this.safeCurrencyCode(this.safeString(e,"base")),s=this.safeString(e,"quoteCurrencyId"),r=this.safeCurrencyCode(this.safeString(e,"quote")),a=i+"/"+r;return{id:this.safeString(e,"symbol"),uppercaseId:void 0,symbol:a,base:i,baseId:t,quote:r,quoteId:s,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,limits:{amount:{min:this.safeNumber(e,"minLimitBaseAmount"),max:this.safeNumber(e,"maxLimitBaseAmount")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0},leverage:{min:void 0,max:void 0}},precision:{price:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrecision"))),amount:this.parseNumber(this.parsePrecision(this.safeString(e,"basePrecision")))},active:void 0,created:void 0,info:e}}parseTicker(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeSymbol(i,t);return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:void 0,close:this.safeString(e,"last_price"),last:this.safeString(e,"last_price"),previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"base_volume"),quoteVolume:this.safeString(e,"quote_volume"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.publicGetOapiV2ListTradePrice(t),r=i.id,a=this.safeDict(s,r,{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetOapiV2ListTradePrice(),s=[],r=Object.keys(i);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeMarket(t),o=this.safeDict(i,t,{}),n=this.parseTicker(o,a);s.push(n)}return this.filterByArrayTickers(s,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={quoteCurrencyId:s.quoteId,baseCurrencyId:s.baseId};void 0!==t&&(r.depth=t);const a=await this.publicGetOpenV2PublicGetOrderBook(this.extend(r,i)),o=this.safeDict(a,"attachment");return this.parseOrderBook(o,s.symbol,void 0,"bids","asks",1,0)}parseOHLCV(e,t=void 0){const i=this.safeString(e,"createTime");let s=this.parse8601(i);return void 0!==s&&(s-=288e5),[s,this.safeNumber(e,"openPrice"),this.safeNumber(e,"highPrice"),this.safeNumber(e,"lowPrice"),this.safeNumber(e,"closePrice"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={duration:this.timeframes[t],quoteCurrencyId:a.quoteId,baseCurrencyId:a.baseId};void 0!==s&&(o.limit=s),void 0!==i&&(o.startTime=i);const n=await this.privatePostV2KlineGetKline(this.extend(o,r)),d=this.safeList(n,"attachment",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOrderStatus(e){return this.safeString({0:"open",1:"open",2:"closed",4:"canceled",5:"canceled"},e,void 0)}parseOrder(e,t=void 0){let i,s,r,a,o,n,d,h,c,l,u;if("string"==typeof e)i=e;else{if(i=this.safeString(e,"orderNo"),s=this.safeInteger(e,"orderTimeStamp"),void 0===s){const t=this.safeString(e,"orderTime");void 0!==t&&(s=this.parse8601(t),s-=288e5)}const t=this.safeString(e,"buyOrSell");void 0!==t&&(n="1"===t?"buy":"sell"),o=this.safeString(e,"num"),a=this.safeString(e,"price");const f=this.safeString(e,"quoteCurrencyName"),p=this.safeString(e,"baseCurrencyName");void 0!==f&&void 0!==p&&(r=p+"/"+f);const m=this.safeString(e,"type");void 0!==m&&(d="1"===m?"limit":"market"),c=this.safeString(e,"tradeNum"),l=this.safeString(e,"remainNum"),h=this.parseOrderStatus(this.safeString(e,"status")),u=this.safeString(e,"averagePrice")}return this.safeOrder({id:i,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,symbol:r,type:d,timeInForce:void 0,postOnly:void 0,side:n,price:a,triggerPrice:void 0,amount:o,cost:void 0,average:u,filled:c,remaining:l,status:h,fee:void 0,trades:void 0,info:e},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=t.toUpperCase(),d=i.toUpperCase(),h={baseCurrencyId:o.baseId,quoteCurrencyId:o.quoteId,type:"LIMIT"===n?1:2,buyOrSell:"BUY"===d?1:2,num:this.amountToPrecision(e,s)};"limit"===t&&(h.price=this.priceToPrecision(e,r));const c=await this.privatePostV2OrderOrder(this.extend(h,a)),l=this.safeDict(c,"attachment");return this.parseOrder(l,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderNo:e};return await this.privatePostV2OrderCancel(this.extend(s,i))}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderNo:e},r=await this.privatePostV2OrderShowOrderStatus(this.extend(s,i)),a=this.safeDict(r,"attachment");return this.parseOrder(a,void 0)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={quoteCurrencyId:a.quoteId,baseCurrencyId:a.baseId};void 0!==i&&(o.size=i);const n=await this.privatePostV2OrderGetOrderList(this.extend(o,s)),d=this.safeList(n,"attachment");return this.parseOrders(d,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"tradeNo"),s=this.safeString(e,"price"),r=this.safeString(e,"num");let o=this.safeInteger(e,"tradeTimestamp");if(void 0===o){const t=this.safeString2(e,"time","tradeTime");o=this.parse8601(t),o-=288e5}let n=t.symbol;const d=this.safeString(e,"quoteCurrencyName"),h=this.safeString(e,"baseCurrencyName");let c;void 0!==d&&void 0!==h&&(n=h+"/"+d);const l=this.safeInteger(e,"buyOrSell");void 0!==l&&(c=1===l?"buy":"sell");const u=this.safeString(e,"fee");let f;if(void 0!==u){const t=this.safeString(e,"feeSave");f={cost:a.Y.stringSub(u,t),currency:d}}return this.safeTrade({info:e,id:i,order:this.safeString(e,"orderNo"),symbol:n,side:c,type:void 0,takerOrMaker:void 0,price:s,amount:r,cost:void 0,fee:f,timestamp:o,datetime:this.iso8601(o)},t)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.safeMarket(t),o={orderNo:e},n=await this.privatePostV2OrderShowOrderHistory(this.extend(o,r)),d=this.safeDict(n,"attachment"),h=this.safeList(d,"trades",[]);return this.parseTrades(h,a,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeMarket(e),a={};void 0!==r.id&&(a.quoteCurrencyId=r.quoteId,a.baseCurrencyId=r.baseId),void 0!==i&&(a.size=i);const o=await this.privatePostV2OrderGetTradeList(this.extend(a,s)),n=this.safeList(o,"attachment",[]);return this.parseTrades(n,r,t,i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currencyName"),a=this.safeCurrencyCode(r),o=this.safeString(s,"amount"),n={free:this.safeString(s,"cashAmount"),total:o};t[a]=n}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostV2CoinCustomerAccount(e),i=this.safeList(t,"attachment",[]);return this.parseBalance(i)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if(void 0===r&&(r={}),"private"===t){this.checkRequiredCredentials();const e=this.milliseconds();let t="ACE_SIGN"+this.secret;const o=this.extend({apiKey:this.apiKey,timeStamp:this.numberToString(e)},s),d=this.keysort(o),h=Object.values(d),c=[];for(let e=0;e<h.length;e++){const t=h[e].toString();c.push(t)}t+=c.join("");const l=this.hash(this.encode(t),n.s,"hex");if(o.signKey=l,r={"Content-Type":"application/x-www-form-urlencoded"},"POST"===i){const e=this.safeString(this.options,"brokerId");void 0!==e&&(r.Referer=e)}a=this.urlencode(o)}else"public"===t&&"GET"===i&&Object.keys(d).length&&(o+="?"+this.urlencode(d));return o=this.urls.api[t]+o,{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(void 0===o)return;const h=this.id+" "+a,c=this.safeNumber(o,"status",200);if(c>200){const e=c.toString();this.throwExactlyMatchedException(this.exceptions.exact,e,h),this.throwBroadlyMatchedException(this.exceptions.broad,e,h)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"alpaca",name:"Alpaca",countries:["US"],rateLimit:333,hostname:"alpaca.markets",pro:!0,urls:{logo:"https://github.com/user-attachments/assets/e9476df8-a450-4c3e-ab9a-1a7794219e1b",www:"https://alpaca.markets",api:{broker:"https://broker-api.{hostname}",trader:"https://api.{hostname}",market:"https://data.{hostname}"},test:{broker:"https://broker-api.sandbox.{hostname}",trader:"https://paper-api.{hostname}",market:"https://data.{hostname}"},doc:"https://alpaca.markets/docs/",fees:"https://docs.alpaca.markets/docs/crypto-fees"},has:{CORS:!1,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchBidsAsks:!1,fetchClosedOrders:!0,fetchCurrencies:!1,fetchDepositAddress:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchL1OrderBook:!0,fetchL2OrderBook:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!0,sandbox:!0,setLeverage:!1,setMarginMode:!1,transfer:!1,withdraw:!0},api:{broker:{},trader:{private:{get:["v2/account","v2/orders","v2/orders/{order_id}","v2/positions","v2/positions/{symbol_or_asset_id}","v2/account/portfolio/history","v2/watchlists","v2/watchlists/{watchlist_id}","v2/watchlists:by_name","v2/account/configurations","v2/account/activities","v2/account/activities/{activity_type}","v2/calendar","v2/clock","v2/assets","v2/assets/{symbol_or_asset_id}","v2/corporate_actions/announcements/{id}","v2/corporate_actions/announcements","v2/wallets","v2/wallets/transfers"],post:["v2/orders","v2/watchlists","v2/watchlists/{watchlist_id}","v2/watchlists:by_name","v2/wallets/transfers"],put:["v2/orders/{order_id}","v2/watchlists/{watchlist_id}","v2/watchlists:by_name"],patch:["v2/orders/{order_id}","v2/account/configurations"],delete:["v2/orders","v2/orders/{order_id}","v2/positions","v2/positions/{symbol_or_asset_id}","v2/watchlists/{watchlist_id}","v2/watchlists:by_name","v2/watchlists/{watchlist_id}/{symbol}"]}},market:{public:{get:["v1beta3/crypto/{loc}/bars","v1beta3/crypto/{loc}/latest/bars","v1beta3/crypto/{loc}/latest/orderbooks","v1beta3/crypto/{loc}/latest/quotes","v1beta3/crypto/{loc}/latest/trades","v1beta3/crypto/{loc}/quotes","v1beta3/crypto/{loc}/snapshots","v1beta3/crypto/{loc}/trades"]},private:{get:["v1beta1/corporate-actions","v1beta1/forex/latest/rates","v1beta1/forex/rates","v1beta1/logos/{symbol}","v1beta1/news","v1beta1/screener/stocks/most-actives","v1beta1/screener/{market_type}/movers","v2/stocks/auctions","v2/stocks/bars","v2/stocks/bars/latest","v2/stocks/meta/conditions/{ticktype}","v2/stocks/meta/exchanges","v2/stocks/quotes","v2/stocks/quotes/latest","v2/stocks/snapshots","v2/stocks/trades","v2/stocks/trades/latest","v2/stocks/{symbol}/auctions","v2/stocks/{symbol}/bars","v2/stocks/{symbol}/bars/latest","v2/stocks/{symbol}/quotes","v2/stocks/{symbol}/quotes/latest","v2/stocks/{symbol}/snapshot","v2/stocks/{symbol}/trades","v2/stocks/{symbol}/trades/latest"]}}},timeframes:{"1m":"1min","3m":"3min","5m":"5min","15m":"15min","30m":"30min","1h":"1H","2h":"2H","4h":"4H","6h":"6H","8h":"8H","12h":"12H","1d":"1D","3d":"3D","1w":"1W","1M":"1M"},precisionMode:o.kb,requiredCredentials:{apiKey:!0,secret:!0},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.0015"),taker:this.parseNumber("0.0025"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.0022")],[this.parseNumber("500000"),this.parseNumber("0.0020")],[this.parseNumber("1000000"),this.parseNumber("0.0018")],[this.parseNumber("10000000"),this.parseNumber("0.0015")],[this.parseNumber("25000000"),this.parseNumber("0.0013")],[this.parseNumber("50000000"),this.parseNumber("0.0012")],[this.parseNumber("100000000"),this.parseNumber("0.001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.0012")],[this.parseNumber("500000"),this.parseNumber("0.001")],[this.parseNumber("1000000"),this.parseNumber("0.0008")],[this.parseNumber("10000000"),this.parseNumber("0.0005")],[this.parseNumber("25000000"),this.parseNumber("0.0002")],[this.parseNumber("50000000"),this.parseNumber("0.0002")],[this.parseNumber("100000000"),this.parseNumber("0.00")]]}}},headers:{"APCA-PARTNER-ID":"ccxt"},options:{defaultExchange:"CBSE",exchanges:["CBSE","FTX","GNSS","ERSX"],defaultTimeInForce:"gtc",clientOrderId:"ccxt_{id}"},features:{spot:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!0},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:500,daysBack:1e5,daysBackCanceled:void 0,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"forbidden.":a.PermissionDenied,4041e4:a.InvalidOrder,40010001:a.BadRequest,4011e4:a.PermissionDenied,4031e4:a.InsufficientFunds,4291e4:a.RateLimitExceeded},broad:{"Invalid format for parameter":a.BadRequest,"Invalid symbol":a.BadSymbol}}})}async fetchTime(e={}){const t=await this.traderPrivateGetV2Clock(e),i=this.safeString(t,"timestamp"),s=i.slice(0,23),r=i.length-6,a=i.length-3,o=i.slice(r,a);return this.parse8601(s)-3600*this.parseToNumeric(o)*1e3}async fetchMarkets(e={}){const t=await this.traderPrivateGetV2Assets(this.extend({asset_class:"crypto",status:"active"},e));return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"symbol"),i=t.split("/"),s=this.safeString(e,"class"),r=this.safeString(i,0),a=this.safeString(i,1),o=this.safeCurrencyCode(r);let n=this.safeCurrencyCode(a);void 0===n&&"us_equity"===s&&(n="USD");const d=o+"/"+n,h="active"===this.safeString(e,"status"),c=this.safeNumber(e,"min_order_size");return{id:t,symbol:d,base:o,quote:n,settle:void 0,baseId:r,quoteId:a,settleId:void 0,type:"spot",spot:!0,margin:void 0,swap:!1,future:!1,option:!1,active:h,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"min_trade_increment"),price:this.safeNumber(e,"price_increment")},limits:{leverage:{min:void 0,max:void 0},amount:{min:c,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),o=r.id,n=this.safeString(s,"loc","us"),d=this.safeString(s,"method","marketPublicGetV1beta3CryptoLocTrades"),h={symbols:o,loc:n};let c;if(s=this.omit(s,["loc","method"]),"marketPublicGetV1beta3CryptoLocTrades"===d){void 0!==t&&(h.start=this.iso8601(t)),void 0!==i&&(h.limit=i);const e=await this.marketPublicGetV1beta3CryptoLocTrades(this.extend(h,s)),r=this.safeDict(e,"trades",{});c=this.safeList(r,o,[])}else{if("marketPublicGetV1beta3CryptoLocLatestTrades"!==d)throw new a.NotSupported(this.id+" fetchTrades() does not support "+d+", marketPublicGetV1beta3CryptoLocTrades and marketPublicGetV1beta3CryptoLocLatestTrades are supported");{const e=await this.marketPublicGetV1beta3CryptoLocLatestTrades(this.extend(h,s)),t=this.safeDict(e,"trades",{});c=this.safeDict(t,o,{}),c=[c]}}return this.parseTrades(c,r,t,i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r=s.id,a={symbols:r,loc:this.safeString(i,"loc","us")},o=await this.marketPublicGetV1beta3CryptoLocLatestOrderbooks(this.extend(a,i)),n=this.safeDict(o,"orderbooks",{}),d=this.safeDict(n,r,{}),h=this.parse8601(this.safeString(d,"t"));return this.parseOrderBook(d,s.symbol,h,"b","a","p","s")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const o=this.market(e),n=o.id,d=this.safeString(r,"loc","us"),h=this.safeString(r,"method","marketPublicGetV1beta3CryptoLocBars"),c={symbols:n,loc:d};let l;if(r=this.omit(r,["loc","method"]),"marketPublicGetV1beta3CryptoLocBars"===h){void 0!==s&&(c.limit=s),void 0!==i&&(c.start=this.yyyymmdd(i)),c.timeframe=this.safeString(this.timeframes,t,t);const e=await this.marketPublicGetV1beta3CryptoLocBars(this.extend(c,r)),a=this.safeDict(e,"bars",{});l=this.safeList(a,n,[])}else{if("marketPublicGetV1beta3CryptoLocLatestBars"!==h)throw new a.NotSupported(this.id+" fetchOHLCV() does not support "+h+", marketPublicGetV1beta3CryptoLocBars and marketPublicGetV1beta3CryptoLocLatestBars are supported");{const e=await this.marketPublicGetV1beta3CryptoLocLatestBars(this.extend(c,r)),t=this.safeDict(e,"bars",{});l=this.safeDict(t,n,{}),l=[l]}}return this.parseOHLCVs(l,o,t,i,s)}parseOHLCV(e,t=void 0){const i=this.safeString(e,"t");return[this.parse8601(i),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}async fetchTicker(e,t={}){await this.loadMarkets(),e=this.symbol(e);const i=await this.fetchTickers([e],t);return this.safeDict(i,e)}async fetchTickers(e=void 0,t={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchTickers() requires a symbols argument");await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString(t,"loc","us"),s={symbols:this.marketIds(e).join(","),loc:i};t=this.omit(t,"loc");const r=await this.marketPublicGetV1beta3CryptoLocSnapshots(this.extend(s,t)),o=[],n=this.safeDict(r,"snapshots",{}),d=Object.keys(n);for(let e=0;e<d.length;e++){const t=d[e],i=this.safeMarket(t),s=this.safeDict(n,t),r=this.safeDict(s,"dailyBar",{}),a=this.safeDict(s,"prevDailyBar",{}),h=this.safeDict(s,"latestQuote",{}),c=this.safeDict(s,"latestTrade",{}),l=this.safeString(h,"t"),u=this.safeTicker({info:s,symbol:i.symbol,timestamp:this.parse8601(l),datetime:l,high:this.safeString(r,"h"),low:this.safeString(r,"l"),bid:this.safeString(h,"bp"),bidVolume:this.safeString(h,"bs"),ask:this.safeString(h,"ap"),askVolume:this.safeString(h,"as"),vwap:this.safeString(r,"vw"),open:this.safeString(r,"o"),close:this.safeString(r,"c"),last:this.safeString(c,"p"),previousClose:this.safeString(a,"c"),change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(r,"v"),quoteVolume:this.safeString(r,"n")},i);o.push(u)}return this.filterByArray(o,"symbol",e)}generateClientOrderId(e){const t=this.safeString(this.options,"clientOrderId"),i=this.uuid().split("-").join(""),s=this.implodeParams(t,{id:i});return this.safeString(e,"clientOrderId",s)}async createMarketOrderWithCost(e,t,i,s={}){await this.loadMarkets();const r={cost:i};return await this.createOrder(e,"market",t,0,void 0,this.extend(r,s))}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();const s={cost:t};return await this.createOrder(e,"market","buy",0,void 0,this.extend(s,i))}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();const s={cost:t};return await this.createOrder(e,"market","sell",t,void 0,this.extend(s,i))}async createOrder(e,t,i,s,r=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={symbol:n.id,side:i,type:t},h=this.safeStringN(o,["triggerPrice","stop_price"]);if(void 0!==h){let i;if(!(t.indexOf("limit")>=0))throw new a.NotSupported(this.id+" createOrder() does not support stop orders for "+t+" orders, only stop_limit orders are supported");i="stop_limit",d.stop_price=this.priceToPrecision(e,h),d.type=i}t.indexOf("limit")>=0&&(d.limit_price=this.priceToPrecision(e,r));const c=this.safeString(o,"cost");void 0!==c?(o=this.omit(o,"cost"),d.notional=this.costToPrecision(e,c)):d.qty=this.amountToPrecision(e,s);const l=this.safeString(this.options,"defaultTimeInForce");d.time_in_force=this.safeString(o,"timeInForce",l),o=this.omit(o,["timeInForce","triggerPrice"]),d.client_order_id=this.generateClientOrderId(o),o=this.omit(o,["clientOrderId"]);const u=await this.traderPrivatePostV2Orders(this.extend(d,o));return this.parseOrder(u,n)}async cancelOrder(e,t=void 0,i={}){const s={order_id:e},r=await this.traderPrivateDeleteV2OrdersOrderId(this.extend(s,i));return this.parseOrder(r)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=await this.traderPrivateDeleteV2Orders(t);return Array.isArray(i)?this.parseOrders(i,void 0):[this.safeOrder({info:i})]}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.traderPrivateGetV2OrdersOrderId(this.extend(s,i)),a=this.safeString(r,"symbol"),o=this.safeMarket(a);return this.parseOrder(r,o)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={status:"all"};let a;void 0!==e&&(a=this.market(e),r.symbols=a.id);const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,"until"),r.endTime=this.iso8601(o)),void 0!==t&&(r.after=this.iso8601(t)),void 0!==i&&(r.limit=i);const n=await this.traderPrivateGetV2Orders(this.extend(r,s));return this.parseOrders(n,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"open"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"closed"},s))}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n={order_id:e};let d;void 0!==t&&(d=this.market(t)),void 0!==r&&(n.qty=this.amountToPrecision(t,r));const h=this.safeStringN(o,["triggerPrice","stop_price"]);let c;void 0!==h&&(n.stop_price=this.priceToPrecision(t,h),o=this.omit(o,"triggerPrice")),void 0!==a&&(n.limit_price=this.priceToPrecision(t,a)),[c,o]=this.handleOptionAndParams2(o,"editOrder","timeInForce","defaultTimeInForce"),void 0!==c&&(n.time_in_force=c),n.client_order_id=this.generateClientOrderId(o),o=this.omit(o,["clientOrderId"]);const l=await this.traderPrivatePatchV2OrdersOrderId(this.extend(n,o));return this.parseOrder(l,d)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString(e,"status"),a=this.parseOrderStatus(r),o=this.safeString(e,"commission");let n;void 0!==o&&(n={cost:o,currency:"USD"});let d=this.safeString(e,"order_type");void 0!==d&&d.indexOf("limit")>=0&&(d="limit");const h=this.safeString(e,"submitted_at"),c=this.parse8601(h);return this.safeOrder({id:this.safeString(e,"id"),clientOrderId:this.safeString(e,"client_order_id"),timestamp:c,datetime:h,lastTradeTimeStamp:void 0,status:a,symbol:s,type:d,timeInForce:this.parseTimeInForce(this.safeString(e,"time_in_force")),postOnly:void 0,side:this.safeString(e,"side"),price:this.safeNumber(e,"limit_price"),triggerPrice:this.safeNumber(e,"stop_price"),cost:void 0,average:this.safeNumber(e,"filled_avg_price"),amount:this.safeNumber(e,"qty"),filled:this.safeNumber(e,"filled_qty"),remaining:void 0,trades:void 0,fee:n,info:e},t)}parseOrderStatus(e){return this.safeString({pending_new:"open",accepted:"open",new:"open",partially_filled:"open",activated:"open",filled:"closed"},e,e)}parseTimeInForce(e){return this.safeString({day:"Day"},e,e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();let a={activity_type:"FILL"};void 0!==e&&(r=this.market(e));const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,"until"),a.until=this.iso8601(o)),void 0!==t&&(a.after=this.iso8601(t)),void 0!==i&&(a.page_size=i),[a,s]=this.handleUntilOption("until",a,s);const n=await this.traderPrivateGetV2AccountActivitiesActivityType(this.extend(a,s));return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString2(e,"S","symbol"),s=this.safeSymbol(i,t),r=this.safeString2(e,"t","transaction_time"),a=this.parse8601(r),o=this.safeString(e,"tks");let n=this.safeString(e,"side");"B"===o?n="buy":"S"===o&&(n="sell");const d=this.safeString2(e,"p","price"),h=this.safeString2(e,"s","qty");return this.safeTrade({info:e,id:this.safeString2(e,"i","id"),timestamp:a,datetime:this.iso8601(a),symbol:s,order:this.safeString(e,"order_id"),type:void 0,side:n,takerOrMaker:"taker",price:d,amount:h,cost:void 0,fee:void 0},t)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={asset:i.id},r=await this.traderPrivateGetV2Wallets(this.extend(s,t));return this.parseDepositAddress(r,i)}parseDepositAddress(e,t=void 0){let i;return void 0!==t&&(i=t.id),{info:e,currency:i,network:void 0,address:this.safeString(e,"address"),tag:void 0}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e);s&&(i=i+":"+s);const o={asset:a.id,address:i,amount:this.numberToString(t)},n=await this.traderPrivatePostV2WalletsTransfers(this.extend(o,r));return this.parseTransaction(n,a)}async fetchTransactionsHelper(e,t,i,s,r){let a;await this.loadMarkets(),void 0!==t&&(a=this.currency(t));const o=await this.traderPrivateGetV2WalletsTransfers(r),n=[];for(let t=0;t<o.length;t++){const i=o[t];(this.safeString(i,"direction")===e||"BOTH"===e)&&n.push(i)}return this.parseTransactions(n,a,i,s,r)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("BOTH",e,t,i,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("INCOMING",e,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("OUTGOING",e,t,i,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"created_at"),s=this.safeString(e,"asset"),a=this.safeCurrencyCode(s,t),o=this.safeString(e,"fees"),n=this.safeString(e,"network_fee"),d=r.Y.stringAdd(o,n),h={cost:this.parseNumber(d),currency:a};return{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"tx_hash"),timestamp:this.parse8601(i),datetime:i,network:this.safeString(e,"chain"),address:this.safeString(e,"to_address"),addressTo:this.safeString(e,"to_address"),addressFrom:this.safeString(e,"from_address"),tag:void 0,tagTo:void 0,tagFrom:void 0,type:this.parseTransactionType(this.safeString(e,"direction")),amount:this.safeNumber(e,"amount"),currency:a,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:void 0,fee:h,comment:void 0,internal:void 0}}parseTransactionStatus(e){return this.safeString({PROCESSING:"pending",FAILED:"failed",COMPLETE:"ok"},e,e)}parseTransactionType(e){return this.safeString({INCOMING:"deposit",OUTGOING:"withdrawal"},e,e)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.traderPrivateGetV2Account(e);return this.parseBalance(t)}parseBalance(e){const t={info:e},i=this.account(),s=this.safeString(e,"currency"),r=this.safeCurrencyCode(s);return i.free=this.safeString(e,"cash"),i.total=this.safeString(e,"equity"),t[r]=i,this.safeBalance(t)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.implodeParams(e,s),n=this.implodeHostname(this.urls.api[t[0]]);r=void 0!==r?r:{},"private"===t[1]&&(this.checkRequiredCredentials(),r["APCA-API-KEY-ID"]=this.apiKey,r["APCA-API-SECRET-KEY"]=this.secret);const d=this.omit(s,this.extractParams(e));return Object.keys(d).length&&("GET"===i||"DELETE"===i?o+="?"+this.urlencode(d):(a=this.json(d),r["Content-Type"]="application/json")),n+=o,{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){if(void 0===n)return;const c=this.id+" "+o,l=this.safeString(n,"code");void 0!==e&&this.throwExactlyMatchedException(this.exceptions.exact,l,c);const u=this.safeValue(n,"message",void 0);if(void 0!==u)throw this.throwExactlyMatchedException(this.exceptions.exact,u,c),this.throwBroadlyMatchedException(this.exceptions.broad,u,c),new a.ExchangeError(c)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"ascendex",name:"AscendEX",countries:["SG"],rateLimit:400,certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!0,cancelAllOrders:!0,cancelOrder:!0,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingRate:"emulated",fetchFundingRateHistory:!1,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchLeverage:"emulated",fetchLeverages:!0,fetchLeverageTiers:!0,fetchMarginMode:"emulated",fetchMarginModes:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!0,sandbox:!0,setLeverage:!0,setMarginMode:!0,setPositionMode:!1,transfer:!0},timeframes:{"1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","2h":"120","4h":"240","6h":"360","12h":"720","1d":"1d","1w":"1w","1M":"1m"},version:"v2",urls:{logo:"https://github.com/user-attachments/assets/55bab6b9-d4ca-42a8-a0e6-fac81ae557f1",api:{rest:"https://ascendex.com"},test:{rest:"https://api-test.ascendex-sandbox.com"},www:"https://ascendex.com",doc:["https://ascendex.github.io/ascendex-pro-api/#ascendex-pro-api-documentation"],fees:"https://ascendex.com/en/feerate/transactionfee-traderate",referral:{url:"https://ascendex.com/en-us/register?inviteCode=EL6BXBQM",discount:.25}},api:{v1:{public:{get:{assets:1,products:1,ticker:1,"barhist/info":1,barhist:1,depth:1,trades:1,"cash/assets":1,"cash/products":1,"margin/assets":1,"margin/products":1,"futures/collateral":1,"futures/contracts":1,"futures/ref-px":1,"futures/market-data":1,"futures/funding-rates":1,"risk-limit-info":1,"exchange-info":1}},private:{get:{info:1,"wallet/transactions":1,"wallet/deposit/address":1,"data/balance/snapshot":1,"data/balance/history":1},accountCategory:{get:{balance:1,"order/open":1,"order/status":1,"order/hist/current":1,risk:1},post:{order:1,"order/batch":1},delete:{order:1,"order/all":1,"order/batch":1}},accountGroup:{get:{"cash/balance":1,"margin/balance":1,"margin/risk":1,"futures/collateral-balance":1,"futures/position":1,"futures/risk":1,"futures/funding-payments":1,"order/hist":1,"spot/fee":1},post:{transfer:1,"futures/transfer/deposit":1,"futures/transfer/withdraw":1}}}},v2:{public:{get:{assets:1,"futures/contract":1,"futures/collateral":1,"futures/pricing-data":1,"futures/ticker":1,"risk-limit-info":1}},private:{data:{get:{"order/hist":1}},get:{"account/info":1},accountGroup:{get:{"order/hist":1,"futures/position":1,"futures/free-margin":1,"futures/order/hist/current":1,"futures/funding-payments":1,"futures/order/open":1,"futures/order/status":1},post:{"futures/isolated-position-margin":1,"futures/margin-type":1,"futures/leverage":1,"futures/transfer/deposit":1,"futures/transfer/withdraw":1,"futures/order":1,"futures/order/batch":1,"futures/order/open":1,"subuser/subuser-transfer":1,"subuser/subuser-transfer-hist":1},delete:{"futures/order":1,"futures/order/batch":1,"futures/order/all":1}}}}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,taker:this.parseNumber("0.002"),maker:this.parseNumber("0.002")}},precisionMode:o.kb,options:{"account-category":"cash","account-group":void 0,fetchClosedOrders:{method:"v2PrivateDataGetOrderHist"},defaultType:"spot",accountsByType:{spot:"cash",swap:"futures",margin:"margin"},transfer:{fillResponseFromRequest:!0},networks:{BSC:"BEP20 (BSC)",ARB:"arbitrum",SOL:"Solana",AVAX:"avalanche C chain",OMNI:"Omni",TRC20:"TRC20",ERC20:"ERC20",GO20:"GO20",BEP2:"BEP2",BTC:"Bitcoin",BCH:"Bitcoin ABC",LTC:"Litecoin",MATIC:"Matic Network",AKT:"Akash"}},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:{max:10},fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,marketType:!0,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,marketType:!0,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:500}},spot:{extends:"default",fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1}},forDerivatives:{extends:"default",createOrder:{attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!1,index:!1},price:!1}},fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1}},swap:{linear:{extends:"forDerivatives"},inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{1900:r.BadRequest,2100:r.AuthenticationError,5002:r.BadSymbol,6001:r.BadSymbol,6010:r.InsufficientFunds,60060:r.InvalidOrder,600503:r.InvalidOrder,100001:r.BadRequest,100002:r.BadRequest,100003:r.BadRequest,100004:r.BadRequest,100005:r.BadRequest,100006:r.BadRequest,100007:r.BadRequest,100008:r.BadSymbol,100009:r.AuthenticationError,100010:r.BadRequest,100011:r.BadRequest,100012:r.BadRequest,100013:r.BadRequest,100101:r.ExchangeError,150001:r.BadRequest,200001:r.AuthenticationError,200002:r.ExchangeError,200003:r.ExchangeError,200004:r.ExchangeError,200005:r.ExchangeError,200006:r.ExchangeError,200007:r.ExchangeError,200008:r.ExchangeError,200009:r.ExchangeError,200010:r.AuthenticationError,200011:r.ExchangeError,200012:r.ExchangeError,200013:r.ExchangeError,200014:r.PermissionDenied,200015:r.PermissionDenied,300001:r.InvalidOrder,300002:r.InvalidOrder,300003:r.InvalidOrder,300004:r.InvalidOrder,300005:r.InvalidOrder,300006:r.InvalidOrder,300007:r.InvalidOrder,300008:r.InvalidOrder,300009:r.InvalidOrder,300011:r.InsufficientFunds,300012:r.BadSymbol,300013:r.InvalidOrder,300014:r.InvalidOrder,300020:r.InvalidOrder,300021:r.AccountSuspended,300031:r.InvalidOrder,310001:r.InsufficientFunds,310002:r.InvalidOrder,310003:r.InvalidOrder,310004:r.BadSymbol,310005:r.InvalidOrder,510001:r.ExchangeError,900001:r.ExchangeError},broad:{}},commonCurrencies:{BOND:"BONDED",BTCBEAR:"BEAR",BTCBULL:"BULL",BYN:"BeyondFi",PLN:"Pollen"}})}getAccount(e={}){const t=this.safeValue(e,"account",this.options.account).toLowerCase();return this.capitalize(t)}async fetchCurrencies(e={}){const t=this.v1PublicGetAssets(e),i=this.v1PublicGetMarginAssets(e),s=this.v1PublicGetCashAssets(e),[r,a,o]=await Promise.all([t,i,s]),n=this.safeList(r,"data",[]),d=this.safeList(a,"data",[]),h=this.safeList(o,"data",[]),c=this.indexBy(n,"assetCode"),l=this.indexBy(d,"assetCode"),u=this.indexBy(h,"assetCode"),f=this.deepExtend(c,l,u),p=Object.keys(f),m={};for(let e=0;e<p.length;e++){const t=p[e],i=f[t],s=this.safeCurrencyCode(t),r=this.safeString2(i,"precisionScale","nativeScale"),a=this.parseNumber(this.parsePrecision(r)),o=this.safeNumber2(i,"withdrawFee","withdrawalFee"),n="Normal"===this.safeString2(i,"status","statusCode"),d="borrowAssetCode"in i;m[s]={id:t,code:s,info:i,type:void 0,margin:d,name:this.safeString(i,"assetName"),active:n,deposit:void 0,withdraw:void 0,fee:o,precision:a,limits:{amount:{min:a,max:void 0},withdraw:{min:this.safeNumber(i,"minWithdrawalAmt"),max:void 0}},networks:{}}}return m}async fetchMarkets(e={}){const t=this.v1PublicGetProducts(e),i=this.v1PublicGetCashProducts(e),s=this.v2PublicGetFuturesContract(e),[r,a,o]=await Promise.all([t,i,s]),n=this.safeList(r,"data",[]),d=this.indexBy(n,"symbol"),h=this.safeList(a,"data",[]),c=this.safeList(o,"data",[]),l=this.arrayConcat(h,c),u=this.indexBy(l,"symbol"),f=this.deepExtend(d,u),p=Object.keys(f),m=[];for(let e=0;e<p.length;e++){const t=p[e],i=f[t],s=this.safeString(i,"settlementAsset"),r=this.safeCurrencyCode(s),a=this.safeString(i,"status"),o=this.safeString(i,"domain");let n=!1;"Normal"!==a&&"InternalTrading"!==a||"LeveragedETF"===o||(n=!0);const d=void 0===r,h=!d,c=!!h||void 0;let l,u=this.safeNumber(i,"minQty"),g=this.safeNumber(i,"maxQty"),v=this.safeNumber(i,"tickSize");const y=this.safeString2(i,"underlying","symbol").split("/"),w=this.safeString(y,0),b=this.safeString(y,1),k=this.safeCurrencyCode(w),S=this.safeCurrencyCode(b);let O=k+"/"+S;if(h){const e=this.safeDict(i,"lotSizeFilter");u=this.safeNumber(e,"minQty"),g=this.safeNumber(e,"maxQty");const t=this.safeDict(i,"priceFilter");v=this.safeNumber(t,"minPrice"),l=this.safeNumber(t,"maxPrice"),O=k+"/"+S+":"+r}const T=this.safeNumber(i,"commissionReserveRate"),P=this.safeBool(i,"marginTradable",!1);m.push({id:t,symbol:O,base:k,quote:S,settle:r,baseId:w,quoteId:b,settleId:s,type:h?"swap":"spot",spot:d,margin:d?P:void 0,swap:h,future:!1,option:!1,active:n,contract:h,linear:c,inverse:h?!c:void 0,taker:T,maker:T,contractSize:h?this.parseNumber("1"):void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(i,"lotSize"),price:this.safeNumber(i,"tickSize")},limits:{leverage:{min:void 0,max:void 0},amount:{min:u,max:g},price:{min:v,max:l},cost:{min:this.safeNumber(i,"minNotional"),max:this.safeNumber(i,"maxNotional")}},created:this.safeInteger(i,"tradingStartTime"),info:i})}return m}async fetchTime(e={}){const t={requestTime:this.milliseconds()},i=await this.v1PublicGetExchangeInfo(this.extend(t,e)),s=this.safeDict(i,"data",{});return this.safeInteger(s,"requestReceiveAt")}async fetchAccounts(e={}){let t,i=this.safeString(this.options,"account-group");if(void 0===i){t=await this.v1PrivateGetInfo(e);const s=this.safeDict(t,"data",{});i=this.safeString(s,"accountGroup"),this.options["account-group"]=i}return[{id:i,type:void 0,code:void 0,info:t}]}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeList(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeCurrencyCode(this.safeString(s,"asset")),a=this.account();a.free=this.safeString(s,"availableBalance"),a.total=this.safeString(s,"totalBalance"),t[r]=a}return this.safeBalance(t)}parseMarginBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeList(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeCurrencyCode(this.safeString(s,"asset")),o=this.account();o.free=this.safeString(s,"availableBalance"),o.total=this.safeString(s,"totalBalance");const n=this.safeString(s,"borrowed"),d=this.safeString(s,"interest");o.debt=a.Y.stringAdd(n,d),t[r]=o}return this.safeBalance(t)}parseSwapBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeDict(e,"data",{}),s=this.safeList(i,"collaterals",[]);for(let e=0;e<s.length;e++){const i=s[e],r=this.safeCurrencyCode(this.safeString(i,"asset")),a=this.account();a.total=this.safeString(i,"balance"),t[r]=a}return this.safeBalance(t)}async fetchBalance(e={}){let t,i;await this.loadMarkets(),await this.loadAccounts(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[i,e]=this.handleMarginModeAndParams("fetchBalance",e);t=this.safeBool(e,"margin",!1)||"cross"===i?"margin":t,e=this.omit(e,"margin");const s=this.safeDict(this.options,"accountsByType",{}),a=this.safeString(s,t,"cash"),o=this.safeDict(this.accounts,0,{}),n={"account-group":this.safeString(o,"id")};if("isolated"===i&&"swap"!==t)throw new r.BadRequest(this.id+" does not supported isolated margin trading");let d;if("cash"!==a&&"margin"!==a||(n["account-category"]=a),"spot"===t||"margin"===t)d=await this.v1PrivateAccountCategoryGetBalance(this.extend(n,e));else{if("swap"!==t)throw new r.NotSupported(this.id+" fetchBalance() is not currently supported for "+t+" markets");d=await this.v2PrivateAccountGroupGetFuturesPosition(this.extend(n,e))}return"swap"===t?this.parseSwapBalance(d):"margin"===t?this.parseMarginBalance(d):this.parseBalance(d)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id},r=await this.v1PublicGetDepth(this.extend(s,i)),a=this.safeDict(r,"data",{}),o=this.safeDict(a,"data",{}),n=this.safeInteger(o,"ts"),d=this.parseOrderBook(o,e,n);return d.nonce=this.safeInteger(o,"seqnum"),d}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s="spot"===this.safeString(e,"type")?"/":void 0,r=this.safeSymbol(i,t,s),a=this.safeString(e,"close"),o=this.safeList(e,"bid",[]),n=this.safeList(e,"ask",[]),d=this.safeString(e,"open");return this.safeTicker({symbol:r,timestamp:undefined,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(o,0),bidVolume:this.safeString(o,1),ask:this.safeString(n,0),askVolume:this.safeString(n,1),vwap:void 0,open:d,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetTicker(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};let s,r,a;if(void 0!==e){const t=this.safeString(e,0);s=this.market(t);const r=this.marketIds(e);i.symbol=r.join(",")}[r,t]=this.handleMarketTypeAndParams("fetchTickers",s,t),a="spot"===r?await this.v1PublicGetTicker(this.extend(i,t)):await this.v2PublicGetFuturesTicker(this.extend(i,t));const o=this.safeList(a,"data",[]);return Array.isArray(o)?this.parseTickers(o,e):this.parseTickers([o],e)}parseOHLCV(e,t=void 0){const i=this.safeDict(e,"data",{});return[this.safeInteger(i,"ts"),this.safeNumber(i,"o"),this.safeNumber(i,"h"),this.safeNumber(i,"l"),this.safeNumber(i,"c"),this.safeNumber(i,"v")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,interval:this.safeString(this.timeframes,t,t)},n=this.parseTimeframe(t),d=this.safeDict(this.options,"fetchOHLCV",{}),h=this.safeInteger(d,"limit",500),c=this.safeInteger(r,"until");if(void 0!==i){o.from=i,s=void 0===s?h:Math.min(s,h);const e=this.sum(i,s*n*1e3,1);o.to=void 0!==c?Math.min(e,c+1):e}else void 0!==c?(o.to=c+1,s=void 0===s?h:Math.min(s,h),o.from=c-s*n*1e3):void 0!==s&&(o.n=s);r=this.omit(r,"until");const l=await this.v1PublicGetBarhist(this.extend(o,r)),u=this.safeList(l,"data",[]);return this.parseOHLCVs(u,a,t,i,s)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString2(e,"price","p"),r=this.safeString(e,"q"),a=this.safeBool(e,"bm",!1)?"sell":"buy";return t=this.safeMarket(void 0,t),this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,id:void 0,order:void 0,type:void 0,takerOrMaker:void 0,side:a,price:s,amount:r,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.n=i);const o=await this.v1PublicGetTrades(this.extend(a,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"data",[]);return this.parseTrades(d,r,t,i)}parseOrderStatus(e){return this.safeString({PendingNew:"open",New:"open",PartiallyFilled:"open",Filled:"closed",Canceled:"canceled",Rejected:"rejected"},e,e)}parseOrder(e,t=void 0){const i=this.parseOrderStatus(this.safeString(e,"status")),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t,"/");let a=this.safeInteger2(e,"timestamp","sendingTime");const o=this.safeInteger(e,"lastExecTime");void 0===a&&(a=o);const n=this.safeString(e,"price"),d=this.safeString(e,"orderQty"),h=this.safeString(e,"avgPx"),c=this.safeStringN(e,["cumFilledQty","cumQty","fillQty"]),l=this.safeString(e,"orderId");let u=this.safeString(e,"id");void 0!==u&&u.length<1&&(u=void 0);const f=this.safeStringLower(e,"orderType");let p=f;void 0!==f&&("stoplimit"===f&&(p="limit"),"stopmarket"===f&&(p="market"));const m=this.safeStringLower(e,"side"),g=this.safeNumber2(e,"cumFee","fee");let v;if(void 0!==g){const t=this.safeString(e,"feeAsset");v={cost:g,currency:this.safeCurrencyCode(t)}}const y=this.omitZero(this.safeString(e,"stopPrice"));let w;const b=this.safeString(e,"execInst");let k;return"reduceOnly"===b&&(w=!0),"Post"===b&&(k=!0),this.safeOrder({info:e,id:l,clientOrderId:u,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:o,symbol:r,type:p,timeInForce:void 0,postOnly:k,reduceOnly:w,side:m,price:n,triggerPrice:y,amount:d,cost:void 0,average:h,filled:c,remaining:void 0,status:i,fee:v,trades:void 0},t)}async fetchTradingFees(e={}){await this.loadMarkets(),await this.loadAccounts();const t=this.safeDict(this.accounts,0,{}),i={"account-group":this.safeString(t,"id")},s=await this.v1PrivateAccountGroupGetSpotFee(this.extend(i,e)),r=this.safeDict(s,"data",{}),a=this.safeList(r,"fees",[]),o={};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i,void 0,"/"),r=this.safeDict(t,"fee",{});o[s]={info:t,symbol:s,maker:this.safeNumber(r,"maker"),taker:this.safeNumber(r,"taker"),percentage:void 0,tierBased:void 0}}return o}createOrderRequest(e,t,i,s,r=void 0,a={}){const o=this.market(e);let n,d;[n,a]=this.handleMarginModeAndParams("createOrderRequest",a),[d,a]=this.handleMarketTypeAndParams("createOrderRequest",o,a);const h=this.safeDict(this.options,"accountsByType",{});let c=this.safeString(h,d,"cash");void 0!==n&&(c="margin");const l=this.safeDict(this.accounts,0,{}),u=this.safeString(l,"id"),f=this.safeString2(a,"clientOrderId","id"),p={"account-group":u,"account-category":c,symbol:o.id,time:this.milliseconds(),orderQty:this.amountToPrecision(e,s),orderType:t,side:i},m="market"===t||"stop_market"===t,g="limit"===t||"stop_limit"===t,v=this.safeString(a,"timeInForce"),y=this.isPostOnly(m,!1,a),w=this.safeBool(a,"reduceOnly",!1),b=this.safeString2(a,"triggerPrice","stopPrice");return g&&(p.orderPrice=this.priceToPrecision(e,r)),"IOC"===v&&(p.timeInForce="IOC"),"FOK"===v&&(p.timeInForce="FOK"),y&&(p.postOnly=!0),void 0!==b&&(p.stopPrice=this.priceToPrecision(e,b),g?p.orderType="stop_limit":m&&(p.orderType="stop_market")),void 0!==f&&(p.id=f),o.spot?void 0!==c&&(p.category=c):(p["account-category"]=c,w&&(p.execInst="ReduceOnly"),y&&(p.execInst="Post")),a=this.omit(a,["reduceOnly","triggerPrice"]),this.extend(p,a)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets(),await this.loadAccounts();const o=this.market(e),n=this.createOrderRequest(e,t,i,s,r,a);let d;d=o.swap?await this.v2PrivateAccountGroupPostFuturesOrder(n):await this.v1PrivateAccountCategoryPostOrder(n);const h=this.safeDict(d,"data",{}),c=this.safeDict2(h,"order","info",{});return this.parseOrder(c,o)}async createOrders(e,t={}){await this.loadMarkets(),await this.loadAccounts();const i=[];let s,a;for(let t=0;t<e.length;t++){const o=e[t],n=this.safeString(o,"symbol");if(void 0===s)s=n;else if(s!==n)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const d=this.safeString(o,"type"),h=this.safeString(o,"side"),c=this.safeNumber(o,"amount"),l=this.safeNumber(o,"price"),u=this.safeDict(o,"params",{}),f=this.handleMarginModeAndParams("createOrders",u)[0];if(void 0!==f)if(void 0===a)a=f;else if(a!==f)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same margin mode (isolated or cross)");const p=this.createOrderRequest(n,d,h,c,l,u);i.push(p)}const o=this.market(s),n=this.safeDict(this.options,"accountsByType",{});let d=this.safeString(n,o.type,"cash");void 0!==a&&(d="margin");const h=this.safeDict(this.accounts,0,{}),c=this.safeString(h,"id"),l={};let u;if(o.swap)throw new r.NotSupported(this.id+" createOrders() is not currently supported for swap markets on ascendex");l["account-group"]=c,l["account-category"]=d,l.orders=i,u=await this.v1PrivateAccountCategoryPostOrderBatch(l);const f=this.safeDict(u,"data",{}),p=this.safeList(f,"info",[]);return this.parseOrders(p,o)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),await this.loadAccounts(),void 0!==t&&(s=this.market(t));const[a,o]=this.handleMarketTypeAndParams("fetchOrder",s,i),n=this.safeDict(this.options,"accountsByType",{}),d=this.safeString(n,a,"cash"),h=this.safeDict(this.accounts,0,{}),c={"account-group":this.safeString(h,"id"),"account-category":d,orderId:e};let l;if("spot"===a||"margin"===a)l=await this.v1PrivateAccountCategoryGetOrderStatus(this.extend(c,o));else{if("swap"!==a)throw new r.NotSupported(this.id+" fetchOrder() is not currently supported for "+a+" markets");c["account-category"]=d,l=await this.v2PrivateAccountGroupGetFuturesOrderStatus(this.extend(c,o))}const u=this.safeDict(l,"data",{});return this.parseOrder(u,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),await this.loadAccounts(),void 0!==e&&(a=this.market(e),e=a.symbol);const o=this.safeDict(this.accounts,0,{}),n=this.safeString(o,"id"),[d,h]=this.handleMarketTypeAndParams("fetchOpenOrders",a,s),c=this.safeDict(this.options,"accountsByType",{}),l=this.safeString(c,d,"cash"),u={"account-group":n,"account-category":l};let f;if("spot"===d||"margin"===d)f=await this.v1PrivateAccountCategoryGetOrderOpen(this.extend(u,h));else{if("swap"!==d)throw new r.NotSupported(this.id+" fetchOpenOrders() is not currently supported for "+d+" markets");u["account-category"]=l,f=await this.v2PrivateAccountGroupGetFuturesOrderOpen(this.extend(u,h))}const p=this.safeList(f,"data",[]);if("futures"===l)return this.parseOrders(p,a,t,i);const m=[];for(let e=0;e<p.length;e++){const t=this.parseOrder(p[e],a);m.push(t)}return this.filterBySymbolSinceLimit(m,e,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),await this.loadAccounts();const a=this.safeDict(this.accounts,0,{}),o=this.safeString(a,"id"),n={};let d;void 0!==e&&(d=this.market(e),n.symbol=d.id);const[h,c]=this.handleMarketTypeAndParams("fetchClosedOrders",d,s),l=this.safeDict(this.options,"fetchClosedOrders",{}),u=this.safeString(l,"method","v2PrivateDataGetOrderHist"),f=this.getSupportedMapping(h,{spot:u,margin:u,swap:"v2PrivateAccountGroupGetFuturesOrderHistCurrent"});void 0!==t&&(n.startTime=t);const p=this.safeString(s,"until");void 0!==p&&(n.endTime=p);const m=this.safeDict(this.options,"accountsByType",{}),g=this.safeString(m,h,"cash");let v;if("v1PrivateAccountCategoryGetOrderHistCurrent"===f)n["account-group"]=o,n["account-category"]=g,void 0!==i&&(n.limit=i),v=await this.v1PrivateAccountCategoryGetOrderHistCurrent(this.extend(n,c));else if("v2PrivateDataGetOrderHist"===f)n.account=g,void 0!==i&&(n.limit=i),v=await this.v2PrivateDataGetOrderHist(this.extend(n,c));else{if("v2PrivateAccountGroupGetFuturesOrderHistCurrent"!==f)throw new r.NotSupported(this.id+" fetchClosedOrders() is not currently supported for "+h+" markets");n["account-group"]=o,n["account-category"]=g,void 0!==i&&(n.pageSize=i),v=await this.v2PrivateAccountGroupGetFuturesOrderHistCurrent(this.extend(n,c))}let y=this.safeList(v,"data",[]);return Array.isArray(y)||(y=this.safeList(y,"data",[])),this.parseOrders(y,d,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets(),await this.loadAccounts();const s=this.market(t),[a,o]=this.handleMarketTypeAndParams("cancelOrder",s,i),n=this.safeDict(this.options,"accountsByType",{}),d=this.safeString(n,a,"cash"),h=this.safeDict(this.accounts,0,{}),c={"account-group":this.safeString(h,"id"),"account-category":d,symbol:s.id,time:this.milliseconds(),id:"foobar"},l=this.safeString2(i,"clientOrderId","id");let u;if(void 0===l?c.orderId=e:(c.id=l,i=this.omit(i,["clientOrderId","id"])),"spot"===a||"margin"===a)u=await this.v1PrivateAccountCategoryDeleteOrder(this.extend(c,o));else{if("swap"!==a)throw new r.NotSupported(this.id+" cancelOrder() is not currently supported for "+a+" markets");c["account-category"]=d,u=await this.v2PrivateAccountGroupDeleteFuturesOrder(this.extend(c,o))}const f=this.safeDict(u,"data",{}),p=this.safeDict2(f,"order","info",{});return this.parseOrder(p,s)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets(),await this.loadAccounts(),void 0!==e&&(i=this.market(e));const[s,a]=this.handleMarketTypeAndParams("cancelAllOrders",i,t),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,s,"cash"),d=this.safeDict(this.accounts,0,{}),h={"account-group":this.safeString(d,"id"),"account-category":n,time:this.milliseconds()};let c;if(void 0!==e&&(h.symbol=i.id),"spot"===s||"margin"===s)c=await this.v1PrivateAccountCategoryDeleteOrderAll(this.extend(h,a));else{if("swap"!==s)throw new r.NotSupported(this.id+" cancelAllOrders() is not currently supported for "+s+" markets");h["account-category"]=n,c=await this.v2PrivateAccountGroupDeleteFuturesOrderAll(this.extend(h,a))}return this.safeOrder({info:c})}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"tagId"),r=this.safeString(e,s);this.checkAddress(i);const a=void 0===t?void 0:t.code,o=this.safeString(e,"blockchain");return{info:e,currency:a,network:this.networkIdToCode(o,a),address:i,tag:r}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s=this.safeString2(t,"network","chainName"),a=this.networkCodeToId(s);t=this.omit(t,["chainName"]);const o={asset:i.id,blockchain:a},n=await this.v1PrivateGetWalletDepositAddress(this.extend(o,t)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"address",[]);let c;if(h.length>1){const e=this.indexBy(h,"chainName");if(void 0===a){const t=Object.keys(e).join(", ");throw new r.ArgumentsRequired(this.id+" fetchDepositAddress() returned more than one address, a chainName parameter is required, one of "+t)}c=this.safeDict(e,a,{})}else c=this.safeDict(h,0,{});const l=this.parseDepositAddress(c,i);return this.extend(l,{info:n})}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactions(e,t,i,this.extend({txType:"deposit"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactions(e,t,i,this.extend({txType:"withdrawal"},s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset=a.id),void 0!==t&&(r.startTs=t),void 0!==i&&(r.pageSize=i);const o=await this.v1PrivateGetWalletTransactions(this.extend(r,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}parseTransactionStatus(e){return this.safeString({reviewing:"pending",pending:"pending",confirmed:"ok",rejected:"rejected"},e,e)}parseTransaction(e,t=void 0){const i=this.safeDict(e,"destAddress",{}),s=this.safeString(i,"address"),r=this.safeString(i,"destTag"),o=this.safeInteger(e,"time"),n=this.safeString(e,"asset");let d=this.safeString(e,"amount");const h=this.safeString(e,"commission");d=a.Y.stringSub(d,h);const c=this.safeCurrencyCode(n,t);return{info:e,id:this.safeString(e,"requestId"),txid:this.safeString(e,"networkTransactionId"),type:this.safeString(e,"transactionType"),currency:c,network:void 0,amount:this.parseNumber(d),status:this.parseTransactionStatus(this.safeString(e,"status")),timestamp:o,datetime:this.iso8601(o),address:s,addressFrom:void 0,addressTo:s,tag:r,tagFrom:void 0,tagTo:r,updated:void 0,comment:void 0,fee:{currency:c,cost:this.parseNumber(h),rate:void 0},internal:!1}}async fetchPositions(e=void 0,t={}){await this.loadMarkets(),await this.loadAccounts();const i=this.safeDict(this.accounts,0,{}),s={"account-group":this.safeString(i,"id")},r=await this.v2PrivateAccountGroupGetFuturesPosition(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeList(a,"contracts",[]),n=[];for(let e=0;e<o.length;e++)n.push(this.parsePosition(o[e]));return e=this.marketSymbols(e),this.filterByArrayPositions(n,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);let s=this.safeString(e,"buyOpenOrderNotional");a.Y.stringEq(s,"0")&&(s=this.safeString(e,"sellOpenOrderNotional"));const r="crossed"===this.safeString(e,"marginType")?"cross":"isolated";let o;return"isolated"===r&&(o=this.safeString(e,"isolatedMargin")),this.safePosition({info:e,id:void 0,symbol:t.symbol,notional:this.parseNumber(s),marginMode:r,liquidationPrice:void 0,entryPrice:this.safeNumber(e,"avgOpenPrice"),unrealizedPnl:this.safeNumber(e,"unrealizedPnl"),percentage:void 0,contracts:this.safeNumber(e,"position"),contractSize:this.safeNumber(t,"contractSize"),markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,side:this.safeStringLower(e,"side"),hedged:void 0,timestamp:void 0,datetime:void 0,lastUpdateTimestamp:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:o,initialMargin:void 0,initialMarginPercentage:void 0,leverage:this.safeInteger(e,"leverage"),marginRatio:void 0,stopLossPrice:this.safeNumber(e,"stopLossPrice"),takeProfitPrice:this.safeNumber(e,"takeProfitPrice")})}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeInteger(e,"time"),a=this.safeNumber(e,"fundingRate"),o=this.safeInteger(e,"nextFundingTime");return{info:e,symbol:s,markPrice:this.safeNumber(e,"markPrice"),indexPrice:this.safeNumber(e,"indexPrice"),interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:r,datetime:this.iso8601(r),previousFundingRate:void 0,nextFundingRate:void 0,previousFundingTimestamp:void 0,nextFundingTimestamp:void 0,previousFundingDatetime:void 0,nextFundingDatetime:void 0,fundingRate:a,fundingTimestamp:o,fundingDatetime:this.iso8601(o),interval:void 0}}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v2PublicGetFuturesPricingData(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"contracts",[]);return this.parseFundingRates(r,e)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets(),await this.loadAccounts();const r=this.market(e),o=this.safeDict(this.accounts,0,{}),n=this.safeString(o,"id");t=this.amountToPrecision(e,t);const d={"account-group":n,symbol:r.id,amount:t},h=await this.v2PrivateAccountGroupPostFuturesIsolatedPositionMargin(this.extend(d,s));return"reduce"===i&&(t=a.Y.stringAbs(t)),this.extend(this.parseMarginModification(h,r),{amount:this.parseNumber(t),type:i})}parseMarginModification(e,t=void 0){const i="0"===this.safeString(e,"code")?"ok":"failed";return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:t.quote,status:i,timestamp:void 0,datetime:void 0}}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,-t,"reduce",i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<1||e>100)throw new r.BadRequest(this.id+" leverage should be between 1 and 100");await this.loadMarkets(),await this.loadAccounts();const s=this.market(t);if(!s.swap)throw new r.BadSymbol(this.id+" setLeverage() supports swap contracts only");const a=this.safeDict(this.accounts,0,{}),o={"account-group":this.safeString(a,"id"),symbol:s.id,leverage:e};return await this.v2PrivateAccountGroupPostFuturesLeverage(this.extend(o,i))}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("cross"===(e=e.toLowerCase())&&(e="crossed"),"isolated"!==e&&"crossed"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");await this.loadMarkets(),await this.loadAccounts();const s=this.market(t),a=this.safeDict(this.accounts,0,{}),o={"account-group":this.safeString(a,"id"),symbol:s.id,marginType:e};if(!s.swap)throw new r.BadSymbol(this.id+" setMarginMode() supports swap contracts only");return await this.v2PrivateAccountGroupPostFuturesMarginType(this.extend(o,i))}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.v2PublicGetFuturesContract(t),s=this.safeList(i,"data",[]);return e=this.marketSymbols(e),this.parseLeverageTiers(s,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeList(e,"marginRequirements",[]),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=[];for(let e=0;e<i.length;e++){const o=i[e],n=this.safeString(o,"initialMarginRate");r.push({tier:this.sum(e,1),symbol:this.safeSymbol(s,t,void 0,"contract"),currency:t.quote,minNotional:this.safeNumber(o,"positionNotionalLowerBound"),maxNotional:this.safeNumber(o,"positionNotionalUpperBound"),maintenanceMarginRate:this.safeNumber(o,"maintenanceMarginRate"),maxLeverage:this.parseNumber(a.Y.stringDiv("1",n)),info:o})}return r}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"blockChain",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};for(let e=0;e<s;e++){const a=i[e],o=this.safeString(a,"chainName"),n=this.safeString(t,"code"),d=this.networkIdToCode(o,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(a,"withdrawFee"),percentage:!1}},1===s&&(r.withdraw.fee=this.safeNumber(a,"withdrawFee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.v2PublicGetAssets(t),s=this.safeList(i,"data");return this.parseDepositWithdrawFees(s,e,"assetCode")}async transfer(e,t,i,s,a={}){await this.loadMarkets(),await this.loadAccounts();const o=this.safeDict(this.accounts,0,{}),n=this.safeString(o,"id"),d=this.currency(e),h=this.safeDict(this.options,"accountsByType",{}),c=this.safeString(h,i,i),l=this.safeString(h,s,s);if("cash"!==c&&"cash"!==l)throw new r.ExchangeError(this.id+" transfer() only supports direct balance transfer between spot and swap, spot and margin");const u={"account-group":n,amount:this.currencyToPrecision(e,t),asset:d.id,fromAccount:c,toAccount:l},f=await this.v1PrivateAccountGroupPostTransfer(this.extend(u,a)),p=this.safeDict(this.options,"transfer",{}),m=this.safeBool(p,"fillResponseFromRequest",!0),g=this.parseTransfer(f,d);return m&&(g.fromAccount=i,g.toAccount=s,g.amount=t,g.currency=e),g}parseTransfer(e,t=void 0){const i=this.safeString(e,"code");return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.parseTransferStatus(i)}}parseTransferStatus(e){return"0"===e?"ok":"failed"}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),await this.loadAccounts();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingHistory","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchFundingHistory",e,t,i,s,"page",25);const a=this.safeDict(this.accounts,0,{}),o={"account-group":this.safeString(a,"id")};let n;void 0!==e&&(n=this.market(e),o.symbol=n.id),void 0!==i&&(o.pageSize=i);const d=await this.v2PrivateAccountGroupGetFuturesFundingPayments(this.extend(o,s)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"data",[]);return this.parseIncomes(c,n,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"timestamp");return{info:e,symbol:this.safeSymbol(i,t,"-","swap"),code:"USDT",timestamp:s,datetime:this.iso8601(s),id:void 0,amount:this.safeNumber(e,"paymentInUSDT")}}async fetchMarginModes(e=void 0,t={}){await this.loadMarkets(),await this.loadAccounts();const i=this.safeDict(this.accounts,0,{}),s={"account-group":this.safeString(i,"id")},r=await this.v2PrivateAccountGroupGetFuturesPosition(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeList(a,"contracts",[]);return this.parseMarginModes(o,e,"symbol")}parseMarginMode(e,t=void 0){const i=this.safeString(e,"symbol"),s="crossed"===this.safeString(e,"marginType")?"cross":"isolated";return{info:e,symbol:this.safeSymbol(i,t),marginMode:s}}async fetchLeverages(e=void 0,t={}){await this.loadMarkets(),await this.loadAccounts();const i=this.safeDict(this.accounts,0,{}),s={"account-group":this.safeString(i,"id")},r=await this.v2PrivateAccountGroupGetFuturesPosition(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeList(a,"contracts",[]);return this.parseLeverages(o,e,"symbol")}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"leverage"),r="crossed"===this.safeString(e,"marginType")?"cross":"isolated";return{info:e,symbol:this.safeSymbol(i,t),marginMode:r,longLeverage:s,shortLeverage:s}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=t[0],d=t[1],h=this.safeString(t,2);let c="";const l="accountCategory"===h;(l||"accountGroup"===h)&&(c+=this.implodeParams("/{account-group}",s),s=this.omit(s,"account-group"));let u=this.implodeParams(e,s);if(c+="/api/pro/","v2"===o?u="data"===h?"data/"+o+"/"+u:o+"/"+u:c+=o+"/",l&&(c+=this.implodeParams("{account-category}/",s)),s=this.omit(s,"account-category"),c+=u,("v1"===o&&"cash/balance"===u||"margin/balance"===u)&&(u="balance"),"v1"===o&&"spot/fee"===u&&(u="fee"),u.indexOf("subuser")>=0){const e=u.split("/");u=e[2]}if(s=this.omit(s,this.extractParams(e)),"public"===d)Object.keys(s).length&&(c+="?"+this.urlencode(s));else{this.checkRequiredCredentials();const e=this.milliseconds().toString(),t=e+"+"+u,o=this.hmac(this.encode(t),this.encode(this.secret),n.s,"base64");r={"x-auth-key":this.apiKey,"x-auth-timestamp":e,"x-auth-signature":o},"GET"===i?Object.keys(s).length&&(c+="?"+this.urlencode(s)):(r["Content-Type"]="application/json",a=this.json(s))}return c=this.urls.api.rest+c,{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"message");if(void 0!==c&&"0"!==c||void 0!==l){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bequant",name:"Bequant",countries:["MT"],pro:!0,urls:{logo:"https://github.com/user-attachments/assets/0583ef1f-29fe-4b7c-8189-63565a0e2867",api:{public:"https://api.bequant.io/api/3",private:"https://api.bequant.io/api/3"},www:"https://bequant.io",doc:["https://api.bequant.io/"],fees:["https://bequant.io/fees-and-limits"],referral:"https://bequant.io/referral/dd104e3bee7634ec"}})}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bigone",name:"BigONE",countries:["CN"],version:"v3",rateLimit:20,has:{CORS:void 0,spot:!0,margin:!1,swap:void 0,future:void 0,option:!1,cancelAllOrders:!0,cancelOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createPostOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFees:!1,fetchWithdrawals:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"min1","5m":"min5","15m":"min15","30m":"min30","1h":"hour1","3h":"hour3","4h":"hour4","6h":"hour6","12h":"hour12","1d":"day1","1w":"week1","1M":"month1"},hostname:"big.one",urls:{logo:"https://github.com/user-attachments/assets/4e5cfd53-98cc-4b90-92cd-0d7b512653d1",api:{public:"https://{hostname}/api/v3",private:"https://{hostname}/api/v3/viewer",contractPublic:"https://{hostname}/api/contract/v2",contractPrivate:"https://{hostname}/api/contract/v2",webExchange:"https://{hostname}/api/"},www:"https://big.one",doc:"https://open.big.one/docs/api.html",fees:"https://bigone.zendesk.com/hc/en-us/articles/115001933374-BigONE-Fee-Policy",referral:"https://b1.run/users/new?code=D3LLBVFT"},api:{public:{get:["ping","asset_pairs","asset_pairs/{asset_pair_name}/depth","asset_pairs/{asset_pair_name}/trades","asset_pairs/{asset_pair_name}/ticker","asset_pairs/{asset_pair_name}/candles","asset_pairs/tickers"]},private:{get:["accounts","fund/accounts","assets/{asset_symbol}/address","orders","orders/{id}","orders/multi","trades","withdrawals","deposits"],post:["orders","orders/{id}/cancel","orders/cancel","withdrawals","transfer"]},contractPublic:{get:["symbols","instruments","depth@{symbol}/snapshot","instruments/difference","instruments/prices"]},contractPrivate:{get:["accounts","orders/{id}","orders","orders/opening","orders/count","orders/opening/count","trades","trades/count"],post:["orders","orders/batch"],put:["positions/{symbol}/margin","positions/{symbol}/risk-limit"],delete:["orders/{id}","orders/batch"]},webExchange:{get:["v3/assets"]}},fees:{trading:{maker:this.parseNumber("0.001"),taker:this.parseNumber("0.001")},funding:{withdraw:{}}},options:{createMarketBuyOrderRequiresPrice:!0,accountsByType:{spot:"SPOT",fund:"FUND",funding:"FUND",future:"CONTRACT",swap:"CONTRACT"},transfer:{fillResponseFromRequest:!0},exchangeMillisecondsCorrection:-100,fetchCurrencies:{webApiEnable:!0,webApiRetries:5,webApiMuteFailure:!0},defaultNetwork:"ERC20",defaultNetworks:{USDT:"TRC20"},networks:{ABBC:"ABBC",ACA:"Acala",AE:"Aeternity",ALGO:"Algorand",APT:"Aptos",AR:"Arweave",ASTR:"Astar",AVAXC:"Avax",AVAXX:"AvaxChain",BEAM:"Beam",BEP20:"BinanceSmartChain",BITCI:"BitciChain",BTC:"Bitcoin",BCH:"BitcoinCash",BSV:"BitcoinSV",CELO:"Celo",CKKB:"CKB",ATOM:"Cosmos",CRC20:"CRO",DASH:"Dash",DOGE:"Dogecoin",XEC:"ECash",EOS:"EOS",ETH:"Ethereum",ETC:"EthereumClassic",ETHW:"EthereumPow",FTM:"Fantom",FIL:"Filecoin",FSN:"Fusion",GRIN:"Grin",ONE:"Harmony",HRC20:"Hecochain",HBAR:"Hedera",HNT:"Helium",ZEN:"Horizen",IOST:"IOST",IRIS:"IRIS",KLAY:"Klaytn",KSM:"Kusama",LTC:"Litecoin",XMR:"Monero",GLMR:"Moonbeam",NEAR:"Near",NEO:"Neo",NEON3:"NeoN3",OASIS:"Oasis",OKC:"Okexchain",ONT:"Ontology",OPTIMISM:"Optimism",DOT:"Polkadot",MATIC:"Polygon",QTUM:"Qtum",REI:"REI",XRP:"Ripple",SGB:"SGB",SDN:"Shiden",SOL:"Solana",XLM:"Stellar",TERA:"Tera",XTZ:"Tezos",TRC20:"Tron",VET:"Vechain",VSYS:"VSystems",WAX:"WAX",ZEC:"Zcash"}},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!0,marketBuyByCost:!0,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:200,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:200,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:200,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:200,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:500}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{triggerPriceType:{mark:!0,index:!0,last:!0}},fetchOrders:{daysBack:1e5,untilDays:1e5},fetchClosedOrders:{daysBack:1e5,untilDays:1e5}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb,exceptions:{exact:{10001:r.BadRequest,10005:r.ExchangeError,"Amount's scale must greater than AssetPair's base scale":r.InvalidOrder,"Price mulit with amount should larger than AssetPair's min_quote_value":r.InvalidOrder,10007:r.BadRequest,10011:r.ExchangeError,10013:r.BadSymbol,10014:r.InsufficientFunds,10403:r.PermissionDenied,10429:r.RateLimitExceeded,40004:r.AuthenticationError,40103:r.AuthenticationError,40104:r.AuthenticationError,40301:r.PermissionDenied,40302:r.ExchangeError,40601:r.ExchangeError,40602:r.ExchangeError,40603:r.InsufficientFunds,40604:r.InvalidOrder,40605:r.InvalidOrder,40120:r.InvalidOrder,40121:r.InvalidOrder,60100:r.BadSymbol},broad:{}},commonCurrencies:{CRE:"Cybereits",FXT:"FXTTOKEN",FREE:"FreeRossDAO",MBN:"Mobilian Coin",ONE:"BigONE Token"}})}async fetchCurrencies(e={}){const t=await this.fetchWebEndpoint("fetchCurrencies","webExchangeGetV3Assets",!0);if(void 0===t)return;const i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeCurrencyCode(r),o=this.safeString(t,"name"),n=this.safeBool(t,"is_fiat")?"fiat":"crypto",h={},c=this.safeList(t,"binding_gateways",[]);let l,u,f=this.parsePrecision(this.safeString2(t,"withdrawal_scale","scale"));for(let e=0;e<c.length;e++){const t=c[e],i=this.safeString(t,"gateway_name"),s=this.networkIdToCode(i),r=this.safeBool(t,"is_deposit_enabled"),a=this.safeBool(t,"is_withdrawal_enabled"),o=r&&a,n=this.safeString(t,"min_deposit_amount"),p=this.safeString(t,"min_withdrawal_amount"),m=this.safeString(t,"withdrawal_fee"),g=this.parsePrecision(this.safeString2(t,"withdrawal_scale","scale"));h[s]={id:i,network:s,margin:void 0,deposit:r,withdraw:a,active:o,fee:this.parseNumber(m),precision:this.parseNumber(g),limits:{deposit:{min:n,max:void 0},withdraw:{min:p,max:void 0}},info:t},l=void 0===l||r?r:l,u=void 0===u||a?a:u,f=void 0===f||d.Y.stringGt(f,g)?g:f}s[a]={id:r,code:a,info:t,name:o,type:n,active:void 0,deposit:l,withdraw:u,fee:void 0,precision:this.parseNumber(f),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:h}}return s}async fetchMarkets(e={}){const t=[this.publicGetAssetPairs(e),this.contractPublicGetSymbols(e)],i=await Promise.all(t),s=i[0],r=i[1],a=this.safeList(s,"data",[]),o=[];for(let e=0;e<a.length;e++){const t=a[e],i=this.safeDict(t,"base_asset",{}),s=this.safeDict(t,"quote_asset",{}),r=this.safeString(i,"symbol"),n=this.safeString(s,"symbol"),d=this.safeCurrencyCode(r),h=this.safeCurrencyCode(n);o.push(this.safeMarketStructure({id:this.safeString(t,"name"),uuid:this.safeString(t,"id"),symbol:d+"/"+h,base:d,quote:h,settle:void 0,baseId:r,quoteId:n,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"base_scale"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"quote_scale")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"min_quote_value"),max:this.safeNumber(t,"max_quote_value")}},created:void 0,info:t}))}for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"baseCurrency"),s=this.safeString(t,"quoteCurrency"),a=this.safeString(t,"settleCurrency"),n=this.safeString(t,"symbol"),d=this.safeCurrencyCode(i),h=this.safeCurrencyCode(s),c=this.safeCurrencyCode(a),l=this.safeBool(t,"isInverse");o.push(this.safeMarketStructure({id:n,symbol:d+"/"+h+":"+c,base:d,quote:h,settle:c,baseId:i,quoteId:s,settleId:a,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:this.safeBool(t,"enable"),contract:!0,linear:!l,inverse:l,contractSize:this.safeNumber(t,"multiplier"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"valuePrecision"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"pricePrecision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:this.safeNumber(t,"priceMin"),max:this.safeNumber(t,"priceMax")},cost:{min:this.safeNumber(t,"initialMargin"),max:void 0}},info:t}))}return o}parseTicker(e,t=void 0){const i="asset_pair_name"in e?"spot":"swap",s=this.safeString2(e,"asset_pair_name","symbol"),r=this.safeSymbol(s,t,"-",i),a=this.safeString2(e,"close","latestPrice"),o=this.safeDict(e,"bid",{}),n=this.safeDict(e,"ask",{});return this.safeTicker({symbol:r,timestamp:void 0,datetime:void 0,high:this.safeString2(e,"high","last24hMaxPrice"),low:this.safeString2(e,"low","last24hMinPrice"),bid:this.safeString(o,"price"),bidVolume:this.safeString(o,"quantity"),ask:this.safeString(n,"price"),askVolume:this.safeString(n,"quantity"),vwap:void 0,open:this.safeString(e,"open"),close:a,last:a,previousClose:void 0,change:this.safeString2(e,"daily_change","last24hPriceChange"),percentage:void 0,average:void 0,baseVolume:this.safeString2(e,"volume","volume24h"),quoteVolume:this.safeString(e,"volume24hInUsd"),markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e);let s;if([s,t]=this.handleMarketTypeAndParams("fetchTicker",i,t),"spot"===s){const e={asset_pair_name:i.id},s=await this.publicGetAssetPairsAssetPairNameTicker(this.extend(e,t)),r=this.safeDict(s,"data",{});return this.parseTicker(r,i)}{const i=await this.fetchTickers([e],t);return this.safeValue(i,e)}}async fetchTickers(e=void 0,t={}){let i;await this.loadMarkets();const s=this.safeString(e,0);let r;void 0!==s&&(i=this.market(s)),[r,t]=this.handleMarketTypeAndParams("fetchTickers",i,t);const a="spot"===r,o={};let n;if(e=this.marketSymbols(e),a){if(void 0!==e){const t=this.marketIds(e);o.pair_names=t.join(",")}const i=await this.publicGetAssetPairsTickers(this.extend(o,t));n=this.safeList(i,"data",[])}else n=await this.contractPublicGetInstruments(t);const d=this.parseTickers(n,e);return this.filterByArrayTickers(d,"symbol",e)}async fetchTime(e={}){const t=await this.publicGetPing(e),i=this.safeDict(t,"data",{}),s=this.safeInteger(i,"Timestamp");return this.parseToInt(s/1e6)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);let r;if(s.contract){const e={symbol:s.id};return r=await this.contractPublicGetDepthSymbolSnapshot(this.extend(e,i)),this.parseContractOrderBook(r,s.symbol,t)}{const e={asset_pair_name:s.id};void 0!==t&&(e.limit=t),r=await this.publicGetAssetPairsAssetPairNameDepth(this.extend(e,i));const a=this.safeDict(r,"data",{});return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","quantity")}}parseContractBidsAsks(e){const t=Object.keys(e),i=[];for(let s=0;s<t.length;s++){const r=t[s],a=e[r];i.push([this.parseNumber(r),this.parseNumber(a)])}return i}parseContractOrderBook(e,t,i=void 0){const s=this.safeValue(e,"bids"),r=this.safeValue(e,"asks"),a=this.parseContractBidsAsks(s),o=this.parseContractBidsAsks(r);return{symbol:t,bids:this.filterByLimit(this.sortBy(a,0,!0),i),asks:this.filterByLimit(this.sortBy(o,0),i),timestamp:void 0,datetime:void 0,nonce:void 0}}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString2(e,"created_at","inserted_at")),s=this.safeString(e,"price"),r=this.safeString(e,"amount"),a=this.safeString(e,"asset_pair_name");t=this.safeMarket(a,t,"-");let o=this.safeString(e,"side");const n=this.safeString(e,"taker_side");let d;void 0!==n&&void 0!==o&&"SELF_TRADING"!==o&&(d=n===o?"taker":"maker"),void 0===o?o="ASK"===n?"sell":"buy":"BID"===o?o="buy":"ASK"===o&&(o="sell");const h=this.safeString(e,"maker_order_id"),c=this.safeString(e,"taker_order_id");let l;void 0!==h?l=h:void 0!==c&&(l=c);const u={id:this.safeString(e,"id"),timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,order:l,type:"limit",side:o,takerOrMaker:d,price:s,amount:r,cost:void 0,info:e};let f,p;void 0!==d?"buy"===o?"maker"===d?(f=t.base,p=t.quote):(f=t.quote,p=t.base):"maker"===d?(f=t.quote,p=t.base):(f=t.base,p=t.quote):"SELF_TRADING"===o&&("BID"===n?(f=t.quote,p=t.base):"ASK"===n&&(f=t.base,p=t.quote));const m=this.safeString(e,"maker_fee"),g=this.safeString(e,"taker_fee");return void 0!==m?void 0!==g?u.fees=[{cost:m,currency:f},{cost:g,currency:p}]:u.fee={cost:m,currency:f}:u.fee=void 0!==g?{cost:g,currency:p}:void 0,this.safeTrade(u,t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e);if(a.contract)throw new r.BadRequest(this.id+" fetchTrades () can only fetch trades for spot markets");const o={asset_pair_name:a.id},n=await this.publicGetAssetPairsAssetPairNameTrades(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"time")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e);if(o.contract)throw new r.BadRequest(this.id+" fetchOHLCV () can only fetch ohlcvs for spot markets");const n=this.safeInteger(a,"until"),d=void 0!==n,h=void 0!==i;void 0===s&&(s=h&&d?500:100);const c={asset_pair_name:o.id,period:this.safeString(this.timeframes,t,t),limit:s};if(h){const e=this.parseTimeframe(t),r=this.sum(i,s*e*1e3);c.time=d?this.iso8601(Math.min(r,n+1)):this.iso8601(r)}else d&&(c.time=this.iso8601(n+1));a=this.omit(a,"until");const l=await this.publicGetAssetPairsAssetPairNameCandles(this.extend(c,a)),u=this.safeList(l,"data",[]);return this.parseOHLCVs(u,o,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeList(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"asset_symbol"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.used=this.safeString(s,"locked_balance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(e,"type","");let i;return e=this.omit(e,"type"),i="funding"===t||"fund"===t?await this.privateGetFundAccounts(e):await this.privateGetAccounts(e),this.parseBalance(i)}parseType(e){return this.safeString({STOP_LIMIT:"limit",STOP_MARKET:"market",LIMIT:"limit",MARKET:"market"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"asset_pair_name"),r=this.safeSymbol(s,t,"-"),a=this.parse8601(this.safeString(e,"created_at"));let o=this.safeString(e,"side");o="BID"===o?"buy":"sell";let n=this.safeString(e,"stop_price");d.Y.stringEq(n,"0")&&(n=void 0);let h;this.safeBool(e,"immediate_or_cancel")&&(h="IOC");const c=this.parseType(this.safeString(e,"type")),l=this.safeString(e,"price");let u,f,p;return"market"===c&&"buy"===o?p=this.safeString(e,"filled_amount"):(u=this.safeString(e,"amount"),f=this.safeString(e,"filled_amount")),this.safeOrder({info:e,id:i,clientOrderId:this.safeString(e,"client_order_id"),timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:this.parse8601(this.safeString(e,"updated_at")),symbol:r,type:c,timeInForce:h,postOnly:this.safeBool(e,"post_only"),side:o,price:l,triggerPrice:n,amount:u,cost:p,average:this.safeString(e,"avg_deal_price"),filled:f,remaining:void 0,status:this.parseOrderStatus(this.safeString(e,"state")),fee:void 0,trades:void 0},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),h="buy"===i,c=h?"BID":"ASK";let l=t.toUpperCase();const u="LIMIT"===l,f=this.safeBool(o,"post_only",!1);let p;[p,o]=this.handlePostOnly("MARKET"===l,f,o);const m=this.safeStringN(o,["triggerPrice","stopPrice","stop_price"]),g={asset_pair_name:n.id,side:c,amount:this.amountToPrecision(e,s)};if(u||"STOP_LIMIT"===l){if(g.price=this.priceToPrecision(e,a),u){"IOC"===this.safeString(o,"timeInForce")&&(g.immediate_or_cancel=!0),p&&(g.post_only=!0)}g.amount=this.amountToPrecision(e,s)}else if(h){let t=!0;[t,o]=this.handleOptionAndParams(o,"createOrder","createMarketBuyOrderRequiresPrice",!0);const i=this.safeNumber(o,"cost");if(o=this.omit(o,"cost"),t){if(void 0===a&&void 0===i)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const t=this.numberToString(s),r=this.numberToString(a),o=this.parseToNumeric(d.Y.stringMul(t,r)),n=void 0!==i?i:o;g.amount=this.costToPrecision(e,n)}}else g.amount=this.costToPrecision(e,s)}else g.amount=this.amountToPrecision(e,s);void 0!==m&&(g.stop_price=this.priceToPrecision(e,m),g.operator=h?"GTE":"LTE",u?l="STOP_LIMIT":"MARKET"===l&&(l="STOP_MARKET")),g.type=l;const v=this.safeString(o,"clientOrderId");void 0!==v&&(g.client_order_id=v),o=this.omit(o,["stop_price","stopPrice","triggerPrice","timeInForce","clientOrderId"]);const y=await this.privatePostOrders(this.extend(g,o)),w=this.safeDict(y,"data");return this.parseOrder(w,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privatePostOrdersIdCancel(this.extend(s,i)),a=this.safeDict(r,"data");return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={asset_pair_name:this.market(e).id},s=await this.privatePostOrdersCancel(this.extend(i,t)),r=this.safeDict(s,"data",{}),a=this.safeList(r,"cancelled",[]),o=this.safeList(r,"failed",[]),n=[];for(let e=0;e<a.length;e++){const t=a[e];n.push(this.safeOrder({info:t,id:t,status:"canceled"}))}for(let e=0;e<o.length;e++){const t=o[e];n.push(this.safeOrder({info:t,id:t,status:"failed"}))}return n}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrdersId(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={asset_pair_name:a.id};void 0!==i&&(o.limit=i);const n=await this.privateGetOrders(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseOrders(d,a,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={asset_pair_name:a.id};void 0!==i&&(o.limit=i);const n=await this.privateGetTrades(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseOrderStatus(e){return this.safeString({PENDING:"open",FILLED:"closed",CANCELLED:"canceled"},e)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({state:"PENDING"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({state:"FILLED"},s))}nonce(){const e=1e6*this.safeInteger(this.options,"exchangeMillisecondsCorrection",0);return this.sum(1e3*this.microseconds(),e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const d=this.omit(s,this.extractParams(e));let h=this.implodeHostname(this.urls.api[t])+"/"+this.implodeParams(e,s);if(r={},"public"===t||"webExchange"===t||"contractPublic"===t)Object.keys(d).length&&(h+="?"+this.urlencode(d));else{this.checkRequiredCredentials();const e=this.nonce().toString(),t={type:"OpenAPIV2",sub:this.apiKey,nonce:e},s=(0,o.a)(t,this.encode(this.secret),n.s);r.Authorization="Bearer "+s,"GET"===i?Object.keys(d).length&&(h+="?"+this.urlencode(d)):"POST"===i&&(r["Content-Type"]="application/json",a=this.json(d))}return r["User-Agent"]="ccxt/"+this.id+"-"+this.version,{url:h,method:i,body:a,headers:r}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={asset_symbol:this.currency(e).id},[s,a]=this.handleNetworkCodeAndParams(t),o=await this.privateGetAssetsAssetSymbolAddress(this.extend(i,a)),n=this.safeList(o,"data",[]);if(n.length<1)throw new r.ExchangeError(this.id+" fetchDepositAddress() returned empty address response");const d=this.indexBy(n,"chain"),h=this.selectNetworkIdFromRawNetworks(e,s,d),c=this.safeDict(d,h,{}),l=this.safeString(c,"value"),u=this.safeString(c,"memo");return this.checkAddress(l),{info:o,currency:e,network:this.networkIdToCode(h),address:l,tag:u}}parseTransactionStatus(e){return this.safeString({WITHHOLD:"ok",UNCONFIRMED:"pending",CONFIRMED:"ok",COMPLETED:"ok",PENDING:"pending"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"asset_symbol"),s=this.safeCurrencyCode(i),r=this.safeString(e,"id"),a=this.safeNumber(e,"amount"),o=this.parseTransactionStatus(this.safeString(e,"state")),n=this.parse8601(this.safeString(e,"inserted_at")),d=this.parse8601(this.safeString2(e,"updated_at","completed_at")),h=this.safeString(e,"txid"),c=this.safeString(e,"target_address"),l=this.safeString(e,"memo"),u="customer_id"in e?"withdrawal":"deposit",f=this.safeBool(e,"is_internal");return{info:e,id:r,txid:h,timestamp:n,datetime:this.iso8601(n),network:void 0,addressFrom:void 0,address:void 0,addressTo:c,tagFrom:void 0,tag:l,tagTo:void 0,type:u,amount:a,currency:s,status:o,updated:d,fee:void 0,comment:void 0,internal:f}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset_symbol=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetDeposits(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset_symbol=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetWithdrawals(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.safeString(r,"guid",this.uuid()),c={symbol:a.id,amount:this.currencyToPrecision(e,t),from:n,to:d,guid:h},l=await this.privatePostTransfer(this.extend(c,r)),u=this.parseTransfer(l,a),f=this.safeDict(this.options,"transfer",{});return this.safeBool(f,"fillResponseFromRequest",!0)&&(u.fromAccount=i,u.toAccount=s,u.amount=t,u.id=h),u}parseTransfer(e,t=void 0){const i=this.safeString(e,"code");return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:void 0,amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.parseTransferStatus(i)}}parseTransferStatus(e){return this.safeString({0:"ok"},e,"failed")}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={symbol:a.id,target_address:i,amount:this.currencyToPrecision(e,t)};let n;void 0!==s&&(o.memo=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.gateway_name=this.networkCodeToId(n));const d=await this.privatePostWithdrawals(this.extend(o,r)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,a)}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"message");if("0"!==c&&void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class l extends s.A{describe(){return this.deepExtend(super.describe(),{id:"binance",name:"Binance",countries:["JP","MT"],rateLimit:50,certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!0,option:!0,addMargin:!0,borrowCrossMargin:!0,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createConvertTrade:!0,createDepositAddress:!1,createLimitBuyOrder:!0,createLimitSellOrder:!0,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createMarketSellOrder:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!1,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingPercentOrder:!0,createTriggerOrder:!0,editOrder:!0,editOrders:!0,fetchAccounts:void 0,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!0,fetchCanceledAndClosedOrders:"emulated",fetchCanceledOrders:"emulated",fetchClosedOrder:!1,fetchClosedOrders:"emulated",fetchConvertCurrencies:!0,fetchConvertQuote:!0,fetchConvertTrade:!0,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!0,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingInterval:"emulated",fetchFundingIntervals:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchGreeks:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:"emulated",fetchIsolatedBorrowRates:!0,fetchL3OrderBook:!1,fetchLastPrices:!0,fetchLedger:!0,fetchLedgerEntry:!0,fetchLeverage:"emulated",fetchLeverages:!0,fetchLeverageTiers:!0,fetchLiquidations:!1,fetchLongShortRatio:!1,fetchLongShortRatioHistory:!0,fetchMarginAdjustmentHistory:!0,fetchMarginMode:!0,fetchMarginModes:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMarkPrice:!0,fetchMarkPrices:!0,fetchMyLiquidations:!0,fetchMySettlementHistory:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!0,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!1,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!0,fetchPositions:!0,fetchPositionsHistory:!1,fetchPositionsRisk:!0,fetchPremiumIndexOHLCV:!0,fetchSettlementHistory:!0,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTradingLimits:"emulated",fetchTransactionFee:"emulated",fetchTransactionFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!0,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawAddresses:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!0,repayCrossMargin:!0,repayIsolatedMargin:!0,sandbox:!0,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!0,signIn:!1,transfer:!0,withdraw:!0},timeframes:{"1s":"1s","1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/e9419b93-ccb0-46aa-9bff-c883f096274b",test:{dapiPublic:"https://testnet.binancefuture.com/dapi/v1",dapiPrivate:"https://testnet.binancefuture.com/dapi/v1",dapiPrivateV2:"https://testnet.binancefuture.com/dapi/v2",fapiPublic:"https://testnet.binancefuture.com/fapi/v1",fapiPublicV2:"https://testnet.binancefuture.com/fapi/v2",fapiPublicV3:"https://testnet.binancefuture.com/fapi/v3",fapiPrivate:"https://testnet.binancefuture.com/fapi/v1",fapiPrivateV2:"https://testnet.binancefuture.com/fapi/v2",fapiPrivateV3:"https://testnet.binancefuture.com/fapi/v3",public:"https://testnet.binance.vision/api/v3",private:"https://testnet.binance.vision/api/v3",v1:"https://testnet.binance.vision/api/v1"},api:{sapi:"https://api.binance.com/sapi/v1",sapiV2:"https://api.binance.com/sapi/v2",sapiV3:"https://api.binance.com/sapi/v3",sapiV4:"https://api.binance.com/sapi/v4",dapiPublic:"https://dapi.binance.com/dapi/v1",dapiPrivate:"https://dapi.binance.com/dapi/v1",eapiPublic:"https://eapi.binance.com/eapi/v1",eapiPrivate:"https://eapi.binance.com/eapi/v1",dapiPrivateV2:"https://dapi.binance.com/dapi/v2",dapiData:"https://dapi.binance.com/futures/data",fapiPublic:"https://fapi.binance.com/fapi/v1",fapiPublicV2:"https://fapi.binance.com/fapi/v2",fapiPublicV3:"https://fapi.binance.com/fapi/v3",fapiPrivate:"https://fapi.binance.com/fapi/v1",fapiPrivateV2:"https://fapi.binance.com/fapi/v2",fapiPrivateV3:"https://fapi.binance.com/fapi/v3",fapiData:"https://fapi.binance.com/futures/data",public:"https://api.binance.com/api/v3",private:"https://api.binance.com/api/v3",v1:"https://api.binance.com/api/v1",papi:"https://papi.binance.com/papi/v1"},www:"https://www.binance.com",referral:{url:"https://accounts.binance.com/en/register?ref=D7YA7CLY",discount:.1},doc:["https://developers.binance.com/en"],api_management:"https://www.binance.com/en/usercenter/settings/api-management",fees:"https://www.binance.com/en/fee/schedule"},api:{sapi:{get:{"copyTrading/futures/userStatus":2,"copyTrading/futures/leadSymbol":2,"system/status":.1,accountSnapshot:240,"account/info":.1,"margin/asset":1,"margin/pair":1,"margin/allAssets":.1,"margin/allPairs":.1,"margin/priceIndex":1,"spot/delist-schedule":10,"asset/assetDividend":1,"asset/dribblet":.1,"asset/transfer":.1,"asset/assetDetail":.1,"asset/tradeFee":.1,"asset/ledger-transfer/cloud-mining/queryByPage":4.0002,"asset/convert-transfer/queryByPage":.033335,"asset/wallet/balance":6,"asset/custody/transfer-history":6,"margin/borrow-repay":1,"margin/loan":1,"margin/repay":1,"margin/account":1,"margin/transfer":.1,"margin/interestHistory":.1,"margin/forceLiquidationRec":.1,"margin/order":1,"margin/openOrders":1,"margin/allOrders":20,"margin/myTrades":1,"margin/maxBorrowable":5,"margin/maxTransferable":5,"margin/tradeCoeff":1,"margin/isolated/transfer":.1,"margin/isolated/account":1,"margin/isolated/pair":1,"margin/isolated/allPairs":1,"margin/isolated/accountLimit":.1,"margin/interestRateHistory":.1,"margin/orderList":1,"margin/allOrderList":20,"margin/openOrderList":1,"margin/crossMarginData":{cost:.1,noCoin:.5},"margin/isolatedMarginData":{cost:.1,noCoin:1},"margin/isolatedMarginTier":.1,"margin/rateLimit/order":2,"margin/dribblet":.1,"margin/dust":20.001,"margin/crossMarginCollateralRatio":10,"margin/exchange-small-liability":.6667,"margin/exchange-small-liability-history":.6667,"margin/next-hourly-interest-rate":.6667,"margin/capital-flow":10,"margin/delist-schedule":10,"margin/available-inventory":.3334,"margin/leverageBracket":.1,"loan/vip/loanable/data":40,"loan/vip/collateral/data":40,"loan/vip/request/data":2.6668,"loan/vip/request/interestRate":2.6668,"loan/income":40.002,"loan/ongoing/orders":40,"loan/ltv/adjustment/history":40,"loan/borrow/history":40,"loan/repay/history":40,"loan/loanable/data":40,"loan/collateral/data":40,"loan/repay/collateral/rate":600,"loan/flexible/ongoing/orders":30,"loan/flexible/borrow/history":40,"loan/flexible/repay/history":40,"loan/flexible/ltv/adjustment/history":40,"loan/vip/ongoing/orders":40,"loan/vip/repay/history":40,"loan/vip/collateral/account":600,"fiat/orders":600.03,"fiat/payments":.1,"futures/transfer":1,"futures/histDataLink":.1,"rebate/taxQuery":80.004,"capital/config/getall":1,"capital/deposit/address":1,"capital/deposit/address/list":1,"capital/deposit/hisrec":.1,"capital/deposit/subAddress":.1,"capital/deposit/subHisrec":.1,"capital/withdraw/history":2,"capital/withdraw/address/list":10,"capital/contract/convertible-coins":4.0002,"convert/tradeFlow":20.001,"convert/exchangeInfo":50,"convert/assetInfo":10,"convert/orderStatus":.6667,"convert/limit/queryOpenOrders":20.001,"account/status":.1,"account/apiTradingStatus":.1,"account/apiRestrictions/ipRestriction":.1,bnbBurn:.1,"sub-account/futures/account":1,"sub-account/futures/accountSummary":.1,"sub-account/futures/positionRisk":1,"sub-account/futures/internalTransfer":.1,"sub-account/list":.1,"sub-account/margin/account":1,"sub-account/margin/accountSummary":1,"sub-account/spotSummary":.1,"sub-account/status":1,"sub-account/sub/transfer/history":.1,"sub-account/transfer/subUserHistory":.1,"sub-account/universalTransfer":.1,"sub-account/apiRestrictions/ipRestriction/thirdPartyList":1,"sub-account/transaction-statistics":.40002,"sub-account/subAccountApi/ipRestriction":20.001,"managed-subaccount/asset":.1,"managed-subaccount/accountSnapshot":240,"managed-subaccount/queryTransLogForInvestor":.1,"managed-subaccount/queryTransLogForTradeParent":.40002,"managed-subaccount/fetch-future-asset":.40002,"managed-subaccount/marginAsset":.1,"managed-subaccount/info":.40002,"managed-subaccount/deposit/address":.006667,"managed-subaccount/query-trans-log":.40002,"lending/daily/product/list":.1,"lending/daily/userLeftQuota":.1,"lending/daily/userRedemptionQuota":.1,"lending/daily/token/position":.1,"lending/union/account":.1,"lending/union/purchaseRecord":.1,"lending/union/redemptionRecord":.1,"lending/union/interestHistory":.1,"lending/project/list":.1,"lending/project/position/list":.1,"eth-staking/eth/history/stakingHistory":15,"eth-staking/eth/history/redemptionHistory":15,"eth-staking/eth/history/rewardsHistory":15,"eth-staking/eth/quota":15,"eth-staking/eth/history/rateHistory":15,"eth-staking/account":15,"eth-staking/wbeth/history/wrapHistory":15,"eth-staking/wbeth/history/unwrapHistory":15,"eth-staking/eth/history/wbethRewardsHistory":15,"sol-staking/sol/history/stakingHistory":15,"sol-staking/sol/history/redemptionHistory":15,"sol-staking/sol/history/bnsolRewardsHistory":15,"sol-staking/sol/history/rateHistory":15,"sol-staking/account":15,"sol-staking/sol/quota":15,"mining/pub/algoList":.1,"mining/pub/coinList":.1,"mining/worker/detail":.5,"mining/worker/list":.5,"mining/payment/list":.5,"mining/statistics/user/status":.5,"mining/statistics/user/list":.5,"mining/payment/uid":.5,"bswap/pools":.1,"bswap/liquidity":{cost:.1,noPoolId:1},"bswap/liquidityOps":20.001,"bswap/quote":1.00005,"bswap/swap":20.001,"bswap/poolConfigure":1.00005,"bswap/addLiquidityPreview":1.00005,"bswap/removeLiquidityPreview":1.00005,"bswap/unclaimedRewards":6.667,"bswap/claimedHistory":6.667,"blvt/tokenInfo":.1,"blvt/subscribe/record":.1,"blvt/redeem/record":.1,"blvt/userLimit":.1,"apiReferral/ifNewUser":1,"apiReferral/customization":1,"apiReferral/userCustomization":1,"apiReferral/rebate/recentRecord":1,"apiReferral/rebate/historicalRecord":1,"apiReferral/kickback/recentRecord":1,"apiReferral/kickback/historicalRecord":1,"broker/subAccountApi":1,"broker/subAccount":1,"broker/subAccountApi/commission/futures":1,"broker/subAccountApi/commission/coinFutures":1,"broker/info":1,"broker/transfer":1,"broker/transfer/futures":1,"broker/rebate/recentRecord":1,"broker/rebate/historicalRecord":1,"broker/subAccount/bnbBurn/status":1,"broker/subAccount/depositHist":1,"broker/subAccount/spotSummary":1,"broker/subAccount/marginSummary":1,"broker/subAccount/futuresSummary":1,"broker/rebate/futures/recentRecord":1,"broker/subAccountApi/ipRestriction":1,"broker/universalTransfer":1,"account/apiRestrictions":.1,"c2c/orderMatch/listUserOrderHistory":.1,"nft/history/transactions":20.001,"nft/history/deposit":20.001,"nft/history/withdraw":20.001,"nft/user/getAsset":20.001,"pay/transactions":20.001,"giftcard/verify":.1,"giftcard/cryptography/rsa-public-key":.1,"giftcard/buyCode/token-limit":.1,"algo/spot/openOrders":.1,"algo/spot/historicalOrders":.1,"algo/spot/subOrders":.1,"algo/futures/openOrders":.1,"algo/futures/historicalOrders":.1,"algo/futures/subOrders":.1,"portfolio/account":.1,"portfolio/collateralRate":5,"portfolio/pmLoan":3.3335,"portfolio/interest-history":.6667,"portfolio/asset-index-price":.1,"portfolio/repay-futures-switch":3,"portfolio/margin-asset-leverage":5,"portfolio/balance":2,"portfolio/negative-balance-exchange-record":2,"portfolio/pmloan-history":5,"staking/productList":.1,"staking/position":.1,"staking/stakingRecord":.1,"staking/personalLeftQuota":.1,"lending/auto-invest/target-asset/list":.1,"lending/auto-invest/target-asset/roi/list":.1,"lending/auto-invest/all/asset":.1,"lending/auto-invest/source-asset/list":.1,"lending/auto-invest/plan/list":.1,"lending/auto-invest/plan/id":.1,"lending/auto-invest/history/list":.1,"lending/auto-invest/index/info":.1,"lending/auto-invest/index/user-summary":.1,"lending/auto-invest/one-off/status":.1,"lending/auto-invest/redeem/history":.1,"lending/auto-invest/rebalance/history":.1,"simple-earn/flexible/list":15,"simple-earn/locked/list":15,"simple-earn/flexible/personalLeftQuota":15,"simple-earn/locked/personalLeftQuota":15,"simple-earn/flexible/subscriptionPreview":15,"simple-earn/locked/subscriptionPreview":15,"simple-earn/flexible/history/rateHistory":15,"simple-earn/flexible/position":15,"simple-earn/locked/position":15,"simple-earn/account":15,"simple-earn/flexible/history/subscriptionRecord":15,"simple-earn/locked/history/subscriptionRecord":15,"simple-earn/flexible/history/redemptionRecord":15,"simple-earn/locked/history/redemptionRecord":15,"simple-earn/flexible/history/rewardsRecord":15,"simple-earn/locked/history/rewardsRecord":15,"simple-earn/flexible/history/collateralRecord":.1,"dci/product/list":.1,"dci/product/positions":.1,"dci/product/accounts":.1},post:{"asset/dust":.06667,"asset/dust-btc":.1,"asset/transfer":6.0003,"asset/get-funding-asset":.1,"asset/convert-transfer":.033335,"account/disableFastWithdrawSwitch":.1,"account/enableFastWithdrawSwitch":.1,"capital/withdraw/apply":4.0002,"capital/contract/convertible-coins":4.0002,"capital/deposit/credit-apply":.1,"margin/borrow-repay":20.001,"margin/transfer":4.0002,"margin/loan":20.001,"margin/repay":20.001,"margin/order":.040002,"margin/order/oco":.040002,"margin/dust":20.001,"margin/exchange-small-liability":20.001,"margin/isolated/transfer":4.0002,"margin/isolated/account":2.0001,"margin/max-leverage":300,bnbBurn:.1,"sub-account/virtualSubAccount":.1,"sub-account/margin/transfer":4.0002,"sub-account/margin/enable":.1,"sub-account/futures/enable":.1,"sub-account/futures/transfer":.1,"sub-account/futures/internalTransfer":.1,"sub-account/transfer/subToSub":.1,"sub-account/transfer/subToMaster":.1,"sub-account/universalTransfer":.1,"sub-account/options/enable":.1,"managed-subaccount/deposit":.1,"managed-subaccount/withdraw":.1,userDataStream:.1,"userDataStream/isolated":.1,"futures/transfer":.1,"lending/customizedFixed/purchase":.1,"lending/daily/purchase":.1,"lending/daily/redeem":.1,"bswap/liquidityAdd":60,"bswap/liquidityRemove":60,"bswap/swap":60,"bswap/claimRewards":6.667,"blvt/subscribe":.1,"blvt/redeem":.1,"apiReferral/customization":1,"apiReferral/userCustomization":1,"apiReferral/rebate/historicalRecord":1,"apiReferral/kickback/historicalRecord":1,"broker/subAccount":1,"broker/subAccount/margin":1,"broker/subAccount/futures":1,"broker/subAccountApi":1,"broker/subAccountApi/permission":1,"broker/subAccountApi/commission":1,"broker/subAccountApi/commission/futures":1,"broker/subAccountApi/commission/coinFutures":1,"broker/transfer":1,"broker/transfer/futures":1,"broker/rebate/historicalRecord":1,"broker/subAccount/bnbBurn/spot":1,"broker/subAccount/bnbBurn/marginInterest":1,"broker/subAccount/blvt":1,"broker/subAccountApi/ipRestriction":1,"broker/subAccountApi/ipRestriction/ipList":1,"broker/universalTransfer":1,"broker/subAccountApi/permission/universalTransfer":1,"broker/subAccountApi/permission/vanillaOptions":1,"giftcard/createCode":.1,"giftcard/redeemCode":.1,"giftcard/buyCode":.1,"algo/spot/newOrderTwap":20.001,"algo/futures/newOrderVp":20.001,"algo/futures/newOrderTwap":20.001,"staking/purchase":.1,"staking/redeem":.1,"staking/setAutoStaking":.1,"eth-staking/eth/stake":15,"eth-staking/eth/redeem":15,"eth-staking/wbeth/wrap":15,"sol-staking/sol/stake":15,"sol-staking/sol/redeem":15,"mining/hash-transfer/config":.5,"mining/hash-transfer/config/cancel":.5,"portfolio/repay":20.001,"loan/vip/renew":40.002,"loan/vip/borrow":40.002,"loan/borrow":40.002,"loan/repay":40.002,"loan/adjust/ltv":40.002,"loan/customize/margin_call":40.002,"loan/flexible/repay":40.002,"loan/flexible/adjust/ltv":40.002,"loan/vip/repay":40.002,"convert/getQuote":1.3334,"convert/acceptQuote":3.3335,"convert/limit/placeOrder":3.3335,"convert/limit/cancelOrder":1.3334,"portfolio/auto-collection":150,"portfolio/asset-collection":6,"portfolio/bnb-transfer":150,"portfolio/repay-futures-switch":150,"portfolio/repay-futures-negative-balance":150,"portfolio/mint":20,"portfolio/redeem":20,"lending/auto-invest/plan/add":.1,"lending/auto-invest/plan/edit":.1,"lending/auto-invest/plan/edit-status":.1,"lending/auto-invest/one-off":.1,"lending/auto-invest/redeem":.1,"simple-earn/flexible/subscribe":.1,"simple-earn/locked/subscribe":.1,"simple-earn/flexible/redeem":.1,"simple-earn/locked/redeem":.1,"simple-earn/flexible/setAutoSubscribe":15,"simple-earn/locked/setAutoSubscribe":15,"simple-earn/locked/setRedeemOption":5,"dci/product/subscribe":.1,"dci/product/auto_compound/edit":.1},put:{userDataStream:.1,"userDataStream/isolated":.1},delete:{"margin/openOrders":.1,"margin/order":.006667,"margin/orderList":.006667,"margin/isolated/account":2.0001,userDataStream:.1,"userDataStream/isolated":.1,"broker/subAccountApi":1,"broker/subAccountApi/ipRestriction/ipList":1,"algo/spot/order":.1,"algo/futures/order":.1,"sub-account/subAccountApi/ipRestriction/ipList":20.001}},sapiV2:{get:{"eth-staking/account":15,"sub-account/futures/account":.1,"sub-account/futures/accountSummary":1,"sub-account/futures/positionRisk":.1,"loan/flexible/ongoing/orders":30,"loan/flexible/borrow/history":40,"loan/flexible/repay/history":40,"loan/flexible/ltv/adjustment/history":40,"loan/flexible/loanable/data":40,"loan/flexible/collateral/data":40,"portfolio/account":2},post:{"eth-staking/eth/stake":15,"sub-account/subAccountApi/ipRestriction":20.001,"loan/flexible/borrow":40.002,"loan/flexible/repay":40.002,"loan/flexible/adjust/ltv":40.002}},sapiV3:{get:{"sub-account/assets":.40002},post:{"asset/getUserAsset":.5}},sapiV4:{get:{"sub-account/assets":.40002}},dapiPublic:{get:{ping:1,time:1,exchangeInfo:1,depth:{cost:2,byLimit:[[50,2],[100,5],[500,10],[1e3,20]]},trades:5,historicalTrades:20,aggTrades:20,premiumIndex:10,fundingRate:1,klines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},continuousKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},indexPriceKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},markPriceKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},premiumIndexKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},"ticker/24hr":{cost:1,noSymbol:40},"ticker/price":{cost:1,noSymbol:2},"ticker/bookTicker":{cost:2,noSymbol:5},constituents:2,openInterest:1,fundingInfo:1}},dapiData:{get:{"delivery-price":1,openInterestHist:1,topLongShortAccountRatio:1,topLongShortPositionRatio:1,globalLongShortAccountRatio:1,takerBuySellVol:1,basis:1}},dapiPrivate:{get:{"positionSide/dual":30,orderAmendment:1,order:1,openOrder:1,openOrders:{cost:1,noSymbol:5},allOrders:{cost:20,noSymbol:40},balance:1,account:5,"positionMargin/history":1,positionRisk:1,userTrades:{cost:20,noSymbol:40},income:20,leverageBracket:1,forceOrders:{cost:20,noSymbol:50},adlQuantile:5,commissionRate:20,"income/asyn":5,"income/asyn/id":5,"trade/asyn":.5,"trade/asyn/id":.5,"order/asyn":.5,"order/asyn/id":.5,pmExchangeInfo:.5,pmAccountInfo:.5},post:{"positionSide/dual":1,order:4,batchOrders:5,countdownCancelAll:10,leverage:1,marginType:1,positionMargin:1,listenKey:1},put:{listenKey:1,order:1,batchOrders:5},delete:{order:1,allOpenOrders:1,batchOrders:5,listenKey:1}},dapiPrivateV2:{get:{leverageBracket:1}},fapiPublic:{get:{ping:1,time:1,exchangeInfo:1,depth:{cost:2,byLimit:[[50,2],[100,5],[500,10],[1e3,20]]},trades:5,historicalTrades:20,aggTrades:20,klines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},continuousKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},markPriceKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},indexPriceKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},premiumIndexKlines:{cost:1,byLimit:[[99,1],[499,2],[1e3,5],[1e4,10]]},fundingRate:1,fundingInfo:1,premiumIndex:1,"ticker/24hr":{cost:1,noSymbol:40},"ticker/price":{cost:1,noSymbol:2},"ticker/bookTicker":{cost:1,noSymbol:2},openInterest:1,indexInfo:1,assetIndex:{cost:1,noSymbol:10},constituents:2,apiTradingStatus:{cost:1,noSymbol:10},lvtKlines:1,"convert/exchangeInfo":4}},fapiData:{get:{"delivery-price":1,openInterestHist:1,topLongShortAccountRatio:1,topLongShortPositionRatio:1,globalLongShortAccountRatio:1,takerlongshortRatio:1,basis:1}},fapiPrivate:{get:{forceOrders:{cost:20,noSymbol:50},allOrders:5,openOrder:1,openOrders:{cost:1,noSymbol:40},order:1,account:5,balance:5,leverageBracket:1,"positionMargin/history":1,positionRisk:5,"positionSide/dual":30,userTrades:5,income:30,commissionRate:20,"rateLimit/order":1,apiTradingStatus:1,multiAssetsMargin:30,"apiReferral/ifNewUser":1,"apiReferral/customization":1,"apiReferral/userCustomization":1,"apiReferral/traderNum":1,"apiReferral/overview":1,"apiReferral/tradeVol":1,"apiReferral/rebateVol":1,"apiReferral/traderSummary":1,adlQuantile:5,pmAccountInfo:5,orderAmendment:1,"income/asyn":1e3,"income/asyn/id":10,"order/asyn":1e3,"order/asyn/id":10,"trade/asyn":1e3,"trade/asyn/id":10,feeBurn:1,symbolConfig:5,accountConfig:5,"convert/orderStatus":5},post:{batchOrders:5,"positionSide/dual":1,positionMargin:1,marginType:1,order:4,leverage:1,listenKey:1,countdownCancelAll:10,multiAssetsMargin:1,"apiReferral/customization":1,"apiReferral/userCustomization":1,feeBurn:1,"convert/getQuote":200,"convert/acceptQuote":20},put:{listenKey:1,order:1,batchOrders:5},delete:{batchOrders:1,order:1,allOpenOrders:1,listenKey:1}},fapiPublicV2:{get:{"ticker/price":0}},fapiPrivateV2:{get:{account:1,balance:1,positionRisk:1}},fapiPublicV3:{get:{}},fapiPrivateV3:{get:{account:1,balance:1,positionRisk:1}},eapiPublic:{get:{ping:1,time:1,exchangeInfo:1,index:1,ticker:5,mark:5,depth:1,klines:1,trades:5,historicalTrades:20,exerciseHistory:3,openInterest:3}},eapiPrivate:{get:{account:3,position:5,openOrders:{cost:1,noSymbol:40},historyOrders:3,userTrades:5,exerciseRecord:5,bill:1,"income/asyn":5,"income/asyn/id":5,marginAccount:3,mmp:1,countdownCancelAll:1,order:1,"block/order/orders":5,"block/order/execute":5,"block/user-trades":5,blockTrades:5},post:{order:1,batchOrders:5,listenKey:1,mmpSet:1,mmpReset:1,countdownCancelAll:1,countdownCancelAllHeartBeat:10,"block/order/create":5,"block/order/execute":5},put:{listenKey:1,"block/order/create":5},delete:{order:1,batchOrders:1,allOpenOrders:1,allOpenOrdersByUnderlying:1,listenKey:1,"block/order/create":5}},public:{get:{ping:.2,time:.2,depth:{cost:1,byLimit:[[100,1],[500,5],[1e3,10],[5e3,50]]},trades:2,aggTrades:.4,historicalTrades:2,klines:.4,uiKlines:.4,"ticker/24hr":{cost:.4,noSymbol:16},ticker:{cost:.4,noSymbol:16},"ticker/tradingDay":.8,"ticker/price":{cost:.4,noSymbol:.8},"ticker/bookTicker":{cost:.4,noSymbol:.8},exchangeInfo:4,avgPrice:.4},put:{userDataStream:.4},post:{userDataStream:.4},delete:{userDataStream:.4}},private:{get:{allOrderList:4,openOrderList:1.2,orderList:.8,order:.8,openOrders:{cost:1.2,noSymbol:16},allOrders:4,account:4,myTrades:4,"rateLimit/order":8,myPreventedMatches:4,myAllocations:4,"account/commission":4},post:{"order/oco":.2,"orderList/oco":.2,"orderList/oto":.2,"orderList/otoco":.2,"sor/order":.2,"sor/order/test":.2,order:.2,"order/cancelReplace":.2,"order/test":.2},delete:{openOrders:.2,orderList:.2,order:.2}},papi:{get:{ping:.2,"um/order":1,"um/openOrder":1,"um/openOrders":{cost:1,noSymbol:40},"um/allOrders":5,"cm/order":1,"cm/openOrder":1,"cm/openOrders":{cost:1,noSymbol:40},"cm/allOrders":20,"um/conditional/openOrder":1,"um/conditional/openOrders":{cost:1,noSymbol:40},"um/conditional/orderHistory":1,"um/conditional/allOrders":{cost:1,noSymbol:40},"cm/conditional/openOrder":1,"cm/conditional/openOrders":{cost:1,noSymbol:40},"cm/conditional/orderHistory":1,"cm/conditional/allOrders":40,"margin/order":10,"margin/openOrders":5,"margin/allOrders":100,"margin/orderList":5,"margin/allOrderList":100,"margin/openOrderList":5,"margin/myTrades":5,balance:4,account:4,"margin/maxBorrowable":1,"margin/maxWithdraw":1,"um/positionRisk":1,"cm/positionRisk":.2,"um/positionSide/dual":6,"cm/positionSide/dual":6,"um/userTrades":5,"cm/userTrades":20,"um/leverageBracket":.2,"cm/leverageBracket":.2,"margin/forceOrders":1,"um/forceOrders":{cost:20,noSymbol:50},"cm/forceOrders":{cost:20,noSymbol:50},"um/apiTradingStatus":{cost:.2,noSymbol:2},"um/commissionRate":4,"cm/commissionRate":4,"margin/marginLoan":2,"margin/repayLoan":2,"margin/marginInterestHistory":.2,"portfolio/interest-history":10,"um/income":6,"cm/income":6,"um/account":1,"cm/account":1,"repay-futures-switch":6,"um/adlQuantile":5,"cm/adlQuantile":5,"um/trade/asyn":300,"um/trade/asyn/id":2,"um/order/asyn":300,"um/order/asyn/id":2,"um/income/asyn":300,"um/income/asyn/id":2,"um/orderAmendment":1,"cm/orderAmendment":1,"um/feeBurn":30,"um/accountConfig":1,"um/symbolConfig":1,"cm/accountConfig":1,"cm/symbolConfig":1,"rateLimit/order":1},post:{"um/order":1,"um/conditional/order":1,"cm/order":1,"cm/conditional/order":1,"margin/order":1,marginLoan:100,repayLoan:100,"margin/order/oco":1,"um/leverage":.2,"cm/leverage":.2,"um/positionSide/dual":.2,"cm/positionSide/dual":.2,"auto-collection":150,"bnb-transfer":150,"repay-futures-switch":150,"repay-futures-negative-balance":150,listenKey:.2,"asset-collection":6,"margin/repay-debt":3e3,"um/feeBurn":1},put:{listenKey:.2,"um/order":1,"cm/order":1},delete:{"um/order":1,"um/conditional/order":1,"um/allOpenOrders":1,"um/conditional/allOpenOrders":1,"cm/order":1,"cm/conditional/order":1,"cm/allOpenOrders":1,"cm/conditional/allOpenOrders":1,"margin/order":2,"margin/allOpenOrders":5,"margin/orderList":2,listenKey:.2}}},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0.001")},linear:{trading:{feeSide:"quote",tierBased:!0,percentage:!0,taker:this.parseNumber("0.000500"),maker:this.parseNumber("0.000200"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.000400")],[this.parseNumber("250"),this.parseNumber("0.000400")],[this.parseNumber("2500"),this.parseNumber("0.000350")],[this.parseNumber("7500"),this.parseNumber("0.000320")],[this.parseNumber("22500"),this.parseNumber("0.000300")],[this.parseNumber("50000"),this.parseNumber("0.000270")],[this.parseNumber("100000"),this.parseNumber("0.000250")],[this.parseNumber("200000"),this.parseNumber("0.000220")],[this.parseNumber("400000"),this.parseNumber("0.000200")],[this.parseNumber("750000"),this.parseNumber("0.000170")]],maker:[[this.parseNumber("0"),this.parseNumber("0.000200")],[this.parseNumber("250"),this.parseNumber("0.000160")],[this.parseNumber("2500"),this.parseNumber("0.000140")],[this.parseNumber("7500"),this.parseNumber("0.000120")],[this.parseNumber("22500"),this.parseNumber("0.000100")],[this.parseNumber("50000"),this.parseNumber("0.000080")],[this.parseNumber("100000"),this.parseNumber("0.000060")],[this.parseNumber("200000"),this.parseNumber("0.000040")],[this.parseNumber("400000"),this.parseNumber("0.000020")],[this.parseNumber("750000"),this.parseNumber("0")]]}}},inverse:{trading:{feeSide:"base",tierBased:!0,percentage:!0,taker:this.parseNumber("0.000500"),maker:this.parseNumber("0.000100"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.000500")],[this.parseNumber("250"),this.parseNumber("0.000450")],[this.parseNumber("2500"),this.parseNumber("0.000400")],[this.parseNumber("7500"),this.parseNumber("0.000300")],[this.parseNumber("22500"),this.parseNumber("0.000250")],[this.parseNumber("50000"),this.parseNumber("0.000240")],[this.parseNumber("100000"),this.parseNumber("0.000240")],[this.parseNumber("200000"),this.parseNumber("0.000240")],[this.parseNumber("400000"),this.parseNumber("0.000240")],[this.parseNumber("750000"),this.parseNumber("0.000240")]],maker:[[this.parseNumber("0"),this.parseNumber("0.000100")],[this.parseNumber("250"),this.parseNumber("0.000080")],[this.parseNumber("2500"),this.parseNumber("0.000050")],[this.parseNumber("7500"),this.parseNumber("0.0000030")],[this.parseNumber("22500"),this.parseNumber("0")],[this.parseNumber("50000"),this.parseNumber("-0.000050")],[this.parseNumber("100000"),this.parseNumber("-0.000060")],[this.parseNumber("200000"),this.parseNumber("-0.000070")],[this.parseNumber("400000"),this.parseNumber("-0.000080")],[this.parseNumber("750000"),this.parseNumber("-0.000090")]]}}},option:{}},currencies:{BNFCR:this.safeCurrencyStructure({id:"BNFCR",code:"BNFCR",precision:this.parseNumber("0.001")})},commonCurrencies:{BCC:"BCC",YOYO:"YOYOW"},precisionMode:o.kb,options:{sandboxMode:!1,fetchMargins:!0,fetchMarkets:["spot","linear","inverse"],fetchCurrencies:!0,defaultTimeInForce:"GTC",defaultType:"spot",defaultSubType:void 0,hasAlreadyAuthenticatedSuccessfully:!1,warnOnFetchOpenOrdersWithoutSymbol:!0,throwMarginModeAlreadySet:!1,fetchPositions:"positionRisk",recvWindow:1e4,timeDifference:0,adjustForTimeDifference:!1,newOrderRespType:{market:"FULL",limit:"FULL"},quoteOrderQty:!0,broker:{spot:"x-R4BD3S82",margin:"x-R4BD3S82",future:"x-xcKtGhcu",delivery:"x-xcKtGhcu",swap:"x-xcKtGhcu",option:"x-xcKtGhcu"},accountsByType:{main:"MAIN",spot:"MAIN",funding:"FUNDING",margin:"MARGIN",cross:"MARGIN",future:"UMFUTURE",delivery:"CMFUTURE",linear:"UMFUTURE",swap:"UMFUTURE",inverse:"CMFUTURE",option:"OPTION"},accountsById:{MAIN:"spot",FUNDING:"funding",MARGIN:"margin",UMFUTURE:"linear",CMFUTURE:"inverse",OPTION:"option"},networks:{ERC20:"ETH",TRC20:"TRX",BEP2:"BNB",BEP20:"BSC",OMNI:"OMNI",EOS:"EOS",SPL:"SOL",SOL:"SOL"},reverseNetworks:{"tronscan.org":"TRC20","etherscan.io":"ERC20","bscscan.com":"BSC","explorer.binance.org":"BEP2","bithomp.com":"XRP","bloks.io":"EOS","stellar.expert":"XLM","blockchair.com/bitcoin":"BTC","blockchair.com/bitcoin-cash":"BCH","blockchair.com/ecash":"XEC","explorer.litecoin.net":"LTC","explorer.avax.network":"AVAX","solscan.io":"SOL","polkadot.subscan.io":"DOT","dashboard.internetcomputer.org":"ICP","explorer.chiliz.com":"CHZ","cardanoscan.io":"ADA","mainnet.theoan.com":"AION","algoexplorer.io":"ALGO","explorer.ambrosus.com":"AMB","viewblock.io/zilliqa":"ZIL","viewblock.io/arweave":"AR","explorer.ark.io":"ARK","atomscan.com":"ATOM","www.mintscan.io":"CTK","explorer.bitcoindiamond.org":"BCD","btgexplorer.com":"BTG","bts.ai":"BTS","explorer.celo.org":"CELO","explorer.nervos.org":"CKB","cerebro.cortexlabs.ai":"CTXC","chainz.cryptoid.info":"VIA","explorer.dcrdata.org":"DCR","digiexplorer.info":"DGB","dock.subscan.io":"DOCK","dogechain.info":"DOGE","explorer.elrond.com":"EGLD","blockscout.com":"ETC","explore-fetchhub.fetch.ai":"FET","filfox.info":"FIL","fio.bloks.io":"FIO","explorer.firo.org":"FIRO","neoscan.io":"NEO","ftmscan.com":"FTM","explorer.gochain.io":"GO","block.gxb.io":"GXS","hash-hash.info":"HBAR","www.hiveblockexplorer.com":"HIVE","explorer.helium.com":"HNT","tracker.icon.foundation":"ICX","www.iostabc.com":"IOST","explorer.iota.org":"IOTA","iotexscan.io":"IOTX","irishub.iobscan.io":"IRIS","kava.mintscan.io":"KAVA","scope.klaytn.com":"KLAY","kmdexplorer.io":"KMD","kusama.subscan.io":"KSM","explorer.lto.network":"LTO","polygonscan.com":"POLYGON","explorer.ont.io":"ONT","minaexplorer.com":"MINA","nanolooker.com":"NANO","explorer.nebulas.io":"NAS","explorer.nbs.plus":"NBS","explorer.nebl.io":"NEBL","nulscan.io":"NULS","nxscan.com":"NXS","explorer.harmony.one":"ONE","explorer.poa.network":"POA","qtum.info":"QTUM","explorer.rsk.co":"RSK","www.oasisscan.com":"ROSE","ravencoin.network":"RVN","sc.tokenview.com":"SC","secretnodes.com":"SCRT","explorer.skycoin.com":"SKY","steemscan.com":"STEEM","explorer.stacks.co":"STX","www.thetascan.io":"THETA","scan.tomochain.com":"TOMO","explore.vechain.org":"VET","explorer.vite.net":"VITE","www.wanscan.org":"WAN","wavesexplorer.com":"WAVES","wax.eosx.io":"WAXP","waltonchain.pro":"WTC","chain.nem.ninja":"XEM","verge-blockchain.info":"XVG","explorer.yoyow.org":"YOYOW","explorer.zcha.in":"ZEC","explorer.zensystem.io":"ZEN"},networksById:{SOL:"SOL","tronscan.org":"TRC20","etherscan.io":"ERC20","bscscan.com":"BSC","explorer.binance.org":"BEP2","bithomp.com":"XRP","bloks.io":"EOS","stellar.expert":"XLM","blockchair.com/bitcoin":"BTC","blockchair.com/bitcoin-cash":"BCH","blockchair.com/ecash":"XEC","explorer.litecoin.net":"LTC","explorer.avax.network":"AVAX","solscan.io":"SOL","polkadot.subscan.io":"DOT","dashboard.internetcomputer.org":"ICP","explorer.chiliz.com":"CHZ","cardanoscan.io":"ADA","mainnet.theoan.com":"AION","algoexplorer.io":"ALGO","explorer.ambrosus.com":"AMB","viewblock.io/zilliqa":"ZIL","viewblock.io/arweave":"AR","explorer.ark.io":"ARK","atomscan.com":"ATOM","www.mintscan.io":"CTK","explorer.bitcoindiamond.org":"BCD","btgexplorer.com":"BTG","bts.ai":"BTS","explorer.celo.org":"CELO","explorer.nervos.org":"CKB","cerebro.cortexlabs.ai":"CTXC","chainz.cryptoid.info":"VIA","explorer.dcrdata.org":"DCR","digiexplorer.info":"DGB","dock.subscan.io":"DOCK","dogechain.info":"DOGE","explorer.elrond.com":"EGLD","blockscout.com":"ETC","explore-fetchhub.fetch.ai":"FET","filfox.info":"FIL","fio.bloks.io":"FIO","explorer.firo.org":"FIRO","neoscan.io":"NEO","ftmscan.com":"FTM","explorer.gochain.io":"GO","block.gxb.io":"GXS","hash-hash.info":"HBAR","www.hiveblockexplorer.com":"HIVE","explorer.helium.com":"HNT","tracker.icon.foundation":"ICX","www.iostabc.com":"IOST","explorer.iota.org":"IOTA","iotexscan.io":"IOTX","irishub.iobscan.io":"IRIS","kava.mintscan.io":"KAVA","scope.klaytn.com":"KLAY","kmdexplorer.io":"KMD","kusama.subscan.io":"KSM","explorer.lto.network":"LTO","polygonscan.com":"POLYGON","explorer.ont.io":"ONT","minaexplorer.com":"MINA","nanolooker.com":"NANO","explorer.nebulas.io":"NAS","explorer.nbs.plus":"NBS","explorer.nebl.io":"NEBL","nulscan.io":"NULS","nxscan.com":"NXS","explorer.harmony.one":"ONE","explorer.poa.network":"POA","qtum.info":"QTUM","explorer.rsk.co":"RSK","www.oasisscan.com":"ROSE","ravencoin.network":"RVN","sc.tokenview.com":"SC","secretnodes.com":"SCRT","explorer.skycoin.com":"SKY","steemscan.com":"STEEM","explorer.stacks.co":"STX","www.thetascan.io":"THETA","scan.tomochain.com":"TOMO","explore.vechain.org":"VET","explorer.vite.net":"VITE","www.wanscan.org":"WAN","wavesexplorer.com":"WAVES","wax.eosx.io":"WAXP","waltonchain.pro":"WTC","chain.nem.ninja":"XEM","verge-blockchain.info":"XVG","explorer.yoyow.org":"YOYOW","explorer.zcha.in":"ZEC","explorer.zensystem.io":"ZEN"},impliedNetworks:{ETH:{ERC20:"ETH"},TRX:{TRC20:"TRX"}},legalMoney:{MXN:!0,UGX:!0,SEK:!0,CHF:!0,VND:!0,AED:!0,DKK:!0,KZT:!0,HUF:!0,PEN:!0,PHP:!0,USD:!0,TRY:!0,EUR:!0,NGN:!0,PLN:!0,BRL:!0,ZAR:!0,KES:!0,ARS:!0,RUB:!0,AUD:!0,NOK:!0,CZK:!0,GBP:!0,UAH:!0,GHS:!0,HKD:!0,CAD:!0,INR:!0,JPY:!0,NZD:!0},legalMoneyCurrenciesById:{BUSD:"USD"},defaultWithdrawPrecision:1e-8},features:{spot:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:{expire_maker:!0,expire_taker:!0,expire_both:!0,none:!0},trailing:!1,icebergAmount:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:void 0,untilDays:1,symbolRequired:!0},fetchOrder:{marginMode:!0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!0,limit:1e3,daysBack:void 0,untilDays:1e4,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e4,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},forDerivatives:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{mark:!0,last:!0,index:!1},stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!0,selfTradePrevention:!0,trailing:!0,iceberg:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0},createOrders:{max:5},fetchMyTrades:{marginMode:!1,daysBack:void 0,limit:1e3,untilDays:7,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:500,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!0,limit:1e3,daysBack:90,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:90,daysBackCanceled:3,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1500}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}}},exceptions:{spot:{exact:{"-1004":r.OperationFailed,"-1008":r.OperationFailed,"-1099":r.AuthenticationError,"-1108":r.BadRequest,"-1131":r.BadRequest,"-1134":r.BadRequest,"-1135":r.BadRequest,"-1145":r.BadRequest,"-1151":r.BadSymbol,"-2008":r.AuthenticationError,"-2016":r.OperationRejected,"-2021":r.BadResponse,"-2022":r.BadResponse,"-2026":r.InvalidOrder,"-3000":r.OperationFailed,"-3001":r.AuthenticationError,"-3002":r.BadSymbol,"-3003":r.BadRequest,"-3004":r.OperationRejected,"-3005":r.BadRequest,"-3006":r.BadRequest,"-3007":r.OperationFailed,"-3008":r.BadRequest,"-3009":r.OperationRejected,"-3010":r.BadRequest,"-3011":r.BadRequest,"-3012":r.OperationRejected,"-3013":r.BadRequest,"-3014":r.AccountSuspended,"-3015":r.BadRequest,"-3016":r.BadRequest,"-3017":r.OperationRejected,"-3018":r.AccountSuspended,"-3019":r.AccountSuspended,"-3020":r.BadRequest,"-3021":r.BadRequest,"-3022":r.AccountSuspended,"-3023":r.OperationRejected,"-3024":r.OperationRejected,"-3025":r.BadRequest,"-3026":r.BadRequest,"-3027":r.BadSymbol,"-3028":r.BadSymbol,"-3029":r.OperationFailed,"-3036":r.AccountSuspended,"-3037":r.OperationFailed,"-3038":r.BadRequest,"-3041":r.InsufficientFunds,"-3042":r.BadRequest,"-3043":r.PermissionDenied,"-3044":r.OperationFailed,"-3045":r.OperationRejected,"-3999":r.PermissionDenied,"-4000":r.ExchangeError,"-4001":r.BadRequest,"-4002":r.BadRequest,"-4003":r.BadRequest,"-4004":r.AuthenticationError,"-4005":r.RateLimitExceeded,"-4006":r.BadRequest,"-4007":r.PermissionDenied,"-4008":r.PermissionDenied,"-4009":r.ExchangeError,"-4010":r.PermissionDenied,"-4011":r.BadRequest,"-4012":r.PermissionDenied,"-4013":r.AuthenticationError,"-4014":r.OperationRejected,"-4015":r.PermissionDenied,"-4016":r.PermissionDenied,"-4017":r.PermissionDenied,"-4018":r.BadSymbol,"-4019":r.BadRequest,"-4020":r.ExchangeError,"-4021":r.BadRequest,"-4022":r.BadRequest,"-4023":r.OperationRejected,"-4024":r.InsufficientFunds,"-4025":r.InsufficientFunds,"-4026":r.InsufficientFunds,"-4027":r.OperationFailed,"-4028":r.BadRequest,"-4029":r.BadRequest,"-4030":r.BadResponse,"-4031":r.OperationFailed,"-4032":r.OperationRejected,"-4033":r.BadRequest,"-4034":r.OperationRejected,"-4035":r.PermissionDenied,"-4036":r.PermissionDenied,"-4037":r.OperationFailed,"-4038":r.OperationFailed,"-4039":r.PermissionDenied,"-4040":r.OperationRejected,"-4041":r.OperationFailed,"-4042":r.OperationRejected,"-4043":r.OperationRejected,"-4044":r.PermissionDenied,"-4045":r.OperationFailed,"-4046":r.AuthenticationError,"-4047":r.BadRequest,"-4048":r.ExchangeError,"-4049":r.ExchangeError,"-4050":r.ExchangeError,"-4051":r.ExchangeError,"-4052":r.ExchangeError,"-4053":r.ExchangeError,"-4054":r.ExchangeError,"-4055":r.ExchangeError,"-4056":r.ExchangeError,"-4057":r.ExchangeError,"-4058":r.ExchangeError,"-4059":r.ExchangeError,"-4060":r.OperationFailed,"-4061":r.ExchangeError,"-4062":r.ExchangeError,"-4063":r.ExchangeError,"-4064":r.ExchangeError,"-4065":r.ExchangeError,"-4066":r.ExchangeError,"-4067":r.ExchangeError,"-4068":r.ExchangeError,"-4069":r.ExchangeError,"-4070":r.ExchangeError,"-4071":r.ExchangeError,"-4072":r.ExchangeError,"-4073":r.ExchangeError,"-4074":r.ExchangeError,"-4075":r.ExchangeError,"-4076":r.ExchangeError,"-4077":r.ExchangeError,"-4078":r.ExchangeError,"-4079":r.ExchangeError,"-4080":r.ExchangeError,"-4081":r.ExchangeError,"-4082":r.ExchangeError,"-4083":r.ExchangeError,"-4084":r.ExchangeError,"-4085":r.ExchangeError,"-4086":r.ExchangeError,"-4087":r.ExchangeError,"-4088":r.ExchangeError,"-4089":r.ExchangeError,"-4091":r.ExchangeError,"-4092":r.ExchangeError,"-4093":r.ExchangeError,"-4094":r.ExchangeError,"-4095":r.ExchangeError,"-4096":r.ExchangeError,"-4097":r.ExchangeError,"-4098":r.ExchangeError,"-4099":r.ExchangeError,"-4101":r.ExchangeError,"-4102":r.ExchangeError,"-4103":r.ExchangeError,"-4104":r.ExchangeError,"-4105":r.ExchangeError,"-4106":r.ExchangeError,"-4107":r.ExchangeError,"-4108":r.ExchangeError,"-4109":r.ExchangeError,"-4110":r.ExchangeError,"-4112":r.ExchangeError,"-4113":r.ExchangeError,"-4114":r.ExchangeError,"-4115":r.ExchangeError,"-4116":r.ExchangeError,"-4117":r.ExchangeError,"-4118":r.ExchangeError,"-4119":r.ExchangeError,"-4120":r.ExchangeError,"-4121":r.ExchangeError,"-4122":r.ExchangeError,"-4123":r.ExchangeError,"-4124":r.ExchangeError,"-4125":r.ExchangeError,"-4126":r.ExchangeError,"-4127":r.ExchangeError,"-4128":r.ExchangeError,"-4129":r.ExchangeError,"-4130":r.ExchangeError,"-4131":r.ExchangeError,"-4132":r.ExchangeError,"-4133":r.ExchangeError,"-4134":r.ExchangeError,"-4135":r.ExchangeError,"-4136":r.ExchangeError,"-4137":r.ExchangeError,"-4138":r.ExchangeError,"-4139":r.ExchangeError,"-4141":r.ExchangeError,"-4142":r.ExchangeError,"-4143":r.ExchangeError,"-4144":r.ExchangeError,"-4145":r.ExchangeError,"-4146":r.ExchangeError,"-4147":r.ExchangeError,"-4148":r.ExchangeError,"-4149":r.ExchangeError,"-4150":r.ExchangeError,"-5001":r.BadRequest,"-5002":r.InsufficientFunds,"-5003":r.InsufficientFunds,"-5004":r.OperationRejected,"-5005":r.OperationRejected,"-5006":r.OperationRejected,"-5007":r.BadRequest,"-5008":r.OperationRejected,"-5009":r.BadSymbol,"-5010":r.OperationFailed,"-5011":r.BadRequest,"-5012":r.OperationFailed,"-5013":r.InsufficientFunds,"-5021":r.BadRequest,"-5022":r.BadRequest,"-6001":r.BadSymbol,"-6003":r.PermissionDenied,"-6004":r.BadRequest,"-6005":r.BadRequest,"-6006":r.BadRequest,"-6007":r.OperationRejected,"-6008":r.OperationRejected,"-6009":r.RateLimitExceeded,"-6011":r.OperationRejected,"-6012":r.InsufficientFunds,"-6013":r.BadResponse,"-6014":r.OperationRejected,"-6015":r.BadRequest,"-6016":r.BadRequest,"-6017":r.PermissionDenied,"-6018":r.InsufficientFunds,"-6019":r.OperationRejected,"-6020":r.BadRequest,"-7001":r.BadRequest,"-7002":r.BadRequest,"-10001":r.OperationFailed,"-10002":r.BadRequest,"-10005":r.BadResponse,"-10007":r.BadRequest,"-10008":r.BadRequest,"-10009":r.BadRequest,"-10010":r.BadRequest,"-10011":r.InsufficientFunds,"-10012":r.BadRequest,"-10013":r.InsufficientFunds,"-10015":r.OperationFailed,"-10016":r.OperationFailed,"-10017":r.OperationRejected,"-10018":r.BadRequest,"-10019":r.BadRequest,"-10020":r.BadRequest,"-10021":r.InvalidOrder,"-10022":r.BadRequest,"-10023":r.OperationFailed,"-10024":r.BadRequest,"-10025":r.OperationFailed,"-10026":r.BadRequest,"-10028":r.BadRequest,"-10029":r.OperationRejected,"-10030":r.OperationRejected,"-10031":r.OperationRejected,"-10032":r.OperationFailed,"-10034":r.OperationRejected,"-10039":r.OperationRejected,"-10040":r.OperationRejected,"-10041":r.OperationFailed,"-10042":r.BadSymbol,"-10043":r.OperationRejected,"-10044":r.OperationRejected,"-10045":r.OperationRejected,"-10046":r.OperationRejected,"-10047":r.PermissionDenied,"-11008":r.OperationRejected,"-12014":r.RateLimitExceeded,"-13000":r.OperationRejected,"-13001":r.OperationRejected,"-13002":r.OperationRejected,"-13003":r.PermissionDenied,"-13004":r.OperationRejected,"-13005":r.OperationRejected,"-13006":r.OperationRejected,"-13007":r.PermissionDenied,"-18002":r.OperationRejected,"-18003":r.OperationRejected,"-18004":r.OperationRejected,"-18005":r.PermissionDenied,"-18006":r.OperationRejected,"-18007":r.OperationRejected,"-21001":r.BadRequest,"-21002":r.BadRequest,"-21003":r.BadResponse,"-21004":r.OperationRejected,"-21005":r.InsufficientFunds,"-21006":r.OperationFailed,"-21007":r.OperationFailed,"-32603":r.BadRequest,400002:r.BadRequest,100001003:r.AuthenticationError,200003903:r.AuthenticationError}},linear:{exact:{"-1005":r.PermissionDenied,"-1008":r.OperationFailed,"-1011":r.PermissionDenied,"-1023":r.BadRequest,"-1099":r.AuthenticationError,"-1109":r.PermissionDenied,"-1110":r.BadRequest,"-1113":r.BadRequest,"-1122":r.BadRequest,"-1126":r.BadSymbol,"-1136":r.BadRequest,"-2012":r.OperationFailed,"-2016":r.OperationRejected,"-2017":r.PermissionDenied,"-2018":r.InsufficientFunds,"-2019":r.InsufficientFunds,"-2020":r.OperationFailed,"-2021":r.OrderImmediatelyFillable,"-2022":r.InvalidOrder,"-2023":r.OperationFailed,"-2024":r.InsufficientFunds,"-2025":r.OperationRejected,"-2026":r.InvalidOrder,"-2027":r.OperationRejected,"-2028":r.OperationRejected,"-4063":r.BadRequest,"-4064":r.BadRequest,"-4065":r.BadRequest,"-4066":r.BadRequest,"-4069":r.BadRequest,"-4070":r.BadRequest,"-4071":r.BadRequest,"-4072":r.OperationRejected,"-4073":r.BadRequest,"-4074":r.OperationRejected,"-4075":r.BadRequest,"-4076":r.OperationRejected,"-4077":r.OperationRejected,"-4078":r.OperationFailed,"-4079":r.BadRequest,"-4080":r.PermissionDenied,"-4081":r.BadRequest,"-4085":r.BadRequest,"-4087":r.PermissionDenied,"-4088":r.PermissionDenied,"-4114":r.BadRequest,"-4115":r.BadRequest,"-4116":r.InvalidOrder,"-4117":r.OperationRejected,"-4118":r.OperationRejected,"-4131":r.OperationRejected,"-4140":r.BadRequest,"-4141":r.OperationRejected,"-4144":r.BadSymbol,"-4164":r.InvalidOrder,"-4136":r.InvalidOrder,"-4165":r.BadRequest,"-4167":r.BadRequest,"-4168":r.BadRequest,"-4169":r.OperationRejected,"-4170":r.OperationRejected,"-4171":r.OperationRejected,"-4172":r.OperationRejected,"-4183":r.BadRequest,"-4184":r.BadRequest,"-4192":r.PermissionDenied,"-4202":r.PermissionDenied,"-4203":r.PermissionDenied,"-4205":r.PermissionDenied,"-4206":r.PermissionDenied,"-4208":r.OperationRejected,"-4209":r.OperationRejected,"-4210":r.BadRequest,"-4211":r.BadRequest,"-4400":r.PermissionDenied,"-4401":r.PermissionDenied,"-4402":r.PermissionDenied,"-4403":r.PermissionDenied,"-5021":r.OrderNotFillable,"-5022":r.OrderNotFillable,"-5024":r.OperationRejected,"-5025":r.OperationRejected,"-5026":r.OperationRejected,"-5027":r.OperationRejected,"-5028":r.BadRequest,"-5037":r.BadRequest,"-5038":r.BadRequest,"-5039":r.BadRequest,"-5040":r.BadRequest,"-5041":r.OperationFailed}},inverse:{exact:{"-1005":r.PermissionDenied,"-1011":r.PermissionDenied,"-1023":r.BadRequest,"-1109":r.AuthenticationError,"-1110":r.BadSymbol,"-1113":r.BadRequest,"-1128":r.BadRequest,"-1136":r.BadRequest,"-2016":r.OperationRejected,"-2018":r.InsufficientFunds,"-2019":r.InsufficientFunds,"-2020":r.OperationFailed,"-2021":r.OrderImmediatelyFillable,"-2022":r.InvalidOrder,"-2023":r.OperationFailed,"-2024":r.BadRequest,"-2025":r.OperationRejected,"-2026":r.InvalidOrder,"-2027":r.OperationRejected,"-2028":r.OperationRejected,"-4086":r.BadRequest,"-4087":r.BadSymbol,"-4088":r.BadRequest,"-4089":r.PermissionDenied,"-4090":r.PermissionDenied,"-4110":r.BadRequest,"-4111":r.BadRequest,"-4112":r.OperationRejected,"-4113":r.OperationRejected,"-4150":r.OperationRejected,"-4151":r.BadRequest,"-4152":r.BadRequest,"-4154":r.BadRequest,"-4155":r.BadRequest,"-4178":r.BadRequest,"-4188":r.BadRequest,"-4192":r.PermissionDenied,"-4194":r.PermissionDenied,"-4195":r.PermissionDenied,"-4196":r.BadRequest,"-4197":r.OperationRejected,"-4198":r.OperationRejected,"-4199":r.BadRequest,"-4200":r.PermissionDenied,"-4201":r.PermissionDenied,"-4202":r.OperationRejected}},option:{exact:{"-1003":r.ExchangeError,"-1004":r.ExchangeError,"-1006":r.ExchangeError,"-1007":r.ExchangeError,"-1008":r.RateLimitExceeded,"-1010":r.ExchangeError,"-1013":r.ExchangeError,"-1108":r.ExchangeError,"-1112":r.ExchangeError,"-1114":r.ExchangeError,"-1128":r.BadSymbol,"-1129":r.BadSymbol,"-1131":r.BadRequest,"-2011":r.ExchangeError,"-2018":r.InsufficientFunds,"-2027":r.InsufficientFunds,"-3029":r.OperationFailed,"-4006":r.ExchangeError,"-4007":r.ExchangeError,"-4008":r.ExchangeError,"-4009":r.ExchangeError,"-4010":r.ExchangeError,"-4011":r.ExchangeError,"-4012":r.ExchangeError,"-4014":r.ExchangeError,"-4015":r.ExchangeError,"-4016":r.ExchangeError,"-4017":r.ExchangeError,"-4018":r.ExchangeError,"-4019":r.ExchangeError,"-4020":r.ExchangeError,"-4021":r.ExchangeError,"-4022":r.ExchangeError,"-4023":r.ExchangeError,"-4024":r.ExchangeError,"-4025":r.ExchangeError,"-4026":r.ExchangeError,"-4027":r.ExchangeError,"-4028":r.ExchangeError,"-4031":r.ExchangeError,"-4032":r.ExchangeError,"-4033":r.ExchangeError,"-4034":r.ExchangeError,"-4035":r.ExchangeError,"-4036":r.ExchangeError,"-4037":r.ExchangeError,"-4038":r.ExchangeError,"-4039":r.ExchangeError,"-4040":r.ExchangeError,"-4041":r.ExchangeError,"-4042":r.ExchangeError,"-4043":r.ExchangeError,"-4044":r.ExchangeError,"-4045":r.ExchangeError,"-4046":r.ExchangeError,"-4047":r.ExchangeError,"-4048":r.ExchangeError,"-4049":r.ExchangeError,"-4050":r.ExchangeError,"-4051":r.ExchangeError,"-4052":r.ExchangeError,"-4053":r.ExchangeError,"-4054":r.ExchangeError,"-4056":r.ExchangeError,"-4057":r.ExchangeError,"-4058":r.ExchangeError,"-4059":r.ExchangeError,"-4060":r.ExchangeError,"-4061":r.ExchangeError,"-4062":r.ExchangeError,"-4063":r.ExchangeError,"-4064":r.ExchangeError,"-4065":r.ExchangeError,"-4066":r.ExchangeError,"-4067":r.ExchangeError,"-4068":r.ExchangeError,"-4069":r.ExchangeError,"-4070":r.ExchangeError,"-4071":r.ExchangeError,"-4072":r.ExchangeError,"-4073":r.ExchangeError,"-4074":r.ExchangeError,"-4075":r.ExchangeError,"-4076":r.ExchangeError,"-4077":r.ExchangeError,"-4078":r.ExchangeError,"-4079":r.ExchangeError,"-4080":r.ExchangeError,"-4081":r.ExchangeError,"-4082":r.ExchangeError,"-4083":r.ExchangeError,"-4084":r.ExchangeError,"-4085":r.ExchangeError,"-4086":r.ExchangeError,"-4087":r.ExchangeError,"-4088":r.ExchangeError,"-4089":r.ExchangeError,"-4091":r.ExchangeError,"-4092":r.ExchangeError,"-4093":r.ExchangeError,"-4094":r.ExchangeError,"-4095":r.ExchangeError,"-4096":r.ExchangeError,"-4097":r.ExchangeError,"-4098":r.ExchangeError,"-4099":r.ExchangeError,"-4101":r.ExchangeError,"-4102":r.ExchangeError,"-4103":r.ExchangeError,"-4104":r.ExchangeError,"-4105":r.ExchangeError,"-4106":r.ExchangeError,"-4107":r.ExchangeError,"-4108":r.ExchangeError,"-4109":r.ExchangeError,"-4110":r.ExchangeError,"-4112":r.ExchangeError,"-4113":r.ExchangeError,"-4114":r.ExchangeError,"-4115":r.ExchangeError,"-4116":r.ExchangeError,"-4117":r.ExchangeError,"-4118":r.ExchangeError,"-4119":r.ExchangeError,"-4120":r.ExchangeError,"-4121":r.ExchangeError,"-4122":r.ExchangeError,"-4123":r.ExchangeError,"-4124":r.ExchangeError,"-4125":r.ExchangeError,"-4126":r.ExchangeError,"-4127":r.ExchangeError,"-4128":r.ExchangeError,"-4129":r.ExchangeError,"-4130":r.ExchangeError,"-4131":r.ExchangeError,"-4132":r.ExchangeError,"-4133":r.ExchangeError,"-4134":r.ExchangeError,"-4135":r.ExchangeError,"-4136":r.ExchangeError,"-4137":r.ExchangeError,"-4138":r.ExchangeError,"-4139":r.ExchangeError,"-4141":r.ExchangeError,"-4142":r.ExchangeError,"-4143":r.ExchangeError,"-4144":r.ExchangeError,"-4145":r.ExchangeError,"-4146":r.ExchangeError,"-4147":r.ExchangeError,"-4148":r.ExchangeError,"-4149":r.ExchangeError,"-4150":r.ExchangeError,"-20121":r.ExchangeError,"-20124":r.ExchangeError,"-20130":r.ExchangeError,"-20132":r.ExchangeError,"-20194":r.ExchangeError,"-20195":r.ExchangeError,"-20196":r.ExchangeError,"-20198":r.ExchangeError,"-20204":r.ExchangeError}},portfolioMargin:{exact:{"-1000":r.OperationFailed,"-1001":r.ExchangeError,"-1002":r.PermissionDenied,"-1003":r.RateLimitExceeded,"-1004":r.BadRequest,"-1005":r.PermissionDenied,"-1006":r.BadResponse,"-1007":r.BadResponse,"-1008":r.OperationFailed,"-1010":r.ExchangeError,"-1011":r.PermissionDenied,"-1013":r.ExchangeError,"-1014":r.InvalidOrder,"-1015":r.InvalidOrder,"-1016":r.NotSupported,"-1020":r.NotSupported,"-1021":r.BadRequest,"-1022":r.BadRequest,"-1023":r.BadRequest,"-1099":r.OperationFailed,"-1100":r.BadRequest,"-1101":r.BadRequest,"-1102":r.BadRequest,"-1103":r.BadRequest,"-1104":r.BadRequest,"-1105":r.BadRequest,"-1106":r.BadRequest,"-1108":r.BadRequest,"-1109":r.BadRequest,"-1110":r.BadSymbol,"-1111":r.BadRequest,"-1112":r.BadRequest,"-1113":r.BadRequest,"-1114":r.BadRequest,"-1115":r.BadRequest,"-1116":r.BadRequest,"-1117":r.BadRequest,"-1118":r.BadRequest,"-1119":r.BadRequest,"-1120":r.BadRequest,"-1121":r.BadSymbol,"-1125":r.BadRequest,"-1127":r.BadRequest,"-1128":r.BadRequest,"-1130":r.BadRequest,"-1131":r.BadRequest,"-1134":r.BadRequest,"-1136":r.BadRequest,"-1145":r.BadRequest,"-1151":r.BadRequest,"-2010":r.InvalidOrder,"-2011":r.OperationRejected,"-2013":r.OrderNotFound,"-2014":r.OperationRejected,"-2015":r.OperationRejected,"-2016":r.OperationFailed,"-2018":r.OperationFailed,"-2019":r.OperationFailed,"-2020":r.OrderNotFillable,"-2021":r.OrderImmediatelyFillable,"-2022":r.InvalidOrder,"-2023":r.OperationFailed,"-2024":r.OperationRejected,"-2025":r.OperationRejected,"-2026":r.InvalidOrder,"-2027":r.OperationRejected,"-2028":r.OperationRejected,"-4000":r.BadRequest,"-4001":r.BadRequest,"-4002":r.BadRequest,"-4003":r.BadRequest,"-4004":r.BadRequest,"-4005":r.BadRequest,"-4006":r.BadRequest,"-4007":r.BadRequest,"-4008":r.BadRequest,"-4009":r.BadRequest,"-4010":r.BadRequest,"-4011":r.BadRequest,"-4012":r.BadRequest,"-4013":r.BadRequest,"-4014":r.BadRequest,"-4015":r.BadRequest,"-4016":r.BadRequest,"-4017":r.BadRequest,"-4018":r.BadRequest,"-4019":r.BadRequest,"-4020":r.BadRequest,"-4021":r.BadRequest,"-4022":r.BadRequest,"-4023":r.BadRequest,"-4024":r.BadRequest,"-4025":r.BadRequest,"-4026":r.BadRequest,"-4027":r.BadRequest,"-4028":r.BadRequest,"-4029":r.BadRequest,"-4030":r.BadRequest,"-4031":r.BadRequest,"-4032":r.BadRequest,"-4033":r.BadRequest,"-4044":r.BadRequest,"-4045":r.BadRequest,"-4046":r.BadRequest,"-4047":r.BadRequest,"-4048":r.BadRequest,"-4049":r.BadRequest,"-4050":r.BadRequest,"-4051":r.BadRequest,"-4052":r.BadRequest,"-4053":r.BadRequest,"-4054":r.BadRequest,"-4055":r.BadRequest,"-4056":r.PermissionDenied,"-4057":r.PermissionDenied,"-4058":r.BadRequest,"-4059":r.BadRequest,"-4060":r.BadRequest,"-4061":r.InvalidOrder,"-4062":r.BadRequest,"-4063":r.BadRequest,"-4064":r.BadRequest,"-4065":r.BadRequest,"-4066":r.BadRequest,"-4067":r.BadRequest,"-4068":r.BadRequest,"-4069":r.BadRequest,"-4070":r.BadRequest,"-4071":r.BadRequest,"-4072":r.OperationRejected,"-4073":r.BadRequest,"-4074":r.BadRequest,"-4075":r.BadRequest,"-4076":r.OperationRejected,"-4077":r.OperationRejected,"-4078":r.OperationFailed,"-4079":r.BadRequest,"-4080":r.PermissionDenied,"-4081":r.BadRequest,"-4082":r.BadRequest,"-4083":r.BadRequest,"-4084":r.NotSupported,"-4085":r.BadRequest,"-4086":r.BadRequest,"-4087":r.PermissionDenied,"-4088":r.PermissionDenied,"-4104":r.BadRequest,"-4114":r.BadRequest,"-4115":r.BadRequest,"-4118":r.OperationRejected,"-4131":r.OperationRejected,"-4135":r.BadRequest,"-4137":r.BadRequest,"-4138":r.BadRequest,"-4139":r.BadRequest,"-4140":r.OrderImmediatelyFillable,"-4141":r.BadRequest,"-4142":r.OrderImmediatelyFillable,"-4144":r.BadSymbol,"-4161":r.OperationRejected,"-4164":r.InvalidOrder,"-4165":r.BadRequest,"-4183":r.InvalidOrder,"-4184":r.InvalidOrder,"-4408":r.InvalidOrder,"-5021":r.OrderNotFillable,"-5022":r.OrderNotFillable,"-5028":r.OperationFailed,"-5041":r.RateLimitExceeded}},exact:{"-1000":r.OperationFailed,"-1001":r.OperationFailed,"-1002":r.AuthenticationError,"-1003":r.RateLimitExceeded,"-1004":r.OperationRejected,"-1006":r.OperationFailed,"-1007":r.RequestTimeout,"-1010":r.OperationFailed,"-1013":r.BadRequest,"-1014":r.InvalidOrder,"-1015":r.RateLimitExceeded,"-1016":r.BadRequest,"-1020":r.BadRequest,"-1021":r.InvalidNonce,"-1022":r.AuthenticationError,"-1100":r.BadRequest,"-1101":r.BadRequest,"-1102":r.BadRequest,"-1103":r.BadRequest,"-1104":r.BadRequest,"-1105":r.BadRequest,"-1106":r.BadRequest,"-1108":r.BadSymbol,"-1111":r.BadRequest,"-1112":r.OperationFailed,"-1114":r.BadRequest,"-1115":r.BadRequest,"-1116":r.BadRequest,"-1117":r.BadRequest,"-1118":r.BadRequest,"-1119":r.BadRequest,"-1120":r.BadRequest,"-1121":r.BadSymbol,"-1125":r.AuthenticationError,"-1127":r.BadRequest,"-1128":r.BadRequest,"-1130":r.BadRequest,"-2010":r.InvalidOrder,"-2011":r.OrderNotFound,"-2013":r.OrderNotFound,"-2014":r.AuthenticationError,"-2015":r.AuthenticationError,"-4000":r.InvalidOrder,"-4001":r.BadRequest,"-4002":r.BadRequest,"-4003":r.BadRequest,"-4004":r.BadRequest,"-4005":r.BadRequest,"-4006":r.BadRequest,"-4007":r.BadRequest,"-4008":r.BadRequest,"-4009":r.BadRequest,"-4010":r.BadRequest,"-4011":r.BadRequest,"-4012":r.BadRequest,"-4013":r.BadRequest,"-4014":r.BadRequest,"-4015":r.BadRequest,"-4016":r.BadRequest,"-4017":r.BadRequest,"-4018":r.BadRequest,"-4019":r.OperationRejected,"-4020":r.BadRequest,"-4021":r.BadRequest,"-4022":r.BadRequest,"-4023":r.BadRequest,"-4024":r.BadRequest,"-4025":r.BadRequest,"-4026":r.BadRequest,"-4027":r.BadRequest,"-4028":r.BadRequest,"-4029":r.BadRequest,"-4030":r.BadRequest,"-4031":r.BadRequest,"-4032":r.OperationRejected,"-4033":r.BadRequest,"-4044":r.BadRequest,"-4045":r.OperationRejected,"-4046":r.OperationRejected,"-4047":r.OperationRejected,"-4048":r.OperationRejected,"-4049":r.BadRequest,"-4050":r.InsufficientFunds,"-4051":r.InsufficientFunds,"-4052":r.OperationRejected,"-4053":r.BadRequest,"-4054":r.OperationRejected,"-4055":r.BadRequest,"-4056":r.AuthenticationError,"-4057":r.AuthenticationError,"-4058":r.BadRequest,"-4059":r.OperationRejected,"-4060":r.BadRequest,"-4061":r.OperationRejected,"-4062":r.BadRequest,"-4067":r.OperationRejected,"-4068":r.OperationRejected,"-4082":r.BadRequest,"-4083":r.OperationRejected,"-4084":r.BadRequest,"-4086":r.BadRequest,"-4104":r.BadRequest,"-4135":r.BadRequest,"-4137":r.BadRequest,"-4138":r.BadRequest,"-4139":r.BadRequest,"-4142":r.OrderImmediatelyFillable,"-20121":r.BadSymbol,"-20124":r.BadRequest,"-20130":r.BadRequest,"-20132":r.BadRequest,"-20194":r.BadRequest,"-20195":r.BadRequest,"-20196":r.BadRequest,"-20198":r.OperationRejected,"-20204":r.BadRequest,"System is under maintenance.":r.OnMaintenance,"System abnormality":r.OperationFailed,"You are not authorized to execute this request.":r.PermissionDenied,"API key does not exist":r.AuthenticationError,"Order would trigger immediately.":r.OrderImmediatelyFillable,"Stop price would trigger immediately.":r.OrderImmediatelyFillable,"Order would immediately match and take.":r.OrderImmediatelyFillable,"Account has insufficient balance for requested action.":r.InsufficientFunds,"Rest API trading is not enabled.":r.PermissionDenied,"This account may not place or cancel orders.":r.PermissionDenied,"You don't have permission.":r.PermissionDenied,"Market is closed.":r.MarketClosed,"Too many requests. Please try again later.":r.RateLimitExceeded,"This action is disabled on this account.":r.AccountSuspended,"Limit orders require GTC for this phase.":r.BadRequest,"This order type is not possible in this trading phase.":r.BadRequest,"This type of sub-account exceeds the maximum number limit":r.OperationRejected,"This symbol is restricted for this account.":r.PermissionDenied,"This symbol is not permitted for this account.":r.PermissionDenied},broad:{"has no operation privilege":r.PermissionDenied,MAX_POSITION:r.BadRequest}}})}isInverse(e,t=void 0){return void 0===t?"delivery"===e:"inverse"===t}isLinear(e,t=void 0){return void 0===t?"future"===e||"swap"===e:"linear"===t}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}createExpiredOptionMarket(e){const t="USDT",i=e.split("-"),s=e.split("/");let r;r=e.indexOf("/")>-1?this.safeString(s,0):this.safeString(i,0);const a=this.safeString(i,1),o=this.safeInteger(i,2),n=this.safeString(i,2),d=this.safeString(i,3),h=this.convertExpireDate(a);return{id:r+"-"+a+"-"+n+"-"+d,symbol:r+"/"+t+":"+t+"-"+a+"-"+n+"-"+d,base:r,quote:t,baseId:r,quoteId:t,active:void 0,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:void 0,expiry:this.parse8601(h),expiryDatetime:h,optionType:"C"===d?"call":"put",strike:o,settle:t,settleId:t,precision:{amount:void 0,price:void 0},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}market(e){if(void 0===this.markets)throw new r.ExchangeError(this.id+" markets not loaded");let t=this.safeString(this.options,"defaultType");const i=this.safeString(this.options,"defaultSubType"),s="future"===t,a="delivery"===t,o=s||a;if("string"==typeof e)if(e in this.markets){const t=this.markets[e];if(!o||!t.spot)return t;{const i=e+":"+(s?t.quote:t.base);if(i in this.markets)return this.markets[i]}}else{if(e in this.markets_by_id){const r=this.markets_by_id[e];s?t="linear":a?t="inverse":void 0===t&&(t=i);for(let e=0;e<r.length;e++){const i=r[e];if(i[t])return i}return r[0]}if(e.indexOf("/")>-1&&e.indexOf(":")<0){const[t,i]=e.split("/"),s=e+":"+("USD"===i?t:i);if(s in this.markets)return this.markets[s]}else if(e.indexOf("-C")>-1||e.indexOf("-P")>-1)return this.createExpiredOptionMarket(e)}throw new r.BadSymbol(this.id+" does not have market symbol "+e)}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.indexOf("-C")>-1||e.indexOf("-P")>-1)&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}costToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.quote,this.precisionMode,this.paddingMode)}currencyToPrecision(e,t,i=void 0){return void 0!==this.safeValue(this.currencies[e],"precision")?this.decimalToPrecision(t,o.R3,this.currencies[e].precision,this.precisionMode,this.paddingMode):this.numberToString(t)}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=this.safeString2(this.options,"fetchTime","defaultType","spot"),i=this.safeString(e,"type",t),s=this.omit(e,"type");let r,a;return[r,e]=this.handleSubTypeAndParams("fetchTime",void 0,e),a=this.isLinear(i,r)?await this.fapiPublicGetTime(s):this.isInverse(i,r)?await this.dapiPublicGetTime(s):await this.publicGetTime(s),this.safeInteger(a,"serverTime")}async fetchCurrencies(e={}){if(!this.safeBool(this.options,"fetchCurrencies"))return;if(!this.checkRequiredCredentials(!1))return;if(void 0!==this.safeValue(this.urls,"apiBackup"))return;const t=[this.sapiGetCapitalConfigGetall(e)],i=this.safeBool(this.options,"fetchMargins",!1);i&&t.push(this.sapiGetMarginAllPairs(e));const s=await Promise.all(t),r=s[0];let o;if(i){const e=s[1];o=this.indexBy(e,"assetName")}const n={};for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"coin"),s=this.safeString(t,"name"),d=this.safeCurrencyCode(i),h=this.safeBool(t,"isLegalMoney");let c,l=!0,u=!0;const f=this.safeList(t,"networkList",[]),p={};let m;const g={};for(let e=0;e<f.length;e++){const t=f[e],i=this.safeString(t,"network"),s=this.networkIdToCode(i),r="ETF"===i,o=this.safeNumber(t,"withdrawFee"),n=this.safeBool(t,"depositEnable"),d=this.safeBool(t,"withdrawEnable");u=u||n,l=l||d,p[i]=o;(this.safeBool(t,"isDefault")||void 0===m)&&(m=o);const v=this.safeString(t,"withdrawIntegerMultiple");let y=v;a.Y.stringEq(v,"0")?h||r||(y=this.omitZero(this.safeString(t,"withdrawInternalMin")),void 0===y&&(y=this.safeString(this.options,"defaultWithdrawPrecision"))):c=void 0===c?v:a.Y.stringMin(c,v),g[s]={info:t,id:i,network:s,active:n&&d,deposit:n,withdraw:d,fee:o,precision:this.parseNumber(y),limits:{withdraw:{min:this.safeNumber(t,"withdrawMin"),max:this.safeNumber(t,"withdrawMax")},deposit:{min:this.safeNumber(t,"depositDust"),max:void 0}}}}const v=this.safeBool(t,"trading"),y=l&&u&&v,w=this.safeDict(o,i,{});n[d]={id:i,name:s,code:d,type:h?"fiat":"crypto",precision:this.parseNumber(c),info:t,active:y,deposit:u,withdraw:l,networks:g,fee:m,fees:p,limits:this.limits,margin:this.safeBool(w,"isBorrowable")}}return n}async fetchMarkets(e={}){const t=[],i=this.safeList(this.options,"fetchMarkets",["spot","linear","inverse"]),s=this.safeBool(this.options,"sandboxMode",!1),a=[];for(let e=0;e<i.length;e++){const t=i[e];"option"===t&&s||a.push(t)}const o=this.safeBool(this.options,"fetchMargins",!1);for(let i=0;i<a.length;i++){const n=a[i];if("spot"===n)t.push(this.publicGetExchangeInfo(e)),o&&this.checkRequiredCredentials(!1)&&!s&&(t.push(this.sapiGetMarginAllPairs(e)),t.push(this.sapiGetMarginIsolatedAllPairs(e)));else if("linear"===n)t.push(this.fapiPublicGetExchangeInfo(e));else if("inverse"===n)t.push(this.dapiPublicGetExchangeInfo(e));else{if("option"!==n)throw new r.ExchangeError(this.id+' fetchMarkets() this.options fetchMarkets "'+n+'" is not a supported market type');t.push(this.eapiPublicGetExchangeInfo(e))}}const n=await Promise.all(t);let d=[];this.options.crossMarginPairsData=[],this.options.isolatedMarginPairsData=[];for(let e=0;e<n.length;e++){const t=this.safeValue(n,e);if(o&&Array.isArray(t)){const e=Object.keys(this.indexBy(t,"symbol"));0===this.options.crossMarginPairsData.length?this.options.crossMarginPairsData=e:this.options.isolatedMarginPairsData=e}else{const e=this.safeList2(t,"symbols","optionSymbols",[]);d=this.arrayConcat(d,e)}}this.options.adjustForTimeDifference&&await this.loadTimeDifference();const h=[];for(let e=0;e<d.length;e++)h.push(this.parseMarket(d[e]));return h}parseMarket(e){let t=!1,i=!1,s=!1;const r=this.safeString(e,"underlying"),a=this.safeString(e,"symbol"),o=a.split("-"),n=this.safeString(o,0),d=this.safeStringLower(e,"symbol"),h=this.safeString(e,"baseAsset",n),c=this.safeString(e,"quoteAsset"),l=this.safeCurrencyCode(h),u=this.safeCurrencyCode(c),f=this.safeString(e,"contractType");let p="contractType"in e,m=this.safeInteger2(e,"deliveryDate","expiryDate"),g=this.safeString(e,"marginAsset");"PERPETUAL"===f||41334048e5===m?(m=void 0,t=!0):void 0!==r?(p=!0,s=!0,g=void 0===g?"USDT":g):void 0!==m&&(i=!0);const v=this.safeCurrencyCode(g),y=!p,w=this.safeList(e,"filters",[]),b=this.indexBy(w,"filterType"),k=this.safeString2(e,"status","contractStatus");let S,O,T,P,I=this.fees,M=l+"/"+u;if(p){t?M=M+":"+v:i?M=M+":"+v+"-"+this.yymmdd(m):s&&(P=this.numberToString(this.parseToNumeric(this.safeString(e,"strikePrice"))),M=M+":"+v+"-"+this.yymmdd(m)+"-"+P+"-"+this.safeString(o,3)),S=this.safeNumber2(e,"contractSize","unit",this.parseNumber("1")),O=v===u,T=v===l;const r=O?"linear":"inverse";I=this.safeDict(this.fees,r,{})}let x="TRADING"===k;if(y){const t=this.safeList(e,"permissions",[]);for(let e=0;e<t.length;e++)if("TRD_GRP_003"===t[e]){x=!1;break}}const A=this.safeBool(e,"isMarginTradingAllowed",!1);let C,B,_;if(y){C={cross:this.inArray(a,this.options.crossMarginPairsData),isolated:this.inArray(a,this.options.isolatedMarginPairsData)}}else(O||T)&&(C={cross:!0,isolated:!0});y?B="spot":t?B="swap":i?B="future":s&&(B="option",x=void 0),void 0!==P&&(_=this.parseToNumeric(P));const E={id:a,lowercaseId:d,symbol:M,base:l,quote:u,settle:v,baseId:h,quoteId:c,settleId:g,type:B,spot:y,margin:y&&A,marginModes:C,swap:t,future:i,option:s,active:x,contract:p,linear:O,inverse:T,taker:I.trading.taker,maker:I.trading.maker,contractSize:S,expiry:m,expiryDatetime:this.iso8601(m),strike:_,optionType:this.safeStringLower(e,"side"),precision:{amount:this.parseNumber(this.parsePrecision(this.safeString2(e,"quantityPrecision","quantityScale"))),price:this.parseNumber(this.parsePrecision(this.safeString2(e,"pricePrecision","priceScale"))),base:this.parseNumber(this.parsePrecision(this.safeString(e,"baseAssetPrecision"))),quote:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrecision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"minQty"),max:this.safeNumber(e,"maxQty")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:e,created:this.safeInteger(e,"onboardDate")};if("PRICE_FILTER"in b){const e=this.safeDict(b,"PRICE_FILTER",{});E.limits.price={min:this.safeNumber(e,"minPrice"),max:this.safeNumber(e,"maxPrice")},E.precision.price=this.safeNumber(e,"tickSize")}if("LOT_SIZE"in b){const e=this.safeDict(b,"LOT_SIZE",{});E.precision.amount=this.safeNumber(e,"stepSize"),E.limits.amount={min:this.safeNumber(e,"minQty"),max:this.safeNumber(e,"maxQty")}}if("MARKET_LOT_SIZE"in b){const e=this.safeDict(b,"MARKET_LOT_SIZE",{});E.limits.market={min:this.safeNumber(e,"minQty"),max:this.safeNumber(e,"maxQty")}}if("MIN_NOTIONAL"in b||"NOTIONAL"in b){const e=this.safeDict2(b,"MIN_NOTIONAL","NOTIONAL",{});E.limits.cost.min=this.safeNumber2(e,"minNotional","notional"),E.limits.cost.max=this.safeNumber(e,"maxNotional")}return E}parseBalanceHelper(e){const t=this.account();t.used=this.safeString(e,"locked"),t.free=this.safeString(e,"free");const i=this.safeString(e,"interest"),s=this.safeString(e,"borrowed");return t.debt=a.Y.stringAdd(s,i),t}parseBalanceCustom(e,t=void 0,i=void 0,s=!1){const r={info:e};let o;const n="isolated"===i,d="margin"===t||"cross"===i;if(s)for(let i=0;i<e.length;i++){const s=e[i],o=this.account(),n=this.safeString(s,"asset"),h=this.safeCurrencyCode(n);if("linear"===t)o.free=this.safeString(s,"umWalletBalance"),o.used=this.safeString(s,"umUnrealizedPNL");else if("inverse"===t)o.free=this.safeString(s,"cmWalletBalance"),o.used=this.safeString(s,"cmUnrealizedPNL");else if(d){const e=this.safeString(s,"crossMarginBorrowed"),t=this.safeString(s,"crossMarginInterest");o.debt=a.Y.stringAdd(e,t),o.free=this.safeString(s,"crossMarginFree"),o.used=this.safeString(s,"crossMarginLocked"),o.total=this.safeString(s,"crossMarginAsset")}else{const e=this.safeString(s,"umUnrealizedPNL"),t=this.safeString(s,"cmUnrealizedPNL"),i=a.Y.stringAdd(e,t),r=this.safeString(s,"totalWalletBalance");o.total=a.Y.stringAdd(i,r)}r[h]=o}else if(n||"spot"!==t&&!d)if(n){const t=this.safeList(e,"assets");for(let e=0;e<t.length;e++){const i=t[e],s=this.safeString(i,"symbol"),a=this.safeSymbol(s,void 0,void 0,"spot"),o=this.safeDict(i,"baseAsset",{}),n=this.safeDict(i,"quoteAsset",{}),d=this.safeCurrencyCode(this.safeString(o,"asset")),h=this.safeCurrencyCode(this.safeString(n,"asset")),c={};c[d]=this.parseBalanceHelper(o),c[h]=this.parseBalanceHelper(n),r[a]=this.safeBalance(c)}}else if("savings"===t){const t=this.safeList(e,"positionAmountVos",[]);for(let e=0;e<t.length;e++){const i=t[e],s=this.safeString(i,"asset"),a=this.safeCurrencyCode(s),o=this.account(),n=this.safeString(i,"amount");o.total=n,o.used=n,r[a]=o}}else if("funding"===t)for(let t=0;t<e.length;t++){const i=e[t],s=this.account(),o=this.safeString(i,"asset"),n=this.safeCurrencyCode(o);s.free=this.safeString(i,"free");const d=this.safeString(i,"freeze"),h=this.safeString(i,"withdrawing"),c=this.safeString(i,"locked");s.used=a.Y.stringAdd(d,a.Y.stringAdd(c,h)),r[n]=s}else{let t=e;Array.isArray(e)||(t=this.safeList(e,"assets",[]));for(let e=0;e<t.length;e++){const i=t[e],s=this.safeString(i,"asset"),a=this.safeCurrencyCode(s),o=this.account();o.free=this.safeString(i,"availableBalance"),o.used=this.safeString(i,"initialMargin"),o.total=this.safeString2(i,"marginBalance","balance"),r[a]=o}}else{o=this.safeInteger(e,"updateTime");const t=this.safeList2(e,"balances","userAssets",[]);for(let e=0;e<t.length;e++){const i=t[e],s=this.safeString(i,"asset"),o=this.safeCurrencyCode(s),n=this.account();if(n.free=this.safeString(i,"free"),n.used=this.safeString(i,"locked"),d){const e=this.safeString(i,"borrowed"),t=this.safeString(i,"interest");n.debt=a.Y.stringAdd(e,t)}r[o]=n}}return r.timestamp=o,r.datetime=this.iso8601(o),n?r:this.safeBalance(r)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString2(this.options,"fetchBalance","defaultType","spot");let i,s,r,a,o,n=this.safeString(e,"type",t);[i,e]=this.handleSubTypeAndParams("fetchBalance",void 0,e),[s,e]=this.handleOptionAndParams2(e,"fetchBalance","papi","portfolioMargin",!1),[r,a]=this.handleMarginModeAndParams("fetchBalance",e),a=this.omit(a,"type");const d={};if(s||"papi"===n)this.isLinear(n,i)?n="linear":this.isInverse(n,i)&&(n="inverse"),s=!0,o=await this.papiGetBalance(this.extend(d,a));else if(this.isLinear(n,i)){let t;n="linear",[t,e]=this.handleOptionAndParams(e,"fetchBalance","useV2",!1),e=this.extend(d,a),o=t?await this.fapiPrivateV2GetAccount(e):await this.fapiPrivateV3GetAccount(e)}else if(this.isInverse(n,i))n="inverse",o=await this.dapiPrivateGetAccount(this.extend(d,a));else if("isolated"===r){const t=this.safeList(e,"symbols");if(a=this.omit(a,"symbols"),void 0!==t){let e="";if(Array.isArray(t)){e=this.marketId(t[0]);for(let i=1;i<t.length;i++){const s=t[i];e+=","+this.marketId(s)}}else e=t;d.symbols=e}o=await this.sapiGetMarginIsolatedAccount(this.extend(d,a))}else o="margin"===n||"cross"===r?await this.sapiGetMarginAccount(this.extend(d,a)):"savings"===n?await this.sapiGetLendingUnionAccount(this.extend(d,a)):"funding"===n?await this.sapiPostAssetGetFundingAsset(this.extend(d,a)):await this.privateGetAccount(this.extend(d,a));return this.parseBalanceCustom(o,n,r,s)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let a;void 0!==t&&(r.limit=t),a=s.option?await this.eapiPublicGetDepth(this.extend(r,i)):s.linear?await this.fapiPublicGetDepth(this.extend(r,i)):s.inverse?await this.dapiPublicGetDepth(this.extend(r,i)):await this.publicGetDepth(this.extend(r,i));const o=this.safeInteger(a,"T"),n=this.parseOrderBook(a,e,o);return n.nonce=this.safeInteger2(a,"lastUpdateId","u"),n}parseTicker(e,t=void 0){const i=this.safeInteger2(e,"closeTime","time");let s;"time"in e&&(s="contract"),void 0===s&&(s="bidQty"in e?"spot":"contract");const r=this.safeString(e,"symbol"),o=this.safeSymbol(r,t,void 0,s),n=this.safeString(e,"lastPrice"),d=this.safeString(e,"weightedAvgPrice");let h,c;return"baseVolume"in e?(h=this.safeString(e,"baseVolume"),c=a.Y.stringMul(h,d)):(h=this.safeString(e,"volume"),c=this.safeString2(e,"quoteVolume","amount")),this.safeTicker({symbol:o,timestamp:i,datetime:this.iso8601(i),high:this.safeString2(e,"highPrice","high"),low:this.safeString2(e,"lowPrice","low"),bid:this.safeString(e,"bidPrice"),bidVolume:this.safeString(e,"bidQty"),ask:this.safeString(e,"askPrice"),askVolume:this.safeString(e,"askQty"),vwap:d,open:this.safeString2(e,"openPrice","open"),close:n,last:n,previousClose:this.safeString(e,"prevClosePrice"),change:this.safeString(e,"priceChange"),percentage:this.safeString(e,"priceChangePercent"),average:void 0,baseVolume:h,quoteVolume:c,markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchStatus(e={}){const t=await this.sapiGetSystemStatus(e),i=this.safeString(t,"status");return{status:this.safeString({0:"ok",1:"maintenance"},i,i),updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;if(i.option)r=await this.eapiPublicGetTicker(this.extend(s,t));else if(i.linear)r=await this.fapiPublicGetTicker24hr(this.extend(s,t));else if(i.inverse)r=await this.dapiPublicGetTicker24hr(this.extend(s,t));else{const e=this.safeBool(t,"rolling",!1);t=this.omit(t,"rolling"),r=e?await this.publicGetTicker(this.extend(s,t)):await this.publicGetTicker24hr(this.extend(s,t))}if(Array.isArray(r)){const e=this.safeDict(r,0,{});return this.parseTicker(e,i)}return this.parseTicker(r,i)}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0,!0);const i=this.getMarketFromSymbols(e);let s,a,o;if([s,t]=this.handleMarketTypeAndParams("fetchBidsAsks",i,t),[a,t]=this.handleSubTypeAndParams("fetchBidsAsks",i,t),this.isLinear(s,a))o=await this.fapiPublicGetTickerBookTicker(t);else if(this.isInverse(s,a))o=await this.dapiPublicGetTickerBookTicker(t);else{if("spot"!==s)throw new r.NotSupported(this.id+" fetchBidsAsks() does not support "+s+" markets yet");{const i={};void 0!==e&&(i.symbols=this.json(this.marketIds(e))),o=await this.publicGetTickerBookTicker(this.extend(i,t))}}return this.parseTickers(o,e)}async fetchLastPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0,!0);const i=this.getMarketFromSymbols(e);let s,a,o;if([s,t]=this.handleMarketTypeAndParams("fetchLastPrices",i,t),[a,t]=this.handleSubTypeAndParams("fetchLastPrices",i,t),this.isLinear(s,a))o=await this.fapiPublicV2GetTickerPrice(t);else if(this.isInverse(s,a))o=await this.dapiPublicGetTickerPrice(t);else{if("spot"!==s)throw new r.NotSupported(this.id+" fetchLastPrices() does not support "+s+" markets yet");o=await this.publicGetTickerPrice(t)}return this.parseLastPrices(o,e)}parseLastPrice(e,t=void 0){const i=this.safeInteger(e,"time"),s=void 0===i?"spot":"swap",r=this.safeString(e,"symbol");return{symbol:(t=this.safeMarket(r,t,void 0,s)).symbol,timestamp:i,datetime:this.iso8601(i),price:this.safeNumberOmitZero(e,"price"),side:void 0,info:e}}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0,!0);const i=this.getMarketFromSymbols(e);let s,a,o;if([s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),[a,t]=this.handleSubTypeAndParams("fetchTickers",i,t),this.isLinear(s,a))o=await this.fapiPublicGetTicker24hr(t);else if(this.isInverse(s,a))o=await this.dapiPublicGetTicker24hr(t);else if("spot"===s){const i={};void 0!==e&&(i.symbols=this.json(this.marketIds(e))),o=await this.publicGetTicker24hr(this.extend(i,t))}else{if("option"!==s)throw new r.NotSupported(this.id+" fetchTickers() does not support "+s+" markets yet");o=await this.eapiPublicGetTicker(t)}return this.parseTickers(o,e)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e);let s,a;[s,t]=this.handleMarketTypeAndParams("fetchMarkPrice",i,t,"swap"),[a,t]=this.handleSubTypeAndParams("fetchMarkPrice",i,t,"linear");const o={symbol:i.id};let n;if(this.isLinear(s,a))n=await this.fapiPublicGetPremiumIndex(this.extend(o,t));else{if(!this.isInverse(s,a))throw new r.NotSupported(this.id+" fetchMarkPrice() does not support "+s+" markets yet");n=await this.dapiPublicGetPremiumIndex(this.extend(o,t))}return Array.isArray(n)?this.parseTicker(this.safeDict(n,0,{}),i):this.parseTicker(n,i)}async fetchMarkPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0,!0);const i=this.getMarketFromSymbols(e);let s,a,o;if([s,t]=this.handleMarketTypeAndParams("fetchMarkPrices",i,t,"swap"),[a,t]=this.handleSubTypeAndParams("fetchMarkPrices",i,t,"linear"),this.isLinear(s,a))o=await this.fapiPublicGetPremiumIndex(t);else{if(!this.isInverse(s,a))throw new r.NotSupported(this.id+" fetchMarkPrices() does not support "+s+" markets yet");o=await this.dapiPublicGetPremiumIndex(t)}return this.parseTickers(o,e)}parseOHLCV(e,t=void 0){const i=this.safeBool(t,"inverse")?7:5;return[this.safeInteger2(e,0,"openTime"),this.safeNumber2(e,1,"open"),this.safeNumber2(e,2,"high"),this.safeNumber2(e,3,"low"),this.safeNumber2(e,4,"close"),this.safeNumber2(e,i,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const o=this.market(e),n=this.safeString(r,"price"),d=this.safeInteger(r,"until");r=this.omit(r,["price","until"]),void 0!==i&&void 0!==d&&void 0===s&&(s=1500),s=void 0===s?500:Math.min(s,1500);const h={interval:this.safeString(this.timeframes,t,t),limit:s},c=o.id;if("index"===n){const e=c.split("_"),t=this.safeString(e,0);h.pair=t}else h.symbol=c;if(void 0!==i&&(h.startTime=i,o.inverse&&i>0)){const e=this.parseTimeframe(t),r=this.sum(i,s*e*1e3-1),a=this.milliseconds();h.endTime=Math.min(a,r)}let l;void 0!==d&&(h.endTime=d),l=o.option?await this.eapiPublicGetKlines(this.extend(h,r)):"mark"===n?o.inverse?await this.dapiPublicGetMarkPriceKlines(this.extend(h,r)):await this.fapiPublicGetMarkPriceKlines(this.extend(h,r)):"index"===n?o.inverse?await this.dapiPublicGetIndexPriceKlines(this.extend(h,r)):await this.fapiPublicGetIndexPriceKlines(this.extend(h,r)):"premiumIndex"===n?o.inverse?await this.dapiPublicGetPremiumIndexKlines(this.extend(h,r)):await this.fapiPublicGetPremiumIndexKlines(this.extend(h,r)):o.linear?await this.fapiPublicGetKlines(this.extend(h,r)):o.inverse?await this.dapiPublicGetKlines(this.extend(h,r)):await this.publicGetKlines(this.extend(h,r));return this.parseOHLCVs(l,o,t,i,s)}parseTrade(e,t=void 0){if("isDustTrade"in e)return this.parseDustTrade(e,t);const i=this.safeInteger2(e,"T","time");let s=this.safeString2(e,"q","qty");s=this.safeString(e,"quantity",s);const r=this.safeString(e,"symbol"),o="isIsolated"in e||"M"in e||"orderListId"in e||"isMaker"in e?"spot":"contract",n=(t=this.safeMarket(r,t,void 0,o)).symbol;let d;const h=this.safeBool2(e,"m","isBuyerMaker");let c,l;if(void 0!==h?d=h?"sell":"buy":"side"in e?d=this.safeStringLower(e,"side"):"isBuyer"in e&&(d=e.isBuyer?"buy":"sell"),"commission"in e&&(l={cost:this.safeString(e,"commission"),currency:this.safeCurrencyCode(this.safeString(e,"commissionAsset"))}),"isMaker"in e&&(c=e.isMaker?"maker":"taker"),"maker"in e&&(c=e.maker?"maker":"taker"),"optionSide"in e||t.option){const t=this.safeCurrencyCode(this.safeString(e,"quoteAsset","USDT"));c=this.safeStringLower(e,"liquidity"),"fee"in e&&(l={cost:this.safeString(e,"fee"),currency:t}),"buy"!==d&&"sell"!==d&&(d="1"===d?"buy":"sell"),"optionSide"in e&&"buy"!==d&&(s=a.Y.stringMul("-1",s))}return this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:n,id:this.safeStringN(e,["t","a","tradeId","id"]),order:this.safeString(e,"orderId"),type:this.safeStringLower(e,"type"),side:d,takerOrMaker:c,price:this.safeString2(e,"p","price"),amount:s,cost:this.safeString2(e,"quoteQty","baseQty"),fee:l},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);const a=this.market(e),o={symbol:a.id};if(!a.option){void 0!==t&&(o.startTime=t,o.endTime=this.sum(t,36e5));const e=this.safeInteger(s,"until");void 0!==e&&(o.endTime=e)}let n,d=this.safeString(this.options,"fetchTradesMethod");if(d=this.safeString2(s,"fetchTradesMethod","method",d),void 0!==i){const e=a.swap||a.future,t=void 0!==d&&d.indexOf("GetHistoricalTrades")>=0?500:1e3;o.limit=e?Math.min(i,t):i}return s=this.omit(s,["until","fetchTradesMethod"]),n=a.option||"eapiPublicGetTrades"===d?await this.eapiPublicGetTrades(this.extend(o,s)):a.linear||"fapiPublicGetAggTrades"===d?await this.fapiPublicGetAggTrades(this.extend(o,s)):a.inverse||"dapiPublicGetAggTrades"===d?await this.dapiPublicGetAggTrades(this.extend(o,s)):await this.publicGetAggTrades(this.extend(o,s)),this.parseTrades(n,a,t,i)}async editSpotOrder(e,t,i,s,a,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);if(!d.spot)throw new r.NotSupported(this.id+" editSpotOrder() does not support "+d.type+" orders");const h=this.editSpotOrderRequest(e,t,i,s,a,o,n),c=await this.privatePostOrderCancelReplace(h),l=this.safeDict(c,"newOrderResponse");return this.parseOrder(l,d)}editSpotOrderRequest(e,t,i,s,n,d=void 0,h={}){const c=this.market(t),l=this.safeStringN(h,["newClientOrderId","clientOrderId","origClientOrderId"]),u={symbol:c.id,side:s.toUpperCase()},f=i.toUpperCase();let p=f;this.isPostOnly("MARKET"===f,"LIMIT_MAKER"===f,h)&&(p="LIMIT_MAKER"),u.type=p;const m=this.safeNumber2(h,"stopPrice","triggerPrice");void 0!==m&&("MARKET"===p?p="STOP_LOSS":"LIMIT"===p&&(p="STOP_LOSS_LIMIT"));const g=this.safeList(c.info,"orderTypes");if(!this.inArray(p,g))throw f!==p?new r.InvalidOrder(this.id+" triggerPrice parameter is not allowed for "+t+" "+i+" orders"):new r.InvalidOrder(this.id+" "+i+" is not a valid order type for the "+t+" market");if(void 0===l){const e=this.safeDict(this.options,"broker");if(void 0!==e){const t=this.safeString(e,"spot");void 0!==t&&(u.newClientOrderId=t+this.uuid22())}}else u.newClientOrderId=l;u.newOrderRespType=this.safeValue(this.options.newOrderRespType,i,"RESULT");let v=!1,y=!1,w=!1,b=!1;if("MARKET"===p){if(this.safeBool(this.options,"quoteOrderQty",!0)){const e=this.safeValue2(h,"quoteOrderQty","cost"),t=c.precision.price;if(void 0!==e)u.quoteOrderQty=this.decimalToPrecision(e,o.R3,t,this.precisionMode);else if(void 0!==d){const e=this.numberToString(n),i=this.numberToString(d),s=a.Y.stringMul(e,i);u.quoteOrderQty=this.decimalToPrecision(s,o.R3,t,this.precisionMode)}else b=!0}else b=!0}else"LIMIT"===p?(y=!0,v=!0,b=!0):"STOP_LOSS"===p||"TAKE_PROFIT"===p?(w=!0,b=!0):"STOP_LOSS_LIMIT"===p||"TAKE_PROFIT_LIMIT"===p?(b=!0,w=!0,y=!0,v=!0):"LIMIT_MAKER"===p&&(y=!0,b=!0);if(b&&(u.quantity=this.amountToPrecision(t,n)),y){if(void 0===d)throw new r.InvalidOrder(this.id+" editOrder() requires a price argument for a "+i+" order");u.price=this.priceToPrecision(t,d)}if(v&&void 0===this.safeString(h,"timeInForce")&&(u.timeInForce=this.options.defaultTimeInForce),w){if(void 0===m)throw new r.InvalidOrder(this.id+" editOrder() requires a triggerPrice extra param for a "+i+" order");u.stopPrice=this.priceToPrecision(t,m)}u.cancelReplaceMode="STOP_ON_FAILURE";return void 0===this.safeString2(h,"cancelNewClientOrderId","cancelOrigClientOrderId")&&(u.cancelOrderId=e),"PO"===this.safeString(h,"timeInForce")&&(h=this.omit(h,["timeInForce"])),h=this.omit(h,["quoteOrderQty","cost","stopPrice","newClientOrderId","clientOrderId","postOnly"]),this.extend(u,h)}editContractOrderRequest(e,t,i,s,a,o=void 0,n={}){const d=this.market(t);if(!d.contract)throw new r.NotSupported(this.id+" editContractOrder() does not support "+d.type+" orders");const h={symbol:d.id,side:s.toUpperCase(),orderId:e,quantity:this.amountToPrecision(t,a)},c=this.safeStringN(n,["newClientOrderId","clientOrderId","origClientOrderId"]);return void 0!==o&&(h.price=this.priceToPrecision(t,o)),void 0!==c&&(h.origClientOrderId=c),n=this.omit(n,["clientOrderId","newClientOrderId"]),h}async editContractOrder(e,t,i,s,a,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);let h;if([h,n]=this.handleOptionAndParams2(n,"editContractOrder","papi","portfolioMargin",!1),(d.linear||h)&&void 0===o&&!("priceMatch"in n))throw new r.ArgumentsRequired(this.id+" editOrder() requires a price argument for portfolio margin and linear orders");const c=this.editContractOrderRequest(e,t,i,s,a,o,n);let l;return d.linear?l=h?await this.papiPutUmOrder(this.extend(c,n)):await this.fapiPrivatePutOrder(this.extend(c,n)):d.inverse&&(l=h?await this.papiPutCmOrder(this.extend(c,n)):await this.dapiPrivatePutOrder(this.extend(c,n))),this.parseOrder(l,d)}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);if(d.option)throw new r.NotSupported(this.id+" editOrder() does not support "+d.type+" orders");return d.spot?await this.editSpotOrder(e,t,i,s,a,o,n):await this.editContractOrder(e,t,i,s,a,o,n)}async editOrders(e,t={}){await this.loadMarkets();const i=[];let s=[];for(let t=0;t<e.length;t++){const a=e[t],o=this.safeString(a,"symbol");s.push(o);const n=this.safeString(a,"id"),d=this.safeString(a,"type"),h=this.safeString(a,"side"),c=this.safeValue(a,"amount"),l=this.safeValue(a,"price");let u,f=this.safeDict(a,"params",{});if([u,f]=this.handleOptionAndParams2(f,"editOrders","papi","portfolioMargin",!1),u)throw new r.NotSupported(this.id+" editOrders() does not support portfolio margin orders");const p=this.editContractOrderRequest(n,o,d,h,c,l,f);i.push(p)}s=this.marketSymbols(s,void 0,!1,!0,!0);const a=this.market(s[0]);if(a.spot||a.option)throw new r.NotSupported(this.id+" editOrders() does not support "+a.type+" orders");let o,n={batchOrders:i};return n=this.extend(n,t),a.linear?o=await this.fapiPrivatePutBatchOrders(n):a.inverse&&(o=await this.dapiPrivatePutBatchOrders(n)),this.parseOrders(o)}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIALLY_FILLED:"open",ACCEPTED:"open",FILLED:"closed",CANCELED:"canceled",CANCELLED:"canceled",PENDING_CANCEL:"canceling",REJECTED:"rejected",EXPIRED:"expired",EXPIRED_IN_MATCH:"expired"},e,e)}parseOrder(e,t=void 0){if(void 0!==this.safeString(e,"code"))return this.safeOrder({info:e,status:"rejected"},t);const i=this.parseOrderStatus(this.safeString2(e,"status","strategyStatus")),s=this.safeString(e,"symbol"),r="positionSide"in e||"cumQuote"in e?"contract":"spot",o=this.safeSymbol(s,t,void 0,r),n=this.safeString(e,"executedQty","0"),d=this.safeIntegerN(e,["time","createTime","workingTime","transactTime","updateTime"]);let h;if("transactTime"in e||"updateTime"in e){const t=this.safeInteger2(e,"updateTime","transactTime");"open"===i?a.Y.stringGt(n,"0")&&(h=t):"closed"===i&&(h=t)}const c=this.safeInteger2(e,"transactTime","updateTime"),l=this.safeString(e,"avgPrice"),u=this.safeString(e,"price"),f=this.safeString2(e,"origQty","quantity");let p=this.safeString2(e,"cummulativeQuoteQty","cumQuote");p=this.safeString(e,"cumBase",p);let m=this.safeStringLower(e,"type");const g=this.safeStringLower(e,"side"),v=this.safeList(e,"fills",[]);let y=this.safeString(e,"timeInForce");"GTX"===y&&(y="PO");const w="limit_maker"===m||"PO"===y;"limit_maker"===m&&(m="limit");const b=this.safeString(e,"stopPrice"),k=this.parseNumber(this.omitZero(b)),S=this.safeNumber(e,"fee");let O;return void 0!==S&&(O={currency:this.safeString(e,"quoteAsset"),cost:S,rate:void 0}),this.safeOrder({info:e,id:this.safeString2(e,"strategyId","orderId"),clientOrderId:this.safeString2(e,"clientOrderId","newClientStrategyId"),timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:h,lastUpdateTimestamp:c,symbol:o,type:m,timeInForce:y,postOnly:w,reduceOnly:this.safeBool(e,"reduceOnly"),side:g,price:u,triggerPrice:k,amount:f,cost:p,average:l,filled:n,remaining:void 0,status:i,fee:O,trades:v},t)}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s=[];for(let t=0;t<e.length;t++){const r=e[t],a=this.safeString(r,"symbol");s.push(a);const o=this.safeString(r,"type"),n=this.safeString(r,"side"),d=this.safeValue(r,"amount"),h=this.safeValue(r,"price"),c=this.safeDict(r,"params",{}),l=this.createOrderRequest(a,o,n,d,h,c);i.push(l)}s=this.marketSymbols(s,void 0,!1,!0,!0);const a=this.market(s[0]);if(a.spot)throw new r.NotSupported(this.id+" createOrders() does not support "+a.type+" orders");let o,n={batchOrders:i};return n=this.extend(n,t),o=a.linear?await this.fapiPrivatePostBatchOrders(n):a.option?await this.eapiPrivatePostBatchOrders(n):await this.dapiPrivatePostBatchOrders(n),this.parseOrders(o)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeString(a,"type",o.type),d=this.safeString(a,"marginMode"),h=this.safeBool2(this.options,"papi","portfolioMargin",!1),c=this.safeBool2(a,"papi","portfolioMargin",h),l=this.safeString2(a,"triggerPrice","stopPrice"),u=this.safeString(a,"stopLossPrice"),f=this.safeString(a,"takeProfitPrice"),p=this.safeString2(a,"trailingPercent","callbackRate"),m=void 0!==l||void 0!==p||void 0!==u||void 0!==f,g=this.safeBool2(a,"sor","SOR",!1),v=this.safeBool(a,"test",!1);a=this.omit(a,["sor","SOR","test"]);const y=this.createOrderRequest(e,t,i,s,r,a);let w;return w=o.option?await this.eapiPrivatePostOrder(y):g?v?await this.privatePostSorOrderTest(y):await this.privatePostSorOrder(y):o.linear?c?m?await this.papiPostUmConditionalOrder(y):await this.papiPostUmOrder(y):await this.fapiPrivatePostOrder(y):o.inverse?c?m?await this.papiPostCmConditionalOrder(y):await this.papiPostCmOrder(y):await this.dapiPrivatePostOrder(y):"margin"===n||void 0!==d||c?c?await this.papiPostMarginOrder(y):await this.sapiPostMarginOrder(y):v?await this.privatePostOrderTest(y):await this.privatePostOrder(y),this.parseOrder(w,o)}createOrderRequest(e,t,i,s,n=void 0,d={}){const h=this.market(e),c=this.safeString(d,"type",h.type),l=this.safeString2(d,"newClientOrderId","clientOrderId"),u=t.toUpperCase(),f="MARKET"===u,p="LIMIT"===u,m={symbol:h.id,side:i.toUpperCase()};let g,v;[g,d]=this.handleOptionAndParams2(d,"createOrder","papi","portfolioMargin",!1),[v,d]=this.handleMarginModeAndParams("createOrder",d);const y=this.safeBool(d,"reduceOnly",!1);y&&("margin"===c||!h.contract&&void 0!==v)&&(d=this.omit(d,"reduceOnly"),m.sideEffectType="AUTO_REPAY");const w=this.safeString2(d,"triggerPrice","stopPrice"),b=this.safeString(d,"stopLossPrice",w),k=this.safeString(d,"takeProfitPrice"),S=this.safeString(d,"trailingDelta"),O=this.safeString2(d,"trailingTriggerPrice","activationPrice"),T=this.safeStringN(d,["trailingPercent","callbackRate","trailingDelta"]),P=void 0!==T,I=void 0!==b||void 0!==S,M=void 0!==k,x=g&&(void 0!==w||P||I||M),A=void 0!==this.safeString(d,"priceMatch");let C,B=t.toUpperCase();if(P)if(h.swap)B="TRAILING_STOP_MARKET",m.callbackRate=T,void 0!==O&&(m.activationPrice=this.priceToPrecision(e,O));else{if(f)throw new r.InvalidOrder(this.id+" trailingPercent orders are not supported for "+e+" "+t+" orders");const i=this.safeString(d,"stopLossOrTakeProfit");if(d=this.omit(d,"stopLossOrTakeProfit"),"stopLoss"!==i&&"takeProfit"!==i)throw new r.InvalidOrder(this.id+e+" trailingPercent orders require a stopLossOrTakeProfit parameter of either stopLoss or takeProfit");"stopLoss"===i?B="STOP_LOSS_LIMIT":"takeProfit"===i&&(B="TAKE_PROFIT_LIMIT"),void 0!==O&&(C=this.priceToPrecision(e,O));const s=a.Y.stringMul(T,"100");m.trailingDelta=s}else I?(C=b,f?B=h.contract?"STOP_MARKET":"STOP_LOSS":p&&(B=h.contract?"STOP":"STOP_LOSS_LIMIT")):M&&(C=k,f?B=h.contract?"TAKE_PROFIT_MARKET":"TAKE_PROFIT":p&&(B=h.contract?"TAKE_PROFIT":"TAKE_PROFIT_LIMIT"));if(h.option){if("market"===t)throw new r.InvalidOrder(this.id+" "+t+" is not a valid order type for the "+e+" market")}else{const i=this.safeList(h.info,"orderTypes");if(!this.inArray(B,i))throw u!==B?new r.InvalidOrder(this.id+" triggerPrice parameter is not allowed for "+e+" "+t+" orders"):new r.InvalidOrder(this.id+" "+t+" is not a valid order type for the "+e+" market")}const _=x?"newClientStrategyId":"newClientOrderId";if(void 0===l){const e=this.safeDict(this.options,"broker",{}),t=h.contract?"x-xcKtGhcu":"x-R4BD3S82",i=this.safeString(e,c,t);m[_]=i+this.uuid22()}else m[_]=l;let E;g?(E=this.isPostOnly(f,"LIMIT_MAKER"===u,d),E&&(h.contract?m.timeInForce="GTX":B="LIMIT_MAKER")):(E=this.isPostOnly(f,"LIMIT_MAKER"===u,d),(h.spot||"margin"===c)&&(E&&(B="LIMIT_MAKER"),"isolated"===v&&(m.isIsolated=!0))),m.newOrderRespType="spot"!==c&&"margin"!==c||g?"RESULT":this.safeString(this.options.newOrderRespType,t,"FULL");m[x?"strategyType":"type"]=B;const N=this.safeBool(d,"closePosition",!1);let R=!1,L=!1,D=!1,q=!1;if("MARKET"===B)if(h.spot){if(this.safeBool(this.options,"quoteOrderQty",!0)){const e=this.safeString2(d,"quoteOrderQty","cost"),t=h.precision.price;if(void 0!==e)m.quoteOrderQty=this.decimalToPrecision(e,o.R3,t,this.precisionMode);else if(void 0!==n){const e=this.numberToString(s),i=this.numberToString(n),r=a.Y.stringMul(e,i);m.quoteOrderQty=this.decimalToPrecision(r,o.R3,t,this.precisionMode)}else q=!0}else q=!0}else q=!0;else if("LIMIT"===B)L=!0,R=!0,q=!0;else if("STOP_LOSS"===B||"TAKE_PROFIT"===B)D=!0,q=!0,(h.linear||h.inverse)&&(L=!0);else if("STOP_LOSS_LIMIT"===B||"TAKE_PROFIT_LIMIT"===B)q=!0,D=!0,L=!0,R=!0;else if("LIMIT_MAKER"===B)L=!0,q=!0;else if("STOP"===B)q=!0,D=!0,L=!0;else if("STOP_MARKET"===B||"TAKE_PROFIT_MARKET"===B)N||(q=!0),D=!0;else if("TRAILING_STOP_MARKET"===B&&(N||(q=!0),void 0===T))throw new r.InvalidOrder(this.id+" createOrder() requires a trailingPercent param for a "+t+" order");if(q)if(g)m.quantity=this.parseToNumeric(s);else{const t=void 0!==this.safeString(h.precision,"amount");m.quantity=t?this.amountToPrecision(e,s):this.parseToNumeric(s)}if(L&&!A){if(void 0===n)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument for a "+t+" order");const i=void 0!==this.safeString(h.precision,"price");m.price=i?this.priceToPrecision(e,n):this.parseToNumeric(n)}if(D){if(h.contract){if(void 0===C)throw new r.InvalidOrder(this.id+" createOrder() requires a triggerPrice extra param for a "+t+" order")}else if(void 0===S&&void 0===C&&void 0===T)throw new r.InvalidOrder(this.id+" createOrder() requires a triggerPrice, trailingDelta or trailingPercent param for a "+t+" order");void 0!==C&&(m.stopPrice=this.priceToPrecision(e,C))}R&&void 0===this.safeString(d,"timeInForce")&&void 0===this.safeString(m,"timeInForce")&&(m.timeInForce=this.safeString(this.options,"defaultTimeInForce")),!g&&h.contract&&E&&(m.timeInForce="GTX"),"PO"===this.safeString(d,"timeInForce")&&(d=this.omit(d,"timeInForce"));const V=this.safeBool(d,"hedged",!1);h.spot||h.option||!V||(y&&(d=this.omit(d,"reduceOnly"),i="buy"===i?"sell":"buy"),m.positionSide="buy"===i?"LONG":"SHORT");const F=this.safeString(d,"selfTradePrevention");void 0!==F&&h.spot&&(m.selfTradePreventionMode=F.toUpperCase());const G=this.safeNumber(d,"icebergAmount");void 0!==G&&h.spot&&(m.icebergQty=this.amountToPrecision(e,G));const H=this.omit(d,["type","newClientOrderId","clientOrderId","postOnly","stopLossPrice","takeProfitPrice","stopPrice","triggerPrice","trailingTriggerPrice","trailingPercent","quoteOrderQty","cost","test","hedged","selfTradePrevention","icebergAmount"]);return this.extend(m,H)}async createMarketOrderWithCost(e,t,i,s={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketOrderWithCost() supports spot orders only");return s.cost=i,await this.createOrder(e,"market",t,i,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.cost=t,await this.createOrder(e,"market","buy",t,void 0,i)}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketSellOrderWithCost() supports spot orders only");return i.quoteOrderQty=t,await this.createOrder(e,"market","sell",t,void 0,i)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeString2(this.options,"fetchOrder","defaultType","spot"),o=this.safeString(i,"type",a);let n,d;[n,i]=this.handleMarginModeAndParams("fetchOrder",i),[d,i]=this.handleOptionAndParams2(i,"fetchOrder","papi","portfolioMargin",!1);const h={symbol:s.id},c=this.safeString2(i,"origClientOrderId","clientOrderId");let l;return void 0!==c?s.option?h.clientOrderId=c:h.origClientOrderId=c:h.orderId=e,i=this.omit(i,["type","clientOrderId","origClientOrderId"]),s.option?l=await this.eapiPrivateGetOrder(this.extend(h,i)):s.linear?l=d?await this.papiGetUmOrder(this.extend(h,i)):await this.fapiPrivateGetOrder(this.extend(h,i)):s.inverse?l=d?await this.papiGetCmOrder(this.extend(h,i)):await this.dapiPrivateGetOrder(this.extend(h,i)):"margin"===o||void 0!==n||d?d?l=await this.papiGetMarginOrder(this.extend(h,i)):("isolated"===n&&(h.isIsolated=!0),l=await this.sapiGetMarginOrder(this.extend(h,i))):l=await this.privateGetOrder(this.extend(h,i)),this.parseOrder(l,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchOrders",e,t,i,s);const o=this.market(e),n=this.safeString2(this.options,"fetchOrders","defaultType",o.type),d=this.safeString(s,"type",n);let h,c;[h,s]=this.handleMarginModeAndParams("fetchOrders",s),[c,s]=this.handleOptionAndParams2(s,"fetchOrders","papi","portfolioMargin",!1);const l=this.safeBoolN(s,["stop","trigger","conditional"]);s=this.omit(s,["stop","trigger","conditional","type"]);let u,f={symbol:o.id};return[f,s]=this.handleUntilOption("endTime",f,s),void 0!==t&&(f.startTime=t),void 0!==i&&(f.limit=i),o.option?u=await this.eapiPrivateGetHistoryOrders(this.extend(f,s)):o.linear?u=c?l?await this.papiGetUmConditionalAllOrders(this.extend(f,s)):await this.papiGetUmAllOrders(this.extend(f,s)):await this.fapiPrivateGetAllOrders(this.extend(f,s)):o.inverse?u=c?l?await this.papiGetCmConditionalAllOrders(this.extend(f,s)):await this.papiGetCmAllOrders(this.extend(f,s)):await this.dapiPrivateGetAllOrders(this.extend(f,s)):c?u=await this.papiGetMarginAllOrders(this.extend(f,s)):"margin"===d||void 0!==h?("isolated"===h&&(f.isIsolated=!0),u=await this.sapiGetMarginAllOrders(this.extend(f,s))):u=await this.privateGetAllOrders(this.extend(f,s)),this.parseOrders(u,o,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a,o;await this.loadMarkets();const n={};let d,h;[d,s]=this.handleMarginModeAndParams("fetchOpenOrders",s),[h,s]=this.handleOptionAndParams2(s,"fetchOpenOrders","papi","portfolioMargin",!1);const c=this.safeBoolN(s,["stop","trigger","conditional"]);if(void 0!==e){a=this.market(e),n.symbol=a.id;const t=this.safeString2(this.options,"fetchOpenOrders","defaultType","spot"),i="type"in a?a.type:t;o=this.safeString(s,"type",i)}else{if(this.options.warnOnFetchOpenOrdersWithoutSymbol)throw new r.ExchangeError(this.id+" fetchOpenOrders() WARNING: fetching open orders without specifying a symbol has stricter rate limits (10 times more for spot, 40 times more for other markets) compared to requesting with symbol argument. To acknowledge this warning, set "+this.id+'.options["warnOnFetchOpenOrdersWithoutSymbol"] = false to suppress this warning message.');{const e=this.safeString2(this.options,"fetchOpenOrders","defaultType","spot");o=this.safeString(s,"type",e)}}let l,u;if([l,s]=this.handleSubTypeAndParams("fetchOpenOrders",a,s),s=this.omit(s,["type","stop","trigger","conditional"]),"option"===o)void 0!==t&&(n.startTime=t),void 0!==i&&(n.limit=i),u=await this.eapiPrivateGetOpenOrders(this.extend(n,s));else if(this.isLinear(o,l))u=h?c?await this.papiGetUmConditionalOpenOrders(this.extend(n,s)):await this.papiGetUmOpenOrders(this.extend(n,s)):await this.fapiPrivateGetOpenOrders(this.extend(n,s));else if(this.isInverse(o,l))u=h?c?await this.papiGetCmConditionalOpenOrders(this.extend(n,s)):await this.papiGetCmOpenOrders(this.extend(n,s)):await this.dapiPrivateGetOpenOrders(this.extend(n,s));else if("margin"===o||void 0!==d||h)if(h)u=await this.papiGetMarginOpenOrders(this.extend(n,s));else{if("isolated"===d&&(n.isIsolated=!0,void 0===e))throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument for isolated markets");u=await this.sapiGetMarginOpenOrders(this.extend(n,s))}else u=await this.privateGetOpenOrders(this.extend(n,s));return this.parseOrders(u,a,t,i)}async fetchOpenOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOpenOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id};let o;[o,i]=this.handleOptionAndParams2(i,"fetchOpenOrder","papi","portfolioMargin",!1);const n=this.safeBoolN(i,["stop","trigger","conditional"]);i=this.omit(i,["stop","trigger","conditional"]);let d;if(a[o&&n?"strategyId":"orderId"]=e,s.linear)d=o?n?await this.papiGetUmConditionalOpenOrder(this.extend(a,i)):await this.papiGetUmOpenOrder(this.extend(a,i)):await this.fapiPrivateGetOpenOrder(this.extend(a,i));else if(s.inverse)d=o?n?await this.papiGetCmConditionalOpenOrder(this.extend(a,i)):await this.papiGetCmOpenOrder(this.extend(a,i)):await this.dapiPrivateGetOpenOrder(this.extend(a,i));else{if(s.option)throw new r.NotSupported(this.id+" fetchOpenOrder() does not support option markets");if(s.spot)throw new r.NotSupported(this.id+" fetchOpenOrder() does not support spot markets")}return this.parseOrder(d,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchClosedOrders() requires a symbol argument");const a=await this.fetchOrders(e,t,void 0,s),o=this.filterBy(a,"status","closed");return this.filterBySinceLimit(o,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchCanceledOrders() requires a symbol argument");const a=await this.fetchOrders(e,t,void 0,s),o=this.filterBy(a,"status","canceled");return this.filterBySinceLimit(o,t,i)}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchCanceledAndClosedOrders() requires a symbol argument");const a=await this.fetchOrders(e,t,void 0,s),o=this.filterBy(a,"status","canceled"),n=this.filterBy(a,"status","closed"),d=this.arrayConcat(o,n),h=this.sortBy(d,"timestamp");return this.filterBySinceLimit(h,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeString2(this.options,"cancelOrder","defaultType","spot"),o=this.safeString(i,"type",a);let n,d;[n,i]=this.handleMarginModeAndParams("cancelOrder",i),[d,i]=this.handleOptionAndParams2(i,"cancelOrder","papi","portfolioMargin",!1);const h=this.safeBoolN(i,["stop","trigger","conditional"]),c={symbol:s.id},l=this.safeStringN(i,["origClientOrderId","clientOrderId","newClientStrategyId"]);let u;return void 0!==l?s.option?c.clientOrderId=l:d&&h?c.newClientStrategyId=l:c.origClientOrderId=l:d&&h?c.strategyId=e:c.orderId=e,i=this.omit(i,["type","origClientOrderId","clientOrderId","newClientStrategyId","stop","trigger","conditional"]),s.option?u=await this.eapiPrivateDeleteOrder(this.extend(c,i)):s.linear?u=d?h?await this.papiDeleteUmConditionalOrder(this.extend(c,i)):await this.papiDeleteUmOrder(this.extend(c,i)):await this.fapiPrivateDeleteOrder(this.extend(c,i)):s.inverse?u=d?h?await this.papiDeleteCmConditionalOrder(this.extend(c,i)):await this.papiDeleteCmOrder(this.extend(c,i)):await this.dapiPrivateDeleteOrder(this.extend(c,i)):"margin"===o||void 0!==n||d?d?u=await this.papiDeleteMarginOrder(this.extend(c,i)):("isolated"===n&&(c.isIsolated=!0),u=await this.sapiDeleteMarginOrder(this.extend(c,i))):u=await this.privateDeleteOrder(this.extend(c,i)),this.parseOrder(u,s)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let a;[a,t]=this.handleOptionAndParams2(t,"cancelAllOrders","papi","portfolioMargin",!1);const o=this.safeBoolN(t,["stop","trigger","conditional"]),n=this.safeString(t,"type",i.type);let d,h;return t=this.omit(t,["type","stop","trigger","conditional"]),[d,t]=this.handleMarginModeAndParams("cancelAllOrders",t),i.option?h=await this.eapiPrivateDeleteAllOpenOrders(this.extend(s,t)):i.linear?h=a?o?await this.papiDeleteUmConditionalAllOpenOrders(this.extend(s,t)):await this.papiDeleteUmAllOpenOrders(this.extend(s,t)):await this.fapiPrivateDeleteAllOpenOrders(this.extend(s,t)):i.inverse?h=a?o?await this.papiDeleteCmConditionalAllOpenOrders(this.extend(s,t)):await this.papiDeleteCmAllOpenOrders(this.extend(s,t)):await this.dapiPrivateDeleteAllOpenOrders(this.extend(s,t)):"margin"===n||void 0!==d||a?a?h=await this.papiDeleteMarginAllOpenOrders(this.extend(s,t)):("isolated"===d&&(s.isIsolated=!0),h=await this.sapiDeleteMarginOpenOrders(this.extend(s,t))):h=await this.privateDeleteOpenOrders(this.extend(s,t)),Array.isArray(h)?this.parseOrders(h,i):[this.safeOrder({info:h})]}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(!s.contract)throw new r.BadRequest(this.id+" cancelOrders is only supported for swap markets.");const a={symbol:s.id,orderidlist:e};let o;return s.linear?o=await this.fapiPrivateDeleteBatchOrders(this.extend(a,i)):s.inverse&&(o=await this.dapiPrivateDeleteBatchOrders(this.extend(a,i))),this.parseOrders(o,s)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrderTrades() requires a symbol argument");await this.loadMarkets();const o=this.market(t),n=this.safeString(a,"type",o.type);if(a=this.omit(a,"type"),"spot"!==n)throw new r.NotSupported(this.id+" fetchOrderTrades() supports spot markets only");const d={orderId:e};return await this.fetchMyTrades(t,i,s,this.extend(d,a))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);const o={};let n,d,h;void 0!==e&&(n=this.market(e),o.symbol=n.id),[d,s]=this.handleMarketTypeAndParams("fetchMyTrades",n,s);let c,l=this.safeInteger2(s,"until","endTime");if(void 0!==t){const e=t;o.startTime=e;const i=this.milliseconds(),s=6048e5;i-e>=s&&void 0===l&&n.linear&&(l=this.sum(e,s),l=Math.min(l,i))}if(void 0!==l&&(o.endTime=l,s=this.omit(s,["endTime","until"])),void 0!==i&&(("option"===d||n.contract)&&(i=Math.min(i,1e3)),o.limit=i),"option"===d)c=await this.eapiPrivateGetUserTrades(this.extend(o,s));else{if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");let t;[h,s]=this.handleMarginModeAndParams("fetchMyTrades",s),[t,s]=this.handleOptionAndParams2(s,"fetchMyTrades","papi","portfolioMargin",!1),"spot"===d||"margin"===d?t?c=await this.papiGetMarginMyTrades(this.extend(o,s)):"margin"===d||void 0!==h?("isolated"===h&&(o.isIsolated=!0),c=await this.sapiGetMarginMyTrades(this.extend(o,s))):c=await this.privateGetMyTrades(this.extend(o,s)):n.linear?c=t?await this.papiGetUmUserTrades(this.extend(o,s)):await this.fapiPrivateGetUserTrades(this.extend(o,s)):n.inverse&&(c=t?await this.papiGetCmUserTrades(this.extend(o,s)):await this.dapiPrivateGetUserTrades(this.extend(o,s)))}return this.parseTrades(c,n,t,i)}async fetchMyDustTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==t&&(r.startTime=t,r.endTime=this.sum(t,7776e6));const a=this.safeStringUpper(s,"type");s=this.omit(s,"type"),void 0!==a&&(r.accountType=a);const o=await this.sapiGetAssetDribblet(this.extend(r,s)),n=this.safeList(o,"userAssetDribblets",[]),d=this.safeInteger(o,"total",0),h=[];for(let e=0;e<d;e++){const t=this.safeList(n[e],"userAssetDribbletDetails",[]);for(let e=0;e<t.length;e++)t[e].isDustTrade=!0,h.push(t[e])}const c=this.parseTrades(h,void 0,t,i);return this.filterBySinceLimit(c,t,i)}parseDustTrade(e,t=void 0){const i=this.safeString(e,"transId"),s=this.safeInteger(e,"operateTime"),r=this.safeString(e,"fromAsset"),o=this.safeCurrencyCode(r),n=this.currency("BNB").code,d=n+"/"+o;let h=!1;d in this.markets&&(h=!0);const c=this.safeString(e,"serviceChargeAmount"),l={currency:n,cost:this.parseNumber(c)};let u,f,p,m,g;h?(u=d,f=this.safeString(e,"transferedAmount"),p=this.safeString(e,"amount"),m="buy"):(u=o+"/"+n,f=this.safeString(e,"amount"),p=this.safeString(e,"transferedAmount"),m="sell"),void 0!==p&&f&&(g=a.Y.stringDiv(p,f));const v=this.parseNumber(f),y=this.parseNumber(g),w=this.parseNumber(p);return{id:undefined,timestamp:s,datetime:this.iso8601(s),symbol:u,order:i,type:undefined,takerOrMaker:undefined,side:m,amount:v,price:y,cost:w,fee:l,info:e}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a,o=!1;if([o,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),o)return await this.fetchPaginatedCallDynamic("fetchDeposits",e,t,i,s);const n={},d=this.safeDict(this.options,"legalMoney",{}),h=this.safeBool(s,"fiat",!1);s=this.omit(s,"fiatOnly");const c=this.safeInteger(s,"until");if(s=this.omit(s,"until"),h||e in d){void 0!==e&&(r=this.currency(e)),n.transactionType=0,void 0!==t&&(n.beginTime=t),void 0!==c&&(n.endTime=c);const i=await this.sapiGetFiatOrders(this.extend(n,s));a=this.safeList(i,"data",[])}else{if(void 0!==e&&(r=this.currency(e),n.coin=r.id),void 0!==t){n.startTime=t;let e=this.sum(t,7776e6);void 0!==c&&(e=Math.min(e,c)),n.endTime=e}void 0!==i&&(n.limit=i),a=await this.sapiGetCapitalDepositHisrec(this.extend(n,s))}for(let e=0;e<a.length;e++)a[e].type="deposit";return this.parseTransactions(a,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchWithdrawals",e,t,i,s);const a=this.safeDict(this.options,"legalMoney",{}),o=this.safeBool(s,"fiat",!1);s=this.omit(s,"fiatOnly");const n={},d=this.safeInteger(s,"until");let h,c;if(void 0!==d&&(s=this.omit(s,"until"),n.endTime=d),o||e in a){void 0!==e&&(c=this.currency(e)),n.transactionType=1,void 0!==t&&(n.beginTime=t);const i=await this.sapiGetFiatOrders(this.extend(n,s));h=this.safeList(i,"data",[])}else void 0!==e&&(c=this.currency(e),n.coin=c.id),void 0!==t&&(n.startTime=t,n.endTime=this.sum(t,7776e6)),void 0!==i&&(n.limit=i),h=await this.sapiGetCapitalWithdrawHistory(this.extend(n,s));for(let e=0;e<h.length;e++)h[e].type="withdrawal";return this.parseTransactions(h,c,t,i)}parseTransactionStatusByType(e,t=void 0){if(void 0===t)return e;const i=this.safeDict({deposit:{0:"pending",1:"ok",6:"ok",Processing:"pending",Failed:"failed",Successful:"ok",Refunding:"canceled",Refunded:"canceled","Refund Failed":"failed"},withdrawal:{0:"pending",1:"canceled",2:"pending",3:"failed",4:"pending",5:"failed",6:"ok",Processing:"pending",Failed:"failed",Successful:"ok",Refunding:"canceled",Refunded:"canceled","Refund Failed":"failed"}},t,{});return this.safeString(i,e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","orderNo"),s=this.safeString(e,"address");let r=this.safeString(e,"addressTag");void 0!==r&&r.length<1&&(r=void 0);let a=this.safeString(e,"txId");void 0!==a&&a.indexOf("Internal transfer ")>=0&&(a=a.slice(18));const o=this.safeString2(e,"coin","fiatCurrency");let n,d=this.safeCurrencyCode(o,t);n=this.safeInteger2(e,"insertTime","createTime"),void 0===n&&(n=this.parse8601(this.safeString(e,"applyTime")));const h=this.safeInteger2(e,"successTime","updateTime");let c=this.safeString(e,"type");if(void 0===c){const t=this.safeString(e,"transactionType");void 0!==t&&(c="0"===t?"deposit":"withdrawal");const i=this.safeDict(this.options,"legalMoneyCurrenciesById");d=this.safeString(i,d,d)}const l=this.parseTransactionStatusByType(this.safeString(e,"status"),c),u=this.safeNumber(e,"amount"),f=this.safeNumber2(e,"transactionFee","totalFee");let p;void 0!==f&&(p={currency:d,cost:f});const m=this.safeInteger(e,"transferType");let g;void 0!==m&&(g=!!m);const v=this.safeString(e,"network");return{info:e,id:i,txid:a,timestamp:n,datetime:this.iso8601(n),network:v,address:s,addressTo:s,addressFrom:void 0,tag:r,tagTo:r,tagFrom:void 0,type:c,amount:u,currency:d,status:l,updated:h,internal:g,comment:void 0,fee:p}}parseTransferStatus(e){return this.safeString({CONFIRMED:"ok"},e,e)}parseTransfer(e,t=void 0){const i=this.safeString2(e,"tranId","transactionId"),s=this.safeString2(e,"asset","currency"),r=this.safeCurrencyCode(s,t),a=this.safeNumber(e,"amount"),o=this.safeString(e,"type");let n,d;const h=this.safeDict(this.options,"accountsById",{});if(void 0!==o){const e=o.split("_");n=this.safeValue(e,0),d=this.safeValue(e,1),n=this.safeString(h,n,n),d=this.safeString(h,d,d)}if(void 0!==this.safeInteger(e,"walletType")){const t=this.safeDict(e,"payerInfo",{}),i=this.safeDict(e,"receiverInfo",{});n=this.safeString(t,"accountId"),d=this.safeString(i,"accountId")}const c=this.safeInteger2(e,"timestamp","transactionTime"),l=this.parseTransferStatus(this.safeString(e,"status"));return{info:e,id:i,timestamp:c,datetime:this.iso8601(c),currency:r,amount:a,fromAccount:n,toAccount:d,status:l}}parseIncome(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"asset"),r=this.safeInteger(e,"time");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),code:this.safeCurrencyCode(s),timestamp:r,datetime:this.iso8601(r),id:this.safeString(e,"tranId"),amount:this.safeNumber(e,"income")}}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n={asset:o.id,amount:this.currencyToPrecision(e,t)};if(n.type=this.safeString(a,"type"),a=this.omit(a,"type"),void 0===n.type){const e=this.safeString(a,"symbol");let t;void 0!==e&&(t=this.market(e),a=this.omit(a,"symbol"));let o,d=this.convertTypeToAccount(i).toUpperCase(),h=this.convertTypeToAccount(s).toUpperCase();if(void 0!==t&&(o=t.id),"ISOLATED"===d&&void 0===e)throw new r.ArgumentsRequired(this.id+' transfer () requires params["symbol"] when fromAccount is '+i);if("ISOLATED"===h&&void 0===e)throw new r.ArgumentsRequired(this.id+' transfer () requires params["symbol"] when toAccount is '+s);const c=this.safeDict(this.options,"accountsById",{}),l=!(d in c),u=!(h in c);if(l&&void 0===t&&(o=d),u&&void 0===t&&(o=h),l||u){const e="MAIN"===d,t="MAIN"===h;if((l||u)&&("UMFUTURE"===d||"CMFUTURE"===d||("UMFUTURE"===h||"CMFUTURE"===h)||("FUNDING"===d||"FUNDING"===h)||("OPTION"===d||"OPTION"===h)))throw new r.BadRequest(this.id+" transfer () does not allow transfers between "+i+" and "+s);t&&l?(d="ISOLATED_MARGIN",n.fromSymbol=o):e&&u?(h="ISOLATED_MARGIN",n.toSymbol=o):l&&u?(n.fromSymbol=d,n.toSymbol=h,d="ISOLATEDMARGIN",h="ISOLATEDMARGIN"):(l&&(n.fromSymbol=o,d="ISOLATEDMARGIN"),u&&(n.toSymbol=o,h="ISOLATEDMARGIN")),n.type=d+"_"+h}else n.type=d+"_"+h}const d=await this.sapiPostAssetTransfer(this.extend(n,a));return this.parseTransfer(d,o)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.safeBool(s,"internal");s=this.omit(s,"internal");let o,n=!1;if([n,s]=this.handleOptionAndParams(s,"fetchTransfers","paginate"),n&&!a)return await this.fetchPaginatedCallDynamic("fetchTransfers",e,t,i,s);void 0!==e&&(o=this.currency(e));const d={};let h="limit";if(!a){const e=this.safeString2(this.options,"fetchTransfers","defaultType","spot"),t=this.safeString(s,"fromAccount",e),i="future"===t?"spot":"future",a=this.safeString(s,"toAccount",i);let o=this.safeString(s,"type");const n=this.safeDict(this.options,"accountsByType",{}),c=this.safeString(n,t),l=this.safeString(n,a);if(void 0===o){if(void 0===c){const e=Object.keys(n);throw new r.ExchangeError(this.id+" fromAccount parameter must be one of "+e.join(", "))}if(void 0===l){const e=Object.keys(n);throw new r.ExchangeError(this.id+" toAccount parameter must be one of "+e.join(", "))}o=c+"_"+l}d.type=o,h="size"}void 0!==i&&(d[h]=i),void 0!==t&&(d.startTime=t);const c=this.safeInteger(s,"until");let l;void 0!==c&&(s=this.omit(s,"until"),d.endTime=c),l=a?await this.sapiGetPayTransactions(this.extend(d,s)):await this.sapiGetAssetTransfer(this.extend(d,s));const u=this.safeList2(l,"rows","data",[]);return this.parseTransfers(u,o,t,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id},r=this.safeDict(this.options,"networks",{});let a=this.safeStringUpper(t,"network");a=this.safeString(r,a,a),void 0!==a&&(s.network=a,t=this.omit(t,"network"));const o=await this.sapiGetCapitalDepositAddress(this.extend(s,t));return this.parseDepositAddress(o,i)}parseDepositAddress(e,t=void 0){const i=this.safeDict(e,"info",{}),s=this.safeString(i,"url"),r=this.safeString(e,"address"),a=this.safeString(e,"currency"),o=this.safeCurrencyCode(a,t);let n;if(void 0!==s){const e=this.safeDict(this.options,"reverseNetworks",{}),t=s.split("/");let i=this.safeString(t,2);if("blockchair.com"===i||"viewblock.io"===i){const e=this.safeString(t,3);void 0!==e&&(i=i+"/"+e)}n=this.safeString(e,i);const r=this.safeDict(this.options,"impliedNetworks",{ETH:{ERC20:"ETH"},TRX:{TRC20:"TRX"}});if(o in r){const e=this.safeDict(r,o,{});n=this.safeString(e,n,n)}}let d=this.safeString(e,"tag","");return 0===d.length&&(d=void 0),this.checkAddress(r),{info:e,currency:o,network:n,address:r,tag:d}}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.sapiGetCapitalConfigGetall(t),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"coin"),a=this.safeCurrencyCode(r),o=this.safeList(t,"networkList",[]);s[a]={};for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"network"),r=this.safeCurrencyCode(i),n=this.safeNumber(t,"withdrawFee");s[a][r]=n}}return{withdraw:s,deposit:{},info:i}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.sapiGetCapitalConfigGetall(t);return this.parseDepositWithdrawFees(i,e,"coin")}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"networkList",[]),s=this.depositWithdrawFee(e);for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"network"),a=this.networkIdToCode(r),o=this.safeNumber(t,"withdrawFee");!0===this.safeBool(t,"isDefault")&&(s.withdraw={fee:o,percentage:void 0}),s.networks[a]={withdraw:{fee:o,percentage:void 0},deposit:{fee:void 0,percentage:void 0}}}return s}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={coin:a.id,address:i,amount:this.currencyToPrecision(e,t)};void 0!==s&&(o.addressTag=s);const n=this.safeDict(this.options,"networks",{});let d=this.safeStringUpper(r,"network");d=this.safeString(n,d,d),void 0!==d&&(o.network=d,r=this.omit(r,"network"));const h=await this.sapiPostCapitalWithdrawApply(this.extend(o,r));return this.parseTransaction(h,a)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t,void 0,"spot"),maker:this.safeNumber2(e,"makerCommission","makerCommissionRate"),taker:this.safeNumber2(e,"takerCommission","takerCommissionRate"),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s=i.type;let r,a;[r,t]=this.handleSubTypeAndParams("fetchTradingFee",i,t),[a,t]=this.handleOptionAndParams2(t,"fetchTradingFee","papi","portfolioMargin",!1);const o=this.isLinear(s,r),n=this.isInverse(s,r),d={symbol:i.id};let h;h=o?a?await this.papiGetUmCommissionRate(this.extend(d,t)):await this.fapiPrivateGetCommissionRate(this.extend(d,t)):n?a?await this.papiGetCmCommissionRate(this.extend(d,t)):await this.dapiPrivateGetCommissionRate(this.extend(d,t)):await this.sapiGetAssetTradeFee(this.extend(d,t));let c=h;return Array.isArray(c)&&(c=this.safeDict(c,0,{})),this.parseTradingFee(c,i)}async fetchTradingFees(e={}){let t,i;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchTradingFees",void 0,e),[i,e]=this.handleSubTypeAndParams("fetchTradingFees",void 0,e,"linear");const s="spot"===t||"margin"===t,r=this.isLinear(t,i),a=this.isInverse(t,i);let o;if(s?o=await this.sapiGetAssetTradeFee(e):r?o=await this.fapiPrivateGetAccountConfig(e):a&&(o=await this.dapiPrivateGetAccount(e)),s){const e={};for(let t=0;t<o.length;t++){const i=this.parseTradingFee(o[t]);e[i.symbol]=i}return e}if(r){const e=Object.keys(this.markets),t={},i=this.safeInteger(o,"feeTier"),s=this.fees.linear.trading.tiers,r=s.maker[i][1],a=s.taker[i][1];for(let s=0;s<e.length;s++){const o=e[s];this.markets[o].linear&&(t[o]={info:{feeTier:i},symbol:o,maker:r,taker:a})}return t}if(a){const e=Object.keys(this.markets),t={},i=this.safeInteger(o,"feeTier"),s=this.fees.inverse.trading.tiers,r=s.maker[i][1],a=s.taker[i][1];for(let s=0;s<e.length;s++){const o=e[s];this.markets[o].inverse&&(t[o]={info:{feeTier:i},symbol:o,maker:r,taker:a})}return t}}async futuresTransfer(e,t,i,s={}){if(i<1||i>4)throw new r.ArgumentsRequired(this.id+" type must be between 1 and 4");await this.loadMarkets();const a=this.currency(e),o={asset:a.id,amount:t,type:i},n=await this.sapiPostFuturesTransfer(this.extend(o,s));return this.parseTransfer(n,a)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let a;if(i.linear)a=await this.fapiPublicGetPremiumIndex(this.extend(s,t));else{if(!i.inverse)throw new r.NotSupported(this.id+" fetchFundingRate() supports linear and inverse contracts only");a=await this.dapiPublicGetPremiumIndex(this.extend(s,t))}return i.inverse&&(a=a[0]),this.parseFundingRate(a,i)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o=!1;if([o,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s);const n=this.safeString2(this.options,"fetchFundingRateHistory","defaultType","future"),d=this.safeString(s,"type",n);let h,c;void 0!==e&&(h=this.market(e),e=h.symbol,a.symbol=h.id),[c,s]=this.handleSubTypeAndParams("fetchFundingRateHistory",h,s,"linear"),s=this.omit(s,"type"),void 0!==t&&(a.startTime=t);const l=this.safeInteger(s,"until"),u=this.safeInteger(s,"endTime",l);let f;if(s=this.omit(s,["endTime","until"]),void 0!==u&&(a.endTime=u),void 0!==i&&(a.limit=i),this.isLinear(d,c))f=await this.fapiPublicGetFundingRate(this.extend(a,s));else{if(!this.isInverse(d,c))throw new r.NotSupported(this.id+" fetchFundingRateHistory() is not supported for "+d+" markets");f=await this.dapiPublicGetFundingRate(this.extend(a,s))}return this.parseFundingRateHistories(f,h,t,i)}parseFundingRateHistory(e,t=void 0){const i=this.safeInteger(e,"fundingTime");return{info:e,symbol:this.safeSymbol(this.safeString(e,"symbol"),void 0,void 0,"swap"),fundingRate:this.safeNumber(e,"fundingRate"),timestamp:i,datetime:this.iso8601(i)}}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString2(this.options,"fetchFundingRates","defaultType","future"),s=this.safeString(t,"type",i);let a;[a,t]=this.handleSubTypeAndParams("fetchFundingRates",void 0,t,"linear");const o=this.omit(t,"type");let n;if(this.isLinear(s,a))n=await this.fapiPublicGetPremiumIndex(o);else{if(!this.isInverse(s,a))throw new r.NotSupported(this.id+" fetchFundingRates() supports linear and inverse contracts only");n=await this.dapiPublicGetPremiumIndex(o)}return this.parseFundingRates(n,e)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t,void 0,"contract"),a=this.safeNumber(e,"markPrice"),o=this.safeNumber(e,"indexPrice"),n=this.safeNumber(e,"interestRate"),d=this.safeNumber(e,"estimatedSettlePrice"),h=this.safeNumber(e,"lastFundingRate"),c=this.safeInteger(e,"nextFundingTime"),l=this.safeString(e,"fundingIntervalHours");let u;return void 0!==l&&(u=l+"h"),{info:e,symbol:r,markPrice:a,indexPrice:o,interestRate:n,estimatedSettlePrice:d,timestamp:i,datetime:this.iso8601(i),fundingRate:h,fundingTimestamp:c,fundingDatetime:this.iso8601(c),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:u}}parseAccountPositions(e,t=!1){const i=this.safeList(e,"positions"),s=this.safeList(e,"assets",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"asset"),o=this.safeCurrencyCode(i),n=this.safeString(t,"crossWalletBalance"),d=this.safeString(t,"crossUnPnl");r[o]={crossMargin:a.Y.stringAdd(n,d),crossWalletBalance:n}}const o=[];for(let e=0;e<i.length;e++){const s=i[e],a=this.safeString(s,"symbol"),n=this.safeMarket(a,void 0,void 0,"contract"),d=n.linear?n.quote:n.base,h=this.safeString(s,"maintMargin");if((!t||"0"!==h&&"0.00000000"!==h)&&d in r){const e=this.parseAccountPosition(this.extend(s,{crossMargin:r[d].crossMargin,crossWalletBalance:r[d].crossWalletBalance}),n);o.push(e)}}return o}parseAccountPosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeString(t,"symbol"),r=this.safeString(e,"leverage"),o=void 0!==r?parseInt(r):void 0,n=this.safeString(e,"initialMargin"),d=this.parseNumber(n);let h;if(void 0!==r){h=a.Y.stringDiv("1",r,8);this.isRoundNumber(1e3%o)||(h=a.Y.stringDiv(a.Y.stringAdd(h,"1e-8"),"1",8))}const c="notional"in e,l=this.safeString(e,"maintMargin"),u=this.parseNumber(l),f=this.safeString(e,"entryPrice");let p=this.parseNumber(f);const m=this.safeString2(e,"notional","notionalValue"),g=a.Y.stringAbs(m),v=this.parseNumber(g);let y=this.safeString(e,"positionAmt"),w=a.Y.stringAbs(y);if(void 0===y){const e=a.Y.stringMul(a.Y.stringMul(r,n),f),i=this.safeString(t,"contractSize");y=a.Y.stringDiv(e,i),w=a.Y.stringDiv(a.Y.stringAdd(y,"0.5"),"1",0)}const b=this.parseNumber(w),k=this.safeDict(this.options,"leverageBrackets",{}),S=this.safeList(k,s,[]);let O;for(let e=0;e<S.length;e++){const t=S[e];if(a.Y.stringLt(g,t[0]))break;O=t[1]}const T=this.parseNumber(O),P=this.safeString(e,"unrealizedProfit"),I=this.parseNumber(P);let M=this.safeInteger(e,"updateTime");0===M&&(M=void 0);let x,A,C,B=this.safeBool(e,"isolated");if(void 0===B){const t=this.safeString(e,"isolatedMargin");B=!a.Y.stringEq(t,"0")}B?(x="isolated",C=this.safeString(e,"isolatedWallet"),A=a.Y.stringAdd(C,P)):(x="cross",C=this.safeString(e,"crossWalletBalance"),A=this.safeString(e,"crossMargin"));const _=this.parseNumber(A);let E,N,R,L,D;const q=this.safeValue(t,"contractSize"),V=this.numberToString(q);if(a.Y.stringEquals(m,"0"))p=void 0;else{if(N=a.Y.stringLt(m,"0")?"short":"long",E=this.parseNumber(a.Y.stringDiv(a.Y.stringAdd(a.Y.stringDiv(l,A),"5e-5"),"1",4)),R=this.parseNumber(a.Y.stringMul(a.Y.stringDiv(P,n,4),"100")),c){let e,t=f;"short"===N?e=a.Y.stringAdd("1",O):(e=a.Y.stringAdd("-1",O),t=a.Y.stringMul("-1",t));const i=a.Y.stringDiv(C,a.Y.stringMul(w,e)),s=a.Y.stringDiv(t,e);L=a.Y.stringAdd(i,s)}else{let e,t=f;"short"===N?e=a.Y.stringSub("1",O):(e=a.Y.stringSub("-1",O),t=a.Y.stringMul("-1",t));const i=a.Y.stringMul(w,V),s=a.Y.stringMul(i,e),r=a.Y.stringSub(a.Y.stringMul(a.Y.stringDiv("1",t),i),C);L=a.Y.stringDiv(s,r)}const e=this.precisionFromString(this.safeString(t.precision,"price")),i=(e+1).toString(),s=new a.Y("5e-"+i).toString(),r=a.Y.stringAdd(s,L);let o=a.Y.stringDiv(r,"1",e);"-"===o[0]&&(o=void 0),D=this.parseNumber(o)}const F="BOTH"!==this.safeString(e,"positionSide");return{info:e,id:void 0,symbol:s,timestamp:M,datetime:this.iso8601(M),initialMargin:d,initialMarginPercentage:this.parseNumber(h),maintenanceMargin:u,maintenanceMarginPercentage:T,entryPrice:p,notional:v,leverage:this.parseNumber(r),unrealizedPnl:I,contracts:b,contractSize:q,marginRatio:E,liquidationPrice:D,markPrice:void 0,collateral:_,marginMode:x,side:N,hedged:F,percentage:R}}parsePositionRisk(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeString(t,"symbol"),r=this.safeString(e,"isolatedMargin"),o=this.safeDict(this.options,"leverageBrackets",{}),n=this.safeList(o,s,[]),d=this.safeString2(e,"notional","notionalValue"),h=a.Y.stringAbs(d);let c;for(let e=0;e<n.length;e++){const t=n[e];if(a.Y.stringLt(h,t[0]))break;c=t[1]}const l=this.parseNumber(h),u=a.Y.stringAbs(this.safeString(e,"positionAmt")),f=this.parseNumber(u),p=this.safeString(e,"unRealizedProfit"),m=this.parseNumber(p),g=this.omitZero(this.safeString(e,"liquidationPrice")),v=this.parseNumber(g);let y,w,b=this.safeString(e,"marginType");void 0===b&&void 0!==r&&(b=a.Y.stringEq(r,"0")?"cross":"isolated"),a.Y.stringGt(d,"0")?w="long":a.Y.stringLt(d,"0")&&(w="short");const k=this.safeString(e,"entryPrice"),S=this.parseNumber(k),O=this.safeValue(t,"contractSize"),T=this.numberToString(O),P="notional"in e;if("cross"===b){const e=this.safeDict(t,"precision",{}),i=this.safeString(e,"base"),s=this.safeString2(e,"quote","price");if(!(void 0===i&&void 0===s))if(P){let t,i=k;"short"===w?(t=a.Y.stringAdd("1",c),i=a.Y.stringMul("-1",i)):t=a.Y.stringAdd("-1",c);const s=a.Y.stringMul(g,t),r=a.Y.stringAdd(s,i),o=this.precisionFromString(this.safeString2(e,"quote","price"));void 0!==o&&(y=a.Y.stringDiv(a.Y.stringMul(r,u),"1",o))}else{let t,i=k;"short"===w?t=a.Y.stringSub("1",c):(t=a.Y.stringSub("-1",c),i=a.Y.stringMul("-1",i));const s=a.Y.stringMul(u,T),r=a.Y.stringSub(a.Y.stringDiv("1",i),a.Y.stringDiv(t,g)),o=this.precisionFromString(this.safeString(e,"base"));void 0!==o&&(y=a.Y.stringDiv(a.Y.stringMul(s,r),"1",o))}}else y=this.safeString(e,"isolatedMargin");y=void 0===y?"0":y;const I=this.parseNumber(y),M=this.parseNumber(this.omitZero(this.safeString(e,"markPrice")));let x=this.safeInteger(e,"updateTime");0===x&&(x=void 0);const A=this.parseNumber(c);let C=a.Y.stringMul(c,h);void 0===C&&(C=this.safeString(e,"maintMargin"));const B=this.parseNumber(C);let _,E;const N=this.safeString(e,"leverage");if(void 0!==N){const e=parseInt(N),t=this.isRoundNumber(1e3%e);E=a.Y.stringDiv("1",N,8),t||(E=a.Y.stringAdd(E,"1e-8"));const i=a.Y.stringMul(h,E);_=a.Y.stringDiv(i,"1",8)}else{_=this.safeString(e,"initialMargin");const t=a.Y.stringMul(_,"1");E=a.Y.stringDiv(t,h,8)}let R,L;a.Y.stringEquals(y,"0")||(R=this.parseNumber(a.Y.stringDiv(a.Y.stringAdd(a.Y.stringDiv(C,y),"5e-5"),"1",4)),L=this.parseNumber(a.Y.stringMul(a.Y.stringDiv(p,_,4),"100")));const D="BOTH"!==this.safeString(e,"positionSide");return{info:e,id:void 0,symbol:s,contracts:f,contractSize:O,unrealizedPnl:m,leverage:this.parseNumber(N),liquidationPrice:v,collateral:I,notional:l,markPrice:M,entryPrice:S,timestamp:x,initialMargin:this.parseNumber(_),initialMarginPercentage:this.parseNumber(E),maintenanceMargin:B,maintenanceMarginPercentage:A,marginRatio:R,datetime:this.iso8601(x),marginMode:b,marginType:b,side:w,hedged:D,percentage:L,stopLossPrice:void 0,takeProfitPrice:void 0}}async loadLeverageBrackets(e=!1,t={}){await this.loadMarkets();if(void 0===this.safeDict(this.options,"leverageBrackets")||e){const e=this.safeString(this.options,"defaultType","future"),i=this.safeString(t,"type",e),s=this.omit(t,"type");let a,o,n;if([a,t]=this.handleSubTypeAndParams("loadLeverageBrackets",void 0,t,"linear"),[o,t]=this.handleOptionAndParams2(t,"loadLeverageBrackets","papi","portfolioMargin",!1),this.isLinear(i,a))n=o?await this.papiGetUmLeverageBracket(s):await this.fapiPrivateGetLeverageBracket(s);else{if(!this.isInverse(i,a))throw new r.NotSupported(this.id+" loadLeverageBrackets() supports linear and inverse contracts only");n=o?await this.papiGetCmLeverageBracket(s):await this.dapiPrivateV2GetLeverageBracket(s)}this.options.leverageBrackets={};for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i,void 0,void 0,"contract"),r=this.safeList(t,"brackets",[]),a=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString2(t,"notionalFloor","qtyFloor"),s=this.safeString(t,"maintMarginRatio");a.push([i,s])}this.options.leverageBrackets[s]=a}}return this.options.leverageBrackets}async fetchLeverageTiers(e=void 0,t={}){let i,s,a,o;if(await this.loadMarkets(),[i,t]=this.handleMarketTypeAndParams("fetchLeverageTiers",void 0,t),[s,t]=this.handleSubTypeAndParams("fetchLeverageTiers",void 0,t,"linear"),[a,t]=this.handleOptionAndParams2(t,"fetchLeverageTiers","papi","portfolioMargin",!1),this.isLinear(i,s))o=a?await this.papiGetUmLeverageBracket(t):await this.fapiPrivateGetLeverageBracket(t);else{if(!this.isInverse(i,s))throw new r.NotSupported(this.id+" fetchLeverageTiers() supports linear and inverse contracts only");o=a?await this.papiGetCmLeverageBracket(t):await this.dapiPrivateV2GetLeverageBracket(t)}return this.parseLeverageTiers(o,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeList(e,"brackets",[]),r=[];for(let e=0;e<s.length;e++){const a=s[e];r.push({tier:this.safeNumber(a,"bracket"),symbol:this.safeSymbol(i,t),currency:t.quote,minNotional:this.safeNumber2(a,"notionalFloor","qtyFloor"),maxNotional:this.safeNumber2(a,"notionalCap","qtyCap"),maintenanceMarginRate:this.safeNumber(a,"maintMarginRatio"),maxLeverage:this.safeNumber(a,"initialLeverage"),info:a})}return r}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.option)throw new r.NotSupported(this.id+" fetchPosition() supports option markets only");const s={symbol:i.id},a=await this.eapiPrivateGetPosition(this.extend(s,t));return this.parsePosition(a[0],i)}async fetchOptionPositions(e=void 0,t={}){await this.loadMarkets();const i={};let s;if(void 0!==(e=this.marketSymbols(e))){let t;if(Array.isArray(e)){if(e.length>1)throw new r.BadRequest(this.id+" fetchPositions() symbols argument cannot contain more than 1 symbol");t=e[0]}else t=e;s=this.market(t),i.symbol=s.id}const a=await this.eapiPrivateGetPosition(this.extend(i,t)),o=[];for(let e=0;e<a.length;e++)o.push(this.parsePosition(a[e],s));return this.filterByArrayPositions(o,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t,void 0,"swap")).symbol,r=this.safeStringLower(e,"side");let o=this.safeString(e,"quantity");"long"!==r&&(o=a.Y.stringMul("-1",o));const n=this.safeInteger(e,"time");return this.safePosition({info:e,id:void 0,symbol:s,entryPrice:this.safeNumber(e,"entryPrice"),markPrice:this.safeNumber(e,"markPrice"),notional:this.safeNumber(e,"markValue"),collateral:this.safeNumber(e,"positionCost"),unrealizedPnl:this.safeNumber(e,"unrealizedPNL"),side:r,contracts:this.parseNumber(o),contractSize:void 0,timestamp:n,datetime:this.iso8601(n),hedged:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,initialMargin:void 0,initialMarginPercentage:void 0,leverage:void 0,liquidationPrice:void 0,marginRatio:void 0,marginMode:void 0,percentage:void 0})}async fetchPositions(e=void 0,t={}){let i;if([i,t]=this.handleOptionAndParams(t,"fetchPositions","method"),void 0===i){i=void 0===this.safeDict(this.options,"fetchPositions")?this.safeString(this.options,"fetchPositions","positionRisk"):"positionRisk"}if("positionRisk"===i)return await this.fetchPositionsRisk(e,t);if("account"===i)return await this.fetchAccountPositions(e,t);if("option"===i)return await this.fetchOptionPositions(e,t);throw new r.NotSupported(this.id+'.options["fetchPositions"]["method"] or params["method"] = "'+i+'" is invalid, please choose between "account", "positionRisk" and "option"')}async fetchAccountPositions(e=void 0,t={}){if(void 0!==e&&!Array.isArray(e))throw new r.ArgumentsRequired(this.id+" fetchPositions() requires an array argument for symbols");await this.loadMarkets(),await this.loadLeverageBrackets(!1,t);const i=this.safeString(this.options,"defaultType","future"),s=this.safeString(t,"type",i);let a,o,n,d;if(t=this.omit(t,"type"),[a,t]=this.handleSubTypeAndParams("fetchAccountPositions",void 0,t,"linear"),[o,t]=this.handleOptionAndParams2(t,"fetchAccountPositions","papi","portfolioMargin",!1),this.isLinear(s,a))if(o)n=await this.papiGetUmAccount(t);else{let e;[e,t]=this.handleOptionAndParams(t,"fetchAccountPositions","useV2",!1),n=e?await this.fapiPrivateV2GetAccount(t):await this.fapiPrivateV3GetAccount(t)}else{if(!this.isInverse(s,a))throw new r.NotSupported(this.id+" fetchPositions() supports linear and inverse contracts only");n=o?await this.papiGetCmAccount(t):await this.dapiPrivateGetAccount(t)}[d,t]=this.handleOptionAndParams(t,"fetchAccountPositions","filterClosed",!1);const h=this.parseAccountPositions(n,d);return e=this.marketSymbols(e),this.filterByArrayPositions(h,"symbol",e,!1)}async fetchPositionsRisk(e=void 0,t={}){if(void 0!==e&&!Array.isArray(e))throw new r.ArgumentsRequired(this.id+" fetchPositionsRisk() requires an array argument for symbols");await this.loadMarkets(),await this.loadLeverageBrackets(!1,t);const i={};let s="future";s=this.safeString(this.options,"defaultType",s);const o=this.safeString(t,"type",s);let n,d,h;if([n,t]=this.handleSubTypeAndParams("fetchPositionsRisk",void 0,t,"linear"),[d,t]=this.handleOptionAndParams2(t,"fetchPositionsRisk","papi","portfolioMargin",!1),t=this.omit(t,"type"),this.isLinear(o,n))if(d)h=await this.papiGetUmPositionRisk(this.extend(i,t));else{let e;[e,t]=this.handleOptionAndParams(t,"fetchPositionsRisk","useV2",!1),t=this.extend(i,t),h=e?await this.fapiPrivateV2GetPositionRisk(t):await this.fapiPrivateV3GetPositionRisk(t)}else{if(!this.isInverse(o,n))throw new r.NotSupported(this.id+" fetchPositionsRisk() supports linear and inverse contracts only");h=d?await this.papiGetCmPositionRisk(this.extend(i,t)):await this.dapiPrivateGetPositionRisk(this.extend(i,t))}const c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"entryPrice");a.Y.stringGt(i,"0")&&c.push(this.parsePositionRisk(h[e]))}return e=this.marketSymbols(e),this.filterByArrayPositions(c,"symbol",e,!1)}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets();let o,n,d={incomeType:"FUNDING_FEE"};if(void 0!==e&&(a=this.market(e),d.symbol=a.id,!a.swap))throw new r.NotSupported(this.id+" fetchFundingHistory() supports swap contracts only");[o,s]=this.handleSubTypeAndParams("fetchFundingHistory",a,s,"linear"),[n,s]=this.handleOptionAndParams2(s,"fetchFundingHistory","papi","portfolioMargin",!1),[d,s]=this.handleUntilOption("endTime",d,s),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i);const h=this.safeString2(this.options,"fetchFundingHistory","defaultType","future"),c=this.safeString(s,"type",h);let l;if(s=this.omit(s,"type"),this.isLinear(c,o))l=n?await this.papiGetUmIncome(this.extend(d,s)):await this.fapiPrivateGetIncome(this.extend(d,s));else{if(!this.isInverse(c,o))throw new r.NotSupported(this.id+" fetchFundingHistory() supports linear and inverse contracts only");l=n?await this.papiGetCmIncome(this.extend(d,s)):await this.dapiPrivateGetIncome(this.extend(d,s))}return this.parseIncomes(l,a,t,i)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<1||e>125)throw new r.BadRequest(this.id+" leverage should be between 1 and 125");await this.loadMarkets();const s=this.market(t),a={symbol:s.id,leverage:e};let o,n;if([o,i]=this.handleOptionAndParams2(i,"setLeverage","papi","portfolioMargin",!1),s.linear)n=o?await this.papiPostUmLeverage(this.extend(a,i)):await this.fapiPrivatePostLeverage(this.extend(a,i));else{if(!s.inverse)throw new r.NotSupported(this.id+" setLeverage() supports linear and inverse contracts only");n=o?await this.papiPostCmLeverage(this.extend(a,i)):await this.dapiPrivatePostLeverage(this.extend(a,i))}return n}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("CROSS"===(e=e.toUpperCase())&&(e="CROSSED"),"ISOLATED"!==e&&"CROSSED"!==e)throw new r.BadRequest(this.id+" marginMode must be either isolated or cross");await this.loadMarkets();const s=this.market(t),a={symbol:s.id,marginType:e};let o;try{if(s.linear)o=await this.fapiPrivatePostMarginType(this.extend(a,i));else{if(!s.inverse)throw new r.NotSupported(this.id+" setMarginMode() supports linear and inverse contracts only");o=await this.dapiPrivatePostMarginType(this.extend(a,i))}}catch(e){if(!(e instanceof r.MarginModeAlreadySet))throw e;if(this.safeBool(this.options,"throwMarginModeAlreadySet",!1))throw e;o={code:-4046,msg:"No need to change margin type."}}return o}async setPositionMode(e,t=void 0,i={}){const s=this.safeString(this.options,"defaultType","future"),a=this.safeString(i,"type",s);let o,n,d;i=this.omit(i,["type"]),[o,i]=this.handleSubTypeAndParams("setPositionMode",void 0,i),[n,i]=this.handleOptionAndParams2(i,"setPositionMode","papi","portfolioMargin",!1),d=e?"true":"false";const h={dualSidePosition:d};let c;if(this.isInverse(a,o))c=n?await this.papiPostCmPositionSideDual(this.extend(h,i)):await this.dapiPrivatePostPositionSideDual(this.extend(h,i));else{if(!this.isLinear(a,o))throw new r.BadRequest(this.id+" setPositionMode() supports linear and inverse contracts only");c=n?await this.papiPostUmPositionSideDual(this.extend(h,i)):await this.fapiPrivatePostPositionSideDual(this.extend(h,i))}return c}async fetchLeverages(e=void 0,t={}){let i,s,a,o;if(await this.loadMarkets(),await this.loadLeverageBrackets(!1,t),[i,t]=this.handleMarketTypeAndParams("fetchLeverages",void 0,t),[s,t]=this.handleSubTypeAndParams("fetchLeverages",void 0,t,"linear"),[a,t]=this.handleOptionAndParams2(t,"fetchLeverages","papi","portfolioMargin",!1),this.isLinear(i,s))o=a?await this.papiGetUmAccount(t):await this.fapiPrivateGetSymbolConfig(t);else{if(!this.isInverse(i,s))throw new r.NotSupported(this.id+" fetchLeverages() supports linear and inverse contracts only");o=a?await this.papiGetCmAccount(t):await this.dapiPrivateGetAccount(t)}let n=this.safeList(o,"positions",[]);return Array.isArray(o)&&(n=o),this.parseLeverages(n,e,"symbol")}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeBool(e,"isolated");let r;void 0!==s&&(r=s?"isolated":"cross");const a=this.safeStringLower(e,"marginType");void 0!==a&&(r="crossed"===a?"cross":"isolated");const o=this.safeStringLower(e,"positionSide");let n,d;const h=this.safeInteger(e,"leverage");return void 0===o||"both"===o?(n=h,d=h):"long"===o?n=h:"short"===o&&(d=h),{info:e,symbol:this.safeSymbol(i,t),marginMode:r,longLeverage:n,shortLeverage:d}}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=void 0===e?void 0:this.market(e);let o;if([o,s]=this.handleMarketTypeAndParams("fetchSettlementHistory",a,s),"option"!==o)throw new r.NotSupported(this.id+" fetchSettlementHistory() supports option markets only");const n={};void 0!==e&&(e=a.symbol,n.underlying=a.baseId+a.quoteId),void 0!==t&&(n.startTime=t),void 0!==i&&(n.limit=i);const d=await this.eapiPublicGetExerciseHistory(this.extend(n,s)),h=this.parseSettlements(d,a),c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchMySettlementHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=void 0===e?void 0:this.market(e);let o;if([o,s]=this.handleMarketTypeAndParams("fetchMySettlementHistory",a,s),"option"!==o)throw new r.NotSupported(this.id+" fetchMySettlementHistory() supports option markets only");const n={};void 0!==e&&(n.symbol=a.id),void 0!==t&&(n.startTime=t),void 0!==i&&(n.limit=i);const d=await this.eapiPrivateGetExerciseRecord(this.extend(n,s)),h=this.parseSettlements(d,a),c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,a.symbol,t,i)}parseSettlement(e,t){const i=this.safeInteger2(e,"expiryDate","createDate"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber2(e,"realStrikePrice","exercisePrice"),timestamp:i,datetime:this.iso8601(i)}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++)i.push(this.parseSettlement(e[s],t));return i}async fetchLedgerEntry(e,t=void 0,i={}){let s;if(await this.loadMarkets(),[s,i]=this.handleMarketTypeAndParams("fetchLedgerEntry",void 0,i),"option"!==s)throw new r.BadRequest(this.id+" fetchLedgerEntry() can only be used for type option");this.checkRequiredArgument("fetchLedgerEntry",t,"code");const a=this.currency(t),o={recordId:e,currency:a.id},n=await this.eapiPrivateGetBill(this.extend(o,i)),d=this.safeDict(n,0,n);return this.parseLedgerEntry(d,a)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o,n,d=!1;if([d,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),d)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s,void 0,!1);void 0!==e&&(n=this.currency(e));const h={};[a,s]=this.handleMarketTypeAndParams("fetchLedger",void 0,s),[o,s]=this.handleSubTypeAndParams("fetchLedger",void 0,s),void 0!==t&&(h.startTime=t),void 0!==i&&(h.limit=i);const c=this.safeInteger(s,"until");let l,u;if(void 0!==c&&(s=this.omit(s,"until"),h.endTime=c),[l,s]=this.handleOptionAndParams2(s,"fetchLedger","papi","portfolioMargin",!1),"option"===a)this.checkRequiredArgument("fetchLedger",e,"code"),h.currency=n.id,u=await this.eapiPrivateGetBill(this.extend(h,s));else if(this.isLinear(a,o))u=l?await this.papiGetUmIncome(this.extend(h,s)):await this.fapiPrivateGetIncome(this.extend(h,s));else{if(!this.isInverse(a,o))throw new r.NotSupported(this.id+" fetchLedger() supports contract wallets only");u=l?await this.papiGetCmIncome(this.extend(h,s)):await this.dapiPrivateGetIncome(this.extend(h,s))}return this.parseLedger(u,n,t,i)}parseLedgerEntry(e,t=void 0){let i,s=this.safeString2(e,"amount","income");a.Y.stringLe(s,"0")?(i="out",s=a.Y.stringMul("-1",s)):i="in";const r=this.safeString(e,"asset"),o=this.safeCurrencyCode(r,t);t=this.safeCurrency(r,t);const n=this.safeInteger2(e,"createDate","time"),d=this.safeString2(e,"type","incomeType");return this.safeLedgerEntry({info:e,id:this.safeString2(e,"id","tranId"),direction:i,account:void 0,referenceAccount:void 0,referenceId:this.safeString(e,"tradeId"),type:this.parseLedgerEntryType(d),currency:o,amount:this.parseNumber(s),timestamp:n,datetime:this.iso8601(n),before:void 0,after:void 0,status:void 0,fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({FEE:"fee",FUNDING_FEE:"fee",OPTIONS_PREMIUM_FEE:"fee",POSITION_LIMIT_INCREASE_FEE:"fee",CONTRACT:"trade",REALIZED_PNL:"trade",TRANSFER:"transfer",CROSS_COLLATERAL_TRANSFER:"transfer",INTERNAL_TRANSFER:"transfer",COIN_SWAP_DEPOSIT:"deposit",COIN_SWAP_WITHDRAW:"withdrawal",OPTIONS_SETTLE_PROFIT:"settlement",DELIVERED_SETTELMENT:"settlement",WELCOME_BONUS:"cashback",CONTEST_REWARD:"cashback",COMMISSION_REBATE:"rebate",API_REBATE:"rebate",REFERRAL_KICKBACK:"referral",COMMISSION:"commission"},e,e)}sign(e,t="public",i="GET",s={},a=void 0,o=void 0){if(!(t in this.urls.api))throw new r.NotSupported(this.id+" does not have a testnet/sandbox URL for "+t+" endpoints");let l=this.urls.api[t];if(l+="/"+e,"historicalTrades"===e){if(!this.apiKey)throw new r.AuthenticationError(this.id+" historicalTrades endpoint requires `apiKey` credential");a={"X-MBX-APIKEY":this.apiKey}}if("userDataStream"===e||"listenKey"===e){if(!this.apiKey)throw new r.AuthenticationError(this.id+" userDataStream endpoint requires `apiKey` credential");a={"X-MBX-APIKEY":this.apiKey,"Content-Type":"application/x-www-form-urlencoded"},"GET"!==i&&(o=this.urlencode(s))}else if("private"===t||"eapiPrivate"===t||"sapi"===t&&"system/status"!==e||"sapiV2"===t||"sapiV3"===t||"sapiV4"===t||"dapiPrivate"===t||"dapiPrivateV2"===t||"fapiPrivate"===t||"fapiPrivateV2"===t||"fapiPrivateV3"===t||"papi"===t&&"ping"!==e){if(this.checkRequiredCredentials(),"POST"===i&&("order"===e||"sor/order"===e)){if(void 0===this.safeString(s,"newClientOrderId")){const e=t.indexOf("sapi")>-1||"private"===t,i=e?"spot":"future",r=e?"x-R4BD3S82":"x-xcKtGhcu",a=this.safeDict(this.options,"broker",{}),o=this.safeString(a,i,r);s.newClientOrderId=o+this.uuid22()}}let r;if("batchOrders"===e&&("POST"===i||"PUT"===i)){const e=this.safeValue(s,"batchOrders"),t=this.json(e);s.batchOrders=t}const u=this.safeInteger(this.options,"recvWindow");let f=this.extend({timestamp:this.nonce()},s);void 0!==u&&(f.recvWindow=u);const p=this.safeInteger(s,"recvWindow");if(void 0!==p&&(f.recvWindow=p),"sapi"===t&&"asset/dust"===e)r=this.urlencodeWithArrayRepeat(f);else if("batchOrders"===e||e.indexOf("sub-account")>=0||"capital/withdraw/apply"===e||e.indexOf("staking")>=0||e.indexOf("simple-earn")>=0)if("DELETE"===i&&"batchOrders"===e){const e=this.safeList(f,"orderidlist",[]),t=this.safeList(f,"origclientorderidlist",[]);f=this.omit(f,["orderidlist","origclientorderidlist"]),r=this.rawencode(f);const i=e.length,s=t.length;i>0&&(r=r+"&orderidlist=%5B"+e.join("%2C")+"%5D"),s>0&&(r=r+"&origclientorderidlist=%5B"+t.join("%2C")+"%5D")}else r=this.rawencode(f);else r=this.urlencode(f);let m;m=this.secret.indexOf("PRIVATE KEY")>-1?this.secret.length>120?this.encodeURIComponent((0,d.n)(r,this.secret,n.s)):this.encodeURIComponent((0,h.q4)(this.encode(r),this.secret,c.ev)):this.hmac(this.encode(r),this.encode(this.secret),n.s),r+="&signature="+m,a={"X-MBX-APIKEY":this.apiKey},"GET"===i||"DELETE"===i?l+="?"+r:(o=r,a["Content-Type"]="application/x-www-form-urlencoded")}else Object.keys(s).length&&(l+="?"+this.urlencode(s));return{url:l,method:i,body:o,headers:a}}getExceptionsByUrl(e,t){let i;const s=void 0!==this.hostname?this.hostname:"binance.com";if(e.startsWith("https://api."+s+"/")||e.startsWith("https://testnet.binance.vision")?i="spot":e.startsWith("https://dapi."+s+"/")||e.startsWith("https://testnet.binancefuture.com/dapi")?i="inverse":e.startsWith("https://fapi."+s+"/")||e.startsWith("https://testnet.binancefuture.com/fapi")?i="linear":e.startsWith("https://eapi."+s+"/")?i="option":e.startsWith("https://papi."+s+"/")&&(i="portfolioMargin"),void 0!==i){const e=this.safeDict(this.exceptions,i,{});return this.safeDict(e,t,{})}return{}}handleErrors(e,t,i,s,o,n,d,h,c){if(418===e||429===e)throw new r.DDoSProtection(this.id+" "+e.toString()+" "+t+" "+n);if(e>=400){if(n.indexOf("Price * QTY is zero or less")>=0)throw new r.InvalidOrder(this.id+" order cost = amount * price is zero or less "+n);if(n.indexOf("LOT_SIZE")>=0)throw new r.InvalidOrder(this.id+" order amount should be evenly divisible by lot size "+n);if(n.indexOf("PRICE_FILTER")>=0)throw new r.InvalidOrder(this.id+" order price is invalid, i.e. exceeds allowed price precision, exceeds min price or max price limits or is invalid value in general, use this.priceToPrecision (symbol, amount) "+n)}if(void 0===d)return;const l=this.safeBool(d,"success",!0);if(!l){const e=this.safeString(d,"msg");let t;if(void 0!==e){try{t=JSON.parse(e)}catch(e){t=void 0}void 0!==t&&(d=t)}}const u=this.safeString(d,"msg");void 0!==u&&(this.throwExactlyMatchedException(this.getExceptionsByUrl(i,"exact"),u,this.id+" "+u),this.throwExactlyMatchedException(this.exceptions.exact,u,this.id+" "+u),this.throwBroadlyMatchedException(this.getExceptionsByUrl(i,"broad"),u,this.id+" "+u),this.throwBroadlyMatchedException(this.exceptions.broad,u,this.id+" "+u));const f=this.safeString(d,"code");if(void 0!==f){if("200"===f||a.Y.stringEquals(f,"0"))return;if("-2015"===f&&this.options.hasAlreadyAuthenticatedSuccessfully)throw new r.DDoSProtection(this.id+" "+n);const e=this.id+" "+n;if("No need to change margin type."===u)throw new r.MarginModeAlreadySet(e);throw this.throwExactlyMatchedException(this.getExceptionsByUrl(i,"exact"),f,e),this.throwExactlyMatchedException(this.exceptions.exact,f,e),new r.ExchangeError(e)}if(!l)throw new r.ExchangeError(this.id+" "+n);if(Array.isArray(d)){if(1===d.length){const e=d[0],t=this.safeString(e,"code");void 0!==t&&(this.throwExactlyMatchedException(this.getExceptionsByUrl(i,"exact"),t,this.id+" "+n),this.throwExactlyMatchedException(this.exceptions.exact,t,this.id+" "+n))}}}calculateRateLimiterCost(e,t,i,s,r={}){if("noCoin"in r&&!("coin"in s))return r.noCoin;if("noSymbol"in r&&!("symbol"in s))return r.noSymbol;if("noPoolId"in r&&!("poolId"in s))return r.noPoolId;if("byLimit"in r&&"limit"in s){const e=s.limit,t=r.byLimit;for(let i=0;i<t.length;i++){const s=t[i];if(e<=s[0])return s[1]}}return this.safeValue(r,"cost",1)}async request(e,t="public",i="GET",s={},r=void 0,a=void 0,o={}){const n=await this.fetch2(e,t,i,s,r,a,o);return"private"===t&&(this.options.hasAlreadyAuthenticatedSuccessfully=!0),n}async modifyMarginHelper(e,t,i,s={}){let a=this.safeString(this.options,"defaultType","future");"spot"===a&&(a="future");const o=this.safeString(s,"type",a);if("margin"===o||"spot"===o)throw new r.NotSupported(this.id+" add / reduce margin only supported with type future or delivery");await this.loadMarkets();const n=this.market(e);t=this.amountToPrecision(e,t);const d={type:i,symbol:n.id,amount:t};let h,c;return n.linear?(c=n.quote,h=await this.fapiPrivatePostPositionMargin(this.extend(d,s))):(c=n.base,h=await this.dapiPrivatePostPositionMargin(this.extend(d,s))),this.extend(this.parseMarginModification(h,n),{code:c})}parseMarginModification(e,t=void 0){const i=this.safeInteger(e,"type"),s=this.safeString(e,"code"),r=this.safeString(e,"symbol"),a=this.safeInteger(e,"time"),o=void 0===s,n="200"===s;return{info:e,symbol:(t=this.safeMarket(r,t,void 0,"swap")).symbol,type:1===i?"add":"reduce",marginMode:"isolated",amount:this.safeNumber(e,"amount"),code:this.safeString(e,"asset"),total:void 0,status:n||o?"ok":"failed",timestamp:a,datetime:this.iso8601(a)}}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,2,i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,1,i)}async fetchCrossBorrowRate(e,t={}){await this.loadMarkets();const i={asset:this.currency(e).id},s=await this.sapiGetMarginInterestRateHistory(this.extend(i,t)),r=this.safeDict(s,0);return this.parseBorrowRate(r)}async fetchIsolatedBorrowRate(e,t={}){const i={symbol:e},s=await this.fetchIsolatedBorrowRates(this.extend(i,t));return this.safeDict(s,e)}async fetchIsolatedBorrowRates(e={}){await this.loadMarkets();const t={},i=this.safeString(e,"symbol");if(e=this.omit(e,"symbol"),void 0!==i){const e=this.market(i);t.symbol=e.id}const s=await this.sapiGetMarginIsolatedMarginData(this.extend(t,e));return this.parseIsolatedBorrowRates(s)}async fetchBorrowRateHistory(e,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===i)i=93;else if(i>93)throw new r.BadRequest(this.id+" fetchBorrowRateHistory() limit parameter cannot exceed 92");const a={asset:this.currency(e).id,limit:i};if(void 0!==t){a.startTime=t;const e=this.sum(t,864e5*i)-1,s=this.milliseconds();a.endTime=Math.min(e,s)}const o=await this.sapiGetMarginInterestRateHistory(this.extend(a,s));return this.parseBorrowRateHistory(o,e,t,i)}parseBorrowRate(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"asset");return{currency:this.safeCurrencyCode(s,t),rate:this.safeNumber(e,"dailyInterestRate"),period:864e5,timestamp:i,datetime:this.iso8601(i),info:e}}parseIsolatedBorrowRate(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"spot");const s=this.safeList(e,"data"),r=this.safeDict(s,0),a=this.safeDict(s,1);return{info:e,symbol:this.safeString(t,"symbol"),base:this.safeString(r,"coin"),baseRate:this.safeNumber(r,"dailyInterest"),quote:this.safeString(a,"coin"),quoteRate:this.safeNumber(a,"dailyInterest"),period:864e5,timestamp:void 0,datetime:void 0}}async createGiftCode(e,t,i={}){await this.loadMarkets();const s={token:this.currency(e).id,amount:t},r=await this.sapiPostGiftcardCreateCode(this.extend(s,i)),a=this.safeDict(r,"data"),o=this.safeString(a,"code");return{info:r,id:this.safeString(a,"referenceNo"),code:o,currency:e,amount:t}}async redeemGiftCode(e,t={}){const i={code:e};return await this.sapiPostGiftcardRedeemCode(this.extend(i,t))}async verifyGiftCode(e,t={}){const i={referenceNo:e};return await this.sapiGetGiftcardVerify(this.extend(i,t))}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),[a,r]=this.handleOptionAndParams2(r,"fetchBorrowInterest","papi","portfolioMargin",!1);let o,n,d={};if(void 0!==e){const t=this.currency(e);d.asset=t.id}void 0!==i&&(d.startTime=i),void 0!==s&&(d.size=s),[d,r]=this.handleUntilOption("endTime",d,r),a?n=await this.papiGetMarginMarginInterestHistory(this.extend(d,r)):(void 0!==t&&(o=this.market(t),d.isolatedSymbol=o.id),n=await this.sapiGetMarginInterestHistory(this.extend(d,r)));const h=this.safeList(n,"rows"),c=this.parseBorrowInterests(h,o);return this.filterByCurrencySinceLimit(c,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"isolatedSymbol"),s=this.safeInteger(e,"interestAccuredTime"),r=void 0===i?"cross":"isolated";return{info:e,symbol:i,currency:this.safeCurrencyCode(this.safeString(e,"asset")),interest:this.safeNumber(e,"interest"),interestRate:this.safeNumber(e,"interestRate"),amountBorrowed:this.safeNumber(e,"principal"),marginMode:r,timestamp:s,datetime:this.iso8601(s)}}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={asset:s.id,amount:this.currencyToPrecision(e,t)};let a,o;if([o,i]=this.handleOptionAndParams2(i,"repayCrossMargin","papi","portfolioMargin",!1),o){let e;[e,i]=this.handleOptionAndParams2(i,"repayCrossMargin","repayCrossMarginMethod","method"),a="papiPostMarginRepayDebt"===e?await this.papiPostMarginRepayDebt(this.extend(r,i)):await this.papiPostRepayLoan(this.extend(r,i))}else r.isIsolated="FALSE",r.type="REPAY",a=await this.sapiPostMarginBorrowRepay(this.extend(r,i));return this.parseMarginLoan(a,s)}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=this.market(e),o={asset:r.id,amount:this.currencyToPrecision(t,i),symbol:a.id,isIsolated:"TRUE",type:"REPAY"},n=await this.sapiPostMarginBorrowRepay(this.extend(o,s));return this.parseMarginLoan(n,r)}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={asset:s.id,amount:this.currencyToPrecision(e,t)};let a,o;return[o,i]=this.handleOptionAndParams2(i,"borrowCrossMargin","papi","portfolioMargin",!1),o?a=await this.papiPostMarginLoan(this.extend(r,i)):(r.isIsolated="FALSE",r.type="BORROW",a=await this.sapiPostMarginBorrowRepay(this.extend(r,i))),this.parseMarginLoan(a,s)}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=this.market(e),o={asset:r.id,amount:this.currencyToPrecision(t,i),symbol:a.id,isIsolated:"TRUE",type:"BORROW"},n=await this.sapiPostMarginBorrowRepay(this.extend(o,s));return this.parseMarginLoan(n,r)}parseMarginLoan(e,t=void 0){const i=this.safeString(e,"asset"),s=this.safeInteger(e,"updateTime");return{id:this.safeInteger(e,"tranId"),currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amount"),symbol:void 0,timestamp:s,datetime:this.iso8601(s),info:e}}async fetchOpenInterestHistory(e,t="5m",i=void 0,s=void 0,a={}){if("1m"===t)throw new r.BadRequest(this.id+" fetchOpenInterestHistory cannot use the 1m timeframe");await this.loadMarkets();let o=!1;if([o,a]=this.handleOptionAndParams(a,"fetchOpenInterestHistory","paginate",!1),o)return await this.fetchPaginatedCallDeterministic("fetchOpenInterestHistory",e,i,s,t,a,500);const n=this.market(e),d={period:this.safeString(this.timeframes,t,t)};void 0!==s&&(d.limit=s);d[n.linear?"symbol":"pair"]=n.id,n.inverse&&(d.contractType=this.safeString(a,"contractType","CURRENT_QUARTER")),void 0!==i&&(d.startTime=i);const h=this.safeInteger(a,"until"),c=this.safeInteger(a,"endTime",h);if(a=this.omit(a,["endTime","until"]),c)d.endTime=c;else if(i){void 0===s&&(s=30);const e=this.parseTimeframe(t);d.endTime=this.sum(i,e*s*1e3)}let l;return l=n.inverse?await this.dapiDataGetOpenInterestHist(this.extend(d,a)):await this.fapiDataGetOpenInterestHist(this.extend(d,a)),this.parseOpenInterestsHistory(l,n,i,s)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e),s={};if(i.option){if(s.underlyingAsset=i.baseId,void 0===i.expiry)throw new r.NotSupported(this.id+" fetchOpenInterest does not support "+e);s.expiration=this.yymmdd(i.expiry)}else s.symbol=i.id;let a;if(a=i.option?await this.eapiPublicGetOpenInterest(this.extend(s,t)):i.inverse?await this.dapiPublicGetOpenInterest(this.extend(s,t)):await this.fapiPublicGetOpenInterest(this.extend(s,t)),!i.option)return this.parseOpenInterest(a,i);{e=i.symbol;const t=this.parseOpenInterestsHistory(a,i);for(let i=0;i<t.length;i++){const s=t[i];if(s.symbol===e)return s}}}parseOpenInterest(e,t=void 0){const i=this.safeInteger2(e,"timestamp","time"),s=this.safeString(e,"symbol"),r=this.safeNumber2(e,"sumOpenInterest","openInterest"),a=this.safeNumber2(e,"sumOpenInterestValue","sumOpenInterestUsd");return this.safeOpenInterest({symbol:this.safeSymbol(s,t,void 0,"contract"),baseVolume:t.inverse?void 0:r,quoteVolume:a,openInterestAmount:r,openInterestValue:a,timestamp:i,datetime:this.iso8601(i),info:e},t)}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o,n,d,h=!1;if([h,s]=this.handleOptionAndParams(s,"fetchMyLiquidations","paginate"),h)return await this.fetchPaginatedCallIncremental("fetchMyLiquidations",e,t,i,s,"current",100);void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchMyLiquidations",a,s),[n,s]=this.handleSubTypeAndParams("fetchMyLiquidations",a,s,"linear"),[d,s]=this.handleOptionAndParams2(s,"fetchMyLiquidations","papi","portfolioMargin",!1);let c,l={};if("spot"!==o&&(l.autoCloseType="LIQUIDATION"),void 0!==a){const e=a.spot?"isolatedSymbol":"symbol";d||(l[e]=a.id)}if(void 0!==t&&(l.startTime=t),void 0!==i&&("spot"===o?l.size=i:l.limit=i),[l,s]=this.handleUntilOption("endTime",l,s),"spot"===o)c=d?await this.papiGetMarginForceOrders(this.extend(l,s)):await this.sapiGetMarginForceLiquidationRec(this.extend(l,s));else if("linear"===n)c=d?await this.papiGetUmForceOrders(this.extend(l,s)):await this.fapiPrivateGetForceOrders(this.extend(l,s));else{if("inverse"!==n)throw new r.NotSupported(this.id+" fetchMyLiquidations() does not support "+a.type+" markets");c=d?await this.papiGetCmForceOrders(this.extend(l,s)):await this.dapiPrivateGetForceOrders(this.extend(l,s))}const u=this.safeList(c,"rows",c);return this.parseLiquidations(u,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger2(e,"updatedTime","updateTime");return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:this.safeNumber(e,"executedQty"),contractSize:this.safeNumber(t,"contractSize"),price:this.safeNumber(e,"avgPrice"),baseValue:this.safeNumber(e,"cumBase"),quoteValue:this.safeNumber(e,"cumQuote"),timestamp:s,datetime:this.iso8601(s)})}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.eapiPublicGetMark(this.extend(s,t));return this.parseGreeks(r[0],i)}parseGreeks(e,t=void 0){const i=this.safeString(e,"symbol");return{symbol:this.safeSymbol(i,t),timestamp:void 0,datetime:void 0,delta:this.safeNumber(e,"delta"),gamma:this.safeNumber(e,"gamma"),theta:this.safeNumber(e,"theta"),vega:this.safeNumber(e,"vega"),rho:void 0,bidSize:void 0,askSize:void 0,bidImpliedVolatility:this.safeNumber(e,"bidIV"),askImpliedVolatility:this.safeNumber(e,"askIV"),markImpliedVolatility:this.safeNumber(e,"markIV"),bidPrice:void 0,askPrice:void 0,markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,underlyingPrice:void 0,info:e}}async fetchTradingLimits(e=void 0,t={}){const i=await this.fetchMarkets(),s={};for(let t=0;t<i.length;t++){const r=i[t],a=r.symbol;(void 0===e||this.inArray(a,e))&&(s[a]=r.limits.amount)}return s}async fetchPositionMode(e=void 0,t={}){let i,s,a;if(void 0!==e&&(i=this.market(e)),[s,t]=this.handleSubTypeAndParams("fetchPositionMode",i,t),"linear"===s)a=await this.fapiPrivateGetPositionSideDual(t);else{if("inverse"!==s)throw new r.BadRequest(this.id+' fetchPositionMode requires either a symbol argument or params["subType"]');a=await this.dapiPrivateGetPositionSideDual(t)}return{info:a,hedged:this.safeBool(a,"dualSidePosition")}}async fetchMarginModes(e=void 0,t={}){let i,s,a;if(await this.loadMarkets(),void 0!==e&&(e=this.marketSymbols(e),i=this.market(e[0])),[s,t]=this.handleSubTypeAndParams("fetchMarginMode",i,t),"linear"===s)a=await this.fapiPrivateGetSymbolConfig(t);else{if("inverse"!==s)throw new r.BadRequest(this.id+" fetchMarginModes () supports linear and inverse subTypes only");a=await this.dapiPrivateGetAccount(t)}let o=this.safeList(a,"positions",[]);return Array.isArray(a)&&(o=a),this.parseMarginModes(o,e,"symbol","swap")}async fetchMarginMode(e,t={}){await this.loadMarkets();const i=this.market(e);let s,a;if([s,t]=this.handleSubTypeAndParams("fetchMarginMode",i,t),"linear"!==s){if("inverse"===s){return(await this.fetchMarginModes([e],t))[e]}throw new r.BadRequest(this.id+" fetchMarginMode () supports linear and inverse subTypes only")}{const e={symbol:i.id};a=await this.fapiPrivateGetSymbolConfig(this.extend(e,t))}return this.parseMarginMode(a[0],i)}parseMarginMode(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeBool(e,"isolated");let r;void 0!==s&&(r=s?"isolated":"cross");const a=this.safeStringLower(e,"marginType");return void 0!==a&&(r="crossed"===a?"cross":"isolated"),{info:e,symbol:t.symbol,marginMode:r}}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.eapiPublicGetTicker(this.extend(s,t)),a=this.safeDict(r,0,{});return this.parseOption(a,void 0,i)}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"symbol");return{info:e,currency:void 0,symbol:(i=this.safeMarket(s,i)).symbol,timestamp:void 0,datetime:void 0,impliedVolatility:void 0,openInterest:void 0,bidPrice:this.safeNumber(e,"bidPrice"),askPrice:this.safeNumber(e,"askPrice"),midPrice:void 0,markPrice:void 0,lastPrice:this.safeNumber(e,"lastPrice"),underlyingPrice:this.safeNumber(e,"exercisePrice"),change:this.safeNumber(e,"priceChange"),percentage:this.safeNumber(e,"priceChangePercent"),baseVolume:this.safeNumber(e,"volume"),quoteVolume:void 0}}async fetchMarginAdjustmentHistory(e=void 0,t=void 0,i=void 0,s=void 0,a={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMarginAdjustmentHistory () requires a symbol argument");const o=this.market(e),n=this.safeInteger(a,"until");a=this.omit(a,"until");const d={symbol:o.id};let h;if(void 0!==t&&(d.type="add"===t?1:2),void 0!==i&&(d.startTime=i),void 0!==s&&(d.limit=s),void 0!==n&&(d.endTime=n),o.linear)h=await this.fapiPrivateGetPositionMarginHistory(this.extend(d,a));else{if(!o.inverse)throw new r.BadRequest(this.id+" fetchMarginAdjustmentHistory () is not supported for markets of type "+o.type);h=await this.dapiPrivateGetPositionMarginHistory(this.extend(d,a))}const c=this.parseMarginModifications(h);return this.filterBySymbolSinceLimit(c,e,i,s)}async fetchConvertCurrencies(e={}){await this.loadMarkets();const t=await this.sapiGetConvertAssetInfo(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r);i[a]={info:s,id:r,code:a,networks:void 0,type:void 0,name:void 0,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:this.parseNumber(this.parsePrecision(this.safeString(s,"fraction"))),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},created:void 0}}return i}async fetchConvertQuote(e,t,i=void 0,s={}){if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchConvertQuote() requires an amount argument");await this.loadMarkets();const a={fromAsset:e,toAsset:t,fromAmount:i},o=await this.sapiPostConvertGetQuote(this.extend(a,s)),n=this.currency(e),d=this.currency(t);return this.parseConversion(o,n,d)}async createConvertTrade(e,t,i,s=void 0,a={}){await this.loadMarkets();const o={};let n;if("BUSD"===t||"BUSD"===i){if(void 0===s)throw new r.ArgumentsRequired(this.id+" createConvertTrade() requires an amount argument");o.clientTranId=e,o.asset=t,o.targetAsset=i,o.amount=s,n=await this.sapiPostAssetConvertTransfer(this.extend(o,a))}else o.quoteId=e,n=await this.sapiPostConvertAcceptQuote(this.extend(o,a));const d=this.currency(t),h=this.currency(i);return this.parseConversion(n,d,h)}async fetchConvertTrade(e,t=void 0,i={}){await this.loadMarkets();const s={};let r;if("BUSD"===t){const a=864e5,o=this.milliseconds();if(void 0!==t){const e=this.currency(t);s.asset=e.id}s.tranId=e,s.startTime=o-a,s.endTime=o,r=await this.sapiGetAssetConvertTransferQueryByPage(this.extend(s,i))}else s.orderId=e,r=await this.sapiGetConvertOrderStatus(this.extend(s,i));let a=r;if("BUSD"===t){const e=this.safeList(r,"rows",[]);a=this.safeDict(e,0,{})}const o=this.safeString2(a,"deductedAsset","fromAsset"),n=this.safeString2(a,"targetAsset","toAsset");let d,h;return void 0!==o&&(d=this.currency(o)),void 0!==n&&(h=this.currency(n)),this.parseConversion(a,d,h)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={},o=2592e6,n=this.milliseconds();a.startTime=void 0!==t?t:n-o;const d=this.safeInteger2(s,"endTime","until");let h,c,l,u;if(a.endTime=void 0!==d?d:n,s=this.omit(s,"until"),"BUSD"===e){const t=this.currency(e);a.asset=t.id,void 0!==i&&(a.size=i),l="deductedAsset",u="targetAsset",c="rows",h=await this.sapiGetAssetConvertTransferQueryByPage(this.extend(a,s))}else{if(a.endTime-a.startTime>o)throw new r.BadRequest(this.id+" fetchConvertTradeHistory () the max interval between startTime and endTime is 30 days.");void 0!==i&&(a.limit=i),l="fromAsset",u="toAsset",c="list",h=await this.sapiGetConvertTradeFlow(this.extend(a,s))}const f=this.safeList(h,c,[]);return this.parseConversions(f,e,l,u,t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeIntegerN(e,["time","validTimestamp","createTime"]),r=this.safeString2(e,"deductedAsset","fromAsset"),a=this.safeCurrencyCode(r,t),o=this.safeString2(e,"targetAsset","toAsset"),n=this.safeCurrencyCode(o,i);return{info:e,timestamp:s,datetime:this.iso8601(s),id:this.safeStringN(e,["tranId","orderId","quoteId"]),fromCurrency:a,fromAmount:this.safeNumber2(e,"deductedAmount","fromAmount"),toCurrency:n,toAmount:this.safeNumber2(e,"targetAmount","toAmount"),price:void 0,fee:void 0}}async fetchFundingIntervals(e=void 0,t={}){let i;await this.loadMarkets(),void 0!==e&&(e=this.marketSymbols(e),i=this.market(e[0]));const s="swap";let a,o;if([a,t]=this.handleSubTypeAndParams("fetchFundingIntervals",i,t,"linear"),this.isLinear(s,a))o=await this.fapiPublicGetFundingInfo(t);else{if(!this.isInverse(s,a))throw new r.NotSupported(this.id+" fetchFundingIntervals() supports linear and inverse swap contracts only");o=await this.dapiPublicGetFundingInfo(t)}return this.parseFundingRates(o,e)}async fetchLongShortRatioHistory(e=void 0,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e);void 0===t&&(t="1d");let n,d,h={period:t};if([h,a]=this.handleUntilOption("endTime",h,a),void 0!==i&&(h.startTime=i),void 0!==s&&(h.limit=s),[n,a]=this.handleSubTypeAndParams("fetchLongShortRatioHistory",o,a),"linear"===n)h.symbol=o.id,d=await this.fapiDataGetGlobalLongShortAccountRatio(this.extend(h,a));else{if("inverse"!==n)throw new r.BadRequest(this.id+" fetchLongShortRatioHistory() supports linear and inverse subTypes only");h.pair=o.info.pair,d=await this.dapiDataGetGlobalLongShortAccountRatio(this.extend(h,a))}return this.parseLongShortRatioHistory(d,o)}parseLongShortRatio(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeIntegerOmitZero(e,"timestamp");return{info:e,symbol:this.safeSymbol(i,t,void 0,"contract"),timestamp:s,datetime:this.iso8601(s),timeframe:void 0,longShortRatio:this.safeNumber(e,"longShortRatio")}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"binancecoinm",name:"Binance COIN-M",urls:{logo:"https://github.com/user-attachments/assets/387cfc4e-5f33-48cd-8f5c-cd4854dabf0c",doc:["https://binance-docs.github.io/apidocs/delivery/en/","https://binance-docs.github.io/apidocs/spot/en","https://developers.binance.com/en"]},has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!0,option:void 0,createStopMarketOrder:!0},options:{fetchMarkets:["inverse"],defaultSubType:"inverse",leverageBrackets:void 0}})}async transferIn(e,t,i={}){return await this.futuresTransfer(e,t,3,i)}async transferOut(e,t,i={}){return await this.futuresTransfer(e,t,4,i)}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"binanceus",name:"Binance US",countries:["US"],hostname:"binance.us",rateLimit:50,certified:!1,pro:!0,urls:{logo:"https://github.com/user-attachments/assets/a9667919-b632-4d52-a832-df89f8a35e8c",api:{web:"https://www.binance.us",public:"https://api.binance.us/api/v3",private:"https://api.binance.us/api/v3",sapi:"https://api.binance.us/sapi/v1",sapiV2:"https://api.binance.us/sapi/v2",sapiV3:"https://api.binance.us/sapi/v3"},www:"https://www.binance.us",referral:"https://www.binance.us/?ref=35005074",doc:"https://github.com/binance-us/binance-official-api-docs",fees:"https://www.binance.us/en/fee/schedule"},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0.001")}},options:{fetchMarkets:["spot"],defaultType:"spot",fetchMargins:!1,quoteOrderQty:!1},has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:void 0,option:!1,addMargin:!1,closeAllPositions:!1,closePosition:!1,createReduceOnlyOrder:!1,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedPositions:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchPosition:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,reduceMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1},api:{public:{get:{ping:1,time:1,exchangeInfo:10,trades:1,historicalTrades:5,aggTrades:1,depth:{cost:1,byLimit:[[100,1],[500,5],[1e3,10],[5e3,50]]},klines:1,"ticker/price":{cost:1,noSymbol:2},avgPrice:1,"ticker/bookTicker":{cost:1,noSymbol:2},"ticker/24hr":{cost:1,noSymbol:40},ticker:{cost:2,noSymbol:100}}},private:{get:{account:10,"rateLimit/order":20,order:2,openOrders:{cost:3,noSymbol:40},myTrades:10,myPreventedMatches:10,allOrders:10,orderList:2,allOrderList:10,openOrderList:3},post:{order:1,"order/test":1,"order/cancelReplace":1,"order/oco":1},delete:{order:1,openOrders:1,orderList:1}},sapi:{get:{"system/status":1,"asset/assetDistributionHistory":1,"asset/query/trading-fee":1,"asset/query/trading-volume":1,"sub-account/spotSummary":1,"sub-account/status":1,"otc/coinPairs":1,"otc/orders/{orderId}":1,"otc/orders":1,"ocbs/orders":1,"capital/config/getall":1,"capital/withdraw/history":1,"fiatpayment/query/withdraw/history":1,"capital/deposit/address":1,"capital/deposit/hisrec":1,"fiatpayment/query/deposit/history":1,"capital/sub-account/deposit/address":1,"capital/sub-account/deposit/history":1,"asset/query/dust-logs":1,"asset/query/dust-assets":1,"marketing/referral/reward/history":1,"staking/asset":1,"staking/stakingBalance":1,"staking/history":1,"staking/stakingRewardsHistory":1,"custodian/balance":1,"custodian/supportedAssetList":1,"custodian/walletTransferHistory":1,"custodian/custodianTransferHistory":1,"custodian/openOrders":1,"custodian/order":1,"custodian/orderHistory":1,"custodian/tradeHistory":1,"custodian/settlementSetting":1,"custodian/settlementHistory":1,"cl/transferHistory":1,"apipartner/checkEligibility":1,"apipartner/rebateHistory":1},post:{"otc/quotes":1,"otc/orders":1,"fiatpayment/withdraw/apply":1,"capital/withdraw/apply":1,"asset/dust":10,"staking/stake":1,"staking/unstake":1,"custodian/walletTransfer":1,"custodian/custodianTransfer":1,"custodian/undoTransfer":1,"custodian/order":1,"custodian/ocoOrder":1,"cl/transfer":1},delete:{"custodian/cancelOrder":1,"custodian/cancelOrdersBySymbol":1,"custodian/cancelOcoOrder":1}},sapiV2:{get:{"cl/account":10,"cl/alertHistory":1}},sapiV3:{get:{accountStatus:1,apiTradingStatus:1,"sub-account/list":1,"sub-account/transfer/history":1,"sub-account/assets":1},post:{"sub-account/transfer":1}}},features:{swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}}
class a extends s.A{describe(){return this.deepExtend(super.describe(),{id:"binanceusdm",name:"Binance USDⓈ-M",urls:{logo:"https://github.com/user-attachments/assets/871cbea7-eebb-4b28-b260-c1c91df0487a",doc:["https://binance-docs.github.io/apidocs/futures/en/","https://binance-docs.github.io/apidocs/spot/en","https://developers.binance.com/en"]},has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!0,option:void 0,createStopMarketOrder:!0},options:{fetchMarkets:["linear"],defaultSubType:"linear",leverageBrackets:void 0,marginTypes:{},marginModes:{}},exceptions:{exact:{"-5021":r.InvalidOrder,"-5022":r.InvalidOrder,"-5028":r.InvalidOrder}}})}async transferIn(e,t,i={}){return await this.futuresTransfer(e,t,1,i)}async transferOut(e,t,i={}){return await this.futuresTransfer(e,t,2,i)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bingx",name:"BingX",countries:["US"],rateLimit:100,version:"v1",certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,addMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!0,closePosition:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createStopLossOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingAmountOrder:!0,createTrailingPercentOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchLeverage:!0,fetchLiquidations:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMarkPrice:!0,fetchMarkPrices:!0,fetchMyLiquidations:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!0,fetchPositions:!0,fetchPositionsHistory:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTransfers:!0,fetchWithdrawals:!0,reduceMargin:!0,sandbox:!0,setLeverage:!0,setMargin:!0,setMarginMode:!0,setPositionMode:!0,transfer:!0},hostname:"bingx.com",urls:{logo:"https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/253675376-6983b72e-4999-4549-b177-33b374c195e3.jpg",api:{spot:"https://open-api.{hostname}/openApi",swap:"https://open-api.{hostname}/openApi",contract:"https://open-api.{hostname}/openApi",wallets:"https://open-api.{hostname}/openApi",user:"https://open-api.{hostname}/openApi",subAccount:"https://open-api.{hostname}/openApi",account:"https://open-api.{hostname}/openApi",copyTrading:"https://open-api.{hostname}/openApi",cswap:"https://open-api.{hostname}/openApi"},test:{swap:"https://open-api-vst.{hostname}/openApi"},www:"https://bingx.com/",doc:"https://bingx-api.github.io/docs/",referral:"https://bingx.com/invite/OHETOM"},fees:{tierBased:!0,spot:{feeSide:"get",maker:this.parseNumber("0.001"),taker:this.parseNumber("0.001")},swap:{feeSide:"quote",maker:this.parseNumber("0.0002"),taker:this.parseNumber("0.0005")}},requiredCredentials:{apiKey:!0,secret:!0},api:{spot:{v1:{public:{get:{"server/time":1,"common/symbols":1,"market/trades":1,"market/depth":1,"market/kline":1,"ticker/24hr":1,"ticker/price":1,"ticker/bookTicker":1}},private:{get:{"trade/query":1,"trade/openOrders":1,"trade/historyOrders":1,"trade/myTrades":2,"user/commissionRate":5,"account/balance":2},post:{"trade/order":2,"trade/cancel":2,"trade/batchOrders":5,"trade/order/cancelReplace":5,"trade/cancelOrders":5,"trade/cancelOpenOrders":5,"trade/cancelAllAfter":5}}},v2:{public:{get:{"market/depth":1,"market/kline":1}}},v3:{private:{get:{"get/asset/transfer":1,"asset/transfer":1,"capital/deposit/hisrec":1,"capital/withdraw/history":1},post:{"post/asset/transfer":5}}}},swap:{v1:{public:{get:{"ticker/price":1,"market/historicalTrades":1,"market/markPriceKlines":1,"trade/multiAssetsRules":1}},private:{get:{"positionSide/dual":5,"trade/batchCancelReplace":5,"trade/fullOrder":2,maintMarginRatio:2,"trade/positionHistory":2,"positionMargin/history":2,"twap/openOrders":5,"twap/historyOrders":5,"twap/orderDetail":5,"trade/assetMode":5,"user/marginAssets":5},post:{"trade/cancelReplace":2,"positionSide/dual":5,"trade/batchCancelReplace":5,"trade/closePosition":2,"trade/getVst":5,"twap/order":5,"twap/cancelOrder":5,"trade/assetMode":5}}},v2:{public:{get:{"server/time":1,"quote/contracts":1,"quote/price":1,"quote/depth":1,"quote/trades":1,"quote/premiumIndex":1,"quote/fundingRate":1,"quote/klines":1,"quote/openInterest":1,"quote/ticker":1,"quote/bookTicker":1}},private:{get:{"user/balance":2,"user/positions":2,"user/income":2,"trade/openOrders":2,"trade/openOrder":2,"trade/order":2,"trade/marginType":5,"trade/leverage":2,"trade/forceOrders":1,"trade/allOrders":2,"trade/allFillOrders":2,"trade/fillHistory":2,"user/income/export":2,"user/commissionRate":2,"quote/bookTicker":1},post:{"trade/order":2,"trade/batchOrders":2,"trade/closeAllPositions":2,"trade/cancelAllAfter":5,"trade/marginType":5,"trade/leverage":5,"trade/positionMargin":5,"trade/order/test":2},delete:{"trade/order":2,"trade/batchOrders":2,"trade/allOpenOrders":2}}},v3:{public:{get:{"quote/klines":1}}}},cswap:{v1:{public:{get:{"market/contracts":1,"market/premiumIndex":1,"market/openInterest":1,"market/klines":1,"market/depth":1,"market/ticker":1}},private:{get:{"trade/leverage":2,"trade/forceOrders":2,"trade/allFillOrders":2,"trade/openOrders":2,"trade/orderDetail":2,"trade/orderHistory":2,"trade/marginType":2,"user/commissionRate":2,"user/positions":2,"user/balance":2},post:{"trade/order":2,"trade/leverage":2,"trade/allOpenOrders":2,"trade/closeAllPositions":2,"trade/marginType":2,"trade/positionMargin":2},delete:{"trade/allOpenOrders":2,"trade/cancelOrder":2}}}},contract:{v1:{private:{get:{allPosition:2,allOrders:2,balance:2}}}},wallets:{v1:{private:{get:{"capital/config/getall":5,"capital/deposit/address":5,"capital/innerTransfer/records":1,"capital/subAccount/deposit/address":5,"capital/deposit/subHisrec":2,"capital/subAccount/innerTransfer/records":1,"capital/deposit/riskRecords":5},post:{"capital/withdraw/apply":5,"capital/innerTransfer/apply":5,"capital/subAccountInnerTransfer/apply":2,"capital/deposit/createSubAddress":2}}}},subAccount:{v1:{private:{get:{list:10,assets:2,allAccountBalance:2},post:{create:10,"apiKey/create":2,"apiKey/edit":2,"apiKey/del":2,updateStatus:10}}}},account:{v1:{private:{get:{uid:1,"apiKey/query":2,"account/apiPermissions":5},post:{"innerTransfer/authorizeSubAccount":1}}},transfer:{v1:{private:{get:{"subAccount/asset/transferHistory":1},post:{"subAccount/transferAsset/supportCoins":1,"subAccount/transferAsset":1}}}}},user:{auth:{private:{post:{userDataStream:2},put:{userDataStream:2},delete:{userDataStream:2}}}},copyTrading:{v1:{private:{get:{"swap/trace/currentTrack":2},post:{"swap/trace/closeTrackOrder":2,"swap/trace/setTPSL":2,"spot/trader/sellOrder":10}}}},api:{v3:{private:{get:{"asset/transfer":1,"capital/deposit/hisrec":1,"capital/withdraw/history":1},post:{"post/asset/transfer":1}}}}},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"},precisionMode:n.kb,exceptions:{exact:{400:r.BadRequest,401:r.AuthenticationError,403:r.PermissionDenied,404:r.BadRequest,429:r.DDoSProtection,418:r.PermissionDenied,500:r.ExchangeError,504:r.ExchangeError,100001:r.AuthenticationError,100412:r.AuthenticationError,100202:r.InsufficientFunds,100204:r.BadRequest,100400:r.BadRequest,100410:r.OperationFailed,100421:r.BadSymbol,100440:r.ExchangeError,100500:r.OperationFailed,100503:r.ExchangeError,80001:r.BadRequest,80012:r.InsufficientFunds,80014:r.BadRequest,80016:r.OrderNotFound,80017:r.OrderNotFound,100414:r.AccountSuspended,100419:r.PermissionDenied,100437:r.BadRequest,101204:r.InsufficientFunds,110425:r.InvalidOrder},broad:{}},commonCurrencies:{SNOW:"Snowman",OMNI:"OmniCat",NAP:"$NAP",TRUMP:"TRUMPMAGA",TRUMPSOL:"TRUMP"},options:{defaultType:"spot",accountsByType:{spot:"FUND",swap:"PFUTURES",future:"SFUTURES"},accountsById:{FUND:"spot",PFUTURES:"swap",SFUTURES:"future"},recvWindow:5e3,broker:"CCXT",defaultNetworks:{ETH:"ETH",USDT:"ERC20",USDC:"ERC20",BTC:"BTC",LTC:"LTC"},networks:{ARB:"ARBITRUM",MATIC:"POLYGON"}},features:{defaultForLinear:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!0},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,trailing:!0,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0,selfTradePrevention:!1,iceberg:!1},createOrders:{max:5},fetchMyTrades:{marginMode:!1,limit:512,daysBack:30,untilDays:30,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:1e3,daysBack:2e4,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1440}},defaultForInverse:{extends:"defaultForLinear",fetchMyTrades:{limit:1e3,daysBack:void 0,untilDays:void 0},fetchOrders:void 0},spot:{extends:"defaultForLinear",createOrder:{triggerPriceType:void 0,attachedStopLossTakeProfit:void 0,trailing:!1},fetchMyTrades:{limit:1e3,daysBack:1,untilDays:1},fetchOrders:void 0,fetchClosedOrders:{limit:100,untilDays:void 0}},swap:{linear:{extends:"defaultForLinear"},inverse:{extends:"defaultForInverse"}},defaultForFuture:{extends:"defaultForLinear",fetchOrders:void 0},future:{linear:{extends:"defaultForFuture"},inverse:{extends:"defaultForFuture"}}}})}async fetchTime(e={}){const t=await this.swapV2PublicGetServerTime(e),i=this.safeDict(t,"data");return this.safeInteger(i,"serverTime")}async fetchCurrencies(e={}){if(!this.checkRequiredCredentials(!1))return;if(this.safeBool(this.options,"sandboxMode",!1))return;const t=await this.walletsV1PrivateGetCapitalConfigGetall(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"coin"),a=this.safeCurrencyCode(r),o=this.safeString(t,"name"),n=this.safeList(t,"networkList"),d={};let h,c=!1,l=!1,u={};for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"network"),s=this.networkIdToCode(i),r=this.safeBool(t,"isDefault"),a=this.safeBool(t,"depositEnable");a&&(c=!0);const o=this.safeBool(t,"withdrawEnable");o&&(l=!0);const f={withdraw:{min:this.safeNumber(t,"withdrawMin"),max:this.safeNumber(t,"withdrawMax")}};h=this.safeNumber(t,"withdrawFee"),r&&(u=f);const p=this.safeNumber(t,"withdrawPrecision"),m=a||o;d[s]={info:t,id:i,network:s,fee:h,active:m,deposit:a,withdraw:o,precision:p,limits:f}}const f=c||l;s[a]={info:t,code:a,id:r,precision:void 0,name:o,active:f,deposit:c,withdraw:l,networks:d,fee:h,limits:u}}return s}async fetchSpotMarkets(e){const t=await this.spotV1PublicGetCommonSymbols(e),i=this.safeDict(t,"data"),s=this.safeList(i,"symbols",[]);return this.parseMarkets(s)}async fetchSwapMarkets(e){const t=await this.swapV2PublicGetQuoteContracts(e),i=this.safeList(t,"data",[]);return this.parseMarkets(i)}async fetchInverseSwapMarkets(e){const t=await this.cswapV1PublicGetMarketContracts(e),i=this.safeList(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=t.split("-"),s=i[0],r=i[1],a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r);let n=this.safeString(e,"currency"),d=!1,h=!0;const c=this.safeNumber(e,"minTickSize");void 0!==c&&(n=s,d=!0,h=!1);const l=this.safeCurrencyCode(n);let u=this.safeNumber(e,"tickSize");void 0===u&&(u=this.parseNumber(this.parsePrecision(this.safeString(e,"pricePrecision"))));let f=this.safeNumber(e,"stepSize");void 0===f&&(f=this.parseNumber(this.parsePrecision(this.safeString(e,"quantityPrecision"))));const p=void 0!==l?"swap":"spot",m="spot"===p,g="swap"===p;let v=a+"/"+o;void 0!==l&&(v+=":"+l);const y=this.safeDict(this.fees,p,{}),w=g?this.parseNumber("1"):void 0;let b=!1;("true"===this.safeString(e,"apiStateOpen")&&"true"===this.safeString(e,"apiStateClose")||this.safeBool(e,"apiStateSell")&&this.safeBool(e,"apiStateBuy")&&"1"===this.safeString(e,"status"))&&(b=!0);const k=m?void 0:d,S=m?void 0:h;let O;m||(O=this.safeNumber2(e,"minQty","tradeMinQuantity"));let T=this.safeInteger(e,"timeOnline");return 0===T&&(T=void 0),this.safeMarketStructure({id:t,symbol:v,base:a,quote:o,settle:l,baseId:s,quoteId:r,settleId:n,type:p,spot:m,margin:!1,swap:g,future:!1,option:!1,active:b,contract:g,linear:S,inverse:k,taker:this.safeNumber(y,"taker"),maker:this.safeNumber(y,"maker"),feeSide:this.safeString(y,"feeSide"),contractSize:w,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:f,price:u},limits:{leverage:{min:void 0,max:void 0},amount:{min:O,max:void 0},price:{min:c,max:void 0},cost:{min:this.safeNumberN(e,["minNotional","tradeMinUSDT","minTradeValue"]),max:this.safeNumber(e,"maxNotional")}},created:T,info:e})}async fetchMarkets(e={}){const t=[this.fetchSwapMarkets(e)];this.safeBool(this.options,"sandboxMode",!1)||(t.push(this.fetchInverseSwapMarkets(e)),t.push(this.fetchSpotMarkets(e)));const i=await Promise.all(t),s=this.safeList(i,0,[]),r=this.safeList(i,1,[]),a=this.safeList(i,2,[]),o=this.arrayConcat(s,r);return this.arrayConcat(a,o)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1440);const o=this.market(e),n={symbol:o.id};n.interval=this.safeString(this.timeframes,t,t),void 0!==i&&(n.startTime=Math.max(i-1,0)),void 0!==s&&(n.limit=s);const d=this.safeInteger2(r,"until","endTime");let h;if(void 0!==d&&(r=this.omit(r,["until"]),n.endTime=d),o.spot)h=await this.spotV1PublicGetMarketKline(this.extend(n,r));else if(o.inverse)h=await this.cswapV1PublicGetMarketKlines(this.extend(n,r));else{const e=this.safeString(r,"price");r=this.omit(r,"price"),h="mark"===e?await this.swapV1PublicGetMarketMarkPriceKlines(this.extend(n,r)):await this.swapV3PublicGetQuoteKlines(this.extend(n,r))}let c=this.safeValue(h,"data",[]);return Array.isArray(c)||(c=[c]),this.parseOHLCVs(c,o,t,i,s)}parseOHLCV(e,t=void 0){return Array.isArray(e)?[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]:[this.safeInteger2(e,"time","closeTime"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};let o,n;void 0!==i&&(a.limit=Math.min(i,100)),[n,s]=this.handleMarketTypeAndParams("fetchTrades",r,s),o="spot"===n?await this.spotV1PublicGetMarketTrades(this.extend(a,s)):await this.swapV2PublicGetQuoteTrades(this.extend(a,s));const d=this.safeList(o,"data",[]);return this.parseTrades(d,r,t,i)}parseTrade(e,t=void 0){let i=this.safeIntegerN(e,["time","filledTm","T","tradeTime"]);const s=this.safeString(e,"filledTm");void 0!==s&&(i=this.parse8601(s)),0===i&&(i=void 0);const r=this.safeString(e,"quoteQty"),o=this.safeStringN(e,["currency","N","commissionAsset"]),n=this.safeCurrencyCode(o),d=this.safeBool(e,"m"),h=this.safeString2(e,"s","symbol"),c=this.safeBoolN(e,["buyerMaker","isBuyerMaker","maker"]);let l;void 0===c&&void 0===d||(l=c||d?"maker":"taker");let u=this.safeStringLower2(e,"side","S");void 0===u&&(void 0===c&&void 0===d||(u=c||d?"sell":"buy",l="taker"));const f=this.safeBool(e,"isBuyer");void 0!==f&&(u=f?"buy":"sell");const p=this.safeBool(e,"isMaker");void 0!==p&&(l=p?"maker":"taker");let m=this.safeStringN(e,["qty","amount","q"]);if(void 0!==t&&t.swap&&"volume"in e){const i=this.safeString(t.info,"tradeMinQuantity"),s=this.safeString(e,"volume");m=a.Y.stringMul(s,i)}return this.safeTrade({id:this.safeStringN(e,["id","t"]),info:e,timestamp:i,datetime:this.iso8601(i),symbol:this.safeSymbol(h,t,"-"),order:this.safeString2(e,"orderId","i"),type:this.safeStringLower(e,"o"),side:this.parseOrderSide(u),takerOrMaker:l,price:this.safeStringN(e,["price","p","tradePrice"]),amount:m,cost:r,fee:{cost:this.parseNumber(a.Y.stringAbs(this.safeString2(e,"commission","n"))),currency:n}},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let a,o;void 0!==t&&(r.limit=t),[o,i]=this.handleMarketTypeAndParams("fetchOrderBook",s,i),a="spot"===o?await this.spotV1PublicGetMarketDepth(this.extend(r,i)):s.inverse?await this.cswapV1PublicGetMarketDepth(this.extend(r,i)):await this.swapV2PublicGetQuoteDepth(this.extend(r,i));const n=this.safeDict(a,"data",{}),d=this.safeInteger2(n,"T","ts");return this.parseOrderBook(n,s.symbol,d,"bids","asks",0,1)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.inverse?await this.cswapV1PublicGetMarketPremiumIndex(this.extend(s,t)):await this.swapV2PublicGetQuotePremiumIndex(this.extend(s,t));const a=this.safeList(r,"data",[]);return this.parseFundingRate(a,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,"swap",!0);const i=await this.swapV2PublicGetQuotePremiumIndex(this.extend(t)),s=this.safeList(i,"data",[]);return this.parseFundingRates(s,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"nextFundingTime");return{info:e,symbol:this.safeSymbol(i,t,"-","swap"),markPrice:this.safeNumber(e,"markPrice"),indexPrice:this.safeNumber(e,"indexPrice"),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"lastFundingRate"),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:s,nextFundingDatetime:this.iso8601(s),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s);const o=this.market(e),n={symbol:o.id};void 0!==t&&(n.startTime=t),void 0!==i&&(n.limit=i);const d=this.safeInteger2(s,"until","startTime");void 0!==d&&(s=this.omit(s,["until"]),n.startTime=d);const h=await this.swapV2PublicGetQuoteFundingRate(this.extend(n,s)),c=this.safeList(h,"data",[]);return this.parseFundingRateHistories(c,o,t,i)}parseFundingRateHistory(e,t=void 0){const i=this.safeInteger(e,"fundingTime");return{info:e,symbol:this.safeSymbol(this.safeString(e,"symbol"),t,"-","swap"),fundingRate:this.safeNumber(e,"fundingRate"),timestamp:i,datetime:this.iso8601(i)}}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.inverse?await this.cswapV1PublicGetMarketOpenInterest(this.extend(s,t)):await this.swapV2PublicGetQuoteOpenInterest(this.extend(s,t));let a={};if(i.inverse){const e=this.safeList(r,"data",[]);a=this.safeDict(e,0,{})}else a=this.safeDict(r,"data",{});return this.parseOpenInterest(a,i)}parseOpenInterest(e,t=void 0){const i=this.safeInteger2(e,"time","timestamp"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t,"-","swap"),a=this.safeNumber(e,"openInterest");return this.safeOpenInterest({symbol:r,baseVolume:void 0,quoteVolume:void 0,openInterestAmount:void 0,openInterestValue:a,timestamp:i,datetime:this.iso8601(i),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.spot?await this.spotV1PublicGetTicker24hr(this.extend(s,t)):i.inverse?await this.cswapV1PublicGetMarketTicker(this.extend(s,t)):await this.swapV2PublicGetQuoteTicker(this.extend(s,t));const a=this.safeList(r,"data");if(void 0!==a){const e=this.safeDict(a,0,{});return this.parseTicker(e,i)}const o=this.safeDict(r,"data",{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){let i,s,r,a;if(await this.loadMarkets(),void 0!==e){e=this.marketSymbols(e);const t=this.safeString(e,0);void 0!==t&&(i=this.market(t))}[s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),[r,t]=this.handleSubTypeAndParams("fetchTickers",i,t),a="spot"===s?await this.spotV1PublicGetTicker24hr(t):"inverse"===r?await this.cswapV1PublicGetMarketTicker(t):await this.swapV2PublicGetQuoteTicker(t);const o=this.safeList(a,"data");return this.parseTickers(o,e)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e);let s;[s,t]=this.handleSubTypeAndParams("fetchMarkPrice",i,t,"linear");const r={symbol:i.id};let a;return a="inverse"===s?await this.cswapV1PublicGetMarketPremiumIndex(this.extend(r,t)):await this.swapV2PublicGetQuotePremiumIndex(this.extend(r,t)),Array.isArray(a.data)?this.parseTicker(this.safeDict(a.data,0,{}),i):this.parseTicker(a.data,i)}async fetchMarkPrices(e=void 0,t={}){let i,s,r;if(await this.loadMarkets(),void 0!==e){e=this.marketSymbols(e);const t=this.safeString(e,0);void 0!==t&&(i=this.market(t))}[s,t]=this.handleSubTypeAndParams("fetchMarkPrices",i,t,"linear"),r="inverse"===s?await this.cswapV1PublicGetMarketPremiumIndex(t):await this.swapV2PublicGetQuotePremiumIndex(t);const a=this.safeList(r,"data");return this.parseTickers(a,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=void 0===this.safeString(e,"lastQty")?"spot":"swap",r=(t=this.safeMarket(i,t,void 0,s)).symbol,a=this.safeString(e,"openPrice"),o=this.safeString(e,"highPrice"),n=this.safeString(e,"lowPrice"),d=this.safeString(e,"lastPrice"),h=this.safeString(e,"quoteVolume"),c=this.safeString(e,"volume");let l=this.safeString(e,"priceChangePercent");void 0!==l&&(l=l.replace("%",""));const u=this.safeString(e,"priceChange");let f=this.safeInteger(e,"closeTime");0===f&&(f=void 0);const p=this.iso8601(f),m=this.safeString(e,"bidPrice"),g=this.safeString(e,"bidQty"),v=this.safeString(e,"askPrice"),y=this.safeString(e,"askQty");return this.safeTicker({symbol:r,timestamp:f,datetime:p,high:o,low:n,bid:m,bidVolume:g,ask:v,askVolume:y,vwap:void 0,open:a,close:d,last:void 0,previousClose:void 0,change:u,percentage:l,average:void 0,baseVolume:c,quoteVolume:h,markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchBalance(e={}){let t,i,s;await this.loadMarkets(),[i,e]=this.handleOptionAndParams(e,"fetchBalance","standard",!1),[s,e]=this.handleSubTypeAndParams("fetchBalance",void 0,e);const[r,a]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);return t=i?await this.contractV1PrivateGetBalance(a):"spot"===r?await this.spotV1PrivateGetAccountBalance(a):"inverse"===s?await this.cswapV1PrivateGetUserBalance(a):await this.swapV2PrivateGetUserBalance(a),this.parseBalance(t)}parseBalance(e){const t={info:e},i=this.safeList(e,"data"),s=void 0!==this.safeDict(i,0),r=this.safeDict(e,"data",{}),a=this.safeList(r,"balances"),o=void 0!==this.safeDict(a,0);if(s)for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString2(s,"availableMargin","availableBalance"),o.used=this.safeString(s,"usedMargin"),o.total=this.safeString(s,"maxWithdrawAmount"),t[a]=o}else if(o)for(let e=0;e<a.length;e++){const i=a[e],s=this.safeString(i,"asset"),r=this.safeCurrencyCode(s),o=this.account();o.free=this.safeString(i,"free"),o.used=this.safeString(i,"locked"),t[r]=o}else{const i=this.safeDict(e,"data",{}),s=this.safeDict(i,"balance");if(s){const e=this.safeString(s,"asset"),i=this.safeCurrencyCode(e),r=this.account();r.free=this.safeString(s,"availableMargin"),r.used=this.safeString(s,"usedMargin"),t[i]=r}}return this.safeBalance(t)}async fetchPositionHistory(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e);let o,n={symbol:a.id};if(void 0!==i&&(n.pageSize=i),void 0!==t&&(n.startTs=t),[n,s]=this.handleUntilOption("endTs",n,s),!a.linear)throw new r.NotSupported(this.id+" fetchPositionHistory() is not supported for inverse swap positions");o=await this.swapV1PrivateGetTradePositionHistory(this.extend(n,s));const d=this.safeDict(o,"data",{}),h=this.safeList(d,"positionHistory",[]),c=this.parsePositions(h);return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchPositions(e=void 0,t={}){let i,s;if(await this.loadMarkets(),e=this.marketSymbols(e),[i,t]=this.handleOptionAndParams(t,"fetchPositions","standard",!1),i)s=await this.contractV1PrivateGetAllPosition(t);else{let i,r;if(void 0!==e){e=this.marketSymbols(e);const t=this.safeString(e,0);void 0!==t&&(i=this.market(t))}[r,t]=this.handleSubTypeAndParams("fetchPositions",i,t),s="inverse"===r?await this.cswapV1PrivateGetUserPositions(t):await this.swapV2PrivateGetUserPositions(t)}const r=this.safeList(s,"data",[]);return this.parsePositions(r,e)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadRequest(this.id+" fetchPosition() supports swap markets only");const s={symbol:i.id};let a;a=i.inverse?await this.cswapV1PrivateGetUserPositions(this.extend(s,t)):await this.swapV2PrivateGetUserPositions(this.extend(s,t));const o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parsePosition(n,i)}parsePosition(e,t=void 0){let i=this.safeString(e,"symbol","");i=i.replace("/","-");const s=this.safeBool(e,"isolated");let r;void 0!==s&&(r=s?"isolated":"cross");const a=this.safeInteger(e,"openTime");return this.safePosition({info:e,id:this.safeString(e,"positionId"),symbol:this.safeSymbol(i,t,"-","swap"),notional:this.safeNumber(e,"positionValue"),marginMode:r,liquidationPrice:void 0,entryPrice:this.safeNumber2(e,"avgPrice","entryPrice"),unrealizedPnl:this.safeNumber(e,"unrealizedProfit"),realizedPnl:this.safeNumber(e,"realisedProfit"),percentage:void 0,contracts:this.safeNumber(e,"positionAmt"),contractSize:void 0,markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,side:this.safeStringLower(e,"positionSide"),hedged:void 0,timestamp:a,datetime:this.iso8601(a),lastUpdateTimestamp:this.safeInteger(e,"updateTime"),maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:void 0,initialMargin:this.safeNumber(e,"initialMargin"),initialMarginPercentage:void 0,leverage:this.safeNumber(e,"leverage"),marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async createMarketOrderWithCost(e,t,i,s={}){return s.quoteOrderQty=i,await this.createOrder(e,"market",t,i,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){return i.quoteOrderQty=t,await this.createOrder(e,"market","buy",t,void 0,i)}async createMarketSellOrderWithCost(e,t,i={}){return i.quoteOrderQty=t,await this.createOrder(e,"market","sell",t,void 0,i)}createOrderRequest(e,t,i,s,o=void 0,n={}){const d=this.market(e);let h,c;[c,n]=this.handleMarketTypeAndParams("createOrder",d,n),t=t.toUpperCase();const l={symbol:d.id,type:t,side:i.toUpperCase()},u="MARKET"===t,f="spot"===c,p="TWAP"===t;if(p&&f)throw new r.BadSymbol(this.id+" createOrder() twap order supports swap contracts only");const m=this.safeString(n,"stopLossPrice"),g=this.safeString(n,"takeProfitPrice"),v=this.safeString2(n,"stopPrice","triggerPrice"),y=void 0!==v,w=void 0!==m,b=void 0!==g,k=f?"newClientOrderId":"clientOrderID",S=this.safeString2(n,k,"clientOrderId");void 0!==S&&(l[k]=S);const O=this.safeStringUpper(n,"timeInForce");if([h,n]=this.handlePostOnly(u,"PostOnly"===O,n),h||"PostOnly"===O?l.timeInForce="PostOnly":"IOC"===O?l.timeInForce="IOC":"GTC"===O&&(l.timeInForce="GTC"),f){const i=this.safeString2(n,"cost","quoteOrderQty");if(n=this.omit(n,"cost"),void 0!==i)l.quoteOrderQty=this.parseToNumeric(this.costToPrecision(e,i));else if(u&&void 0!==o){const e=a.Y.stringMul(this.numberToString(s),this.numberToString(o));l.quoteOrderQty=this.parseToNumeric(e)}else l.quantity=this.parseToNumeric(this.amountToPrecision(e,s));if(u||(l.price=this.parseToNumeric(this.priceToPrecision(e,o))),void 0!==v){if(u&&void 0===this.safeString(l,"quoteOrderQty"))throw new r.ArgumentsRequired(this.id+" createOrder() requires the cost parameter (or the amount + price) for placing spot market-buy trigger orders");l.stopPrice=this.priceToPrecision(e,v),"LIMIT"===t?l.type="TRIGGER_LIMIT":"MARKET"===t&&(l.type="TRIGGER_MARKET")}else if(void 0!==m||void 0!==g){const i=void 0!==m?m:g;"LIMIT"===t?l.type="TAKE_STOP_LIMIT":"MARKET"===t&&(l.type="TAKE_STOP_MARKET"),l.stopPrice=this.parseToNumeric(this.priceToPrecision(e,i))}}else{if(p){const t={symbol:l.symbol,side:l.side,positionSide:"buy"===i?"LONG":"SHORT",triggerPrice:this.parseToNumeric(this.priceToPrecision(e,v)),totalAmount:this.parseToNumeric(this.amountToPrecision(e,s))};return this.extend(t,n)}"FOK"===O&&(l.timeInForce="FOK");const r=this.safeString(n,"trailingAmount"),h=this.safeString2(n,"trailingPercent","priceRate"),c=this.safeString(n,"trailingType","TRAILING_STOP_MARKET"),f=void 0!==r,k=void 0!==h,S=f||k,T=this.safeValue(n,"stopLoss"),P=this.safeValue(n,"takeProfit"),I=void 0!==T,M=void 0!==P;"LIMIT"!==t&&"TRIGGER_LIMIT"!==t&&"STOP"!==t&&"TAKE_PROFIT"!==t||S||(l.price=this.parseToNumeric(this.priceToPrecision(e,o)));let x,A=this.safeBool(n,"reduceOnly",!1);if(y)l.stopPrice=this.parseToNumeric(this.priceToPrecision(e,v)),u||"TRIGGER_MARKET"===t?l.type="TRIGGER_MARKET":"LIMIT"!==t&&"TRIGGER_LIMIT"!==t||(l.type="TRIGGER_LIMIT");else if(w||b)A=!0,w?(l.stopPrice=this.parseToNumeric(this.priceToPrecision(e,m)),u||"STOP_MARKET"===t?l.type="STOP_MARKET":"LIMIT"!==t&&"STOP"!==t||(l.type="STOP")):b&&(l.stopPrice=this.parseToNumeric(this.priceToPrecision(e,g)),u||"TAKE_PROFIT_MARKET"===t?l.type="TAKE_PROFIT_MARKET":"LIMIT"!==t&&"TAKE_PROFIT"!==t||(l.type="TAKE_PROFIT"));else if(S)if(l.type=c,f)l.price=this.parseToNumeric(r);else if(k){const e=a.Y.stringDiv(h,"100");l.priceRate=this.parseToNumeric(e)}if(I||M){const t=this.numberToString(s);if(I){const i=this.safeString2(T,"triggerPrice","stopPrice",T),s=this.safeString(T,"workingType","MARK_PRICE"),r=this.safeString(T,"type","STOP_MARKET"),a={stopPrice:this.parseToNumeric(this.priceToPrecision(e,i)),workingType:s,type:r},o=this.safeString(T,"price");void 0!==o&&(a.price=this.parseToNumeric(this.priceToPrecision(e,o)));const n=this.safeString(T,"quantity",t);a.quantity=this.parseToNumeric(this.amountToPrecision(e,n)),l.stopLoss=this.json(a)}if(M){const i=this.safeString2(P,"triggerPrice","stopPrice",P),s=this.safeString(P,"workingType","MARK_PRICE"),r=this.safeString(P,"type","TAKE_PROFIT_MARKET"),a={stopPrice:this.parseToNumeric(this.priceToPrecision(e,i)),workingType:s,type:r},o=this.safeString(P,"price");void 0!==o&&(a.price=this.parseToNumeric(this.priceToPrecision(e,o)));const n=this.safeString(P,"quantity",t);a.quantity=this.parseToNumeric(this.amountToPrecision(e,n)),l.takeProfit=this.json(a)}}this.safeBool(n,"hedged",!1)?(n=this.omit(n,"reduceOnly"),x=A?"buy"===i?"SHORT":"LONG":"buy"===i?"LONG":"SHORT"):x="BOTH",l.positionSide=x;let C=s;d.inverse||(C=this.parseToNumeric(this.amountToPrecision(e,s))),l.quantity=C}return n=this.omit(n,["hedged","triggerPrice","stopLossPrice","takeProfitPrice","trailingAmount","trailingPercent","trailingType","takeProfit","stopLoss","clientOrderId"]),this.extend(l,n)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"test",!1);a=this.omit(a,"test");const d=this.createOrderRequest(e,t,i,s,r,a);let h;h=o.swap?n?await this.swapV2PrivatePostTradeOrderTest(d):o.inverse?await this.cswapV1PrivatePostTradeOrder(d):"twap"===t?await this.swapV1PrivatePostTwapOrder(d):await this.swapV2PrivatePostTradeOrder(d):await this.spotV1PrivatePostTradeOrder(d),"string"==typeof h&&(h=this.fixStringifiedJsonMembers(h),h=this.parseJson(h));const c=this.safeDict(h,"data",{});let l={};return l=o.swap?o.inverse?h:this.safeDict(c,"order",c):c,this.parseOrder(l,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[],s=[];for(let t=0;t<e.length;t++){const r=e[t],a=this.safeString(r,"symbol"),o=this.safeString(r,"type");s.push(a);const n=this.safeString(r,"side"),d=this.safeNumber(r,"amount"),h=this.safeNumber(r,"price"),c=this.safeDict(r,"params",{}),l=this.createOrderRequest(a,o,n,d,h,c);i.push(l)}const a=this.marketSymbols(s,void 0,!1,!0,!0),o=a.length,n=this.market(a[0]),d={};let h;if(n.swap){if(o>5)throw new r.InvalidOrder(this.id+" createOrders() can not create more than 5 orders at once for swap markets");d.batchOrders=this.json(i),h=await this.swapV2PrivatePostTradeBatchOrders(d)}else{this.safeBool(t,"sync",!1)&&(d.sync=!0),d.data=this.json(i),h=await this.spotV1PrivatePostTradeBatchOrders(d)}"string"==typeof h&&(h=this.fixStringifiedJsonMembers(h),h=this.parseJson(h));const c=this.safeDict(h,"data",{}),l=this.safeList(c,"orders",[]);return this.parseOrders(l,n)}parseOrderSide(e){return this.safeString({BUY:"buy",SELL:"sell",SHORT:"sell",LONG:"buy",ask:"sell",bid:"buy"},e,e)}parseOrderType(e){return this.safeString({trigger_market:"market",trigger_limit:"limit",stop_limit:"limit",stop_market:"market",take_profit_market:"market",stop:"limit"},e,e)}parseOrder(e,t=void 0){const i=e,s=this.safeDict2(e,"newOrderResponse","orderOpenResponse");void 0!==s&&(e=s);const r=void 0===this.safeString2(e,"positionSide","ps")?"spot":"swap",o=this.safeString2(e,"symbol","s");void 0===t&&(t=this.safeMarket(o,void 0,void 0,r));const n=this.safeStringLower2(e,"side","S"),d=this.safeIntegerN(e,["time","transactTime","E","createdTime"]),h=this.safeInteger2(e,"updateTime","T"),c=this.safeStringUpperN(e,["status","X","orderStatus"]);let l=this.safeString2(e,"feeAsset","N");const u=this.safeStringN(e,["fee","commission","n"]);void 0===l&&(l=t.spot&&"buy"===n?t.base:t.quote);let f,p=this.safeValue(e,"stopLoss");void 0!==p&&""!==p&&(f=this.omitZero(this.safeString(p,"stopLoss"))),void 0!==p&&"number"!=typeof p&&""!==p&&("string"==typeof p&&(p=this.parseJson(p)),f=this.omitZero(this.safeString(p,"stopPrice")));let m,g=this.safeValue(e,"takeProfit");void 0!==g&&""!==g&&(m=this.omitZero(this.safeString(g,"takeProfit"))),void 0!==g&&"number"!=typeof g&&""!==g&&("string"==typeof g&&(g=this.parseJson(g)),m=this.omitZero(this.safeString(g,"stopPrice")));const v=this.safeStringLower2(e,"type","o"),y=this.omitZero(this.safeString2(e,"StopPrice","stopPrice"));let w=y;return void 0!==y&&(v.indexOf("stop")>-1&&void 0===f&&(f=y,w=void 0),v.indexOf("take")>-1&&void 0===m&&(m=y,w=void 0)),this.safeOrder({info:i,id:this.safeStringN(e,["orderId","i","mainOrderId"]),clientOrderId:this.safeStringN(e,["clientOrderID","clientOrderId","origClientOrderId","c"]),symbol:this.safeSymbol(o,t,"-",r),timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:h,lastUpdateTimestamp:this.safeInteger(e,"updateTime"),type:this.parseOrderType(v),timeInForce:this.safeString(e,"timeInForce"),postOnly:void 0,side:this.parseOrderSide(n),price:this.safeString2(e,"price","p"),triggerPrice:w,stopLossPrice:f,takeProfitPrice:m,average:this.safeString2(e,"avgPrice","ap"),cost:this.safeString(e,"cummulativeQuoteQty"),amount:this.safeStringN(e,["origQty","q","quantity","totalAmount"]),filled:this.safeString2(e,"executedQty","z"),remaining:void 0,status:this.parseOrderStatus(c),fee:{currency:l,cost:a.Y.stringAbs(u)},trades:void 0,reduceOnly:this.safeBool2(e,"reduceOnly","ro")},t)}parseOrderStatus(e){return this.safeString({NEW:"open",PENDING:"open",PARTIALLY_FILLED:"open",RUNNING:"open",FILLED:"closed",CANCELED:"canceled",CANCELLED:"canceled",FAILED:"canceled"},e,e)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeBool(i,"twap",!1);let a,o;if(i=this.omit(i,"twap"),s){const t={mainOrderId:e};a=await this.swapV1PrivatePostTwapCancelOrder(this.extend(t,i))}else{if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");o=this.market(t);const s={symbol:o.id},n=this.safeString2(i,"clientOrderId","clientOrderID");let d,h;i=this.omit(i,["clientOrderId"]),void 0!==n?s.clientOrderID=n:s.orderId=e,[d,i]=this.handleMarketTypeAndParams("cancelOrder",o,i),[h,i]=this.handleSubTypeAndParams("cancelOrder",o,i),a="spot"===d?await this.spotV1PrivatePostTradeCancel(this.extend(s,i)):"inverse"===h?await this.cswapV1PrivateDeleteTradeCancelOrder(this.extend(s,i)):await this.swapV2PrivateDeleteTradeOrder(this.extend(s,i))}const n=this.safeDict(a,"data",{}),d=this.safeDict(n,"order",n);return this.parseOrder(d,o)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let a;if(i.spot)a=await this.spotV1PrivatePostTradeCancelOpenOrders(this.extend(s,t));else{if(!i.swap)throw new r.BadRequest(this.id+" cancelAllOrders is only supported for spot and swap markets.");a=i.inverse?await this.cswapV1PrivateDeleteTradeAllOpenOrders(this.extend(s,t)):await this.swapV2PrivateDeleteTradeAllOpenOrders(this.extend(s,t))}const o=this.safeDict(a,"data",{}),n=this.safeList2(o,"success","orders",[]);return this.parseOrders(n)}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id},o=this.safeValue(i,"clientOrderIds");i=this.omit(i,"clientOrderIds");let n=e;const d=void 0!==o;d&&(n=o);const h=[];for(let e=0;e<n.length;e++){const t=n[e].toString();h.push(t)}let c;if(s.spot){a[d?"clientOrderIDs":"orderIds"]=h.join(","),c=await this.spotV1PrivatePostTradeCancelOrders(this.extend(a,i))}else d?a.clientOrderIDList=this.json(h):a.orderIdList=h,c=await this.swapV2PrivateDeleteTradeBatchOrders(this.extend(a,i));const l=this.safeDict(c,"data",{}),u=this.safeList2(l,"success","orders",[]);return this.parseOrders(u)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i=e>0,s={type:i?"ACTIVATE":"CLOSE",timeOut:i?this.parseToInt(e/1e3):0};let a,o;if([o,t]=this.handleMarketTypeAndParams("cancelAllOrdersAfter",void 0,t),"spot"===o)a=await this.spotV1PrivatePostTradeCancelAllAfter(this.extend(s,t));else{if("swap"!==o)throw new r.NotSupported(this.id+" cancelAllOrdersAfter() is not supported for "+o+" markets");a=await this.swapV2PrivatePostTradeCancelAllAfter(this.extend(s,t))}return a}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeBool(i,"twap",!1);let a,o;if(i=this.omit(i,"twap"),s){const t={mainOrderId:e};a=await this.swapV1PrivateGetTwapOrderDetail(this.extend(t,i))}else{if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");o=this.market(t);const s={symbol:o.id,orderId:e};let n,d;[n,i]=this.handleMarketTypeAndParams("fetchOrder",o,i),[d,i]=this.handleSubTypeAndParams("fetchOrder",o,i),a="spot"===n?await this.spotV1PrivateGetTradeQuery(this.extend(s,i)):"inverse"===d?await this.cswapV1PrivateGetTradeOrderDetail(this.extend(s,i)):await this.swapV2PrivateGetTradeOrder(this.extend(s,i))}const n=this.safeDict(a,"data",{}),d=this.safeDict(n,"order",n);return this.parseOrder(d,o)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o,n={};if(void 0!==e&&(a=this.market(e),n.symbol=a.id),[o,s]=this.handleMarketTypeAndParams("fetchOrders",a,s),"swap"!==o)throw new r.NotSupported(this.id+" fetchOrders() is only supported for swap markets");void 0!==i&&(n.limit=i),void 0!==t&&(n.startTime=t),[n,s]=this.handleUntilOption("endTime",n,s);const d=await this.swapV1PrivateGetTradeFullOrder(this.extend(n,s)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"orders",[]);return this.parseOrders(c,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let o,n,d;if(void 0!==e&&(r=this.market(e),a.symbol=r.id),[o,s]=this.handleMarketTypeAndParams("fetchOpenOrders",r,s),[n,s]=this.handleSubTypeAndParams("fetchOpenOrders",r,s),"spot"===o)d=await this.spotV1PrivateGetTradeOpenOrders(this.extend(a,s));else{const e=this.safeBool(s,"twap",!1);s=this.omit(s,"twap"),d=e?await this.swapV1PrivateGetTwapOpenOrders(this.extend(a,s)):"inverse"===n?await this.cswapV1PrivateGetTradeOpenOrders(this.extend(a,s)):await this.swapV2PrivateGetTradeOpenOrders(this.extend(a,s))}const h=this.safeDict(d,"data",{}),c=this.safeList2(h,"orders","list",[]);return this.parseOrders(c,r,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchCanceledAndClosedOrders(e,t,i,s);return this.filterBy(r,"status","closed")}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchCanceledAndClosedOrders(e,t,i,s);return this.filterBy(r,"status","canceled")}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let o,n,d,h;if(void 0!==e&&(r=this.market(e),a.symbol=r.id),[o,s]=this.handleMarketTypeAndParams("fetchClosedOrders",r,s),[n,s]=this.handleSubTypeAndParams("fetchClosedOrders",r,s),[d,s]=this.handleOptionAndParams(s,"fetchClosedOrders","standard",!1),d)h=await this.contractV1PrivateGetAllOrders(this.extend(a,s));else if("spot"===o)void 0!==i&&(a.pageSize=i),h=await this.spotV1PrivateGetTradeHistoryOrders(this.extend(a,s));else{const e=this.safeBool(s,"twap",!1);if(s=this.omit(s,"twap"),e){a.pageIndex=1,a.pageSize=void 0===i?100:i,a.startTime=void 0===t?1:t;const e=this.safeInteger(s,"until",this.milliseconds());s=this.omit(s,"until"),a.endTime=e,h=await this.swapV1PrivateGetTwapHistoryOrders(this.extend(a,s))}else h="inverse"===n?await this.cswapV1PrivateGetTradeOrderHistory(this.extend(a,s)):await this.swapV2PrivateGetTradeAllOrders(this.extend(a,s))}const c=this.safeDict(h,"data",{}),l=this.safeList2(c,"orders","list",[]);return this.parseOrders(l,r,t,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h={asset:a.id,amount:this.currencyToPrecision(e,t),type:n+"_"+d},c=await this.spotV3PrivateGetGetAssetTransfer(this.extend(h,r));return{info:c,id:this.safeString(c,"tranId"),timestamp:void 0,datetime:void 0,currency:e,amount:t,fromAccount:i,toAccount:s,status:void 0}}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),void 0!==e&&(a=this.currency(e));const o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(s,"fromAccount"),d=this.safeString(s,"toAccount"),h=this.safeString(o,n,n),c=this.safeString(o,d,d);if(void 0===h||void 0===c)throw new r.ExchangeError(this.id+" fromAccount & toAccount parameter are required");const l={type:h+"_"+c};void 0!==t&&(l.startTime=t),void 0!==i&&(l.size=i);const u=await this.spotV3PrivateGetAssetTransfer(this.extend(l,s)),f=this.safeList(u,"rows",[]);return this.parseTransfers(f,a,t,i)}parseTransfer(e,t=void 0){const i=this.safeString(e,"tranId"),s=this.safeInteger(e,"timestamp"),r=this.safeCurrencyCode(void 0,t),a=this.safeString(e,"status"),o=this.safeDict(this.options,"accountsById",{}),n=this.safeString(e,"type"),d=n.split("_"),h=this.safeString(d,0),c=this.safeString(n,1),l=this.safeString(o,h,h),u=this.safeString(o,c,c);return{info:e,id:i,timestamp:s,datetime:this.iso8601(s),currency:r,amount:this.safeNumber(e,"amount"),fromAccount:l,toAccount:u,status:a}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s=this.safeInteger(this.options,"recvWindow"),r=this.safeInteger(this.parseParams,"recvWindow",s),a={coin:i.id,offset:0,limit:1e3,recvWindow:r},o=await this.walletsV1PrivateGetCapitalDepositAddress(this.extend(a,t)),n=this.safeList(this.safeDict(o,"data"),"data"),d=this.parseDepositAddresses(n,[i.code],!1);return this.indexBy(d,"network")}async fetchDepositAddress(e,t={}){const i=this.safeString(t,"network");t=this.omit(t,["network"]);const s=await this.fetchDepositAddressesByNetwork(e,t);if(void 0!==i)return this.safeDict(s,i);{const t=this.safeDict(this.options,"defaultNetworks"),i=this.safeString(t,e);if(void 0!==i)return this.safeDict(s,i);{const e=Object.keys(s),t=this.safeString(e,0);return this.safeDict(s,t)}}}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"tag"),s=this.safeString(e,"coin"),r=(t=this.safeCurrency(s,t)).code,a=this.safeString(e,"addressWithPrefix"),o=this.safeString(e,"network"),n=this.networkIdToCode(o,r);return this.checkAddress(a),{info:e,currency:r,network:n,address:a,tag:i}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=await this.spotV3PrivateGetCapitalDepositHisrec(this.extend(r,s));return this.parseTransactions(o,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=await this.spotV3PrivateGetCapitalWithdrawHistory(this.extend(r,s));return this.parseTransactions(o,a,t,i)}parseTransaction(e,t=void 0){const i=this.safeValue(e,"data"),s=void 0===i?void 0:this.safeString(i,"id"),r=this.safeString(e,"id",s),a=this.safeString(e,"address"),o=this.safeString(e,"addressTag");let n=this.safeInteger(e,"insertTime"),d=this.iso8601(n);void 0===n&&(d=this.safeString(e,"applyTime"),n=this.parse8601(d));const h=this.safeString(e,"network"),c=this.safeString(e,"coin");let l=this.safeCurrencyCode(c,t);void 0!==l&&l!==h&&l.indexOf(h)>=0&&void 0!==h&&(l=l.replace(h,""));const u="0"===this.safeString(e,"transferType")?"deposit":"withdrawal";return{info:e,id:r,txid:this.safeString(e,"txId"),type:u,currency:l,network:this.networkIdToCode(h),amount:this.safeNumber(e,"amount"),status:this.parseTransactionStatus(this.safeString(e,"status")),timestamp:n,datetime:d,address:a,addressFrom:void 0,addressTo:a,tag:o,tagFrom:o,tagTo:void 0,updated:void 0,comment:this.safeString(e,"info"),fee:{currency:l,cost:this.safeNumber(e,"transactionFee"),rate:void 0},internal:void 0}}parseTransactionStatus(e){return this.safeString({0:"pending",1:"ok",10:"pending",20:"rejected",30:"ok",40:"rejected",50:"ok",60:"pending",70:"rejected",2:"pending",3:"rejected",4:"pending",5:"rejected",6:"ok"},e,e)}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if("swap"!==s.type)throw new r.BadSymbol(this.id+" setMarginMode() supports swap contracts only");if("CROSS"===(e=e.toUpperCase())&&(e="CROSSED"),"ISOLATED"!==e&&"CROSSED"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");const a={symbol:s.id,marginType:e};let o;return[o,i]=this.handleSubTypeAndParams("setMarginMode",s,i),"inverse"===o?await this.cswapV1PrivatePostTradeMarginType(this.extend(a,i)):await this.swapV2PrivatePostTradeMarginType(this.extend(a,i))}async addMargin(e,t,i={}){return await this.setMargin(e,t,this.extend({type:1},i))}async reduceMargin(e,t,i={}){return await this.setMargin(e,t,this.extend({type:2},i))}async setMargin(e,t,i={}){const s=this.safeInteger(i,"type");if(void 0===s)throw new r.ArgumentsRequired(this.id+" setMargin() requires a type parameter either 1 (increase margin) or 2 (decrease margin)");if(!this.inArray(s,[1,2]))throw new r.ArgumentsRequired(this.id+" setMargin() requires a type parameter either 1 (increase margin) or 2 (decrease margin)");await this.loadMarkets();const a=this.market(e),o={symbol:a.id,amount:this.amountToPrecision(a.symbol,t),type:s},n=await this.swapV2PrivatePostTradePositionMargin(this.extend(o,i));return this.parseMarginModification(n,a)}parseMarginModification(e,t=void 0){const i=this.safeString(e,"type");return{info:e,symbol:this.safeString(t,"symbol"),type:"1"===i?"add":"reduce",marginMode:"isolated",amount:this.safeNumber(e,"amount"),total:this.safeNumber(e,"margin"),code:this.safeString(t,"settle"),status:void 0,timestamp:void 0,datetime:void 0}}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.inverse?await this.cswapV1PrivateGetTradeLeverage(this.extend(s,t)):await this.swapV2PrivateGetTradeLeverage(this.extend(s,t));const a=this.safeDict(r,"data",{});return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t),marginMode:void 0,longLeverage:this.safeInteger(e,"longLeverage"),shortLeverage:this.safeInteger(e,"shortLeverage")}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");const s=this.safeStringUpper(i,"side");this.checkRequiredArgument("setLeverage",s,"side",["LONG","SHORT","BOTH"]),await this.loadMarkets();const a=this.market(t),o={symbol:a.id,side:s,leverage:e};return a.inverse?await this.cswapV1PrivatePostTradeLeverage(this.extend(o,i)):await this.swapV2PrivatePostTradeLeverage(this.extend(o,i))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={};let n,d,h;if([h,s]=this.handleSubTypeAndParams("fetchMyTrades",a,s),"inverse"===h){if(void 0===this.safeString(s,"orderId"))throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires an orderId argument for inverse swap trades");d=await this.cswapV1PrivateGetTradeAllFillOrders(this.extend(o,s)),n=this.safeList(d,"data",[])}else{o.symbol=a.id;const e=this.milliseconds();if(void 0!==t){o[a.spot?"startTime":"startTs"]=t}else a.swap&&(o.startTs=e-2592e6);const r=this.safeInteger(s,"until");if(s=this.omit(s,"until"),void 0!==r){o[a.spot?"endTime":"endTs"]=r}else a.swap&&(o.endTs=e);if(a.spot){void 0!==i&&(o.limit=i),d=await this.spotV1PrivateGetTradeMyTrades(this.extend(o,s));const e=this.safeDict(d,"data",{});n=this.safeList(e,"fills",[])}else{const e=this.safeStringUpper(s,"tradingUnit","CONT");s=this.omit(s,"tradingUnit"),o.tradingUnit=e,d=await this.swapV2PrivateGetTradeAllFillOrders(this.extend(o,s));const t=this.safeDict(d,"data",{});n=this.safeList(t,"fill_orders",[])}}return this.parseTrades(n,a,t,i,s)}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"networkList",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};if(0!==s)for(let e=0;e<s;e++){const s=i[e],a=this.safeString(s,"network"),o=this.safeBool(s,"isDefault"),n=this.safeString(t,"code"),d=this.networkIdToCode(a,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(s,"withdrawFee"),percentage:!1}},o&&(r.withdraw.fee=this.safeNumber(s,"withdrawFee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.walletsV1PrivateGetCapitalConfigGetall(t),s=this.safeList(i,"data");return this.parseDepositWithdrawFees(s,e,"coin")}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);let n=this.safeInteger(a,"walletType");if(void 0===n&&(n=1),!this.inArray(n,[1,2,3]))throw new r.BadRequest(this.id+" withdraw() requires either 1 fund account, 2 standard futures account, 3 perpetual account for walletType");const d={coin:o.id,address:i,amount:this.currencyToPrecision(e,t),walletType:n},h=this.safeStringUpper(a,"network");void 0!==h&&(d.network=this.networkCodeToId(h)),void 0!==s&&(d.addressTag=s),a=this.omit(a,["walletType","network"]);const c=await this.walletsV1PrivatePostCapitalWithdrawApply(this.extend(d,a)),l=this.safeValue(c,"data");return this.parseTransaction(l)}parseParams(e){const t=this.keysort(e),i=Object.keys(t);for(let e=0;e<i.length;e++){const s=i[e],r=t[s];if(Array.isArray(r)){let e="[";for(let t=0;t<r.length;t++){t>0&&(e+=","),e+=r[t].toString()}e+="]",t[s]=e}}return t}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a,o,n,d={autoCloseType:"LIQUIDATION"};if([d,s]=this.handleUntilOption("endTime",d,s),void 0!==e&&(r=this.market(e),d.symbol=r.id),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i),[a,s]=this.handleSubTypeAndParams("fetchMyLiquidations",r,s),"inverse"===a)o=await this.cswapV1PrivateGetTradeForceOrders(this.extend(d,s)),n=this.safeList(o,"data",[]);else{o=await this.swapV2PrivateGetTradeForceOrders(this.extend(d,s));const e=this.safeDict(o,"data",{});n=this.safeList(e,"orders",[])}return this.parseLiquidations(n,r,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"time"),r=this.safeString(e,"executedQty"),o=this.safeString(t,"contractSize"),n=this.safeString(e,"avgPrice"),d=a.Y.stringMul(r,o),h=a.Y.stringMul(d,n);return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:this.parseNumber(r),contractSize:this.parseNumber(o),price:this.parseNumber(n),baseValue:this.parseNumber(d),quoteValue:this.parseNumber(h),timestamp:s,datetime:this.iso8601(s)})}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={};let a;void 0!==this.safeString(i,"positionId")?a=await this.swapV1PrivatePostTradeClosePosition(this.extend(r,i)):(r.symbol=s.id,a=s.inverse?await this.cswapV1PrivatePostTradeCloseAllPositions(this.extend(r,i)):await this.swapV2PrivatePostTradeCloseAllPositions(this.extend(r,i)));const o=this.safeDict(a,"data");return this.parseOrder(o,s)}async closeAllPositions(e={}){await this.loadMarkets();const t=this.safeInteger(this.options,"recvWindow"),i=this.safeInteger(this.parseParams,"recvWindow",t);let s,a;if([s,e]=this.handleMarketTypeAndParams("closeAllPositions",void 0,e),[a,e]=this.handleSubTypeAndParams("closeAllPositions",void 0,e),"margin"===s)throw new r.BadRequest(this.id+" closePositions () cannot be used for "+s+" markets");const o={recvWindow:i};let n;n="inverse"===a?await this.cswapV1PrivatePostTradeCloseAllPositions(this.extend(o,e)):await this.swapV2PrivatePostTradeCloseAllPositions(this.extend(o,e));const d=this.safeDict(n,"data",{}),h=this.safeList(d,"success",[]),c=[];for(let e=0;e<h.length;e++){const t=this.parsePosition({positionId:h[e]});c.push(t)}return c}async fetchPositionMode(e=void 0,t={}){const i=await this.swapV1PrivateGetPositionSideDual(t),s=this.safeDict(i,"data",{});return{info:i,hedged:"true"===this.safeString(s,"dualSidePosition")}}async setPositionMode(e,t=void 0,i={}){let s;s=e?"true":"false";const r={dualSidePosition:s};return await this.swapV1PrivatePostPositionSideDual(this.extend(r,i))}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d=this.createOrderRequest(t,i,s,r,a,o);let h;d.cancelOrderId=e,d.cancelReplaceMode="STOP_ON_FAILURE",h=n.swap?await this.swapV1PrivatePostTradeCancelReplace(this.extend(d,o)):await this.spotV1PrivatePostTradeOrderCancelReplace(this.extend(d,o));const c=this.safeDict(h,"data");return this.parseOrder(c,n)}async fetchMarginMode(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a;[r,t]=this.handleSubTypeAndParams("fetchMarginMode",i,t),a="inverse"===r?await this.cswapV1PrivateGetTradeMarginType(this.extend(s,t)):await this.swapV2PrivateGetTradeMarginType(this.extend(s,t));const o=this.safeDict(a,"data",{});return this.parseMarginMode(o,i)}parseMarginMode(e,t=void 0){const i=this.safeString(e,"symbol");let s=this.safeStringLower(e,"marginType");return s="crossed"===s?"cross":s,{info:e,symbol:this.safeSymbol(i,t,"-","swap"),marginMode:s}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a={};const o=this.safeDict(r,"data",{});return i.spot?(r=await this.spotV1PrivateGetUserCommissionRate(this.extend(s,t)),a=o):i.inverse?(r=await this.cswapV1PrivateGetUserCommissionRate(t),a=o):(r=await this.swapV2PrivateGetUserCommissionRate(t),a=this.safeDict(o,"commission",{})),this.parseTradingFee(a,i)}parseTradingFee(e,t=void 0){return{info:e,symbol:void 0!==t?t.symbol:void 0,maker:this.safeNumber(e,"makerCommissionRate"),taker:this.safeNumber(e,"takerCommissionRate"),percentage:!1,tierBased:!1}}customEncode(e){const t=this.keysort(e),i=Object.keys(t);let s,r;for(let e=0;e<i.length;e++){const a=i[e];let o=t[a];if(Array.isArray(o)){let e;for(let t=0;t<o.length;t++){const i=o[t];"string"==typeof i?t>0?e+=',"'+i.toString()+'"':e='"'+i.toString()+'"':t>0?e+=","+i.toString():e=i.toString()}s="["+e+"]",o=s}0===e?r=a+"="+o:r+="&"+a+"="+o}return r}sign(e,t="public",i="GET",s={},a=void 0,n=void 0){let d=t[0],h=t[1],c=t[2];if(this.safeBool(this.options,"sandboxMode",!1)&&"swap"!==d)throw new r.NotSupported(this.id+" does not have a testnet/sandbox URL for "+d+" endpoints");let l=this.implodeHostname(this.urls.api[d]);if(e=this.implodeParams(e,s),"transfer"===h&&(d="account/transfer",h=t[2],c=t[3]),"account/apiPermissions"!==e&&(l+="spot"===d&&"v3"===h?"/api":"/"+d),l+="/"+h+"/"+e,(s=this.omit(s,this.extractParams(e))).timestamp=this.nonce(),s=this.keysort(s),"public"===c)Object.keys(s).length&&(l+="?"+this.urlencode(s));else if("private"===c){this.checkRequiredCredentials();const e=("subAccount"===d||"account/transfer"===d)&&"POST"===i;let t,r;e?r=this.customEncode(s):(t=this.parseParams(s),r=this.rawencode(t));const h=this.hmac(this.encode(r),this.encode(this.secret),o.s);if(a={"X-BX-APIKEY":this.apiKey,"X-SOURCE-KEY":this.safeString(this.options,"broker","CCXT")},e)a["Content-Type"]="application/json",s.signature=h,n=this.json(s);else{l+="?"+this.urlencode(t)+"&signature="+h}}return{url:l,method:i,body:n,headers:a}}nonce(){return this.milliseconds()}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"msg");if(void 0!==c&&"0"!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bit2c",name:"Bit2C",countries:["IL"],rateLimit:3e3,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,ws:!1},urls:{logo:"https://github.com/user-attachments/assets/db0bce50-6842-4c09-a1d5-0c87d22118aa",api:{rest:"https://bit2c.co.il"},www:"https://www.bit2c.co.il",referral:"https://bit2c.co.il/Aff/63bfed10-e359-420c-ab5a-ad368dab0baf",doc:["https://www.bit2c.co.il/home/api","https://github.com/OferE/bit2c"]},api:{public:{get:["Exchanges/{pair}/Ticker","Exchanges/{pair}/orderbook","Exchanges/{pair}/trades","Exchanges/{pair}/lasttrades"]},private:{post:["Merchant/CreateCheckout","Funds/AddCoinFundsRequest","Order/AddFund","Order/AddOrder","Order/GetById","Order/AddOrderMarketPriceBuy","Order/AddOrderMarketPriceSell","Order/CancelOrder","Order/AddCoinFundsRequest","Order/AddStopOrder","Payment/GetMyId","Payment/Send","Payment/Pay"],get:["Account/Balance","Account/Balance/v2","Order/MyOrders","Order/GetById","Order/AccountHistory","Order/OrderHistory"]}},markets:{"BTC/NIS":this.safeMarketStructure({id:"BtcNis",symbol:"BTC/NIS",base:"BTC",quote:"NIS",baseId:"Btc",quoteId:"Nis",type:"spot",spot:!0}),"ETH/NIS":this.safeMarketStructure({id:"EthNis",symbol:"ETH/NIS",base:"ETH",quote:"NIS",baseId:"Eth",quoteId:"Nis",type:"spot",spot:!0}),"LTC/NIS":this.safeMarketStructure({id:"LtcNis",symbol:"LTC/NIS",base:"LTC",quote:"NIS",baseId:"Ltc",quoteId:"Nis",type:"spot",spot:!0}),"USDC/NIS":this.safeMarketStructure({id:"UsdcNis",symbol:"USDC/NIS",base:"USDC",quote:"NIS",baseId:"Usdc",quoteId:"Nis",type:"spot",spot:!0})},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.025"),taker:this.parseNumber("0.03"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.03")],[this.parseNumber("20000"),this.parseNumber("0.0275")],[this.parseNumber("50000"),this.parseNumber("0.025")],[this.parseNumber("75000"),this.parseNumber("0.0225")],[this.parseNumber("100000"),this.parseNumber("0.02")],[this.parseNumber("250000"),this.parseNumber("0.015")],[this.parseNumber("500000"),this.parseNumber("0.0125")],[this.parseNumber("750000"),this.parseNumber("0.01")],[this.parseNumber("1000000"),this.parseNumber("0.008")],[this.parseNumber("2000000"),this.parseNumber("0.006")],[this.parseNumber("3000000"),this.parseNumber("0.004")],[this.parseNumber("4000000"),this.parseNumber("0.002")]],maker:[[this.parseNumber("0"),this.parseNumber("0.025")],[this.parseNumber("20000"),this.parseNumber("0.0225")],[this.parseNumber("50000"),this.parseNumber("0.02")],[this.parseNumber("75000"),this.parseNumber("0.0175")],[this.parseNumber("100000"),this.parseNumber("0.015")],[this.parseNumber("250000"),this.parseNumber("0.01")],[this.parseNumber("500000"),this.parseNumber("0.0075")],[this.parseNumber("750000"),this.parseNumber("0.005")],[this.parseNumber("1000000"),this.parseNumber("0.004")],[this.parseNumber("2000000"),this.parseNumber("0.003")],[this.parseNumber("3000000"),this.parseNumber("0.002")],[this.parseNumber("4000000"),this.parseNumber("0.001")]]}}},options:{fetchTradesMethod:"public_get_exchanges_pair_trades"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:30,untilDays:30,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"Please provide valid APIkey":r.AuthenticationError,"No order found.":r.OrderNotFound},broad:{"Please provide valid nonce":r.InvalidNonce,"please approve new terms of use on site":r.PermissionDenied}}})}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=Object.keys(this.currencies);for(let s=0;s<i.length;s++){const r=i[s],a=this.account(),o=this.currency(r).id.toUpperCase();o in e&&(a.free=this.safeString(e,"AVAILABLE_"+o),a.total=this.safeString(e,o)),t[r]=a}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountBalanceV2(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={pair:this.market(e).id},r=await this.publicGetExchangesPairOrderbook(this.extend(s,i));return this.parseOrderBook(r,e)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeString(e,"av"),r=this.safeString(e,"a"),a=this.safeString(e,"ll");return this.safeTicker({symbol:i,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:this.safeString(e,"h"),bidVolume:void 0,ask:this.safeString(e,"l"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:s,baseVolume:r,quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetExchangesPairTicker(this.extend(s,t));return this.parseTicker(r,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e),o=this.options.fetchTradesMethod,n={pair:a.id};let d;if(void 0!==t&&(n.date=this.parseToInt(t)),void 0!==i&&(n.limit=i),d="public_get_exchanges_pair_trades"===o?await this.publicGetExchangesPairTrades(this.extend(n,s)):await this.publicGetExchangesPairLasttrades(this.extend(n,s)),"string"==typeof d)throw new r.ExchangeError(d);return this.parseTrades(d,a,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetAccountBalance(e),i=this.safeValue(t,"Fees",{}),s=Object.keys(i),r={};for(let e=0;e<s.length;e++){const t=s[e],o=this.safeSymbol(t),n=this.safeValue(i,t),d=this.safeString(n,"FeeMaker"),h=this.safeString(n,"FeeTaker"),c=this.parseNumber(a.Y.stringDiv(d,"100")),l=this.parseNumber(a.Y.stringDiv(h,"100"));r[o]={info:n,symbol:o,taker:l,maker:c,percentage:!0,tierBased:!0}}return r}async createOrder(e,t,i,s,r=void 0,o={}){await this.loadMarkets();let n="privatePostOrderAddOrder";const d=this.market(e),h={Amount:s,Pair:d.id};if("market"===t)n+="MarketPrice"+this.capitalize(i);else{h.Price=r;const e=this.numberToString(s),t=this.numberToString(r);h.Total=this.parseToNumeric(a.Y.stringMul(e,t)),h.IsBid="buy"===i}const c=await this[n](this.extend(h,o));return this.parseOrder(c,d)}async cancelOrder(e,t=void 0,i={}){const s={id:e},r=await this.privatePostOrderCancelOrder(this.extend(s,i));return this.parseOrder(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id},n=await this.privateGetOrderMyOrders(this.extend(o,s)),d=this.safeValue(n,a.id,{}),h=this.safeValue(d,"ask",[]),c=this.safeList(d,"bid",[]);return this.parseOrders(this.arrayConcat(h,c),a,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(t),r={id:e},a=await this.privateGetOrderGetById(this.extend(r,i));return this.parseOrder(a,s)}parseOrder(e,t=void 0){let i,s=!1;"NewOrder"in e?(i=e.NewOrder,s=!0):i=e;const r=this.safeString(i,"id"),a=this.safeSymbol(void 0,t),o=this.safeIntegerProduct(i,"created",1e3);let n;if(s){const e=this.safeInteger(i,"status_type");0===e||1===e?n="open":5===e&&(n="closed")}else{const e=this.safeString(i,"status");"New"===e||"Open"===e?n="open":"Completed"===e&&(n="closed")}let d=this.safeString(i,"order_type");"0"===d?d="limit":"1"===d&&(d="market");let h=this.safeString(i,"type");"0"===h?h="buy":"1"===h&&(h="sell");const c=this.safeString(i,"price");let l,u;return s?(l=this.safeString(i,"amount"),u=this.safeString(i,"amount")):(l=this.safeString(i,"initialAmount"),u=this.safeString(i,"amount")),this.safeOrder({id:r,clientOrderId:void 0,timestamp:o,datetime:this.iso8601(o),lastTradeTimestamp:void 0,status:n,symbol:a,type:d,timeInForce:void 0,postOnly:void 0,side:h,price:c,triggerPrice:void 0,amount:l,filled:void 0,remaining:u,cost:void 0,trades:void 0,fee:void 0,info:e,average:void 0},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==i&&(a.take=i),a.take=i,void 0!==t&&(a.toTime=this.yyyymmdd(this.milliseconds(),"."),a.fromTime=this.yyyymmdd(t,".")),void 0!==e&&(r=this.market(e),a.pair=r.id);const o=await this.privateGetOrderOrderHistory(this.extend(a,s));return this.parseTrades(o,r,t,i)}removeCommaFromValue(e){let t="";const i=e.split(",");for(let e=0;e<i.length;e++)t+=i[e];return t}parseTrade(e,t=void 0){let i,s,r,a,o,n,d,h;const c=this.safeString(e,"reference");if(void 0!==c){s=c,i=this.safeTimestamp(e,"ticks"),r=this.safeString(e,"price"),r=this.removeCommaFromValue(r),a=this.safeString(e,"firstAmount");const l=c.split("|"),u=this.safeString(e,"pair");t=this.safeMarket(u,t),t=this.safeMarket(l[0],t);const f=this.safeValue(e,"isMaker");h=f?"maker":"taker",o=f?l[2]:l[1];d=0===this.safeInteger(e,"action")?"buy":"sell";const p=this.safeString(e,"feeAmount");void 0!==p&&(n={cost:p,currency:"NIS"})}else i=this.safeTimestamp(e,"date"),s=this.safeString(e,"tid"),r=this.safeString(e,"price"),a=this.safeString(e,"amount"),d=this.safeValue(e,"isBid"),void 0!==d&&(d=d?"buy":"sell");return t=this.safeMarket(void 0,t),this.safeTrade({info:e,id:s,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,order:o,type:void 0,side:d,takerOrMaker:h,price:r,amount:a,cost:void 0,fee:n},t)}isFiat(e){return"NIS"===e}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e);if(this.isFiat(e))throw new r.NotSupported(this.id+" fetchDepositAddress() does not support fiat currencies");const s={Coin:i.id},a=await this.privatePostFundsAddCoinFundsRequest(this.extend(s,t));return this.parseDepositAddress(a,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");this.checkAddress(i);return{info:e,currency:this.safeCurrencyCode(void 0,t),network:void 0,address:i,tag:void 0}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/"+this.implodeParams(e,s);if("public"===t)o+=".json";else{this.checkRequiredCredentials();const e=this.nonce(),t=this.extend({nonce:e},s),d=this.urlencode(t);"GET"===i?Object.keys(t).length&&(o+="?"+d):a=d;const h=this.hmac(this.encode(d),this.encode(this.secret),n.Zf,"base64");r={"Content-Type":"application/x-www-form-urlencoded",key:this.apiKey,sign:h}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;let c=this.safeString(n,"error");if(void 0===c&&(c=this.safeString(n,"Error")),void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),new r.ExchangeError(e)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitbank",name:"bitbank",countries:["JP"],version:"v1",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","1h":"1hour","4h":"4hour","8h":"8hour","12h":"12hour","1d":"1day","1w":"1week"},hostname:"bitbank.cc",urls:{logo:"https://github.com/user-attachments/assets/9d616de0-8a88-4468-8e38-d269acab0348",api:{public:"https://public.{hostname}",private:"https://api.{hostname}",markets:"https://api.{hostname}"},www:"https://bitbank.cc/",doc:"https://docs.bitbank.cc/",fees:"https://bitbank.cc/docs/fees/"},api:{public:{get:["{pair}/ticker","tickers","tickers_jpy","{pair}/depth","{pair}/transactions","{pair}/transactions/{yyyymmdd}","{pair}/candlestick/{candletype}/{yyyymmdd}","{pair}/circuit_break_info"]},private:{get:["user/assets","user/spot/order","user/spot/active_orders","user/margin/positions","user/spot/trade_history","user/deposit_history","user/unconfirmed_deposits","user/deposit_originators","user/withdrawal_account","user/withdrawal_history","spot/status","spot/pairs"],post:["user/spot/order","user/spot/cancel_order","user/spot/cancel_orders","user/spot/orders_info","user/confirm_deposits","user/confirm_deposits_all","user/request_withdrawal"]},markets:{get:["spot/pairs"]}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb,exceptions:{exact:{20001:r.AuthenticationError,20002:r.AuthenticationError,20003:r.AuthenticationError,20005:r.AuthenticationError,20004:r.InvalidNonce,40020:r.InvalidOrder,40021:r.InvalidOrder,40025:r.ExchangeError,40013:r.OrderNotFound,40014:r.OrderNotFound,50008:r.PermissionDenied,50009:r.OrderNotFound,50010:r.OrderNotFound,60001:r.InsufficientFunds,60005:r.InvalidOrder}}})}async fetchMarkets(e={}){const t=await this.marketsGetSpotPairs(e),i=this.safeValue(t,"data"),s=this.safeValue(i,"pairs",[]);return this.parseMarkets(s)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeString(e,"base_asset"),s=this.safeString(e,"quote_asset"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s);return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:this.safeValue(e,"is_enabled"),contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(e,"taker_fee_rate_quote"),maker:this.safeNumber(e,"maker_fee_rate_quote"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amount_digits"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"price_digits")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"unit_amount"),max:this.safeNumber(e,"limit_max_amount")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"vol"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetPairTicker(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id},a=await this.publicGetPairDepth(this.extend(r,i)),o=this.safeValue(a,"data",{}),n=this.safeInteger(o,"timestamp");return this.parseOrderBook(o,s.symbol,n)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"executed_at");t=this.safeMarket(void 0,t);const s=this.safeString(e,"price"),r=this.safeString(e,"amount"),a=this.safeString2(e,"transaction_id","trade_id"),o=this.safeString(e,"maker_taker");let n;const d=this.safeString(e,"fee_amount_quote");void 0!==d&&(n={currency:t.quote,cost:d});const h=this.safeString(e,"order_id"),c=this.safeString(e,"type"),l=this.safeString(e,"side");return this.safeTrade({timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,id:a,order:h,type:c,side:l,takerOrMaker:o,price:s,amount:r,cost:void 0,fee:n,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id},o=await this.publicGetPairTransactions(this.extend(a,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"transactions",[]);return this.parseTrades(d,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.marketsGetSpotPairs(e),i=this.safeValue(t,"data",{}),s=this.safeValue(i,"pairs",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"name"),a=this.safeMarket(i).symbol;r[a]={info:t,symbol:a,maker:this.safeNumber(t,"maker_fee_rate_quote"),taker:this.safeNumber(t,"taker_fee_rate_quote"),percentage:!0,tierBased:!1}}return r}parseOHLCV(e,t=void 0){return[this.safeInteger(e,5),this.safeNumber(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){if(void 0===i){void 0===s&&(s=1e3);const e=this.parseTimeframe(t);i=this.milliseconds()-1e3*e*s}await this.loadMarkets();const a=this.market(e),o={pair:a.id,candletype:this.safeString(this.timeframes,t,t),yyyymmdd:this.yyyymmdd(i,"")},n=await this.publicGetPairCandlestickCandletypeYyyymmdd(this.extend(o,r)),d=this.safeValue(n,"data",{}),h=this.safeValue(d,"candlestick",[]),c=this.safeValue(h,0,{}),l=this.safeList(c,"ohlcv",[]);return this.parseOHLCVs(l,a,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeValue(e,"data",{}),s=this.safeValue(i,"assets",[]);for(let e=0;e<s.length;e++){const i=s[e],r=this.safeString(i,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(i,"free_amount"),o.used=this.safeString(i,"locked_amount"),o.total=this.safeString(i,"onhand_amount"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUserAssets(e);return this.parseBalance(t)}parseOrderStatus(e){return this.safeString({UNFILLED:"open",PARTIALLY_FILLED:"open",FULLY_FILLED:"closed",CANCELED_UNFILLED:"canceled",CANCELED_PARTIALLY_FILLED:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"order_id"),s=this.safeString(e,"pair");t=this.safeMarket(s,t);const r=this.safeInteger(e,"ordered_at"),a=this.safeString(e,"price"),o=this.safeString(e,"start_amount"),n=this.safeString(e,"executed_amount"),d=this.safeString(e,"remaining_amount"),h=this.safeString(e,"average_price"),c=this.parseOrderStatus(this.safeString(e,"status")),l=this.safeStringLower(e,"type"),u=this.safeStringLower(e,"side");return this.safeOrder({id:i,clientOrderId:void 0,datetime:this.iso8601(r),timestamp:r,lastTradeTimestamp:void 0,status:c,symbol:t.symbol,type:l,timeInForce:void 0,postOnly:void 0,side:u,price:a,triggerPrice:void 0,cost:void 0,average:h,amount:o,filled:n,remaining:d,trades:void 0,fee:void 0,info:e},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={pair:o.id,amount:this.amountToPrecision(e,s),side:i,type:t};"limit"===t&&(n.price=this.priceToPrecision(e,r));const d=await this.privatePostUserSpotOrder(this.extend(n,a)),h=this.safeDict(d,"data");return this.parseOrder(h,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e,pair:this.market(t).id},r=await this.privatePostUserSpotCancelOrder(this.extend(s,i)),a=this.safeValue(r,"data");return this.parseOrder(a)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(t),r={order_id:e,pair:s.id},a=await this.privateGetUserSpotOrder(this.extend(r,i)),o=this.safeDict(a,"data");return this.parseOrder(o,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};void 0!==i&&(a.count=i),void 0!==t&&(a.since=this.parseToInt(t/1e3));const o=await this.privateGetUserSpotActiveOrders(this.extend(a,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"orders",[]);return this.parseOrders(d,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.pair=a.id),void 0!==i&&(r.count=i),void 0!==t&&(r.since=this.parseToInt(t/1e3));const o=await this.privateGetUserSpotTradeHistory(this.extend(r,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"trades",[]);return this.parseTrades(d,a,t,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={asset:i.id},r=await this.privateGetUserWithdrawalAccount(this.extend(s,t)),a=this.safeValue(r,"data",{}),o=this.safeValue(a,"accounts",[]),n=this.safeValue(o,0,{});return{info:r,currency:i,network:void 0,address:this.safeString(n,"address"),tag:void 0}}async withdraw(e,t,i,s=void 0,a={}){if([s,a]=this.handleWithdrawTagAndParams(s,a),!("uuid"in a))throw new r.ExchangeError(this.id+" uuid is required for withdrawal");await this.loadMarkets();const o=this.currency(e),n={asset:o.id,amount:t},d=await this.privatePostUserRequestWithdrawal(this.extend(n,a)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,o)}parseTransaction(e,t=void 0){const i=this.safeString(e,"txid");return{id:i,txid:i,timestamp:void 0,datetime:void 0,network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,amount:void 0,type:void 0,currency:(t=this.safeCurrency(void 0,t)).code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:void 0,info:e}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n=this.omit(s,this.extractParams(e)),d=this.implodeHostname(this.urls.api[t])+"/";if("public"===t||"markets"===t)d+=this.implodeParams(e,s),Object.keys(n).length&&(d+="?"+this.urlencode(n));else{this.checkRequiredCredentials();const t=this.nonce().toString();let h=t;d+=this.version+"/"+this.implodeParams(e,s),"POST"===i?h+=a=this.json(n):(h+="/"+this.version+"/"+e,Object.keys(n).length&&(n=this.urlencode(n),d+="?"+n,h+="?"+n)),r={"Content-Type":"application/json","ACCESS-KEY":this.apiKey,"ACCESS-NONCE":t,"ACCESS-SIGNATURE":this.hmac(this.encode(h),this.encode(this.secret),o.s)}}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeInteger(n,"success"),l=this.safeValue(n,"data");if(!c||!l){const e={1e4:"URL does not exist",10001:"A system error occurred. Please contact support",10002:"Invalid JSON format. Please check the contents of transmission",10003:"A system error occurred. Please contact support",10005:"A timeout error occurred. Please wait for a while and try again",20001:"API authentication failed",20002:"Illegal API key",20003:"API key does not exist",20004:"API Nonce does not exist",20005:"API signature does not exist",20011:"Two-step verification failed",20014:"SMS authentication failed",30001:"Please specify the order quantity",30006:"Please specify the order ID",30007:"Please specify the order ID array",30009:"Please specify the stock",30012:"Please specify the order price",30013:"Trade Please specify either",30015:"Please specify the order type",30016:"Please specify asset name",30019:"Please specify uuid",30039:"Please specify the amount to be withdrawn",40001:"The order quantity is invalid",40006:"Count value is invalid",40007:"End time is invalid",40008:"end_id Value is invalid",40009:"The from_id value is invalid",40013:"The order ID is invalid",40014:"The order ID array is invalid",40015:"Too many specified orders",40017:"Incorrect issue name",40020:"The order price is invalid",40021:"The trading classification is invalid",40022:"Start date is invalid",40024:"The order type is invalid",40025:"Incorrect asset name",40028:"uuid is invalid",40048:"The amount of withdrawal is illegal",50003:"Currently, this account is in a state where you can not perform the operation you specified. Please contact support",50004:"Currently, this account is temporarily registered. Please try again after registering your account",50005:"Currently, this account is locked. Please contact support",50006:"Currently, this account is locked. Please contact support",50008:"User identification has not been completed",50009:"Your order does not exist",50010:"Can not cancel specified order",50011:"API not found",60001:"The number of possessions is insufficient",60002:"It exceeds the quantity upper limit of the tender buying order",60003:"The specified quantity exceeds the limit",60004:"The specified quantity is below the threshold",60005:"The specified price is above the limit",60006:"The specified price is below the lower limit",70001:"A system error occurred. Please contact support",70002:"A system error occurred. Please contact support",70003:"A system error occurred. Please contact support",70004:"We are unable to accept orders as the transaction is currently suspended",70005:"Order can not be accepted because purchase order is currently suspended",70006:"We can not accept orders because we are currently unsubscribed ",70009:"We are currently temporarily restricting orders to be carried out. Please use the limit order.",70010:"We are temporarily raising the minimum order quantity as the system load is now rising."},t=this.safeString(l,"code"),i=this.safeString(e,t,"Error");throw this.throwExactlyMatchedException(this.exceptions.exact,t,i),new r.ExchangeError(this.id+" "+this.json(n))}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitbns",name:"Bitbns",countries:["IN"],rateLimit:1e3,certified:!1,version:"v2",has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:void 0,cancelAllOrders:!1,cancelOrder:!0,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,fetchBalance:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPositionMode:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:"emulated",fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,transfer:!1,withdraw:!1},hostname:"bitbns.com",urls:{logo:"https://github.com/user-attachments/assets/a5b9a562-cdd8-4bea-9fa7-fd24c1dad3d9",api:{www:"https://{hostname}",v1:"https://api.{hostname}/api/trade/v1",v2:"https://api.{hostname}/api/trade/v2"},www:"https://bitbns.com",referral:"https://ref.bitbns.com/1090961",doc:["https://bitbns.com/trade/#/api-trading/"],fees:"https://bitbns.com/fees"},api:{www:{get:["order/fetchMarkets","order/fetchTickers","order/fetchOrderbook","order/getTickerWithVolume","exchangeData/ohlc","exchangeData/orderBook","exchangeData/tradedetails"]},v1:{get:["platform/status","tickers","orderbook/sell/{symbol}","orderbook/buy/{symbol}"],post:["currentCoinBalance/EVERYTHING","getApiUsageStatus/USAGE","getOrderSocketToken/USAGE","currentCoinBalance/{symbol}","orderStatus/{symbol}","depositHistory/{symbol}","withdrawHistory/{symbol}","withdrawHistoryAll/{symbol}","depositHistoryAll/{symbol}","listOpenOrders/{symbol}","listOpenStopOrders/{symbol}","getCoinAddress/{symbol}","placeSellOrder/{symbol}","placeBuyOrder/{symbol}","buyStopLoss/{symbol}","sellStopLoss/{symbol}","cancelOrder/{symbol}","cancelStopLossOrder/{symbol}","listExecutedOrders/{symbol}","placeMarketOrder/{symbol}","placeMarketOrderQnty/{symbol}"]},v2:{post:["orders","cancel","getordersnew","marginOrders"]}},fees:{trading:{feeSide:"quote",tierBased:!1,percentage:!0,taker:this.parseNumber("0.0025"),maker:this.parseNumber("0.0025")}},precisionMode:o.kb,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!0,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:100}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{400:r.BadRequest,409:r.BadSymbol,416:r.InsufficientFunds,417:r.OrderNotFound},broad:{}}})}async fetchStatus(e={}){const t=await this.v1GetPlatformStatus(e),i=this.safeString(t,"status");return{status:this.safeString({1:"ok"},i,i),updated:void 0,eta:void 0,url:void 0,info:t}}async fetchMarkets(e={}){const t=await this.wwwGetOrderFetchMarkets(e),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"id"),a=this.safeString(s,"base"),o=this.safeString(s,"quote"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.safeDict(s,"precision",{}),c=this.safeDict(s,"limits",{}),l=this.safeDict(c,"amount",{}),u=this.safeDict(c,"price",{}),f=this.safeDict(c,"cost",{}),p="USDT"===o?a+"_"+o:a;i.push({id:r,uppercaseId:p,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(h,"amount"))),price:this.parseNumber(this.parsePrecision(this.safeString(h,"price")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(l,"min"),max:this.safeNumber(l,"max")},price:{min:this.safeNumber(u,"min"),max:this.safeNumber(u,"max")},cost:{min:this.safeNumber(f,"min"),max:this.safeNumber(f,"max")}},created:void 0,info:s})}return i}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.limit=t);const a=await this.wwwGetOrderFetchOrderbook(this.extend(r,i)),o=this.safeInteger(a,"timestamp");return this.parseOrderBook(a,s.symbol,o)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeString(e,"last");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:this.safeString(e,"bidVolume"),ask:this.safeString(e,"ask"),askVolume:this.safeString(e,"askVolume"),vwap:this.safeString(e,"vwap"),open:this.safeString(e,"open"),close:a,last:a,previousClose:this.safeString(e,"previousClose"),change:this.safeString(e,"change"),percentage:this.safeString(e,"percentage"),average:this.safeString(e,"average"),baseVolume:this.safeString(e,"baseVolume"),quoteVolume:this.safeString(e,"quoteVolume"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.wwwGetOrderFetchTickers(t);return this.parseTickers(i,e)}parseBalance(e){const t=void 0,i={info:e,timestamp:t,datetime:this.iso8601(t)},s=this.safeDict(e,"data",{}),r=Object.keys(s);for(let e=0;e<r.length;e++){const t=r[e],a=t.split("availableorder");if(a.length>1){let e=this.safeString(a,1);const r=this.account();r.free=this.safeString(s,t),r.used=this.safeString(s,"inorder"+e),"Money"===e&&(e="INR");i[this.safeCurrencyCode(e)]=r}}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v1PostCurrentCoinBalanceEVERYTHING(e);return this.parseBalance(t)}parseStatus(e){return this.safeString({"-1":"cancelled",0:"open",1:"open",2:"done"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"id","entry_id"),s=this.safeString(e,"time"),r=this.safeString(e,"t_rate");let a=this.safeString(e,"type");"0"===a?a="buy":"1"===a&&(a="sell");const o=this.safeString(e,"data");let n=this.safeString(e,"status");return n="Successfully cancelled the order"===o?"cancelled":this.parseStatus(n),this.safeOrder({info:e,id:i,clientOrderId:void 0,timestamp:this.parse8601(s),datetime:s,lastTradeTimestamp:void 0,symbol:this.safeString(t,"symbol"),timeInForce:void 0,postOnly:void 0,side:a,price:this.safeString(e,"rate"),triggerPrice:r,amount:this.safeString(e,"btc"),cost:void 0,average:void 0,filled:void 0,remaining:void 0,status:n,fee:{cost:void 0,currency:void 0,rate:void 0},trades:void 0},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeStringN(a,["triggerPrice","stopPrice","t_rate"]),d=this.safeString(a,"target_rate"),h=this.safeString(a,"trail_rate");a=this.omit(a,["triggerPrice","stopPrice","trail_rate","target_rate","t_rate"]);const c={side:i.toUpperCase(),symbol:o.uppercaseId,quantity:this.amountToPrecision(e,s)};let l="v2PostOrders";"limit"===t?c.rate=this.priceToPrecision(e,r):(l="v1PostPlaceMarketOrderQntySymbol",c.market=o.quoteId),void 0!==n&&(c.t_rate=this.priceToPrecision(e,n)),void 0!==d&&(c.target_rate=this.priceToPrecision(e,d)),void 0!==h&&(c.trail_rate=this.priceToPrecision(e,h));const u=await this[l](this.extend(c,a));return this.parseOrder(u,o)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeBool2(i,"trigger","stop");i=this.omit(i,["trigger","stop"]);const o={entry_id:e,symbol:s.uppercaseId};let n;const d=a?"StopLossOrder":"Order";let h="USDT"===s.quoteId?"usdtcancel":"cancel";return h+=d,o.side=h,n=await this.v2PostCancel(this.extend(o,i)),this.parseOrder(n,s)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id,entry_id:e};if(this.safeBool2(i,"trigger","stop"))throw new r.BadRequest(this.id+" fetchOrder cannot fetch stop orders");const o=await this.v1PostOrderStatusSymbol(this.extend(a,i)),n=this.safeList(o,"data",[]),d=this.safeDict(n,0);return this.parseOrder(d,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o=this.safeBool2(s,"trigger","stop");s=this.omit(s,["trigger","stop"]);const n="USDT"===a.quoteId?"usdtListOpen":"listOpen",d={symbol:a.uppercaseId,page:0,side:o?n+"StopOrders":n+"Orders"},h=await this.v2PostGetordersnew(this.extend(d,s)),c=this.safeList(h,"data",[]);return this.parseOrders(c,a,t,i)}parseTrade(e,t=void 0){t=this.safeMarket(void 0,t);const i=this.safeString2(e,"id","tradeId");let s=this.parse8601(this.safeString(e,"date"));s=this.safeInteger(e,"timestamp",s);const r=this.safeString2(e,"rate","price");let o=this.safeString(e,"amount"),n=this.safeStringLower(e,"type");void 0!==n&&(n.indexOf("buy")>=0?n="buy":n.indexOf("sell")>=0&&(n="sell"));const d=this.safeString(e,"factor");let h;void 0!==d?o=a.Y.stringDiv(o,d):(o=this.safeString(e,"base_volume"),h=this.safeString(e,"quote_volume"));const c=t.symbol;let l;const u=this.safeString(e,"fee");if(void 0!==u){l={cost:u,currency:t.quote}}return this.safeTrade({info:e,timestamp:s,datetime:this.iso8601(s),symbol:c,id:i,order:i,type:void 0,side:n,takerOrMaker:void 0,price:r,amount:o,cost:h,fee:l},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id,page:0};void 0!==t&&(o.since=this.iso8601(t));const n=await this.v1PostListExecutedOrdersSymbol(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={coin:a.baseId,market:a.quoteId},n=await this.wwwGetExchangeDataTradedetails(this.extend(o,s));return this.parseTrades(n,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDeposits() requires a currency code argument");await this.loadMarkets();const a=this.currency(e),o={symbol:a.id,page:0},n=await this.v1PostDepositHistorySymbol(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchWithdrawals() requires a currency code argument");await this.loadMarkets();const a=this.currency(e),o={symbol:a.id,page:0},n=await this.v1PostWithdrawHistorySymbol(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}parseTransactionStatusByType(e,t=void 0){const i=this.safeDict({deposit:{0:"pending",1:"ok"},withdrawal:{0:"pending",1:"canceled",2:"pending",3:"failed",4:"pending",5:"failed",6:"ok"}},t,{});return this.safeString(i,e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"unit"),s=this.safeCurrencyCode(i,t),r=this.parse8601(this.safeString2(e,"date","timestamp"));let a=this.safeString(e,"type");const o=this.safeString(e,"expTime","");let n;void 0!==a&&(a.indexOf("deposit")>=0?(a="deposit",n="ok"):(a.indexOf("withdraw")>=0||o.indexOf("withdraw")>=0)&&(a="withdrawal"));const d=this.safeNumber(e,"amount"),h=this.safeNumber(e,"fee");let c;return void 0!==h&&(c={currency:s,cost:h}),{info:e,id:void 0,txid:void 0,timestamp:r,datetime:this.iso8601(r),network:void 0,address:void 0,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:a,amount:d,currency:s,status:n,updated:void 0,comment:void 0,internal:void 0,fee:c}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={symbol:this.currency(e).id},s=await this.v1PostGetCoinAddressSymbol(this.extend(i,t)),r=this.safeDict(s,"data",{}),a=this.safeString(r,"token"),o=this.safeString(r,"tag");return this.checkAddress(a),{info:s,currency:e,network:void 0,address:a,tag:o}}nonce(){return this.milliseconds()}sign(e,t="www",i="GET",s={},a=void 0,o=void 0){if(!(t in this.urls.api))throw new r.ExchangeError(this.id+" does not have a testnet/sandbox URL for "+t+" endpoints");"www"!==t&&(this.checkRequiredCredentials(),a={"X-BITBNS-APIKEY":this.apiKey});let d=this.implodeHostname(this.urls.api[t])+"/"+this.implodeParams(e,s);const h=this.omit(s,this.extractParams(e)),c=this.nonce().toString();if("GET"===i)Object.keys(h).length&&(d+="?"+this.urlencode(h));else if("POST"===i){const e={timeStamp_nonce:c,body:o=Object.keys(h).length?this.json(h):"{}"},t=this.stringToBase64(this.json(e)),i=this.hmac(this.encode(t),this.encode(this.secret),n.Zf);a["X-BITBNS-PAYLOAD"]=t,a["X-BITBNS-SIGNATURE"]=i,a["Content-Type"]="application/x-www-form-urlencoded"}return{url:d,method:i,body:o,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"msg");if(void 0!==c&&"200"!==c&&"204"!==c||void 0!==l){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitcoincom",name:"Bitcoin.com",alias:!0})}}
class d extends a.A{describe(){return this.deepExtend(super.describe(),{id:"bitfinex",name:"Bitfinex",countries:["VG"],version:"v2",certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!1,borrowCrossMargin:!1,borrowIsolatedMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,createDepositAddress:!0,createLimitOrder:!0,createMarketOrder:!0,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTrailingAmountOrder:!0,createTrailingPercentOrder:!1,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchClosedOrder:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:"emulated",fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchLiquidations:!0,fetchMarginMode:!1,fetchMarketLeverageTiers:!1,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!0,fetchOpenInterests:!0,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTickers:!0,fetchTime:!1,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:void 0,fetchTransactions:"emulated",reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!0,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","3h":"3h","4h":"4h","6h":"6h","12h":"12h","1d":"1D","1w":"7D","2w":"14D","1M":"1M"},rateLimit:250,urls:{logo:"https://github.com/user-attachments/assets/4a8e947f-ab46-481a-a8ae-8b20e9b03178",api:{v1:"https://api.bitfinex.com",public:"https://api-pub.bitfinex.com",private:"https://api.bitfinex.com"},www:"https://www.bitfinex.com",doc:["https://docs.bitfinex.com/v2/docs/","https://github.com/bitfinexcom/bitfinex-api-node"],fees:"https://www.bitfinex.com/fees"},api:{public:{get:{"conf/{config}":2.7,"conf/pub:{action}:{object}":2.7,"conf/pub:{action}:{object}:{detail}":2.7,"conf/pub:map:{object}":2.7,"conf/pub:map:{object}:{detail}":2.7,"conf/pub:map:currency:{detail}":2.7,"conf/pub:map:currency:sym":2.7,"conf/pub:map:currency:label":2.7,"conf/pub:map:currency:unit":2.7,"conf/pub:map:currency:undl":2.7,"conf/pub:map:currency:pool":2.7,"conf/pub:map:currency:explorer":2.7,"conf/pub:map:currency:tx:fee":2.7,"conf/pub:map:tx:method":2.7,"conf/pub:list:{object}":2.7,"conf/pub:list:{object}:{detail}":2.7,"conf/pub:list:currency":2.7,"conf/pub:list:pair:exchange":2.7,"conf/pub:list:pair:margin":2.7,"conf/pub:list:pair:futures":2.7,"conf/pub:list:competitions":2.7,"conf/pub:info:{object}":2.7,"conf/pub:info:{object}:{detail}":2.7,"conf/pub:info:pair":2.7,"conf/pub:info:pair:futures":2.7,"conf/pub:info:tx:status":2.7,"conf/pub:fees":2.7,"platform/status":8,tickers:2.7,"ticker/{symbol}":2.7,"tickers/hist":2.7,"trades/{symbol}/hist":2.7,"book/{symbol}/{precision}":1,"book/{symbol}/P0":1,"book/{symbol}/P1":1,"book/{symbol}/P2":1,"book/{symbol}/P3":1,"book/{symbol}/R0":1,"stats1/{key}:{size}:{symbol}:{side}/{section}":2.7,"stats1/{key}:{size}:{symbol}:{side}/last":2.7,"stats1/{key}:{size}:{symbol}:{side}/hist":2.7,"stats1/{key}:{size}:{symbol}/{section}":2.7,"stats1/{key}:{size}:{symbol}/last":2.7,"stats1/{key}:{size}:{symbol}/hist":2.7,"stats1/{key}:{size}:{symbol}:long/last":2.7,"stats1/{key}:{size}:{symbol}:long/hist":2.7,"stats1/{key}:{size}:{symbol}:short/last":2.7,"stats1/{key}:{size}:{symbol}:short/hist":2.7,"candles/trade:{timeframe}:{symbol}:{period}/{section}":2.7,"candles/trade:{timeframe}:{symbol}/{section}":2.7,"candles/trade:{timeframe}:{symbol}/last":2.7,"candles/trade:{timeframe}:{symbol}/hist":2.7,"status/{type}":2.7,"status/deriv":2.7,"status/deriv/{symbol}/hist":2.7,"liquidations/hist":80,"rankings/{key}:{timeframe}:{symbol}/{section}":2.7,"rankings/{key}:{timeframe}:{symbol}/hist":2.7,"pulse/hist":2.7,"pulse/profile/{nickname}":2.7,"funding/stats/{symbol}/hist":10,"ext/vasps":1},post:{"calc/trade/avg":2.7,"calc/fx":2.7}},private:{post:{"auth/r/wallets":2.7,"auth/r/wallets/hist":2.7,"auth/r/orders":2.7,"auth/r/orders/{symbol}":2.7,"auth/w/order/submit":2.7,"auth/w/order/update":2.7,"auth/w/order/cancel":2.7,"auth/w/order/multi":2.7,"auth/w/order/cancel/multi":2.7,"auth/r/orders/{symbol}/hist":2.7,"auth/r/orders/hist":2.7,"auth/r/order/{symbol}:{id}/trades":2.7,"auth/r/trades/{symbol}/hist":2.7,"auth/r/trades/hist":2.7,"auth/r/ledgers/{currency}/hist":2.7,"auth/r/ledgers/hist":2.7,"auth/r/info/margin/{key}":2.7,"auth/r/info/margin/base":2.7,"auth/r/info/margin/sym_all":2.7,"auth/r/positions":2.7,"auth/w/position/claim":2.7,"auth/w/position/increase:":2.7,"auth/r/position/increase/info":2.7,"auth/r/positions/hist":2.7,"auth/r/positions/audit":2.7,"auth/r/positions/snap":2.7,"auth/w/deriv/collateral/set":2.7,"auth/w/deriv/collateral/limits":2.7,"auth/r/funding/offers":2.7,"auth/r/funding/offers/{symbol}":2.7,"auth/w/funding/offer/submit":2.7,"auth/w/funding/offer/cancel":2.7,"auth/w/funding/offer/cancel/all":2.7,"auth/w/funding/close":2.7,"auth/w/funding/auto":2.7,"auth/w/funding/keep":2.7,"auth/r/funding/offers/{symbol}/hist":2.7,"auth/r/funding/offers/hist":2.7,"auth/r/funding/loans":2.7,"auth/r/funding/loans/hist":2.7,"auth/r/funding/loans/{symbol}":2.7,"auth/r/funding/loans/{symbol}/hist":2.7,"auth/r/funding/credits":2.7,"auth/r/funding/credits/hist":2.7,"auth/r/funding/credits/{symbol}":2.7,"auth/r/funding/credits/{symbol}/hist":2.7,"auth/r/funding/trades/{symbol}/hist":2.7,"auth/r/funding/trades/hist":2.7,"auth/r/info/funding/{key}":2.7,"auth/r/info/user":2.7,"auth/r/summary":2.7,"auth/r/logins/hist":2.7,"auth/r/permissions":2.7,"auth/w/token":2.7,"auth/r/audit/hist":2.7,"auth/w/transfer":2.7,"auth/w/deposit/address":24,"auth/w/deposit/invoice":24,"auth/w/withdraw":24,"auth/r/movements/{currency}/hist":2.7,"auth/r/movements/hist":2.7,"auth/r/alerts":5.34,"auth/w/alert/set":2.7,"auth/w/alert/price:{symbol}:{price}/del":2.7,"auth/w/alert/{type}:{symbol}:{price}/del":2.7,"auth/calc/order/avail":2.7,"auth/w/settings/set":2.7,"auth/r/settings":2.7,"auth/w/settings/del":2.7,"auth/r/pulse/hist":2.7,"auth/w/pulse/add":16,"auth/w/pulse/del":2.7}}},fees:{trading:{feeSide:"get",percentage:!0,tierBased:!0,maker:this.parseNumber("0.001"),taker:this.parseNumber("0.002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("500000"),this.parseNumber("0.002")],[this.parseNumber("1000000"),this.parseNumber("0.002")],[this.parseNumber("2500000"),this.parseNumber("0.002")],[this.parseNumber("5000000"),this.parseNumber("0.002")],[this.parseNumber("7500000"),this.parseNumber("0.002")],[this.parseNumber("10000000"),this.parseNumber("0.0018")],[this.parseNumber("15000000"),this.parseNumber("0.0016")],[this.parseNumber("20000000"),this.parseNumber("0.0014")],[this.parseNumber("25000000"),this.parseNumber("0.0012")],[this.parseNumber("30000000"),this.parseNumber("0.001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("500000"),this.parseNumber("0.0008")],[this.parseNumber("1000000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0004")],[this.parseNumber("5000000"),this.parseNumber("0.0002")],[this.parseNumber("7500000"),this.parseNumber("0")],[this.parseNumber("10000000"),this.parseNumber("0")],[this.parseNumber("15000000"),this.parseNumber("0")],[this.parseNumber("20000000"),this.parseNumber("0")],[this.parseNumber("25000000"),this.parseNumber("0")],[this.parseNumber("30000000"),this.parseNumber("0")]]}},funding:{withdraw:{}}},precisionMode:o.v,options:{precision:"R0",exchangeTypes:{MARKET:"market","EXCHANGE MARKET":"market",LIMIT:"limit","EXCHANGE LIMIT":"limit","EXCHANGE STOP":"market","EXCHANGE FOK":"limit","EXCHANGE STOP LIMIT":"limit","EXCHANGE IOC":"limit"},orderTypes:{market:"EXCHANGE MARKET",limit:"EXCHANGE LIMIT"},fiat:{USD:"USD",EUR:"EUR",JPY:"JPY",GBP:"GBP",CHN:"CHN"},v2AccountsByType:{spot:"exchange",exchange:"exchange",funding:"funding",margin:"margin",derivatives:"margin",future:"margin",swap:"margin"},withdraw:{includeFee:!1},networks:{BTC:"BITCOIN",LTC:"LITECOIN",ERC20:"ETHEREUM",OMNI:"TETHERUSO",LIQUID:"TETHERUSL",TRC20:"TETHERUSX",EOS:"TETHERUSS",AVAX:"TETHERUSDTAVAX",SOL:"TETHERUSDTSOL",ALGO:"TETHERUSDTALG",BCH:"TETHERUSDTBCH",KSM:"TETHERUSDTKSM",DVF:"TETHERUSDTDVF",OMG:"TETHERUSDTOMG"},networksById:{TETHERUSE:"ERC20"}},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!0,marketBuyRequiresPrice:!1,marketBuyByCost:!0,selfTradePrevention:!1,iceberg:!1},createOrders:{max:75},fetchMyTrades:{marginMode:!1,limit:2500,daysBack:void 0,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:void 0,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e4}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{11010:s.RateLimitExceeded,10001:s.PermissionDenied,10020:s.BadRequest,10100:s.AuthenticationError,10114:s.InvalidNonce,20060:s.OnMaintenance,temporarily_unavailable:s.ExchangeNotAvailable},broad:{"available balance is only":s.InsufficientFunds,"not enough exchange balance":s.InsufficientFunds,"Order not found":s.OrderNotFound,"symbol: invalid":s.BadSymbol}},commonCurrencies:{UST:"USDT",EUTF0:"EURT",USTF0:"USDT",ALG:"ALGO",AMP:"AMPL",ATO:"ATOM",BCHABC:"XEC",BCHN:"BCH",DAT:"DATA",DOG:"MDOGE",DSH:"DASH",EDO:"PNT",EUS:"EURS",EUT:"EURT",HTX:"HT",IDX:"ID",IOT:"IOTA",IQX:"IQ",LUNA:"LUNC",LUNA2:"LUNA",MNA:"MANA",ORS:"ORS Group",PAS:"PASS",QSH:"QASH",QTM:"QTUM",RBT:"RBTC",SNG:"SNGLS",STJ:"STORJ",TERRAUST:"USTC",TSD:"TUSD",YGG:"YEED",YYW:"YOYOW",UDC:"USDC",VSY:"VSYS",WAX:"WAXP",XCH:"XCHF",ZBT:"ZB"}})}isFiat(e){return e in this.options.fiat}getCurrencyId(e){return"f"+e}getCurrencyName(e){if(e in this.options.currencyNames)return this.options.currencyNames[e];throw new s.NotSupported(this.id+" "+e+" not supported for withdrawal")}amountToPrecision(e,t){return e=this.safeSymbol(e),this.decimalToPrecision(t,o.R3,this.markets[e].precision.amount,o.fv)}priceToPrecision(e,t){return e=this.safeSymbol(e),t=this.decimalToPrecision(t,o.D_,this.markets[e].precision.price,this.precisionMode),this.decimalToPrecision(t,o.R3,8,o.fv)}async fetchStatus(e={}){const t=await this.publicGetPlatformStatus(e),i=this.safeString(t,0);return{status:this.safeString({0:"maintenance",1:"ok"},i,i),updated:void 0,eta:void 0,url:void 0,info:t}}async fetchMarkets(e={}){const t=this.publicGetConfPubInfoPair(e),i=this.publicGetConfPubInfoPairFutures(e),s=this.publicGetConfPubListPairMargin(e);let[r,a,o]=await Promise.all([t,i,s]);r=this.safeList(r,0,[]),a=this.safeList(a,0,[]);const n=this.arrayConcat(r,a);o=this.safeValue(o,0,[]);const d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeStringUpper(t,0),s=this.safeValue(t,1,{});let r=!0;i.indexOf("F0")>=0&&(r=!1);const a=!r;let h,c;if(i.indexOf(":")>=0){const e=i.split(":");h=e[0],c=e[1]}else h=i.slice(0,3),c=i.slice(3,6);let l=this.safeCurrencyCode(h),u=this.safeCurrencyCode(c);const f=l.split("F0"),p=u.split("F0");l=this.safeString(f,0),u=this.safeString(p,0);let m,g,v=l+"/"+u;h=this.getCurrencyId(h),c=this.getCurrencyId(c),a&&(m=u,g=u,v=v+":"+m);const y=this.safeString(s,3),w=this.safeString(s,4);let b=!1;r&&this.inArray(i,o)&&(b=!0),d.push({id:"t"+i,symbol:v,base:l,quote:u,settle:m,baseId:h,quoteId:c,settleId:g,type:r?"spot":"swap",spot:r,margin:b,swap:a,future:!1,option:!1,active:!0,contract:a,linear:!!a||void 0,inverse:!a&&void 0,contractSize:a?this.parseNumber("1"):void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:parseInt("8"),price:parseInt("5")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber(y),max:this.parseNumber(w)},price:{min:this.parseNumber("1e-8"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:s})}return d}async fetchCurrencies(e={}){const t={config:["pub:list:currency","pub:map:currency:sym","pub:map:currency:label","pub:map:currency:unit","pub:map:currency:undl","pub:map:currency:pool","pub:map:currency:explorer","pub:map:currency:tx:fee","pub:map:tx:method"].join(",")},i=await this.publicGetConfConfig(this.extend(t,e)),s={sym:this.indexBy(this.safeValue(i,1,[]),0),label:this.indexBy(this.safeValue(i,2,[]),0),unit:this.indexBy(this.safeValue(i,3,[]),0),undl:this.indexBy(this.safeValue(i,4,[]),0),pool:this.indexBy(this.safeValue(i,5,[]),0),explorer:this.indexBy(this.safeValue(i,6,[]),0),fees:this.indexBy(this.safeValue(i,7,[]),0)},r=this.safeValue(i,0,[]),a={};for(let e=0;e<r.length;e++){const t=r[e];if(t.indexOf("F0")>=0)continue;const o=this.safeCurrencyCode(t),n=this.safeValue(s.label,t,[]),d=this.safeString(n,1),h=this.safeValue(s.pool,t,[]);let c;(void 0!==this.safeString(h,1)||t in s.explorer)&&(c="crypto");const l=this.safeValue(s.fees,t,[]),u=this.safeValue(l,1,[]),f=this.safeNumber(u,1),p=this.safeValue(s.undl,t,[]),m="8",g="f"+t;a[o]={id:g,uppercaseId:t,code:o,info:[t,n,h,l,p],type:c,name:d,active:!0,deposit:void 0,withdraw:void 0,fee:f,precision:parseInt(m),limits:{amount:{min:this.parseNumber(this.parsePrecision(m)),max:void 0},withdraw:{min:f,max:void 0}},networks:{}};const v={},y=this.safeValue(i,8,[]),w=t.replace("F0","");for(let e=0;e<y.length;e++){const t=y[e],i=this.safeString(t,0);if(this.safeString(this.safeValue(t,1,[]),0)===w){v[this.networkIdToCode(i)]={info:i,id:i.toLowerCase(),network:i,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:void 0,limits:{withdraw:{min:void 0,max:void 0}}}}}Object.keys(v).length>0&&(a[o].networks=v)}return a}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeValue(this.options,"v2AccountsByType",{}),i=this.safeString(e,"type","exchange"),r=this.safeString(t,i,i);if(void 0===r){const e=Object.keys(t);throw new s.ExchangeError(this.id+" fetchBalance() type parameter must be one of "+e.join(", "))}const a="derivatives"===i,o=this.omit(e,"type"),n=await this.privatePostAuthRWallets(o),d={info:n};for(let e=0;e<n.length;e++){const t=n[e],i=this.account(),s=this.safeString(t,3);"0"!==s&&(i.debt=s);const o=this.safeString(t,0),h=this.safeStringLower(t,1,""),c=h.length-2,l="f0"===h.slice(c);if(r===o&&(!a||l)){const e=this.safeCurrencyCode(h);i.total=this.safeString(t,2),i.free=this.safeString(t,4),d[e]=i}}return this.safeBalance(d)}async transfer(e,t,i,r,a={}){await this.loadMarkets();const o=this.safeValue(this.options,"v2AccountsByType",{}),n=this.safeString(o,i);if(void 0===n){const e=Object.keys(o);throw new s.ArgumentsRequired(this.id+" transfer() fromAccount must be one of "+e.join(", "))}const d=this.safeString(o,r);if(void 0===d){const e=Object.keys(o);throw new s.ArgumentsRequired(this.id+" transfer() toAccount must be one of "+e.join(", "))}const h=this.currency(e),c=this.convertDerivativesId(h,i),l=this.convertDerivativesId(h,r),u={amount:this.currencyToPrecision(e,t),currency:c,currency_to:l,from:n,to:d},f=await this.privatePostAuthWTransfer(this.extend(u,a));if("error"===this.safeString(f,0)){const e=this.safeString(f,2,"");throw this.throwExactlyMatchedException(this.exceptions.exact,e,this.id+" "+e),new s.ExchangeError(this.id+" "+e)}return this.parseTransfer({result:f},h)}parseTransfer(e,t=void 0){const i=this.safeList(e,"result"),s=this.safeInteger(i,0),r=this.safeValue(i,4),a=this.safeString(r,1),o=this.safeString(r,2),n=this.safeString(r,5),d=this.safeString(i,6);return{id:void 0,timestamp:s,datetime:this.iso8601(s),status:this.parseTransferStatus(d),amount:this.safeNumber(r,7),currency:this.safeCurrencyCode(n,t),fromAccount:a,toAccount:o,info:i}}parseTransferStatus(e){return this.safeString({SUCCESS:"ok",ERROR:"failed",FAILURE:"failed"},e,e)}convertDerivativesId(e,t){const i=this.safeValue(e,"info"),s=this.safeString(i,0),r=this.safeValue(i,4,[]);let a;if("derivatives"===t){a=this.safeString(r,0,s);const e=a.length-2;"F0"===a.slice(e)||(a+="F0")}else a="margin"!==t?this.safeString(r,1,s):s;return a}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue(this.options,"precision","R0"),a=this.market(e),o={symbol:a.id,precision:s};void 0!==t&&(o.len=t);const n=this.extend(o,i),d=await this.publicGetBookSymbolPrecision(n),h=this.milliseconds(),c={symbol:a.symbol,bids:[],asks:[],timestamp:h,datetime:this.iso8601(h),nonce:void 0},l="R0"===n.precision?1:0;for(let e=0;e<d.length;e++){const t=d[e],i=this.safeNumber(t,l),s=this.safeString(t,2),a=r.Y.stringAbs(s);c[r.Y.stringGt(s,"0")?"bids":"asks"].push([i,this.parseNumber(a)])}return c.bids=this.sortBy(c.bids,0,!0),c.asks=this.sortBy(c.asks,0),c}parseTicker(e,t=void 0){const i=this.safeList(e,"result"),s=this.safeSymbol(void 0,t),a=i.length,o=this.safeString(i,a-4),n=this.safeString(i,a-5);return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:this.safeString(i,a-2),low:this.safeString(i,a-1),bid:this.safeString(i,a-10),bidVolume:this.safeString(i,a-9),ask:this.safeString(i,a-8),askVolume:this.safeString(i,a-7),vwap:void 0,open:void 0,close:o,last:o,previousClose:void 0,change:this.safeString(i,a-6),percentage:r.Y.stringMul(n,"100"),average:void 0,baseVolume:this.safeString(i,a-3),quoteVolume:void 0,info:i},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==(e=this.marketSymbols(e))){const t=this.marketIds(e);i.symbols=t.join(",")}else i.symbols="ALL";const s=await this.publicGetTickers(this.extend(i,t)),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,0),a=this.safeMarket(i);r[a.symbol]=this.parseTicker({result:t},a)}return this.filterByArrayTickers(r,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r={result:await this.publicGetTickerSymbol(this.extend(s,t))};return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.safeList(e,"result",[]),s=i.length>5,a=this.safeString(i,0),o=s?4:2;let n,d=this.safeString(i,o);const h=s?5:3,c=this.safeString(i,h);let l,u,f,p;"-"===d[0]?(n="sell",d=r.Y.stringAbs(d)):n="buy";let m=this.safeSymbol(void 0,t);const g=s?2:1,v=this.safeInteger(i,g);if(s){const e=i[1];m=this.safeSymbol(e),l=this.safeString(i,3);u=1===this.safeInteger(i,8)?"maker":"taker";let t=this.safeString(i,9);t=r.Y.stringNeg(t);const s=this.safeString(i,10);p={cost:t,currency:this.safeCurrencyCode(s)};const a=i[6];f=this.safeString(this.options.exchangeTypes,a)}return this.safeTrade({id:a,timestamp:v,datetime:this.iso8601(v),symbol:m,order:l,side:n,type:f,takerOrMaker:u,price:c,amount:d,cost:void 0,fee:p,info:i},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s,1e4);const a=this.market(e);let o="-1",n={symbol:a.id};void 0!==t&&(n.start=t,o="1"),void 0!==i&&(n.limit=Math.min(i,1e4)),n.sort=o,[n,s]=this.handleUntilOption("end",n,s);const d=await this.publicGetTradesSymbolHist(this.extend(n,s)),h=this.sortBy(d,1),c=[];for(let e=0;e<h.length;e++)c.push({result:h[e]});return this.parseTrades(c,a,void 0,i)}async fetchOHLCV(e,t="1m",i=void 0,s=100,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e4);const o=this.market(e);s=void 0===s?1e4:Math.min(s,1e4);let n={symbol:o.id,timeframe:this.safeString(this.timeframes,t,t),sort:1,limit:s};void 0!==i&&(n.start=i),[n,r]=this.handleUntilOption("end",n,r);const d=await this.publicGetCandlesTradeTimeframeSymbolHist(this.extend(n,r));return this.parseOHLCVs(d,o,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}parseOrderStatus(e){if(void 0===e)return e;const t=e.split(" "),i=this.safeString(t,0);return this.safeString({ACTIVE:"open",PARTIALLY:"open",EXECUTED:"closed",CANCELED:"canceled",INSUFFICIENT:"canceled","POSTONLY CANCELED":"canceled",RSN_DUST:"rejected",RSN_PAUSE:"rejected","IOC CANCELED":"canceled","FILLORKILL CANCELED":"canceled"},i,e)}parseOrderFlags(e){return this.safeValue({1024:["reduceOnly"],4096:["postOnly"],5120:["reduceOnly","postOnly"]},e,void 0)}parseTimeInForce(e){return this.safeString({"EXCHANGE IOC":"IOC","EXCHANGE FOK":"FOK",IOC:"IOC",FOK:"FOK"},e,"GTC")}parseOrder(e,t=void 0){const i=this.safeList(e,"result"),s=this.safeString(i,0),a=this.safeString(i,3),o=this.safeSymbol(a),n=this.safeInteger(i,5),d=r.Y.stringAbs(this.safeString(i,6)),h=this.safeString(i,7),c=r.Y.stringAbs(h),l=r.Y.stringLt(h,"0")?"sell":"buy",u=this.safeString(i,8),f=this.safeString(this.safeValue(this.options,"exchangeTypes"),u),p=this.parseTimeInForce(u),m=this.safeString(i,12),g=this.parseOrderFlags(m);let v=!1;if(void 0!==g)for(let e=0;e<g.length;e++)"postOnly"===g[e]&&(v=!0);let y,w,b=this.safeString(i,16);"EXCHANGE STOP"!==u&&"EXCHANGE STOP LIMIT"!==u||(b=void 0,y=this.safeString(i,16),"EXCHANGE STOP LIMIT"===u&&(b=this.safeString(i,19)));const k=this.safeString(i,13);if(void 0!==k){const e=k.split(" @ ");w=this.parseOrderStatus(this.safeString(e,0))}const S=this.safeString(i,17),O=this.safeString(i,2);return this.safeOrder({info:i,id:s,clientOrderId:O,timestamp:n,datetime:this.iso8601(n),lastTradeTimestamp:void 0,symbol:o,type:f,timeInForce:p,postOnly:v,side:l,price:b,triggerPrice:y,amount:c,cost:void 0,average:S,filled:void 0,remaining:d,status:w,fee:void 0,trades:void 0},t)}createOrderRequest(e,t,i,a,o=void 0,n={}){const d=this.market(e);let h=this.amountToPrecision(e,a);h="buy"===i?h:r.Y.stringNeg(h);const c={symbol:d.id,amount:h},l=this.safeString2(n,"stopPrice","triggerPrice"),u=this.safeString(n,"trailingAmount"),f=this.safeString(n,"timeInForce"),p=this.safeBool(n,"postOnly",!1),m=this.safeBool(n,"reduceOnly",!1),g=this.safeValue2(n,"cid","clientOrderId");let v=t.toUpperCase();void 0!==u?(v="TRAILING STOP",c.price_trailing=u):void 0!==l&&(c.price=this.priceToPrecision(e,l),"limit"===t?(v="STOP LIMIT",c.price_aux_limit=this.priceToPrecision(e,o)):v="STOP");const y="IOC"===f,w="FOK"===f,b=p||"PO"===f;if((y||w)&&void 0===o)throw new s.InvalidOrder(this.id+" createOrder() requires a price argument with IOC and FOK orders");if((y||w)&&"market"===t)throw new s.InvalidOrder(this.id+" createOrder() does not allow market IOC and FOK orders");let k;"market"!==t&&void 0===l&&(c.price=this.priceToPrecision(e,o)),y?v="IOC":w&&(v="FOK"),[k,n]=this.handleMarginModeAndParams("createOrder",n),d.spot&&void 0===k&&(v="EXCHANGE "+v),c.type=v;let S=0;return b&&(S=this.sum(S,4096)),m&&(S=this.sum(S,1024)),0!==S&&(c.flags=S),void 0!==g&&(c.cid=g),n=this.omit(n,["triggerPrice","stopPrice","timeInForce","postOnly","reduceOnly","trailingAmount","clientOrderId"]),this.extend(c,n)}async createOrder(e,t,i,r,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=this.createOrderRequest(e,t,i,r,a,o),h=await this.privatePostAuthWOrderSubmit(d);if("SUCCESS"!==this.safeString(h,6)){const e=h[5],t=h[7];throw new s.ExchangeError(this.id+" "+h[6]+": "+t+" (#"+e+")")}const c=this.safeList(h,4,[]),l={result:this.safeList(c,0)};return this.parseOrder(l,n)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.safeString(s,"type"),o=this.safeString(s,"side"),n=this.safeNumber(s,"amount"),d=this.safeNumber(s,"price"),h=this.safeDict(s,"params",{}),c=this.createOrderRequest(r,a,o,n,d,h);i.push(["on",c])}const s={ops:i},r=await this.privatePostAuthWOrderMulti(s),a=[],o=this.safeList(r,4,[]);for(let e=0;e<o.length;e++){const t=o[e][4];a.push({result:t[0]})}return this.parseOrders(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostAuthWOrderCancelMulti(this.extend({all:1},t)),s=this.safeList(i,4,[]),r=[];for(let e=0;e<s.length;e++)r.push({result:s[e]});return this.parseOrders(r)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const r=this.safeValue2(i,"cid","clientOrderId");let a,o;if(void 0!==t&&(o=this.market(t)),void 0!==r){const e=this.safeValue(i,"cidDate");if(void 0===e)throw new s.InvalidOrder(this.id+" canceling an order by clientOrderId ('cid') requires both 'cid' and 'cid_date' ('YYYY-MM-DD')");a={cid:r,cid_date:e},i=this.omit(i,["cid","clientOrderId"])}else a={id:parseInt(e)};const n=await this.privatePostAuthWOrderCancel(this.extend(a,i)),d={result:this.safeValue(n,4)};return this.parseOrder(d,o)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();for(let t=0;t<e.length;t++)e[t]=this.parseToNumeric(e[t]);const s={id:e};let r;void 0!==t&&(r=this.market(t));const a=await this.privatePostAuthWOrderCancelMulti(this.extend(s,i)),o=this.safeList(a,4,[]),n=[];for(let e=0;e<o.length;e++)n.push({result:o[e]});return this.parseOrders(n,r)}async fetchOpenOrder(e,t=void 0,i={}){const r={id:[parseInt(e)]},a=await this.fetchOpenOrders(t,void 0,void 0,this.extend(r,i)),o=this.safeValue(a,0);if(void 0===o)throw new s.OrderNotFound(this.id+" order "+e+" not found");return o}async fetchClosedOrder(e,t=void 0,i={}){const r={id:[parseInt(e)]},a=await this.fetchClosedOrders(t,void 0,void 0,this.extend(r,i)),o=this.safeValue(a,0);if(void 0===o)throw new s.OrderNotFound(this.id+" order "+e+" not found");return o}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0===e?o=await this.privatePostAuthROrders(this.extend(r,s)):(a=this.market(e),r.symbol=a.id,o=await this.privatePostAuthROrdersSymbol(this.extend(r,s)));const n=[];for(let e=0;e<o.length;e++)n.push({result:o[e]});return this.parseOrders(n,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s);let a,o,n={};void 0!==t&&(n.start=t),void 0!==i&&(n.limit=i),[n,s]=this.handleUntilOption("end",n,s),void 0===e?o=await this.privatePostAuthROrdersHist(this.extend(n,s)):(a=this.market(e),n.symbol=a.id,o=await this.privatePostAuthROrdersSymbolHist(this.extend(n,s)));const d=[];for(let e=0;e<o.length;e++)d.push({result:o[e]});return this.parseOrders(d,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,r=void 0,a={}){if(void 0===t)throw new s.ArgumentsRequired(this.id+" fetchOrderTrades() requires a symbol argument");await this.loadMarkets();const o=this.market(t),n={id:parseInt(e),symbol:o.id},d=await this.privatePostAuthROrderSymbolIdTrades(this.extend(n,a)),h=[];for(let e=0;e<d.length;e++)h.push({result:d[e]});return this.parseTrades(h,o,i,r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={end:this.milliseconds()};let o;void 0!==t&&(a.start=t),void 0!==i&&(a.limit=i),void 0!==e?(r=this.market(e),a.symbol=r.id,o=await this.privatePostAuthRTradesSymbolHist(this.extend(a,s))):o=await this.privatePostAuthRTradesHist(this.extend(a,s));const n=[];for(let e=0;e<o.length;e++)n.push({result:o[e]});return this.parseTrades(n,r,t,i)}async createDepositAddress(e,t={}){await this.loadMarkets();return await this.fetchDepositAddress(e,this.extend({op_renew:1},t))}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),r=this.safeString(t,"network",e),a=this.safeValue(i,"networks",{}),o=this.safeValue(a,r),n=this.safeString(o,"id");if(void 0===n)throw new s.ArgumentsRequired(this.id+" fetchDepositAddress() could not find a network for '"+e+"'. You can specify it by providing the 'network' value inside params");const d=this.safeString(t,"wallet","exchange");t=this.omit(t,"network","wallet");const h={method:n,wallet:d,op_renew:0},c=await this.privatePostAuthWDepositAddress(this.extend(h,t)),l=this.safeValue(c,4,[]),u=this.safeString(l,5),f=void 0===u?this.safeString(l,4):u,p=void 0===u?void 0:this.safeString(l,4);return this.checkAddress(f),{currency:e,address:f,tag:p,network:void 0,info:c}}parseTransactionStatus(e){return this.safeString({SUCCESS:"ok",COMPLETED:"ok",ERROR:"failed",FAILURE:"failed",CANCELED:"canceled","PENDING APPROVAL":"pending",PENDING:"pending","PENDING REVIEW":"pending","PENDING CANCELLATION":"pending",SENDING:"pending","USER APPROVED":"pending"},e,e)}parseTransaction(e,t=void 0){const i=e.length;let s,a,o,n,d,h,c,l,u,f,p,m,g;if(8===i){const i=this.safeValue(e,4,[]);s=this.safeInteger(e,0),void 0!==t&&(o=t.code),u=this.safeString(i,8),void 0!==u&&(u=r.Y.stringAbs(u)),n=this.safeNumber(i,5),d=this.safeInteger(i,0),h="ok",0===d&&(d=void 0,h="failed"),c=this.safeString(i,3),l="withdrawal";const a=this.safeString(i,2);m=this.networkIdToCode(a.toUpperCase())}else if(22===i){d=this.safeString(e,0);const i=this.safeString(e,1);o=this.safeCurrencyCode(i,t);const c=this.safeString(e,2);m=this.networkIdToCode(c),s=this.safeInteger(e,5),a=this.safeInteger(e,6),h=this.parseTransactionStatus(this.safeString(e,9));const v=this.safeString(e,12);n=r.Y.stringAbs(v),void 0!==v&&(l=r.Y.stringLt(v,"0")?"withdrawal":"deposit"),u=this.safeString(e,13),void 0!==u&&(u=r.Y.stringAbs(u)),p=this.safeString(e,16),f=this.safeString(e,20),g=this.safeString(e,21)}return{info:e,id:d,txid:f,type:l,currency:o,network:m,amount:this.parseNumber(n),status:h,timestamp:s,datetime:this.iso8601(s),address:p,addressFrom:void 0,addressTo:p,tag:c,tagFrom:void 0,tagTo:c,updated:a,comment:g,internal:void 0,fee:{currency:o,cost:this.parseNumber(u),rate:void 0}}}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostAuthRSummary(e),i={},s=this.safeValue(this.options,"fiat",{}),r=this.safeValue(t,4,[]),a=this.safeValue(r,0,[]),o=this.safeValue(r,1,[]),n=this.safeNumber(a,0),d=this.safeNumber(a,2),h=this.safeNumber(a,5),c=this.safeNumber(o,0),l=this.safeNumber(o,2),u=this.safeNumber(o,5);for(let e=0;e<this.symbols.length;e++){const r=this.symbols[e],a=this.market(r),o={info:t,symbol:r,percentage:!0,tierBased:!0};a.quote in s?(o.maker=d,o.taker=l):a.contract?(o.maker=h,o.taker=u):(o.maker=n,o.taker=c),i[r]=o}return i}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let o;return void 0!==t&&(a.start=t),void 0!==i&&(a.limit=i),void 0!==e?(r=this.currency(e),a.currency=r.uppercaseId,o=await this.privatePostAuthRMovementsCurrencyHist(this.extend(a,s))):o=await this.privatePostAuthRMovementsHist(this.extend(a,s)),this.parseTransactions(o,r,t,i)}async withdraw(e,t,i,r=void 0,a={}){this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n=this.safeString(a,"network",e);a=this.omit(a,"network");const d=this.safeValue(o,"networks",{}),h=this.safeValue(d,n),c=this.safeString(h,"id");if(void 0===c)throw new s.ArgumentsRequired(this.id+" withdraw() could not find a network for '"+e+"'. You can specify it by providing the 'network' value inside params");const l=this.safeString(a,"wallet","exchange");a=this.omit(a,"network","wallet");const u={method:c,wallet:l,amount:this.numberToString(t),address:i};void 0!==r&&(u.payment_id=r);const f=this.safeValue(this.options,"withdraw",{});this.safeBool(f,"includeFee",!1)&&(u.fee_deduct=1);const p=await this.privatePostAuthWWithdraw(this.extend(u,a));if("error"===this.safeString(p,0)){const e=this.id+" "+p,t=this.safeString(p,2,"");throw this.throwExactlyMatchedException(this.exceptions.exact,t,e),this.throwBroadlyMatchedException(this.exceptions.broad,t,e),new s.ExchangeError(e)}const m=this.safeString(p,7);return"success"!==m&&this.throwBroadlyMatchedException(this.exceptions.broad,m,m),this.parseTransaction(p,o)}async fetchPositions(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.privatePostAuthRPositions(t),s=[];for(let e=0;e<i.length;e++)s.push({result:i[e]});return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=this.safeList(e,"result"),s=this.safeString(i,0),a=this.safeString(i,2),o=this.safeInteger(i,12),n=this.safeString(i,19),d=this.safeString(n,"trade_price"),h=this.safeString(n,"trade_amount");return this.safePosition({info:i,id:this.safeString(i,11),symbol:this.safeSymbol(s,t),notional:this.parseNumber(a),marginMode:"isolated",liquidationPrice:this.safeNumber(i,8),entryPrice:this.safeNumber(i,3),unrealizedPnl:this.safeNumber(i,6),percentage:this.safeNumber(i,7),contracts:void 0,contractSize:void 0,markPrice:void 0,lastPrice:void 0,side:r.Y.stringGt(a,"0")?"long":"short",hedged:void 0,timestamp:o,datetime:this.iso8601(o),lastUpdateTimestamp:this.safeInteger(i,13),maintenanceMargin:this.safeNumber(i,18),maintenanceMarginPercentage:void 0,collateral:this.safeNumber(i,17),initialMargin:this.parseNumber(r.Y.stringMul(h,d)),initialMarginPercentage:void 0,leverage:this.safeNumber(i,9),marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));o="v1"===t?t+o:this.version+o;let h=this.urls.api[t]+"/"+o;if("public"===t&&Object.keys(d).length&&(h+="?"+this.urlencode(d)),"private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t="/api/"+o+e+(a=this.json(d)),i=this.hmac(this.encode(t),this.encode(this.secret),n.qt);r={"bfx-nonce":e,"bfx-apikey":this.apiKey,"bfx-signature":i,"Content-Type":"application/json"}}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,r,a,o,n,d,h){if(void 0!==n){if(!Array.isArray(n)){const e=this.safeString2(n,"message","error"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,t),this.throwBroadlyMatchedException(this.exceptions.broad,e,t),new s.ExchangeError(this.id+" "+o)}}else if(""===n)throw new s.ExchangeError(this.id+" returned empty response");if(429===e)throw new s.RateLimitExceeded(this.id+" "+o);if(500===e){const e=this.safeString(n,1,""),t=this.safeString(n,2,""),i=this.id+" "+t;throw this.throwBroadlyMatchedException(this.exceptions.broad,t,i),this.throwExactlyMatchedException(this.exceptions.exact,e,i),this.throwExactlyMatchedException(this.exceptions.exact,t,i),new s.ExchangeError(this.id+" "+t+" (#"+e+")")}return n}parseLedgerEntryType(e){return void 0===e?void 0:e.indexOf("fee")>=0||e.indexOf("charged")>=0?"fee":e.indexOf("rebate")>=0?"rebate":e.indexOf("deposit")>=0||e.indexOf("withdrawal")>=0?"transaction":e.indexOf("transfer")>=0?"transfer":e.indexOf("payment")>=0?"payout":e.indexOf("exchange")>=0||e.indexOf("position")>=0?"trade":e}parseLedgerEntry(e,t=void 0){const i=this.safeList(e,"result",[]);let s;const r=this.safeString(i,0),a=this.safeString(i,1),o=this.safeCurrencyCode(a,t);t=this.safeCurrency(a,t);const n=this.safeInteger(i,3),d=this.safeNumber(i,5),h=this.safeNumber(i,6),c=this.safeString(i,8);if(void 0!==c){const e=c.split(" @ "),t=this.safeStringLower(e,0);s=this.parseLedgerEntryType(t)}return this.safeLedgerEntry({info:e,id:r,direction:void 0,account:void 0,referenceId:r,referenceAccount:void 0,type:s,currency:o,amount:d,timestamp:n,datetime:this.iso8601(n),before:void 0,after:h,status:void 0,fee:void 0},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s,2500);let o,n={};void 0!==t&&(n.start=t),void 0!==i&&(n.limit=i),[n,s]=this.handleUntilOption("end",n,s),void 0!==e?(r=this.currency(e),n.currency=r.uppercaseId,o=await this.privatePostAuthRLedgersCurrencyHist(this.extend(n,s))):o=await this.privatePostAuthRLedgersHist(this.extend(n,s));const d=[];for(let e=0;e<o.length;e++){const t=o[e];d.push({result:t})}return this.parseLedger(d,r,t,i)}async fetchFundingRates(e=void 0,t={}){if(void 0===e)throw new s.ArgumentsRequired(this.id+" fetchFundingRates() requires a symbols argument");await this.loadMarkets();const i={keys:this.marketIds(e).join(",")},r=await this.publicGetStatusDeriv(this.extend(i,t));return this.parseFundingRates(r,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,r={}){if(void 0===e)throw new s.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",r,5e3);const o=this.market(e);let n={symbol:o.id};void 0!==t&&(n.start=t),[n,r]=this.handleUntilOption("end",n,r);const d=await this.publicGetStatusDerivSymbolHist(this.extend(n,r)),h=[];for(let e=0;e<d.length;e++){const t=d[e],i=this.parseFundingRateHistory(t,o);h.push(i)}const c=[],l=this.filterBySymbolSinceLimit(h,e,t,i),u=l.length;for(let e=0;e<u;e++){const t=l[u-e-1];c.push(t)}return c}parseFundingRate(e,t=void 0){const i=this.safeString(e,0),s=this.safeInteger(e,1),r=this.safeInteger(e,8);return{info:e,symbol:this.safeSymbol(i,t),markPrice:this.safeNumber(e,15),indexPrice:this.safeNumber(e,3),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:s,datetime:this.iso8601(s),fundingRate:this.safeNumber(e,12),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:this.safeNumber(e,9),nextFundingTimestamp:r,nextFundingDatetime:this.iso8601(r),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}parseFundingRateHistory(e,t=void 0){const i=this.safeInteger(e,0),s=this.safeInteger(e,7);return{info:e,symbol:this.safeSymbol(void 0,t),markPrice:this.safeNumber(e,14),indexPrice:this.safeNumber(e,2),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:i,datetime:this.iso8601(i),fundingRate:this.safeNumber(e,11),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:this.safeNumber(e,8),nextFundingTimestamp:s,nextFundingDatetime:this.iso8601(s),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0}}async fetchOpenInterests(e=void 0,t={}){await this.loadMarkets();let i=["ALL"];void 0!==(e=this.marketSymbols(e))&&(i=this.marketIds(e));const s={keys:i.join(",")},r=await this.publicGetStatusDeriv(this.extend(s,t));return this.parseOpenInterests(r,e)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e),s={keys:i.id},r=await this.publicGetStatusDeriv(this.extend(s,t)),a=this.safeList(r,0);return this.parseOpenInterest(a,i)}async fetchOpenInterestHistory(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOpenInterestHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOpenInterestHistory",e,i,s,"8h",r,5e3);const o=this.market(e);let n={symbol:o.id};void 0!==i&&(n.start=i),void 0!==s&&(n.limit=s),[n,r]=this.handleUntilOption("end",n,r);const d=await this.publicGetStatusDerivSymbolHist(this.extend(n,r));return this.parseOpenInterestsHistory(d,o,i,s)}parseOpenInterest(e,t=void 0){const i=23===e.length?17:18,s=this.safeInteger(e,1),r=this.safeString(e,0);return this.safeOpenInterest({symbol:this.safeSymbol(r,t,void 0,"swap"),openInterestAmount:this.safeNumber(e,i),openInterestValue:void 0,timestamp:s,datetime:this.iso8601(s),info:e},t)}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLiquidations","paginate"),r)return await this.fetchPaginatedCallDeterministic("fetchLiquidations",e,t,i,"8h",s,500);const a=this.market(e);let o={};void 0!==t&&(o.start=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("end",o,s);const n=await this.publicGetLiquidationsHist(this.extend(o,s));return this.parseLiquidations(n,a,t,i)}parseLiquidation(e,t=void 0){const i=e[0],s=this.safeInteger(i,2),a=this.safeString(i,4),o=r.Y.stringAbs(this.safeString(i,5)),n=this.safeString(t,"contractSize"),d=r.Y.stringMul(o,n),h=this.safeString(i,11);return this.safeLiquidation({info:i,symbol:this.safeSymbol(a,t,void 0,"contract"),contracts:this.parseNumber(o),contractSize:this.parseNumber(n),price:this.parseNumber(h),baseValue:this.parseNumber(d),quoteValue:this.parseNumber(r.Y.stringMul(d,h)),timestamp:s,datetime:this.iso8601(s)})}async setMargin(e,t,i={}){await this.loadMarkets();const r=this.market(e);if(!r.swap)throw new s.NotSupported(this.id+" setMargin() only support swap markets");const a={symbol:r.id,collateral:this.parseToNumeric(t)},o=await this.privatePostAuthWDerivCollateralSet(this.extend(a,i)),n=this.safeValue(o,0);return this.parseMarginModification(n,r)}parseMarginModification(e,t=void 0){const i=1===e[0]?"ok":"failed";return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:void 0,status:i,timestamp:void 0,datetime:void 0}}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:[this.parseToNumeric(e)]};let r,a;void 0===t?a=await this.privatePostAuthROrders(this.extend(s,i)):(r=this.market(t),s.symbol=r.id,a=await this.privatePostAuthROrdersSymbol(this.extend(s,i)));const o={result:this.safeList(a,0)};return this.parseOrder(o,r)}async editOrder(e,t,i,a,o=void 0,n=void 0,d={}){await this.loadMarkets();const h=this.market(t),c={id:this.parseToNumeric(e)};if(void 0!==o){let e=this.amountToPrecision(t,o);e="buy"===a?e:r.Y.stringNeg(e),c.amount=e}const l=this.safeString2(d,"stopPrice","triggerPrice"),u=this.safeString(d,"trailingAmount"),f=this.safeString(d,"timeInForce"),p=this.safeBool(d,"postOnly",!1),m=this.safeBool(d,"reduceOnly",!1),g=this.safeInteger2(d,"cid","clientOrderId");void 0!==u?c.price_trailing=u:void 0!==l&&(c.price=this.priceToPrecision(t,l),"limit"===i&&(c.price_aux_limit=this.priceToPrecision(t,n)));const v=p||"PO"===f;"market"!==i&&void 0===l&&(c.price=this.priceToPrecision(t,n));let y=0;v&&(y=this.sum(y,4096)),m&&(y=this.sum(y,1024)),0!==y&&(c.flags=y),void 0!==g&&(c.cid=g);const w=this.safeInteger2(d,"leverage","lev");void 0!==w&&(c.lev=w),d=this.omit(d,["triggerPrice","stopPrice","timeInForce","postOnly","reduceOnly","trailingAmount","clientOrderId","leverage"]);const b=await this.privatePostAuthWOrderUpdate(this.extend(c,d));if("SUCCESS"!==this.safeString(b,6)){const e=b[5],t=b[7];throw new s.ExchangeError(this.id+" "+b[6]+": "+t+" (#"+e+")")}const k={result:this.safeList(b,4,[])};return this.parseOrder(k,h)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitfinex1",name:"Bitfinex",countries:["VG"],version:"v1",rateLimit:666.666,pro:!0,has:{CORS:void 0,spot:!0,margin:void 0,swap:void 0,future:void 0,option:void 0,cancelAllOrders:!0,cancelOrder:!0,createDepositAddress:!0,createOrder:!0,editOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:!0,fetchTransactions:"emulated",transfer:!0,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","3h":"3h","4h":"4h","6h":"6h","12h":"12h","1d":"1D","1w":"7D","2w":"14D","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/9147c6c5-7197-481e-827b-7483672bb0e9",api:{v2:"https://api-pub.bitfinex.com",public:"https://api.bitfinex.com",private:"https://api.bitfinex.com"},www:"https://www.bitfinex.com",referral:"https://www.bitfinex.com/?refcode=P61eYxFL",doc:["https://docs.bitfinex.com/v1/docs","https://github.com/bitfinexcom/bitfinex-api-node"]},api:{v2:{get:{"platform/status":3,tickers:1,"ticker/{symbol}":1,"tickers/hist":1,"trades/{symbol}/hist":1,"book/{symbol}/{precision}":.375,"book/{symbol}/P0":.375,"book/{symbol}/P1":.375,"book/{symbol}/P2":.375,"book/{symbol}/P3":.375,"book/{symbol}/R0":.375,"stats1/{key}:{size}:{symbol}:{side}/{section}":1,"stats1/{key}:{size}:{symbol}/{section}":1,"stats1/{key}:{size}:{symbol}:long/last":1,"stats1/{key}:{size}:{symbol}:long/hist":1,"stats1/{key}:{size}:{symbol}:short/last":1,"stats1/{key}:{size}:{symbol}:short/hist":1,"candles/trade:{timeframe}:{symbol}/{section}":1,"candles/trade:{timeframe}:{symbol}/last":1,"candles/trade:{timeframe}:{symbol}/hist":1}},public:{get:{"book/{symbol}":1,"lendbook/{currency}":6,"lends/{currency}":3,"pubticker/{symbol}":3,"stats/{symbol}":6,symbols:18,symbols_details:18,tickers:1,"trades/{symbol}":3}},private:{post:{account_fees:18,account_infos:6,balances:9.036,basket_manage:6,credits:6,"deposit/new":18,"funding/close":6,history:6,"history/movements":6,key_info:6,margin_infos:3,mytrades:3,mytrades_funding:6,"offer/cancel":6,"offer/new":6,"offer/status":6,offers:6,"offers/hist":90.03,"order/cancel":.2,"order/cancel/all":.2,"order/cancel/multi":.2,"order/cancel/replace":.2,"order/new":.2,"order/new/multi":.2,"order/status":.2,orders:.2,"orders/hist":90.03,"position/claim":18,"position/close":18,positions:18,summary:18,taken_funds:6,total_taken_funds:6,transfer:18,unused_taken_funds:6,withdraw:18}}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,maker:this.parseNumber("0.001"),taker:this.parseNumber("0.002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("500000"),this.parseNumber("0.002")],[this.parseNumber("1000000"),this.parseNumber("0.002")],[this.parseNumber("2500000"),this.parseNumber("0.002")],[this.parseNumber("5000000"),this.parseNumber("0.002")],[this.parseNumber("7500000"),this.parseNumber("0.002")],[this.parseNumber("10000000"),this.parseNumber("0.0018")],[this.parseNumber("15000000"),this.parseNumber("0.0016")],[this.parseNumber("20000000"),this.parseNumber("0.0014")],[this.parseNumber("25000000"),this.parseNumber("0.0012")],[this.parseNumber("30000000"),this.parseNumber("0.001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("500000"),this.parseNumber("0.0008")],[this.parseNumber("1000000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0004")],[this.parseNumber("5000000"),this.parseNumber("0.0002")],[this.parseNumber("7500000"),this.parseNumber("0")],[this.parseNumber("10000000"),this.parseNumber("0")],[this.parseNumber("15000000"),this.parseNumber("0")],[this.parseNumber("20000000"),this.parseNumber("0")],[this.parseNumber("25000000"),this.parseNumber("0")],[this.parseNumber("30000000"),this.parseNumber("0")]]}},funding:{tierBased:!1,percentage:!1,deposit:{},withdraw:{}}},commonCurrencies:{ALG:"ALGO",AMP:"AMPL",ATO:"ATOM",BCHABC:"XEC",BCHN:"BCH",DAT:"DATA",DOG:"MDOGE",DSH:"DASH",EDO:"PNT",EUS:"EURS",EUT:"EURT",IDX:"ID",IOT:"IOTA",IQX:"IQ",LUNA:"LUNC",LUNA2:"LUNA",MNA:"MANA",ORS:"ORS Group",PAS:"PASS",QSH:"QASH",QTM:"QTUM",RBT:"RBTC",SNG:"SNGLS",STJ:"STORJ",TERRAUST:"USTC",TSD:"TUSD",YGG:"YEED",YYW:"YOYOW",UDC:"USDC",UST:"USDT",VSY:"VSYS",WAX:"WAXP",XCH:"XCHF",ZBT:"ZB"},exceptions:{exact:{temporarily_unavailable:r.ExchangeNotAvailable,"Order could not be cancelled.":r.OrderNotFound,"No such order found.":r.OrderNotFound,"Order price must be positive.":r.InvalidOrder,"Could not find a key matching the given X-BFX-APIKEY.":r.AuthenticationError,'Key price should be a decimal number, e.g. "123.456"':r.InvalidOrder,'Key amount should be a decimal number, e.g. "123.456"':r.InvalidOrder,ERR_RATE_LIMIT:r.RateLimitExceeded,Ratelimit:r.RateLimitExceeded,"Nonce is too small.":r.InvalidNonce,"No summary found.":r.ExchangeError,"Cannot evaluate your available balance, please try again":r.ExchangeNotAvailable,"Unknown symbol":r.BadSymbol,"Cannot complete transfer. Exchange balance insufficient.":r.InsufficientFunds,"Momentary balance check. Please wait few seconds and try the transfer again.":r.ExchangeError},broad:{"Invalid X-BFX-SIGNATURE":r.AuthenticationError,"This API key does not have permission":r.PermissionDenied,"not enough exchange balance for ":r.InsufficientFunds,"minimum size for ":r.InvalidOrder,"Invalid order":r.InvalidOrder,"The available balance is only":r.InsufficientFunds}},precisionMode:o.v,options:{currencyNames:{AGI:"agi",AID:"aid",AIO:"aio",ANT:"ant",AVT:"aventus",BAT:"bat",BCH:"bab",BCI:"bci",BFT:"bft",BSV:"bsv",BTC:"bitcoin",BTG:"bgold",CFI:"cfi",COMP:"comp",DAI:"dai",DADI:"dad",DASH:"dash",DATA:"datacoin",DTH:"dth",EDO:"eidoo",ELF:"elf",EOS:"eos",ETC:"ethereumc",ETH:"ethereum",ETP:"metaverse",FUN:"fun",GNT:"golem",IOST:"ios",IOTA:"iota",LEO:"let",LINK:"link",LRC:"lrc",LTC:"litecoin",LYM:"lym",MANA:"mna",MIT:"mit",MKR:"mkr",MTN:"mtn",NEO:"neo",ODE:"ode",OMG:"omisego",OMNI:"mastercoin",QASH:"qash",QTUM:"qtum",RCN:"rcn",RDN:"rdn",REP:"rep",REQ:"req",RLC:"rlc",SAN:"santiment",SNGLS:"sng",SNT:"status",SPANK:"spk",STORJ:"stj",TNB:"tnb",TRX:"trx",TUSD:"tsd",USD:"wire",USDC:"udc",UTK:"utk",USDT:"tetheruso",VEE:"vee",WAX:"wax",XLM:"xlm",XMR:"monero",XRP:"ripple",XVG:"xvg",YOYOW:"yoyow",ZEC:"zcash",ZRX:"zrx",XTZ:"xtz"},orderTypes:{limit:"exchange limit",market:"exchange market"},fiat:{USD:"USD",EUR:"EUR",JPY:"JPY",GBP:"GBP",CNH:"CNH"},accountsByType:{spot:"exchange",margin:"trading",funding:"deposit",swap:"trading"}}})}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i={},s=await this.privatePostAccountFees(t),r=this.safeDict(s,"withdraw",{}),a=Object.keys(r);for(let t=0;t<a.length;t++){const s=a[t],o=this.safeCurrencyCode(s);(void 0===e||this.inArray(o,e))&&(i[o]={withdraw:this.safeNumber(r,s),deposit:{},info:this.safeNumber(r,s)})}return i}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostAccountFees(t),s=this.safeList(i,"withdraw");return this.parseDepositWithdrawFees(s,e)}parseDepositWithdrawFee(e,t=void 0){return{withdraw:{fee:this.parseNumber(e),percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{},info:e}}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostSummary(e),i={},s=this.safeDict(this.options,"fiat",{}),r=this.safeNumber(t,"maker_fee"),a=this.safeNumber(t,"taker_fee"),o=this.safeNumber(t,"maker_fee_2fiat"),n=this.safeNumber(t,"taker_fee_2fiat"),d=this.safeNumber(t,"maker_fee_2deriv"),h=this.safeNumber(t,"taker_fee_2deriv");for(let e=0;e<this.symbols.length;e++){const c=this.symbols[e],l=this.market(c),u={info:t,symbol:c,percentage:!0,tierBased:!0};l.quote in s?(u.maker=o,u.taker=n):l.contract?(u.maker=d,u.taker=h):(u.maker=r,u.taker=a),i[c]=u}return i}async fetchMarkets(e={}){const t=this.publicGetSymbols(),i=this.publicGetSymbolsDetails(),[s,r]=await Promise.all([t,i]),a=[];for(let e=0;e<r.length;e++){const t=r[e];let i,o,n=this.safeString(t,"pair");if(!this.inArray(n,s))continue;if(n=n.toUpperCase(),n.indexOf(":")>=0){const e=n.split(":");i=e[0],o=e[1]}else i=n.slice(0,3),o=n.slice(3,6);const d=this.safeCurrencyCode(i),h=this.safeCurrencyCode(o),c=d+"/"+h;let l="spot";n.indexOf("F0")>-1&&(l="swap"),a.push({id:n,symbol:c,base:d,quote:h,settle:void 0,baseId:i,quoteId:o,settleId:void 0,type:l,spot:"spot"===l,margin:this.safeBool(t,"margin"),swap:"swap"===l,future:!1,option:!1,active:!0,contract:"swap"===l,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:parseInt("8"),price:this.safeInteger(t,"price_precision")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minimum_order_size"),max:this.safeNumber(t,"maximum_order_size")},price:{min:this.parseNumber("1e-8"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return a}amountToPrecision(e,t){return e=this.safeSymbol(e),this.decimalToPrecision(t,o.R3,this.markets[e].precision.amount,o.fv)}priceToPrecision(e,t){return e=this.safeSymbol(e),t=this.decimalToPrecision(t,o.D_,this.markets[e].precision.price,this.precisionMode),this.decimalToPrecision(t,o.R3,8,o.fv)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeDict(this.options,"accountsByType",{}),i=this.safeString(e,"type","exchange"),s=this.safeString(t,i,i);if(void 0===s){const e=Object.keys(t);throw new r.ExchangeError(this.id+" fetchBalance() type parameter must be one of "+e.join(", "))}const a=this.omit(e,"type"),o=await this.privatePostBalances(a),n={info:o},d="derivatives"===i;for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"type"),r=this.safeStringLower(t,"currency",""),a=r.length-2,h="f0"===r.slice(a);if(s===i&&(!d||h)){const e=this.safeCurrencyCode(r);if(!(e in n)){const i=this.account();i.free=this.safeString(t,"available"),i.total=this.safeString(t,"amount"),n[e]=i}}}return this.safeBalance(n)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.currency(e),c=this.convertDerivativesId(h.id,i),l=this.convertDerivativesId(h.id,s),u=this.currencyToPrecision(e,t),f={amount:u,currency:c,currency_to:l,walletfrom:n,walletto:d},p=await this.privatePostTransfer(this.extend(f,a)),m=this.safeValue(p,0);if(void 0===this.safeString(m,"message"))throw new r.ExchangeError(this.id+" transfer failed");return this.extend(this.parseTransfer(m,h),{fromAccount:i,toAccount:s,amount:this.parseNumber(u)})}parseTransfer(e,t=void 0){return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.parseTransferStatus(this.safeString(e,"status"))}}parseTransferStatus(e){return this.safeString({SUCCESS:"ok"},e,e)}convertDerivativesId(e,t){const i=e.length-2,s="F0"===e.slice(i);return"derivatives"!==t&&"trading"!==t&&"margin"!==t&&s?e=e.slice(0,i):"derivatives"!==t||s||(e+="F0"),e}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.limit_bids=t,r.limit_asks=t);const a=await this.publicGetBookSymbol(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","amount")}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickers(t),s={};for(let e=0;e<i.length;e++){const t=this.parseTicker(i[e]);s[t.symbol]=t}return this.filterByArrayTickers(s,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetPubtickerSymbol(this.extend(s,t));return this.parseTicker(r,i)}parseTicker(e,t=void 0){const i=this.safeTimestamp(e,"timestamp"),s=this.safeString(e,"pair"),r=(t=this.safeMarket(s,t)).symbol,a=this.safeString(e,"last_price");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:this.safeString(e,"mid"),baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,info:e},t)}parseTrade(e,t=void 0){const i=this.safeString(e,"tid"),s=this.safeTimestamp(e,"timestamp"),r=this.safeStringLower(e,"type"),o=this.safeString(e,"order_id"),n=this.safeString(e,"price"),d=this.safeString(e,"amount");let h;if("fee_amount"in e){const t=a.Y.stringNeg(this.safeString(e,"fee_amount")),i=this.safeString(e,"fee_currency");h={cost:t,currency:this.safeCurrencyCode(i)}}return this.safeTrade({id:i,info:e,timestamp:s,datetime:this.iso8601(s),symbol:t.symbol,type:undefined,order:o,side:r,takerOrMaker:void 0,price:n,amount:d,cost:void 0,fee:h},t)}async fetchTrades(e,t=void 0,i=50,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id,limit_trades:i};void 0!==t&&(a.timestamp=this.parseToInt(t/1e3));const o=await this.publicGetTradesSymbol(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==i&&(o.limit_trades=i),void 0!==t&&(o.timestamp=this.parseToInt(t/1e3));const n=await this.privatePostMytrades(this.extend(o,s));return this.parseTrades(n,a,t,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"postOnly",!1);t=t.toLowerCase(),a=this.omit(a,["postOnly"]),o.spot&&(t=this.safeStringLower(this.options.orderTypes,t,t));const d={symbol:o.id,side:i,amount:this.amountToPrecision(e,s),type:t,ocoorder:!1,buy_price_oco:0,sell_price_oco:0};t.indexOf("market")>-1?d.price=this.nonce().toString():d.price=this.priceToPrecision(e,r),n&&(d.is_postonly=!0);const h=await this.privatePostOrderNew(this.extend(d,a));return this.parseOrder(h,o)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n={order_id:parseInt(e)};void 0!==a&&(n.price=this.priceToPrecision(t,a)),void 0!==r&&(n.amount=this.numberToString(r)),void 0!==t&&(n.symbol=this.marketId(t)),void 0!==s&&(n.side=s),void 0!==i&&(n.type=this.safeString(this.options.orderTypes,i,i));const d=await this.privatePostOrderCancelReplace(this.extend(n,o));return this.parseOrder(d)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:parseInt(e)},r=await this.privatePostOrderCancel(this.extend(s,i));return this.parseOrder(r)}async cancelAllOrders(e=void 0,t={}){const i=await this.privatePostOrderCancelAll(t);return[this.safeOrder({info:i})]}parseOrder(e,t=void 0){const i=this.safeString(e,"side"),s=this.safeBool(e,"is_live"),r=this.safeBool(e,"is_cancelled");let a;a=s?"open":r?"canceled":"closed";const o=this.safeStringUpper(e,"symbol"),n=this.safeSymbol(o,t);let d=this.safeString(e,"type","");if(d.indexOf("exchange ")>=0){d=e.type.split(" ")[1]}const h=this.safeTimestamp(e,"timestamp"),c=this.safeString(e,"id");return this.safeOrder({info:e,id:c,clientOrderId:void 0,timestamp:h,datetime:this.iso8601(h),lastTradeTimestamp:void 0,symbol:n,type:d,timeInForce:void 0,postOnly:void 0,side:i,price:this.safeString(e,"price"),triggerPrice:void 0,average:this.safeString(e,"avg_execution_price"),amount:this.safeString(e,"original_amount"),remaining:this.safeString(e,"remaining_amount"),filled:this.safeString(e,"executed_amount"),status:a,fee:void 0,cost:void 0,trades:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0!==e&&!(e in this.markets))throw new r.ExchangeError(this.id+" has no symbol "+e);const a=await this.privatePostOrders(s);let o=this.parseOrders(a,void 0,t,i);return void 0!==e&&(o=this.filterBy(o,"symbol",e)),o}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),e=this.symbol(e);const r={};void 0!==i&&(r.limit=i);const a=await this.privatePostOrdersHist(this.extend(r,s));let o=this.parseOrders(a,void 0,t,i);return void 0!==e&&(o=this.filterBy(o,"symbol",e)),o=this.filterByArray(o,"status",["closed","canceled"],!1),o}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:parseInt(e)},r=await this.privatePostOrderStatus(this.extend(s,i));return this.parseOrder(r)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets(),s=void 0===s?100:Math.min(s,1e4);const a=this.market(e),o={symbol:"t"+a.id,timeframe:this.safeString(this.timeframes,t,t),sort:1,limit:s},n=this.safeInteger(r,"until");if(void 0!==i)o.start=i;else if(void 0!==n){const e=this.parseTimeframe(t);o.start=n-(s-1)*e*1e3}void 0!==n&&(o.end=n),r=this.omit(r,"until");const d=await this.v2GetCandlesTradeTimeframeSymbolHist(this.extend(o,r));return this.parseOHLCVs(d,a,t,i,s)}getCurrencyName(e){if(e in this.options.currencyNames)return this.options.currencyNames[e];throw new r.NotSupported(this.id+" "+e+" not supported for withdrawal")}async createDepositAddress(e,t={}){await this.loadMarkets();return await this.fetchDepositAddress(e,this.extend({renew:1},t))}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={method:this.getCurrencyName(e),wallet_name:"exchange",renew:0},s=await this.privatePostDepositNew(this.extend(i,t));let r,a=this.safeValue(s,"address");return"address_pool"in s&&(r=a,a=s.address_pool),this.checkAddress(a),{currency:e,address:a,tag:r,network:void 0,info:s}}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a=this.safeString(s,"currency");const o=this.omit(s,"currency");let n;if(void 0===a){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDepositsWithdrawals() requires a currency `code` argument or a `currency` parameter");n=this.currency(e),a=n.id}o.currency=a,void 0!==t&&(o.since=this.parseToInt(t/1e3));const d=await this.privatePostHistoryMovements(this.extend(o,s));return this.parseTransactions(d,n,t,i)}parseTransaction(e,t=void 0){const i=this.safeTimestamp(e,"timestamp_created"),s=this.safeString(e,"currency"),r=this.safeCurrencyCode(s,t);let o=this.safeString(e,"fee");return void 0!==o&&(o=a.Y.stringAbs(o)),{info:e,id:this.safeString2(e,"id","withdrawal_id"),txid:this.safeString(e,"txid"),type:this.safeStringLower(e,"type"),currency:r,network:void 0,amount:this.safeNumber(e,"amount"),status:this.parseTransactionStatus(this.safeString(e,"status")),timestamp:i,datetime:this.iso8601(i),address:this.safeString(e,"address"),addressFrom:void 0,addressTo:void 0,tag:this.safeString(e,"description"),tagFrom:void 0,tagTo:void 0,updated:this.safeTimestamp(e,"timestamp"),comment:void 0,internal:void 0,fee:{currency:r,cost:this.parseNumber(o),rate:void 0}}}parseTransactionStatus(e){return this.safeString({SENDING:"pending",CANCELED:"canceled",ZEROCONFIRMED:"failed",COMPLETED:"ok"},e,e)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.getCurrencyName(e),n=this.currency(e),d={withdraw_type:o,walletselected:"exchange",amount:this.numberToString(t),address:i};void 0!==s&&(d.payment_id=s);const h=await this.privatePostWithdraw(this.extend(d,a)),c=this.safeDict(h,0,{}),l=this.safeInteger(c,"withdrawal_id"),u=this.safeString(c,"message"),f=this.findBroadlyMatchedKey(this.exceptions.broad,u);if(0===l){if(void 0!==f){throw new(0,this.exceptions.broad[f])(this.id+" "+u)}throw new r.ExchangeError(this.id+" withdraw returned an id of zero: "+this.json(c))}return this.parseTransaction(c,n)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();return await this.privatePostPositions(t)}nonce(){return this.microseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.implodeParams(e,s);o="v2"===t?"/"+t+o:"/"+this.version+o;let d=this.omit(s,this.extractParams(e)),h=this.urls.api[t]+o;if(("public"===t||e.indexOf("/hist")>=0)&&Object.keys(d).length){const e="?"+this.urlencode(d);h+=e,o+=e}if("private"===t){this.checkRequiredCredentials();const e=this.nonce();d=this.extend({nonce:e.toString(),request:o},d),a=this.json(d);const t=this.stringToBase64(a),i=this.encode(this.secret),s=this.hmac(this.encode(t),i,n.qt);r={"X-BFX-APIKEY":this.apiKey,"X-BFX-PAYLOAD":t,"X-BFX-SIGNATURE":s,"Content-Type":"application/json"}}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;let c=!1;if(e>=400)"{"===o[0]&&(c=!0);else{const e=this.safeDict(n,0,{});"error"===this.safeString(e,"status","")&&(c=!0)}if(c){const e=this.id+" "+o,t=this.safeString2(n,"message","error");throw this.throwExactlyMatchedException(this.exceptions.exact,t,e),this.throwBroadlyMatchedException(this.exceptions.broad,t,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitflyer",name:"bitFlyer",countries:["JP"],version:"v1",rateLimit:1e3,hostname:"bitflyer.com",has:{CORS:void 0,spot:!0,margin:!1,swap:void 0,future:void 0,option:!1,cancelAllOrders:void 0,cancelOrder:!0,createOrder:!0,fetchBalance:!0,fetchClosedOrders:"emulated",fetchDeposits:!0,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOpenOrders:"emulated",fetchOrder:"emulated",fetchOrderBook:!0,fetchOrders:!0,fetchPositionMode:!1,fetchPositions:!0,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawals:!0,transfer:!1,withdraw:!0},urls:{logo:"https://github.com/user-attachments/assets/d0217747-e54d-4533-8416-0d553dca74bb",api:{rest:"https://api.{hostname}"},www:"https://bitflyer.com",doc:"https://lightning.bitflyer.com/docs?lang=en"},api:{public:{get:["getmarkets/usa","getmarkets/eu","getmarkets","getboard","getticker","getexecutions","gethealth","getboardstate","getchats","getfundingrate"]},private:{get:["getpermissions","getbalance","getbalancehistory","getcollateral","getcollateralhistory","getcollateralaccounts","getaddresses","getcoinins","getcoinouts","getbankaccounts","getdeposits","getwithdrawals","getchildorders","getparentorders","getparentorder","getexecutions","getpositions","gettradingcommission"],post:["sendcoin","withdraw","sendchildorder","cancelchildorder","sendparentorder","cancelparentorder","cancelallchildorders"]}},fees:{trading:{maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},precisionMode:a.kb,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"-2":r.OnMaintenance}}})}parseExpiryDate(e){const t=e.slice(0,2),i=e.slice(2,5),s=e.slice(5,9),r=this.safeString({JAN:"01",FEB:"02",MAR:"03",APR:"04",MAY:"05",JUN:"06",JUL:"07",AUG:"08",SEP:"09",OCT:"10",NOV:"11",DEC:"12"},i);return this.parse8601(s+"-"+r+"-"+t+"T00:00:00Z")}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return super.safeMarket(e,t,i,"spot")}async fetchMarkets(e={}){const t=await this.publicGetGetmarkets(e),i=await this.publicGetGetmarketsUsa(e),s=await this.publicGetGetmarketsEu(e);let r=this.arrayConcat(t,i);r=this.arrayConcat(r,s);const a=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"product_code"),s=i.split("_"),o=this.safeString(t,"market_type"),n="FX"===o,d="Futures"===o,h=!n&&!d;let c,l,u,f,p="spot";if(h)l=this.safeString(s,0),u=this.safeString(s,1);else if(n)p="swap",l=this.safeString(s,1),u=this.safeString(s,2);else if(d){const e=this.safeString(t,"alias");if(void 0===e){l=i.slice(0,3),u=i.slice(3,6);const e=i.slice(-9);f=this.parseExpiryDate(e)}else{const t=e.split("_"),s=this.safeString(t,0);l=s.slice(0,-3),u=s.slice(-3);const r=i.split(s),a=this.safeString(r,1);f=this.parseExpiryDate(a)}p="future"}const m=this.safeCurrencyCode(l),g=this.safeCurrencyCode(u);let v=m+"/"+g,y=this.fees.trading.taker,w=this.fees.trading.maker;const b=n||d;b&&(w=0,y=0,c="JPY",v=v+":"+c,d&&(v=v+"-"+this.yymmdd(f))),a.push({id:i,symbol:v,base:m,quote:g,settle:c,baseId:l,quoteId:u,settleId:void 0,type:p,spot:h,margin:!1,swap:n,future:d,option:!1,active:!0,contract:b,linear:!h||void 0,inverse:!!h&&void 0,taker:y,maker:w,contractSize:void 0,expiry:f,expiryDatetime:this.iso8601(f),strike:void 0,optionType:void 0,precision:{amount:void 0,price:void 0},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return a}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency_code"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"amount"),o.free=this.safeString(s,"available"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetGetbalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={product_code:s.id},a=await this.publicGetGetboard(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","size")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.parse8601(this.safeString(e,"timestamp")),r=this.safeString(e,"ltp");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:void 0,low:void 0,bid:this.safeString(e,"best_bid"),bidVolume:void 0,ask:this.safeString(e,"best_ask"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume_by_product"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_code:i.id},r=await this.publicGetGetticker(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){let i,s=this.safeStringLower(e,"side");if(void 0!==s&&s.length<1&&(s=void 0),void 0!==s){const t=s+"_child_order_acceptance_id";t in e&&(i=e[t])}void 0===i&&(i=this.safeString(e,"child_order_acceptance_id"));const r=this.parse8601(this.safeString(e,"exec_date")),a=this.safeString(e,"price"),o=this.safeString(e,"size"),n=this.safeString(e,"id");return t=this.safeMarket(void 0,t),this.safeTrade({id:n,info:e,timestamp:r,datetime:this.iso8601(r),symbol:t.symbol,order:i,type:void 0,side:s,takerOrMaker:void 0,price:a,amount:o,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={product_code:r.id};void 0!==i&&(a.count=i);const o=await this.publicGetGetexecutions(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_code:i.id},r=await this.privateGetGettradingcommission(this.extend(s,t)),a=this.safeNumber(r,"commission_rate");return{info:r,symbol:i.symbol,maker:a,taker:a,percentage:void 0,tierBased:void 0}}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o={product_code:this.marketId(e),child_order_type:t.toUpperCase(),side:i.toUpperCase(),price:r,size:s},n=await this.privatePostSendchildorder(this.extend(o,a)),d=this.safeString(n,"child_order_acceptance_id");return this.safeOrder({id:d,info:n})}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s={product_code:this.marketId(t),child_order_acceptance_id:e},a=await this.privatePostCancelchildorder(this.extend(s,i));return this.safeOrder({info:a})}parseOrderStatus(e){return this.safeString({ACTIVE:"open",COMPLETED:"closed",CANCELED:"canceled",EXPIRED:"canceled",REJECTED:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.parse8601(this.safeString(e,"child_order_date")),s=this.safeString(e,"price"),r=this.safeString(e,"size"),a=this.safeString(e,"executed_size"),o=this.safeString(e,"outstanding_size"),n=this.parseOrderStatus(this.safeString(e,"child_order_state")),d=this.safeStringLower(e,"child_order_type"),h=this.safeStringLower(e,"side"),c=this.safeString(e,"product_code"),l=this.safeSymbol(c,t);let u;const f=this.safeNumber(e,"total_commission");void 0!==f&&(u={cost:f,currency:void 0,rate:void 0});const p=this.safeString(e,"child_order_acceptance_id");return this.safeOrder({id:p,clientOrderId:void 0,info:e,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,status:n,symbol:l,type:d,timeInForce:void 0,postOnly:void 0,side:h,price:s,triggerPrice:void 0,cost:void 0,amount:r,filled:a,remaining:o,fee:u,average:void 0,trades:void 0},t)}async fetchOrders(e=void 0,t=void 0,i=100,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={product_code:a.id,count:i},n=await this.privateGetGetchildorders(this.extend(o,s));let d=this.parseOrders(n,a,t,i);return void 0!==e&&(d=this.filterBy(d,"symbol",e)),d}async fetchOpenOrders(e=void 0,t=void 0,i=100,s={}){return await this.fetchOrders(e,t,i,this.extend({child_order_state:"ACTIVE"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=100,s={}){return await this.fetchOrders(e,t,i,this.extend({child_order_state:"COMPLETED"},s))}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");const s=await this.fetchOrders(t),a=this.indexBy(s,"id");if(e in a)return a[e];throw new r.OrderNotFound(this.id+" No order found with id "+e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={product_code:a.id};void 0!==i&&(o.count=i);const n=await this.privateGetGetexecutions(this.extend(o,s));return this.parseTrades(n,a,t,i)}async fetchPositions(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchPositions() requires a `symbols` argument, exactly one symbol in an array");await this.loadMarkets();const i={product_code:this.marketIds(e)};return await this.privateGetGetpositions(this.extend(i,t))}async withdraw(e,t,i,s=void 0,a={}){if(this.checkAddress(i),await this.loadMarkets(),"JPY"!==e&&"USD"!==e&&"EUR"!==e)throw new r.ExchangeError(this.id+" allows withdrawing JPY, USD, EUR only, "+e+" is not supported");const o=this.currency(e),n={currency_code:o.id,amount:t},d=await this.privatePostWithdraw(this.extend(n,a));return this.parseTransaction(d,o)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e)),void 0!==i&&(a.count=i);const o=await this.privateGetGetcoinins(this.extend(a,s));return this.parseTransactions(o,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e)),void 0!==i&&(a.count=i);const o=await this.privateGetGetcoinouts(this.extend(a,s));return this.parseTransactions(o,r,t,i)}parseDepositStatus(e){return this.safeString({PENDING:"pending",COMPLETED:"ok"},e,e)}parseWithdrawalStatus(e){return this.safeString({PENDING:"pending",COMPLETED:"ok"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","message_id"),s=this.safeString(e,"address"),r=this.safeString(e,"currency_code"),a=this.safeCurrencyCode(r,t),o=this.parse8601(this.safeString(e,"event_date")),d=this.safeNumber(e,"amount"),h=this.safeString(e,"tx_hash"),c=this.safeString(e,"status");let l,u,f;if("fee"in e){l="withdrawal",u=this.parseWithdrawalStatus(c);const t=this.safeString(e,"fee"),i=this.safeString(e,"additional_fee");f={currency:a,cost:this.parseNumber(n.Y.stringAdd(t,i))}}else l="deposit",u=this.parseDepositStatus(c);return{info:e,id:i,txid:h,timestamp:o,datetime:this.iso8601(o),network:void 0,address:s,addressTo:s,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:l,amount:d,currency:a,status:u,updated:void 0,comment:void 0,internal:void 0,fee:f}}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_code:i.id},r=await this.publicGetGetfundingrate(this.extend(s,t));return this.parseFundingRate(r,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"next_funding_rate_settledate"),s=this.parse8601(i);return{info:e,symbol:this.safeString(t,"symbol"),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:void 0,fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:this.safeNumber(e,"current_funding_rate"),nextFundingTimestamp:s,nextFundingDatetime:this.iso8601(s),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n="/"+this.version+"/";"private"===t&&(n+="me/"),n+=e,"GET"===i&&Object.keys(s).length&&(n+="?"+this.urlencode(s));const d=this.implodeHostname(this.urls.api.rest)+n;if("private"===t){this.checkRequiredCredentials();const e=this.nonce().toString();let t=[e,i,n].join("");Object.keys(s).length&&"GET"!==i&&(t+=a=this.json(s)),r={"ACCESS-KEY":this.apiKey,"ACCESS-TIMESTAMP":e,"ACCESS-SIGN":this.hmac(this.encode(t),this.encode(this.secret),o.s),"Content-Type":"application/json"}}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.id+" "+o,l=this.safeString(n,"error_message"),u=this.safeInteger(n,"status");if(void 0!==l)throw this.throwExactlyMatchedException(this.exceptions.exact,u,c),new r.ExchangeError(c)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitget",name:"Bitget",countries:["SG"],version:"v2",rateLimit:50,certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!0,option:!1,addMargin:!0,borrowCrossMargin:!0,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!0,closePosition:!0,createConvertTrade:!0,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingAmountOrder:!1,createTrailingPercentOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchConvertCurrencies:!0,fetchConvertQuote:!0,fetchConvertTrade:!1,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!0,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!0,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchLongShortRatio:!1,fetchLongShortRatioHistory:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!0,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMarkPrice:!0,fetchMyLiquidations:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!0,fetchPositionHistory:"emulated",fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!0,fetchWithdrawAddresses:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!0,repayCrossMargin:!0,repayIsolatedMargin:!0,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!0,signIn:!1,transfer:!0,withdraw:!0},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://github.com/user-attachments/assets/fbaa10cc-a277-441d-a5b7-997dd9a87658",api:{spot:"https://api.{hostname}",mix:"https://api.{hostname}",user:"https://api.{hostname}",p2p:"https://api.{hostname}",broker:"https://api.{hostname}",margin:"https://api.{hostname}",common:"https://api.{hostname}",tax:"https://api.{hostname}",convert:"https://api.{hostname}",copy:"https://api.{hostname}",earn:"https://api.{hostname}"},www:"https://www.bitget.com",doc:["https://www.bitget.com/api-doc/common/intro","https://www.bitget.com/api-doc/spot/intro","https://www.bitget.com/api-doc/contract/intro","https://www.bitget.com/api-doc/broker/intro","https://www.bitget.com/api-doc/margin/intro","https://www.bitget.com/api-doc/copytrading/intro","https://www.bitget.com/api-doc/earn/intro","https://bitgetlimited.github.io/apidoc/en/mix","https://bitgetlimited.github.io/apidoc/en/spot","https://bitgetlimited.github.io/apidoc/en/broker","https://bitgetlimited.github.io/apidoc/en/margin"],fees:"https://www.bitget.cc/zh-CN/rate?tab=1",referral:"https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j"},api:{public:{common:{get:{"v2/public/annoucements":1,"v2/public/time":1}},spot:{get:{"spot/v1/notice/queryAllNotices":1,"spot/v1/public/time":1,"spot/v1/public/currencies":6.6667,"spot/v1/public/products":1,"spot/v1/public/product":1,"spot/v1/market/ticker":1,"spot/v1/market/tickers":1,"spot/v1/market/fills":2,"spot/v1/market/fills-history":2,"spot/v1/market/candles":1,"spot/v1/market/depth":1,"spot/v1/market/spot-vip-level":2,"spot/v1/market/merge-depth":1,"spot/v1/market/history-candles":1,"spot/v1/public/loan/coinInfos":2,"spot/v1/public/loan/hour-interest":2,"v2/spot/public/coins":6.6667,"v2/spot/public/symbols":1,"v2/spot/market/vip-fee-rate":2,"v2/spot/market/tickers":1,"v2/spot/market/merge-depth":1,"v2/spot/market/orderbook":1,"v2/spot/market/candles":1,"v2/spot/market/history-candles":1,"v2/spot/market/fills":2,"v2/spot/market/fills-history":2}},mix:{get:{"mix/v1/market/contracts":1,"mix/v1/market/depth":1,"mix/v1/market/ticker":1,"mix/v1/market/tickers":1,"mix/v1/market/contract-vip-level":2,"mix/v1/market/fills":1,"mix/v1/market/fills-history":2,"mix/v1/market/candles":1,"mix/v1/market/index":1,"mix/v1/market/funding-time":1,"mix/v1/market/history-fundRate":1,"mix/v1/market/current-fundRate":1,"mix/v1/market/open-interest":1,"mix/v1/market/mark-price":1,"mix/v1/market/symbol-leverage":1,"mix/v1/market/queryPositionLever":1,"mix/v1/market/open-limit":1,"mix/v1/market/history-candles":1,"mix/v1/market/history-index-candles":1,"mix/v1/market/history-mark-candles":1,"mix/v1/market/merge-depth":1,"v2/mix/market/vip-fee-rate":2,"v2/mix/market/merge-depth":1,"v2/mix/market/ticker":1,"v2/mix/market/tickers":1,"v2/mix/market/fills":1,"v2/mix/market/fills-history":2,"v2/mix/market/candles":1,"v2/mix/market/history-candles":1,"v2/mix/market/history-index-candles":1,"v2/mix/market/history-mark-candles":1,"v2/mix/market/open-interest":1,"v2/mix/market/funding-time":1,"v2/mix/market/symbol-price":1,"v2/mix/market/history-fund-rate":1,"v2/mix/market/current-fund-rate":1,"v2/mix/market/contracts":1,"v2/mix/market/query-position-lever":2,"v2/mix/market/account-long-short":20}},margin:{get:{"margin/v1/cross/public/interestRateAndLimit":2,"margin/v1/isolated/public/interestRateAndLimit":2,"margin/v1/cross/public/tierData":2,"margin/v1/isolated/public/tierData":2,"margin/v1/public/currencies":1,"v2/margin/currencies":2,"v2/margin/market/long-short-ratio":20}},earn:{get:{"v2/earn/loan/public/coinInfos":2,"v2/earn/loan/public/hour-interest":2}}},private:{spot:{get:{"spot/v1/wallet/deposit-address":4,"spot/v1/wallet/withdrawal-list":1,"spot/v1/wallet/deposit-list":1,"spot/v1/account/getInfo":20,"spot/v1/account/assets":2,"spot/v1/account/assets-lite":2,"spot/v1/account/transferRecords":1,"spot/v1/convert/currencies":2,"spot/v1/convert/convert-record":2,"spot/v1/loan/ongoing-orders":2,"spot/v1/loan/repay-history":2,"spot/v1/loan/revise-history":2,"spot/v1/loan/borrow-history":2,"spot/v1/loan/debts":2,"v2/spot/trade/orderInfo":1,"v2/spot/trade/unfilled-orders":1,"v2/spot/trade/history-orders":1,"v2/spot/trade/fills":2,"v2/spot/trade/current-plan-order":1,"v2/spot/trade/history-plan-order":1,"v2/spot/account/info":20,"v2/spot/account/assets":2,"v2/spot/account/subaccount-assets":2,"v2/spot/account/bills":2,"v2/spot/account/transferRecords":1,"v2/account/funding-assets":2,"v2/account/bot-assets":2,"v2/account/all-account-balance":20,"v2/spot/wallet/deposit-address":2,"v2/spot/wallet/deposit-records":2,"v2/spot/wallet/withdrawal-records":2},post:{"spot/v1/wallet/transfer":4,"spot/v1/wallet/transfer-v2":4,"spot/v1/wallet/subTransfer":10,"spot/v1/wallet/withdrawal":4,"spot/v1/wallet/withdrawal-v2":4,"spot/v1/wallet/withdrawal-inner":4,"spot/v1/wallet/withdrawal-inner-v2":4,"spot/v1/account/sub-account-spot-assets":200,"spot/v1/account/bills":2,"spot/v1/trade/orders":2,"spot/v1/trade/batch-orders":4,"spot/v1/trade/cancel-order":2,"spot/v1/trade/cancel-order-v2":2,"spot/v1/trade/cancel-symbol-order":2,"spot/v1/trade/cancel-batch-orders":4,"spot/v1/trade/cancel-batch-orders-v2":4,"spot/v1/trade/orderInfo":1,"spot/v1/trade/open-orders":1,"spot/v1/trade/history":1,"spot/v1/trade/fills":1,"spot/v1/plan/placePlan":1,"spot/v1/plan/modifyPlan":1,"spot/v1/plan/cancelPlan":1,"spot/v1/plan/currentPlan":1,"spot/v1/plan/historyPlan":1,"spot/v1/plan/batchCancelPlan":2,"spot/v1/convert/quoted-price":4,"spot/v1/convert/trade":4,"spot/v1/loan/borrow":2,"spot/v1/loan/repay":2,"spot/v1/loan/revise-pledge":2,"spot/v1/trace/order/orderCurrentList":2,"spot/v1/trace/order/orderHistoryList":2,"spot/v1/trace/order/closeTrackingOrder":2,"spot/v1/trace/order/updateTpsl":2,"spot/v1/trace/order/followerEndOrder":2,"spot/v1/trace/order/spotInfoList":2,"spot/v1/trace/config/getTraderSettings":2,"spot/v1/trace/config/getFollowerSettings":2,"spot/v1/trace/user/myTraders":2,"spot/v1/trace/config/setFollowerConfig":2,"spot/v1/trace/user/myFollowers":2,"spot/v1/trace/config/setProductCode":2,"spot/v1/trace/user/removeTrader":2,"spot/v1/trace/getRemovableFollower":2,"spot/v1/trace/user/removeFollower":2,"spot/v1/trace/profit/totalProfitInfo":2,"spot/v1/trace/profit/totalProfitList":2,"spot/v1/trace/profit/profitHisList":2,"spot/v1/trace/profit/profitHisDetailList":2,"spot/v1/trace/profit/waitProfitDetailList":2,"spot/v1/trace/user/getTraderInfo":2,"v2/spot/trade/place-order":2,"v2/spot/trade/cancel-order":2,"v2/spot/trade/batch-orders":20,"v2/spot/trade/batch-cancel-order":2,"v2/spot/trade/cancel-symbol-order":4,"v2/spot/trade/place-plan-order":1,"v2/spot/trade/modify-plan-order":1,"v2/spot/trade/cancel-plan-order":1,"v2/spot/trade/batch-cancel-plan-order":2,"v2/spot/wallet/transfer":2,"v2/spot/wallet/subaccount-transfer":2,"v2/spot/wallet/withdrawal":2,"v2/spot/wallet/cancel-withdrawal":2,"v2/spot/wallet/modify-deposit-account":2}},mix:{get:{"mix/v1/account/account":2,"mix/v1/account/accounts":2,"mix/v1/position/singlePosition":2,"mix/v1/position/singlePosition-v2":2,"mix/v1/position/allPosition":4,"mix/v1/position/allPosition-v2":4,"mix/v1/position/history-position":1,"mix/v1/account/accountBill":2,"mix/v1/account/accountBusinessBill":4,"mix/v1/order/current":1,"mix/v1/order/marginCoinCurrent":1,"mix/v1/order/history":2,"mix/v1/order/historyProductType":4,"mix/v1/order/detail":2,"mix/v1/order/fills":2,"mix/v1/order/allFills":2,"mix/v1/plan/currentPlan":1,"mix/v1/plan/historyPlan":2,"mix/v1/trace/currentTrack":2,"mix/v1/trace/followerOrder":2,"mix/v1/trace/followerHistoryOrders":2,"mix/v1/trace/historyTrack":2,"mix/v1/trace/summary":1,"mix/v1/trace/profitSettleTokenIdGroup":1,"mix/v1/trace/profitDateGroupList":1,"mix/v1/trade/profitDateList":2,"mix/v1/trace/waitProfitDateList":1,"mix/v1/trace/traderSymbols":1,"mix/v1/trace/traderList":2,"mix/v1/trace/traderDetail":2,"mix/v1/trace/queryTraceConfig":2,"v2/mix/account/account":2,"v2/mix/account/accounts":2,"v2/mix/account/sub-account-assets":200,"v2/mix/account/open-count":2,"v2/mix/account/bill":2,"v2/mix/market/query-position-lever":2,"v2/mix/position/single-position":2,"v2/mix/position/all-position":4,"v2/mix/position/history-position":1,"v2/mix/order/detail":2,"v2/mix/order/fills":2,"v2/mix/order/fill-history":2,"v2/mix/order/orders-pending":2,"v2/mix/order/orders-history":2,"v2/mix/order/orders-plan-pending":2,"v2/mix/order/orders-plan-history":2,"v2/mix/market/position-long-short":20},post:{"mix/v1/account/sub-account-contract-assets":200,"mix/v1/account/open-count":1,"mix/v1/account/setLeverage":4,"mix/v1/account/setMargin":4,"mix/v1/account/setMarginMode":4,"mix/v1/account/setPositionMode":4,"mix/v1/order/placeOrder":2,"mix/v1/order/batch-orders":2,"mix/v1/order/cancel-order":2,"mix/v1/order/cancel-batch-orders":2,"mix/v1/order/modifyOrder":2,"mix/v1/order/cancel-symbol-orders":2,"mix/v1/order/cancel-all-orders":2,"mix/v1/order/close-all-positions":20,"mix/v1/plan/placePlan":2,"mix/v1/plan/modifyPlan":2,"mix/v1/plan/modifyPlanPreset":2,"mix/v1/plan/placeTPSL":2,"mix/v1/plan/placeTrailStop":2,"mix/v1/plan/placePositionsTPSL":2,"mix/v1/plan/modifyTPSLPlan":2,"mix/v1/plan/cancelPlan":2,"mix/v1/plan/cancelSymbolPlan":2,"mix/v1/plan/cancelAllPlan":2,"mix/v1/trace/closeTrackOrder":2,"mix/v1/trace/modifyTPSL":2,"mix/v1/trace/closeTrackOrderBySymbol":2,"mix/v1/trace/setUpCopySymbols":2,"mix/v1/trace/followerSetBatchTraceConfig":2,"mix/v1/trace/followerCloseByTrackingNo":2,"mix/v1/trace/followerCloseByAll":2,"mix/v1/trace/followerSetTpsl":2,"mix/v1/trace/cancelCopyTrader":4,"mix/v1/trace/traderUpdateConfig":2,"mix/v1/trace/myTraderList":2,"mix/v1/trace/myFollowerList":2,"mix/v1/trace/removeFollower":2,"mix/v1/trace/public/getFollowerConfig":2,"mix/v1/trace/report/order/historyList":2,"mix/v1/trace/report/order/currentList":2,"mix/v1/trace/queryTraderTpslRatioConfig":2,"mix/v1/trace/traderUpdateTpslRatioConfig":2,"v2/mix/account/set-leverage":4,"v2/mix/account/set-margin":4,"v2/mix/account/set-margin-mode":4,"v2/mix/account/set-position-mode":4,"v2/mix/order/place-order":2,"v2/mix/order/click-backhand":20,"v2/mix/order/batch-place-order":20,"v2/mix/order/modify-order":2,"v2/mix/order/cancel-order":2,"v2/mix/order/batch-cancel-orders":2,"v2/mix/order/close-positions":20,"v2/mix/order/place-tpsl-order":2,"v2/mix/order/place-plan-order":2,"v2/mix/order/modify-tpsl-order":2,"v2/mix/order/modify-plan-order":2,"v2/mix/order/cancel-plan-order":2}},user:{get:{"user/v1/fee/query":2,"user/v1/sub/virtual-list":2,"user/v1/sub/virtual-api-list":2,"user/v1/tax/spot-record":1,"user/v1/tax/future-record":1,"user/v1/tax/margin-record":1,"user/v1/tax/p2p-record":1,"v2/user/virtual-subaccount-list":2,"v2/user/virtual-subaccount-apikey-list":2},post:{"user/v1/sub/virtual-create":4,"user/v1/sub/virtual-modify":4,"user/v1/sub/virtual-api-batch-create":20,"user/v1/sub/virtual-api-create":4,"user/v1/sub/virtual-api-modify":4,"v2/user/create-virtual-subaccount":4,"v2/user/modify-virtual-subaccount":4,"v2/user/batch-create-subaccount-and-apikey":20,"v2/user/create-virtual-subaccount-apikey":4,"v2/user/modify-virtual-subaccount-apikey":4}},p2p:{get:{"p2p/v1/merchant/merchantList":2,"p2p/v1/merchant/merchantInfo":2,"p2p/v1/merchant/advList":2,"p2p/v1/merchant/orderList":2,"v2/p2p/merchantList":2,"v2/p2p/merchantInfo":2,"v2/p2p/orderList":2,"v2/p2p/advList":2}},broker:{get:{"broker/v1/account/info":2,"broker/v1/account/sub-list":20,"broker/v1/account/sub-email":20,"broker/v1/account/sub-spot-assets":2,"broker/v1/account/sub-future-assets":2,"broker/v1/account/subaccount-transfer":1,"broker/v1/account/subaccount-deposit":1,"broker/v1/account/subaccount-withdrawal":1,"broker/v1/account/sub-api-list":2,"v2/broker/account/info":2,"v2/broker/account/subaccount-list":20,"v2/broker/account/subaccount-email":2,"v2/broker/account/subaccount-spot-assets":2,"v2/broker/account/subaccount-future-assets":2,"v2/broker/manage/subaccount-apikey-list":2},post:{"broker/v1/account/sub-create":20,"broker/v1/account/sub-modify":20,"broker/v1/account/sub-modify-email":20,"broker/v1/account/sub-address":2,"broker/v1/account/sub-withdrawal":2,"broker/v1/account/sub-auto-transfer":4,"broker/v1/account/sub-api-create":2,"broker/v1/account/sub-api-modify":2,"v2/broker/account/modify-subaccount-email":2,"v2/broker/account/create-subaccount":20,"v2/broker/account/modify-subaccount":20,"v2/broker/account/subaccount-address":2,"v2/broker/account/subaccount-withdrawal":2,"v2/broker/account/set-subaccount-autotransfer":2,"v2/broker/manage/create-subaccount-apikey":2,"v2/broker/manage/modify-subaccount-apikey":2}},margin:{get:{"margin/v1/cross/account/riskRate":2,"margin/v1/cross/account/maxTransferOutAmount":2,"margin/v1/isolated/account/maxTransferOutAmount":2,"margin/v1/isolated/order/openOrders":2,"margin/v1/isolated/order/history":2,"margin/v1/isolated/order/fills":2,"margin/v1/isolated/loan/list":2,"margin/v1/isolated/repay/list":2,"margin/v1/isolated/interest/list":2,"margin/v1/isolated/liquidation/list":2,"margin/v1/isolated/fin/list":2,"margin/v1/cross/order/openOrders":2,"margin/v1/cross/order/history":2,"margin/v1/cross/order/fills":2,"margin/v1/cross/loan/list":2,"margin/v1/cross/repay/list":2,"margin/v1/cross/interest/list":2,"margin/v1/cross/liquidation/list":2,"margin/v1/cross/fin/list":2,"margin/v1/cross/account/assets":2,"margin/v1/isolated/account/assets":2,"v2/margin/crossed/borrow-history":2,"v2/margin/crossed/repay-history":2,"v2/margin/crossed/interest-history":2,"v2/margin/crossed/liquidation-history":2,"v2/margin/crossed/financial-records":2,"v2/margin/crossed/account/assets":2,"v2/margin/crossed/account/risk-rate":2,"v2/margin/crossed/account/max-borrowable-amount":2,"v2/margin/crossed/account/max-transfer-out-amount":2,"v2/margin/crossed/interest-rate-and-limit":2,"v2/margin/crossed/tier-data":2,"v2/margin/crossed/open-orders":2,"v2/margin/crossed/history-orders":2,"v2/margin/crossed/fills":2,"v2/margin/isolated/borrow-history":2,"v2/margin/isolated/repay-history":2,"v2/margin/isolated/interest-history":2,"v2/margin/isolated/liquidation-history":2,"v2/margin/isolated/financial-records":2,"v2/margin/isolated/account/assets":2,"v2/margin/isolated/account/risk-rate":2,"v2/margin/isolated/account/max-borrowable-amount":2,"v2/margin/isolated/account/max-transfer-out-amount":2,"v2/margin/isolated/interest-rate-and-limit":2,"v2/margin/isolated/tier-data":2,"v2/margin/isolated/open-orders":2,"v2/margin/isolated/history-orders":2,"v2/margin/isolated/fills":2},post:{"margin/v1/cross/account/borrow":2,"margin/v1/isolated/account/borrow":2,"margin/v1/cross/account/repay":2,"margin/v1/isolated/account/repay":2,"margin/v1/isolated/account/riskRate":2,"margin/v1/cross/account/maxBorrowableAmount":2,"margin/v1/isolated/account/maxBorrowableAmount":2,"margin/v1/isolated/account/flashRepay":2,"margin/v1/isolated/account/queryFlashRepayStatus":2,"margin/v1/cross/account/flashRepay":2,"margin/v1/cross/account/queryFlashRepayStatus":2,"margin/v1/isolated/order/placeOrder":4,"margin/v1/isolated/order/batchPlaceOrder":4,"margin/v1/isolated/order/cancelOrder":2,"margin/v1/isolated/order/batchCancelOrder":2,"margin/v1/cross/order/placeOrder":2,"margin/v1/cross/order/batchPlaceOrder":2,"margin/v1/cross/order/cancelOrder":2,"margin/v1/cross/order/batchCancelOrder":2,"v2/margin/crossed/account/borrow":2,"v2/margin/crossed/account/repay":2,"v2/margin/crossed/account/flash-repay":2,"v2/margin/crossed/account/query-flash-repay-status":2,"v2/margin/crossed/place-order":2,"v2/margin/crossed/batch-place-order":2,"v2/margin/crossed/cancel-order":2,"v2/margin/crossed/batch-cancel-order":2,"v2/margin/isolated/account/borrow":2,"v2/margin/isolated/account/repay":2,"v2/margin/isolated/account/flash-repay":2,"v2/margin/isolated/account/query-flash-repay-status":2,"v2/margin/isolated/place-order":2,"v2/margin/isolated/batch-place-order":2,"v2/margin/isolated/cancel-order":2,"v2/margin/isolated/batch-cancel-order":2}},copy:{get:{"v2/copy/mix-trader/order-current-track":2,"v2/copy/mix-trader/order-history-track":2,"v2/copy/mix-trader/order-total-detail":2,"v2/copy/mix-trader/profit-history-summarys":1,"v2/copy/mix-trader/profit-history-details":1,"v2/copy/mix-trader/profit-details":1,"v2/copy/mix-trader/profits-group-coin-date":1,"v2/copy/mix-trader/config-query-symbols":1,"v2/copy/mix-trader/config-query-followers":2,"v2/copy/mix-follower/query-current-orders":2,"v2/copy/mix-follower/query-history-orders":1,"v2/copy/mix-follower/query-settings":2,"v2/copy/mix-follower/query-traders":2,"v2/copy/mix-follower/query-quantity-limit":2,"v2/copy/mix-broker/query-traders":2,"v2/copy/mix-broker/query-history-traces":2,"v2/copy/mix-broker/query-current-traces":2,"v2/copy/spot-trader/profit-summarys":2,"v2/copy/spot-trader/profit-history-details":2,"v2/copy/spot-trader/profit-details":2,"v2/copy/spot-trader/order-total-detail":2,"v2/copy/spot-trader/order-history-track":2,"v2/copy/spot-trader/order-current-track":2,"v2/copy/spot-trader/config-query-settings":2,"v2/copy/spot-trader/config-query-followers":2,"v2/copy/spot-follower/query-traders":2,"v2/copy/spot-follower/query-trader-symbols":2,"v2/copy/spot-follower/query-settings":2,"v2/copy/spot-follower/query-history-orders":2,"v2/copy/spot-follower/query-current-orders":2},post:{"v2/copy/mix-trader/order-modify-tpsl":2,"v2/copy/mix-trader/order-close-positions":2,"v2/copy/mix-trader/config-setting-symbols":2,"v2/copy/mix-trader/config-setting-base":2,"v2/copy/mix-trader/config-remove-follower":2,"v2/copy/mix-follower/setting-tpsl":1,"v2/copy/mix-follower/settings":2,"v2/copy/mix-follower/close-positions":2,"v2/copy/mix-follower/cancel-trader":4,"v2/copy/spot-trader/order-modify-tpsl":2,"v2/copy/spot-trader/order-close-tracking":2,"v2/copy/spot-trader/config-setting-symbols":2,"v2/copy/spot-trader/config-remove-follower":2,"v2/copy/spot-follower/stop-order":2,"v2/copy/spot-follower/settings":2,"v2/copy/spot-follower/setting-tpsl":2,"v2/copy/spot-follower/order-close-tracking":2,"v2/copy/spot-follower/cancel-trader":2}},tax:{get:{"v2/tax/spot-record":20,"v2/tax/future-record":20,"v2/tax/margin-record":20,"v2/tax/p2p-record":20}},convert:{get:{"v2/convert/currencies":2,"v2/convert/quoted-price":2,"v2/convert/convert-record":2,"v2/convert/bgb-convert-coin-list":2,"v2/convert/bgb-convert-records":2},post:{"v2/convert/trade":2,"v2/convert/bgb-convert":2}},earn:{get:{"v2/earn/savings/product":2,"v2/earn/savings/account":2,"v2/earn/savings/assets":2,"v2/earn/savings/records":2,"v2/earn/savings/subscribe-info":2,"v2/earn/savings/subscribe-result":2,"v2/earn/savings/redeem-result":2,"v2/earn/sharkfin/product":2,"v2/earn/sharkfin/account":2,"v2/earn/sharkfin/assets":2,"v2/earn/sharkfin/records":2,"v2/earn/sharkfin/subscribe-info":2,"v2/earn/sharkfin/subscribe-result":4,"v2/earn/loan/ongoing-orders":2,"v2/earn/loan/repay-history":2,"v2/earn/loan/revise-history":2,"v2/earn/loan/borrow-history":2,"v2/earn/loan/debts":2,"v2/earn/loan/reduces":2,"v2/earn/account/assets":2},post:{"v2/earn/savings/subscribe":2,"v2/earn/savings/redeem":2,"v2/earn/sharkfin/subscribe":2,"v2/earn/loan/borrow":2,"v2/earn/loan/repay":2,"v2/earn/loan/revise-pledge":2}},common:{get:{"v2/common/trade-rate":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:!0,secret:!0,password:!0},exceptions:{exact:{1:r.ExchangeError,"failure to get a peer from the ring-balancer":r.ExchangeNotAvailable,4010:r.PermissionDenied,4001:r.ExchangeError,4002:r.ExchangeError,30001:r.AuthenticationError,30002:r.AuthenticationError,30003:r.AuthenticationError,30004:r.AuthenticationError,30005:r.InvalidNonce,30006:r.AuthenticationError,30007:r.BadRequest,30008:r.RequestTimeout,30009:r.ExchangeError,30010:r.AuthenticationError,30011:r.PermissionDenied,30012:r.AuthenticationError,30013:r.AuthenticationError,30014:r.DDoSProtection,30015:r.AuthenticationError,30016:r.ExchangeError,30017:r.ExchangeError,30018:r.ExchangeError,30019:r.ExchangeNotAvailable,30020:r.BadRequest,30021:r.BadRequest,30022:r.PermissionDenied,30023:r.BadRequest,30024:r.BadSymbol,30025:r.BadRequest,30026:r.DDoSProtection,30027:r.AuthenticationError,30028:r.PermissionDenied,30029:r.AccountSuspended,30030:r.ExchangeError,30031:r.BadRequest,30032:r.BadSymbol,30033:r.BadRequest,30034:r.ExchangeError,30035:r.ExchangeError,30036:r.ExchangeError,30037:r.ExchangeNotAvailable,30038:r.OnMaintenance,32001:r.AccountSuspended,32002:r.PermissionDenied,32003:r.CancelPending,32004:r.ExchangeError,32005:r.InvalidOrder,32006:r.InvalidOrder,32007:r.InvalidOrder,32008:r.InvalidOrder,32009:r.InvalidOrder,32010:r.ExchangeError,32011:r.ExchangeError,32012:r.ExchangeError,32013:r.ExchangeError,32014:r.ExchangeError,32015:r.ExchangeError,32016:r.ExchangeError,32017:r.ExchangeError,32018:r.ExchangeError,32019:r.ExchangeError,32020:r.ExchangeError,32021:r.ExchangeError,32022:r.ExchangeError,32023:r.ExchangeError,32024:r.ExchangeError,32025:r.ExchangeError,32026:r.ExchangeError,32027:r.ExchangeError,32028:r.AccountSuspended,32029:r.ExchangeError,32030:r.InvalidOrder,32031:r.ArgumentsRequired,32038:r.AuthenticationError,32040:r.ExchangeError,32044:r.ExchangeError,32045:r.ExchangeError,32046:r.ExchangeError,32047:r.ExchangeError,32048:r.InvalidOrder,32049:r.ExchangeError,32050:r.InvalidOrder,32051:r.InvalidOrder,32052:r.ExchangeError,32053:r.ExchangeError,32057:r.ExchangeError,32054:r.ExchangeError,32055:r.InvalidOrder,32056:r.ExchangeError,32058:r.ExchangeError,32059:r.InvalidOrder,32060:r.InvalidOrder,32061:r.InvalidOrder,32062:r.InvalidOrder,32063:r.InvalidOrder,32064:r.ExchangeError,32065:r.ExchangeError,32066:r.ExchangeError,32067:r.ExchangeError,32068:r.ExchangeError,32069:r.ExchangeError,32070:r.ExchangeError,32071:r.ExchangeError,32072:r.ExchangeError,32073:r.ExchangeError,32074:r.ExchangeError,32075:r.ExchangeError,32076:r.ExchangeError,32077:r.ExchangeError,32078:r.ExchangeError,32079:r.ExchangeError,32080:r.ExchangeError,32083:r.ExchangeError,33001:r.PermissionDenied,33002:r.AccountSuspended,33003:r.InsufficientFunds,33004:r.ExchangeError,33005:r.ExchangeError,33006:r.ExchangeError,33007:r.ExchangeError,33008:r.InsufficientFunds,33009:r.ExchangeError,33010:r.ExchangeError,33011:r.ExchangeError,33012:r.ExchangeError,33013:r.InvalidOrder,33014:r.OrderNotFound,33015:r.InvalidOrder,33016:r.ExchangeError,33017:r.InsufficientFunds,33018:r.ExchangeError,33020:r.ExchangeError,33021:r.BadRequest,33022:r.InvalidOrder,33023:r.ExchangeError,33024:r.InvalidOrder,33025:r.InvalidOrder,33026:r.ExchangeError,33027:r.InvalidOrder,33028:r.InvalidOrder,33029:r.InvalidOrder,33034:r.ExchangeError,33035:r.ExchangeError,33036:r.ExchangeError,33037:r.ExchangeError,33038:r.ExchangeError,33039:r.ExchangeError,33040:r.ExchangeError,33041:r.ExchangeError,33042:r.ExchangeError,33043:r.ExchangeError,33044:r.ExchangeError,33045:r.ExchangeError,33046:r.ExchangeError,33047:r.ExchangeError,33048:r.ExchangeError,33049:r.ExchangeError,33050:r.ExchangeError,33051:r.ExchangeError,33059:r.BadRequest,33060:r.BadRequest,33061:r.ExchangeError,33062:r.ExchangeError,33063:r.ExchangeError,33064:r.ExchangeError,33065:r.ExchangeError,21009:r.ExchangeError,34001:r.PermissionDenied,34002:r.InvalidAddress,34003:r.ExchangeError,34004:r.ExchangeError,34005:r.ExchangeError,34006:r.ExchangeError,34007:r.ExchangeError,34008:r.InsufficientFunds,34009:r.ExchangeError,34010:r.ExchangeError,34011:r.ExchangeError,34012:r.ExchangeError,34013:r.ExchangeError,34014:r.ExchangeError,34015:r.ExchangeError,34016:r.PermissionDenied,34017:r.AccountSuspended,34018:r.AuthenticationError,34019:r.PermissionDenied,34020:r.PermissionDenied,34021:r.InvalidAddress,34022:r.ExchangeError,34023:r.PermissionDenied,34026:r.ExchangeError,34036:r.ExchangeError,34037:r.ExchangeError,34038:r.ExchangeError,34039:r.ExchangeError,35001:r.ExchangeError,35002:r.ExchangeError,35003:r.ExchangeError,35004:r.ExchangeError,35005:r.AuthenticationError,35008:r.InvalidOrder,35010:r.InvalidOrder,35012:r.InvalidOrder,35014:r.InvalidOrder,35015:r.InvalidOrder,35017:r.ExchangeError,35019:r.InvalidOrder,35020:r.InvalidOrder,35021:r.InvalidOrder,35022:r.ExchangeError,35024:r.ExchangeError,35025:r.InsufficientFunds,35026:r.ExchangeError,35029:r.OrderNotFound,35030:r.InvalidOrder,35031:r.InvalidOrder,35032:r.ExchangeError,35037:r.ExchangeError,35039:r.ExchangeError,35040:r.InvalidOrder,35044:r.ExchangeError,35046:r.InsufficientFunds,35047:r.InsufficientFunds,35048:r.ExchangeError,35049:r.InvalidOrder,35050:r.InvalidOrder,35052:r.InsufficientFunds,35053:r.ExchangeError,35055:r.InsufficientFunds,35057:r.ExchangeError,35058:r.ExchangeError,35059:r.BadRequest,35060:r.BadRequest,35061:r.BadRequest,35062:r.InvalidOrder,35063:r.InvalidOrder,35064:r.InvalidOrder,35066:r.InvalidOrder,35067:r.InvalidOrder,35068:r.InvalidOrder,35069:r.InvalidOrder,35070:r.InvalidOrder,35071:r.InvalidOrder,35072:r.InvalidOrder,35073:r.InvalidOrder,35074:r.InvalidOrder,35075:r.InvalidOrder,35076:r.InvalidOrder,35077:r.InvalidOrder,35078:r.InvalidOrder,35079:r.InvalidOrder,35080:r.InvalidOrder,35081:r.InvalidOrder,35082:r.InvalidOrder,35083:r.InvalidOrder,35084:r.InvalidOrder,35085:r.InvalidOrder,35086:r.InvalidOrder,35087:r.InvalidOrder,35088:r.InvalidOrder,35089:r.InvalidOrder,35090:r.ExchangeError,35091:r.ExchangeError,35092:r.ExchangeError,35093:r.ExchangeError,35094:r.ExchangeError,35095:r.BadRequest,35096:r.ExchangeError,35097:r.ExchangeError,35098:r.ExchangeError,35099:r.ExchangeError,36001:r.BadRequest,36002:r.BadRequest,36005:r.ExchangeError,36101:r.AuthenticationError,36102:r.PermissionDenied,36103:r.AccountSuspended,36104:r.PermissionDenied,36105:r.PermissionDenied,36106:r.AccountSuspended,36107:r.PermissionDenied,36108:r.InsufficientFunds,36109:r.PermissionDenied,36201:r.PermissionDenied,36202:r.PermissionDenied,36203:r.InvalidOrder,36204:r.ExchangeError,36205:r.BadRequest,36206:r.BadRequest,36207:r.InvalidOrder,36208:r.InvalidOrder,36209:r.InvalidOrder,36210:r.InvalidOrder,36211:r.InvalidOrder,36212:r.InvalidOrder,36213:r.InvalidOrder,36214:r.ExchangeError,36216:r.OrderNotFound,36217:r.InvalidOrder,36218:r.InvalidOrder,36219:r.InvalidOrder,36220:r.InvalidOrder,36221:r.InvalidOrder,36222:r.InvalidOrder,36223:r.InvalidOrder,36224:r.InvalidOrder,36225:r.InvalidOrder,36226:r.InvalidOrder,36227:r.InvalidOrder,36228:r.InvalidOrder,36229:r.InvalidOrder,36230:r.InvalidOrder,400:r.BadRequest,401:r.AuthenticationError,403:r.PermissionDenied,404:r.BadRequest,405:r.BadRequest,415:r.BadRequest,429:r.DDoSProtection,500:r.ExchangeNotAvailable,1001:r.RateLimitExceeded,1002:r.ExchangeError,1003:r.ExchangeError,40001:r.AuthenticationError,40002:r.AuthenticationError,40003:r.AuthenticationError,40004:r.InvalidNonce,40005:r.InvalidNonce,40006:r.AuthenticationError,40007:r.BadRequest,40008:r.InvalidNonce,40009:r.AuthenticationError,40010:r.AuthenticationError,40011:r.AuthenticationError,40012:r.AuthenticationError,40013:r.ExchangeError,40014:r.PermissionDenied,40015:r.ExchangeError,40016:r.PermissionDenied,40017:r.ExchangeError,40018:r.PermissionDenied,40019:r.BadRequest,40031:r.AccountSuspended,40037:r.AuthenticationError,40102:r.BadRequest,40103:r.BadRequest,40104:r.ExchangeError,40105:r.ExchangeError,40106:r.ExchangeError,40107:r.ExchangeError,40108:r.InvalidOrder,40109:r.OrderNotFound,40200:r.OnMaintenance,40201:r.InvalidOrder,40202:r.ExchangeError,40203:r.BadRequest,40204:r.BadRequest,40205:r.BadRequest,40206:r.BadRequest,40207:r.BadRequest,40208:r.BadRequest,40209:r.BadRequest,40300:r.ExchangeError,40301:r.PermissionDenied,40302:r.BadRequest,40303:r.BadRequest,40304:r.BadRequest,40305:r.BadRequest,40306:r.ExchangeError,40308:r.OnMaintenance,40309:r.BadSymbol,40400:r.ExchangeError,40401:r.ExchangeError,40402:r.BadRequest,40403:r.BadRequest,40404:r.BadRequest,40405:r.BadRequest,40406:r.BadRequest,40407:r.ExchangeError,40408:r.ExchangeError,40409:r.ExchangeError,40500:r.InvalidOrder,40501:r.ExchangeError,40502:r.ExchangeError,40503:r.ExchangeError,40504:r.ExchangeError,40505:r.ExchangeError,40506:r.AuthenticationError,40507:r.AuthenticationError,40508:r.ExchangeError,40509:r.ExchangeError,40600:r.ExchangeError,40601:r.ExchangeError,40602:r.ExchangeError,40603:r.ExchangeError,40604:r.ExchangeNotAvailable,40605:r.ExchangeError,40606:r.ExchangeError,40607:r.ExchangeError,40608:r.ExchangeError,40609:r.ExchangeError,40700:r.BadRequest,40701:r.ExchangeError,40702:r.ExchangeError,40703:r.ExchangeError,40704:r.ExchangeError,40705:r.BadRequest,40706:r.InvalidOrder,40707:r.BadRequest,40708:r.BadRequest,40709:r.ExchangeError,40710:r.ExchangeError,40711:r.InsufficientFunds,40712:r.InsufficientFunds,40713:r.ExchangeError,40714:r.ExchangeError,40762:r.InsufficientFunds,40768:r.OrderNotFound,40808:r.InvalidOrder,41103:r.InvalidOrder,41114:r.OnMaintenance,43011:r.InvalidOrder,43001:r.OrderNotFound,43012:r.InsufficientFunds,43025:r.InvalidOrder,43115:r.OnMaintenance,45110:r.InvalidOrder,"invalid sign":r.AuthenticationError,"invalid currency":r.BadSymbol,"invalid symbol":r.BadSymbol,"invalid period":r.BadRequest,"invalid user":r.ExchangeError,"invalid amount":r.InvalidOrder,"invalid type":r.InvalidOrder,"invalid orderId":r.InvalidOrder,"invalid record":r.ExchangeError,"invalid accountId":r.BadRequest,"invalid address":r.BadRequest,"accesskey not null":r.AuthenticationError,"illegal accesskey":r.AuthenticationError,"sign not null":r.AuthenticationError,"req_time is too much difference from server time":r.InvalidNonce,"permissions not right":r.PermissionDenied,"illegal sign invalid":r.AuthenticationError,"user locked":r.AccountSuspended,"Request Frequency Is Too High":r.RateLimitExceeded,"more than a daily rate of cash":r.BadRequest,"more than the maximum daily withdrawal amount":r.BadRequest,"need to bind email or mobile":r.ExchangeError,"user forbid":r.PermissionDenied,"User Prohibited Cash Withdrawal":r.PermissionDenied,"Cash Withdrawal Is Less Than The Minimum Value":r.BadRequest,"Cash Withdrawal Is More Than The Maximum Value":r.BadRequest,"the account with in 24 hours ban coin":r.PermissionDenied,"order cancel fail":r.BadRequest,"base symbol error":r.BadSymbol,"base date error":r.ExchangeError,"api signature not valid":r.AuthenticationError,"gateway internal error":r.ExchangeError,"audit failed":r.ExchangeError,"order queryorder invalid":r.BadRequest,"market no need price":r.InvalidOrder,"limit need price":r.InvalidOrder,"userid not equal to account_id":r.ExchangeError,"your balance is low":r.InsufficientFunds,"address invalid cointype":r.ExchangeError,"system exception":r.ExchangeError,50003:r.ExchangeError,50004:r.BadSymbol,50006:r.PermissionDenied,50007:r.PermissionDenied,50008:r.RequestTimeout,50009:r.RateLimitExceeded,50010:r.ExchangeError,50014:r.InvalidOrder,50015:r.InvalidOrder,50016:r.InvalidOrder,50017:r.InvalidOrder,50018:r.InvalidOrder,50019:r.InvalidOrder,50020:r.InsufficientFunds,50021:r.InvalidOrder,50026:r.InvalidOrder,"invalid order query time":r.ExchangeError,"invalid start time":r.BadRequest,"invalid end time":r.BadRequest,20003:r.ExchangeError,"01001":r.ExchangeError,43111:r.PermissionDenied},broad:{"invalid size, valid range":r.ExchangeError}},precisionMode:o.kb,commonCurrencies:{APX:"AstroPepeX",DEGEN:"DegenReborn",JADE:"Jade Protocol",OMNI:"omni",TONCOIN:"TON"},options:{timeDifference:0,adjustForTimeDifference:!1,timeframes:{spot:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","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:!0,broker:"p4sve",withdraw:{fillResponseFromRequest:!0},fetchOHLCV:{spot:{method:"publicSpotGetV2SpotMarketCandles"},swap:{method:"publicMixGetV2MixMarketCandles"},maxDaysPerTimeframe:{"1m":30,"3m":30,"5m":30,"10m":30,"15m":52,"30m":62,"1h":83,"2h":120,"4h":240,"6h":360,"12h":360,"1d":300,"3d":300,"1w":300,"1M":300}},fetchTrades:{spot:{method:"publicSpotGetV2SpotMarketFillsHistory"},swap:{method:"publicMixGetV2MixMarketFillsHistory"}},accountsByType:{spot:"spot",cross:"crossed_margin",isolated:"isolated_margin",swap:"usdt_futures",usdc_swap:"usdc_futures",future:"coin_futures",p2p:"p2p"},accountsById:{spot:"spot",crossed_margin:"cross",isolated_margin:"isolated",usdt_futures:"swap",usdc_futures:"usdc_swap",coin_futures:"future",p2p:"p2p"},sandboxMode:!1,networks:{TRC20:"TRC20",ERC20:"ERC20",BEP20:"BSC",BSC:"BEP20",ATOM:"ATOM",ACA:"AcalaToken",APT:"Aptos",ARBONE:"ArbitrumOne",ARBNOVA:"ArbitrumNova",AVAXC:"C-Chain",AVAXX:"X-Chain",AR:"Arweave",BCH:"BCH",BCHA:"BCHA",BITCI:"BITCI",BTC:"BTC",CELO:"CELO",CSPR:"CSPR",ADA:"Cardano",CHZ:"ChilizChain",CRC20:"CronosChain",DOGE:"DOGE",DOT:"DOT",EOS:"EOS",ETHF:"ETHFAIR",ETHW:"ETHW",ETC:"ETC",EGLD:"Elrond",FIL:"FIL",FIO:"FIO",FTM:"Fantom",HRC20:"HECO",ONE:"Harmony",HNT:"Helium",ICP:"ICP",IOTX:"IoTeX",KARDIA:"KAI",KAVA:"KAVA",KDA:"KDA",KLAY:"Klaytn",KSM:"Kusama",LAT:"LAT",LTC:"LTC",MINA:"MINA",MOVR:"MOVR",METIS:"MetisToken",GLMR:"Moonbeam",NEAR:"NEARProtocol",NULS:"NULS",OASYS:"OASYS",OASIS:"ROSE",OMNI:"OMNI",ONT:"Ontology",OPTIMISM:"Optimism",OSMO:"Osmosis",POKT:"PocketNetwork",MATIC:"Polygon",QTUM:"QTUM",REEF:"REEF",SOL:"SOL",SYS:"SYS",SXP:"Solar",XYM:"Symbol",TON:"TON",TT:"TT",TLOS:"Telos",THETA:"ThetaToken",VITE:"VITE",WAVES:"WAVES",WAX:"WAXP",WEMIX:"WEMIXMainnet",XDC:"XDCNetworkXDC",XRP:"XRP",FET:"FETCH",NEM:"NEM",REI:"REINetwork",ZIL:"ZIL",ABBC:"ABBCCoin",RSK:"RSK",AZERO:"AZERO",TRC10:"TRC10",JUNO:"JUNO",ZKSYNC:"zkSyncEra",STARKNET:"Starknet",VIC:"VICTION"},networksById:{},fetchPositions:{method:"privateMixGetV2MixPositionAllPosition"},defaultTimeInForce:"GTC"},features:{spot:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!1,mark:!1,index:!1},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,marketBuyRequiresPrice:!0,marketBuyByCost:!0},createOrders:{max:50},fetchMyTrades:{marginMode:!0,limit:100,daysBack:void 0,untilDays:90,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:100,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:90,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},forPerps:{extends:"spot",createOrder:{triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!0},price:!1},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,trailing:!0,marketBuyRequiresPrice:!1,marketBuyByCost:!1},fetchMyTrades:{untilDays:7},fetchClosedOrders:{trailing:!0}},swap:{linear:{extends:"forPerps"},inverse:{extends:"forPerps"}},future:{linear:{extends:"forPerps"},inverse:{extends:"forPerps"}}}})}setSandboxMode(e){this.options.sandboxMode=e}convertSymbolForSandbox(e){if(e.startsWith("S"))return e;let t;if(e.indexOf("/")>-1){if(-1===e.indexOf(":"))throw new r.NotSupported(this.id+" sandbox supports swap and future markets only");const i=e.split("/"),s=this.safeString(i,0),a=this.safeString(i,1).split(":"),o=this.safeString(a,0),n=this.safeString(a,1).split("-"),d=this.safeString(n,0),h=this.safeString(n,1);t="S"+s+"/S"+o+":S"+d,void 0!==h&&(t=t+"-"+h)}else{t="S"+e.slice(0,3)+"S"+e.slice(3)}return t}handleProductTypeAndParams(e=void 0,t={}){let i,s;if([i,t]=this.handleSubTypeAndParams("handleProductTypeAndParams",void 0,t),void 0!==i&&void 0===e){s=this.safeBool(this.options,"sandboxMode",!1)?"linear"===i?"SUSDT-FUTURES":"SCOIN-FUTURES":"linear"===i?"USDT-FUTURES":"COIN-FUTURES"}let a=this.safeString(t,"productType",s);if(void 0===a&&void 0!==e){const t=e.settle;a="USDT"===t?"USDT-FUTURES":"USDC"===t?"USDC-FUTURES":"SUSDT"===t?"SUSDT-FUTURES":"SUSDC"===t?"SUSDC-FUTURES":"SBTC"===t||"SETH"===t||"SEOS"===t?"SCOIN-FUTURES":"COIN-FUTURES"}if(void 0===a)throw new r.ArgumentsRequired(this.id+' requires a productType param, one of "USDT-FUTURES", "USDC-FUTURES", "COIN-FUTURES", "SUSDT-FUTURES", "SUSDC-FUTURES" or "SCOIN-FUTURES"');return[a,t=this.omit(t,"productType")]}async fetchTime(e={}){const t=await this.publicCommonGetV2PublicTime(e),i=this.safeValue(t,"data",{});return this.safeInteger(i,"serverTime")}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=this.safeBool(this.options,"sandboxMode",!1);let i=this.safeValue(this.options,"fetchMarkets",["spot","swap"]);t&&(i=["swap"]);const s=[];let a=!1;for(let o=0;o<i.length;o++){const n=i[o];if("swap"===n||"future"===n){let i;i=t?["SUSDT-FUTURES","SCOIN-FUTURES","SUSDC-FUTURES"]:["USDT-FUTURES","COIN-FUTURES","USDC-FUTURES"];for(let t=0;t<i.length;t++)s.push(this.publicMixGetV2MixMarketContracts(this.extend(e,{productType:i[t]})))}else{if("spot"!==n)throw new r.NotSupported(this.id+" does not support "+n+" market");s.push(this.publicSpotGetV2SpotPublicSymbols(e)),a=!0,s.push(this.publicMarginGetV2MarginCurrencies(e))}}const o=await Promise.all(s);let n=[];this.options.crossMarginPairsData=[],this.options.isolatedMarginPairsData=[];for(let e=0;e<o.length;e++){const t=this.safeDict(o,e),i=this.safeList(t,"data",[]),s=this.safeDict(i,0,{}),r=this.safeString(s,"isBorrowable");if(a&&void 0!==r){const e=Object.keys(this.indexBy(i,"symbol"));this.options.crossMarginPairsData=e,this.options.isolatedMarginPairsData=e}else n=this.arrayConcat(n,i)}const d=[];for(let e=0;e<n.length;e++)d.push(this.parseMarket(n[e]));return d}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"quoteCoin"),s=this.safeString(e,"baseCoin"),r=this.safeCurrencyCode(i),o=this.safeCurrencyCode(s),n=this.safeValue(e,"supportMarginCoins",[]);let d;d=this.inArray(s,n)?s:this.inArray(i,n)?i:this.safeString(n,0);const h=this.safeCurrencyCode(d);let c,l,u,f,p,m,g,v=o+"/"+r,y=!1,w=!1,b=!1,k=!1;const S=this.safeString(e,"symbolType");let O,T=!1;if(void 0===S){c="spot",w=!0,l=this.parseNumber(this.parsePrecision(this.safeString(e,"pricePrecision"))),u=this.parseNumber(this.parsePrecision(this.safeString(e,"quantityPrecision")));const i=this.inArray(t,this.options.crossMarginPairsData);O={cross:i,isolated:this.inArray(t,this.options.isolatedMarginPairsData)},T=i||i}else{if("perpetual"===S)c="swap",y=!0,v=v+":"+h;else if("delivery"===S){m=this.safeInteger(e,"deliveryTime"),g=this.iso8601(m);const t=g.split("-"),i=this.safeString(t,0),s=this.safeString(t,2);c="future",b=!0,v=v+":"+h+"-"+(i.slice(2,4)+this.safeString(t,1)+s.slice(0,2))}k=!0,p=o===h,f=!p;const t=this.safeInteger(e,"pricePlace"),i=this.safeInteger(e,"volumePlace"),s=this.safeString(e,"priceEndStep"),r=this.safeString(e,"minTradeNum"),n=new a.Y(s);n.decimals=Math.max(n.decimals,t),n.reduce();const d=n.toString();l=this.parseNumber(d);const w=new a.Y(r);w.decimals=Math.max(w.decimals,i),w.reduce();const T=w.toString();u=this.parseNumber(T),O={cross:!0,isolated:!0}}const P=this.safeString2(e,"status","symbolStatus");let I,M;void 0!==P&&(I="online"===P||"normal"===P),"USDT"===r&&(M=this.safeNumber(e,"minTradeUSDT"));const x=k?1:void 0;return{id:t,symbol:v,base:o,quote:r,settle:h,baseId:s,quoteId:i,settleId:d,type:c,spot:w,margin:w&&T,marginModes:O,swap:y,future:b,option:!1,active:I,contract:k,linear:f,inverse:p,taker:this.safeNumber(e,"takerFeeRate"),maker:this.safeNumber(e,"makerFeeRate"),contractSize:x,expiry:m,expiryDatetime:g,strike:void 0,optionType:void 0,precision:{amount:u,price:l},limits:{leverage:{min:this.safeNumber(e,"minLever"),max:this.safeNumber(e,"maxLever")},amount:{min:this.safeNumber2(e,"minTradeNum","minTradeAmount"),max:this.safeNumber(e,"maxTradeAmount")},price:{min:void 0,max:void 0},cost:{min:M,max:void 0}},created:this.safeInteger(e,"launchTime"),info:e}}async fetchCurrencies(e={}){const t=await this.publicSpotGetV2SpotPublicCoins(e),i={},s=this.safeValue(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"coin"),o=this.safeCurrencyCode(r),n=this.safeValue(t,"chains",[]),d={};let h,c,l,u=!1,f=!1;for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"chain");let s=this.networkIdToCode(i,o);void 0!==s&&(s=s.toUpperCase());const r="true"===this.safeString(t,"withdrawable");f=r||f;const p="true"===this.safeString(t,"rechargeable");u=p||u;const m=this.safeString(t,"withdrawFee");void 0!==m&&(l=void 0===l?m:a.Y.stringMin(m,l));const g=this.safeString(t,"minWithdrawAmount");void 0!==g&&(h=void 0===h?g:a.Y.stringMin(g,h));const v=this.safeString(t,"minDepositAmount");void 0!==v&&(c=void 0===c?v:a.Y.stringMin(v,c)),d[s]={info:t,id:i,network:s,limits:{withdraw:{min:this.parseNumber(g),max:void 0},deposit:{min:this.parseNumber(v),max:void 0}},active:r&&p,withdraw:r,deposit:p,fee:this.parseNumber(m),precision:void 0}}i[o]={info:t,id:r,code:o,networks:d,type:void 0,name:void 0,active:u&&f,deposit:u,withdraw:f,fee:this.parseNumber(l),precision:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(h),max:void 0},deposit:{min:this.parseNumber(c),max:void 0}},created:void 0}}return i}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();let i;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);const s={};let a,o;if([o,t]=this.handleMarginModeAndParams("fetchMarketLeverageTiers",t,"isolated"),i.swap||i.future){let e;[e,t]=this.handleProductTypeAndParams(i,t),s.productType=e,s.symbol=i.id,a=await this.publicMixGetV2MixMarketQueryPositionLever(this.extend(s,t))}else if("isolated"===o)s.symbol=i.id,a=await this.privateMarginGetV2MarginIsolatedTierData(this.extend(s,t));else{if("cross"!==o)throw new r.BadRequest(this.id+" fetchMarketLeverageTiers() symbol does not support market "+i.symbol);{const e=this.safeString(t,"code");if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMarketLeverageTiers() requires a code argument");t=this.omit(t,"code");const i=this.currency(e);s.coin=i.id,a=await this.privateMarginGetV2MarginCrossedTierData(this.extend(s,t))}}const n=this.safeValue(a,"data",[]);return this.parseMarketLeverageTiers(n,i)}parseMarketLeverageTiers(e,t=void 0){const i=[];let s=0;for(let r=0;r<e.length;r++){const a=e[r],o=this.safeNumber(a,"startUnit");void 0!==o&&(s=o);const n=this.safeNumberN(a,["endUnit","maxBorrowableAmount","baseMaxBorrowableAmount"]),d=this.safeString2(a,"coin","baseCoin"),h=void 0!==d?d:t.base,c=this.safeString(a,"symbol");i.push({tier:this.safeInteger2(a,"level","tier"),symbol:this.safeSymbol(c,t),currency:this.safeCurrencyCode(h),minNotional:s,maxNotional:n,maintenanceMarginRate:this.safeNumber2(a,"keepMarginRate","maintainMarginRate"),maxLeverage:this.safeNumber(a,"leverage"),info:a}),s=n}return i}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallCursor("fetchDeposits",void 0,t,i,s,"idLessThan","idLessThan",void 0,100);void 0===t&&(t=this.milliseconds()-7776e6);let a,o={startTime:t,endTime:this.milliseconds()};void 0!==e&&(a=this.currency(e),o.coin=a.id),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.privateSpotGetV2SpotWalletDepositRecords(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,void 0,t,i)}async withdraw(e,t,i,s=void 0,a={}){let o;if(this.checkAddress(i),[o,a]=this.handleNetworkCodeAndParams(a),void 0===o)throw new r.ArgumentsRequired(this.id+' withdraw() requires a "network" parameter');await this.loadMarkets();const n=this.currency(e),d=this.networkCodeToId(o),h={coin:n.id,address:i,chain:d,size:t,transferType:"on_chain"};void 0!==s&&(h.tag=s);const c=await this.privateSpotPostV2SpotWalletWithdrawal(this.extend(h,a)),l=this.safeValue(c,"data",{}),u=this.parseTransaction(l,n);u.type="withdrawal";const f=this.safeValue(this.options,"withdraw",{});return this.safeBool(f,"fillResponseFromRequest",!0)&&(u.currency=e,u.timestamp=this.milliseconds(),u.datetime=this.iso8601(this.milliseconds()),u.amount=t,u.tag=s,u.address=i,u.addressTo=i,u.network=o),u}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),a)return await this.fetchPaginatedCallCursor("fetchWithdrawals",void 0,t,i,s,"idLessThan","idLessThan",void 0,100);if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchWithdrawals() requires a `code` argument");const o=this.currency(e);void 0===t&&(t=this.milliseconds()-7776e6);let n={coin:o.id,startTime:t,endTime:this.milliseconds()};[n,s]=this.handleUntilOption("endTime",n,s),void 0!==i&&(n.limit=i);const d=await this.privateSpotGetV2SpotWalletWithdrawalRecords(this.extend(n,s)),h=this.safeList(d,"data",[]);return this.parseTransactions(h,o,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeCurrencyCode(i,t),r=this.safeInteger(e,"cTime"),o=this.safeString(e,"chain"),n=this.safeString(e,"status"),d=this.safeString(e,"tag"),h=this.safeString(e,"fee"),c=a.Y.stringAbs(h);let l,u=this.safeString(e,"size");return void 0!==c&&(l={currency:s,cost:this.parseNumber(c)},u=a.Y.stringSub(u,c)),{id:this.safeString(e,"orderId"),info:e,txid:this.safeString(e,"tradeId"),timestamp:r,datetime:this.iso8601(r),network:this.networkIdToCode(o),addressFrom:this.safeString(e,"fromAddress"),address:this.safeString(e,"toAddress"),addressTo:this.safeString(e,"toAddress"),amount:this.parseNumber(u),type:this.safeString(e,"type"),currency:s,status:this.parseTransactionStatus(n),updated:this.safeInteger(e,"uTime"),tagFrom:void 0,tag:d,tagTo:d,comment:void 0,internal:void 0,fee:l}}parseTransactionStatus(e){return this.safeString({success:"ok",Pending:"pending",pending_review:"pending",pending_review_fail:"failed",reject:"failed"},e,e)}async fetchDepositAddress(e,t={}){let i;await this.loadMarkets(),[i,t]=this.handleNetworkCodeAndParams(t);const s=this.currency(e),r={coin:s.id};void 0!==i&&(r.chain=this.networkCodeToId(i,e));const a=await this.privateSpotGetV2SpotWalletDepositAddress(this.extend(r,t)),o=this.safeDict(a,"data",{});return this.parseDepositAddress(o,s)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeString(e,"chain"),r=this.safeCurrencyCode(i,t);let a;return void 0!==s&&(a=this.networkIdToCode(s,r)),{info:e,currency:r,network:a,address:this.safeString(e,"address"),tag:this.safeString(e,"tag")}}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();let s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);s=this.market(t)}else s=this.market(e);const r={symbol:s.id};let a;if(void 0!==t&&(r.limit=t),s.spot)a=await this.publicSpotGetV2SpotMarketOrderbook(this.extend(r,i));else{let e;[e,i]=this.handleProductTypeAndParams(s,i),r.productType=e,a=await this.publicMixGetV2MixMarketMergeDepth(this.extend(r,i))}const o=this.safeValue(a,"data",{}),n=this.safeInteger(o,"ts");return this.parseOrderBook(o,s.symbol,n)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"lastPr"),r=this.safeIntegerOmitZero(e,"ts"),o=this.safeString(e,"change24h"),n=this.safeString(e,"open24"),d=this.safeString(e,"open");let h,c;return void 0===d?(h=this.safeSymbol(i,t,void 0,"contract"),c=n):(h=this.safeSymbol(i,t,void 0,"spot"),c=d),this.safeTicker({symbol:h,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high24h"),low:this.safeString(e,"low24h"),bid:this.safeString(e,"bidPr"),bidVolume:this.safeString(e,"bidSz"),ask:this.safeString(e,"askPr"),askVolume:this.safeString(e,"askSz"),vwap:void 0,open:c,close:s,last:s,previousClose:void 0,change:o,percentage:a.Y.stringMul(o,"100"),average:void 0,baseVolume:this.safeString(e,"baseVolume"),quoteVolume:this.safeString(e,"quoteVolume"),indexPrice:this.safeString(e,"indexPrice"),markPrice:this.safeString(e,"markPrice"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();let i;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);const s={symbol:i.id};let r;if(i.spot)r=await this.publicSpotGetV2SpotMarketTickers(this.extend(s,t));else{let e;[e,t]=this.handleProductTypeAndParams(i,t),s.productType=e,r=await this.publicMixGetV2MixMarketTicker(this.extend(s,t))}const a=this.safeList(r,"data",[]);return this.parseTicker(a[0],i)}async fetchMarkPrice(e,t={}){await this.loadMarkets();let i;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);const s={symbol:i.id};let a;if(i.spot)throw new r.NotSupported(this.id+" fetchMarkPrice() is not supported for spot markets");{let e;[e,t]=this.handleProductTypeAndParams(i,t),s.productType=e,a=await this.publicMixGetV2MixMarketSymbolPrice(this.extend(s,t))}const o=this.safeList(a,"data",[]);return this.parseTicker(o[0],i)}async fetchTickers(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==e){const t=this.safeValue(e,0);if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);i=this.market(e)}else i=this.market(t)}const r={};let a;[a,t]=this.handleMarketTypeAndParams("fetchTickers",i,t);const o=this.safeString(t,"subType");let n;[n,t]=this.handleProductTypeAndParams(i,t),"spot"===a&&void 0===o?s=await this.publicSpotGetV2SpotMarketTickers(this.extend(r,t)):(r.productType=n,s=await this.publicMixGetV2MixMarketTickers(this.extend(r,t)));const d=this.safeList(s,"data",[]);return this.parseTickers(d,e)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeInteger2(e,"cTime","ts");let o;const n=this.safeValue(e,"feeDetail"),d=void 0!==this.safeString(e,"posMode")?n[0]:n;if(void 0!==d){o={currency:this.safeCurrencyCode(this.safeString(d,"feeCoin"))};const e=this.safeString(d,"totalFee"),t="yes"===this.safeString(d,"deduction");o.cost=t?e:a.Y.stringNeg(e)}return this.safeTrade({info:e,id:this.safeString(e,"tradeId"),order:this.safeString(e,"orderId"),symbol:s,side:this.safeStringLower(e,"side"),type:this.safeString(e,"orderType"),takerOrMaker:this.safeString(e,"tradeScope"),price:this.safeString2(e,"priceAvg","price"),amount:this.safeString2(e,"baseVolume","size"),cost:this.safeString2(e,"quoteVolume","amount"),timestamp:r,datetime:this.iso8601(r),fee:o},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchTrades",e,t,i,s,"idLessThan","idLessThan");let a;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);a=this.market(t)}else a=this.market(e);let o={symbol:a.id};void 0!==i&&(a.contract?o.limit=Math.min(i,1e3):o.limit=i);const n=this.safeValue(this.options,"fetchTrades",{});let d;if(a.spot){const e=this.safeValue(n,"spot",{}),i=this.safeString(e,"method","publicSpotGetV2SpotMarketFillsHistory"),r=this.safeString(s,"method",i);s=this.omit(s,"method"),"publicSpotGetV2SpotMarketFillsHistory"===r?([o,s]=this.handleUntilOption("endTime",o,s),void 0!==t&&(o.startTime=t),d=await this.publicSpotGetV2SpotMarketFillsHistory(this.extend(o,s))):"publicSpotGetV2SpotMarketFills"===r&&(d=await this.publicSpotGetV2SpotMarketFills(this.extend(o,s)))}else{const e=this.safeValue(n,"swap",{}),i=this.safeString(e,"method","publicMixGetV2MixMarketFillsHistory"),r=this.safeString(s,"method",i);let h;s=this.omit(s,"method"),[h,s]=this.handleProductTypeAndParams(a,s),o.productType=h,"publicMixGetV2MixMarketFillsHistory"===r?([o,s]=this.handleUntilOption("endTime",o,s),void 0!==t&&(o.startTime=t),d=await this.publicMixGetV2MixMarketFillsHistory(this.extend(o,s))):"publicMixGetV2MixMarketFills"===r&&(d=await this.publicMixGetV2MixMarketFills(this.extend(o,s)))}const h=this.safeList(d,"data",[]);return this.parseTrades(h,a,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;[r,t]=this.handleMarginModeAndParams("fetchTradingFee",t),i.spot?s.businessType=void 0!==r?"margin":"spot":s.businessType="contract";const a=await this.privateCommonGetV2CommonTradeRate(this.extend(s,t)),o=this.safeValue(a,"data",{});return this.parseTradingFee(o,i)}async fetchTradingFees(e={}){let t,i,s;if(await this.loadMarkets(),[i,e]=this.handleMarginModeAndParams("fetchTradingFees",e),[s,e]=this.handleMarketTypeAndParams("fetchTradingFees",void 0,e),"spot"===s){const s=this.safeBool(e,"margin",!1);e=this.omit(e,"margin"),t=void 0!==i||s?await this.publicMarginGetV2MarginCurrencies(e):await this.publicSpotGetV2SpotPublicSymbols(e)}else{if("swap"!==s&&"future"!==s)throw new r.NotSupported(this.id+" does not support "+s+" market");{let i;[i,e]=this.handleProductTypeAndParams(void 0,e),e.productType=i,t=await this.publicMixGetV2MixMarketContracts(e)}}const a=this.safeValue(t,"data",[]),o={};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"symbol"),r=this.safeSymbol(i,void 0,void 0,s),n=this.market(r),d=this.parseTradingFee(t,n);o[r]=d}return o}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t),maker:this.safeNumber(e,"makerFeeRate"),taker:this.safeNumber(e,"takerFeeRate"),percentage:void 0,tierBased:void 0}}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();let o=!1;if([o,a]=this.handleOptionAndParams(a,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,a,1e3);const n=this.safeBool(this.options,"sandboxMode",!1),d=this.safeBool(a,"useHistoryEndpoint",!1);let h;if(n){const t=this.convertSymbolForSandbox(e);h=this.market(t)}else h=this.market(e);const c=h.spot?"spot":"swap",l=this.options.timeframes[c],u=864e5,f=1e3*this.parseTimeframe(t),p={symbol:h.id,granularity:this.safeString(l,t,t)},m=this.safeInteger(a,"until"),g=void 0!==s,v=void 0!==i,y=void 0!==m;let w;a=this.omit(a,["until"]);const b=this.milliseconds(),k=this.safeDict(this.options,"fetchOHLCV",{}),S=this.safeDict(k,"maxDaysPerTimeframe",{}),O=b-(this.safeInteger(S,t,30)-1)*u;g?(s=Math.min(s,1e3),p.limit=s):s=100;const T=s*f;let P,I;v&&(P=i,p.startTime=i,y||(I=this.sum(P,T),p.endTime=I)),y&&(I=m,p.endTime=I,v||(P=I-T));const M=void 0!==P&&P<=O;if(M&&g&&(p.limit=Math.min(s,200)),h.spot)w=M||d?await this.publicSpotGetV2SpotMarketHistoryCandles(this.extend(p,a)):await this.publicSpotGetV2SpotMarketCandles(this.extend(p,a));else{const e=90;if(v)if(y){if(I-P>e*u)throw new r.BadRequest(this.id+" fetchOHLCV() between start and end must be less than "+e.toString()+" days")}else p.endTime=Math.min(I,this.sum(i,e*u));let t,s;[t,a]=this.handleParamString(a,"price"),[s,a]=this.handleProductTypeAndParams(h,a),p.productType=s;const o=this.extend(p,a);w="mark"===t?await this.publicMixGetV2MixMarketHistoryMarkCandles(o):"index"===t?await this.publicMixGetV2MixMarketHistoryIndexCandles(o):M||d?await this.publicMixGetV2MixMarketHistoryCandles(o):await this.publicMixGetV2MixMarketCandles(o)}if(""===w)return[];const x=this.safeList(w,"data",w);return this.parseOHLCVs(x,h,t,i,s)}async fetchBalance(e={}){await this.loadMarkets();const t={};let i,s,a;if([i,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[s,e]=this.handleMarginModeAndParams("fetchBalance",e),"swap"===i||"future"===i){let i;[i,e]=this.handleProductTypeAndParams(void 0,e),t.productType=i,a=await this.privateMixGetV2MixAccountAccounts(this.extend(t,e))}else if("isolated"===s)a=await this.privateMarginGetMarginV1IsolatedAccountAssets(this.extend(t,e));else if("cross"===s)a=await this.privateMarginGetMarginV1CrossAccountAssets(this.extend(t,e));else{if("spot"!==i)throw new r.NotSupported(this.id+" fetchBalance() does not support "+i+" accounts");a=await this.privateSpotGetV2SpotAccountAssets(this.extend(t,e))}const o=this.safeValue(a,"data",[]);return this.parseBalance(o)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.account(),o=this.safeString2(s,"marginCoin","coin"),n=this.safeCurrencyCode(o),d=this.safeString(s,"borrow");if(void 0!==d){const e=this.safeString(s,"interest");r.free=this.safeString(s,"transferable"),r.total=this.safeString(s,"totalAmount"),r.debt=a.Y.stringAdd(d,e)}else{const e=this.safeString(s,"available"),t=this.safeString(s,"maxTransferOut");if(void 0!==t)r.free=t,r.total=this.safeString(s,"accountEquity");else{r.free=e;const t=this.safeString(s,"frozen"),i=this.safeString(s,"locked");r.used=a.Y.stringAdd(t,i)}}t[n]=r}return this.safeBalance(t)}parseOrderStatus(e){return this.safeString({new:"open",init:"open",not_trigger:"open",partial_fill:"open",partially_fill:"open",partially_filled:"open",triggered:"closed",full_fill:"closed",filled:"closed",fail_trigger:"rejected",cancel:"canceled",cancelled:"canceled",canceled:"canceled",live:"open",fail_execute:"rejected",executed:"closed"},e,e)}parseOrder(e,t=void 0){if(void 0!==this.safeString(e,"errorMsg"))return this.safeOrder({info:e,id:this.safeString(e,"orderId"),clientOrderId:this.safeString2(e,"clientOrderId","clientOid"),status:"rejected"},t);let i="posSide"in e?"contract":"spot";void 0!==t&&(i=t.type);const s=this.safeString(e,"symbol");t=this.safeMarket(s,t,void 0,i);const r=this.safeInteger2(e,"cTime","ctime"),o=this.safeInteger(e,"uTime"),n=this.safeString2(e,"status","state");let d;const h=this.safeString(e,"fee");void 0!==h&&(d={cost:this.parseNumber(a.Y.stringNeg(h)),currency:t.settle});const c=this.safeValue(e,"feeDetail");if(void 0!==c){const e=JSON.parse(c),t=Object.values(e);let i;for(let e=0;e<t.length;e++){const s=t[e];if(void 0!==this.safeValue(s,"feeCoinCode")){i=s;break}}d={cost:this.parseNumber(a.Y.stringNeg(this.safeString(i,"totalFee"))),currency:this.safeCurrencyCode(this.safeString(i,"feeCoinCode"))}}let l,u,f=this.safeStringUpper(e,"force");"POST_ONLY"===f&&(l=!0,f="PO");const p=this.safeString(e,"reduceOnly");let m,g;void 0!==p&&(u="NO"!==p);let v,y;void 0!==this.safeString(e,"basePrice")?(m=this.safeString(e,"priceAvg"),g=this.safeString(e,"basePrice")):(m=this.safeString2(e,"price","executePrice"),g=this.safeString(e,"priceAvg"));const w=this.safeString(e,"baseSize");void 0!==w?(v=w,y=this.safeString(e,"size")):(v=this.safeString(e,"size"),y=this.safeString(e,"baseVolume"));let b=this.safeString(e,"side");return"hedge_mode"===this.safeString(e,"posMode")&&u&&(b="buy"===b?"sell":"buy"),this.safeOrder({info:e,id:this.safeString2(e,"orderId","data"),clientOrderId:this.safeString2(e,"clientOrderId","clientOid"),timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:o,lastUpdateTimestamp:o,symbol:t.symbol,type:this.safeString(e,"orderType"),side:b,price:m,amount:v,cost:this.safeString2(e,"quoteVolume","quoteSize"),average:g,filled:y,remaining:void 0,timeInForce:f,postOnly:l,reduceOnly:u,triggerPrice:this.safeNumber(e,"triggerPrice"),takeProfitPrice:this.safeNumber2(e,"presetStopSurplusPrice","stopSurplusTriggerPrice"),stopLossPrice:this.safeNumber2(e,"presetStopLossPrice","stopLossTriggerPrice"),status:this.parseOrderStatus(n),fee:d,trades:void 0},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","buy",t,void 0,this.extend({createMarketBuyOrderRequiresPrice:!1},i))}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.handleMarginModeAndParams("createOrder",a)[0],d=this.safeValue2(a,"stopPrice","triggerPrice"),h=this.safeValue(a,"stopLossPrice"),c=this.safeValue(a,"takeProfitPrice"),l=void 0!==this.safeString2(a,"trailingPercent","callbackRatio"),u=void 0!==d,f=void 0!==h||void 0!==c,p=this.createOrderRequest(e,t,i,s,r,a);let m;m=o.spot?u?await this.privateSpotPostV2SpotTradePlacePlanOrder(p):"isolated"===n?await this.privateMarginPostV2MarginIsolatedPlaceOrder(p):"cross"===n?await this.privateMarginPostV2MarginCrossedPlaceOrder(p):await this.privateSpotPostV2SpotTradePlaceOrder(p):u||l?await this.privateMixPostV2MixOrderPlacePlanOrder(p):f?await this.privateMixPostV2MixOrderPlaceTpslOrder(p):await this.privateMixPostV2MixOrderPlaceOrder(p);const g=this.safeDict(m,"data",{});return this.parseOrder(g,o)}createOrderRequest(e,t,i,s,o=void 0,n={}){let d,h,c;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);d=this.market(t)}else d=this.market(e);[h,n]=this.handleMarketTypeAndParams("createOrder",d,n),[c,n]=this.handleMarginModeAndParams("createOrder",n);const l={symbol:d.id,orderType:t},u="market"===t,f=this.safeValue2(n,"stopPrice","triggerPrice"),p=this.safeValue(n,"stopLossPrice"),m=this.safeValue(n,"takeProfitPrice"),g=this.safeValue(n,"stopLoss"),v=this.safeValue(n,"takeProfit"),y=void 0!==f,w=void 0!==p,b=void 0!==m,k=void 0!==g,S=void 0!==v,O=w||b,T=k||S,P=this.safeString(n,"trailingTriggerPrice",this.numberToString(o)),I=this.safeString2(n,"trailingPercent","callbackRatio"),M=void 0!==I;if(this.sum(y,w,b,M)>1)throw new r.ExchangeError(this.id+" createOrder() params can only contain one of triggerPrice, stopLossPrice, takeProfitPrice, trailingPercent");"limit"===t&&(l.price=this.priceToPrecision(e,o));const x=this.safeString2(n,"triggerPriceType","triggerType","mark_price"),A=this.safeBool(n,"reduceOnly",!1),C=this.safeString2(n,"clientOid","clientOrderId"),B=this.safeString2(n,"force","timeInForce");let _;[_,n]=this.handlePostOnly(u,"post_only"===B,n);const E=this.safeStringUpper(this.options,"defaultTimeInForce"),N=this.safeStringUpper(n,"timeInForce",E);if(_?l.force="post_only":"GTC"===N?l.force="GTC":"FOK"===N?l.force="FOK":"IOC"===N&&(l.force="IOC"),n=this.omit(n,["stopPrice","triggerType","stopLossPrice","takeProfitPrice","stopLoss","takeProfit","postOnly","reduceOnly","clientOrderId","trailingPercent","trailingTriggerPrice"]),"swap"===h||"future"===h){let t;if(l.marginCoin=d.settleId,l.size=this.amountToPrecision(e,s),[t,n]=this.handleProductTypeAndParams(d,n),l.productType=t,void 0!==C&&(l.clientOid=C),(y||O||M)&&(l.triggerType=x),M){if(!u)throw new r.BadRequest(this.id+" createOrder() bitget trailing orders must be market orders");if(void 0===P)throw new r.ArgumentsRequired(this.id+" createOrder() bitget trailing orders must have a trailingTriggerPrice param");l.planType="track_plan",l.triggerPrice=this.priceToPrecision(e,P),l.callbackRatio=I}else if(y){if(l.planType="normal_plan",l.triggerPrice=this.priceToPrecision(e,f),void 0!==o&&(l.executePrice=this.priceToPrecision(e,o)),k){const t=this.safeNumber2(g,"triggerPrice","stopPrice");l.stopLossTriggerPrice=this.priceToPrecision(e,t);const i=this.safeNumber(g,"price");l.stopLossExecutePrice=this.priceToPrecision(e,i);const s=this.safeString(g,"type","mark_price");l.stopLossTriggerType=s}if(S){const t=this.safeNumber2(v,"triggerPrice","stopPrice");l.stopSurplusTriggerPrice=this.priceToPrecision(e,t);const i=this.safeNumber(v,"price");l.stopSurplusExecutePrice=this.priceToPrecision(e,i);const s=this.safeString(v,"type","mark_price");l.stopSurplusTriggerType=s}}else if(O){if(!u)throw new r.ExchangeError(this.id+" createOrder() bitget stopLoss or takeProfit orders must be market orders");l.holdSide="buy"===i?"long":"short",w?(l.triggerPrice=this.priceToPrecision(e,p),l.planType="pos_loss"):b&&(l.triggerPrice=this.priceToPrecision(e,m),l.planType="pos_profit")}else{if(k){const t=this.safeValue2(g,"triggerPrice","stopPrice");l.presetStopLossPrice=this.priceToPrecision(e,t)}if(S){const t=this.safeValue2(v,"triggerPrice","stopPrice");l.presetStopSurplusPrice=this.priceToPrecision(e,t)}}if(!O){void 0===c&&(c="cross");const e="cross"===c?"crossed":"isolated";let t,s;l.marginMode=e,[t,n]=this.handleParamBool(n,"hedged",!1),[s,n]=this.handleParamBool(n,"oneWayMode"),void 0!==s&&(t=!s);let r=i;A?t?(r="buy"===i?"sell":"buy",l.tradeSide="Close"):l.reduceOnly="YES":t&&(l.tradeSide="Open"),l.side=r}}else{if("spot"!==h)throw new r.NotSupported(this.id+" createOrder() does not support "+h+" orders");{if(O||T)throw new r.InvalidOrder(this.id+" createOrder() does not support stop loss/take profit orders on spot markets, only swap markets");let t,d;l.side=i;let h=!0;if([h,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0),u&&"buy"===i){d="total";const i=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==i)t=this.costToPrecision(e,i);else if(h){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s)}else d="amount",t=this.amountToPrecision(e,s);void 0!==C&&(l.clientOid=C),void 0!==c?(l.loanType="normal",u&&"buy"===i?l.quoteSize=t:l.baseSize=t):(void 0!==t&&(l.size=t),void 0!==f&&(l.planType=d,l.triggerType=x,l.triggerPrice=this.priceToPrecision(e,f),void 0!==o&&(l.executePrice=this.priceToPrecision(e,o))))}}return this.extend(l,n)}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s,a;for(let t=0;t<e.length;t++){const o=e[t],n=this.safeString(o,"symbol");if(void 0===s)s=n;else if(s!==n)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const d=this.safeString(o,"type"),h=this.safeString(o,"side"),c=this.safeValue(o,"amount"),l=this.safeValue(o,"price"),u=this.safeValue(o,"params",{}),f=this.handleMarginModeAndParams("createOrders",u)[0];if(void 0!==f)if(void 0===a)a=f;else if(a!==f)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same margin mode (isolated or cross)");const p=this.createOrderRequest(n,d,h,c,l,u);i.push(p)}let o;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(s);o=this.market(e)}else o=this.market(s);const n={symbol:o.id,orderList:i};let d;if(o.swap||o.future){void 0===a&&(a="cross");const e="cross"===a?"crossed":"isolated";let i;n.marginMode=e,n.marginCoin=o.settleId,[i,t]=this.handleProductTypeAndParams(o,t),n.productType=i,d=await this.privateMixPostV2MixOrderBatchPlaceOrder(n)}else d="isolated"===a?await this.privateMarginPostV2MarginIsolatedBatchPlaceOrder(n):"cross"===a?await this.privateMarginPostV2MarginCrossedBatchPlaceOrder(n):await this.privateSpotPostV2SpotTradeBatchOrders(n);const h=this.safeValue(d,"data",{}),c=this.safeValue(h,"failureList",[]),l=this.safeValue(h,"successList",[]),u=this.arrayConcat(l,c);return this.parseOrders(u,o)}async editOrder(e,t,i,s,o=void 0,n=void 0,d={}){await this.loadMarkets();let h;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);h=this.market(e)}else h=this.market(t);const c={orderId:e},l="market"===i,u=this.safeValue2(d,"stopPrice","triggerPrice"),f=void 0!==u,p=this.safeValue(d,"stopLossPrice"),m=void 0!==p,g=this.safeValue(d,"takeProfitPrice"),v=void 0!==g,y=this.safeValue(d,"stopLoss"),w=this.safeValue(d,"takeProfit"),b=void 0!==y,k=void 0!==w,S=this.safeString(d,"trailingTriggerPrice",this.numberToString(n)),O=this.safeString2(d,"trailingPercent","newCallbackRatio"),T=void 0!==O;if(this.sum(f,m,v,T)>1)throw new r.ExchangeError(this.id+" editOrder() params can only contain one of triggerPrice, stopLossPrice, takeProfitPrice, trailingPercent");const P=this.safeString2(d,"clientOid","clientOrderId");let I;if(void 0!==P&&(c.clientOid=P),d=this.omit(d,["stopPrice","triggerType","stopLossPrice","takeProfitPrice","stopLoss","takeProfit","clientOrderId","trailingTriggerPrice","trailingPercent"]),h.spot){if(void 0===u)throw new r.NotSupported(this.id+" editOrder() only supports plan/trigger spot orders");if(this.safeBool(this.options,"editMarketBuyOrderRequiresPrice",!0)&&l&&"buy"===s){if(void 0===n)throw new r.InvalidOrder(this.id+" editOrder() requires price argument for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the editMarketBuyOrderRequiresPrice option to false and pass in the cost to spend into the amount parameter");{const e=this.numberToString(o),i=this.numberToString(n),s=this.parseNumber(a.Y.stringMul(e,i));c.size=this.priceToPrecision(t,s)}}else c.size=this.amountToPrecision(t,o);c.orderType=i,c.triggerPrice=this.priceToPrecision(t,u),c.executePrice=this.priceToPrecision(t,n),I=await this.privateSpotPostV2SpotTradeModifyPlanOrder(this.extend(c,d))}else{if(!h.swap&&!h.future)throw new r.NotSupported(this.id+" editOrder() does not support "+h.type+" orders");let e;if(c.symbol=h.id,[e,d]=this.handleProductTypeAndParams(h,d),c.productType=e,v||m||(c.newSize=this.amountToPrecision(t,o),void 0===n||T||(c.newPrice=this.priceToPrecision(t,n))),T){if(!l)throw new r.BadRequest(this.id+" editOrder() bitget trailing orders must be market orders");void 0!==S&&(c.newTriggerPrice=this.priceToPrecision(t,S)),c.newCallbackRatio=O,I=await this.privateMixPostV2MixOrderModifyPlanOrder(this.extend(c,d))}else if(v||m)c.marginCoin=h.settleId,c.size=this.amountToPrecision(t,o),void 0!==n&&(c.executePrice=this.priceToPrecision(t,n)),m?c.triggerPrice=this.priceToPrecision(t,p):v&&(c.triggerPrice=this.priceToPrecision(t,g)),I=await this.privateMixPostV2MixOrderModifyTpslOrder(this.extend(c,d));else if(f){if(c.newTriggerPrice=this.priceToPrecision(t,u),b){const e=this.safeNumber2(y,"triggerPrice","stopPrice");c.newStopLossTriggerPrice=this.priceToPrecision(t,e);const i=this.safeNumber(y,"price");c.newStopLossExecutePrice=this.priceToPrecision(t,i);const s=this.safeString(y,"type","mark_price");c.newStopLossTriggerType=s}if(k){const e=this.safeNumber2(w,"triggerPrice","stopPrice");c.newSurplusTriggerPrice=this.priceToPrecision(t,e);const i=this.safeNumber(w,"price");c.newStopSurplusExecutePrice=this.priceToPrecision(t,i);const s=this.safeString(w,"type","mark_price");c.newStopSurplusTriggerType=s}I=await this.privateMixPostV2MixOrderModifyPlanOrder(this.extend(c,d))}else{const e=this.uuid(),i=this.safeString2(d,"newClientOid","newClientOrderId",e);if(d=this.omit(d,"newClientOrderId"),c.newClientOid=i,b){const e=this.safeValue2(y,"triggerPrice","stopPrice");c.newPresetStopLossPrice=this.priceToPrecision(t,e)}if(k){const e=this.safeValue2(w,"triggerPrice","stopPrice");c.newPresetStopSurplusPrice=this.priceToPrecision(t,e)}I=await this.privateMixPostV2MixOrderModifyOrder(this.extend(c,d))}}const M=this.safeDict(I,"data",{});return this.parseOrder(M,h)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();let s,a,o;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);s=this.market(e)}else s=this.market(t);[a,i]=this.handleMarginModeAndParams("cancelOrder",i);const n={},d=this.safeValue(i,"trailing"),h=this.safeValue2(i,"stop","trigger");if(i=this.omit(i,["stop","trigger","trailing"]),s.spot&&h||(n.symbol=s.id),(s.swap||s.future)&&h||(n.orderId=e),s.swap||s.future){let t;if([t,i]=this.handleProductTypeAndParams(s,i),n.productType=t,h||d){const t=[],i={orderId:e};t.push(i),n.orderIdList=t}if(d){const e=this.safeString(i,"planType","track_plan");n.planType=e,o=await this.privateMixPostV2MixOrderCancelPlanOrder(this.extend(n,i))}else o=h?await this.privateMixPostV2MixOrderCancelPlanOrder(this.extend(n,i)):await this.privateMixPostV2MixOrderCancelOrder(this.extend(n,i))}else{if(!s.spot)throw new r.NotSupported(this.id+" cancelOrder() does not support "+s.type+" orders");void 0!==a?"isolated"===a?o=await this.privateMarginPostV2MarginIsolatedCancelOrder(this.extend(n,i)):"cross"===a&&(o=await this.privateMarginPostV2MarginCrossedCancelOrder(this.extend(n,i))):o=h?await this.privateSpotPostV2SpotTradeCancelPlanOrder(this.extend(n,i)):await this.privateSpotPostV2SpotTradeCancelOrder(this.extend(n,i))}const c=this.safeValue(o,"data",{});let l;if((s.swap||s.future)&&h){l=this.safeValue(c,"successList",[])[0]}else l=c;return this.parseOrder(l,s)}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();let s,a;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);s=this.market(e)}else s=this.market(t);[a,i]=this.handleMarginModeAndParams("cancelOrders",i);const o=this.safeValue2(i,"stop","trigger");i=this.omit(i,["stop","trigger"]);const n=[];for(let t=0;t<e.length;t++){const i={orderId:e[t]};n.push(i)}const d={symbol:s.id};let h;if(s.spot&&void 0===a?d.orderList=n:d.orderIdList=n,s.spot)h=void 0!==a?"cross"===a?await this.privateMarginPostV2MarginCrossedBatchCancelOrder(this.extend(d,i)):await this.privateMarginPostV2MarginIsolatedBatchCancelOrder(this.extend(d,i)):await this.privateSpotPostV2SpotTradeBatchCancelOrder(this.extend(d,i));else{let e;[e,i]=this.handleProductTypeAndParams(s,i),d.productType=e,h=o?await this.privateMixPostV2MixOrderCancelPlanOrder(this.extend(d,i)):await this.privateMixPostV2MixOrderBatchCancelOrders(this.extend(d,i))}const c=this.safeValue(h,"data",{}),l=this.safeList(c,"successList",[]);return this.parseOrders(l,s)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);[s,t]=this.handleMarginModeAndParams("cancelAllOrders",t);const a={symbol:i.id},o=this.safeBool2(t,"stop","trigger");let n;if(t=this.omit(t,["stop","trigger"]),i.spot){if(void 0===s){if(o){const e={symbolList:[i.id]};n=await this.privateSpotPostV2SpotTradeBatchCancelPlanOrder(this.extend(e,t))}else n=await this.privateSpotPostV2SpotTradeCancelSymbolOrder(this.extend(a,t));const e=this.safeInteger(n,"requestTime"),s=this.safeDict(n,"data"),r=this.safeString(s,"symbol");return[this.safeOrder({info:n,symbol:this.safeSymbol(r,void 0,void 0,"spot"),timestamp:e,datetime:this.iso8601(e)})]}n="cross"===s?await this.privateMarginPostMarginV1CrossOrderBatchCancelOrder(this.extend(a,t)):await this.privateMarginPostMarginV1IsolatedOrderBatchCancelOrder(this.extend(a,t))}else{let e;[e,t]=this.handleProductTypeAndParams(i,t),a.productType=e,n=o?await this.privateMixPostV2MixOrderCancelPlanOrder(this.extend(a,t)):await this.privateMixPostV2MixOrderBatchCancelOrders(this.extend(a,t))}const d=this.safeDict(n,"data"),h=this.safeList2(d,"resultList","successList"),c=this.safeList2(d,"failure","failureList"),l=this.arrayConcat(h,c);return this.parseOrders(l)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();let s;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);s=this.market(e)}else s=this.market(t);const a={orderId:e};let o;if(s.spot)o=await this.privateSpotGetV2SpotTradeOrderInfo(this.extend(a,i));else{if(!s.swap&&!s.future)throw new r.NotSupported(this.id+" fetchOrder() does not support "+s.type+" orders");{let e;a.symbol=s.id,[e,i]=this.handleProductTypeAndParams(s,i),a.productType=e,o=await this.privateMixGetV2MixOrderDetail(this.extend(a,i))}}"string"==typeof o&&(o=JSON.parse(o));const n=this.safeDict(o,"data");if(void 0!==n&&!Array.isArray(n))return this.parseOrder(n,s);const d=this.safeList(o,"data",[]),h=this.safeDict(d,0,{});return this.parseOrder(h,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeBool(this.options,"sandboxMode",!1);let a,o,n,d={};if([n,s]=this.handleMarginModeAndParams("fetchOpenOrders",s),void 0!==e){if(r){const t=this.convertSymbolForSandbox(e);a=this.market(t)}else a=this.market(e);d.symbol=a.id;const t=this.safeString2(this.options,"fetchOpenOrders","defaultType","spot"),i="type"in a?a.type:t;o=this.safeString(s,"type",i)}else{const e=this.safeString2(this.options,"fetchOpenOrders","defaultType","spot");o=this.safeString(s,"type",e)}let h,c=!1;if([c,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),c){let r;return"spot"===o?void 0!==n&&(r="minId"):r="endId",await this.fetchPaginatedCallCursor("fetchOpenOrders",e,t,i,s,r,"idLessThan")}const l=this.safeBool(s,"trailing"),u=this.safeBool2(s,"stop","trigger"),f=void 0!==this.safeString(s,"planType"),p=u||f;if(s=this.omit(s,["stop","trigger","trailing"]),[d,s]=this.handleUntilOption("endTime",d,s),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i),"swap"===o||"future"===o||void 0!==n){const e=this.safeString2(s,"clientOid","clientOrderId");s=this.omit(s,"clientOrderId"),void 0!==e&&(d.clientOid=e)}let m;if(m=this.omit(s,["type"]),"spot"===o)void 0!==n?(void 0===t&&(t=this.milliseconds()-7776e6,d.startTime=t),"isolated"===n?h=await this.privateMarginGetV2MarginIsolatedOpenOrders(this.extend(d,m)):"cross"===n&&(h=await this.privateMarginGetV2MarginCrossedOpenOrders(this.extend(d,m)))):h=u?await this.privateSpotGetV2SpotTradeCurrentPlanOrder(this.extend(d,m)):await this.privateSpotGetV2SpotTradeUnfilledOrders(this.extend(d,m));else{let e;if([e,m]=this.handleProductTypeAndParams(a,m),d.productType=e,l){const e=this.safeString(s,"planType","track_plan");d.planType=e,h=await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(d,m))}else if(p){const e=this.safeString(m,"planType","normal_plan");d.planType=e,h=await this.privateMixGetV2MixOrderOrdersPlanPending(this.extend(d,m))}else h=await this.privateMixGetV2MixOrderOrdersPending(this.extend(d,m))}const g=this.safeValue(h,"data");if("spot"!==o){const e=this.safeList(g,"entrustedList",[]);return this.parseOrders(e,a,t,i)}if(void 0!==n||u){const e=this.safeList(g,"orderList",[]);return this.parseOrders(e,a,t,i)}return this.parseOrders(g,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchCanceledAndClosedOrders(e,t,i,s);return this.filterBy(r,"status","closed")}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchCanceledAndClosedOrders(e,t,i,s);return this.filterBy(r,"status","canceled")}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a;if(this.safeBool(this.options,"sandboxMode",!1)&&void 0!==e){e=this.convertSymbolForSandbox(e)}let o,n,d={};void 0!==e&&(a=this.market(e),d.symbol=a.id),[o,s]=this.handleMarketTypeAndParams("fetchCanceledAndClosedOrders",a,s),[n,s]=this.handleMarginModeAndParams("fetchCanceledAndClosedOrders",s);let h,c=!1;if([c,s]=this.handleOptionAndParams(s,"fetchCanceledAndClosedOrders","paginate"),c){let r;return"spot"===o?void 0!==n&&(r="minId"):r="endId",await this.fetchPaginatedCallCursor("fetchCanceledAndClosedOrders",e,t,i,s,r,"idLessThan")}const l=this.safeBool(s,"trailing"),u=this.safeBool2(s,"stop","trigger");if(s=this.omit(s,["stop","trigger","trailing"]),[d,s]=this.handleUntilOption("endTime",d,s),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i),"swap"===o||"future"===o||void 0!==n){const e=this.safeString2(s,"clientOid","clientOrderId");s=this.omit(s,"clientOrderId"),void 0!==e&&(d.clientOid=e)}const f=this.milliseconds();if("spot"===o)if(void 0!==n)void 0===t&&(t=f-7776e6,d.startTime=t),"isolated"===n?h=await this.privateMarginGetV2MarginIsolatedHistoryOrders(this.extend(d,s)):"cross"===n&&(h=await this.privateMarginGetV2MarginCrossedHistoryOrders(this.extend(d,s)));else if(u){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchCanceledAndClosedOrders() requires a symbol argument");const i=this.safeIntegerN(s,["endTime","until"]);s=this.omit(s,["until"]),void 0===t&&(t=f-7776e6,d.startTime=t),void 0===i&&(d.endTime=f),h=await this.privateSpotGetV2SpotTradeHistoryPlanOrder(this.extend(d,s))}else h=await this.privateSpotGetV2SpotTradeHistoryOrders(this.extend(d,s));else{let e;[e,s]=this.handleProductTypeAndParams(a,s),d.productType=e;const t=void 0!==this.safeString(s,"planType");if(l){const e=this.safeString(s,"planType","track_plan");d.planType=e,h=await this.privateMixGetV2MixOrderOrdersPlanHistory(this.extend(d,s))}else if(u||t){const e=this.safeString(s,"planType","normal_plan");d.planType=e,h=await this.privateMixGetV2MixOrderOrdersPlanHistory(this.extend(d,s))}else h=await this.privateMixGetV2MixOrderOrdersHistory(this.extend(d,s))}const p=this.safeValue(h,"data",{});if("spot"!==o)return this.parseOrders(this.safeValue(p,"entrustedList",[]),a,t,i);if(void 0!==n||u)return this.parseOrders(this.safeValue(p,"orderList",[]),a,t,i);"string"==typeof h&&(h=JSON.parse(h));const m=this.safeList(h,"data",[]);return this.parseOrders(m,a,t,i)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeString(s,"symbol");let a,o;if(s=this.omit(s,"symbol"),void 0!==r){if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(r);a=this.market(e)}else a=this.market(r)}[o,s]=this.handleMarketTypeAndParams("fetchLedger",a,s);let n,d=!1;if([d,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),d){let e;return"spot"!==o&&(e="endId"),await this.fetchPaginatedCallCursor("fetchLedger",r,t,i,s,e,"idLessThan")}let h,c={};if(void 0!==e&&(n=this.currency(e),c.coin=n.id),[c,s]=this.handleUntilOption("endTime",c,s),void 0!==t&&(c.startTime=t),void 0!==i&&(c.limit=i),"spot"===o)h=await this.privateSpotGetV2SpotAccountBills(this.extend(c,s));else{let e;void 0!==r&&(c.symbol=a.id),[e,s]=this.handleProductTypeAndParams(a,s),c.productType=e,h=await this.privateMixGetV2MixAccountBill(this.extend(c,s))}const l=this.safeValue(h,"data");if("swap"===o||"future"===o){const e=this.safeValue(l,"bills",[]);return this.parseLedger(e,n,t,i)}return this.parseLedger(l,n,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeInteger(e,"cTime"),o=this.safeNumber(e,"balance"),n=this.safeNumber2(e,"fees","fee"),d=this.safeString2(e,"size","amount"),h=this.parseNumber(a.Y.stringAbs(d));let c="in";return d.indexOf("-")>=0&&(c="out"),this.safeLedgerEntry({info:e,id:this.safeString(e,"billId"),timestamp:r,datetime:this.iso8601(r),direction:c,account:void 0,referenceId:void 0,referenceAccount:void 0,type:this.parseLedgerType(this.safeString(e,"businessType")),currency:s,amount:h,before:void 0,after:o,status:void 0,fee:{currency:s,cost:n}},t)}parseLedgerType(e){return this.safeString({trans_to_cross:"transfer",trans_from_cross:"transfer",trans_to_exchange:"transfer",trans_from_exchange:"transfer",trans_to_isolated:"transfer",trans_from_isolated:"transfer",trans_to_contract:"transfer",trans_from_contract:"transfer",trans_to_otc:"transfer",trans_from_otc:"transfer",open_long:"trade",close_long:"trade",open_short:"trade",close_short:"trade",force_close_long:"trade",force_close_short:"trade",burst_long_loss_query:"trade",burst_short_loss_query:"trade",force_buy:"trade",force_sell:"trade",burst_buy:"trade",burst_sell:"trade",delivery_long:"settlement",delivery_short:"settlement",contract_settle_fee:"fee",append_margin:"transaction",adjust_down_lever_append_margin:"transaction",reduce_margin:"transaction",auto_append_margin:"transaction",cash_gift_issue:"cashback",cash_gift_recycle:"cashback",bonus_issue:"rebate",bonus_recycle:"rebate",bonus_expired:"rebate",transfer_in:"transfer",transfer_out:"transfer",deposit:"deposit",withdraw:"withdrawal",buy:"trade",sell:"trade"},e,e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();let a,o;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);a=this.market(t)}else a=this.market(e);[o,s]=this.handleMarginModeAndParams("fetchMyTrades",s);let n,d=!1;if([d,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),d){let r;return a.spot?void 0!==o&&(r="minId"):r="endId",await this.fetchPaginatedCallCursor("fetchMyTrades",e,t,i,s,r,"idLessThan")}let h={symbol:a.id};if([h,s]=this.handleUntilOption("endTime",h,s),void 0!==t&&(h.startTime=t),void 0!==i&&(h.limit=i),a.spot)void 0!==o?(void 0===t&&(h.startTime=this.milliseconds()-7776e6),"isolated"===o?n=await this.privateMarginGetV2MarginIsolatedFills(this.extend(h,s)):"cross"===o&&(n=await this.privateMarginGetV2MarginCrossedFills(this.extend(h,s)))):n=await this.privateSpotGetV2SpotTradeFills(this.extend(h,s));else{let e;[e,s]=this.handleProductTypeAndParams(a,s),h.productType=e,n=await this.privateMixGetV2MixOrderFills(this.extend(h,s))}const c=this.safeValue(n,"data");if(a.swap||a.future){const e=this.safeList(c,"fillList",[]);return this.parseTrades(e,a,t,i)}if(void 0!==o){const e=this.safeList(c,"fills",[]);return this.parseTrades(e,a,t,i)}return this.parseTrades(c,a,t,i)}async fetchPosition(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);[s,t]=this.handleProductTypeAndParams(i,t);const r={symbol:i.id,marginCoin:i.settleId,productType:s},a=await this.privateMixGetV2MixPositionSinglePosition(this.extend(r,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parsePosition(n,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();let i,s=!1;if([s,t]=this.handleOptionAndParams(t,"fetchPositions","paginate"),s)return await this.fetchPaginatedCallCursor("fetchPositions",void 0,void 0,void 0,t,"endId","idLessThan");let a,o;if(this.safeBool(t,"useHistoryEndpoint",!1)?i="privateMixGetV2MixPositionHistoryPosition":[i,t]=this.handleOptionAndParams(t,"fetchPositions","method","privateMixGetV2MixPositionAllPosition"),void 0!==e){const t=this.safeString(e,0);if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);a=this.market(e)}else a=this.market(t)}[o,t]=this.handleProductTypeAndParams(a,t);const n={productType:o};let d,h=!1;if("privateMixGetV2MixPositionAllPosition"===i){let i=this.safeString(t,"marginCoin","USDT");if(void 0!==e)i=a.settleId;else if("USDT-FUTURES"===o)i="USDT";else if("USDC-FUTURES"===o)i="USDC";else if("SUSDT-FUTURES"===o)i="SUSDT";else if("SUSDC-FUTURES"===o)i="SUSDC";else if(("SCOIN-FUTURES"===o||"COIN-FUTURES"===o)&&void 0===i)throw new r.ArgumentsRequired(this.id+" fetchPositions() requires a marginCoin parameter that matches the productType");n.marginCoin=i,d=await this.privateMixGetV2MixPositionAllPosition(this.extend(n,t))}else h=!0,void 0!==a&&(n.symbol=a.id),d=await this.privateMixGetV2MixPositionHistoryPosition(this.extend(n,t));let c=[];if(h){const e=this.safeDict(d,"data",{});c=this.safeList(e,"list",[])}else c=this.safeList(d,"data",[]);const l=[];for(let e=0;e<c.length;e++)l.push(this.parsePosition(c[e],a));return e=this.marketSymbols(e),this.filterByArrayPositions(l,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t,void 0,"contract")).symbol,r=this.safeInteger2(e,"cTime","ctime");let o,n,d=this.safeString(e,"marginMode");const h=this.safeString(e,"unrealizedPL"),c=this.safeString(e,"marginSize");"isolated"===d?o=a.Y.stringAdd(c,h):"crossed"===d&&(d="cross",n=c);const l=this.safeString(e,"posMode");let u;"hedge_mode"===l?u=!0:"one_way_mode"===l&&(u=!1);const f=this.safeString(e,"holdSide"),p=this.safeString(e,"leverage"),m=this.safeValue(t,"contractSize"),g=this.numberToString(m),v=this.safeString(e,"total"),y=this.safeString2(e,"openPriceAvg","openAvgPrice"),w=this.safeString(e,"keepMarginRate"),b=a.Y.stringMul(y,v);void 0===n&&(n=a.Y.stringDiv(b,p));let k=this.parseNumber(a.Y.stringDiv(v,g));void 0===k&&(k=this.safeNumber(e,"closeTotalPos"));const S=this.safeString(e,"markPrice"),O=a.Y.stringMul(v,S),T=a.Y.stringDiv(n,O);let P=this.parseNumber(this.omitZero(this.safeString(e,"liquidationPrice")));const I="0.9994";if(void 0===P&&"isolated"===d&&a.Y.stringGt(v,"0")){let e=a.Y.stringDiv(c,v),t=w;"short"===f&&(e=a.Y.stringNeg(e),t=a.Y.stringNeg(t));let i=a.Y.stringSub("1",t),s=a.Y.stringSub(y,e);"long"===f?i=a.Y.stringMul(i,I):s=a.Y.stringMul(s,I),P=this.parseNumber(a.Y.stringDiv(s,i))}const M=a.Y.stringMul(O,"0.0006"),x=a.Y.stringAdd(a.Y.stringMul(w,O),M),A=a.Y.stringMul(a.Y.stringDiv(h,n,4),"100");return this.safePosition({info:e,id:this.safeString(e,"orderId"),symbol:s,notional:this.parseNumber(O),marginMode:d,liquidationPrice:P,entryPrice:this.parseNumber(y),unrealizedPnl:this.parseNumber(h),realizedPnl:this.safeNumber(e,"pnl"),percentage:this.parseNumber(A),contracts:k,contractSize:m,markPrice:this.parseNumber(S),lastPrice:this.safeNumber(e,"closeAvgPrice"),side:f,hedged:u,timestamp:r,datetime:this.iso8601(r),lastUpdateTimestamp:this.safeInteger(e,"utime"),maintenanceMargin:this.parseNumber(x),maintenanceMarginPercentage:this.parseNumber(w),collateral:this.parseNumber(o),initialMargin:this.parseNumber(n),initialMarginPercentage:this.parseNumber(T),leverage:this.parseNumber(p),marginRatio:this.safeNumber(e,"marginRatio"),stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallIncremental("fetchFundingRateHistory",e,t,i,s,"pageNo",100);let o,n;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);o=this.market(t)}else o=this.market(e);[n,s]=this.handleProductTypeAndParams(o,s);const d={symbol:o.id,productType:n};void 0!==i&&(d.pageSize=i);const h=await this.publicMixGetV2MixMarketHistoryFundRate(this.extend(d,s)),c=this.safeValue(h,"data",[]),l=[];for(let e=0;e<c.length;e++){const t=c[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i,o),r=this.safeInteger(t,"fundingTime");l.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"fundingRate"),timestamp:r,datetime:this.iso8601(r)})}const u=this.sortBy(l,"timestamp");return this.filterBySymbolSinceLimit(u,o.symbol,t,i)}async fetchFundingRate(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");[s,t]=this.handleProductTypeAndParams(i,t);const a={symbol:i.id,productType:s},o=await this.publicMixGetV2MixMarketCurrentFundRate(this.extend(a,t)),n=this.safeValue(o,"data",[]);return this.parseFundingRate(n[0],i)}async fetchFundingRates(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==e){const t=this.safeValue(e,0);if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);i=this.market(e)}else i=this.market(t)}const s={};let r;[r,t]=this.handleProductTypeAndParams(i,t),s.productType=r;const a=await this.publicMixGetV2MixMarketTickers(this.extend(s,t));e=this.marketSymbols(e);const o=this.safeList(a,"data",[]);return this.parseFundingRates(o,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,void 0,"swap"),r=this.safeInteger(e,"nextFundingTime"),a=this.safeString(e,"ratePeriod"),o=this.safeInteger(e,"ts");let n;return void 0!==a&&(n=a+"h"),{info:e,symbol:s,markPrice:this.safeNumber(e,"markPrice"),indexPrice:this.safeNumber(e,"indexPrice"),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:o,datetime:this.iso8601(o),fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:r,fundingDatetime:this.iso8601(r),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:n}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingHistory","paginate"),a)return await this.fetchPaginatedCallCursor("fetchFundingHistory",e,t,i,s,"endId","idLessThan");let o,n;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);o=this.market(t)}else o=this.market(e);if(!o.swap)throw new r.BadSymbol(this.id+" fetchFundingHistory() supports swap contracts only");[n,s]=this.handleProductTypeAndParams(o,s);let d={symbol:o.id,marginCoin:o.settleId,businessType:"contract_settle_fee",productType:n};[d,s]=this.handleUntilOption("endTime",d,s),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i);const h=await this.privateMixGetV2MixAccountBill(this.extend(d,s)),c=this.safeValue(h,"data",{}),l=this.safeValue(c,"bills",[]);return this.parseFundingHistories(l,o,t,i)}parseFundingHistory(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"coin"),r=this.safeInteger(e,"cTime");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),timestamp:r,datetime:this.iso8601(r),code:this.safeCurrencyCode(s),amount:this.safeNumber(e,"amount"),id:this.safeString(e,"billId")}}parseFundingHistories(e,t=void 0,i=void 0,s=void 0){const r=[];for(let i=0;i<e.length;i++){const s=e[i];"contract_settle_fee"===this.safeString(s,"businessType")&&r.push(this.parseFundingHistory(s,t))}const a=this.sortBy(r,"timestamp");return this.filterBySinceLimit(a,i,s)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.safeString(s,"holdSide");let a,o;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);a=this.market(t)}else a=this.market(e);[o,s]=this.handleProductTypeAndParams(a,s);const n={symbol:a.id,marginCoin:a.settleId,amount:this.amountToPrecision(e,t),holdSide:r,productType:o};s=this.omit(s,"holdSide");const d=await this.privateMixPostV2MixAccountSetMargin(this.extend(n,s));return this.extend(this.parseMarginModification(d,a),{amount:this.parseNumber(t),type:i})}parseMarginModification(e,t=void 0){const i="00000"===this.safeString(e,"code")?"ok":"failed";return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:t.settle,status:i,timestamp:void 0,datetime:void 0}}async reduceMargin(e,t,i={}){if(t>0)throw new r.BadRequest(this.id+" reduceMargin() amount parameter must be a negative value");if(void 0===this.safeString(i,"holdSide"))throw new r.ArgumentsRequired(this.id+" reduceMargin() requires a holdSide parameter, either long or short");return await this.modifyMarginHelper(e,t,"reduce",i)}async addMargin(e,t,i={}){if(void 0===this.safeString(i,"holdSide"))throw new r.ArgumentsRequired(this.id+" addMargin() requires a holdSide parameter, either long or short");return await this.modifyMarginHelper(e,t,"add",i)}async fetchLeverage(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);[s,t]=this.handleProductTypeAndParams(i,t);const r={symbol:i.id,marginCoin:i.settleId,productType:s},a=await this.privateMixGetV2MixAccountAccount(this.extend(r,t)),o=this.safeDict(a,"data",{});return this.parseLeverage(o,i)}parseLeverage(e,t=void 0){return{info:e,symbol:t.symbol,marginMode:"isolated",longLeverage:this.safeInteger(e,"isolatedLongLever"),shortLeverage:this.safeInteger(e,"isolatedShortLever")}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();let s,a;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);s=this.market(e)}else s=this.market(t);[a,i]=this.handleProductTypeAndParams(s,i);const o={symbol:s.id,marginCoin:s.settleId,leverage:this.numberToString(e),productType:a};return await this.privateMixPostV2MixAccountSetLeverage(this.extend(o,i))}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("cross"===(e=e.toLowerCase())&&(e="crossed"),"isolated"!==e&&"crossed"!==e)throw new r.ArgumentsRequired(this.id+" setMarginMode() marginMode must be either isolated or crossed (cross)");await this.loadMarkets();let s,a;if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);s=this.market(e)}else s=this.market(t);[a,i]=this.handleProductTypeAndParams(s,i);const o={symbol:s.id,marginCoin:s.settleId,marginMode:e,productType:a};return await this.privateMixPostV2MixAccountSetMarginMode(this.extend(o,i))}async setPositionMode(e,t=void 0,i={}){await this.loadMarkets();const s=e?"hedge_mode":"one_way_mode";let r,a;if(void 0!==t){if(this.safeBool(this.options,"sandboxMode",!1)){const e=this.convertSymbolForSandbox(t);r=this.market(e)}else r=this.market(t)}[a,i]=this.handleProductTypeAndParams(r,i);const o={posMode:s,productType:a};return await this.privateMixPostV2MixAccountSetPositionMode(this.extend(o,i))}async fetchOpenInterest(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");[s,t]=this.handleProductTypeAndParams(i,t);const a={symbol:i.id,productType:s},o=await this.publicMixGetV2MixMarketOpenInterest(this.extend(a,t)),n=this.safeDict(o,"data",{});return this.parseOpenInterest(n,i)}parseOpenInterest(e,t=void 0){const i=this.safeValue(e,"openInterestList",[]),s=this.safeInteger(e,"ts"),r=this.safeString(i[0],"symbol");return this.safeOpenInterest({symbol:this.safeSymbol(r,t,void 0,"contract"),openInterestAmount:this.safeNumber(i[0],"size"),openInterestValue:void 0,timestamp:s,datetime:this.iso8601(s),info:e},t)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchTransfers() requires a code argument");let a;await this.loadMarkets(),[a,s]=this.handleMarketTypeAndParams("fetchTransfers",void 0,s);const o=this.safeString(s,"fromAccount",a);s=this.omit(s,"fromAccount");const n=this.safeValue(this.options,"accountsByType",{});a=this.safeString(n,o);const d=this.currency(e);let h={coin:d.id,fromType:a};void 0!==t&&(h.startTime=t),void 0!==i&&(h.limit=i),[h,s]=this.handleUntilOption("endTime",h,s);const c=await this.privateSpotGetV2SpotAccountTransferRecords(this.extend(h,s)),l=this.safeList(c,"data",[]);return this.parseTransfers(l,d,t,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsByType",{}),n={fromType:this.safeString(o,i),toType:this.safeString(o,s),amount:t,coin:a.id},d=this.safeString(r,"symbol");let h;r=this.omit(r,"symbol"),void 0!==d&&(h=this.market(d),n.symbol=h.id);const c=await this.privateSpotPostV2SpotWalletTransfer(this.extend(n,r)),l=this.safeValue(c,"data",{});return l.ts=this.safeInteger(c,"requestTime"),this.parseTransfer(l,a)}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeStringLower(e,"status"),r=this.safeString(e,"coin"),a=this.safeString(e,"fromType"),o=this.safeValue(this.options,"accountsById",{}),n=this.safeString(o,a,a),d=this.safeString(e,"toType"),h=this.safeString(o,d,d);return{info:e,id:this.safeString(e,"transferId"),timestamp:i,datetime:this.iso8601(i),currency:this.safeCurrencyCode(r,t),amount:this.safeNumber(e,"size"),fromAccount:n,toAccount:h,status:this.parseTransferStatus(s)}}parseTransferStatus(e){return this.safeString({successful:"ok"},e,e)}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"chains",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};for(let e=0;e<s;e++){const a=i[e],o=this.safeString(a,"chain"),n=this.safeString(t,"code"),d=this.networkIdToCode(o,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(a,"withdrawFee"),percentage:!1}},1===s&&(r.withdraw.fee=this.safeNumber(a,"withdrawFee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicSpotGetV2SpotPublicCoins(t),s=this.safeList(i,"data",[]);return this.parseDepositWithdrawFees(s,e,"coin")}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={coin:s.id,borrowAmount:this.currencyToPrecision(e,t)},a=await this.privateMarginPostV2MarginCrossedAccountBorrow(this.extend(r,i)),o=this.safeValue(a,"data",{});return this.parseMarginLoan(o,s)}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=this.market(e),o={coin:r.id,borrowAmount:this.currencyToPrecision(t,i),symbol:a.id},n=await this.privateMarginPostV2MarginIsolatedAccountBorrow(this.extend(o,s)),d=this.safeValue(n,"data",{});return this.parseMarginLoan(d,r,a)}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=this.market(e),o={coin:r.id,repayAmount:this.currencyToPrecision(t,i),symbol:a.id},n=await this.privateMarginPostV2MarginIsolatedAccountRepay(this.extend(o,s)),d=this.safeValue(n,"data",{});return this.parseMarginLoan(d,r,a)}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={coin:s.id,repayAmount:this.currencyToPrecision(e,t)},a=await this.privateMarginPostV2MarginCrossedAccountRepay(this.extend(r,i)),o=this.safeValue(a,"data",{});return this.parseMarginLoan(o,s)}parseMarginLoan(e,t=void 0,i=void 0){const s=this.safeString(e,"coin"),r=this.safeString(e,"symbol");let a;return void 0!==r&&(a=this.safeSymbol(r,i,void 0,"spot")),{id:this.safeString2(e,"loanId","repayId"),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber2(e,"borrowAmount","repayAmount"),symbol:a,timestamp:void 0,datetime:void 0,info:e}}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o,n=!1;if([n,s]=this.handleOptionAndParams(s,"fetchMyLiquidations","paginate"),n)return await this.fetchPaginatedCallCursor("fetchMyLiquidations",e,t,i,s,"minId","idLessThan");if(void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchMyLiquidations",a,s),"spot"!==o)throw new r.NotSupported(this.id+" fetchMyLiquidations() supports spot margin markets only");let d,h,c={};if([c,s]=this.handleUntilOption("endTime",c,s),c.startTime=void 0!==t?t:this.milliseconds()-7776e6,void 0!==i&&(c.limit=i),[h,s]=this.handleMarginModeAndParams("fetchMyLiquidations",s,"cross"),"isolated"===h){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyLiquidations() requires a symbol argument");c.symbol=a.id,d=await this.privateMarginGetV2MarginIsolatedLiquidationHistory(this.extend(c,s))}else"cross"===h&&(d=await this.privateMarginGetV2MarginCrossedLiquidationHistory(this.extend(c,s)));const l=this.safeValue(d,"data",{}),u=this.safeList(l,"resultList",[]);return this.parseLiquidations(u,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"liqEndTime"),r=this.safeString2(e,"LiqFee","liqFee"),o=this.safeString(e,"totalDebt"),n=a.Y.stringAdd(r,o);return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:void 0,contractSize:void 0,price:void 0,baseValue:void 0,quoteValue:this.parseNumber(n),timestamp:s,datetime:this.iso8601(s)})}async fetchIsolatedBorrowRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.privateMarginGetV2MarginIsolatedInterestRateAndLimit(this.extend(s,t)),a=this.safeInteger(r,"requestTime"),o=this.safeValue(r,"data",[]),n=this.safeValue(o,0,{});return n.timestamp=a,this.parseIsolatedBorrowRate(n,i)}parseIsolatedBorrowRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,void 0,"spot"),r=this.safeString(e,"baseCoin"),a=this.safeString(e,"quoteCoin"),o=this.safeInteger(e,"timestamp");return{symbol:s,base:this.safeCurrencyCode(r),baseRate:this.safeNumber(e,"baseDailyInterestRate"),quote:this.safeCurrencyCode(a),quoteRate:this.safeNumber(e,"quoteDailyInterestRate"),period:864e5,timestamp:o,datetime:this.iso8601(o),info:e}}async fetchCrossBorrowRate(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id},r=await this.privateMarginGetV2MarginCrossedInterestRateAndLimit(this.extend(s,t)),a=this.safeInteger(r,"requestTime"),o=this.safeValue(r,"data",[]),n=this.safeValue(o,0,{});return n.timestamp=a,this.parseBorrowRate(n,i)}parseBorrowRate(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeInteger(e,"timestamp");return{currency:this.safeCurrencyCode(i,t),rate:this.safeNumber(e,"dailyInterestRate"),period:864e5,timestamp:s,datetime:this.iso8601(s),info:e}}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();let o,n=!1;if([n,a]=this.handleOptionAndParams(a,"fetchBorrowInterest","paginate"),n)return await this.fetchPaginatedCallCursor("fetchBorrowInterest",t,i,s,a,"minId","idLessThan");void 0!==t&&(o=this.market(t));const d={};let h,c,l;if(void 0!==e&&(h=this.currency(e),d.coin=h.id),d.startTime=void 0!==i?i:this.milliseconds()-7776e6,void 0!==s&&(d.limit=s),[l,a]=this.handleMarginModeAndParams("fetchBorrowInterest",a,"cross"),"isolated"===l){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchBorrowInterest() requires a symbol argument");d.symbol=o.id,c=await this.privateMarginGetV2MarginIsolatedInterestHistory(this.extend(d,a))}else"cross"===l&&(c=await this.privateMarginGetV2MarginCrossedInterestHistory(this.extend(d,a)));const u=this.safeValue(c,"data",{}),f=this.safeValue(u,"resultList",[]),p=this.parseBorrowInterests(f,o);return this.filterByCurrencySinceLimit(p,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=void 0!==i?"isolated":"cross",r=this.safeInteger(e,"cTime");return{info:e,symbol:this.safeString(t,"symbol"),currency:this.safeCurrencyCode(this.safeString(e,"interestCoin")),interest:this.safeNumber(e,"interestAmount"),interestRate:this.safeNumber(e,"dailyInterestRate"),amountBorrowed:void 0,marginMode:s,timestamp:r,datetime:this.iso8601(r)}}async closePosition(e,t=void 0,i={}){await this.loadMarkets();let s,r;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);s=this.market(t)}else s=this.market(e);[r,i]=this.handleProductTypeAndParams(s,i);const a={symbol:s.id,productType:r};void 0!==t&&(a.holdSide=t);const o=await this.privateMixPostV2MixOrderClosePositions(this.extend(a,i)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"successList",[]);return this.parseOrder(d[0],s)}async closeAllPositions(e={}){let t;await this.loadMarkets(),[t,e]=this.handleProductTypeAndParams(void 0,e);const i={productType:t},s=await this.privateMixPostV2MixOrderClosePositions(this.extend(i,e)),r=this.safeValue(s,"data",{}),a=this.safeList(r,"successList",[]);return this.parsePositions(a,void 0,e)}async fetchMarginMode(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);[s,t]=this.handleProductTypeAndParams(i,t);const r={symbol:i.id,marginCoin:i.settleId,productType:s},a=await this.privateMixGetV2MixAccountAccount(this.extend(r,t)),o=this.safeDict(a,"data",{});return this.parseMarginMode(o,i)}parseMarginMode(e,t=void 0){let i=this.safeString(e,"marginMode");return i="crossed"===i?"cross":i,{info:e,symbol:t.symbol,marginMode:i}}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeInteger(s,"until");s=this.omit(s,"until");const a={};if(void 0!==e){if(e.length>0){const t=this.market(e[0]);a.symbol=t.id}}void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i),void 0!==r&&(a.endTime=r);const o=await this.privateMixGetV2MixPositionHistoryPosition(this.extend(a,s)),n=this.safeDict(o,"data"),d=this.safeList(n,"list"),h=this.parsePositions(d,e,s);return this.filterBySinceLimit(h,t,i)}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r={fromCoin:e,toCoin:t,fromCoinSize:this.numberToString(i)},a=await this.privateConvertGetV2ConvertQuotedPrice(this.extend(r,s)),o=this.safeDict(a,"data",{}),n=this.safeString(o,"fromCoin",e),d=this.currency(n),h=this.safeString(o,"toCoin",t),c=this.currency(h);return this.parseConversion(o,d,c)}async createConvertTrade(e,t,i,s=void 0,a={}){await this.loadMarkets();const o=this.safeString2(a,"price","cnvtPrice");if(void 0===o)throw new r.ArgumentsRequired(this.id+" createConvertTrade() requires a price parameter");const n=this.safeString2(a,"toAmount","toCoinSize");if(void 0===n)throw new r.ArgumentsRequired(this.id+" createConvertTrade() requires a toAmount parameter");a=this.omit(a,["price","toAmount"]);const d={traceId:e,fromCoin:t,toCoin:i,fromCoinSize:this.numberToString(s),toCoinSize:n,cnvtPrice:o},h=await this.privateConvertPostV2ConvertTrade(this.extend(d,a)),c=this.safeDict(h,"data",{}),l=this.safeString(c,"toCoin",i),u=this.currency(l);return this.parseConversion(c,void 0,u)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={},a=this.milliseconds();r.startTime=void 0!==t?t:a-864e5;const o=this.safeString2(s,"endTime","until");r.endTime=void 0!==o?o:a,void 0!==i&&(r.limit=i),s=this.omit(s,"until");const n=await this.privateConvertGetV2ConvertConvertRecord(this.extend(r,s)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"dataList",[]);return this.parseConversions(h,e,"fromCoin","toCoin",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeInteger(e,"ts"),r=this.safeString(e,"fromCoin"),a=this.safeCurrencyCode(r,t),o=this.safeString(e,"toCoin"),n=this.safeCurrencyCode(o,i);return{info:e,timestamp:s,datetime:this.iso8601(s),id:this.safeString2(e,"id","traceId"),fromCurrency:a,fromAmount:this.safeNumber(e,"fromCoinSize"),toCurrency:n,toAmount:this.safeNumber(e,"toCoinSize"),price:this.safeNumber(e,"cnvtPrice"),fee:this.safeNumber(e,"fee")}}async fetchConvertCurrencies(e={}){await this.loadMarkets();const t=await this.privateConvertGetV2ConvertCurrencies(e),i={},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"coin"),a=this.safeCurrencyCode(r);i[a]={info:t,id:r,code:a,networks:void 0,type:void 0,name:void 0,active:void 0,deposit:void 0,withdraw:this.safeNumber(t,"available"),fee:void 0,precision:void 0,limits:{amount:{min:this.safeNumber(t,"minAmount"),max:this.safeNumber(t,"maxAmount")},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},created:void 0}}return i}async fetchFundingInterval(e,t={}){await this.loadMarkets();let i,s;if(this.safeBool(this.options,"sandboxMode",!1)){const t=this.convertSymbolForSandbox(e);i=this.market(t)}else i=this.market(e);[s,t]=this.handleProductTypeAndParams(i,t);const r={symbol:i.id,productType:s},a=await this.publicMixGetV2MixMarketFundingTime(this.extend(r,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseFundingRate(n,i)}async fetchLongShortRatioHistory(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id};let n;void 0!==t&&(o.period=t),n=a.swap||a.future?await this.publicMixGetV2MixMarketAccountLongShort(this.extend(o,r)):await this.publicMarginGetV2MarginMarketLongShortRatio(this.extend(o,r));const d=this.safeList(n,"data",[]);return this.parseLongShortRatioHistory(d,a)}parseLongShortRatio(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeIntegerOmitZero(e,"ts");return{info:e,symbol:this.safeSymbol(i,t,void 0,"contract"),timestamp:s,datetime:this.iso8601(s),timeframe:void 0,longShortRatio:this.safeNumber2(e,"longShortRatio","longShortAccountRatio")}}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeString2(n,"err_msg","msg"),l=this.id+" "+o,u=void 0!==c&&""!==c&&"success"!==c;u&&(this.throwExactlyMatchedException(this.exceptions.exact,c,l),this.throwBroadlyMatchedException(this.exceptions.broad,c,l));const f=this.safeString2(n,"code","err_code"),p=void 0!==f&&"00000"!==f;if(p&&this.throwExactlyMatchedException(this.exceptions.exact,f,l),p||u)throw new r.ExchangeError(l)}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){const o="private"===t[0],d=t[1],h="/api"+("/"+this.implodeParams(e,s));let c=this.implodeHostname(this.urls.api[d])+h;const l=this.omit(s,this.extractParams(e));if(!o&&"GET"===i){Object.keys(l).length>0&&(c=c+"?"+this.urlencode(l))}if(o){this.checkRequiredCredentials();const e=this.nonce().toString();let t=e+i+h;if("POST"===i)t+=a=this.json(s);else if(Object.keys(s).length){let e="?"+this.urlencode(this.keysort(s));e.indexOf("%24")>-1&&(e=e.replace("%24","$")),c+=e,t+=e}const o=this.hmac(this.encode(t),this.encode(this.secret),n.s,"base64"),d=this.safeString(this.options,"broker");r={"ACCESS-KEY":this.apiKey,"ACCESS-SIGN":o,"ACCESS-TIMESTAMP":e,"ACCESS-PASSPHRASE":this.password,"X-CHANNEL-API-CODE":d},"POST"===i&&(r["Content-Type"]="application/json")}return this.safeBool(this.options,"sandboxMode",!1)&&"v2/public/time"!==e&&(void 0===r&&(r={}),r.PAPTRADING="1"),{url:c,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bithumb",name:"Bithumb",countries:["KR"],rateLimit:500,pro:!0,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketOrder:!0,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},hostname:"bithumb.com",urls:{logo:"https://github.com/user-attachments/assets/c9e0eefb-4777-46b9-8f09-9d7f7c4af82d",api:{public:"https://api.{hostname}/public",private:"https://api.{hostname}"},www:"https://www.bithumb.com",doc:"https://apidocs.bithumb.com",fees:"https://en.bithumb.com/customer_support/info_fee"},api:{public:{get:["ticker/ALL_{quoteId}","ticker/{baseId}_{quoteId}","orderbook/ALL_{quoteId}","orderbook/{baseId}_{quoteId}","transaction_history/{baseId}_{quoteId}","network-info","assetsstatus/multichain/ALL","assetsstatus/multichain/{currency}","withdraw/minimum/ALL","withdraw/minimum/{currency}","assetsstatus/ALL","assetsstatus/{baseId}","candlestick/{baseId}_{quoteId}/{interval}"]},private:{post:["info/account","info/balance","info/wallet_address","info/ticker","info/orders","info/user_transactions","info/order_detail","trade/place","trade/cancel","trade/btc_withdrawal","trade/krw_deposit","trade/krw_withdrawal","trade/market_buy","trade/market_sell","trade/stop_limit"]}},fees:{trading:{maker:this.parseNumber("0.0025"),taker:this.parseNumber("0.0025")}},precisionMode:o.v,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{"Bad Request(SSL)":r.BadRequest,"Bad Request(Bad Method)":r.BadRequest,"Bad Request.(Auth Data)":r.AuthenticationError,"Not Member":r.AuthenticationError,"Invalid Apikey":r.AuthenticationError,"Method Not Allowed.(Access IP)":r.PermissionDenied,"Method Not Allowed.(BTC Adress)":r.InvalidAddress,"Method Not Allowed.(Access)":r.PermissionDenied,"Database Fail":r.ExchangeNotAvailable,"Invalid Parameter":r.BadRequest,5600:r.ExchangeError,"Unknown Error":r.ExchangeError,"After May 23th, recent_transactions is no longer, hence users will not be able to connect to recent_transactions":r.ExchangeError},timeframes:{"1m":"1m","3m":"3m","5m":"5m","10m":"10m","30m":"30m","1h":"1h","6h":"6h","12h":"12h","1d":"24h"},options:{quoteCurrencies:{BTC:{limits:{cost:{min:2e-4,max:100}}},KRW:{limits:{cost:{min:500,max:5e9}}}}},commonCurrencies:{ALT:"ArchLoot",FTC:"FTC2",SOC:"Soda Coin"}})}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return super.safeMarket(e,t,i,"spot")}amountToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.amount,o.fv)}async fetchMarkets(e={}){const t=[],i=this.safeDict(this.options,"quoteCurrencies",{}),s=Object.keys(i),r=[];for(let t=0;t<s.length;t++){const i={quoteId:s[t]};r.push(this.publicGetTickerALLQuoteId(this.extend(i,e)))}const a=await Promise.all(r);for(let e=0;e<s.length;e++){const r=s[e],o=r,n=a[e],d=this.safeDict(n,"data"),h=this.safeDict(i,r,{}),c=Object.keys(d);for(let e=0;e<c.length;e++){const i=c[e];if("date"===i)continue;const s=d[i],a=this.safeCurrencyCode(i);let n=!0;if(Array.isArray(s)){0===s.length&&(n=!1)}const l=this.deepExtend({id:i,symbol:a+"/"+r,base:a,quote:r,settle:void 0,baseId:i,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:n,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDateTime:void 0,strike:void 0,optionType:void 0,precision:{amount:parseInt("4"),price:parseInt("4")},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{}},created:void 0,info:s},h);t.push(l)}}return t}parseBalance(e){const t={info:e},i=this.safeDict(e,"data"),s=Object.keys(this.currencies);for(let e=0;e<s.length;e++){const r=s[e],a=this.account(),o=this.currency(r),n=this.safeStringLower(o,"id");a.total=this.safeString(i,"total_"+n),a.used=this.safeString(i,"in_use_"+n),a.free=this.safeString(i,"available_"+n),t[r]=a}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostInfoBalance(this.extend({currency:"ALL"},e));return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={baseId:s.baseId,quoteId:s.quoteId};void 0!==t&&(r.count=t);const a=await this.publicGetOrderbookBaseIdQuoteId(this.extend(r,i)),o=this.safeDict(a,"data",{}),n=this.safeInteger(o,"timestamp");return this.parseOrderBook(o,e,n,"bids","asks","price","quantity")}parseTicker(e,t=void 0){const i=this.safeInteger(e,"date"),s=this.safeSymbol(void 0,t),r=this.safeString(e,"opening_price"),a=this.safeString(e,"closing_price"),o=this.safeString(e,"units_traded_24H"),n=this.safeString(e,"acc_trade_value_24H");return this.safeTicker({symbol:s,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"max_price"),low:this.safeString(e,"min_price"),bid:this.safeString(e,"buy_price"),bidVolume:void 0,ask:this.safeString(e,"sell_price"),askVolume:void 0,vwap:void 0,open:r,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={},s=this.safeDict(this.options,"quoteCurrencies",{}),r=Object.keys(s),a=[];for(let e=0;e<r.length;e++){const i={quoteId:r[e]};a.push(this.publicGetTickerALLQuoteId(this.extend(i,t)))}const o=await Promise.all(a);for(let e=0;e<r.length;e++){const t=r[e],s=o[e],a=this.safeDict(s,"data",{}),n=this.safeInteger(a,"date"),d=this.omit(a,"date"),h=Object.keys(d);for(let e=0;e<h.length;e++){const s=h[e],r=a[s],o=this.safeCurrencyCode(s)+"/"+t,d=this.safeMarket(o);r.date=n,i[o]=this.parseTicker(r,d)}}return this.filterByArrayTickers(i,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={baseId:i.baseId,quoteId:i.quoteId},r=await this.publicGetTickerBaseIdQuoteId(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={baseId:a.baseId,quoteId:a.quoteId,interval:this.safeString(this.timeframes,t,t)},n=await this.publicGetCandlestickBaseIdQuoteIdInterval(this.extend(o,r)),d=this.safeList(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}parseTrade(e,t=void 0){let i;const s=this.safeString(e,"transaction_date");if(void 0!==s){const t=s.split(" ");if(t.length>1){const e=t[0];let s=t[1];s.length<8&&(s="0"+s),i=this.parse8601(e+" "+s)}else i=this.safeIntegerProduct(e,"transaction_date",.001)}void 0!==i&&(i-=324e5);let r=this.safeString(e,"type");r="ask"===r?"sell":"buy";const a=this.safeString(e,"cont_no");t=this.safeMarket(void 0,t);const o=this.safeString(e,"price"),n=this.fixCommaNumber(this.safeString2(e,"units_traded","units")),d=this.safeString(e,"total");let h;const c=this.safeString(e,"fee");if(void 0!==c){const t=this.safeString(e,"fee_currency");h={cost:c,currency:this.commonCurrencyCode(t)}}return this.safeTrade({id:a,info:e,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,order:void 0,type:undefined,side:r,takerOrMaker:void 0,price:o,amount:n,cost:d,fee:h},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={baseId:r.baseId,quoteId:r.quoteId};void 0!==i&&(a.count=i);const o=await this.publicGetTransactionHistoryBaseIdQuoteId(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={order_currency:n.id,payment_currency:n.quote,units:s};let h="privatePostTradePlace";"limit"===t?(d.price=a,d.type="buy"===i?"bid":"ask"):h="privatePostTradeMarket"+this.capitalize(i);const c=await this[h](this.extend(d,o)),l=this.safeString(c,"order_id");if(void 0===l)throw new r.InvalidOrder(this.id+" createOrder() did not return an order id");return this.safeOrder({info:c,symbol:e,type:t,side:i,id:l},n)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={order_id:e,count:1,order_currency:s.base,payment_currency:s.quote},o=await this.privatePostInfoOrderDetail(this.extend(a,i)),n=this.safeDict(o,"data");return this.parseOrder(this.extend(n,{order_id:e}),s)}parseOrderStatus(e){return this.safeString({Pending:"open",Completed:"closed",Cancel:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeIntegerProduct(e,"order_date",.001),s="bid"===this.safeString2(e,"type","side")?"buy":"sell",r=this.parseOrderStatus(this.safeString(e,"order_status")),o=this.safeString2(e,"order_price","price");let n="limit";a.Y.stringEquals(o,"0")&&(n="market");const d=this.fixCommaNumber(this.safeString2(e,"order_qty","units"));let h,c=this.fixCommaNumber(this.safeString(e,"units_remaining"));void 0===c&&("closed"===r?c="0":"canceled"!==r&&(c=d));const l=this.safeString(e,"order_currency"),u=this.safeString(e,"payment_currency"),f=this.safeCurrencyCode(l),p=this.safeCurrencyCode(u);void 0!==f&&void 0!==p&&(h=f+"/"+p),void 0===h&&(h=(t=this.safeMarket(void 0,t)).symbol);const m=this.safeString(e,"order_id"),g=this.safeList(e,"contract",[]);return this.safeOrder({info:e,id:m,clientOrderId:void 0,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:h,type:n,timeInForce:void 0,postOnly:void 0,side:s,price:o,triggerPrice:void 0,amount:d,cost:void 0,average:void 0,filled:void 0,remaining:c,status:r,fee:void 0,trades:g},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);void 0===i&&(i=100);const o={count:i,order_currency:a.base,payment_currency:a.quote};void 0!==t&&(o.after=t);const n=await this.privatePostInfoOrders(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseOrders(d,a,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");if(!("side"in i))throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a `side` parameter (sell or buy)");const s=this.market(t),a="buy"===i.side?"bid":"ask";i=this.omit(i,["side","currency"]);const o={order_id:e,type:a,order_currency:s.base,payment_currency:s.quote},n=await this.privatePostTradeCancel(this.extend(o,i));return this.safeOrder({info:n})}async cancelUnifiedOrder(e,t={}){const i={side:e.side};return await this.cancelOrder(e.id,e.symbol,this.extend(i,t))}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n={units:t,address:i,currency:o.id};if("XRP"===e||"XMR"===e||"EOS"===e||"STEEM"===e||"TON"===e){const t=this.safeString(a,"destination");if(void 0===s&&void 0===t)throw new r.ArgumentsRequired(this.id+" "+e+" withdraw() requires a tag argument or an extra destination param");void 0!==s&&(n.destination=s)}const d=await this.privatePostTradeBtcWithdrawal(this.extend(n,a));return this.parseTransaction(d,o)}parseTransaction(e,t=void 0){return{id:void 0,txid:void 0,timestamp:void 0,datetime:void 0,network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,amount:void 0,type:void 0,currency:(t=this.safeCurrency(void 0,t)).code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:void 0,info:e}}fixCommaNumber(e){if(void 0===e)return;let t=e;for(;t.indexOf(",")>-1;)t=t.replace(",","");return t}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o="/"+this.implodeParams(e,s);let d=this.implodeHostname(this.urls.api[t])+o;const h=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(h).length&&(d+="?"+this.urlencode(h));else{this.checkRequiredCredentials(),a=this.urlencode(this.extend({endpoint:o},h));const e=this.nonce().toString(),t=o+"\0"+a+"\0"+e,i=this.hmac(this.encode(t),this.encode(this.secret),n.Zf),s=this.stringToBase64(i);r={Accept:"application/json","Content-Type":"application/x-www-form-urlencoded","Api-Key":this.apiKey,"Api-Sign":s,"Api-Nonce":e}}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&"status"in n){const e=this.safeString(n,"status"),t=this.safeString(n,"message");if(void 0!==e){if("0000"===e)return;if("거래 진행중인 내역이 존재하지 않습니다."===t)return;const i=this.id+" "+t;throw this.throwExactlyMatchedException(this.exceptions,e,i),this.throwExactlyMatchedException(this.exceptions,t,i),new r.ExchangeError(i)}}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitmart",name:"BitMart",countries:["US","CN","HK","KR"],rateLimit:33.34,version:"v2",certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,borrowCrossMargin:!1,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,createTrailingPercentOrder:!0,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!0,fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIsolatedBorrowRate:!0,fetchIsolatedBorrowRates:!0,fetchLedger:!0,fetchLiquidations:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyLiquidations:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactionFee:!0,fetchTransactionFees:!1,fetchTransfer:!1,fetchTransfers:!0,fetchWithdrawAddresses:!0,fetchWithdrawAddressesByNetwork:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!0,setLeverage:!0,setMarginMode:!1,transfer:!0,withdraw:!0},hostname:"bitmart.com",urls:{logo:"https://github.com/user-attachments/assets/0623e9c4-f50e-48c9-82bd-65c3908c3a14",api:{spot:"https://api-cloud.{hostname}",swap:"https://api-cloud-v2.{hostname}"},www:"https://www.bitmart.com/",doc:"https://developer-pro.bitmart.com/",referral:{url:"http://www.bitmart.com/?r=rQCFLh",discount:.3},fees:"https://www.bitmart.com/fee/en"},requiredCredentials:{apiKey:!0,secret:!0,uid:!0},api:{public:{get:{"system/time":3,"system/service":3,"spot/v1/currencies":7.5,"spot/v1/symbols":7.5,"spot/v1/symbols/details":5,"spot/quotation/v3/tickers":6,"spot/quotation/v3/ticker":4,"spot/quotation/v3/lite-klines":5,"spot/quotation/v3/klines":7,"spot/quotation/v3/books":4,"spot/quotation/v3/trades":4,"spot/v1/ticker":5,"spot/v2/ticker":30,"spot/v1/ticker_detail":5,"spot/v1/steps":30,"spot/v1/symbols/kline":6,"spot/v1/symbols/book":5,"spot/v1/symbols/trades":5,"contract/v1/tickers":15,"contract/public/details":5,"contract/public/depth":5,"contract/public/open-interest":30,"contract/public/funding-rate":30,"contract/public/funding-rate-history":30,"contract/public/kline":6,"account/v1/currencies":30,"contract/public/markprice-kline":5}},private:{get:{"account/sub-account/v1/transfer-list":7.5,"account/sub-account/v1/transfer-history":7.5,"account/sub-account/main/v1/wallet":5,"account/sub-account/main/v1/subaccount-list":7.5,"account/contract/sub-account/main/v1/wallet":5,"account/contract/sub-account/main/v1/transfer-list":7.5,"account/contract/sub-account/v1/transfer-history":7.5,"account/v1/wallet":5,"account/v1/currencies":30,"spot/v1/wallet":5,"account/v1/deposit/address":30,"account/v1/withdraw/charge":32,"account/v2/deposit-withdraw/history":7.5,"account/v1/deposit-withdraw/detail":7.5,"account/v1/withdraw/address/list":30,"spot/v1/order_detail":1,"spot/v2/orders":5,"spot/v1/trades":5,"spot/v2/trades":4,"spot/v3/orders":5,"spot/v2/order_detail":1,"spot/v1/margin/isolated/borrow_record":1,"spot/v1/margin/isolated/repay_record":1,"spot/v1/margin/isolated/pairs":30,"spot/v1/margin/isolated/account":5,"spot/v1/trade_fee":30,"spot/v1/user_fee":30,"spot/v1/broker/rebate":1,"contract/private/assets-detail":5,"contract/private/order":1.2,"contract/private/order-history":10,"contract/private/position":10,"contract/private/get-open-orders":1.2,"contract/private/current-plan-order":1.2,"contract/private/trades":10,"contract/private/position-risk":10,"contract/private/affilate/rebate-list":10,"contract/private/affilate/trade-list":10,"contract/private/transaction-history":10},post:{"account/sub-account/main/v1/sub-to-main":30,"account/sub-account/sub/v1/sub-to-main":30,"account/sub-account/main/v1/main-to-sub":30,"account/sub-account/sub/v1/sub-to-sub":30,"account/sub-account/main/v1/sub-to-sub":30,"account/contract/sub-account/main/v1/sub-to-main":7.5,"account/contract/sub-account/main/v1/main-to-sub":7.5,"account/contract/sub-account/sub/v1/sub-to-main":7.5,"account/v1/withdraw/apply":7.5,"spot/v1/submit_order":1,"spot/v1/batch_orders":1,"spot/v2/cancel_order":1,"spot/v1/cancel_orders":15,"spot/v4/query/order":1,"spot/v4/query/client-order":1,"spot/v4/query/open-orders":5,"spot/v4/query/history-orders":5,"spot/v4/query/trades":5,"spot/v4/query/order-trades":5,"spot/v4/cancel_orders":3,"spot/v4/cancel_all":90,"spot/v4/batch_orders":3,"spot/v3/cancel_order":1,"spot/v2/batch_orders":1,"spot/v2/submit_order":1,"spot/v1/margin/submit_order":1.5,"spot/v1/margin/isolated/borrow":30,"spot/v1/margin/isolated/repay":30,"spot/v1/margin/isolated/transfer":30,"account/v1/transfer-contract-list":60,"account/v1/transfer-contract":60,"contract/private/submit-order":2.5,"contract/private/cancel-order":1.5,"contract/private/cancel-orders":30,"contract/private/submit-plan-order":2.5,"contract/private/cancel-plan-order":1.5,"contract/private/submit-leverage":2.5,"contract/private/submit-tp-sl-order":2.5,"contract/private/modify-plan-order":2.5,"contract/private/modify-preset-plan-order":2.5,"contract/private/modify-tp-sl-order":2.5,"contract/private/submit-trail-order":2.5,"contract/private/cancel-trail-order":1.5}}},timeframes:{"1m":1,"3m":3,"5m":5,"15m":15,"30m":30,"45m":45,"1h":60,"2h":120,"3h":180,"4h":240,"1d":1440,"1w":10080,"1M":43200},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0040"),maker:this.parseNumber("0.0035"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0020")],[this.parseNumber("10"),this.parseNumber("0.18")],[this.parseNumber("50"),this.parseNumber("0.0016")],[this.parseNumber("250"),this.parseNumber("0.0014")],[this.parseNumber("1000"),this.parseNumber("0.0012")],[this.parseNumber("5000"),this.parseNumber("0.0010")],[this.parseNumber("25000"),this.parseNumber("0.0008")],[this.parseNumber("50000"),this.parseNumber("0.0006")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("10"),this.parseNumber("0.0009")],[this.parseNumber("50"),this.parseNumber("0.0008")],[this.parseNumber("250"),this.parseNumber("0.0007")],[this.parseNumber("1000"),this.parseNumber("0.0006")],[this.parseNumber("5000"),this.parseNumber("0.0005")],[this.parseNumber("25000"),this.parseNumber("0.0004")],[this.parseNumber("50000"),this.parseNumber("0.0003")]]}}},precisionMode:o.kb,exceptions:{exact:{3e4:r.ExchangeError,30001:r.AuthenticationError,30002:r.AuthenticationError,30003:r.AccountSuspended,30004:r.AuthenticationError,30005:r.AuthenticationError,30006:r.AuthenticationError,30007:r.AuthenticationError,30008:r.AuthenticationError,30010:r.PermissionDenied,30011:r.AuthenticationError,30012:r.AuthenticationError,30013:r.RateLimitExceeded,30014:r.ExchangeNotAvailable,30016:r.OnMaintenance,30017:r.RateLimitExceeded,30018:r.BadRequest,30019:r.PermissionDenied,6e4:r.BadRequest,60001:r.BadRequest,60002:r.BadRequest,60003:r.ExchangeError,60004:r.ExchangeError,60005:r.ExchangeError,60006:r.ExchangeError,60007:r.InvalidAddress,60008:r.InsufficientFunds,60009:r.ExchangeError,60010:r.ExchangeError,60011:r.InvalidAddress,60012:r.ExchangeError,60020:r.PermissionDenied,60021:r.PermissionDenied,60022:r.PermissionDenied,60026:r.PermissionDenied,60027:r.PermissionDenied,60028:r.AccountSuspended,60029:r.AccountSuspended,60030:r.BadRequest,60031:r.BadRequest,60050:r.ExchangeError,60051:r.ExchangeError,61001:r.InsufficientFunds,61003:r.BadRequest,61004:r.BadRequest,61005:r.BadRequest,61006:r.NotSupported,61007:r.ExchangeError,61008:r.ExchangeError,7e4:r.ExchangeError,70001:r.BadRequest,70002:r.BadSymbol,70003:r.NetworkError,71001:r.BadRequest,71002:r.BadRequest,71003:r.BadRequest,71004:r.BadRequest,71005:r.BadRequest,5e4:r.BadRequest,50001:r.BadSymbol,50002:r.BadRequest,50003:r.BadRequest,50004:r.BadRequest,50005:r.OrderNotFound,50006:r.InvalidOrder,50007:r.InvalidOrder,50008:r.InvalidOrder,50009:r.InvalidOrder,50010:r.InvalidOrder,50011:r.InvalidOrder,50012:r.InvalidOrder,50013:r.InvalidOrder,50014:r.BadRequest,50015:r.BadRequest,50016:r.BadRequest,50017:r.BadRequest,50018:r.BadRequest,50019:r.ExchangeError,50020:r.InsufficientFunds,50021:r.BadRequest,50022:r.ExchangeNotAvailable,50023:r.BadSymbol,50024:r.BadRequest,50025:r.BadRequest,50026:r.BadRequest,50027:r.BadRequest,50028:r.BadRequest,50029:r.InvalidOrder,50030:r.OrderNotFound,50031:r.OrderNotFound,50032:r.OrderNotFound,50033:r.InvalidOrder,50034:r.InvalidOrder,50035:r.InvalidOrder,50036:r.ExchangeError,50037:r.BadRequest,50038:r.BadRequest,50039:r.BadRequest,50040:r.BadSymbol,50041:r.ExchangeError,50042:r.BadRequest,51e3:r.BadSymbol,51001:r.ExchangeError,51002:r.ExchangeError,51003:r.ExchangeError,51004:r.InsufficientFunds,51005:r.InvalidOrder,51006:r.InvalidOrder,51007:r.BadRequest,51008:r.ExchangeError,51009:r.InvalidOrder,51010:r.InvalidOrder,51011:r.InvalidOrder,51012:r.InvalidOrder,51013:r.InvalidOrder,51014:r.InvalidOrder,51015:r.InvalidOrder,52e3:r.BadRequest,52001:r.BadRequest,52002:r.BadRequest,52003:r.BadRequest,52004:r.BadRequest,53e3:r.AccountSuspended,53001:r.AccountSuspended,53002:r.PermissionDenied,53003:r.PermissionDenied,53005:r.PermissionDenied,53006:r.PermissionDenied,53007:r.PermissionDenied,53008:r.PermissionDenied,53009:r.PermissionDenied,53010:r.PermissionDenied,57001:r.BadRequest,58001:r.BadRequest,59001:r.ExchangeError,59002:r.ExchangeError,59003:r.ExchangeError,59004:r.ExchangeError,59005:r.PermissionDenied,59006:r.ExchangeError,59007:r.ExchangeError,59008:r.ExchangeError,59009:r.ExchangeError,59010:r.InsufficientFunds,59011:r.ExchangeError,40001:r.ExchangeError,40002:r.ExchangeError,40003:r.ExchangeError,40004:r.ExchangeError,40005:r.ExchangeError,40006:r.PermissionDenied,40007:r.BadRequest,40008:r.InvalidNonce,40009:r.BadRequest,40010:r.BadRequest,40011:r.BadRequest,40012:r.ExchangeError,40013:r.ExchangeError,40014:r.BadSymbol,40015:r.BadSymbol,40016:r.InvalidOrder,40017:r.InvalidOrder,40018:r.InvalidOrder,40019:r.ExchangeError,40020:r.InvalidOrder,40021:r.ExchangeError,40022:r.ExchangeError,40023:r.ExchangeError,40024:r.ExchangeError,40025:r.ExchangeError,40026:r.ExchangeError,40027:r.InsufficientFunds,40028:r.PermissionDenied,40029:r.InvalidOrder,40030:r.InvalidOrder,40031:r.InvalidOrder,40032:r.InvalidOrder,40033:r.InvalidOrder,40034:r.BadSymbol,40035:r.OrderNotFound,40036:r.InvalidOrder,40037:r.OrderNotFound,40038:r.BadRequest,40039:r.BadRequest,40040:r.InvalidOrder,40041:r.InvalidOrder,40042:r.InvalidOrder,40043:r.InvalidOrder,40044:r.InvalidOrder,40045:r.InvalidOrder,40046:r.PermissionDenied,40047:r.PermissionDenied,40048:r.InvalidOrder,40049:r.InvalidOrder,40050:r.InvalidOrder},broad:{"You contract account available balance not enough":r.InsufficientFunds,"you contract account available balance not enough":r.InsufficientFunds}},commonCurrencies:{$GM:"GOLDMINER",$HERO:"Step Hero",$PAC:"PAC",BP:"BEYOND",GDT:"Gorilla Diamond",GLD:"Goldario",MVP:"MVP Coin",TRU:"Truebit"},options:{defaultNetworks:{USDT:"TRC20",BTC:"BTC",ETH:"ERC20"},timeDifference:0,adjustForTimeDifference:!1,networks:{ERC20:"ERC20",SOL:"SOL",BTC:"BTC",TRC20:"TRC20",OMNI:"OMNI",XLM:"XLM",EOS:"EOS",NEO:"NEO",BTM:"BTM",BCH:"BCH",LTC:"LTC",BSV:"BSV",XRP:"XRP",PLEX:"PLEX",XCH:"XCH",NEAR:"NEAR",FIO:"FIO",SCRT:"SCRT",IOTX:"IOTX",ALGO:"ALGO",ATOM:"ATOM",DOT:"DOT",ADA:"ADA",DOGE:"DOGE",XYM:"XYM",GLMR:"GLMR",MOVR:"MOVR",ZIL:"ZIL",INJ:"INJ",KSM:"KSM",ZEC:"ZEC",NAS:"NAS",POLYGON:"MATIC",HRC20:"HECO",XDC:"XDC",ONE:"ONE",LAT:"LAT",CSPR:"Casper",ICP:"Computer",XTZ:"XTZ",MINA:"MINA",BEP20:"BSC_BNB",THETA:"THETA",AKT:"AKT",AR:"AR",CELO:"CELO",FIL:"FIL",NULS:"NULS",ETC:"ETC",DASH:"DASH",DGB:"DGB",BEP2:"BEP2",GRIN:"GRIN",WAVES:"WAVES",ABBC:"ABBC",ACA:"ACA",QTUM:"QTUM",PAC:"PAC",TLOS:"TLOS",KARDIA:"KardiaChain",FUSE:"FUSE",TRC10:"TRC10",FIRO:"FIRO",FTM:"Fantom",EVER:"EVER",KAVA:"KAVA",HYDRA:"HYDRA",PLCU:"PLCU",BRISE:"BRISE",OPTIMISM:"OPTIMISM",REEF:"REEF",SYS:"SYS",VITE:"VITE",STX:"STX",SXP:"SXP",BITCI:"BITCI",XRD:"XRD",ASTR:"ASTAR",ZEN:"HORIZEN",LTO:"LTO",ETHW:"ETHW",ETHF:"ETHF",IOST:"IOST",APT:"APT",ONT:"ONT",EVMOS:"EVMOS",XMR:"XMR",OASYS:"OAS",OSMO:"OSMO",OMAX:"OMAX Chain",DESO:"DESO",BFIC:"BFIC",OHO:"OHO",CS:"CS",CHEQ:"CHEQ",NODL:"NODL",NEM:"XEM",FRA:"FRA",ERGO:"ERG"},networksById:{ETH:"ERC20",Ethereum:"ERC20",USDT:"OMNI",Bitcoin:"BTC"},defaultType:"spot",fetchBalance:{type:"spot"},accountsByType:{spot:"spot",swap:"swap"},createMarketBuyOrderRequiresPrice:!0,brokerId:"CCXTxBitmart000"},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0,leverage:!0,selfTradePrevention:!1,iceberg:!1},createOrders:{max:10},fetchMyTrades:{marginMode:!0,limit:200,daysBack:void 0,untilDays:99999,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:200,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:200,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},forDerivatives:{extends:"default",createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!1},price:!1},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,marketBuyRequiresPrice:!0,marketBuyByCost:!0},fetchMyTrades:{marginMode:!0,limit:void 0,daysBack:void 0,untilDays:99999},fetchOrder:{marginMode:!1,trigger:!1,trailing:!0},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!1},fetchClosedOrders:{marginMode:!0,limit:200,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1},fetchOHLCV:{limit:500}},spot:{extends:"default"},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){const t=await this.publicGetSystemTime(e),i=this.safeDict(t,"data",{});return this.safeInteger(i,"server_time")}async fetchStatus(e={}){const t=this.safeDict(this.options,"fetchStatus",{}),i=this.safeString(this.options,"defaultType");let s=this.safeString(t,"type",i);s=this.safeString(e,"type",s),e=this.omit(e,"type");const r=await this.publicGetSystemService(e),a=this.safeDict(r,"data",{}),o=this.safeList(a,"service",[]),n=this.indexBy(o,"service_type");"swap"===s&&(s="contract");const d=this.safeString(n,s);let h,c;if(void 0!==d){2===this.safeInteger(d,"status")?h="ok":(h="maintenance",c=this.safeInteger(d,"end_time"))}return{status:h,updated:void 0,eta:c,url:void 0,info:r}}async fetchSpotMarkets(e={}){const t=await this.publicGetSpotV1SymbolsDetails(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"symbols",[]),r=[],o=this.fees.trading;for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"symbol"),n=this.safeInteger(t,"symbol_id"),d=this.safeString(t,"base_currency"),h=this.safeString(t,"quote_currency"),c=this.safeCurrencyCode(d),l=this.safeCurrencyCode(h),u=c+"/"+l,f=this.safeString(t,"min_buy_amount"),p=this.safeString(t,"min_sell_amount"),m=a.Y.stringMax(f,p),g=this.safeNumber(t,"base_min_size");r.push(this.safeMarketStructure({id:i,numericId:n,symbol:u,base:c,quote:l,settle:void 0,baseId:d,quoteId:h,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,maker:o.maker,taker:o.taker,precision:{amount:g,price:this.parseNumber(this.parsePrecision(this.safeString(t,"price_max_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:g,max:this.safeNumber(t,"base_max_size")},price:{min:void 0,max:void 0},cost:{min:this.parseNumber(m),max:void 0}},created:void 0,info:t}))}return r}async fetchContractMarkets(e={}){const t=await this.publicGetContractPublicDetails(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"symbols",[]),r=[],a=this.fees.trading;for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"symbol"),o=this.safeString(t,"base_currency"),n=this.safeString(t,"quote_currency"),d=this.safeCurrencyCode(o),h=this.safeCurrencyCode(n),c="USDT",l=this.safeCurrencyCode(c),u=d+"/"+h+":"+l,f=this.safeInteger(t,"product_type"),p=1===f,m=2===f;let g=this.safeInteger(t,"expire_timestamp");m||0!==g||(g=void 0),r.push(this.safeMarketStructure({id:i,numericId:void 0,symbol:u,base:d,quote:h,settle:l,baseId:o,quoteId:n,settleId:c,type:p?"swap":"future",spot:!1,margin:!1,swap:p,future:m,option:!1,active:!0,contract:!0,linear:!0,inverse:!1,contractSize:this.safeNumber(t,"contract_size"),expiry:g,expiryDatetime:this.iso8601(g),strike:void 0,optionType:void 0,maker:a.maker,taker:a.taker,precision:{amount:this.safeNumber(t,"vol_precision"),price:this.safeNumber(t,"price_precision")},limits:{leverage:{min:this.safeNumber(t,"min_leverage"),max:this.safeNumber(t,"max_leverage")},amount:{min:this.safeNumber(t,"min_volume"),max:this.safeNumber(t,"max_volume")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:this.safeInteger(t,"open_timestamp"),info:t}))}return r}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=await this.fetchSpotMarkets(e),i=await this.fetchContractMarkets(e);return this.arrayConcat(t,i)}async fetchCurrencies(e={}){const t=await this.publicGetAccountV1Currencies(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"currencies",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"currency");let a=i,o=this.safeString(t,"network");if(i.indexOf("NFT")<0){const e=i.split("-");a=this.safeString(e,0);const t=this.safeString(e,1);void 0!==t&&(o=t.toUpperCase())}const n=this.safeCurrencyCode(a);let d=this.safeDict(r,n);void 0===d&&(d={info:t,id:a,code:n,precision:void 0,name:this.safeString(t,"name"),deposit:void 0,withdraw:void 0,active:void 0,networks:{}});const h=this.networkIdToCode(o),c=this.safeBool(t,"withdraw_enabled"),l=this.safeBool(t,"deposit_enabled");d.networks[h]={info:t,id:o,code:h,withdraw:c,deposit:l,active:c&&l,fee:this.safeNumber(t,"withdraw_fee"),limits:{withdraw:{min:this.safeNumber(t,"withdraw_minsize"),max:void 0},deposit:{min:void 0,max:void 0}}},r[n]=d}const a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e],i=r[t];r[t]=this.safeCurrencyStructure(i)}return r}getCurrencyIdFromCodeAndNetwork(e,t){void 0===t&&(t=this.defaultNetworkCode(e));const i=this.currency(e);let s,r=i.id;const a=this.safeDict(i,"networks",{});let o={};if(void 0===t){let t=this.safeDict(a,e);if(void 0===t){const e=Object.keys(a);e.length>0&&(t=this.safeValue(a,e[0]))}o=this.safeDict(t,"info",{}),s=this.safeString(o,"currency")}else{const i=this.safeDict(a,t);void 0!==i?(o=this.safeDict(i,"info",{}),s=this.safeString(o,"currency")):r+="-"+this.networkCodeToId(t,e)}return void 0!==s?s:r}async fetchTransactionFee(e,t={}){await this.loadMarkets();const i=this.currency(e);let s;[s,t]=this.handleNetworkCodeAndParams(t);const r={currency:this.getCurrencyIdFromCodeAndNetwork(i.code,s)},a=await this.privateGetAccountV1WithdrawCharge(this.extend(r,t)),o=a.data,n={};return n[e]=this.safeNumber(o,"withdraw_fee"),{info:a,withdraw:n,deposit:{}}}parseDepositWithdrawFee(e,t=void 0){return{info:e,withdraw:{fee:this.safeNumber(e,"withdraw_fee"),percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}}}async fetchDepositWithdrawFee(e,t={}){let i;await this.loadMarkets(),[i,t]=this.handleNetworkCodeAndParams(t);const s={currency:this.getCurrencyIdFromCodeAndNetwork(e,i)},r=(await this.privateGetAccountV1WithdrawCharge(this.extend(s,t))).data;return this.parseDepositWithdrawFee(r)}parseTicker(e,t=void 0){const i=this.safeList(e,"result",[]),s=this.safeString2(e,"avg_price","index_price");let r=this.safeString2(e,"symbol","contract_symbol"),o=this.safeInteger2(e,"timestamp","ts"),n=this.safeString2(e,"last_price","last"),d=this.safeString2(e,"price_change_percent_24h","change_24h"),h=this.safeString(e,"fluctuation"),c=this.safeString2(e,"high_24h","high_price"),l=this.safeString2(e,"low_24h","low_price"),u=this.safeString2(e,"best_bid","bid_px"),f=this.safeString2(e,"best_bid_size","bid_sz"),p=this.safeString2(e,"best_ask","ask_px"),m=this.safeString2(e,"best_ask_size","ask_sz"),g=this.safeString(e,"open_24h"),v=this.safeStringN(e,["base_volume_24h","v_24h","volume_24h"]),y=this.safeStringLowerN(e,["quote_volume_24h","qv_24h","turnover_24h"]);const w=this.safeString(i,0);void 0!==w&&(r=w,o=this.safeInteger(i,12),c=this.safeString(i,5),l=this.safeString(i,6),u=this.safeString(i,8),f=this.safeString(i,9),p=this.safeString(i,10),m=this.safeString(i,11),g=this.safeString(i,4),n=this.safeString(i,1),h=this.safeString(i,7),v=this.safeString(i,2),y=this.safeStringLower(i,3));const b=(t=this.safeMarket(r,t)).symbol;return void 0===o&&(o=this.safeIntegerProduct(e,"s_t",1e3)),void 0===d&&(d=a.Y.stringMul(h,"100")),void 0===y&&(void 0===v?y=this.safeString(e,"volume_24h",y):(y=v,v=void 0)),this.safeTicker({symbol:b,timestamp:o,datetime:this.iso8601(o),high:c,low:l,bid:u,bidVolume:f,ask:p,askVolume:m,vwap:void 0,open:g,close:n,last:n,previousClose:void 0,change:void 0,percentage:d,average:s,baseVolume:v,quoteVolume:y,indexPrice:this.safeString(e,"index_price"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={};let a;if(i.swap)s.symbol=i.id,a=await this.publicGetContractPublicDetails(this.extend(s,t));else{if(!i.spot)throw new r.NotSupported(this.id+" fetchTicker() does not support "+i.type+" markets, only spot and swap markets are accepted");s.symbol=i.id,a=await this.publicGetSpotQuotationV3Ticker(this.extend(s,t))}let o=[],n={};if(i.spot)n=this.safeDict(a,"data",{});else{const e=this.safeDict(a,"data",{});o=this.safeList(e,"symbols",[]),n=this.safeDict(o,0,{})}return this.parseTicker(n,i)}async fetchTickers(e=void 0,t={}){let i,s,a;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))){const t=this.safeString(e,0);s=this.market(t)}if([i,t]=this.handleMarketTypeAndParams("fetchTickers",s,t),"spot"===i)a=await this.publicGetSpotQuotationV3Tickers(t);else{if("swap"!==i)throw new r.NotSupported(this.id+" fetchTickers() does not support "+i+" markets, only spot and swap markets are accepted");a=await this.publicGetContractPublicDetails(t)}let o=[];if("spot"===i)o=this.safeList(a,"data",[]);else{const e=this.safeDict(a,"data",{});o=this.safeList(e,"symbols",[])}const n={};for(let e=0;e<o.length;e++){let t={};t="spot"===i?this.parseTicker({result:o[e]}):this.parseTicker(o[e]);n[t.symbol]=t}return this.filterByArrayTickers(n,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),a={symbol:s.id};let o;if(s.spot)void 0!==t&&(a.limit=t),o=await this.publicGetSpotQuotationV3Books(this.extend(a,i));else{if(!s.swap)throw new r.NotSupported(this.id+" fetchOrderBook() does not support "+s.type+" markets, only spot and swap markets are accepted");o=await this.publicGetContractPublicDepth(this.extend(a,i))}const n=this.safeDict(o,"data",{}),d=this.safeInteger2(n,"ts","timestamp");return this.parseOrderBook(n,s.symbol,d)}parseTrade(e,t=void 0){const i=this.safeIntegerN(e,["createTime","create_time",1]);let s,r,a,o;void 0!==this.safeString(e,0)?(s=this.safeString2(e,"count",3),r=this.safeString(e,"amount"),o=this.safeString2(e,"type",4)):(s=this.safeStringN(e,["size","vol","fillQty"]),r=this.safeString(e,"notional"),a=this.safeString(e,"type"),o=this.parseOrderSide(this.safeString(e,"side")));const n=this.safeString2(e,"symbol",0);t=this.safeMarket(n,t);const d=this.safeString2(e,"fee","paid_fees");let h;if(void 0!==d){const i=this.safeString(e,"feeCoinName");let s=this.safeCurrencyCode(i);void 0===s&&(s="buy"===o?t.base:t.quote),h={cost:d,currency:s}}return this.safeTrade({info:e,id:this.safeStringN(e,["tradeId","trade_id","lastTradeID"]),order:this.safeString2(e,"orderId","order_id"),timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,type:a,side:o,price:this.safeStringN(e,["price","fillPrice",2]),amount:s,cost:r,takerOrMaker:this.safeStringLower2(e,"tradeRole","exec_type"),fee:h},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e);if(!a.spot)throw new r.NotSupported(this.id+" fetchTrades() does not support "+a.type+" orders, only spot orders are accepted");const o={symbol:a.id};void 0!==i&&(o.limit=i);const n=await this.publicGetSpotQuotationV3Trades(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseOHLCV(e,t=void 0){return Array.isArray(e)?[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]:[this.safeTimestamp2(e,"timestamp","ts"),this.safeNumber2(e,"open_price","o"),this.safeNumber2(e,"high_price","h"),this.safeNumber2(e,"low_price","l"),this.safeNumber2(e,"close_price","c"),this.safeNumber2(e,"volume","v")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,200);const o=this.market(e),n=this.parseTimeframe(t),d=this.safeInteger(this.timeframes,t);let h,c={symbol:o.id};if(c.step=void 0!==d?d:t,o.spot)[c,r]=this.handleUntilOption("before",c,r,.001),void 0!==s&&(c.limit=s),void 0!==i&&(c.after=this.parseToInt(i/1e3)-1);else{const e=500;void 0===s&&(s=e),s=Math.min(e,s);const t=this.parseToInt(this.milliseconds()/1e3);if(void 0===i){const e=t-s*n;c.start_time=e,c.end_time=t}else{const e=this.parseToInt(i/1e3)-1,r=this.sum(e,s*n);c.start_time=e,c.end_time=Math.min(r,t)}[c,r]=this.handleUntilOption("end_time",c,r,.001)}if(o.swap){"mark"===this.safeString(r,"price")?(r=this.omit(r,"price"),h=await this.publicGetContractPublicMarkpriceKline(this.extend(c,r))):h=await this.publicGetContractPublicKline(this.extend(c,r))}else h=await this.publicGetSpotQuotationV3Klines(this.extend(c,r));const l=this.safeList(h,"data",[]);return this.parseOHLCVs(l,o,t,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets();const o={};let n,d;void 0!==e&&(a=this.market(e),o.symbol=a.id),[n,s]=this.handleMarketTypeAndParams("fetchMyTrades",a,s);const h=this.safeIntegerN(s,["until","endTime","end_time"]);if(s=this.omit(s,["until"]),"spot"===n){let e;[e,s]=this.handleMarginModeAndParams("fetchMyTrades",s),"isolated"===e&&(o.orderMode="iso_margin");const r=this.safeDict(this.options,"fetchMyTrades",{}),a=200,n=this.safeInteger(r,"limit",a);void 0===i&&(i=n),o.limit=Math.min(i,a),void 0!==t&&(o.startTime=t),void 0!==h&&(o.endTime=h),d=await this.privatePostSpotV4QueryTrades(this.extend(o,s))}else{if("swap"!==n)throw new r.NotSupported(this.id+" fetchMyTrades() does not support "+n+" orders, only spot and swap orders are accepted");if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");void 0!==t&&(o.start_time=t),void 0!==h&&(o.end_time=h),d=await this.privateGetContractPrivateTrades(this.extend(o,s))}const c=this.safeList(d,"data",[]);return this.parseTrades(c,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={orderId:e},o=await this.privatePostSpotV4QueryOrderTrades(this.extend(a,r)),n=this.safeList(o,"data",[]);return this.parseTrades(n,void 0,i,s)}customParseBalance(e,t){const i=this.safeDict(e,"data",{});let s;s="swap"===t?this.safeList(e,"data",[]):"margin"===t?this.safeList(i,"symbols",[]):this.safeList(i,"wallet",[]);const r={info:e};if("margin"===t){for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"symbol"),a=this.safeSymbol(i,void 0,"_"),o=this.safeDict(t,"base",{}),n=this.safeDict(t,"quote",{}),d=this.safeCurrencyCode(this.safeString(o,"currency")),h=this.safeCurrencyCode(this.safeString(n,"currency")),c={};c[d]=this.parseBalanceHelper(o),c[h]=this.parseBalanceHelper(n),r[a]=this.safeBalance(c)}return r}for(let e=0;e<s.length;e++){const t=s[e];let i=this.safeString2(t,"id","currency");i=this.safeString(t,"coin_code",i);const a=this.safeCurrencyCode(i),o=this.account();o.free=this.safeString2(t,"available","available_balance"),o.used=this.safeString2(t,"frozen","frozen_balance"),r[a]=o}return this.safeBalance(r)}parseBalanceHelper(e){const t=this.account();t.used=this.safeString(e,"frozen"),t.free=this.safeString(e,"available"),t.total=this.safeString(e,"total_asset");const i=this.safeString(e,"borrow_unpaid"),s=this.safeString(e,"interest_unpaid");return t.debt=a.Y.stringAdd(i,s),t}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const i=this.safeString(e,"marginMode"),s=this.safeBool(e,"margin",!1);let a;if(e=this.omit(e,["margin","marginMode"]),(void 0!==i||s)&&(t="margin"),"spot"===t)a=await this.privateGetSpotV1Wallet(e);else if("swap"===t)a=await this.privateGetContractPrivateAssetsDetail(e);else if("account"===t)a=await this.privateGetAccountV1Wallet(e);else{if("margin"!==t)throw new r.NotSupported(this.id+" fetchBalance() does not support "+t+" markets, only spot, swap and account and margin markets are accepted");a=await this.privateGetSpotV1MarginIsolatedAccount(e)}return this.customParseBalance(a,t)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i),maker:this.safeNumber(e,"maker_fee_rate"),taker:this.safeNumber(e,"taker_fee_rate"),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.spot)throw new r.NotSupported(this.id+" fetchTradingFee() does not support "+i.type+" orders, only spot orders are accepted");const s={symbol:i.id},a=await this.privateGetSpotV1TradeFee(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseTradingFee(o)}parseOrder(e,t=void 0){let i;"string"==typeof e&&(i=e,e={}),i=this.safeString2(e,"order_id","orderId",i);const s=this.safeInteger2(e,"create_time","createTime"),r=this.safeString(e,"symbol"),a=this.safeSymbol(r,t);t=this.safeMarket(a,t);const o=this.safeString(t,"type","spot");let n,d,h=this.safeString(e,"type");"limit_maker"===h&&(h="limit",d=!0,n="PO"),"ioc"===h&&(h="limit",n="IOC");let c=this.safeString(e,"price");"market price"===c&&(c=void 0);const l=this.safeNumber(e,"activation_price");return this.safeOrder({id:i,clientOrderId:this.safeString2(e,"client_order_id","clientOrderId"),info:e,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:this.safeInteger(e,"update_time"),symbol:a,type:h,timeInForce:n,postOnly:d,side:this.parseOrderSide(this.safeString(e,"side")),price:this.omitZero(c),triggerPrice:l,amount:this.omitZero(this.safeString(e,"size")),cost:this.safeString2(e,"filled_notional","filledNotional"),average:this.safeStringN(e,["price_avg","priceAvg","deal_avg_price"]),filled:this.safeStringN(e,["filled_size","filledSize","deal_size"]),remaining:void 0,status:this.parseOrderStatusByType(o,this.safeString2(e,"status","state")),fee:void 0,trades:void 0},t)}parseOrderSide(e){return this.safeString({1:"buy",2:"buy",3:"sell",4:"sell"},e,e)}parseOrderStatusByType(e,t){const i=this.safeDict({spot:{1:"rejected",2:"open",3:"rejected",4:"open",5:"open",6:"closed",7:"canceled",8:"canceled",new:"open",partially_filled:"open",filled:"closed",partially_canceled:"canceled"},swap:{1:"open",2:"open",4:"closed"}},e,{});return this.safeString(i,t,t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.handleMarginModeAndParams("createOrder",a),d=this.safeString(n,0),h=this.safeStringN(a,["triggerPrice","stopPrice","trigger_price"]),c=void 0!==this.safeString(a,"stopLossPrice"),l=void 0!==this.safeString(a,"takeProfitPrice"),u=void 0!==h;let f;if(o.spot){const o=this.createSpotOrderRequest(e,t,i,s,r,a);f="isolated"===d?await this.privatePostSpotV1MarginSubmitOrder(o):await this.privatePostSpotV2SubmitOrder(o)}else{const o=this.createSwapOrderRequest(e,t,i,s,r,a);f=void 0!==this.safeString(o,"activation_price")?await this.privatePostContractPrivateSubmitTrailOrder(o):u?await this.privatePostContractPrivateSubmitPlanOrder(o):c||l?await this.privatePostContractPrivateSubmitTpSlOrder(o):await this.privatePostContractPrivateSubmitOrder(o)}const p=this.safeDict(f,"data",{}),m=this.parseOrder(p,o);return m.type=t,m.side=i,m.amount=s,m.price=r,m}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s,a;for(let t=0;t<e.length;t++){const o=e[t],n=this.safeString(o,"symbol");if(a=this.market(n),!a.spot)throw new r.NotSupported(this.id+" createOrders() supports spot orders only");if(void 0===s)s=n;else if(s!==n)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const d=this.safeString(o,"type"),h=this.safeString(o,"side"),c=this.safeValue(o,"amount"),l=this.safeValue(o,"price"),u=this.safeDict(o,"params",{});let f=this.createSpotOrderRequest(n,d,h,c,l,u);f=this.omit(f,["symbol"]),i.push(f)}const o={symbol:a.id,orderParams:i},n=await this.privatePostSpotV4BatchOrders(o),d=this.safeDict(n,"data",{}),h=this.safeDict(d,"data",{}),c=this.safeList(h,"orderIds",[]),l=[];for(let e=0;e<c.length;e++){const t=c[e],i=this.safeOrder({id:t},a);l.push(i)}return l}createSwapOrderRequest(e,t,i,s,r=void 0,a={}){const o=this.market(e),n=this.safeString(a,"stopLossPrice"),d=this.safeString(a,"takeProfitPrice"),h=void 0!==n,c=void 0!==d;h?t="stop_loss":c&&(t="take_profit");const l={symbol:o.id,size:parseInt(this.amountToPrecision(e,s))},u=this.safeString(a,"timeInForce"),f=this.safeInteger(a,"mode"),p="market"===t;let m,g=this.safeBool(a,"reduceOnly");const v=4===f;[m,a]=this.handlePostOnly(p,v,a);const y="limit"===t||m||("IOC"===u||3===f);"GTC"===u?l.mode=1:"FOK"===u?l.mode=2:"IOC"===u&&(l.mode=3),m&&(l.mode=4);const w=this.safeStringN(a,["triggerPrice","stopPrice","trigger_price"]),b=void 0!==w,k=this.safeString2(a,"trailingTriggerPrice","activation_price",this.numberToString(r)),S=this.safeString2(a,"trailingPercent","callback_rate"),O=void 0!==S;let T;y?l.price=this.priceToPrecision(e,r):("trailing"===t||O)&&(t="trailing",l.callback_rate=S,l.activation_price=this.priceToPrecision(e,k),l.activation_price_type=this.safeInteger(a,"activation_price_type",1)),b&&((y||void 0!==r)&&(l.executive_price=this.priceToPrecision(e,r)),l.trigger_price=this.priceToPrecision(e,w),l.price_type=this.safeInteger(a,"price_type",1),"buy"===i?l.price_way=g?2:1:"sell"===i&&(l.price_way=g?1:2)),[T,a]=this.handleMarginModeAndParams("createOrder",a,"cross"),h||c?(g=!0,l.price_type=this.safeInteger(a,"price_type",1),l.executive_price=this.priceToPrecision(e,r),l.trigger_price=h?this.priceToPrecision(e,n):this.priceToPrecision(e,d)):l.open_type=T,"buy"===i?l.side=g?2:1:"sell"===i&&(l.side=g?3:4);const P=this.safeString(a,"clientOrderId");void 0!==P&&(a=this.omit(a,"clientOrderId"),l.client_order_id=P);const I=this.safeInteger(a,"leverage");return a=this.omit(a,["timeInForce","postOnly","reduceOnly","leverage","trailingTriggerPrice","trailingPercent","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice"]),void 0!==I?l.leverage=this.numberToString(I):b&&(l.leverage="1"),"trailing"!==t&&(l.type=t),this.extend(l,a)}createSpotOrderRequest(e,t,i,s,n=void 0,d={}){const h=this.market(e),c={symbol:h.id,side:i,type:t},l=this.safeString(d,"timeInForce");if("FOK"===l)throw new r.InvalidOrder(this.id+" createOrder() only accepts timeInForce parameter values of IOC or PO");const u=this.safeInteger(d,"mode"),f="market"===t;let p;const m="limit_maker"===t||4===u;[p,d]=this.handlePostOnly(f,m,d),d=this.omit(d,["timeInForce","postOnly"]);const g="IOC"===l||"ioc"===t;if("limit"===t||p||g)c.size=this.amountToPrecision(e,s),c.price=this.priceToPrecision(e,n);else if(f)if("buy"===i){let e=this.safeString2(d,"cost","notional");d=this.omit(d,"cost");let t=!0;if([t,d]=this.handleOptionAndParams(d,"createOrder","createMarketBuyOrderRequiresPrice",!0),t){if(void 0===n&&void 0===e)throw new r.InvalidOrder(this.id+' createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument or in the "notional" extra parameter (the exchange-specific behaviour)');{const t=this.numberToString(s),i=this.numberToString(n);e=a.Y.stringMul(t,i)}}else e=void 0===e?this.numberToString(s):e;c.notional=this.decimalToPrecision(e,o.R3,h.precision.price,this.precisionMode)}else"sell"===i&&(c.size=this.amountToPrecision(e,s));p&&(c.type="limit_maker"),g&&(c.type="ioc");const v=this.safeString(d,"clientOrderId");return void 0!==v&&(d=this.omit(d,"clientOrderId"),c.client_order_id=v),this.extend(c,d)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id},o=this.safeString2(i,"clientOrderId","client_order_id");let n;if(void 0!==o?a.client_order_id=o:a.order_id=e.toString(),i=this.omit(i,["clientOrderId"]),s.spot)n=await this.privatePostSpotV3CancelOrder(this.extend(a,i));else{const e=this.safeBool2(i,"stop","trigger"),t=this.safeBool(i,"trailing");i=this.omit(i,["stop","trigger"]),n=e?await this.privatePostContractPrivateCancelPlanOrder(this.extend(a,i)):t?await this.privatePostContractPrivateCancelTrailOrder(this.extend(a,i)):await this.privatePostContractPrivateCancelOrder(this.extend(a,i))}if(s.swap)return n;const d=this.safeValue(n,"data");if(!0===d)return this.safeOrder({id:e},s);const h=this.safeValue(d,"succeed");if(void 0!==h){if(void 0===(e=this.safeString(h,0)))throw new r.InvalidOrder(this.id+" cancelOrder() failed to cancel "+t+" order id "+e)}else{if(!this.safeValue(d,"result"))throw new r.InvalidOrder(this.id+" cancelOrder() "+t+" order id "+e+" is filled or canceled")}return this.safeOrder({id:e,symbol:s.symbol,info:{}},s)}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(!s.spot)throw new r.NotSupported(this.id+" cancelOrders() does not support "+s.type+" orders, only spot orders are accepted");const a=this.safeList(i,"clientOrderIds");i=this.omit(i,["clientOrderIds"]);const o={symbol:s.id};void 0!==a?o.clientOrderIds=a:o.orderIds=e;const n=await this.privatePostSpotV4CancelOrders(this.extend(o,i)),d=this.safeDict(n,"data",{}),h=[],c=this.safeList(d,"successIds",[]);for(let e=0;e<c.length;e++){const t=c[e];h.push(this.safeOrder({id:t,status:"canceled"},s))}const l=this.safeList(d,"failIds",[]);for(let e=0;e<l.length;e++){const t=l[e];h.push(this.safeOrder({id:t,status:"failed"},s))}return h}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s,a,o;if(void 0!==e&&(s=this.market(e),i.symbol=s.id),[o,t]=this.handleMarketTypeAndParams("cancelAllOrders",s,t),"spot"===o)a=await this.privatePostSpotV4CancelAll(this.extend(i,t));else if("swap"===o){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");a=await this.privatePostContractPrivateCancelOrders(this.extend(i,t))}return a}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,a={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrdersByStatus() requires a symbol argument");await this.loadMarkets();const o=this.market(t);if(!o.spot)throw new r.NotSupported(this.id+" fetchOrdersByStatus() does not support "+o.type+" orders, only spot orders are accepted");const n={symbol:o.id,offset:1,N:100};n.status="open"===e?9:"closed"===e?6:"canceled"===e?8:e;const d=await this.privateGetSpotV3Orders(this.extend(n,a)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"orders",[]);return this.parseOrders(c,o,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets();const o={};let n,d;if(void 0!==e&&(a=this.market(e),o.symbol=a.id),[n,s]=this.handleMarketTypeAndParams("fetchOpenOrders",a,s),"spot"===n){let e;void 0!==i&&(o.limit=Math.min(i,200)),[e,s]=this.handleMarginModeAndParams("fetchOpenOrders",s),"isolated"===e&&(o.orderMode="iso_margin"),void 0!==t&&(o.startTime=t);const r=this.safeInteger2(s,"until","endTime");void 0!==r&&(s=this.omit(s,["endTime"]),o.endTime=r),d=await this.privatePostSpotV4QueryOpenOrders(this.extend(o,s))}else{if("swap"!==n)throw new r.NotSupported(this.id+" fetchOpenOrders() does not support "+n+" orders, only spot and swap orders are accepted");{void 0!==i&&(o.limit=Math.min(i,100));const e=this.safeBool2(s,"stop","trigger");if(s=this.omit(s,["stop","trigger"]),e)d=await this.privateGetContractPrivateCurrentPlanOrder(this.extend(o,s));else{const e=this.safeBool(s,"trailing",!1);let t=this.safeString(s,"orderType");s=this.omit(s,["orderType","trailing"]),e&&(t="trailing"),void 0!==t&&(o.type=t),d=await this.privateGetContractPrivateGetOpenOrders(this.extend(o,s))}}}const h=this.safeList(d,"data",[]);return this.parseOrders(h,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets();const o={};let n;if(void 0!==e&&(a=this.market(e),o.symbol=a.id),[n,s]=this.handleMarketTypeAndParams("fetchClosedOrders",a,s),"spot"!==n&&void 0===e)throw new r.ArgumentsRequired(this.id+" fetchClosedOrders() requires a symbol argument");if(void 0!==t){o["spot"===n?"startTime":"start_time"]=t}const d="spot"===n?"endTime":"end_time",h=this.safeInteger2(s,"until",d);let c;if(void 0!==h&&(s=this.omit(s,["until"]),o[d]=h),"spot"===n){let e;[e,s]=this.handleMarginModeAndParams("fetchClosedOrders",s),"isolated"===e&&(o.orderMode="iso_margin"),c=await this.privatePostSpotV4QueryHistoryOrders(this.extend(o,s))}else c=await this.privateGetContractPrivateOrderHistory(this.extend(o,s));const l=this.safeList(c,"data",[]);return this.parseOrders(l,a,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("canceled",e,t,i,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={};let a,o,n;if(void 0!==t&&(o=this.market(t)),[a,i]=this.handleMarketTypeAndParams("fetchOrder",o,i),"spot"===a){const t=this.safeString(i,"clientOrderId");t||(s.orderId=e),n=void 0!==t?await this.privatePostSpotV4QueryClientOrder(this.extend(s,i)):await this.privatePostSpotV4QueryOrder(this.extend(s,i))}else if("swap"===a){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");const a=this.safeBool(i,"trailing",!1);let d=this.safeString(i,"orderType");i=this.omit(i,["orderType","trailing"]),a&&(d="trailing"),void 0!==d&&(s.type=d),s.symbol=o.id,s.order_id=e,n=await this.privateGetContractPrivateOrder(this.extend(s,i))}const d=this.safeDict(n,"data",{});return this.parseOrder(d,o)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e);let s;[s,t]=this.handleNetworkCodeAndParams(t);const r={currency:this.getCurrencyIdFromCodeAndNetwork(e,s)},a=await this.privateGetAccountV1DepositAddress(this.extend(r,t)),o=this.safeDict(a,"data",{});return this.parseDepositAddress(o,i)}parseDepositAddress(e,t=void 0){let i=this.safeString(e,"currency"),s=this.safeString2(e,"chain","network");if(i.indexOf("NFT")<0){const e=i.split("-");i=this.safeString(e,0);const t=this.safeString(e,1);void 0!==t&&(s=t)}const r=this.safeString(e,"address");return t=this.safeCurrency(i,t),this.checkAddress(r),{info:e,currency:this.safeString(t,"code"),network:this.networkIdToCode(s),address:r,tag:this.safeString2(e,"address_memo","memo")}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e);let o;[o,r]=this.handleNetworkCodeAndParams(r);const n={currency:this.getCurrencyIdFromCodeAndNetwork(e,o),amount:t,destination:"To Digital Address",address:i};void 0!==s&&(n.address_memo=s);const d=await this.privatePostAccountV1WithdrawApply(this.extend(n,r)),h=this.safeDict(d,"data",{}),c=this.parseTransaction(h,a);return this.extend(c,{code:e,address:i,tag:s})}async fetchTransactionsByType(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets(),void 0===s&&(s=1e3);const a={operation_type:e,N:s};let o;void 0!==t&&(o=this.currency(t),a.currency=o.id),void 0!==i&&(a.startTime=i);const n=this.safeInteger(r,"until");void 0!==n&&(r=this.omit(r,"until"),a.endTime=n);const d=await this.privateGetAccountV2DepositWithdrawHistory(this.extend(a,r)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"records",[]);return this.parseTransactions(c,o,i,s)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetAccountV1DepositWithdrawDetail(this.extend(s,i)),a=this.safeDict(r,"data",{}),o=this.safeDict(a,"record",{});return this.parseTransaction(o)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsByType("deposit",e,t,i,s)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetAccountV1DepositWithdrawDetail(this.extend(s,i)),a=this.safeDict(r,"data",{}),o=this.safeDict(a,"record",{});return this.parseTransaction(o)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsByType("withdraw",e,t,i,s)}parseTransactionStatus(e){return this.safeString({0:"pending",1:"pending",2:"pending",3:"ok",4:"canceled",5:"failed"},e,e)}parseTransaction(e,t=void 0){let i;const s=this.safeString(e,"withdraw_id"),r=this.safeString(e,"deposit_id");let a;void 0!==s&&""!==s?(a="withdraw",i=s):void 0!==r&&""!==r&&(a="deposit",i=r);const o=this.safeNumber(e,"arrival_amount"),n=this.safeInteger(e,"apply_time");let d,h=this.safeString(e,"currency");if(h.indexOf("NFT")<0){const e=h.split("-");h=this.safeString(e,0),d=this.safeString(e,1)}const c=this.safeCurrencyCode(h,t),l=this.parseTransactionStatus(this.safeString(e,"status")),u=this.safeNumber(e,"fee");let f;void 0!==u&&(f={cost:u,currency:c});const p=this.safeString(e,"tx_id"),m=this.safeString(e,"address"),g=this.safeString(e,"address_memo");return{info:e,id:i,currency:c,amount:o,network:this.networkIdToCode(d),address:m,addressFrom:void 0,addressTo:void 0,tag:g,tagFrom:void 0,tagTo:void 0,status:l,type:a,updated:void 0,txid:p,internal:void 0,comment:void 0,timestamp:0!==n?n:void 0,datetime:0!==n?this.iso8601(n):void 0,fee:f}}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o={symbol:r.id,currency:a.id,amount:this.currencyToPrecision(t,i)},n=await this.privatePostSpotV1MarginIsolatedRepay(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.parseMarginLoan(d,a);return this.extend(h,{amount:i,symbol:e})}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o={symbol:r.id,currency:a.id,amount:this.currencyToPrecision(t,i)},n=await this.privatePostSpotV1MarginIsolatedBorrow(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.parseMarginLoan(d,a);return this.extend(h,{amount:i,symbol:e})}parseMarginLoan(e,t=void 0){return{id:this.safeString2(e,"borrow_id","repay_id"),currency:this.safeCurrencyCode(void 0,t),amount:void 0,symbol:void 0,timestamp:void 0,datetime:void 0,info:e}}async fetchIsolatedBorrowRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.privateGetSpotV1MarginIsolatedPairs(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeList(a,"symbols",[]),n=this.safeDict(o,0,[]);return this.parseIsolatedBorrowRate(n,i)}parseIsolatedBorrowRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeDict(e,"base",{}),a=this.safeDict(e,"quote",{}),o=this.safeString(r,"currency"),n=this.safeString(a,"currency");return{symbol:s,base:this.safeCurrencyCode(o),baseRate:this.safeNumber(r,"hourly_interest"),quote:this.safeCurrencyCode(n),quoteRate:this.safeNumber(a,"hourly_interest"),period:36e5,timestamp:void 0,datetime:void 0,info:e}}async fetchIsolatedBorrowRates(e={}){await this.loadMarkets();const t=await this.privateGetSpotV1MarginIsolatedPairs(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"symbols",[]);return this.parseIsolatedBorrowRates(s)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n={amount:this.currencyToPrecision(e,t),currency:o.id},d=this.convertTypeToAccount(i),h=this.convertTypeToAccount(s);if("spot"===i)"margin"===s?(n.side="in",n.symbol=h):"swap"===s&&(n.type="spot_to_contract");else{if("spot"!==s)throw new r.ArgumentsRequired(this.id+" transfer() requires either fromAccount or toAccount to be spot");"margin"===i?(n.side="out",n.symbol=d):"swap"===i&&(n.type="contract_to_spot")}let c;"margin"===i||"margin"===s?c=await this.privatePostSpotV1MarginIsolatedTransfer(this.extend(n,a)):"swap"!==i&&"swap"!==s||(c=await this.privatePostAccountV1TransferContract(this.extend(n,a)));const l=this.safeDict(c,"data",{});return this.extend(this.parseTransfer(l,o),{status:this.parseTransferStatus(this.safeString2(c,"code","message"))})}parseTransferStatus(e){return this.safeString({1e3:"ok",OK:"ok",FINISHED:"ok"},e,e)}parseTransferToAccount(e){return this.safeString({contract_to_spot:"spot",spot_to_contract:"swap"},e,e)}parseTransferFromAccount(e){return this.safeString({contract_to_spot:"swap",spot_to_contract:"spot"},e,e)}parseTransfer(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeInteger(e,"timestamp");return{id:this.safeString(e,"transfer_id"),timestamp:s,datetime:this.iso8601(s),currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amount"),fromAccount:this.parseTransferFromAccount(this.safeString(e,"type")),toAccount:this.parseTransferToAccount(this.safeString(e,"type")),status:this.parseTransferStatus(this.safeString(e,"state"))}}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),void 0===i&&(i=10);const r={page:this.safeInteger(s,"page",1),limit:i};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==t&&(r.time_start=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until"),n=this.safeInteger(s,"time_end",o);s=this.omit(s,["until"]),void 0!==n&&(r.time_end=n);const d=await this.privatePostAccountV1TransferContractList(this.extend(r,s)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"records",[]);return this.parseTransfers(c,a,t,i)}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,a={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchBorrowInterest() requires a symbol argument");await this.loadMarkets();const o=this.market(t),n={symbol:o.id};void 0!==s&&(n.N=s),void 0!==i&&(n.start_time=i);const d=await this.privateGetSpotV1MarginIsolatedBorrowRecord(this.extend(n,a)),h=this.safeDict(d,"data",{}),c=this.safeList(h,"records",[]),l=this.parseBorrowInterests(c,o);return this.filterByCurrencySinceLimit(l,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeInteger(e,"create_time");return{info:e,symbol:this.safeString(t,"symbol"),currency:this.safeCurrencyCode(this.safeString(e,"currency")),interest:this.safeNumber(e,"interest_amount"),interestRate:this.safeNumber(e,"hourly_interest"),amountBorrowed:this.safeNumber(e,"borrow_amount"),marginMode:"isolated",timestamp:s,datetime:this.iso8601(s)}}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s={symbol:i.id},a=await this.publicGetContractPublicOpenInterest(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseOpenInterest(o,i)}parseOpenInterest(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol");return this.safeOpenInterest({symbol:this.safeSymbol(s,t),openInterestAmount:this.safeNumber(e,"open_interest"),openInterestValue:this.safeNumber(e,"open_interest_value"),timestamp:i,datetime:this.iso8601(i),info:e},t)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");let s;[s,i]=this.handleMarginModeAndParams("setLeverage",i),this.checkRequiredArgument("setLeverage",s,"marginMode",["isolated","cross"]),await this.loadMarkets();const a=this.market(t);if(!a.swap)throw new r.BadSymbol(this.id+" setLeverage() supports swap contracts only");const o={symbol:a.id,leverage:e.toString(),open_type:s};return await this.privatePostContractPrivateSubmitLeverage(this.extend(o,i))}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={symbol:i.id},a=await this.publicGetContractPublicFundingRate(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseFundingRate(o,i)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==i&&(o.limit=i);const n=await this.publicGetContractPublicFundingRateHistory(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"list",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i,a,"-","swap"),r=this.safeInteger(t,"funding_time");c.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"funding_rate"),timestamp:r,datetime:this.iso8601(r)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,a.symbol,t,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"timestamp");return{info:e,symbol:this.safeSymbol(i,t),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:s,datetime:this.iso8601(s),fundingRate:this.safeNumber(e,"expected_rate"),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:this.safeNumber(e,"rate_value"),previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.privateGetContractPrivatePosition(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parsePosition(o,i)}async fetchPositions(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==e){s=e.length;const t=this.safeString(e,0);i=this.market(t)}const r={};1===s&&(r.symbol=i.id);const a=await this.privateGetContractPrivatePosition(this.extend(r,t)),o=this.safeList(a,"data",[]),n=[];for(let e=0;e<o.length;e++)n.push(this.parsePosition(o[e]));return e=this.marketSymbols(e),this.filterByArrayPositions(n,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeInteger(e,"timestamp"),o=this.safeInteger(e,"position_type"),n=this.safeString(e,"maintenance_margin"),d=this.safeString(e,"current_value"),h=this.safeString(e,"position_cross"),c=a.Y.stringDiv(n,d),l=a.Y.stringDiv(n,h);return this.safePosition({info:e,id:void 0,symbol:s,timestamp:r,datetime:this.iso8601(r),lastUpdateTimestamp:void 0,hedged:void 0,side:1===o?"long":"short",contracts:this.safeNumber(e,"current_amount"),contractSize:this.safeNumber(t,"contractSize"),entryPrice:this.safeNumber(e,"entry_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:void 0,notional:this.parseNumber(d),leverage:this.safeNumber(e,"leverage"),collateral:this.parseNumber(h),initialMargin:void 0,initialMarginPercentage:void 0,maintenanceMargin:this.parseNumber(n),maintenanceMarginPercentage:this.parseNumber(c),unrealizedPnl:this.safeNumber(e,"unrealized_value"),realizedPnl:this.safeNumber(e,"realized_value"),liquidationPrice:void 0,marginMode:void 0,percentage:void 0,marginRatio:this.parseNumber(l),stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyLiquidations() requires a symbol argument");await this.loadMarkets();const a=this.market(e);if(!a.swap)throw new r.NotSupported(this.id+" fetchMyLiquidations() supports swap markets only");let o={symbol:a.id};void 0!==t&&(o.start_time=t),[o,s]=this.handleUntilOption("end_time",o,s);const n=await this.privateGetContractPrivateOrderHistory(this.extend(o,s)),d=this.safeList(n,"data",[]),h=[];for(let e=0;e<d.length;e++){const t=d[e];"liquidate"===this.safeString(t,"type")&&h.push(t)}return this.parseLiquidations(h,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"update_time"),r=this.safeString(e,"deal_size"),o=this.safeString(t,"contractSize"),n=this.safeString(e,"deal_avg_price"),d=a.Y.stringMul(r,o),h=a.Y.stringMul(d,n);return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:this.parseNumber(r),contractSize:this.parseNumber(o),price:this.parseNumber(n),baseValue:this.parseNumber(d),quoteValue:this.parseNumber(h),timestamp:s,datetime:this.iso8601(s)})}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);if(!d.swap)throw new r.NotSupported(this.id+" editOrder() does not support "+d.type+" markets, only swap markets are supported");const h=this.safeString(n,"stopLossPrice"),c=this.safeString(n,"takeProfitPrice"),l=this.safeStringN(n,["triggerPrice","stopPrice","trigger_price"]),u=this.safeDict(n,"stopLoss",{}),f=this.safeDict(n,"takeProfit",{}),p=this.safeString(u,"triggerPrice"),m=this.safeString(f,"triggerPrice"),g=void 0!==l,v=void 0!==h,y=void 0!==c,w=void 0!==p,b=void 0!==m,k={symbol:d.id},S=this.safeString(n,"clientOrderId");let O;if(void 0!==S&&(n=this.omit(n,"clientOrderId"),k.client_order_id=S),void 0!==e&&(k.order_id=e),n=this.omit(n,["triggerPrice","stopPrice","stopLossPrice","takeProfitPrice","stopLoss","takeProfit"]),(g||v||y)&&(k.price_type=this.safeInteger(n,"price_type",1),void 0!==o&&(k.executive_price=this.priceToPrecision(t,o))),g)k.type=i,k.trigger_price=this.priceToPrecision(t,l),O=await this.privatePostContractPrivateModifyPlanOrder(this.extend(k,n));else if(v||y)k.category=i,k.trigger_price=v?this.priceToPrecision(t,h):this.priceToPrecision(t,c),O=await this.privatePostContractPrivateModifyTpSlOrder(this.extend(k,n));else{if(!w&&!b)throw new r.NotSupported(this.id+" editOrder() only supports trigger, stop loss and take profit orders");w?(k.preset_stop_loss_price_type=this.safeInteger(n,"price_type",1),k.preset_stop_loss_price=this.priceToPrecision(t,p)):(k.preset_take_profit_price_type=this.safeInteger(n,"price_type",1),k.preset_take_profit_price=this.priceToPrecision(t,m)),O=await this.privatePostContractPrivateModifyPresetPlanOrder(this.extend(k,n))}const T=this.safeDict(O,"data",{});return this.parseOrder(T,d)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));let a={};[a,s]=this.handleUntilOption("end_time",a,s);const o=this.fetchTransactionsRequest(0,void 0,t,i,s),n=await this.privateGetContractPrivateTransactionHistory(o),d=this.safeList(n,"data",[]);return this.parseLedger(d,r,t,i)}parseLedgerEntry(e,t=void 0){let i,s=this.safeString(e,"amount");a.Y.stringLe(s,"0")?(i="out",s=a.Y.stringMul("-1",s)):i="in";const r=this.safeString(e,"asset");t=this.safeCurrency(r,t);const o=this.safeInteger(e,"time"),n=this.safeString(e,"type");return this.safeLedgerEntry({info:e,id:this.safeString(e,"tran_id"),direction:i,account:void 0,referenceAccount:void 0,referenceId:this.safeString(e,"tradeId"),type:this.parseLedgerEntryType(n),currency:t.code,amount:this.parseNumber(s),timestamp:o,datetime:this.iso8601(o),before:void 0,after:void 0,status:void 0,fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({"Commission Fee":"fee","Funding Fee":"fee","Realized PNL":"trade",Transfer:"transfer","Liquidation Clearance":"settlement"},e,e)}fetchTransactionsRequest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){let a,o={};return void 0!==e&&(o.flow_type=e),void 0!==t&&(a=this.market(t),o.symbol=a.id),void 0!==i&&(o.start_time=i),void 0!==s&&(o.page_size=s),[o,r]=this.handleUntilOption("end_time",o,r),this.extend(o,r)}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));let a={};[a,s]=this.handleUntilOption("end_time",a,s);const o=this.fetchTransactionsRequest(3,e,t,i,s),n=await this.privateGetContractPrivateTransactionHistory(o),d=this.safeList(n,"data",[]);return this.parseFundingHistories(d,r,t,i)}parseFundingHistory(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"asset"),r=this.safeInteger(e,"time");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),code:this.safeCurrencyCode(s),timestamp:r,datetime:this.iso8601(r),id:this.safeString(e,"tran_id"),amount:this.safeNumber(e,"amount")}}parseFundingHistories(e,t=void 0,i=void 0,s=void 0){const r=[];for(let i=0;i<e.length;i++){const s=e[i];r.push(this.parseFundingHistory(s,t))}const a=this.sortBy(r,"timestamp");return this.filterBySinceLimit(a,i,s)}async fetchWithdrawAddresses(e,t=void 0,i=void 0,s={}){let r;if(await this.loadMarkets(),void 0!==e){r=[e=this.currency(e).code]}const a=await this.privateGetAccountV1WithdrawAddressList(s),o=this.safeDict(a,"data",{}),n=this.safeList(o,"list",[]),d=this.parseDepositAddresses(n,r,!1),h=[];for(let e=0;e<d.length;e++){const s=d[e],r=void 0===t||s.note===t,a=void 0===i||s.network===i;r&&a&&h.push(s)}return h}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=e.split("/"),d=this.safeString(o,0,"spot"),h="spot"===d||"account"===d?"spot":"swap";let c=this.implodeHostname(this.urls.api[h])+"/"+this.implodeParams(e,s);const l=this.omit(s,this.extractParams(e));let u="";const f="GET"===i||"DELETE"===i;if(f&&Object.keys(l).length&&(u=this.urlencode(l),c+="?"+u),"private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.safeString(this.options,"brokerId","CCXTxBitmart000");r={"X-BM-KEY":this.apiKey,"X-BM-TIMESTAMP":e,"X-BM-BROKER-ID":t,"Content-Type":"application/json"},f||(u=a=this.json(l));const i=e+"#"+this.uid+"#"+u,s=this.hmac(this.encode(i),this.encode(this.secret),n.s);r["X-BM-SIGN"]=s}return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeStringLower(n,"message"),l=void 0!==c&&"ok"!==c&&"success"!==c,u=this.safeString(n,"code");if(void 0!==u&&"1000"!==u||l){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),this.throwExactlyMatchedException(this.exceptions.exact,u,e),this.throwBroadlyMatchedException(this.exceptions.broad,u,e),new r.ExchangeError(e)}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitmex",name:"BitMEX",countries:["SC"],version:"v1",userAgent:void 0,rateLimit:100,certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!0,option:!1,addMargin:void 0,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,createOrder:!0,createReduceOnlyOrder:!0,createStopOrder:!0,createTrailingAmountOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDepositsWithdrawals:"emulated",fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:"emulated",fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:"emulated",fetchLeverages:!0,fetchLeverageTiers:!1,fetchLiquidations:!0,fetchMarginAdjustmentHistory:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositions:!0,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,reduceMargin:void 0,sandbox:!0,setLeverage:!0,setMargin:void 0,setMarginMode:!0,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","1h":"1h","1d":"1d"},urls:{test:{public:"https://testnet.bitmex.com",private:"https://testnet.bitmex.com"},logo:"https://github.com/user-attachments/assets/c78425ab-78d5-49d6-bd14-db7734798f04",api:{public:"https://www.bitmex.com",private:"https://www.bitmex.com"},www:"https://www.bitmex.com",doc:["https://www.bitmex.com/app/apiOverview","https://github.com/BitMEX/api-connectors/tree/master/official-http"],fees:"https://www.bitmex.com/app/fees",referral:{url:"https://www.bitmex.com/app/register/NZTR1q",discount:.1}},api:{public:{get:{announcement:5,"announcement/urgent":5,chat:5,"chat/channels":5,"chat/connected":5,"chat/pinned":5,funding:5,guild:5,instrument:5,"instrument/active":5,"instrument/activeAndIndices":5,"instrument/activeIntervals":5,"instrument/compositeIndex":5,"instrument/indices":5,"instrument/usdVolume":5,insurance:5,leaderboard:5,liquidation:5,"orderBook/L2":5,"porl/nonce":5,quote:5,"quote/bucketed":5,schema:5,"schema/websocketHelp":5,settlement:5,stats:5,"stats/history":5,"stats/historyUSD":5,trade:5,"trade/bucketed":5,"wallet/assets":5,"wallet/networks":5}},private:{get:{address:5,apiKey:5,execution:5,"execution/tradeHistory":5,globalNotification:5,"leaderboard/name":5,order:5,"porl/snapshots":5,position:5,user:5,"user/affiliateStatus":5,"user/checkReferralCode":5,"user/commission":5,"user/csa":5,"user/depositAddress":5,"user/executionHistory":5,"user/getWalletTransferAccounts":5,"user/margin":5,"user/quoteFillRatio":5,"user/quoteValueRatio":5,"user/staking":5,"user/staking/instruments":5,"user/staking/tiers":5,"user/tradingVolume":5,"user/unstakingRequests":5,"user/wallet":5,"user/walletHistory":5,"user/walletSummary":5,userAffiliates:5,userEvent:5},post:{address:5,chat:5,guild:5,"guild/archive":5,"guild/join":5,"guild/kick":5,"guild/leave":5,"guild/sharesTrades":5,order:1,"order/cancelAllAfter":5,"order/closePosition":5,"position/isolate":1,"position/leverage":1,"position/riskLimit":5,"position/transferMargin":1,"user/addSubaccount":5,"user/cancelWithdrawal":5,"user/communicationToken":5,"user/confirmEmail":5,"user/confirmWithdrawal":5,"user/logout":5,"user/preferences":5,"user/requestWithdrawal":5,"user/unstakingRequests":5,"user/updateSubaccount":5,"user/walletTransfer":5},put:{guild:5,order:1},delete:{order:1,"order/all":1,"user/unstakingRequests":5}}},exceptions:{exact:{"Invalid API Key.":a.AuthenticationError,"This key is disabled.":a.PermissionDenied,"Access Denied":a.PermissionDenied,"Duplicate clOrdID":a.InvalidOrder,"orderQty is invalid":a.InvalidOrder,"Invalid price":a.InvalidOrder,"Invalid stopPx for ordType":a.InvalidOrder,"Account is restricted":a.PermissionDenied},broad:{"Signature not valid":a.AuthenticationError,overloaded:a.ExchangeNotAvailable,"Account has insufficient Available Balance":a.InsufficientFunds,"Service unavailable":a.ExchangeNotAvailable,"Server Error":a.ExchangeError,"Unable to cancel order due to existing state":a.InvalidOrder,"We require all new traders to verify":a.PermissionDenied}},precisionMode:r.kb,options:{"api-expires":5,fetchOHLCVOpenTimestamp:!0,oldPrecision:!1,networks:{BTC:"btc",ERC20:"eth",BEP20:"bsc",TRC20:"tron",AVAXC:"avax",NEAR:"near",XTZ:"xtz",DOT:"dot",SOL:"sol",ADA:"ada"}},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0},triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,marketBuyRequiresPrice:!1,marketBuyByCost:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:void 0,untilDays:1e6,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:500,daysBack:void 0,untilDays:1e6,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:500,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e6,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e4}},spot:{extends:"default",createOrder:{triggerPriceType:{index:!1}}},derivatives:{extends:"default",createOrder:{triggerPriceType:{index:!0}}},swap:{linear:{extends:"derivatives"},inverse:{extends:"derivatives"}},future:{linear:{extends:"derivatives"},inverse:{extends:"derivatives"}}},commonCurrencies:{USDt:"USDT",XBt:"BTC",XBT:"BTC",Gwei:"ETH",GWEI:"ETH",LAMP:"SOL",LAMp:"SOL"}})}async fetchCurrencies(e={}){const t=await this.publicGetWalletAssets(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),n=this.safeString(s,"currency"),d=this.safeString(s,"name"),h=this.safeValue(s,"networks",[]);let c=!1,l=!1;const u={},f=this.safeString(s,"scale"),p=this.parsePrecision(f),m=this.parseNumber(p);for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"asset"),s=this.networkIdToCode(i),r=this.safeString(t,"withdrawalFee"),a=this.parseNumber(o.Y.stringMul(r,p)),n=this.safeBool(t,"depositEnabled",!1),d=this.safeBool(t,"withdrawalEnabled",!1),f=n&&d;n&&(c=!0),d&&(l=!0),u[s]={info:t,id:i,network:s,active:f,deposit:n,withdraw:d,fee:a,precision:void 0,limits:{withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}}}}const g=this.safeValue(s,"enabled")||c||l,v=this.safeString(s,"minWithdrawalAmount"),y=this.parseNumber(o.Y.stringMul(v,p)),w=this.safeString(s,"maxWithdrawalAmount"),b=this.parseNumber(o.Y.stringMul(w,p)),k=this.safeString(s,"minDepositAmount"),S=this.parseNumber(o.Y.stringMul(k,p));i[a]={id:n,code:a,info:s,name:d,active:g,deposit:c,withdraw:l,fee:void 0,precision:m,limits:{amount:{min:void 0,max:void 0},withdraw:{min:y,max:b},deposit:{min:S,max:void 0}},networks:u}}return i}convertFromRealAmount(e,t){const i=this.currency(e),s=this.safeString(i,"precision"),r=this.numberToString(t),a=o.Y.stringDiv(r,s);return this.parseNumber(a)}convertToRealAmount(e,t){if(void 0===e)return t;if(void 0===t)return;const i=this.currency(e),s=this.safeString(i,"precision");return o.Y.stringMul(t,s)}amountToPrecision(e,t){e=this.safeSymbol(e);const i=this.market(e),s=this.safeValue(this.options,"oldPrecision");return i.spot&&!s&&(t=this.convertFromRealAmount(i.base,t)),super.amountToPrecision(e,t)}convertFromRawQuantity(e,t,i="base"){if(this.safeValue(this.options,"oldPrecision"))return this.parseNumber(t);e=this.safeSymbol(e);if(!this.inArray(e,this.symbols))return this.parseNumber(t);const s=this.market(e);return s.spot?this.parseNumber(this.convertToRealAmount(s[i],t)):this.parseNumber(t)}convertFromRawCost(e,t){return this.convertFromRawQuantity(e,t,"quote")}async fetchMarkets(e={}){const t=await this.publicGetInstrumentActive(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"symbol");let i=this.safeString(e,"underlying"),s=this.safeString(e,"quoteCurrency");const r=this.safeString(e,"settlCurrency"),a=this.safeCurrencyCode(r),n=this.safeString(e,"typ");let d,h=!1,c=!1,l=!1;"FFWCSX"===n?(d="swap",h=!0):"IFXXXP"===n?(d="spot",c=!0):"FFCCSX"===n?(d="future",l=!0):"FFICSX"===n&&(s=i,i=this.safeString(e,"rootSymbol"),d="future",l=!0);const u=this.safeCurrencyCode(i),f=this.safeCurrencyCode(s),p=h||l;let m;const g=this.safeValue(e,"isInverse"),v=this.safeValue(e,"isQuanto"),y=p?!g&&!v:void 0,w="Unlisted"!==this.safeString(e,"state");let b,k,S;if(c)S=u+"/"+f;else if(p){if(S=u+"/"+f+":"+a,y){const t=this.safeString2(e,"underlyingToPositionMultiplier","underlyingToSettleMultiplier");m=this.parseNumber(o.Y.stringDiv("1",t))}else{const t=o.Y.stringAbs(this.safeString(e,"multiplier"));m=this.parseNumber(t)}l&&(k=this.safeString(e,"expiry"),b=this.parse8601(k),S=S+"-"+this.yymmdd(b))}else S=t;const O=this.safeString2(e,"positionCurrency","underlying"),T=this.safeCurrencyCode(O)===f,P=this.safeNumber(e,"maxOrderQty"),I=this.safeString(e,"initMargin","1"),M=this.parseNumber(o.Y.stringDiv("1",I));return{id:t,symbol:S,base:u,quote:f,settle:a,baseId:i,quoteId:s,settleId:r,type:d,spot:c,margin:!1,swap:h,future:l,option:!1,active:w,contract:p,linear:y,inverse:g,quanto:v,taker:this.safeNumber(e,"takerFee"),maker:this.safeNumber(e,"makerFee"),contractSize:m,expiry:b,expiryDatetime:k,strike:this.safeNumber(e,"optionStrikePrice"),optionType:void 0,precision:{amount:this.safeNumber(e,"lotSize"),price:this.safeNumber(e,"tickSize")},limits:{leverage:{min:p?this.parseNumber("1"):void 0,max:p?M:void 0},amount:{min:void 0,max:T?void 0:P},price:{min:void 0,max:this.safeNumber(e,"maxPrice")},cost:{min:void 0,max:T?P:void 0}},created:this.parse8601(this.safeString(e,"listing")),info:e}}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account(),n=this.safeString(s,"availableMargin"),d=this.safeString(s,"marginBalance");o.free=this.convertToRealAmount(a,n),o.total=this.convertToRealAmount(a,d),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUserMargin(this.extend({currency:"all"},e));return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(s.depth=t);const r=await this.publicGetOrderBookL2(this.extend(s,i)),a={symbol:e,bids:[],asks:[],timestamp:void 0,datetime:void 0,nonce:void 0};for(let t=0;t<r.length;t++){const i=r[t],s="Sell"===i.side?"asks":"bids",o=this.convertFromRawQuantity(e,this.safeString(i,"size")),n=this.safeNumber(i,"price");if(void 0!==n){a[s].push([n,o])}}return a.bids=this.sortBy(a.bids,0,!0),a.asks=this.sortBy(a.asks,0),a}async fetchOrder(e,t=void 0,i={}){const s={filter:{orderID:e}},r=await this.fetchOrders(t,void 0,void 0,this.deepExtend(s,i));if(1===r.length)return r[0];throw new a.OrderNotFound(this.id+": The order "+e+" not found.")}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchOrders",e,t,i,s,100);let o={};void 0!==e&&(r=this.market(e),o.symbol=r.id),void 0!==t&&(o.startTime=this.iso8601(t)),void 0!==i&&(o.count=i);const n=this.safeInteger2(s,"until","endTime");void 0!==n&&(s=this.omit(s,["until"]),o.endTime=this.iso8601(n)),o=this.deepExtend(o,s),"filter"in o&&(o.filter=this.json(o.filter));const d=await this.privateGetOrder(o);return this.parseOrders(d,r,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.deepExtend({filter:{open:!0}},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){const r=await this.fetchOrders(e,t,i,s);return this.filterByArray(r,"status",["closed","canceled"],!1)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s,100);let o={};void 0!==e&&(r=this.market(e),o.symbol=r.id),void 0!==t&&(o.startTime=this.iso8601(t)),void 0!==i&&(o.count=Math.min(500,i));const n=this.safeInteger2(s,"until","endTime");void 0!==n&&(s=this.omit(s,["until"]),o.endTime=this.iso8601(n)),o=this.deepExtend(o,s),"filter"in o&&(o.filter=this.json(o.filter));const d=await this.privateGetExecutionTradeHistory(o);return this.parseTrades(d,r,t,i)}parseLedgerEntryType(e){return this.safeString({Withdrawal:"transaction",RealisedPNL:"margin",UnrealisedPNL:"margin",Deposit:"transaction",Transfer:"transfer",AffiliatePayout:"referral",SpotTrade:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"transactID"),s=this.safeString(e,"account"),r=this.safeString(e,"tx"),a=this.parseLedgerEntryType(this.safeString(e,"transactType")),n=this.safeString(e,"currency"),d=this.safeCurrencyCode(n,t);t=this.safeCurrency(n,t);const h=this.safeString(e,"amount");let c,l=this.convertToRealAmount(d,h),u=this.parse8601(this.safeString(e,"transactTime"));void 0===u&&(u=0);let f=this.safeString(e,"fee");void 0!==f&&(f=this.convertToRealAmount(d,f),c={cost:this.parseNumber(f),currency:d});let p=this.safeString(e,"walletBalance");void 0!==p&&(p=this.convertToRealAmount(d,p));const m=this.parseNumber(o.Y.stringSub(this.numberToString(p),this.numberToString(l)));let g;o.Y.stringLt(h,"0")?(g="out",l=this.convertToRealAmount(d,o.Y.stringAbs(h))):g="in";const v=this.parseTransactionStatus(this.safeString(e,"transactStatus"));return this.safeLedgerEntry({info:e,id:i,timestamp:u,datetime:this.iso8601(u),direction:g,account:s,referenceId:r,referenceAccount:undefined,type:a,currency:d,amount:this.parseNumber(l),before:m,after:this.parseNumber(p),status:v,fee:c},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==i&&(r.count=i),void 0!==e&&(a=this.currency(e),r.currency=a.id);const o=await this.privateGetUserWalletHistory(this.extend(r,s));return this.parseLedger(o,a,t,i)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={currency:"all"};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.count=i);const o=await this.privateGetUserWalletHistory(this.extend(r,s)),n=this.filterByArray(o,"transactType",["Withdrawal","Deposit"],!1);return this.parseTransactions(n,a,t,i)}parseTransactionStatus(e){return this.safeString({Confirmed:"pending",Canceled:"canceled",Completed:"ok",Pending:"pending"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"currency");t=this.safeCurrency(i,t);const s=this.parse8601(this.safeString(e,"transactTime")),r=this.parse8601(this.safeString(e,"timestamp")),a=this.safeStringLower(e,"transactType");let n,d,h;"withdrawal"===a?(n=this.safeString(e,"address"),d=this.safeString(e,"tx"),h=n):"deposit"===a&&(h=this.safeString(e,"address"),d=this.safeString(e,"tx"));const c=this.safeString(e,"amount"),l=o.Y.stringAbs(c),u=this.convertToRealAmount(t.code,l),f=this.safeString(e,"fee"),p=this.convertToRealAmount(t.code,f);let m=this.safeString(e,"transactStatus");return void 0!==m&&(m=this.parseTransactionStatus(m)),{info:e,id:this.safeString(e,"transactID"),txid:this.safeString(e,"tx"),type:a,currency:t.code,network:this.networkIdToCode(this.safeString(e,"network"),t.code),amount:this.parseNumber(u),status:m,timestamp:s,datetime:this.iso8601(s),address:n,addressFrom:d,addressTo:h,tag:void 0,tagFrom:void 0,tagTo:void 0,updated:r,internal:void 0,comment:void 0,fee:{currency:t.code,cost:this.parseNumber(p),rate:void 0}}}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetInstrument(this.extend(s,t)),o=this.safeValue(r,0);if(void 0===o)throw new a.BadSymbol(this.id+" fetchTicker() symbol "+e+" not found");return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetInstrumentActiveAndIndices(t),s={};for(let e=0;e<i.length;e++){const t=this.parseTicker(i[e]),r=this.safeString(t,"symbol");void 0!==r&&(s[r]=t)}return this.filterByArrayTickers(s,"symbol",e)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.parse8601(this.safeString(e,"timestamp")),a=this.safeString(e,"prevPrice24h"),o=this.safeString(e,"lastPrice");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"highPrice"),low:this.safeString(e,"lowPrice"),bid:this.safeString(e,"bidPrice"),bidVolume:void 0,ask:this.safeString(e,"askPrice"),askVolume:void 0,vwap:this.safeString(e,"vwap"),open:a,close:o,last:o,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"homeNotional24h"),quoteVolume:this.safeString(e,"foreignNotional24h"),markPrice:this.safeString(e,"markPrice"),info:e},t)}parseOHLCV(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.convertFromRawQuantity(t.symbol,this.safeString(e,"volume"));return[this.parse8601(this.safeString(e,"timestamp")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),s]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r);const o=this.market(e),n={symbol:o.id,binSize:this.safeString(this.timeframes,t,t),partial:!0};void 0!==s&&(n.count=s);const d=this.safeInteger(r,"until");void 0!==d&&(r=this.omit(r,["until"]),n.endTime=this.iso8601(d));const h=1e3*this.parseTimeframe(t),c=this.safeBool(this.options,"fetchOHLCVOpenTimestamp",!0);if(void 0!==i){let e=i;c&&(e=this.sum(e,h));const t=this.iso8601(e);n.startTime=t}else n.reverse=!0;const l=await this.publicGetTradeBucketed(this.extend(n,r)),u=this.parseOHLCVs(l,o,t,i,s);if(c)for(let e=0;e<u.length;e++)u[e][0]=u[e][0]-h;return u}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.parse8601(this.safeString(e,"timestamp")),a=this.safeString2(e,"avgPx","price"),n=this.convertFromRawQuantity(s,this.safeString2(e,"size","lastQty")),d=this.numberToString(this.convertFromRawCost(s,this.safeString(e,"execCost"))),h=this.safeString(e,"trdMatchID"),c=this.safeString(e,"orderID"),l=this.safeStringLower(e,"side");let u;const f=this.numberToString(this.convertFromRawCost(s,this.safeString(e,"execComm")));if(void 0!==f){const t=this.safeString2(e,"settlCurrency","currency");u={cost:f,currency:this.safeCurrencyCode(t),rate:this.safeString(e,"commission")}}const p=this.safeString(e,"execType");let m;void 0!==f&&"Trade"===p&&(m=o.Y.stringLt(f,"0")?"maker":"taker");const g=this.safeStringLower(e,"ordType");return this.safeTrade({info:e,timestamp:r,datetime:this.iso8601(r),symbol:s,id:h,order:c,type:g,takerOrMaker:m,side:l,price:a,cost:o.Y.stringAbs(d),amount:n,fee:u},t)}parseOrderStatus(e){return this.safeString({New:"open",PartiallyFilled:"open",Filled:"closed",DoneForDay:"open",Canceled:"canceled",PendingCancel:"open",PendingNew:"open",Rejected:"rejected",Expired:"expired",Stopped:"open",Untriggered:"open",Triggered:"open"},e,e)}parseTimeInForce(e){return this.safeString({Day:"Day",GoodTillCancel:"GTC",ImmediateOrCancel:"IOC",FillOrKill:"FOK"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString(e,"orderQty");let a,n,d=!1;if(void 0===i){d="inverse"===this.safeString(this.options,"defaultSubType","linear")}else d=this.safeBool(t,"inverse",!1);d?a=this.convertFromRawQuantity(s,r):n=this.convertFromRawQuantity(s,r);const h=this.safeString(e,"avgPx");let c;const l=this.numberToString(this.convertFromRawQuantity(s,this.safeString(e,"cumQty")));c=d?o.Y.stringDiv(l,h):l;const u=this.safeString(e,"execInst");let f;void 0!==u&&(f="ParticipateDoNotInitiate"===u);const p=this.parse8601(this.safeString(e,"timestamp")),m=this.safeNumber(e,"stopPx"),g=this.safeString(e,"leavesQty");return this.safeOrder({info:e,id:this.safeString(e,"orderID"),clientOrderId:this.safeString(e,"clOrdID"),timestamp:p,datetime:this.iso8601(p),lastTradeTimestamp:this.parse8601(this.safeString(e,"transactTime")),symbol:s,type:this.safeStringLower(e,"ordType"),timeInForce:this.parseTimeInForce(this.safeString(e,"timeInForce")),postOnly:f,side:this.safeStringLower(e,"side"),price:this.safeString(e,"price"),triggerPrice:m,amount:n,cost:a,average:h,filled:c,remaining:this.convertFromRawQuantity(s,g),status:this.parseOrderStatus(this.safeString(e,"ordStatus")),fee:void 0,trades:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);const a=this.market(e),o={symbol:a.id};void 0!==t?o.startTime=this.iso8601(t):o.reverse=!0,void 0!==i&&(o.count=Math.min(i,1e3));const n=this.safeInteger2(s,"until","endTime");void 0!==n&&(s=this.omit(s,["until"]),o.endTime=this.iso8601(n));const d=await this.publicGetTrade(this.extend(o,s));return this.parseTrades(d,a,t,i)}async createOrder(e,t,i,s,r=void 0,o={}){await this.loadMarkets();const n=this.market(e);let d=this.capitalize(t);if(void 0!==this.safeValue(o,"reduceOnly")&&!n.swap&&!n.future)throw new a.InvalidOrder(this.id+" createOrder() does not support reduceOnly for "+n.type+" orders, reduceOnly orders are supported for swap and future markets only");const h=this.safeString(this.options,"brokerId","CCXT"),c=this.parseToInt(this.amountToPrecision(e,s)),l={symbol:n.id,side:this.capitalize(i),orderQty:c,ordType:d,text:h},u=this.safeNumberN(o,["triggerPrice","stopPx","stopPrice"]);let f=this.safeString2(o,"trailingAmount","pegOffsetValue");const p=void 0!==f;if(void 0!==u||p){const s=this.safeString(o,"triggerDirection"),r="above"===s;if("limit"!==t&&"market"!==t||this.checkRequiredArgument("createOrder",s,"triggerDirection",["above","below"]),"limit"===t?d="buy"===i?r?"StopLimit":"LimitIfTouched":r?"LimitIfTouched":"StopLimit":"market"===t&&(d="buy"===i?r?"Stop":"MarketIfTouched":r?"MarketIfTouched":"Stop"),p){("sell"===i&&("Stop"===d||"StopLimit"===d)||"buy"===i&&("MarketIfTouched"===d||"LimitIfTouched"===d))&&(f="-"+f),l.pegOffsetValue=this.parseToNumeric(f),l.pegPriceType="TrailingStopPeg"}else{if(void 0===u)throw new a.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice parameter for the "+d+" order type");l.stopPx=this.parseToNumeric(this.priceToPrecision(e,u))}l.ordType=d,o=this.omit(o,["triggerPrice","stopPrice","stopPx","triggerDirection","trailingAmount"])}"Limit"!==d&&"StopLimit"!==d&&"LimitIfTouched"!==d||(l.price=this.parseToNumeric(this.priceToPrecision(e,r)));const m=this.safeString2(o,"clOrdID","clientOrderId");void 0!==m&&(l.clOrdID=m,o=this.omit(o,["clOrdID","clientOrderId"]));const g=await this.privatePostOrder(this.extend(l,o));return this.parseOrder(g,n)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n={};let d=this.safeString2(o,"trailingAmount","pegOffsetValue");if(void 0!==d){const e=this.safeString(o,"triggerDirection"),t="above"===e;let r;"limit"!==i&&"market"!==i||this.checkRequiredArgument("createOrder",e,"triggerDirection",["above","below"]),"limit"===i?r="buy"===s?t?"StopLimit":"LimitIfTouched":t?"LimitIfTouched":"StopLimit":"market"===i&&(r="buy"===s?t?"Stop":"MarketIfTouched":t?"MarketIfTouched":"Stop");("sell"===s&&("Stop"===r||"StopLimit"===r)||"buy"===s&&("MarketIfTouched"===r||"LimitIfTouched"===r))&&(d="-"+d),n.pegOffsetValue=this.parseToNumeric(d),o=this.omit(o,["triggerDirection","trailingAmount"])}const h=this.safeString2(o,"origClOrdID","clientOrderId");if(void 0!==h){n.origClOrdID=h;const e=this.safeString(o,"clOrdID","clientOrderId");void 0!==e&&(n.clOrdID=e),o=this.omit(o,["origClOrdID","clOrdID","clientOrderId"])}else n.orderID=e;if(void 0!==r){const e=this.parseToInt(this.amountToPrecision(t,r));n.orderQty=e}void 0!==a&&(n.price=a);const c=this.safeString(this.options,"brokerId","CCXT");n.text=c;const l=await this.privatePutOrder(this.extend(n,o));return this.parseOrder(l)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue2(i,"clOrdID","clientOrderId"),r={};void 0===s?r.orderID=e:(r.clOrdID=s,i=this.omit(i,["clOrdID","clientOrderId"]));const o=await this.privateDeleteOrder(this.extend(r,i)),n=this.safeValue(o,0,{}),d=this.safeString(n,"error");if(void 0!==d&&d.indexOf("Unable to cancel order due to existing state")>=0)throw new a.OrderNotFound(this.id+" cancelOrder() failed: "+d);return this.parseOrder(n)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue2(i,"clOrdID","clientOrderId"),r={};void 0===s?r.orderID=e:(r.clOrdID=s,i=this.omit(i,["clOrdID","clientOrderId"]));const a=await this.privateDeleteOrder(this.extend(r,i));return this.parseOrders(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;void 0!==e&&(s=this.market(e),i.symbol=s.id);const r=await this.privateDeleteOrderAll(this.extend(i,t));return this.parseOrders(r,s)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={timeout:e>0?this.parseToInt(e/1e3):0};return await this.privatePostOrderCancelAllAfter(this.extend(i,t))}async fetchLeverages(e=void 0,t={}){await this.loadMarkets();const i=await this.fetchPositions(e,t);return this.parseLeverages(i,e,"symbol")}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"marginMode"),longLeverage:this.safeInteger(e,"leverage"),shortLeverage:this.safeInteger(e,"leverage")}}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetPosition(t),s=this.parsePositions(i,e);return this.filterByArrayPositions(s,"symbol",e,!1)}parsePosition(e,t=void 0){const i=(t=this.safeMarket(this.safeString(e,"symbol"),t)).symbol,s=this.safeString(e,"timestamp"),r=!0===this.safeValue(e,"crossMargin")?"cross":"isolated",a=o.Y.stringAbs(this.safeString2(e,"foreignNotional","homeNotional")),n=this.safeString(t,"settle"),d=this.convertToRealAmount(n,this.safeString(e,"maintMargin")),h=this.convertToRealAmount(n,this.safeString(e,"unrealisedPnl")),c=this.parseNumber(o.Y.stringAbs(this.safeString(e,"currentQty"))),l=this.safeNumber(t,"contractSize");let u;const f=this.safeString(e,"homeNotional");return void 0!==f&&(u="-"===f[0]?"short":"long"),this.safePosition({info:e,id:this.safeString(e,"account"),symbol:i,timestamp:this.parse8601(s),datetime:s,lastUpdateTimestamp:void 0,hedged:void 0,side:u,contracts:c,contractSize:l,entryPrice:this.safeNumber(e,"avgEntryPrice"),markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,notional:this.parseNumber(a),leverage:this.safeNumber(e,"leverage"),collateral:void 0,initialMargin:this.safeNumber(e,"initMargin"),initialMarginPercentage:this.safeNumber(e,"initMarginReq"),maintenanceMargin:d,maintenanceMarginPercentage:this.safeNumber(e,"maintMarginReq"),unrealizedPnl:h,liquidationPrice:this.safeNumber(e,"liquidationPrice"),marginMode:r,marginRatio:void 0,percentage:this.safeNumber(e,"unrealisedPnlPcnt"),stopLossPrice:void 0,takeProfitPrice:void 0})}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o=this.convertFromRealAmount(e,t);let n;[n,r]=this.handleNetworkCodeAndParams(r);const h={currency:a.id,amount:o,address:i,network:this.networkCodeToId(n,a.code)};void 0!==this.twofa&&(h.otpToken=(0,d.O)(this.twofa));const c=await this.privatePostUserRequestWithdrawal(this.extend(h,r));return this.parseTransaction(c,a)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetInstrumentActiveAndIndices(t),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeMarket(r);this.safeBool(a,"swap",!1)&&s.push(t)}e=this.marketSymbols(e);const r=this.parseFundingRates(s);return this.filterByArray(r,"symbol",e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"timestamp"),s=this.safeString(e,"symbol"),r=this.safeString(e,"fundingTimestamp");return{info:e,symbol:this.safeSymbol(s,t),markPrice:this.safeNumber(e,"markPrice"),indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:this.safeNumber(e,"indicativeSettlePrice"),timestamp:this.parse8601(i),datetime:i,fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:this.parse8601(r),fundingDatetime:r,nextFundingRate:this.safeNumber(e,"indicativeFundingRate"),nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;if(e in this.currencies){const t=this.currency(e);r.symbol=t.id}else if(void 0!==e){const t=e.split(":"),i=["nearest","daily","weekly","monthly","quarterly","biquarterly","perpetual"];if(t.length>1&&this.inArray(t[1],i)){e=this.currency(t[0]).id+":"+t[1],r.symbol=e}else a=this.market(e),r.symbol=a.id}void 0!==t&&(r.startTime=this.iso8601(t)),void 0!==i&&(r.count=i);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(r.endTime=this.iso8601(o)),void 0===t&&void 0===o&&(r.reverse=!0);const n=await this.publicGetFunding(this.extend(r,s));return this.parseFundingRateHistories(n,a,t,i)}parseFundingRateHistory(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"timestamp");return{info:e,symbol:this.safeSymbol(i,t),fundingRate:this.safeNumber(e,"fundingRate"),timestamp:this.parse8601(s),datetime:s}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<.01||e>100)throw new a.BadRequest(this.id+" leverage should be between 0.01 and 100");await this.loadMarkets();const s=this.market(t);if("swap"!==s.type&&"future"!==s.type)throw new a.BadSymbol(this.id+" setLeverage() supports future and swap contracts only");const r={symbol:s.id,leverage:e};return await this.privatePostPositionLeverage(this.extend(r,i))}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("isolated"!==(e=e.toLowerCase())&&"cross"!==e)throw new a.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");await this.loadMarkets();const s=this.market(t);if("swap"!==s.type&&"future"!==s.type)throw new a.BadSymbol(this.id+" setMarginMode() supports swap and future contracts only");const r="cross"!==e,o={symbol:s.id,enabled:r};return await this.privatePostPositionIsolate(this.extend(o,i))}async fetchDepositAddress(e,t={}){let i;if(await this.loadMarkets(),[i,t]=this.handleNetworkCodeAndParams(t),void 0===i)throw new a.ArgumentsRequired(this.id+' fetchDepositAddress requires params["network"]');const s=this.currency(e);t=this.omit(t,"network");const r={currency:s.id,network:this.networkCodeToId(i,s.code)},o=await this.privateGetUserDepositAddress(this.extend(r,t));return{info:o,currency:e,network:i,address:o.replace('"',"").replace('"',""),tag:void 0}}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"networks",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};if(0!==s){const a=this.safeString(e,"scale"),n=this.parsePrecision(a);for(let e=0;e<s;e++){const a=i[e],d=this.safeString(a,"asset"),h=this.safeString(t,"code"),c=this.networkIdToCode(d,h),l=this.safeString(a,"withdrawalFee"),u=this.parseNumber(o.Y.stringMul(l,n));r.networks[c]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:u,percentage:!1}},1===s&&(r.withdraw.fee=u,r.withdraw.percentage=!1)}}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetWalletAssets(t);return this.parseDepositWithdrawFees(i,e,"asset")}calculateRateLimiterCost(e,t,i,s,r={}){const a=this.checkRequiredCredentials(!1),o=this.safeValue(r,"cost",1);return 1!==o?a?o:20:o}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLiquidations","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchLiquidations",e,t,i,s);const a=this.market(e);let o={symbol:a.id};void 0!==t&&(o.startTime=t),void 0!==i&&(o.count=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.publicGetLiquidation(this.extend(o,s));return this.parseLiquidations(n,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol");return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:void 0,contractSize:this.safeNumber(t,"contractSize"),price:this.safeNumber(e,"price"),baseValue:void 0,quoteValue:void 0,timestamp:void 0,datetime:void 0})}handleErrors(e,t,i,s,r,o,n,d,h){if(void 0!==n){if(429===e)throw new a.DDoSProtection(this.id+" "+o);if(e>=400){const t=this.safeValue(n,"error",{}),i=this.safeString(t,"message"),s=this.id+" "+o;if(this.throwExactlyMatchedException(this.exceptions.exact,i,s),this.throwBroadlyMatchedException(this.exceptions.broad,i,s),400===e)throw new a.BadRequest(s);throw new a.ExchangeError(s)}}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/api/"+this.version+"/"+e;if("GET"===i)Object.keys(s).length&&(o+="?"+this.urlencode(s));else{const e=this.safeString(s,"_format");void 0!==e&&(o+="?"+this.urlencode({_format:e}),s=this.omit(s,"_format"))}const d=this.urls.api[t]+o,h=this.checkRequiredCredentials(!1);if("private"===t||"public"===t&&h){this.checkRequiredCredentials();let e=i+o,t=this.safeInteger(this.options,"api-expires");r={"Content-Type":"application/json","api-key":this.apiKey},t=this.sum(this.seconds(),t);const d=t.toString();e+=d,r["api-expires"]=d,"POST"!==i&&"PUT"!==i&&"DELETE"!==i||Object.keys(s).length&&(e+=a=this.json(s)),r["api-signature"]=this.hmac(this.encode(e),this.encode(this.secret),n.s)}return{url:d,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitopro",name:"BitoPro",countries:["TW"],version:"v3",rateLimit:100,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,setLeverage:!1,setMarginMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","3h":"3h","6h":"6h","12h":"12h","1d":"1d","1w":"1w","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/affc6337-b95a-44bf-aacd-04f9722364f6",api:{rest:"https://api.bitopro.com/v3"},www:"https://www.bitopro.com",doc:["https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md"],fees:"https://www.bitopro.com/fees"},requiredCredentials:{apiKey:!0,secret:!0},api:{public:{get:{"order-book/{pair}":1,tickers:1,"tickers/{pair}":1,"trades/{pair}":1,"provisioning/currencies":1,"provisioning/trading-pairs":1,"provisioning/limitations-and-fees":1,"trading-history/{pair}":1,"price/otc/{currency}":1}},private:{get:{"accounts/balance":1,"orders/history":1,"orders/all/{pair}":1,"orders/trades/{pair}":1,"orders/{pair}/{orderId}":1,"wallet/withdraw/{currency}/{serial}":1,"wallet/withdraw/{currency}/id/{id}":1,"wallet/depositHistory/{currency}":1,"wallet/withdrawHistory/{currency}":1,"orders/open":1},post:{"orders/{pair}":.5,"orders/batch":20/3,"wallet/withdraw/{currency}":10},put:{orders:5},delete:{"orders/{pair}/{id}":2/3,"orders/all":5,"orders/{pair}":5}}},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.001"),taker:this.parseNumber("0.002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("3000000"),this.parseNumber("0.00194")],[this.parseNumber("5000000"),this.parseNumber("0.0015")],[this.parseNumber("30000000"),this.parseNumber("0.0014")],[this.parseNumber("300000000"),this.parseNumber("0.0013")],[this.parseNumber("550000000"),this.parseNumber("0.0012")],[this.parseNumber("1300000000"),this.parseNumber("0.0011")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("3000000"),this.parseNumber("0.00097")],[this.parseNumber("5000000"),this.parseNumber("0.0007")],[this.parseNumber("30000000"),this.parseNumber("0.0006")],[this.parseNumber("300000000"),this.parseNumber("0.0005")],[this.parseNumber("550000000"),this.parseNumber("0.0004")],[this.parseNumber("1300000000"),this.parseNumber("0.0003")]]}}},options:{networks:{ERC20:"ERC20",ETH:"ERC20",TRX:"TRX",TRC20:"TRX",BEP20:"BSC",BSC:"BSC"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e4,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"Unsupported currency.":r.BadRequest,"Unsupported order type":r.BadRequest,"Invalid body":r.BadRequest,"Invalid Signature":r.AuthenticationError,"Address not in whitelist.":r.BadRequest},broad:{"Invalid amount":r.InvalidOrder,"Balance for ":r.InsufficientFunds,"Invalid ":r.BadRequest,"Wrong parameter":r.BadRequest}},commonCurrencies:{}})}async fetchCurrencies(e={}){const t=await this.publicGetProvisioningCurrencies(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeCurrencyCode(r),o=this.safeBool(t,"deposit"),n=this.safeBool(t,"withdraw"),d=this.safeNumber(t,"withdrawFee"),h={withdraw:{min:this.safeNumber(t,"minWithdraw"),max:this.safeNumber(t,"maxWithdraw")},amount:{min:void 0,max:void 0}};s[a]={id:r,code:a,info:t,type:void 0,name:void 0,active:o&&n,deposit:o,withdraw:n,fee:d,precision:void 0,limits:h}}return s}async fetchMarkets(e={}){const t=await this.publicGetProvisioningTradingPairs(),i=this.safeList(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=!this.safeBool(e,"maintain"),i=this.safeString(e,"pair"),s=i.toUpperCase(),r=this.safeString(e,"base"),a=this.safeString(e,"quote"),o=this.safeCurrencyCode(r),n=this.safeCurrencyCode(a);return{id:i,uppercaseId:s,symbol:o+"/"+n,base:o,quote:n,baseId:o,quoteId:n,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,limits:{amount:{min:this.safeNumber(e,"minLimitBaseAmount"),max:this.safeNumber(e,"maxLimitBaseAmount")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0},leverage:{min:void 0,max:void 0}},precision:{price:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrecision"))),amount:this.parseNumber(this.parsePrecision(this.safeString(e,"basePrecision")))},active:t,created:void 0,info:e}}parseTicker(e,t=void 0){const i=this.safeString(e,"pair");t=this.safeMarket(i,t);const s=this.safeString(t,"symbol");return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:this.safeString(e,"high24hr"),low:this.safeString(e,"low24hr"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:void 0,close:this.safeString(e,"lastPrice"),last:this.safeString(e,"lastPrice"),previousClose:void 0,change:void 0,percentage:this.safeString(e,"priceChange24hr"),average:void 0,baseVolume:this.safeString(e,"volume24hr"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTickersPair(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(),s=this.safeList(i,"data",[]);return this.parseTickers(s,e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id};void 0!==t&&(r.limit=t);const a=await this.publicGetOrderBookPair(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","amount")}parseTrade(e,t=void 0){const i=this.safeString(e,"tradeId"),s=this.safeString(e,"orderId");let r;r=void 0===i?this.safeTimestamp(e,"timestamp"):this.safeInteger(e,"timestamp");const a=this.safeString(e,"pair");t=this.safeMarket(a,t);const o=this.safeString(t,"symbol"),n=this.safeString(e,"price"),d=this.safeStringLower(e,"type");let h=this.safeStringLower(e,"action");if(void 0===h){h=this.safeBool(e,"isBuyer")?"buy":"sell"}let c,l=this.safeString(e,"amount");void 0===l&&(l=this.safeString(e,"baseAmount"));const u=this.safeString(e,"fee"),f=this.safeCurrencyCode(this.safeString(e,"feeSymbol"));void 0!==u&&(c={cost:u,currency:f,rate:void 0});const p=this.safeBool(e,"isTaker");let m;return void 0!==p&&(m=p?"taker":"maker"),this.safeTrade({id:i,info:e,order:s,timestamp:r,datetime:this.iso8601(r),symbol:o,takerOrMaker:m,type:d,side:h,price:n,amount:l,cost:void 0,fee:c},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id},o=await this.publicGetTradesPair(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.publicGetProvisioningLimitationsAndFees(e),i=this.safeDict(t,"tradingFeeRate",{}),s=this.safeValue(i,0),r={},a=this.safeNumber(s,"makerFee"),o=this.safeNumber(s,"takerFee");for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e];r[t]={info:s,symbol:t,maker:a,taker:o,percentage:!0,tierBased:!0}}return r}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t,t),n={pair:a.id,resolution:o};s=void 0===s?500:Math.min(s,75e3);const d=this.parseTimeframe(t);let h;if(void 0===i)n.to=this.seconds(),n.from=n.to-s*d;else{const e=1e3*d;h=Math.floor(i/e)*e,n.from=Math.floor(i/1e3),n.to=this.sum(n.from,s*d)}const c=await this.publicGetTradingHistoryPair(this.extend(n,r)),l=this.safeList(c,"data",[]),u=this.parseOHLCVs(l,a,t,i,s);return this.insertMissingCandles(u,d,h,s)}insertMissingCandles(e,t,i,s){if(0===e.length)return e;const r=[];let a,o=e[0];a=void 0===i?o[0]:i;let n=0;const d=e.length;let h=0;for(;h<s&&n<d;){const i=e[n];if(i[0]===a)r.push(i),n=this.sum(n,1);else{const e=this.arrayConcat([],o);e[0]=a,e[1]=e[4],e[2]=e[4],e[3]=e[4],e[5]=this.parseNumber("0"),r.push(e)}a=this.sum(a,1e3*t),h=r.length,o=r[h-1]}return r}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.safeString(s,"amount"),n={free:this.safeString(s,"available"),total:o};t[a]=n}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountsBalance(e),i=this.safeList(t,"data",[]);return this.parseBalance(i)}parseOrderStatus(e){return this.safeString({"-1":"open",0:"open",1:"open",2:"closed",3:"closed",4:"canceled",6:"canceled"},e,void 0)}parseOrder(e,t=void 0){const i=this.safeString2(e,"id","orderId"),s=this.safeInteger2(e,"timestamp","createdTimestamp");let r=this.safeString(e,"action");r=r.toLowerCase();const o=this.safeString2(e,"amount","originalAmount"),n=this.safeString(e,"price"),d=this.safeString(e,"pair");t=this.safeMarket(d,t,"_");const h=this.safeString(t,"symbol"),c=this.safeString(e,"status"),l=this.parseOrderStatus(c),u=this.safeStringLower(e,"type"),f=this.safeString(e,"avgExecutionPrice"),p=this.safeString(e,"executedAmount"),m=this.safeString(e,"remainingAmount"),g=this.safeString(e,"timeInForce");let v,y;"POST_ONLY"===g&&(v=!0);const w=this.safeString(e,"fee"),b=this.safeCurrencyCode(this.safeString(e,"feeSymbol"));return a.Y.stringGt(w,"0")&&(y={currency:b,cost:w}),this.safeOrder({id:i,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:this.safeInteger(e,"updatedTimestamp"),symbol:h,type:u,timeInForce:g,postOnly:v,side:r,price:n,triggerPrice:void 0,amount:o,cost:void 0,average:f,filled:p,remaining:m,status:l,fee:y,trades:void 0,info:e},t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={type:t,pair:n.id,action:i,amount:this.amountToPrecision(e,s),timestamp:this.milliseconds()},h=t.toUpperCase();if("LIMIT"===h&&(d.price=this.priceToPrecision(e,a)),"STOP_LIMIT"===h){d.price=this.priceToPrecision(e,a);const t=this.safeValue2(o,"triggerPrice","stopPrice");if(o=this.omit(o,["triggerPrice","stopPrice"]),void 0===t)throw new r.InvalidOrder(this.id+" createOrder() requires a triggerPrice parameter for "+h+" orders");d.stopPrice=this.priceToPrecision(e,t);const i=this.safeString(o,"condition");if(void 0===i)throw new r.InvalidOrder(this.id+" createOrder() requires a condition parameter for "+h+" orders");d.condition=i}this.isPostOnly("MARKET"===h,void 0,o)&&(d.timeInForce="POST_ONLY");const c=await this.privatePostOrdersPair(this.extend(d,o));return this.parseOrder(c,n)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={id:e,pair:s.id},o=await this.privateDeleteOrdersPairId(this.extend(a,i));return this.parseOrder(o,s)}parseCancelOrders(e){const t=Object.keys(e),i=[];for(let s=0;s<t.length;s++){const r=t[s],a=e[r];for(let e=0;e<a.length;e++)i.push(this.safeOrder({info:a[e],id:a[e],symbol:this.safeSymbol(r)}))}return i}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s={};s[this.market(t).uppercaseId]=e;const a=await this.privatePutOrders(this.extend(s,i)),o=this.safeDict(a,"data");return this.parseCancelOrders(o)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;if(void 0!==e){const r=this.market(e);i.pair=r.id,s=await this.privateDeleteOrdersPair(this.extend(i,t))}else s=await this.privateDeleteOrdersAll(this.extend(i,t));const r=this.safeDict(s,"data",{});return this.parseCancelOrders(r)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={orderId:e,pair:s.id},o=await this.privateGetOrdersPairOrderId(this.extend(a,i));return this.parseOrder(o,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id};void 0!==t&&(o.startTimestamp=t),void 0!==i&&(o.limit=i);const n=await this.privateGetOrdersAllPair(this.extend(o,s));let d=this.safeList(n,"data",[]);return void 0===d&&(d=[]),this.parseOrders(d,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.pair=a.id);const o=await this.privateGetOrdersOpen(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseOrders(n,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return this.fetchOrders(e,t,i,this.extend({statusKind:"DONE"},s))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id},n=await this.privateGetOrdersTradesPair(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseTransactionStatus(e){return this.safeString({COMPLETE:"ok",INVALID:"failed",PROCESSING:"pending",WAIT_PROCESS:"pending",FAILED:"failed",EXPIRED:"failed",CANCELLED:"failed",EMAIL_VERIFICATION:"pending",WAIT_CONFIRMATION:"pending"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeCurrencyCode(i,t),r=this.safeInteger(e,"timestamp"),a=this.safeString(e,"address"),o=this.safeString(e,"message"),n=this.safeString(e,"status");let d=this.safeString(e,"protocol");return"MAIN"===d&&(d=s),{info:e,id:this.safeString(e,"serial"),txid:this.safeString(e,"txid"),type:void 0,currency:s,network:this.networkIdToCode(d),amount:this.safeNumber(e,"total"),status:this.parseTransactionStatus(n),timestamp:r,datetime:this.iso8601(r),address:a,addressFrom:void 0,addressTo:a,tag:o,tagFrom:void 0,tagTo:o,updated:void 0,comment:void 0,internal:void 0,fee:{currency:s,cost:this.safeNumber(e,"fee"),rate:void 0}}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDeposits() requires the code argument");await this.loadMarkets();const a=this.safeCurrency(e),o={currency:a.id};void 0!==t&&(o.startTimestamp=t),void 0!==i&&(o.limit=i);const n=await this.privateGetWalletDepositHistoryCurrency(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchWithdrawals() requires the code argument");await this.loadMarkets();const a=this.safeCurrency(e),o={currency:a.id};void 0!==t&&(o.startTimestamp=t),void 0!==i&&(o.limit=i);const n=await this.privateGetWalletWithdrawHistoryCurrency(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,{type:"withdrawal"})}async fetchWithdrawal(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchWithdrawal() requires the code argument");await this.loadMarkets();const s=this.safeCurrency(t),a={serial:e,currency:s.id},o=await this.privateGetWalletWithdrawCurrencySerial(this.extend(a,i)),n=this.safeDict(o,"data",{});return this.parseTransaction(n,s)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),await this.loadMarkets(),this.checkAddress(i);const o=this.currency(e),n={currency:o.id,amount:this.numberToString(t),address:i};if("network"in a){const e=this.safeDict(this.options,"networks",{}),t=this.safeStringUpper(a,"network");a=this.omit(a,["network"]);const i=this.safeString(e,t);if(void 0===i)throw new r.ExchangeError(this.id+" invalid network "+t);n.protocol=i}void 0!==s&&(n.message=s);const d=await this.privatePostWalletWithdrawCurrency(this.extend(n,a)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,o)}parseDepositWithdrawFee(e,t=void 0){return{info:e,withdraw:{fee:this.safeNumber(e,"withdrawFee"),percentage:!1},deposit:{fee:void 0,percentage:void 0},networks:{}}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetProvisioningCurrencies(t),s=this.safeList(i,"data",[]);return this.parseDepositWithdrawFees(s,e,"currency")}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if(void 0===r&&(r={}),r["X-BITOPRO-API"]="ccxt","private"===t){if(this.checkRequiredCredentials(),"POST"===i||"PUT"===i){a=this.json(s);const e=this.stringToBase64(a),t=this.hmac(this.encode(e),this.encode(this.secret),n.qt);r["X-BITOPRO-APIKEY"]=this.apiKey,r["X-BITOPRO-PAYLOAD"]=e,r["X-BITOPRO-SIGNATURE"]=t}else if("GET"===i||"DELETE"===i){Object.keys(d).length&&(o+="?"+this.urlencode(d));const e={nonce:this.milliseconds()},t=this.json(e),i=this.stringToBase64(t),s=this.hmac(this.encode(i),this.encode(this.secret),n.qt);r["X-BITOPRO-APIKEY"]=this.apiKey,r["X-BITOPRO-PAYLOAD"]=i,r["X-BITOPRO-SIGNATURE"]=s}}else"public"===t&&"GET"===i&&Object.keys(d).length&&(o+="?"+this.urlencode(d));return o=this.urls.api.rest+o,{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(e>=200&&e<300)return;const c=this.id+" "+o,l=this.safeString(n,"error");throw this.throwExactlyMatchedException(this.exceptions.exact,l,c),this.throwBroadlyMatchedException(this.exceptions.broad,l,c),new r.ExchangeError(c)}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitpanda",alias:!0})}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitrue",name:"Bitrue",countries:["SG"],rateLimit:1e3,certified:!1,version:"v1",pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchPositionMode:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!0,fetchWithdrawals:!0,setLeverage:!0,setMargin:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1H","2h":"2H","4h":"4H","1d":"1D","1w":"1W"},urls:{logo:"https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e",api:{spot:"https://www.bitrue.com/api",fapi:"https://fapi.bitrue.com/fapi",dapi:"https://fapi.bitrue.com/dapi",kline:"https://www.bitrue.com/kline-api"},www:"https://www.bitrue.com",referral:"https://www.bitrue.com/affiliate/landing?cn=600000&inviteCode=EZWETQE",doc:["https://github.com/Bitrue-exchange/bitrue-official-api-docs","https://www.bitrue.com/api-docs"],fees:"https://bitrue.zendesk.com/hc/en-001/articles/4405479952537"},api:{spot:{kline:{public:{get:{"public.json":1,"public{currency}.json":1}}},v1:{public:{get:{ping:1,time:1,exchangeInfo:1,depth:{cost:1,byLimit:[[100,1],[500,5],[1e3,10]]},trades:1,historicalTrades:5,aggTrades:1,"ticker/24hr":{cost:1,noSymbol:40},"ticker/price":{cost:1,noSymbol:2},"ticker/bookTicker":{cost:1,noSymbol:2},"market/kline":1}},private:{get:{order:1,openOrders:1,allOrders:5,account:5,myTrades:{cost:5,noSymbol:40},"etf/net-value/{symbol}":1,"withdraw/history":1,"deposit/history":1},post:{order:4,"withdraw/commit":1},delete:{order:1}}},v2:{private:{get:{myTrades:5}}}},fapi:{v1:{public:{get:{ping:1,time:1,contracts:1,depth:1,ticker:1,klines:1}}},v2:{private:{get:{myTrades:1,openOrders:1,order:1,account:1,leverageBracket:1,commissionRate:1,futures_transfer_history:1,forceOrdersHistory:1},post:{positionMargin:1,level_edit:1,cancel:1,order:1,allOpenOrders:1,futures_transfer:1}}}},dapi:{v1:{public:{get:{ping:1,time:1,contracts:1,depth:1,ticker:1,klines:1}}},v2:{private:{get:{myTrades:1,openOrders:1,order:1,account:1,leverageBracket:1,commissionRate:1,futures_transfer_history:1,forceOrdersHistory:1},post:{positionMargin:1,level_edit:1,cancel:1,order:1,allOpenOrders:1,futures_transfer:1}}}}},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,taker:this.parseNumber("0.00098"),maker:this.parseNumber("0.00098")},future:{trading:{feeSide:"quote",tierBased:!0,percentage:!0,taker:this.parseNumber("0.000400"),maker:this.parseNumber("0.000200"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.000400")],[this.parseNumber("250"),this.parseNumber("0.000400")],[this.parseNumber("2500"),this.parseNumber("0.000350")],[this.parseNumber("7500"),this.parseNumber("0.000320")],[this.parseNumber("22500"),this.parseNumber("0.000300")],[this.parseNumber("50000"),this.parseNumber("0.000270")],[this.parseNumber("100000"),this.parseNumber("0.000250")],[this.parseNumber("200000"),this.parseNumber("0.000220")],[this.parseNumber("400000"),this.parseNumber("0.000200")],[this.parseNumber("750000"),this.parseNumber("0.000170")]],maker:[[this.parseNumber("0"),this.parseNumber("0.000200")],[this.parseNumber("250"),this.parseNumber("0.000160")],[this.parseNumber("2500"),this.parseNumber("0.000140")],[this.parseNumber("7500"),this.parseNumber("0.000120")],[this.parseNumber("22500"),this.parseNumber("0.000100")],[this.parseNumber("50000"),this.parseNumber("0.000080")],[this.parseNumber("100000"),this.parseNumber("0.000060")],[this.parseNumber("200000"),this.parseNumber("0.000040")],[this.parseNumber("400000"),this.parseNumber("0.000020")],[this.parseNumber("750000"),this.parseNumber("0")]]}}},delivery:{trading:{feeSide:"base",tierBased:!0,percentage:!0,taker:this.parseNumber("0.000500"),maker:this.parseNumber("0.000100"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.000500")],[this.parseNumber("250"),this.parseNumber("0.000450")],[this.parseNumber("2500"),this.parseNumber("0.000400")],[this.parseNumber("7500"),this.parseNumber("0.000300")],[this.parseNumber("22500"),this.parseNumber("0.000250")],[this.parseNumber("50000"),this.parseNumber("0.000240")],[this.parseNumber("100000"),this.parseNumber("0.000240")],[this.parseNumber("200000"),this.parseNumber("0.000240")],[this.parseNumber("400000"),this.parseNumber("0.000240")],[this.parseNumber("750000"),this.parseNumber("0.000240")]],maker:[[this.parseNumber("0"),this.parseNumber("0.000100")],[this.parseNumber("250"),this.parseNumber("0.000080")],[this.parseNumber("2500"),this.parseNumber("0.000050")],[this.parseNumber("7500"),this.parseNumber("0.0000030")],[this.parseNumber("22500"),this.parseNumber("0")],[this.parseNumber("50000"),this.parseNumber("-0.000050")],[this.parseNumber("100000"),this.parseNumber("-0.000060")],[this.parseNumber("200000"),this.parseNumber("-0.000070")],[this.parseNumber("400000"),this.parseNumber("-0.000080")],[this.parseNumber("750000"),this.parseNumber("-0.000090")]]}}}},options:{createMarketBuyOrderRequiresPrice:!0,fetchMarkets:["spot","linear","inverse"],fetchMyTradesMethod:"v2PrivateGetMyTrades",hasAlreadyAuthenticatedSuccessfully:!1,currencyToPrecisionRoundingMode:o.R3,recvWindow:5e3,timeDifference:0,adjustForTimeDifference:!1,parseOrderToPrecision:!1,newOrderRespType:{market:"FULL",limit:"FULL"},networks:{ERC20:"ETH",TRC20:"TRX",AETERNITY:"Aeternity",AION:"AION",ALGO:"Algorand",ASK:"ASK",ATOM:"ATOM",AVAXC:"AVAX C-Chain",BCH:"BCH",BEP2:"BEP2",BEP20:"BEP20",Bitcoin:"Bitcoin",BRP20:"BRP20",ADA:"Cardano",CASINOCOIN:"CasinoCoin","CASINOCOIN-XRPL":"CasinoCoin XRPL",CONTENTOS:"Contentos",DASH:"Dash",DECOIN:"Decoin",DFI:"DeFiChain",DGB:"DGB",DIVI:"Divi",DOGE:"dogecoin",EOS:"EOS",ETC:"ETC",FILECOIN:"Filecoin",FREETON:"FREETON",HBAR:"HBAR",HEDERA:"Hedera Hashgraph",HRC20:"HRC20",ICON:"ICON",ICP:"ICP",IGNIS:"Ignis",INTERNETCOMPUTER:"Internet Computer",IOTA:"IOTA",KAVA:"KAVA",KSM:"KSM",LTC:"LiteCoin",LUNA:"Luna",MATIC:"MATIC",MOBILECOIN:"Mobile Coin",MONACOIN:"MonaCoin",XMR:"Monero",NEM:"NEM",NEP5:"NEP5",OMNI:"OMNI",PAC:"PAC",DOT:"Polkadot",RAVEN:"Ravencoin",SAFEX:"Safex",SOL:"SOLANA",SGB:"Songbird",XML:"Stellar Lumens",XYM:"Symbol",XTZ:"Tezos",theta:"theta",THETA:"THETA",VECHAIN:"VeChain",WANCHAIN:"Wanchain",XINFIN:"XinFin Network",XRP:"XRP",XRPL:"XRPL",ZIL:"ZIL"},defaultType:"spot",timeframes:{spot:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1H","2h":"2H","4h":"4H","12h":"12H","1d":"1D","1w":"1W"},future:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","1h":"1h","1d":"1day","1w":"1week","1M":"1month"}},accountsByType:{spot:"wallet",future:"contract",swap:"contract",funding:"wallet",fund:"wallet",contract:"contract"}},commonCurrencies:{MIM:"MIM Swarm"},precisionMode:o.kb,features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!0,marketBuyByCost:!0,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:90,daysBackCanceled:1,untilDays:90,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1440}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{marginMode:!0,leverage:!0,marketBuyRequiresPrice:!1,marketBuyByCost:!1},fetchOHLCV:{limit:300},fetchClosedOrders:void 0},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"System is under maintenance.":r.OnMaintenance,"System abnormality":r.ExchangeError,"You are not authorized to execute this request.":r.PermissionDenied,"API key does not exist":r.AuthenticationError,"Order would trigger immediately.":r.OrderImmediatelyFillable,"Stop price would trigger immediately.":r.OrderImmediatelyFillable,"Order would immediately match and take.":r.OrderImmediatelyFillable,"Account has insufficient balance for requested action.":r.InsufficientFunds,"Rest API trading is not enabled.":r.ExchangeNotAvailable,"You don't have permission.":r.PermissionDenied,"Market is closed.":r.ExchangeNotAvailable,"Too many requests. Please try again later.":r.DDoSProtection,"-1000":r.ExchangeNotAvailable,"-1001":r.ExchangeNotAvailable,"-1002":r.AuthenticationError,"-1003":r.RateLimitExceeded,"-1013":r.InvalidOrder,"-1015":r.RateLimitExceeded,"-1016":r.ExchangeNotAvailable,"-1020":r.BadRequest,"-1021":r.InvalidNonce,"-1022":r.AuthenticationError,"-1100":r.BadRequest,"-1101":r.BadRequest,"-1102":r.BadRequest,"-1103":r.BadRequest,"-1104":r.BadRequest,"-1105":r.BadRequest,"-1106":r.BadRequest,"-1111":r.BadRequest,"-1112":r.InvalidOrder,"-1114":r.BadRequest,"-1115":r.BadRequest,"-1116":r.BadRequest,"-1117":r.BadRequest,"-1166":r.InvalidOrder,"-1118":r.BadRequest,"-1119":r.BadRequest,"-1120":r.BadRequest,"-1121":r.BadSymbol,"-1125":r.AuthenticationError,"-1127":r.BadRequest,"-1128":r.BadRequest,"-1130":r.BadRequest,"-1131":r.BadRequest,"-1160":r.InvalidOrder,"-1156":r.InvalidOrder,"-2008":r.AuthenticationError,"-2010":r.ExchangeError,"-2011":r.OrderNotFound,"-2013":r.OrderNotFound,"-2014":r.AuthenticationError,"-2015":r.AuthenticationError,"-2017":r.InsufficientFunds,"-2019":r.InsufficientFunds,"-3005":r.InsufficientFunds,"-3006":r.InsufficientFunds,"-3008":r.InsufficientFunds,"-3010":r.ExchangeError,"-3015":r.ExchangeError,"-3022":r.AccountSuspended,"-4028":r.BadRequest,"-3020":r.InsufficientFunds,"-3041":r.InsufficientFunds,"-5013":r.InsufficientFunds,"-11008":r.InsufficientFunds,"-4051":r.InsufficientFunds},broad:{"Insufficient account balance":r.InsufficientFunds,"has no operation privilege":r.PermissionDenied,MAX_POSITION:r.InvalidOrder}}})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchStatus(e={}){const t=await this.spotV1PublicGetPing(e);return{status:Object.keys(t).length?"maintenance":"ok",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTime(e={}){const t=await this.spotV1PublicGetTime(e);return this.safeInteger(t,"serverTime")}async fetchCurrencies(e={}){const t=await this.spotV1PublicGetExchangeInfo(e),i={},s=this.safeList(t,"coins",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"coin"),o=this.safeString(t,"coinFulName"),n=this.safeCurrencyCode(r);let d,h,c,l,u;const f=this.safeList(t,"chainDetail",[]),p={};for(let e=0;e<f.length;e++){const t=f[e],i=this.safeString(t,"chain"),s=this.networkIdToCode(i,n),r=this.safeBool(t,"enableDeposit");d=r||d;const o=this.safeBool(t,"enableWithdraw");h=o||h;const m=this.safeString(t,"withdrawFee");void 0!==m&&(u=void 0===u?m:a.Y.stringMin(m,u));const g=this.safeString(t,"minWithdraw");void 0!==g&&(c=void 0===c?g:a.Y.stringMin(g,c));const v=this.safeString(t,"maxWithdraw");void 0!==v&&(l=void 0===l?v:a.Y.stringMax(v,l)),p[s]={info:t,id:i,network:s,deposit:r,withdraw:o,active:r&&o,fee:this.parseNumber(m),precision:void 0,limits:{withdraw:{min:this.parseNumber(g),max:this.parseNumber(v)}}}}i[n]={id:r,name:o,code:n,precision:void 0,info:t,active:d&&h,deposit:d,withdraw:h,networks:p,fee:this.parseNumber(u),limits:{withdraw:{min:this.parseNumber(c),max:this.parseNumber(l)}}}}return i}async fetchMarkets(e={}){const t=[],i=this.safeValue(this.options,"fetchMarkets",["spot","linear","inverse"]);for(let s=0;s<i.length;s++){const a=i[s];if("spot"===a)t.push(this.spotV1PublicGetExchangeInfo(e));else if("linear"===a)t.push(this.fapiV1PublicGetContracts(e));else{if("inverse"!==a)throw new r.ExchangeError(this.id+' fetchMarkets() this.options fetchMarkets "'+a+'" is not a supported market type');t.push(this.dapiV1PublicGetContracts(e))}}const s=await Promise.all(t),a=this.safeValue(this.safeValue(s,0),"symbols",[]),o=this.safeValue(s,1),n=this.safeValue(s,2);let d=a;return d=this.arrayConcat(d,o),d=this.arrayConcat(d,n),this.options.adjustForTimeDifference&&await this.loadTimeDifference(),this.parseMarkets(d)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeStringLower(e,"symbol"),s=this.safeInteger(e,"side");let r,o,n;void 0===s?r="spot":(r="swap",o=1===s,n=0===s);const d="spot"!==r;let h,c,l=this.safeString(e,"baseAsset"),u=this.safeString(e,"quoteAsset");if(d){const e=t.split("-");l=this.safeString(e,1),u=this.safeString(e,2),h=o?u:l,c=this.safeCurrencyCode(h)}const f=this.safeCurrencyCode(l),p=this.safeCurrencyCode(u);let m=f+"/"+p;void 0!==c&&(m+=":"+c);const g=this.safeList(e,"filters",[]),v=this.indexBy(g,"filterType"),y=this.safeString(e,"status"),w=this.safeDict(v,"PRICE_FILTER",{}),b=this.safeDict(v,"LOT_SIZE",{}),k=this.safeString(e,"pricePrecision"),S=this.safeString(e,"quantityPrecision"),O=this.safeString(w,"priceScale",k),T=this.safeString(b,"volumeScale",S),P=this.safeString(e,"multiplier");let I=this.safeNumber(b,"maxQty");void 0===I&&(I=this.safeNumber(e,"maxValidOrder"));let M=this.safeNumber(b,"minVal");return void 0===M&&(M=this.safeNumber(e,"minOrderMoney")),{id:t,lowercaseId:i,symbol:m,base:f,quote:p,settle:c,baseId:l,quoteId:u,settleId:h,type:r,spot:"spot"===r,margin:!1,swap:d,future:!1,option:!1,active:"TRADING"===y,contract:d,linear:o,inverse:n,contractSize:this.parseNumber(a.Y.stringAbs(P)),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(T)),price:this.parseNumber(this.parsePrecision(O))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(b,"minQty"),max:I},price:{min:this.safeNumber(w,"minPrice"),max:this.safeNumber(w,"maxPrice")},cost:{min:M,max:void 0}},created:void 0,info:e}}parseBalance(e){const t={info:e},i=this.safeInteger(e,"updateTime"),s=this.safeValue2(e,"balances","account",[]);for(let e=0;e<s.length;e++){const i=s[e],r=this.safeString2(i,"asset","marginCoin"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString2(i,"free","accountNormal"),o.used=this.safeString2(i,"locked","accountLock"),t[a]=o}return t.timestamp=i,t.datetime=this.iso8601(i),this.safeBalance(t)}async fetchBalance(e={}){let t,i,s,r;return await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[i,e]=this.handleSubTypeAndParams("fetchBalance",void 0,e),"swap"===t?void 0!==i&&"inverse"===i?(s=await this.dapiV2PrivateGetAccount(e),r=this.safeDict(s,"data",{})):(s=await this.fapiV2PrivateGetAccount(e),r=this.safeDict(s,"data",{})):(s=await this.spotV1PrivateGetAccount(e),r=s),this.parseBalance(r)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);let a;if(s.swap){const e={contractName:s.id};void 0!==t&&(t>100&&(t=100),e.limit=t),s.linear?a=await this.fapiV1PublicGetDepth(this.extend(e,i)):s.inverse&&(a=await this.dapiV1PublicGetDepth(this.extend(e,i)))}else{if(!s.spot)throw new r.NotSupported(this.id+" fetchOrderBook only support spot & swap markets");{const e={symbol:s.id};void 0!==t&&(t>1e3&&(t=1e3),e.limit=t),a=await this.spotV1PublicGetDepth(this.extend(e,i))}}const o=this.safeInteger(a,"time"),n=this.parseOrderBook(a,e,o);return n.nonce=this.safeInteger(a,"lastUpdateId"),n}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeString2(e,"lastPrice","last"),r=this.safeInteger(e,"time");let o;return o=t.swap?a.Y.stringMul(this.safeString(e,"rose"),"100"):this.safeString(e,"priceChangePercent"),this.safeTicker({symbol:i,timestamp:r,datetime:this.iso8601(r),high:this.safeString2(e,"highPrice","high"),low:this.safeString2(e,"lowPrice","low"),bid:this.safeString2(e,"bidPrice","buy"),bidVolume:this.safeString(e,"bidQty"),ask:this.safeString2(e,"askPrice","sell"),askVolume:this.safeString(e,"askQty"),vwap:this.safeString(e,"weightedAvgPrice"),open:this.safeString(e,"openPrice"),close:s,last:s,previousClose:void 0,change:this.safeString(e,"priceChange"),percentage:o,average:void 0,baseVolume:this.safeString2(e,"volume","vol"),quoteVolume:this.safeString(e,"quoteVolume"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e);let s,a;if(i.swap){const e={contractName:i.id};i.linear?s=await this.fapiV1PublicGetTicker(this.extend(e,t)):i.inverse&&(s=await this.dapiV1PublicGetTicker(this.extend(e,t))),a=s}else{if(!i.spot)throw new r.NotSupported(this.id+" fetchTicker only support spot & swap markets");{const e={symbol:i.id};s=await this.spotV1PublicGetTicker24hr(this.extend(e,t)),a=this.safeDict(s,0,{})}}return this.parseTicker(a,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeDict(this.options,"timeframes",{});let d,h;if(o.swap){const e=this.safeDict(n,"future",{}),i={contractName:o.id,interval:this.safeString(e,t,"1min")};void 0!==s&&(i.limit=s),o.linear?d=await this.fapiV1PublicGetKlines(this.extend(i,a)):o.inverse&&(d=await this.dapiV1PublicGetKlines(this.extend(i,a))),h=d}else{if(!o.spot)throw new r.NotSupported(this.id+" fetchOHLCV only support spot & swap markets");{const e=this.safeDict(n,"spot",{}),i={symbol:o.id,scale:this.safeString(e,t,"1m")};void 0!==s&&(i.limit=s);const r=this.safeInteger(a,"until");void 0!==r&&(a=this.omit(a,"until"),i.fromIdx=r),d=await this.spotV1PublicGetMarketKline(this.extend(i,a)),h=this.safeList(d,"data",[])}}return this.parseOHLCVs(h,o,t,i,s)}parseOHLCV(e,t=void 0){let i=this.safeTimestamp(e,"i");return void 0===i&&(i=this.safeInteger(e,"idx")),[i,this.safeNumber2(e,"o","open"),this.safeNumber2(e,"h","high"),this.safeNumber2(e,"l","low"),this.safeNumber2(e,"c","close"),this.safeNumber2(e,"v","vol")]}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!1);const i=this.safeString(e,0),s=this.market(i);let a;if(s.swap){const e={contractName:s.id};s.linear?a=await this.fapiV1PublicGetTicker(this.extend(e,t)):s.inverse&&(a=await this.dapiV1PublicGetTicker(this.extend(e,t)))}else{if(!s.spot)throw new r.NotSupported(this.id+" fetchBidsAsks only support spot & swap markets");{const e={symbol:s.id};a=await this.spotV1PublicGetTickerBookTicker(this.extend(e,t))}}const o={};return o[s.id]=a,this.parseTickers(o,e)}async fetchTickers(e=void 0,t={}){let i,s;await this.loadMarkets();const a={};let o;if(void 0!==(e=this.marketSymbols(e))){const o=this.safeString(e,0),n=this.market(o);if(n.swap)throw new r.NotSupported(this.id+" fetchTickers does not support swap markets, please use fetchTicker instead");if(!n.spot)throw new r.NotSupported(this.id+" fetchTickers only support spot & swap markets");i=await this.spotV1PublicGetTicker24hr(this.extend(a,t)),s=i}else{if([o,t]=this.handleMarketTypeAndParams("fetchTickers",void 0,t),"spot"!==o)throw new r.NotSupported(this.id+" fetchTickers only support spot when symbols are not proved");i=await this.spotV1PublicGetTicker24hr(this.extend(a,t)),s=i}const n={};for(let e=0;e<s.length;e++){const t=this.safeDict(s,e,{});n[this.market(this.safeValue(t,"symbol")).id]=t}return this.parseTickers(n,e)}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"ctime","time"),s=this.safeString(e,"price"),r=this.safeString(e,"qty"),a=this.safeString2(e,"symbol","contractName"),o=this.safeSymbol(a,t),n=this.safeString(e,"orderId"),d=this.safeString2(e,"id","tradeId");let h;const c=this.safeBool(e,"isBuyerMaker"),l=this.safeBool(e,"isBuyer");let u,f;void 0!==c&&(h=c?"sell":"buy"),void 0!==l&&(h=l?"buy":"sell"),"commission"in e&&(u={cost:this.safeString2(e,"commission","fee"),currency:this.safeCurrencyCode(this.safeString(e,"commissionAssert"))});const p=this.safeBool(e,"isMaker");return void 0!==p&&(f=p?"maker":"taker"),this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:o,id:d,order:n,type:void 0,side:h,takerOrMaker:f,price:s,amount:r,cost:void 0,fee:u},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e);let o;if(!a.spot)throw new r.NotSupported(this.id+" fetchTrades only support spot markets");{const e={symbol:a.id};void 0!==i&&(e.limit=i),o=await this.spotV1PublicGetTrades(this.extend(e,s))}return this.parseTrades(o,a,t,i)}parseOrderStatus(e){return this.safeString({INIT:"open",PENDING_CREATE:"open",NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",CANCELED:"canceled",PENDING_CANCEL:"canceling",REJECTED:"rejected",EXPIRED:"expired"},e,e)}parseOrder(e,t=void 0){const i=this.parseOrderStatus(this.safeString2(e,"status","orderStatus")),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),o=this.safeString(e,"executedQty");let n,d;"time"in e?n=this.safeInteger(e,"time"):"transactTime"in e?n=this.safeInteger(e,"transactTime"):"updateTime"in e&&"open"===i&&(a.Y.stringGt(o,"0")?d=this.safeInteger(e,"updateTime"):n=this.safeInteger(e,"updateTime"));const h=this.safeString(e,"avgPrice"),c=this.safeString(e,"price"),l=this.safeString(e,"origQty"),u=this.safeString2(e,"cummulativeQuoteQty","cumQuote"),f=this.safeString(e,"orderId");let p=this.safeStringLower(e,"type");const m=this.safeStringLower(e,"side"),g=this.safeList(e,"fills",[]),v=this.safeString(e,"clientOrderId"),y=this.safeString(e,"timeInForce"),w="limit_maker"===p||"GTX"===y||"post_only"===p;"limit_maker"===p&&(p="limit");const b=this.parseNumber(this.omitZero(this.safeString(e,"stopPrice")));return this.safeOrder({info:e,id:f,clientOrderId:v,timestamp:n,datetime:this.iso8601(n),lastTradeTimestamp:d,symbol:r,type:p,timeInForce:y,postOnly:w,side:m,price:c,triggerPrice:b,amount:l,cost:u,average:h,filled:o,remaining:void 0,status:i,fee:void 0,trades:g},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).swap)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports swap orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e);let h,c;const l=t.toUpperCase(),u={side:i.toUpperCase(),type:l};if("LIMIT"===l){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument");u.price=this.priceToPrecision(e,o)}if(d.swap){const t="MARKET"===l,f=this.safeStringLower(n,"timeInForce");this.isPostOnly(t,void 0,n)?u.type="POST_ONLY":"fok"===f?u.type="FOK":"ioc"===f&&(u.type="IOC"),u.contractName=d.id;let p=!0;if([p,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0),t&&"buy"===i&&p){const t=this.safeString(n,"cost");if(n=this.omit(n,"cost"),void 0===o&&void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires the price argument with swap market buy orders to calculate total order cost (amount to spend), where cost = amount * price. Supply a price argument to createOrder() call if you want the cost to be calculated for you from price and amount, or, alternatively, add .options["createMarketBuyOrderRequiresPrice"] = false to supply the cost in the amount argument (the exchange-specific behaviour)');{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r),d=void 0!==t?t:n;u.amount=this.costToPrecision(e,d),u.volume=this.costToPrecision(e,d)}}else u.amount=this.parseToNumeric(s),u.volume=this.parseToNumeric(s);u.positionType=1;const m=this.safeValue2(n,"reduceOnly","reduce_only");u.open=m?"CLOSE":"OPEN";const g=this.safeString(n,"leverage","1");u.leverage=this.parseToNumeric(g),n=this.omit(n,["leverage","reduceOnly","reduce_only","timeInForce"]),d.linear?h=await this.fapiV2PrivatePostOrder(this.extend(u,n)):d.inverse&&(h=await this.dapiV2PrivatePostOrder(this.extend(u,n))),c=this.safeDict(h,"data",{})}else{if(!d.spot)throw new r.NotSupported(this.id+" createOrder only support spot & swap markets");{u.symbol=d.id,u.quantity=this.amountToPrecision(e,s);const i=this.safeValue(d.info,"orderTypes");if(!this.inArray(l,i))throw new r.InvalidOrder(this.id+" "+t+" is not a valid order type in market "+e);const a=this.safeString2(n,"newClientOrderId","clientOrderId");void 0!==a&&(n=this.omit(n,["newClientOrderId","clientOrderId"]),u.newClientOrderId=a);const o=this.safeValue2(n,"triggerPrice","stopPrice");void 0!==o&&(n=this.omit(n,["triggerPrice","stopPrice"]),u.stopPrice=this.priceToPrecision(e,o)),h=await this.spotV1PrivatePostOrder(this.extend(u,n)),c=h}}return this.parseOrder(c,d)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeValue2(i,"origClientOrderId","clientOrderId");let o,n;i=this.omit(i,["origClientOrderId","clientOrderId"]);const d={};if(void 0===a?d.orderId=e:s.swap?d.clientOrderId=a:d.origClientOrderId=a,s.swap)d.contractName=s.id,s.linear?o=await this.fapiV2PrivateGetOrder(this.extend(d,i)):s.inverse&&(o=await this.dapiV2PrivateGetOrder(this.extend(d,i))),n=this.safeDict(o,"data",{});else{if(!s.spot)throw new r.NotSupported(this.id+" fetchOrder only support spot & swap markets");d.orderId=e,d.symbol=s.id,o=await this.spotV1PrivateGetOrder(this.extend(d,i)),n=o}return this.parseOrder(n,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchClosedOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);if(!a.spot)throw new r.NotSupported(this.id+" fetchClosedOrders only support spot markets");const o={symbol:a.id};void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i);const n=await this.spotV1PrivateGetAllOrders(this.extend(o,s));return this.parseOrders(n,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);let o,n;const d={};if(a.swap)d.contractName=a.id,a.linear?o=await this.fapiV2PrivateGetOpenOrders(this.extend(d,s)):a.inverse&&(o=await this.dapiV2PrivateGetOpenOrders(this.extend(d,s))),n=this.safeList(o,"data",[]);else{if(!a.spot)throw new r.NotSupported(this.id+" fetchOpenOrders only support spot & swap markets");d.symbol=a.id,o=await this.spotV1PrivateGetOpenOrders(this.extend(d,s)),n=o}return this.parseOrders(n,a,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeValue2(i,"origClientOrderId","clientOrderId");let o,n;i=this.omit(i,["origClientOrderId","clientOrderId"]);const d={};if(void 0===a?d.orderId=e:s.swap?d.clientOrderId=a:d.origClientOrderId=a,s.swap)d.contractName=s.id,s.linear?o=await this.fapiV2PrivatePostCancel(this.extend(d,i)):s.inverse&&(o=await this.dapiV2PrivatePostCancel(this.extend(d,i))),n=this.safeDict(o,"data",{});else{if(!s.spot)throw new r.NotSupported(this.id+" cancelOrder only support spot & swap markets");d.symbol=s.id,o=await this.spotV1PrivateDeleteOrder(this.extend(d,i)),n=o}return this.parseOrder(n,s)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=this.market(e);let s,a;if(!i.swap)throw new r.NotSupported(this.id+" cancelAllOrders only support future markets");{const e={contractName:i.id};i.linear?s=await this.fapiV2PrivatePostAllOpenOrders(this.extend(e,t)):i.inverse&&(s=await this.dapiV2PrivatePostAllOpenOrders(this.extend(e,t))),a=this.safeList(s,"data",[])}return this.parseOrders(a,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");const a=this.market(e);let o,n;const d={};if(void 0!==t&&(d.startTime=t),void 0!==i&&(i>1e3&&(i=1e3),d.limit=i),a.swap)d.contractName=a.id,a.linear?o=await this.fapiV2PrivateGetMyTrades(this.extend(d,s)):a.inverse&&(o=await this.dapiV2PrivateGetMyTrades(this.extend(d,s))),n=this.safeList(o,"data",[]);else{if(!a.spot)throw new r.NotSupported(this.id+" fetchMyTrades only support spot & swap markets");d.symbol=a.id,o=await this.spotV2PrivateGetMyTrades(this.extend(d,s)),n=o}return this.parseTrades(n,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDeposits() requires a code argument");await this.loadMarkets();const a=this.currency(e),o={coin:a.id,status:1};void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i);const n=await this.spotV1PrivateGetDepositHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchWithdrawals() requires a code argument");await this.loadMarkets();const a=this.currency(e),o={coin:a.id,status:5};void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i);const n=await this.spotV1PrivateGetWithdrawHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a)}parseTransactionStatusByType(e,t=void 0){const i=this.safeDict({deposit:{0:"pending",1:"ok"},withdrawal:{0:"pending",5:"ok",6:"canceled"}},t,{});return this.safeString(i,e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","withdrawId"),s=this.safeString(e,"tagType");let r,a,o=this.safeString(e,"addressTo"),n=this.safeString(e,"addressFrom");if(void 0!==s){if(void 0!==o){const e=o.split("_");o=this.safeString(e,0),r=this.safeString(e,1)}if(void 0!==n){const e=n.split("_");n=this.safeString(e,0),a=this.safeString(e,1)}}const d=this.safeString(e,"txid"),h=this.safeInteger(e,"createdAt"),c=this.safeInteger(e,"updatedAt"),l="payAmount"in e||"ctime"in e?"withdrawal":"deposit",u=this.parseTransactionStatusByType(this.safeString(e,"status"),l),f=this.safeNumber(e,"amount");let p,m=this.safeString2(e,"symbol","coin");if(void 0!==m){const e=m.split("_");m=this.safeString(e,0);const t=this.safeString(e,1);void 0!==t&&(p=t.toUpperCase())}const g=this.safeCurrencyCode(m,t),v=this.safeNumber(e,"fee");let y;return void 0!==v&&(y={currency:g,cost:v}),{info:e,id:i,txid:d,timestamp:h,datetime:this.iso8601(h),network:p,address:o,addressTo:o,addressFrom:n,tag:r,tagTo:r,tagFrom:a,type:l,amount:f,currency:g,status:u,updated:c,internal:!1,comment:void 0,fee:y}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={coin:a.id,amount:t,addressTo:i};let n;[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chainName=this.networkCodeToId(n)),void 0!==s&&(o.tag=s);const d=await this.spotV1PrivatePostWithdrawCommit(this.extend(o,r)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,a)}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"chainDetail",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};if(0!==s)for(let e=0;e<s;e++){const a=i[e],o=this.safeString(a,"chain"),n=this.safeString(t,"code"),d=this.networkIdToCode(o,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(a,"withdrawFee"),percentage:!1}},1===s&&(r.withdraw.fee=this.safeNumber(a,"withdrawFee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotV1PublicGetExchangeInfo(t),s=this.safeList(i,"coins");return this.parseDepositWithdrawFees(s,e,"coin")}parseTransfer(e,t=void 0){const i=this.safeString(e,"transferType");let s,r;if(void 0!==i){const e=i.split("_to_");s=this.safeString(e,0),r=this.safeString(e,1)}const a=this.safeInteger(e,"ctime");return{info:e,id:void 0,timestamp:a,datetime:this.iso8601(a),currency:this.safeString(t,"code"),amount:this.safeNumber(e,"amount"),fromAccount:s,toAccount:r,status:"ok"}}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={transferType:this.safeString2(s,"type","transferType")};let a;void 0!==e&&(a=this.currency(e),r.coinSymbol=a.id),void 0!==t&&(r.beginTime=t),void 0!==i&&(i>200&&(i=200),r.limit=i);const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,"until"),r.endTime=o);const n=await this.fapiV2PrivateGetFuturesTransferHistory(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTransfers(d,a,t,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h={coinSymbol:a.id,amount:this.currencyToPrecision(e,t),transferType:n+"_to_"+d},c=await this.fapiV2PrivatePostFuturesTransfer(this.extend(h,r)),l=this.safeDict(c,"data",{});return this.parseTransfer(l,a)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<1||e>125)throw new r.BadRequest(this.id+" leverage should be between 1 and 125");await this.loadMarkets();const s=this.market(t);let a;const o={contractName:s.id,leverage:e};if(!s.swap)throw new r.NotSupported(this.id+" setLeverage only support swap markets");return s.linear?a=await this.fapiV2PrivatePostLevelEdit(this.extend(o,i)):s.inverse&&(a=await this.dapiV2PrivatePostLevelEdit(this.extend(o,i))),a}parseMarginModification(e,t=void 0){return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:void 0,status:void 0,timestamp:void 0,datetime:void 0}}async setMargin(e,t,i={}){await this.loadMarkets();const s=this.market(e);if(!s.swap)throw new r.NotSupported(this.id+" setMargin only support swap markets");let a;const o={contractName:s.id,amount:this.parseToNumeric(t)};return s.linear?a=await this.fapiV2PrivatePostPositionMargin(this.extend(o,i)):s.inverse&&(a=await this.dapiV2PrivatePostPositionMargin(this.extend(o,i))),this.parseMarginModification(a,s)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeString(t,0),d=this.safeString(t,1),h=this.safeString(t,2);let c;if(c="api"===o&&"kline"===d||"open"===o&&e.indexOf("listenKey")>=0?this.urls.api[o]:this.urls.api[o]+"/"+d,c=c+"/"+this.implodeParams(e,s),s=this.omit(s,this.extractParams(e)),"private"===h){this.checkRequiredCredentials();const t=this.safeInteger(this.options,"recvWindow",5e3);if("spot"===o||"open"===o){let e=this.urlencode(this.extend({timestamp:this.nonce(),recvWindow:t},s));e+="&signature="+this.hmac(this.encode(e),this.encode(this.secret),n.s),r={"X-MBX-APIKEY":this.apiKey},"GET"===i||"DELETE"===i?c+="?"+e:(a=e,r["Content-Type"]="application/x-www-form-urlencoded")}else{const h=this.nonce().toString();let l;"fapi"===o?l="/fapi":"dapi"===o&&(l="/dapi"),l=l+"/"+d+"/"+e;let u=h+i+l;if("GET"===i){Object.keys(s).length>0&&(u+="?"+this.urlencode(s));const e=this.hmac(this.encode(u),this.encode(this.secret),n.s);r={"X-CH-APIKEY":this.apiKey,"X-CH-SIGN":e,"X-CH-TS":h},c+="?"+this.urlencode(s)}else{const e=this.extend({recvWindow:t},s);u+=a=this.json(e);const i=this.hmac(this.encode(u),this.encode(this.secret),n.s);r={"Content-Type":"application/json","X-CH-APIKEY":this.apiKey,"X-CH-SIGN":i,"X-CH-TS":h}}}}else Object.keys(s).length&&(c+="?"+this.urlencode(s));return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,o,n,d,h,c){if(418===e||429===e)throw new r.DDoSProtection(this.id+" "+e.toString()+" "+t+" "+n);if(e>=400){if(n.indexOf("Price * QTY is zero or less")>=0)throw new r.InvalidOrder(this.id+" order cost = amount * price is zero or less "+n);if(n.indexOf("LOT_SIZE")>=0)throw new r.InvalidOrder(this.id+" order amount should be evenly divisible by lot size "+n);if(n.indexOf("PRICE_FILTER")>=0)throw new r.InvalidOrder(this.id+" order price is invalid, i.e. exceeds allowed price precision, exceeds min price or max price limits or is invalid float value in general, use this.priceToPrecision (symbol, amount) "+n)}if(void 0===d)return;const l=this.safeBool(d,"success",!0);if(!l){const e=this.safeString(d,"msg");let t;if(void 0!==e){try{t=JSON.parse(e)}catch(e){t=void 0}void 0!==t&&(d=t)}}const u=this.safeString(d,"msg");void 0!==u&&(this.throwExactlyMatchedException(this.exceptions.exact,u,this.id+" "+u),this.throwBroadlyMatchedException(this.exceptions.broad,u,this.id+" "+u));const f=this.safeString(d,"code");if(void 0!==f){if("200"===f||a.Y.stringEquals(f,"0"))return;if("-2015"===f&&this.options.hasAlreadyAuthenticatedSuccessfully)throw new r.DDoSProtection(this.id+" temporary banned: "+n);const e=this.id+" "+n;throw this.throwExactlyMatchedException(this.exceptions.exact,f,e),new r.ExchangeError(e)}if(!l)throw new r.ExchangeError(this.id+" "+n)}calculateRateLimiterCost(e,t,i,s,r={}){if("noSymbol"in r&&!("symbol"in s))return r.noSymbol;if("byLimit"in r&&"limit"in s){const e=s.limit,t=r.byLimit;for(let i=0;i<t.length;i++){const s=t[i];if(e<=s[0])return s[1]}}return this.safeValue(r,"cost",1)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitso",name:"Bitso",countries:["MX"],rateLimit:2e3,version:"v3",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!1,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFee:!1,fetchTransactionFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},urls:{logo:"https://github.com/user-attachments/assets/178c8e56-9054-4107-b192-5e5053d4f975",api:{rest:"https://bitso.com/api"},test:{rest:"https://stage.bitso.com/api"},www:"https://bitso.com",doc:"https://bitso.com/api_info",fees:"https://bitso.com/fees",referral:"https://bitso.com/?ref=itej"},precisionMode:o.kb,options:{precision:{XRP:1e-6,MXN:.01,TUSD:.01},defaultPrecision:1e-8,networks:{TRC20:"trx",ERC20:"erc20",BEP20:"bsc",BEP2:"bep2"}},timeframes:{"1m":"60","5m":"300","15m":"900","30m":"1800","1h":"3600","4h":"14400","12h":"43200","1d":"86400","1w":"604800"},api:{public:{get:["available_books","ticker","order_book","trades","ohlc"]},private:{get:["account_status","balance","fees","fundings","fundings/{fid}","funding_destination","kyc_documents","ledger","ledger/trades","ledger/fees","ledger/fundings","ledger/withdrawals","mx_bank_codes","open_orders","order_trades/{oid}","orders/{oid}","user_trades","user_trades/{tid}","withdrawals/","withdrawals/{wid}"],post:["bitcoin_withdrawal","debit_card_withdrawal","ether_withdrawal","orders","phone_number","phone_verification","phone_withdrawal","spei_withdrawal","ripple_withdrawal","bcash_withdrawal","litecoin_withdrawal"],delete:["orders","orders/{oid}","orders/all"]}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:300}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{"0201":r.AuthenticationError,104:r.InvalidNonce,"0304":r.BadRequest}})}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const r={};void 0!==i&&(r.limit=i);const a=await this.privateGetLedger(this.extend(r,s)),o=this.safeValue(a,"payload",[]),n=this.safeCurrency(e);return this.parseLedger(o,n,t,i)}parseLedgerEntryType(e){return this.safeString({funding:"transaction",withdrawal:"transaction",trade:"trade",fee:"fee"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"operation"),s=this.parseLedgerEntryType(i),r=this.safeValue(e,"balance_updates",[]),o=this.safeValue(r,0,{});let n,d;const h=this.safeString(o,"amount"),c=this.safeString(o,"currency"),l=this.safeCurrencyCode(c,t);t=this.safeCurrency(c,t);const u=this.safeValue(e,"details",{});let f=this.safeString2(u,"fid","wid");if(void 0===f&&(f=this.safeString(u,"tid")),"funding"===i)n="in";else if("withdrawal"===i)n="out";else if("trade"===i)n=void 0;else if("fee"===i){n="out";d={cost:a.Y.stringAbs(h),currency:t}}const p=this.parse8601(this.safeString(e,"created_at"));return this.safeLedgerEntry({info:e,id:this.safeString(e,"eid"),direction:n,account:void 0,referenceId:f,referenceAccount:void 0,type:s,currency:l,amount:h,timestamp:p,datetime:this.iso8601(p),before:void 0,after:void 0,status:"ok",fee:d},t)}async fetchMarkets(e={}){const t=await this.publicGetAvailableBooks(e),i=this.safeValue(t,"payload",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"book"),[o,n]=r.split("_");let d=o.toUpperCase(),h=n.toUpperCase();d=this.safeCurrencyCode(d),h=this.safeCurrencyCode(h);const c=this.safeValue(t,"fees",{}),l=this.safeValue(c,"flat_rate",{}),u=this.safeString(l,"taker"),f=this.safeString(l,"maker"),p=this.parseNumber(a.Y.stringDiv(u,"100")),m=this.parseNumber(a.Y.stringDiv(f,"100")),g=this.safeValue(c,"structure",[]),v={taker:p,maker:m,percentage:!0,tierBased:!0},y=[],w=[];for(let e=0;e<g.length;e++){const t=g[e],i=this.safeNumber(t,"volume"),s=this.safeNumber(t,"taker"),r=this.safeNumber(t,"maker");y.push([i,s]),w.push([i,r]),0===e&&(v.taker=s,v.maker=r)}const b={taker:y,maker:w};v.tiers=b;const k=this.safeNumber(this.options.precision,h,this.options.defaultPrecision);s.push(this.extend({id:r,symbol:d+"/"+h,base:d,quote:h,settle:void 0,baseId:o,quoteId:n,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,taker:p,maker:m,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(this.options.precision,d,this.options.defaultPrecision),price:this.safeNumber(t,"tick_size",k)},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minimum_amount"),max:this.safeNumber(t,"maximum_amount")},price:{min:this.safeNumber(t,"minimum_price"),max:this.safeNumber(t,"maximum_price")},cost:{min:this.safeNumber(t,"minimum_value"),max:this.safeNumber(t,"maximum_value")}},created:void 0,info:t},v))}return s}parseBalance(e){const t=this.safeValue(e,"payload",{}),i=this.safeValue(t,"balances",[]),s={info:e,timestamp:void 0,datetime:void 0};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"available"),o.used=this.safeString(t,"locked"),o.total=this.safeString(t,"total"),s[a]=o}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={book:s.id},a=await this.publicGetOrderBook(this.extend(r,i)),o=this.safeValue(a,"payload"),n=this.parse8601(this.safeString(o,"updated_at"));return this.parseOrderBook(o,s.symbol,n,"bids","asks","price","amount")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.parse8601(this.safeString(e,"created_at")),r=this.safeString(e,"vwap"),o=this.safeString(e,"volume"),n=a.Y.stringMul(o,r),d=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:r,open:void 0,close:d,last:d,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={book:i.id},r=await this.publicGetTicker(this.extend(s,t)),a=this.safeValue(r,"payload");return this.parseTicker(a,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={book:a.id,time_bucket:this.safeString(this.timeframes,t,t)};if(void 0!==i){if(o.start=i,void 0!==s){const e=this.parseTimeframe(t);o.end=this.sum(i,e*s*1e3)}}else if(void 0!==s){const e=this.milliseconds();o.end=e,o.start=e-1e3*this.parseTimeframe(t)*s}const n=await this.publicGetOhlc(this.extend(o,r)),d=this.safeList(n,"payload",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"bucket_start_time"),this.safeNumber(e,"first_rate"),this.safeNumber(e,"max_rate"),this.safeNumber(e,"min_rate"),this.safeNumber(e,"last_rate"),this.safeNumber(e,"volume")]}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString(e,"created_at")),s=this.safeString(e,"book"),r=this.safeSymbol(s,t,"_");let o=this.safeString(e,"side");const n=this.safeString(e,"maker_side");let d;void 0!==o?d=o===n?"maker":"taker":o="buy"===n?"sell":"buy";let h,c=this.safeString2(e,"amount","major");void 0!==c&&(c=a.Y.stringAbs(c));const l=this.safeString(e,"fees_amount");if(void 0!==l){const t=this.safeString(e,"fees_currency");h={cost:l,currency:this.safeCurrencyCode(t)}}let u=this.safeString(e,"minor");void 0!==u&&(u=a.Y.stringAbs(u));const f=this.safeString(e,"price"),p=this.safeString(e,"oid"),m=this.safeString(e,"tid");return this.safeTrade({id:m,info:e,timestamp:i,datetime:this.iso8601(i),symbol:r,order:p,type:void 0,side:o,takerOrMaker:d,price:f,amount:c,cost:u,fee:h},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={book:r.id},o=await this.publicGetTrades(this.extend(a,s));return this.parseTrades(o.payload,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetFees(e),i=this.safeValue(t,"payload",{}),s=this.safeValue(i,"fees",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"book"),a=this.safeSymbol(i,void 0,"_");r[a]={info:t,symbol:a,maker:this.safeNumber(t,"maker_fee_decimal"),taker:this.safeNumber(t,"taker_fee_decimal"),percentage:!0,tierBased:!0}}return r}async fetchMyTrades(e=void 0,t=void 0,i=25,s={}){await this.loadMarkets();const a=this.market(e),o="marker"in s;if(void 0!==t&&!o)throw new r.ExchangeError(this.id+" fetchMyTrades() does not support fetching trades starting from a timestamp with the `since` argument, use the `marker` extra param to filter starting from an integer trade id");o&&(s=this.extend(s,{marker:parseInt(s.marker)}));const n={book:a.id,limit:i},d=await this.privateGetUserTrades(this.extend(n,s));return this.parseTrades(d.payload,a,t,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={book:o.id,side:i,type:t,major:this.amountToPrecision(o.symbol,s)};"limit"===t&&(n.price=this.priceToPrecision(o.symbol,r));const d=await this.privatePostOrders(this.extend(n,a)),h=this.safeString(d.payload,"oid");return this.safeOrder({info:d,id:h},o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={oid:e},r=await this.privateDeleteOrdersOid(this.extend(s,i)),a=this.safeList(r,"payload",[]),o=this.safeString(a,0);return this.safeOrder({info:r,id:o})}async cancelOrders(e,t=void 0,i={}){if(!Array.isArray(e))throw new r.ArgumentsRequired(this.id+" cancelOrders() ids argument should be an array");let s;void 0!==t&&(s=this.market(t));const a={oids:e.join(",")},o=await this.privateDeleteOrders(this.extend(a,i)),n=this.safeValue(o,"payload",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e];d.push(this.parseOrder(t,s))}return d}async cancelAllOrders(e=void 0,t={}){if(void 0!==e)throw new r.NotSupported(this.id+" cancelAllOrders() deletes all orders for user, it does not support filtering by symbol.");const i=await this.privateDeleteOrdersAll(t),s=this.safeValue(i,"payload",[]),a=[];for(let e=0;e<s.length;e++){const t=this.parseOrder(s[e]);a.push(t)}return a}parseOrderStatus(e){return this.safeString({"partial-fill":"open","partially filled":"open",queued:"open",completed:"closed"},e,e)}parseOrder(e,t=void 0){let i;i="string"==typeof e?e:this.safeString(e,"oid");const s=this.safeString(e,"side"),r=this.parseOrderStatus(this.safeString(e,"status")),a=this.safeString(e,"book"),o=this.safeSymbol(a,t,"_"),n=this.safeString(e,"type"),d=this.parse8601(this.safeString(e,"created_at")),h=this.safeString(e,"price"),c=this.safeString(e,"original_amount"),l=this.safeString(e,"unfilled_amount"),u=this.safeString(e,"client_id");return this.safeOrder({info:e,id:i,clientOrderId:u,timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:void 0,symbol:o,type:n,timeInForce:void 0,postOnly:void 0,side:s,price:h,triggerPrice:void 0,amount:c,cost:void 0,remaining:l,filled:void 0,status:r,fee:void 0,average:void 0,trades:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=25,s={}){await this.loadMarkets();const a=this.market(e),o="marker"in s;if(void 0!==t&&!o)throw new r.ExchangeError(this.id+" fetchOpenOrders() does not support fetching orders starting from a timestamp with the `since` argument, use the `marker` extra param to filter starting from an integer trade id");o&&(s=this.extend(s,{marker:parseInt(s.marker)}));const n={book:a.id,limit:i},d=await this.privateGetOpenOrders(this.extend(n,s));return this.parseOrders(d.payload,a,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privateGetOrdersOid({oid:e}),a=this.safeValue(s,"payload");if(Array.isArray(a)){if(1===s.payload.length)return this.parseOrder(a[0])}throw new r.OrderNotFound(this.id+": The order "+e+" not found.")}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(t),o={oid:e},n=await this.privateGetOrderTradesOid(this.extend(o,r));return this.parseTrades(n.payload,a)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={fid:e},r=await this.privateGetFundingsFid(this.extend(s,i)),a=this.safeValue(r,"payload",[]),o=this.safeDict(a,0,{});return this.parseTransaction(o)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a=await this.privateGetFundings(s),o=this.safeList(a,"payload",[]);return this.parseTransactions(o,r,t,i,s)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={fund_currency:this.currency(e).id},s=await this.privateGetFundingDestination(this.extend(i,t));let r,a=this.safeString(s.payload,"account_identifier");if(a.indexOf("?dt=")>=0){const e=a.split("?dt=");a=this.safeString(e,0),r=this.safeString(e,1)}return this.checkAddress(a),{info:s,currency:e,network:void 0,address:a,tag:r}}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetFees(t),s={},r=this.safeValue(i,"payload",{}),a=this.safeValue(r,"deposit_fees",[]);for(let t=0;t<a.length;t++){const i=a[t],r=this.safeString(i,"currency"),o=this.safeCurrencyCode(r);(void 0===e||this.inArray(o,e))&&(s[o]={deposit:this.safeNumber(i,"fee"),withdraw:void 0,info:{deposit:i,withdraw:void 0}})}const o=this.safeValue(r,"withdrawal_fees",[]),n=Object.keys(o);for(let t=0;t<n.length;t++){const i=n[t],r=this.safeCurrencyCode(i);(void 0===e||this.inArray(r,e))&&(s[r]={deposit:this.safeValue(s[r],"deposit"),withdraw:this.safeNumber(o,i),info:{deposit:this.safeValue(s[r].info,"deposit"),withdraw:this.safeNumber(o,i)}})}return s}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetFees(t),s=this.safeList(i,"payload",[]);return this.parseDepositWithdrawFees(s,e)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={},r=this.safeValue(e,"deposit_fees",[]),a=this.safeValue(e,"withdrawal_fees",[]);for(let e=0;e<r.length;e++){const i=r[e],a=this.safeString(i,"currency"),o=this.safeCurrencyCode(a);(void 0===t||o in t)&&(s[o]={deposit:{fee:this.safeNumber(i,"fee"),percentage:!this.safeValue(i,"is_fixed")},withdraw:{fee:void 0,percentage:void 0},networks:{},info:i})}const o=Object.keys(a);for(let e=0;e<o.length;e++){const i=o[e],r=this.safeCurrencyCode(i);if(void 0===t||r in t){const e=this.parseNumber(a[i]);void 0===this.safeValue(s,r)&&(s[r]=this.depositWithdrawFee({})),s[r].withdraw.fee=e,s[r].info[r]=e}}return s}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o={BTC:"Bitcoin",ETH:"Ether",XRP:"Ripple",BCH:"Bcash",LTC:"Litecoin"},n=this.currency(e),d=e in o?o[e]:void 0;if(void 0===d)throw new r.ExchangeError(this.id+" not valid withdraw coin: "+e);const h={amount:t,address:i,destination_tag:s},c="privatePost"+d+"Withdrawal",l=await this[c](this.extend(h,a)),u=this.safeValue(l,"payload",[]),f=this.safeDict(u,0);return this.parseTransaction(f,n)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"currency","asset");t=this.safeCurrency(i,t);const s=this.safeValue(e,"details",{}),r=this.safeString(e,"created_at"),a=this.safeString(s,"withdrawal_address"),o=this.safeString(s,"receiving_address"),n=this.safeString2(e,"network","method"),d=this.safeString(e,"status"),h=this.safeString(e,"wid"),c=this.networkIdToCode(n),l=void 0!==c?c.toUpperCase():void 0;return{id:this.safeString2(e,"wid","fid"),txid:this.safeString(s,"tx_hash"),timestamp:this.parse8601(r),datetime:r,network:l,addressFrom:o,address:void 0!==a?a:o,addressTo:a,amount:this.safeNumber(e,"amount"),type:void 0===h?"deposit":"withdrawal",currency:this.safeCurrencyCode(i,t),status:this.parseTransactionStatus(d),updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:void 0,info:e}}parseTransactionStatus(e){return this.safeString({pending:"pending",in_progress:"pending",complete:"ok",failed:"failed"},e,e)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.version+"/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));"GET"!==i&&"DELETE"!==i||Object.keys(d).length&&(o+="?"+this.urlencode(d));const h=this.urls.api.rest+o;if("private"===t){this.checkRequiredCredentials();const e=this.nonce().toString();o="/api"+o;let t=[e,i,o].join("");"GET"!==i&&"DELETE"!==i&&Object.keys(d).length&&(t+=a=this.json(d));const s=this.hmac(this.encode(t),this.encode(this.secret),n.s);r={Authorization:"Bitso "+(this.apiKey+":"+e+":"+s)}}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&"success"in n){let e=this.safeBool(n,"success",!1);if("string"==typeof e&&(e="true"===e||"1"===e),!e){const e=this.id+" "+this.json(n),t=this.safeValue(n,"error");if(void 0===t)throw new r.ExchangeError(e);const i=this.safeString(t,"code");throw this.throwExactlyMatchedException(this.exceptions,i,e),new r.ExchangeError(e)}}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitstamp",name:"Bitstamp",countries:["GB"],rateLimit:75,version:"v2",userAgent:this.userAgents.chrome,pro:!0,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactionFees:!0,fetchTransactions:"emulated",fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!0,withdraw:!0},urls:{logo:"https://github.com/user-attachments/assets/d5480572-1fee-43cb-b900-d38c522d0024",api:{public:"https://www.bitstamp.net/api",private:"https://www.bitstamp.net/api"},www:"https://www.bitstamp.net",doc:"https://www.bitstamp.net/api"},timeframes:{"1m":"60","3m":"180","5m":"300","15m":"900","30m":"1800","1h":"3600","2h":"7200","4h":"14400","6h":"21600","12h":"43200","1d":"86400","1w":"259200"},requiredCredentials:{apiKey:!0,secret:!0},api:{public:{get:{"ohlc/{pair}/":1,"order_book/{pair}/":1,"ticker/":1,"ticker_hour/{pair}/":1,"ticker/{pair}/":1,"transactions/{pair}/":1,"trading-pairs-info/":1,"currencies/":1,"eur_usd/":1,"travel_rule/vasps/":1}},private:{get:{"travel_rule/contacts/":1,"contacts/{contact_uuid}/":1,"earn/subscriptions/":1,"earn/transactions/":1},post:{"account_balances/":1,"account_balances/{currency}/":1,"balance/":1,"balance/{pair}/":1,"bch_withdrawal/":1,"bch_address/":1,"user_transactions/":1,"user_transactions/{pair}/":1,"crypto-transactions/":1,open_order:1,"open_orders/all/":1,"open_orders/{pair}/":1,"order_status/":1,"cancel_order/":1,"cancel_all_orders/":1,"cancel_all_orders/{pair}/":1,"buy/{pair}/":1,"buy/market/{pair}/":1,"buy/instant/{pair}/":1,"sell/{pair}/":1,"sell/market/{pair}/":1,"sell/instant/{pair}/":1,"transfer-to-main/":1,"transfer-from-main/":1,"my_trading_pairs/":1,"fees/trading/":1,"fees/trading/{market_symbol}":1,"fees/withdrawal/":1,"fees/withdrawal/{currency}/":1,"withdrawal-requests/":1,"withdrawal/open/":1,"withdrawal/status/":1,"withdrawal/cancel/":1,"liquidation_address/new/":1,"liquidation_address/info/":1,"btc_unconfirmed/":1,"websockets_token/":1,"btc_withdrawal/":1,"btc_address/":1,"ripple_withdrawal/":1,"ripple_address/":1,"ltc_withdrawal/":1,"ltc_address/":1,"eth_withdrawal/":1,"eth_address/":1,"xrp_withdrawal/":1,"xrp_address/":1,"xlm_withdrawal/":1,"xlm_address/":1,"pax_withdrawal/":1,"pax_address/":1,"link_withdrawal/":1,"link_address/":1,"usdc_withdrawal/":1,"usdc_address/":1,"omg_withdrawal/":1,"omg_address/":1,"dai_withdrawal/":1,"dai_address/":1,"knc_withdrawal/":1,"knc_address/":1,"mkr_withdrawal/":1,"mkr_address/":1,"zrx_withdrawal/":1,"zrx_address/":1,"gusd_withdrawal/":1,"gusd_address/":1,"aave_withdrawal/":1,"aave_address/":1,"bat_withdrawal/":1,"bat_address/":1,"uma_withdrawal/":1,"uma_address/":1,"snx_withdrawal/":1,"snx_address/":1,"uni_withdrawal/":1,"uni_address/":1,"yfi_withdrawal/":1,"yfi_address/":1,"audio_withdrawal/":1,"audio_address/":1,"crv_withdrawal/":1,"crv_address/":1,"algo_withdrawal/":1,"algo_address/":1,"comp_withdrawal/":1,"comp_address/":1,"grt_withdrawal/":1,"grt_address/":1,"usdt_withdrawal/":1,"usdt_address/":1,"eurt_withdrawal/":1,"eurt_address/":1,"matic_withdrawal/":1,"matic_address/":1,"sushi_withdrawal/":1,"sushi_address/":1,"chz_withdrawal/":1,"chz_address/":1,"enj_withdrawal/":1,"enj_address/":1,"alpha_withdrawal/":1,"alpha_address/":1,"ftt_withdrawal/":1,"ftt_address/":1,"storj_withdrawal/":1,"storj_address/":1,"axs_withdrawal/":1,"axs_address/":1,"sand_withdrawal/":1,"sand_address/":1,"hbar_withdrawal/":1,"hbar_address/":1,"rgt_withdrawal/":1,"rgt_address/":1,"fet_withdrawal/":1,"fet_address/":1,"skl_withdrawal/":1,"skl_address/":1,"cel_withdrawal/":1,"cel_address/":1,"sxp_withdrawal/":1,"sxp_address/":1,"ada_withdrawal/":1,"ada_address/":1,"slp_withdrawal/":1,"slp_address/":1,"ftm_withdrawal/":1,"ftm_address/":1,"perp_withdrawal/":1,"perp_address/":1,"dydx_withdrawal/":1,"dydx_address/":1,"gala_withdrawal/":1,"gala_address/":1,"shib_withdrawal/":1,"shib_address/":1,"amp_withdrawal/":1,"amp_address/":1,"sgb_withdrawal/":1,"sgb_address/":1,"avax_withdrawal/":1,"avax_address/":1,"wbtc_withdrawal/":1,"wbtc_address/":1,"ctsi_withdrawal/":1,"ctsi_address/":1,"cvx_withdrawal/":1,"cvx_address/":1,"imx_withdrawal/":1,"imx_address/":1,"nexo_withdrawal/":1,"nexo_address/":1,"ust_withdrawal/":1,"ust_address/":1,"ant_withdrawal/":1,"ant_address/":1,"gods_withdrawal/":1,"gods_address/":1,"rad_withdrawal/":1,"rad_address/":1,"band_withdrawal/":1,"band_address/":1,"inj_withdrawal/":1,"inj_address/":1,"rly_withdrawal/":1,"rly_address/":1,"rndr_withdrawal/":1,"rndr_address/":1,"vega_withdrawal/":1,"vega_address/":1,"1inch_withdrawal/":1,"1inch_address/":1,"ens_withdrawal/":1,"ens_address/":1,"mana_withdrawal/":1,"mana_address/":1,"lrc_withdrawal/":1,"lrc_address/":1,"ape_withdrawal/":1,"ape_address/":1,"mpl_withdrawal/":1,"mpl_address/":1,"euroc_withdrawal/":1,"euroc_address/":1,"sol_withdrawal/":1,"sol_address/":1,"dot_withdrawal/":1,"dot_address/":1,"near_withdrawal/":1,"near_address/":1,"doge_withdrawal/":1,"doge_address/":1,"flr_withdrawal/":1,"flr_address/":1,"dgld_withdrawal/":1,"dgld_address/":1,"ldo_withdrawal/":1,"ldo_address/":1,"travel_rule/contacts/":1,"earn/subscribe/":1,"earn/subscriptions/setting/":1,"earn/unsubscribe":1,"wecan_withdrawal/":1,"wecan_address/":1,"trac_withdrawal/":1,"trac_address/":1,"eurcv_withdrawal/":1,"eurcv_address/":1,"pyusd_withdrawal/":1,"pyusd_address/":1,"lmwr_withdrawal/":1,"lmwr_address/":1,"pepe_withdrawal/":1,"pepe_address/":1,"blur_withdrawal/":1,"blur_address/":1,"vext_withdrawal/":1,"vext_address/":1,"cspr_withdrawal/":1,"cspr_address/":1,"vchf_withdrawal/":1,"vchf_address/":1,"veur_withdrawal/":1,"veur_address/":1,"truf_withdrawal/":1,"truf_address/":1,"wif_withdrawal/":1,"wif_address/":1,"smt_withdrawal/":1,"smt_address/":1,"sui_withdrawal/":1,"sui_address/":1,"jup_withdrawal/":1,"jup_address/":1,"ondo_withdrawal/":1,"ondo_address/":1,"boba_withdrawal/":1,"boba_address/":1,"pyth_withdrawal/":1,"pyth_address/":1}}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.004"),maker:this.parseNumber("0.004"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("10000"),this.parseNumber("0.003")],[this.parseNumber("100000"),this.parseNumber("0.002")],[this.parseNumber("500000"),this.parseNumber("0.0018")],[this.parseNumber("1500000"),this.parseNumber("0.0016")],[this.parseNumber("5000000"),this.parseNumber("0.0012")],[this.parseNumber("20000000"),this.parseNumber("0.001")],[this.parseNumber("50000000"),this.parseNumber("0.0008")],[this.parseNumber("100000000"),this.parseNumber("0.0006")],[this.parseNumber("250000000"),this.parseNumber("0.0005")],[this.parseNumber("1000000000"),this.parseNumber("0.0003")]],maker:[[this.parseNumber("0"),this.parseNumber("0.003")],[this.parseNumber("10000"),this.parseNumber("0.002")],[this.parseNumber("100000"),this.parseNumber("0.001")],[this.parseNumber("500000"),this.parseNumber("0.0008")],[this.parseNumber("1500000"),this.parseNumber("0.0006")],[this.parseNumber("5000000"),this.parseNumber("0.0003")],[this.parseNumber("20000000"),this.parseNumber("0.002")],[this.parseNumber("50000000"),this.parseNumber("0.0001")],[this.parseNumber("100000000"),this.parseNumber("0")],[this.parseNumber("250000000"),this.parseNumber("0")],[this.parseNumber("1000000000"),this.parseNumber("0")]]}},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{BTC:0,BCH:0,LTC:0,ETH:0,XRP:0,XLM:0,PAX:0,USD:7.5,EUR:0}}},precisionMode:o.kb,commonCurrencies:{UST:"USTC"},options:{networksById:{"bitcoin-cash":"BCH",bitcoin:"BTC",ethereum:"ERC20",litecoin:"LTC",stellar:"XLM",xrpl:"XRP",tron:"TRC20",algorand:"ALGO",flare:"FLR",hedera:"HBAR",cardana:"ADA",songbird:"FLR","avalanche-c-chain":"AVAX",solana:"SOL",polkadot:"DOT",near:"NEAR",doge:"DOGE",sui:"SUI",casper:"CSRP"}},exceptions:{exact:{"No permission found":r.PermissionDenied,"API key not found":r.AuthenticationError,"IP address not allowed":r.PermissionDenied,"Invalid nonce":r.InvalidNonce,"Invalid signature":r.AuthenticationError,"Authentication failed":r.AuthenticationError,"Missing key, signature and nonce parameters":r.AuthenticationError,"Wrong API key format":r.AuthenticationError,"Your account is frozen":r.PermissionDenied,"Please update your profile with your FATCA information, before using API.":r.PermissionDenied,"Order not found.":r.OrderNotFound,"Price is more than 20% below market price.":r.InvalidOrder,"Bitstamp.net is under scheduled maintenance. We'll be back soon.":r.OnMaintenance,"Order could not be placed.":r.ExchangeNotAvailable,"Invalid offset.":r.BadRequest},broad:{"Minimum order size is":r.InvalidOrder,"Check your account balance for details.":r.InsufficientFunds,"Ensure this value has at least":r.InvalidAddress,"Ensure that there are no more than":r.InvalidOrder}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:void 0,untilDays:30,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchMarkets(e={}){const t=await this.fetchMarketsFromCache(e),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"name");let[a,o]=r.split("/");const n=a.toLowerCase(),d=o.toLowerCase();a=this.safeCurrencyCode(a),o=this.safeCurrencyCode(o);const h=this.safeString(s,"minimum_order").split(" "),c=this.safeString(s,"trading");i.push({id:this.safeString(s,"url_symbol"),marketId:n+"_"+d,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,future:!1,swap:!1,option:!1,active:"Enabled"===c,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(s,"base_decimals"))),price:this.parseNumber(this.parsePrecision(this.safeString(s,"counter_decimals")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(h,0),max:void 0}},created:void 0,info:s})}return i}constructCurrencyObject(e,t,i,s,r,a){let o="crypto";const n=this.describe();this.isFiat(t)&&(o="fiat");const d=this.parseNumber(this.parsePrecision(this.numberToString(s)));return{id:e,code:t,info:a,type:o,name:i,active:!0,deposit:void 0,withdraw:void 0,fee:this.safeNumber(n.fees.funding.withdraw,t),precision:d,limits:{amount:{min:d,max:void 0},price:{min:d,max:void 0},cost:{min:r,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}}}async fetchMarketsFromCache(e={}){const t=this.safeValue(this.options,"fetchMarkets",{}),i=this.safeInteger(t,"timestamp"),s=this.safeInteger(t,"expires",1e3),r=this.milliseconds();if(void 0===i||r-i>s){const i=await this.publicGetTradingPairsInfo(e);this.options.fetchMarkets=this.extend(t,{response:i,timestamp:r})}return this.safeValue(this.options.fetchMarkets,"response")}async fetchCurrencies(e={}){const t=await this.fetchMarketsFromCache(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"name");let[a,o]=r.split("/");const n=a.toLowerCase(),d=o.toLowerCase();a=this.safeCurrencyCode(a),o=this.safeCurrencyCode(o);const h=this.safeString(s,"description"),[c,l]=h.split(" / "),u=this.safeString(s,"minimum_order").split(" ")[0];if(!(a in i)){const e=this.safeInteger(s,"base_decimals");i[a]=this.constructCurrencyObject(n,a,c,e,void 0,s)}if(!(o in i)){const e=this.safeInteger(s,"counter_decimals");i[o]=this.constructCurrencyObject(d,o,l,e,this.parseNumber(u),s)}}return i}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id},a=await this.publicGetOrderBookPair(this.extend(r,i)),o=this.safeInteger(a,"microtimestamp"),n=this.parseToInt(o/1e3),d=this.parseOrderBook(a,s.symbol,n);return d.nonce=o,d}parseTicker(e,t=void 0){const i=this.safeString(e,"pair"),s=this.safeSymbol(i,t,void 0),r=this.safeTimestamp(e,"timestamp"),o=this.safeString(e,"vwap"),n=this.safeString(e,"volume"),d=a.Y.stringMul(n,o),h=this.safeString(e,"last");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:o,open:this.safeString(e,"open"),close:h,last:h,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:n,quoteVolume:d,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTickerPair(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTicker(t);return this.parseTickers(i,e)}getCurrencyIdFromTransaction(e){const t=this.safeStringLower(e,"currency");if(void 0!==t)return t;e=this.omit(e,["fee","price","datetime","type","status","id"]);const i=Object.keys(e);for(let t=0;t<i.length;t++){const s=i[t];if(s.indexOf("_")<0){const t=this.safeInteger(e,s);if(void 0!==t&&0!==t)return s}}}getMarketFromTrade(e){e=this.omit(e,["fee","price","datetime","tid","type","order_id","side"]);const t=Object.keys(e),i=t.length;if(i>2)throw new r.ExchangeError(this.id+" getMarketFromTrade() too many keys: "+this.json(t)+" in the trade: "+this.json(e));if(2===i){let e=t[0]+t[1];if(e in this.markets_by_id)return this.safeMarket(e);if(e=t[1]+t[0],e in this.markets_by_id)return this.safeMarket(e)}}parseTrade(e,t=void 0){const i=this.safeString2(e,"id","tid");let s,r,o=this.safeString(e,"price"),n=this.safeString(e,"amount");const d=this.safeString(e,"order_id");let h,c=this.safeString(e,"cost");if(void 0===t){const i=Object.keys(e);for(let e=0;e<i.length;e++){const s=i[e];"order_id"!==s&&s.indexOf("_")>=0&&(h=s,t=this.safeMarket(h,t,"_"))}}void 0===t&&(t=this.getMarketFromTrade(e));const l=this.safeString(e,"fee"),u=t.quote,f=void 0!==h?h:t.marketId;o=this.safeString(e,f,o),n=this.safeString(e,t.baseId,n),c=this.safeString(e,t.quoteId,c),s=t.symbol;const p=this.safeString2(e,"date","datetime");let m,g;if(void 0!==p&&(p.indexOf(" ")>=0?m=this.parse8601(p):(m=parseInt(p),m*=1e3)),"id"in e){if(void 0!==n){a.Y.stringLt(n,"0")?(r="sell",n=a.Y.stringNeg(n)):r="buy"}}else r=this.safeString(e,"type"),r="1"===r?"sell":"0"===r?"buy":void 0;return void 0!==c&&(c=a.Y.stringAbs(c)),void 0!==l&&(g={cost:l,currency:u}),this.safeTrade({id:i,info:e,timestamp:m,datetime:this.iso8601(m),symbol:s,order:d,type:undefined,side:r,takerOrMaker:void 0,price:o,amount:n,cost:c,fee:g},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id,time:"hour"},o=await this.publicGetTransactionsPair(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={pair:a.id,step:this.safeString(this.timeframes,t,t)},n=this.parseTimeframe(t);if(void 0===s)if(void 0===i)o.limit=1e3;else{s=1e3;const e=this.parseToInt(i/1e3);o.start=e,o.end=this.sum(e,n*(s-1)),o.limit=s}else{if(void 0!==i){const e=this.parseToInt(i/1e3);o.start=e,o.end=this.sum(e,n*(s-1))}o.limit=Math.min(s,1e3)}const d=await this.publicGetOhlcPair(this.extend(o,r)),h=this.safeValue(d,"data",{}),c=this.safeList(h,"ohlc",[]);return this.parseOHLCVs(c,a,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};void 0===e&&(e=[]);for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"reserved"),o.total=this.safeString(s,"total"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostAccountBalances(e);return this.parseBalance(t)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={market_symbol:i.id},r=await this.privatePostFeesTrading(this.extend(s,t)),a=this.indexBy(r,"currency_pair"),o=this.safeDict(a,i.id);return this.parseTradingFee(o,i)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeDict(e,"fees",{});return{info:e,symbol:this.safeSymbol(i,t),maker:this.safeNumber(s,"maker"),taker:this.safeNumber(s,"taker"),percentage:void 0,tierBased:void 0}}parseTradingFees(e){const t={info:e},i=this.symbols;for(let s=0;s<i.length;s++){const r=i[s],a=this.parseTradingFee(e[s]);t[r]=a}return t}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostFeesTrading(e);return this.parseTradingFees(t)}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostFeesWithdrawal(t);return this.parseTransactionFees(i)}parseTransactionFees(e,t=void 0){const i={},s=this.indexBy(e,"currency"),r=Object.keys(s);for(let a=0;a<r.length;a++){const o=r[a],n=this.safeValue(e,a,{}),d=this.safeCurrencyCode(o);(void 0===t||this.inArray(d,t))&&(i[d]={withdraw_fee:this.safeNumber(n,"fee"),deposit:{},info:this.safeDict(s,o)})}return i}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostFeesWithdrawal(t),s=this.groupBy(i,"currency");return this.parseDepositWithdrawFees(s,e)}parseDepositWithdrawFee(e,t=void 0){const i=this.depositWithdrawFee(e);for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"network"),a=this.networkIdToCode(r),o=this.safeNumber(s,"fee");i.withdraw={fee:o,percentage:void 0},i.networks[a]={withdraw:{fee:o,percentage:void 0},deposit:{fee:void 0,percentage:void 0}}}return i}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={pair:o.id,amount:this.amountToPrecision(e,s)},d=this.safeString2(a,"client_order_id","clientOrderId");let h;void 0!==d&&(n.client_order_id=d,a=this.omit(a,["clientOrderId"]));const c=this.capitalize(i);"market"===t?h="Buy"===c?await this.privatePostBuyMarketPair(this.extend(n,a)):await this.privatePostSellMarketPair(this.extend(n,a)):"instant"===t?h="Buy"===c?await this.privatePostBuyInstantPair(this.extend(n,a)):await this.privatePostSellInstantPair(this.extend(n,a)):(n.price=this.priceToPrecision(e,r),h="Buy"===c?await this.privatePostBuyPair(this.extend(n,a)):await this.privatePostSellPair(this.extend(n,a)));const l=this.parseOrder(h,o);return l.type=t,l}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privatePostCancelOrder(this.extend(s,i));return this.parseOrder(r)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};let r;void 0!==e?(i=this.market(e),s.pair=i.id,r=await this.privatePostCancelAllOrdersPair(this.extend(s,t))):r=await this.privatePostCancelAllOrders(this.extend(s,t));const a=this.safeList(r,"canceled");return this.parseOrders(a)}parseOrderStatus(e){return this.safeString({"In Queue":"open",Open:"open",Finished:"closed",Canceled:"canceled"},e,e)}async fetchOrderStatus(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue2(i,"client_order_id","clientOrderId"),r={};void 0!==s?(r.client_order_id=s,i=this.omit(i,["client_order_id","clientOrderId"])):r.id=e;const a=await this.privatePostOrderStatus(this.extend(r,i));return this.parseOrderStatus(this.safeString(a,"status"))}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r=this.safeValue2(i,"client_order_id","clientOrderId"),a={};void 0!==r?(a.client_order_id=r,i=this.omit(i,["client_order_id","clientOrderId"])):a.id=e;const o=await this.privatePostOrderStatus(this.extend(a,i));return this.parseOrder(o,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o="privatePostUserTransactions";void 0!==e&&(a=this.market(e),r.pair=a.id,o+="Pair"),void 0!==i&&(r.limit=i);const n=await this[o](this.extend(r,s)),d=this.filterBy(n,"type","2");return this.parseTrades(d,a,t,i)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==i&&(r.limit=i);const a=await this.privatePostUserTransactions(this.extend(r,s));let o;void 0!==e&&(o=this.currency(e));const n=this.filterByArray(a,"type",["0","1"],!1);return this.parseTransactions(n,o,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};r.timedelta=void 0!==t?this.milliseconds()-t:5e7;const a=await this.privatePostWithdrawalRequests(this.extend(r,s));return this.parseTransactions(a,void 0,t,i)}parseTransaction(e,t=void 0){const i=this.parse8601(this.safeString(e,"datetime")),s=this.getCurrencyIdFromTransaction(e),r=this.safeCurrencyCode(s,t),o=this.safeString(e,"fee");let n,d;"amount"in e?d=this.safeString(e,"amount"):void 0!==t?(d=this.safeString(e,t.id,d),n=t.code):void 0!==r&&void 0!==s&&(d=this.safeString(e,s,d),n=r),void 0!==d&&(d=a.Y.stringAbs(d));let h,c,l="ok";if("status"in e&&(l=this.parseTransactionStatus(this.safeString(e,"status"))),"type"in e){const t=this.safeString(e,"type");"0"===t?h="deposit":"1"===t&&(h="withdrawal")}else h="withdrawal";let u=this.safeString(e,"address");if(void 0!==u){const e=u.split("?dt=");e.length>1&&(u=e[0],c=e[1])}let f={currency:void 0,cost:void 0,rate:void 0};return void 0!==o&&(f={currency:n,cost:o,rate:void 0}),{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"transaction_id"),type:h,currency:r,network:void 0,amount:this.parseNumber(d),status:l,timestamp:i,datetime:this.iso8601(i),address:u,addressFrom:void 0,addressTo:u,tag:c,tagFrom:void 0,tagTo:c,updated:void 0,comment:void 0,internal:void 0,fee:f}}parseTransactionStatus(e){return this.safeString({0:"pending",1:"pending",2:"ok",3:"canceled",4:"failed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"client_order_id");let r=this.safeString(e,"type");void 0!==r&&(r="1"===r?"sell":"buy");const a=this.parse8601(this.safeString(e,"datetime")),o=this.safeStringLower(e,"currency_pair"),n=this.safeSymbol(o,t,"/"),d=this.parseOrderStatus(this.safeString(e,"status")),h=this.safeString(e,"amount"),c=this.safeValue(e,"transactions",[]),l=this.safeString(e,"price");return this.safeOrder({id:i,clientOrderId:s,datetime:this.iso8601(a),timestamp:a,lastTradeTimestamp:void 0,status:d,symbol:n,type:void 0,timeInForce:void 0,postOnly:void 0,side:r,price:l,triggerPrice:void 0,cost:void 0,amount:h,filled:void 0,remaining:void 0,trades:c,fee:void 0,info:e,average:void 0},t)}parseLedgerEntryType(e){return this.safeString({0:"transaction",1:"transaction",2:"trade",14:"transfer"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.parseLedgerEntryType(this.safeString(e,"type"));if("trade"===i){const s=this.parseTrade(e);let r;const a=Object.keys(e);for(let e=0;e<a.length;e++)if(a[e].indexOf("_")>=0){const t=a[e].replace("_","");r=this.safeMarket(t,r)}void 0===r&&(r=this.getMarketFromTrade(e));const o="buy"===s.side?"in":"out";return this.safeLedgerEntry({info:e,id:s.id,timestamp:s.timestamp,datetime:s.datetime,direction:o,account:void 0,referenceId:s.order,referenceAccount:void 0,type:i,currency:r.base,amount:s.amount,before:void 0,after:void 0,status:"ok",fee:s.fee},t)}{const s=this.parseTransaction(e,t);let r;if("amount"in e){const t=this.safeString(e,"amount");r=a.Y.stringGt(t,"0")?"in":"out"}else if("currency"in s&&void 0!==s.currency){const i=this.safeString(s,"currency");t=this.currency(i);const o=this.safeString(e,t.id);r=a.Y.stringGt(o,"0")?"in":"out"}return this.safeLedgerEntry({info:e,id:s.id,timestamp:s.timestamp,datetime:s.datetime,direction:r,account:void 0,referenceId:s.txid,referenceAccount:void 0,type:i,currency:s.currency,amount:s.amount,before:void 0,after:void 0,status:s.status,fee:s.fee},t)}}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==i&&(r.limit=i);const a=await this.privatePostUserTransactions(this.extend(r,s));let o;return void 0!==e&&(o=this.currency(e)),this.parseLedger(a,o,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privatePostOpenOrdersAll(s);return this.parseOrders(a,r,t,i,{status:"open",type:"limit"})}getCurrencyName(e){return e.toLowerCase()}isFiat(e){return"USD"===e||"EUR"===e||"GBP"===e}async fetchDepositAddress(e,t={}){if(this.isFiat(e))throw new r.NotSupported(this.id+" fiat fetchDepositAddress() for "+e+" is not supported!");const i=this.getCurrencyName(e),s="privatePost"+this.capitalize(i)+"Address",a=await this[s](t),o=this.safeString(a,"address"),n=this.safeString2(a,"memo_id","destination_tag");return this.checkAddress(o),{info:a,currency:e,network:void 0,address:o,tag:n}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets(),this.checkAddress(i);const a={amount:t};let o,n;if(this.isFiat(e))n="privatePostWithdrawalOpen",o=this.currency(e),a.iban=i,a.account_currency=o.id;else{const t=this.getCurrencyName(e);n="privatePost"+this.capitalize(t)+"Withdrawal","XRP"===e?void 0!==s&&(a.destination_tag=s):"XLM"!==e&&"HBAR"!==e||void 0!==s&&(a.memo_id=s),a.address=i}const d=await this[n](this.extend(a,r));return this.parseTransaction(d,o)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n={amount:this.parseToNumeric(this.currencyToPrecision(e,t)),currency:o.id.toUpperCase()};let d;if("main"===i)n.subAccount=s,d=await this.privatePostTransferFromMain(this.extend(n,a));else{if("main"!==s)throw new r.BadRequest(this.id+" transfer() only supports from or to main");n.subAccount=i,d=await this.privatePostTransferToMain(this.extend(n,a))}const h=this.parseTransfer(d,o);return h.amount=t,h.fromAccount=i,h.toAccount=s,h}parseTransfer(e,t=void 0){const i=this.safeString(e,"status");return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:t.code,amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.parseTransferStatus(i)}}parseTransferStatus(e){return this.safeString({ok:"ok",error:"failed"},e,e)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/";o+=this.version+"/",o+=this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(d).length&&(o+="?"+this.urlencode(d));else{this.checkRequiredCredentials();const e="BITSTAMP "+this.apiKey,t=this.uuid(),s=this.milliseconds().toString(),h="v2";let c="";r={"X-Auth":e,"X-Auth-Nonce":t,"X-Auth-Timestamp":s,"X-Auth-Version":h},"POST"===i&&(Object.keys(d).length?(a=this.urlencode(d),c="application/x-www-form-urlencoded",r["Content-Type"]=c):(a=this.urlencode({foo:"bar"}),c="application/x-www-form-urlencoded",r["Content-Type"]=c));const l=a||"",u=e+i+o.replace("https://","")+c+t+s+h+l,f=this.hmac(this.encode(u),this.encode(this.secret),n.s);r["X-Auth-Signature"]=f}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"status"),l=this.safeValue(n,"error");if("error"===c||void 0!==l){let e=[];if("string"==typeof l)e.push(l);else if(void 0!==l){const t=Object.keys(l);for(let i=0;i<t.length;i++){const s=t[i],r=this.safeValue(l,s);Array.isArray(r)?e=this.arrayConcat(e,r):e.push(r)}}const t=this.safeValue(n,"reason",{});if("string"==typeof t)e.push(t);else{const i=this.safeValue(t,"__all__",[]);for(let t=0;t<i.length;t++)e.push(i[t])}if("API0005"===this.safeString(n,"code"))throw new r.AuthenticationError(this.id+" invalid signature, use the uid for the main account if you have subaccounts");const i=this.id+" "+o;for(let t=0;t<e.length;t++){const s=e[t];this.throwExactlyMatchedException(this.exceptions.exact,s,i),this.throwBroadlyMatchedException(this.exceptions.broad,s,i)}throw new r.ExchangeError(i)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitteam",name:"BIT.TEAM",countries:["UK"],version:"v2.0.6",rateLimit:1,certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,borrowMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,createDepositAddress:!1,createOrder:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,deposit:!1,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!0,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!0,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!1,ws:!1},timeframes:{"1m":"1","5m":"5","15m":"15","1h":"60","1d":"1D"},urls:{logo:"https://github.com/user-attachments/assets/b41b5e0d-98e5-4bd3-8a6e-aeb230a4a135",api:{history:"https://history.bit.team",public:"https://bit.team",private:"https://bit.team"},www:"https://bit.team/",referral:"https://bit.team/auth/sign-up?ref=bitboy2023",doc:["https://bit.team/trade/api/documentation"]},api:{history:{get:{"api/tw/history/{pairName}/{resolution}":1}},public:{get:{"trade/api/asset":1,"trade/api/currencies":1,"trade/api/orderbooks/{symbol}":1,"trade/api/orders":1,"trade/api/pair/{name}":1,"trade/api/pairs":1,"trade/api/pairs/precisions":1,"trade/api/rates":1,"trade/api/trade/{id}":1,"trade/api/trades":1,"trade/api/ccxt/pairs":1,"trade/api/cmc/assets":1,"trade/api/cmc/orderbook/{pair}":1,"trade/api/cmc/summary":1,"trade/api/cmc/ticker":1,"trade/api/cmc/trades/{pair}":1}},private:{get:{"trade/api/ccxt/balance":1,"trade/api/ccxt/order/{id}":1,"trade/api/ccxt/ordersOfUser":1,"trade/api/ccxt/tradesOfUser":1,"trade/api/transactionsOfUser":1},post:{"trade/api/ccxt/cancel-all-order":1,"trade/api/ccxt/cancelorder":1,"trade/api/ccxt/ordercreate":1}}},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,taker:this.parseNumber("0.002"),maker:this.parseNumber("0.002")}},precisionMode:a.kb,options:{networksById:{Ethereum:"ERC20",ethereum:"ERC20",Tron:"TRC20",tron:"TRC20",Binance:"BSC",binance:"BSC","Binance Smart Chain":"BSC",bscscan:"BSC",Bitcoin:"BTC",bitcoin:"BTC",Litecoin:"LTC",litecoin:"LTC",Polygon:"POLYGON",polygon:"POLYGON",PRIZM:"PRIZM",Decimal:"Decimal",ufobject:"ufobject",tonchain:"tonchain"},currenciesValuedInUsd:{USDT:!0,BUSD:!0}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!0,limit:100,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{400002:r.BadSymbol,401e3:r.AuthenticationError,403002:r.BadRequest,404200:r.BadSymbol},broad:{"is not allowed":r.BadRequest,"Insufficient funds":r.InsufficientFunds,"Invalid request params input":r.BadRequest,"must be a number":r.BadRequest,"must be a string":r.BadRequest,"must be of type":r.BadRequest,"must be one of":r.BadRequest,"Order not found":r.OrderNotFound,"Pair with pair name":r.BadSymbol,pairName:r.BadSymbol,"Service Unavailable":r.ExchangeNotAvailable,"Symbol ":r.BadSymbol}}})}async fetchMarkets(e={}){const t=await this.publicGetTradeApiCcxtPairs(e),i=this.safeValue(t,"result",{}),s=this.safeValue(i,"pairs",[]);return this.parseMarkets(s)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeInteger(e,"id"),s=t.split("_"),r=this.safeString(s,0),a=this.safeString(s,1),o=this.safeCurrencyCode(r),n=this.safeCurrencyCode(a),d=this.safeValue(e,"active"),h=this.safeString(e,"timeStart"),c=this.parse8601(h);let l;const u=this.safeValue(this.options,"currenciesValuedInUsd",{});if(this.safeBool(u,n,!1)){const t=this.safeValue(e,"settings",{});l=this.safeNumber(t,"limit_usd")}return this.safeMarketStructure({id:t,numericId:i,symbol:o+"/"+n,base:o,quote:n,settle:void 0,baseId:r,quoteId:a,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:d,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"baseStep"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"quoteStep")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:l,max:void 0}},created:c,info:e})}async fetchCurrencies(e={}){const t=await this.publicGetTradeApiCurrencies(e),i=this.safeValue(t,"result",{}),s=this.safeValue(i,"currencies",[]);let r=await this.publicGetTradeApiCmcAssets();r=this.indexBy(r,"unified_cryptoasset_id");const a={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"symbol"),o=this.safeInteger(t,"id"),n=this.safeCurrencyCode(i),d=this.safeBool(t,"active",!1),h=this.parseNumber(this.parsePrecision(this.safeString(t,"precision"))),c=this.safeValue(t,"txLimits",{}),l=this.safeString(c,"minWithdraw"),u=this.safeString(c,"maxWithdraw"),f=this.safeString(c,"minDeposit");let p;const m=this.safeValue(c,"withdrawCommissionFixed",{});let g={};const v=this.safeString(t,"blockChain");void 0!==v&&""!==v?(p=this.parseNumber(m),g[v]=p):g=m;const y=this.safeValue(r,o,{}),w=this.safeValue(y,"depositStatus"),b=this.safeValue(y,"withdrawStatus"),k=Object.keys(g),S={},O=this.parseNumber(this.parsePrecision(this.safeString(t,"decimals")));for(let e=0;e<k.length;e++){const i=k[e],s=this.networkIdToCode(i,n),r=this.safeNumber(g,i);S[s]={id:i,network:s,deposit:w,withdraw:b,active:d,fee:r,precision:O,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(l),max:this.parseNumber(u)},deposit:{min:this.parseNumber(f),max:void 0}},info:t}}a[n]={id:i,numericId:o,code:n,name:n,info:t,active:d,deposit:w,withdraw:b,fee:p,precision:h,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(l),max:this.parseNumber(u)},deposit:{min:this.parseNumber(f),max:void 0}},networks:S}}return a}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t,t),n={pairName:a.id,resolution:o},d=await this.historyGetApiTwHistoryPairNameResolution(this.extend(n,r)),h=this.safeValue(d,"result",{}),c=this.safeList(h,"data",[]);return this.parseOHLCVs(c,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={pair:this.market(e).id},r=await this.publicGetTradeApiCmcOrderbookPair(this.extend(s,i)),a=this.safeInteger(r,"timestamp");return this.parseOrderBook(r,e,a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={type:this.safeString(s,"type","all")};let a;void 0!==e&&(a=this.market(e),r.pair=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetTradeApiCcxtOrdersOfUser(this.extend(r,s)),n=this.safeValue(o,"result",{}),d=this.safeList(n,"orders",[]);return this.parseOrders(d,a,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e};let r;void 0!==t&&(r=this.market(t));const a=await this.privateGetTradeApiCcxtOrderId(this.extend(s,i)),o=this.safeDict(a,"result");return this.parseOrder(o,r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return await this.fetchOrders(e,t,i,this.extend({type:"active"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return await this.fetchOrders(e,t,i,this.extend({type:"closed"},s))}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return await this.fetchOrders(e,t,i,this.extend({type:"cancelled"},s))}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={pairId:n.numericId.toString(),type:t,side:i,amount:this.amountToPrecision(e,s)};if("limit"===t){if(void 0===a)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price argument for a "+t+" order");d.price=this.priceToPrecision(e,a)}const h=await this.privatePostTradeApiCcxtOrdercreate(this.extend(d,o)),c=this.safeDict(h,"result",{});return this.parseOrder(c,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privatePostTradeApiCcxtCancelorder(this.extend(s,i)),a=this.safeDict(r,"result",{});return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};void 0!==e?(i=this.market(e),s.pairId=i.numericId.toString()):s.pairId="0";const r=await this.privatePostTradeApiCcxtCancelAllOrder(this.extend(s,t)),a=[this.safeValue(r,"result",{})];return this.parseOrders(a,i)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"pair");t=this.safeMarket(s,t);const r=this.safeString(e,"orderCid");let a;const o=this.safeString(e,"createdAt");a=void 0!==o?this.parse8601(o):this.safeTimestamp(e,"timestamp");const n=this.safeString(e,"updatedAt"),d=this.parse8601(n),h=this.parseOrderStatus(this.safeString(e,"status")),c=this.parseOrderType(this.safeString(e,"type")),l=this.safeString(e,"side"),u=this.safeValue(e,"fee"),f=this.safeString(e,"price"),p=this.safeString(e,"quantity"),m=this.safeString(e,"executed");let g;if(void 0!==u){const e=this.safeString(u,"amount"),t=this.safeString(u,"symbol");g={currency:this.safeCurrencyCode(t),cost:e,rate:void 0}}return this.safeOrder({id:i,clientOrderId:r,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:void 0,lastUpdateTimestamp:d,status:h,symbol:t.symbol,type:c,timeInForce:"GTC",side:l,price:f,triggerPrice:this.safeString(e,"stopPrice"),average:void 0,amount:p,cost:void 0,filled:m,remaining:void 0,fee:g,trades:void 0,info:e,postOnly:!1},t)}parseOrderStatus(e){return this.safeString({accepted:"open",executed:"closed",cancelled:"canceled",partiallyCancelled:"canceled",delete:"rejected",inactive:"rejected",executing:"open",created:"open"},e,e)}parseOrderType(e){return this.safeString({market:"market",limit:"limit"},e,e)}parseValueToPricision(e,t,i,s){const r=this.safeString(e,t),a=this.safeString(i,s);if(void 0===r||void 0===a)return;const n=this.parsePrecision(a);return o.Y.stringMul(r,n)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();let i=await this.publicGetTradeApiCmcSummary();const s=[];Array.isArray(i)||(i=[]);for(let e=0;e<i.length;e++){const t=i[e],r=this.parseTicker(t);s.push(r)}return this.filterByArrayTickers(s,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={name:i.id},r=await this.publicGetTradeApiPairName(this.extend(s,t)),a=this.safeValue(r,"result",{}),o=this.safeDict(a,"pair",{});return this.parseTicker(o,i)}parseTicker(e,t=void 0){const i=this.safeStringLower(e,"trading_pairs");let s,r,a,o;t=this.safeMarket(i,t);const n=this.safeValue(e,"bids"),d=this.safeValue(e,"asks");if(void 0!==n&&Array.isArray(n)&&void 0!==d&&Array.isArray(d)){const e=this.safeValue(n,0,{});s=this.safeString(e,"price"),a=this.safeString(e,"quantity");const t=this.safeValue(d,0,{});r=this.safeString(t,"price"),o=this.safeString(t,"quantity")}else s=this.safeString(e,"highest_bid"),r=this.safeString(e,"lowest_ask");const h=this.safeString2(e,"volume24","base_volume"),c=this.safeString2(e,"quoteVolume24","quote_volume"),l=this.safeString2(e,"highPrice24","highest_price_24h"),u=this.safeString2(e,"lowPrice24","lowest_price_24h"),f=this.safeString2(e,"lastPrice","last_price"),p=this.safeString2(e,"change24","price_change_percent_24h");return this.safeTicker({symbol:t.symbol,timestamp:void 0,datetime:void 0,open:void 0,high:l,low:u,close:f,bid:s,bidVolume:a,ask:r,askVolume:o,vwap:void 0,previousClose:void 0,change:void 0,percentage:p,average:void 0,baseVolume:h,quoteVolume:c,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id},o=await this.publicGetTradeApiCmcTradesPair(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.pairId=a.numericId),void 0!==i&&(r.limit=i);const o=await this.privateGetTradeApiCcxtTradesOfUser(this.extend(r,s)),n=this.safeValue(o,"result",{}),d=this.safeList(n,"trades",[]);return this.parseTrades(d,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"pair"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString2(e,"id","trade_id"),a=this.safeString(e,"price"),n=this.safeString2(e,"quantity","base_volume"),d=this.safeString(e,"quote_volume"),h=this.safeString(e,"isCurrentSide");let c=this.safeString(e,"timestamp");void 0!==h&&(c=o.Y.stringMul(c,"1000"));let l,u,f=this.safeString2(e,"side","type");"maker"===h?("sell"===f?f="buy":"buy"===f&&(f="sell"),u=this.safeString(e,"makerOrderId"),l=this.safeValue(e,"feeMaker",{})):"taker"===h&&(u=this.safeString(e,"takerOrderId"),l=this.safeValue(e,"feeTaker",{}));const p=this.safeString(l,"symbol"),m=this.safeString(l,"amount"),g={currency:this.safeCurrencyCode(p),cost:m},v=this.parseToInt(c);return this.safeTrade({id:r,order:u,timestamp:v,datetime:this.iso8601(v),symbol:s,type:void 0,side:f,takerOrMaker:h,price:a,amount:n,cost:d,fee:g,info:e},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetTradeApiCcxtBalance(e);return this.parseBalance(t)}parseBalance(e){const t=this.milliseconds(),i={info:e,timestamp:t,datetime:this.iso8601(t)},s=this.safeValue(e,"result",{}),r=this.omit(s,["free","used","total"]),a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e],r=this.safeValue(s,t),o=this.safeString(r,"free"),n=this.safeString(r,"used"),d=this.safeString(r,"total");i[this.safeCurrencyCode(t.toLowerCase())]={free:o,used:n,total:d}}return this.safeBalance(i)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.currency=r.numericId),void 0!==i&&(a.limit=i);const o=await this.privateGetTradeApiTransactionsOfUser(this.extend(a,s)),n=this.safeValue(o,"result",{}),d=this.safeList(n,"transactions",[]);return this.parseTransactions(d,r,t,i)}parseTransaction(e,t=void 0){const i=this.safeValue(e,"currency"),s=this.safeString(i,"symbol"),r=this.safeCurrencyCode(s,t),a=this.safeString(e,"id"),o=this.safeValue(e,"params"),n=this.safeString(o,"tx_id"),d=this.safeInteger(e,"timestamp");let h=this.safeString(e,"blockChain");if(void 0===h){const e=this.safeValue(i,"links",[]),t=this.safeValue(e,0,{});h=this.safeString(t,"blockChain")}const c=this.safeString(e,"sender"),l=this.safeString(e,"recipient"),u=this.safeString(e,"message"),f=this.parseTransactionType(this.safeString(e,"type")),p=this.parseValueToPricision(e,"amount",i,"decimals"),m=this.parseTransactionStatus(this.safeValue(e,"status"));return{info:e,id:a,txid:n,timestamp:d,datetime:this.iso8601(d),network:this.networkIdToCode(h),addressFrom:c,address:void 0,addressTo:l,tagFrom:void 0,tag:u,tagTo:void 0,type:f,amount:this.parseNumber(p),currency:r,status:m,updated:void 0,fee:void 0,comment:this.safeString(e,"description"),internal:!1}}parseTransactionType(e){return this.safeString({deposit:"deposit",withdraw:"withdrawal"},e,e)}parseTransactionStatus(e){return this.safeString({approving:"pending",success:"ok"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),n="/"+this.implodeParams(e,s);let d=this.urls.api[t]+n;const h=this.urlencode(o);if("private"===t){this.checkRequiredCredentials(),"POST"===i?a=this.json(o):0!==h.length&&(d+="?"+h);const e=this.apiKey+":"+this.secret;r={Authorization:"Basic "+this.stringToBase64(e),"Content-Type":"application/json"}}else 0!==h.length&&(d+="?"+h);return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&200!==e){if(404===e){if(i.indexOf("/ccxt/order/")>=0&&"GET"===s){const e=i.split("/order/"),t=this.safeString(e,1);throw new r.OrderNotFound(this.id+" order "+t+" not found")}if(i.indexOf("/cmc/orderbook/")>=0){const e=i.split("/cmc/orderbook/"),t=this.safeString(e,1);throw new r.BadSymbol(this.id+" symbolId "+t+" not found")}}const t=this.id+" "+o,a=this.safeString(n,"message"),d=this.safeString(n,"code");throw this.throwBroadlyMatchedException(this.exceptions.broad,a,t),this.throwExactlyMatchedException(this.exceptions.exact,d,t),new r.ExchangeError(t)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bitvavo",name:"Bitvavo",countries:["NL"],rateLimit:60,version:"v2",certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d"},urls:{logo:"https://github.com/user-attachments/assets/d213155c-8c71-4701-9bd5-45351febc2a8",api:{public:"https://api.bitvavo.com",private:"https://api.bitvavo.com"},www:"https://bitvavo.com/",doc:"https://docs.bitvavo.com/",fees:"https://bitvavo.com/en/fees",referral:"https://bitvavo.com/?a=24F34952F7"},api:{public:{get:{time:1,markets:1,assets:1,"{market}/book":1,"{market}/trades":5,"{market}/candles":1,"ticker/price":1,"ticker/book":1,"ticker/24h":{cost:1,noMarket:25}}},private:{get:{account:1,order:1,orders:5,ordersOpen:{cost:1,noMarket:25},trades:5,balance:5,deposit:1,depositHistory:5,withdrawalHistory:5},post:{order:1,withdrawal:1},put:{order:1},delete:{order:1,orders:1}}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0025"),maker:this.parseNumber("0.002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.0020")],[this.parseNumber("250000"),this.parseNumber("0.0016")],[this.parseNumber("500000"),this.parseNumber("0.0012")],[this.parseNumber("1000000"),this.parseNumber("0.0010")],[this.parseNumber("2500000"),this.parseNumber("0.0008")],[this.parseNumber("5000000"),this.parseNumber("0.0006")],[this.parseNumber("10000000"),this.parseNumber("0.0005")],[this.parseNumber("25000000"),this.parseNumber("0.0004")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.0010")],[this.parseNumber("250000"),this.parseNumber("0.0008")],[this.parseNumber("500000"),this.parseNumber("0.0006")],[this.parseNumber("1000000"),this.parseNumber("0.0005")],[this.parseNumber("2500000"),this.parseNumber("0.0004")],[this.parseNumber("5000000"),this.parseNumber("0.0004")],[this.parseNumber("10000000"),this.parseNumber("0.0003")],[this.parseNumber("25000000"),this.parseNumber("0.0003")]]}}},requiredCredentials:{apiKey:!0,secret:!0},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:void 0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0,selfTradePrevention:!0,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!0,limit:1e3,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:{limit:1440}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{101:r.ExchangeError,102:r.BadRequest,103:r.RateLimitExceeded,104:r.RateLimitExceeded,105:r.PermissionDenied,107:r.ExchangeNotAvailable,108:r.ExchangeNotAvailable,109:r.ExchangeNotAvailable,110:r.BadRequest,200:r.BadRequest,201:r.BadRequest,202:r.BadRequest,203:r.BadSymbol,204:r.BadRequest,205:r.BadRequest,206:r.BadRequest,210:r.InvalidOrder,211:r.InvalidOrder,212:r.InvalidOrder,213:r.InvalidOrder,214:r.InvalidOrder,215:r.InvalidOrder,216:r.InsufficientFunds,217:r.InvalidOrder,230:r.ExchangeError,231:r.ExchangeError,232:r.BadRequest,233:r.InvalidOrder,234:r.InvalidOrder,235:r.ExchangeError,236:r.BadRequest,240:r.OrderNotFound,300:r.AuthenticationError,301:r.AuthenticationError,302:r.AuthenticationError,303:r.AuthenticationError,304:r.AuthenticationError,305:r.AuthenticationError,306:r.AuthenticationError,307:r.PermissionDenied,308:r.AuthenticationError,309:r.AuthenticationError,310:r.PermissionDenied,311:r.PermissionDenied,312:r.PermissionDenied,315:r.BadRequest,317:r.AccountSuspended,400:r.ExchangeError,401:r.ExchangeError,402:r.PermissionDenied,403:r.PermissionDenied,404:r.OnMaintenance,405:r.ExchangeError,406:r.BadRequest,407:r.ExchangeError,408:r.InsufficientFunds,409:r.InvalidAddress,410:r.ExchangeError,411:r.BadRequest,412:r.InvalidAddress,413:r.InvalidAddress,414:r.ExchangeError},broad:{"start parameter is invalid":r.BadRequest,"symbol parameter is invalid":r.BadSymbol,"amount parameter is invalid":r.InvalidOrder,"orderId parameter is invalid":r.InvalidOrder}},options:{currencyToPrecisionRoundingMode:a.R3,"BITVAVO-ACCESS-WINDOW":1e4,networks:{ERC20:"ETH",TRC20:"TRX"}},precisionMode:a.v,commonCurrencies:{MIOTA:"IOTA"}})}amountToPrecision(e,t){return this.decimalToPrecision(t,a.R3,this.markets[e].precision.amount,a.fv)}priceToPrecision(e,t){return t=this.decimalToPrecision(t,a.D_,this.markets[e].precision.price,this.precisionMode),this.decimalToPrecision(t,a.R3,8,a.fv)}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.safeInteger(t,"time")}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e);return this.parseMarkets(t)}parseMarkets(e){const t=this.currencies,i=this.indexBy(t,"id"),s=[],r=this.fees;for(let t=0;t<e.length;t++){const a=e[t],o=this.safeString(a,"market"),n=this.safeString(a,"base"),d=this.safeString(a,"quote"),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d),l=this.safeString(a,"status"),u=this.safeValue(i,n),f=this.safeInteger(u,"precision");s.push(this.safeMarketStructure({id:o,symbol:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"trading"===l,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,taker:r.trading.taker,maker:r.trading.maker,precision:{amount:this.safeInteger(u,"decimals",f),price:this.safeInteger(a,"pricePrecision")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(a,"minOrderInBaseAsset"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(a,"minOrderInQuoteAsset"),max:void 0}},created:void 0,info:a}))}return s}async fetchCurrencies(e={}){const t=await this.publicGetAssets(e);return this.parseCurrenciesCustom(t)}parseCurrenciesCustom(e){const t={};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"symbol"),a=this.safeCurrencyCode(r),o={},n=this.safeValue(s,"networks",[]),d=1===n.length,h="OK"===this.safeValue(s,"depositStatus"),c="OK"===this.safeValue(s,"withdrawalStatus"),l=h&&c,u=this.safeNumber(s,"withdrawalFee"),f=this.safeInteger(s,"decimals",8),p=this.safeNumber(s,"withdrawalMinAmount");if(d){const e=n[0],t=this.networkIdToCode(e);o[t]={info:s,id:e,network:t,active:l,deposit:h,withdraw:c,fee:u,precision:f,limits:{withdraw:{min:p,max:void 0}}}}t[a]={info:s,id:r,code:a,name:this.safeString(s,"name"),active:l,deposit:h,withdraw:c,networks:o,fee:u,precision:f,limits:{amount:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0},withdraw:{min:p,max:void 0}}}}return this.currencies=this.deepExtend(this.currencies,t),t}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.publicGetTicker24h(this.extend(s,t));return this.parseTicker(r,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeSymbol(i,t,"-"),r=this.safeInteger(e,"timestamp"),a=this.safeString(e,"last"),o=this.safeString(e,"volume"),n=this.safeString(e,"volumeQuote"),d=this.safeString(e,"open");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:this.safeString(e,"bidSize"),ask:this.safeString(e,"ask"),askVolume:this.safeString(e,"askSize"),vwap:void 0,open:d,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTicker24h(t);return this.parseTickers(i,e)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);let o={market:r.id};void 0!==i&&(o.limit=Math.min(i,1e3)),void 0!==t&&(o.start=t),[o,s]=this.handleUntilOption("end",o,s);const n=await this.publicGetMarketTrades(this.extend(o,s));return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"price"),s=this.safeString(e,"amount"),r=this.safeInteger(e,"timestamp"),a=this.safeString(e,"side"),o=this.safeString2(e,"id","fillId"),n=this.safeString(e,"market"),d=this.safeSymbol(n,t,"-"),h=this.safeValue(e,"taker");let c;void 0!==h&&(c=h?"taker":"maker");const l=this.safeString(e,"fee");let u;if(void 0!==l){const t=this.safeString(e,"feeCurrency");u={cost:l,currency:this.safeCurrencyCode(t)}}const f=this.safeString(e,"orderId");return this.safeTrade({info:e,id:o,symbol:d,timestamp:r,datetime:this.iso8601(r),order:f,type:void 0,side:a,takerOrMaker:c,price:i,amount:s,cost:void 0,fee:u},t)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetAccount(e);return this.parseTradingFees(t)}parseTradingFees(e,t=void 0){const i=this.safeValue(e,"fees"),s=this.safeNumber(i,"maker"),r=this.safeNumber(i,"taker"),a={};for(let t=0;t<this.symbols.length;t++){const i=this.symbols[t];a[i]={info:e,symbol:i,maker:s,taker:r,percentage:!0,tierBased:!0}}return a}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={market:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetMarketBook(this.extend(r,i)),o=this.parseOrderBook(a,s.symbol);return o.nonce=this.safeInteger(a,"nonce"),o}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}fetchOHLCVRequest(e,t="1m",i=void 0,s=void 0,r={}){let a={market:this.market(e).id,interval:this.safeString(this.timeframes,t,t)};if(void 0!==i){const e=this.parseTimeframe(t);a.start=i,s=void 0===s?1440:Math.min(s,1440),a.end=this.sum(i,s*e*1e3)}return[a,r]=this.handleUntilOption("end",a,r),void 0!==s&&(a.limit=s),this.extend(a,r)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1440);const n=this.fetchOHLCVRequest(e,t,i,s,r),d=await this.publicGetMarketCandles(n);return this.parseOHLCVs(d,a,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"symbol"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"inOrder"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetBalance(e);return this.parseBalance(t)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={symbol:this.currency(e).id},s=await this.privateGetDeposit(this.extend(i,t)),r=this.safeString(s,"address"),a=this.safeString(s,"paymentId");return this.checkAddress(r),{info:s,currency:e,network:void 0,address:r,tag:a}}createOrderRequest(e,t,i,s,r=void 0,n={}){const d=this.market(e),h={market:d.id,side:i,orderType:t},c="market"===t||"stopLoss"===t||"takeProfit"===t,l="limit"===t||"stopLossLimit"===t||"takeProfitLimit"===t,u=this.safeString(n,"timeInForce");let f=this.safeStringN(n,["triggerPrice","stopPrice","triggerAmount"]);const p=this.isPostOnly(c,!1,n),m=this.safeValue(n,"stopLossPrice"),g=this.safeValue(n,"takeProfitPrice");if(n=this.omit(n,["timeInForce","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice"]),c){let t;if(void 0!==r){const e=this.numberToString(r),i=this.numberToString(s),a=o.Y.stringMul(i,e);t=this.parseNumber(a)}else t=this.safeNumber(n,"cost");if(void 0!==t){const e=this.currency(d.quote).precision;h.amountQuote=this.decimalToPrecision(t,a.R3,e,this.precisionMode)}else h.amount=this.amountToPrecision(e,s);n=this.omit(n,["cost"])}else l&&(h.price=this.priceToPrecision(e,r),h.amount=this.amountToPrecision(e,s));const v=void 0!==g||"takeProfit"===t||"takeProfitLimit"===t;return void 0!==m||void 0!==f&&!v||"stopLoss"===t||"stopLossLimit"===t?(void 0!==m&&(f=m),h.orderType=c?"stopLoss":"stopLossLimit"):v&&(void 0!==g&&(f=g),h.orderType=c?"takeProfit":"takeProfitLimit"),void 0!==f&&(h.triggerAmount=this.priceToPrecision(e,f),h.triggerType="price",h.triggerReference="lastTrade"),void 0!==u&&"PO"!==u&&(h.timeInForce=u),p&&(h.postOnly=!0),this.extend(h,n)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.createOrderRequest(e,t,i,s,r,a),d=await this.privatePostOrder(n);return this.parseOrder(d,o)}editOrderRequest(e,t,i,s,a=void 0,o=void 0,n={}){let d={};const h=this.market(t),c=this.safeNumber(n,"amountRemaining"),l=this.safeStringN(n,["triggerPrice","stopPrice","triggerAmount"]);if(n=this.omit(n,["amountRemaining","triggerPrice","stopPrice","triggerAmount"]),void 0!==o&&(d.price=this.priceToPrecision(t,o)),void 0!==a&&(d.amount=this.amountToPrecision(t,a)),void 0!==c&&(d.amountRemaining=this.amountToPrecision(t,c)),void 0!==l&&(d.triggerAmount=this.priceToPrecision(t,l)),d=this.extend(d,n),this.isEmpty(d))throw new r.ArgumentsRequired(this.id+" editOrder() requires an amount argument, or a price argument, or non-empty params");return void 0===this.safeString(n,"clientOrderId")&&(d.orderId=e),d.market=h.id,d}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d=this.editOrderRequest(e,t,i,s,r,a,o),h=await this.privatePutOrder(d);return this.parseOrder(h,n)}cancelOrderRequest(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const s={market:this.market(t).id};return void 0===this.safeString(i,"clientOrderId")&&(s.orderId=e),this.extend(s,i)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(t),r=this.cancelOrderRequest(e,t,i),a=await this.privateDeleteOrder(r);return this.parseOrder(a,s)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;void 0!==e&&(s=this.market(e),i.market=s.id);const r=await this.privateDeleteOrders(this.extend(i,t));return this.parseOrders(r,s)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={market:s.id};void 0===this.safeString(i,"clientOrderId")&&(a.orderId=e);const o=await this.privateGetOrder(this.extend(a,i));return this.parseOrder(o,s)}fetchOrdersRequest(e=void 0,t=void 0,i=void 0,s={}){let r={market:this.market(e).id};return void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i),[r,s]=this.handleUntilOption("end",r,s),this.extend(r,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchOrders",e,t,i,s);const o=this.market(e),n=this.fetchOrdersRequest(e,t,i,s),d=await this.privateGetOrders(n);return this.parseOrders(d,o,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.market=a.id);const o=await this.privateGetOrdersOpen(this.extend(r,s));return this.parseOrders(o,a,t,i)}parseOrderStatus(e){return this.safeString({new:"open",canceled:"canceled",canceledAuction:"canceled",canceledSelfTradePrevention:"canceled",canceledIOC:"canceled",canceledFOK:"canceled",canceledMarketProtection:"canceled",canceledPostOnly:"canceled",filled:"closed",partiallyFilled:"open",expired:"canceled",rejected:"canceled",awaitingTrigger:"open"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"orderId"),s=this.safeInteger(e,"created"),r=this.safeString(e,"market"),a=(t=this.safeMarket(r,t,"-")).symbol,n=this.parseOrderStatus(this.safeString(e,"status")),d=this.safeString(e,"side"),h=this.safeString(e,"orderType"),c=this.safeString(e,"price"),l=this.safeString(e,"amount"),u=this.safeString(e,"amountRemaining"),f=this.safeString(e,"filledAmount");let p,m=this.safeString(e,"filledAmountQuote");if(void 0===m){const t=this.safeString(e,"amountQuote"),i=this.safeString(e,"amountQuoteRemaining");m=o.Y.stringSub(t,i)}const g=this.safeNumber(e,"feePaid");if(void 0!==g){const t=this.safeString(e,"feeCurrency");p={cost:g,currency:this.safeCurrencyCode(t)}}const v=this.safeValue(e,"fills",[]),y=this.safeString(e,"timeInForce"),w=this.safeValue(e,"postOnly");return this.safeOrder({info:e,id:i,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,symbol:a,type:h,timeInForce:y,postOnly:w,side:d,price:c,triggerPrice:this.safeNumber(e,"triggerPrice"),amount:l,cost:m,average:void 0,filled:f,remaining:u,status:n,fee:p,trades:v},t)}fetchMyTradesRequest(e=void 0,t=void 0,i=void 0,s={}){let r={market:this.market(e).id};return void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i),[r,s]=this.handleUntilOption("end",r,s),this.extend(r,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);const o=this.market(e),n=this.fetchMyTradesRequest(e,t,i,s),d=await this.privateGetTrades(n);return this.parseTrades(d,o,t,i)}withdrawRequest(e,t,i,s=void 0,r={}){const a={symbol:this.currency(e).id,amount:this.currencyToPrecision(e,t),address:i};return void 0!==s&&(a.paymentId=s),this.extend(a,r)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o=this.withdrawRequest(e,t,i,s,r),n=await this.privatePostWithdrawal(o);return this.parseTransaction(n,a)}fetchWithdrawalsRequest(e=void 0,t=void 0,i=void 0,s={}){const r={};let a;return void 0!==e&&(a=this.currency(e),r.symbol=a.id),void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i),this.extend(r,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.fetchWithdrawalsRequest(e,t,i,s);let a;void 0!==e&&(a=this.currency(e));const o=await this.privateGetWithdrawalHistory(r);return this.parseTransactions(o,a,t,i,{type:"withdrawal"})}fetchDepositsRequest(e=void 0,t=void 0,i=void 0,s={}){const r={};let a;return void 0!==e&&(a=this.currency(e),r.symbol=a.id),void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i),this.extend(r,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.fetchDepositsRequest(e,t,i,s);let a;void 0!==e&&(a=this.currency(e));const o=await this.privateGetDepositHistory(r);return this.parseTransactions(o,a,t,i,{type:"deposit"})}parseTransactionStatus(e){return this.safeString({awaiting_processing:"pending",awaiting_email_confirmation:"pending",awaiting_bitvavo_inspection:"pending",approved:"pending",sending:"pending",in_mempool:"pending",processed:"pending",completed:"ok",canceled:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol"),r=this.safeCurrencyCode(s,t),a=this.parseTransactionStatus(this.safeString(e,"status")),o=this.safeNumber(e,"amount"),n=this.safeString(e,"address"),d=this.safeString(e,"txId");let h;const c=this.safeNumber(e,"fee");let l;void 0!==c&&(h={cost:c,currency:r}),l="success"in e||"address"in e?"withdrawal":"deposit";const u=this.safeString(e,"paymentId");return{info:e,id:undefined,txid:d,timestamp:i,datetime:this.iso8601(i),addressFrom:void 0,address:n,addressTo:n,tagFrom:void 0,tag:u,tagTo:u,type:l,amount:o,currency:r,status:a,updated:void 0,fee:h,network:void 0,comment:void 0,internal:void 0}}parseDepositWithdrawFee(e,t=void 0){const i={info:e,withdraw:{fee:this.safeNumber(e,"withdrawalFee"),percentage:!1},deposit:{fee:this.safeNumber(e,"depositFee"),percentage:!1},networks:{}},s=this.safeValue(e,"networks");let r=this.safeValue(s,0);const a=this.safeString(t,"code");"Mainnet"===r&&(r=a);const o=this.networkIdToCode(r,a);return i.networks[o]={deposit:i.deposit,withdraw:i.withdraw},i}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetAssets(t);return this.parseDepositWithdrawFees(i,e,"symbol")}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e));let d="/"+this.version+"/"+this.implodeParams(e,s);const h="GET"===i||"DELETE"===i;if(h&&Object.keys(o).length&&(d+="?"+this.urlencode(o)),"private"===t){this.checkRequiredCredentials();let e="";h||Object.keys(o).length&&(e=a=this.json(o));const t=this.milliseconds().toString(),s=t+i+d+e,c=this.hmac(this.encode(s),this.encode(this.secret),n.s),l=this.safeString(this.options,"BITVAVO-ACCESS-WINDOW","10000");r={"BITVAVO-ACCESS-KEY":this.apiKey,"BITVAVO-ACCESS-SIGNATURE":c,"BITVAVO-ACCESS-TIMESTAMP":t,"BITVAVO-ACCESS-WINDOW":l},h||(r["Content-Type"]="application/json")}return d=this.urls.api[t]+d,{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"errorCode"),l=this.safeString(n,"error");if(void 0!==c){const e=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,l,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}calculateRateLimiterCost(e,t,i,s,r={}){return"noMarket"in r&&!("market"in s)?r.noMarket:this.safeValue(r,"cost",1)}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bl3p",name:"BL3P",countries:["NL"],rateLimit:1e3,version:"1",comment:"An exchange market by BitonicNL",pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,ws:!1},urls:{logo:"https://github.com/user-attachments/assets/75aeb14e-cd48-43c8-8492-dff002dea0be",api:{rest:"https://api.bl3p.eu"},www:"https://bl3p.eu",doc:["https://github.com/BitonicNL/bl3p-api/tree/master/docs","https://bl3p.eu/api","https://bitonic.nl/en/api"]},api:{public:{get:["{market}/ticker","{market}/orderbook","{market}/trades"]},private:{post:["{market}/money/depth/full","{market}/money/order/add","{market}/money/order/cancel","{market}/money/order/result","{market}/money/orders","{market}/money/orders/history","{market}/money/trades/fetch","GENMKT/money/info","GENMKT/money/deposit_address","GENMKT/money/new_deposit_address","GENMKT/money/wallet/history","GENMKT/money/withdraw"]}},markets:{"BTC/EUR":this.safeMarketStructure({id:"BTCEUR",symbol:"BTC/EUR",base:"BTC",quote:"EUR",baseId:"BTC",quoteId:"EUR",maker:.0025,taker:.0025,type:"spot",spot:!0})},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:void 0,fetchOpenOrders:void 0,fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb})}parseBalance(e){const t=this.safeValue(e,"data",{}),i=this.safeValue(t,"wallets",{}),s={info:t},r=Object.keys(this.currencies);for(let e=0;e<r.length;e++){const t=r[e],a=this.currency(t).id,o=this.safeValue(i,a,{}),n=this.safeValue(o,"available",{}),d=this.safeValue(o,"balance",{}),h=this.account();h.free=this.safeString(n,"value"),h.total=this.safeString(d,"value"),s[t]=h}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGENMKTMoneyInfo(e);return this.parseBalance(t)}parseBidAsk(e,t=0,i=1,s=2){const a=this.safeString(e,t),o=this.safeString(e,i);return[this.parseNumber(r.Y.stringDiv(a,"100000.0")),this.parseNumber(r.Y.stringDiv(o,"100000000.0"))]}async fetchOrderBook(e,t=void 0,i={}){const s=this.market(e),r={market:s.id},a=await this.publicGetMarketOrderbook(this.extend(r,i)),o=this.safeDict(a,"data");return this.parseOrderBook(o,s.symbol,void 0,"bids","asks","price_int","amount_int")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeTimestamp(e,"timestamp"),r=this.safeString(e,"last"),a=this.safeValue(e,"volume",{});return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(a,"24h"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){const i=this.market(e),s={market:i.id},r=await this.publicGetMarketTicker(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"trade_id"),s=this.safeInteger(e,"date"),a=this.safeString(e,"price_int"),o=this.safeString(e,"amount_int");return t=this.safeMarket(void 0,t),this.safeTrade({id:i,info:e,timestamp:s,datetime:this.iso8601(s),symbol:t.symbol,type:void 0,side:void 0,order:void 0,takerOrMaker:void 0,price:r.Y.stringDiv(a,"100000"),amount:r.Y.stringDiv(o,"100000000"),cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){const r=this.market(e),a=await this.publicGetMarketTrades(this.extend({market:r.id},s));return this.parseTrades(a.data.trades,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostGENMKTMoneyInfo(e),i=this.safeValue(t,"data",{}),s=this.safeString(i,"trade_fee"),a=this.parseNumber(r.Y.stringDiv(s,"100")),o={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e];o[t]={info:i,symbol:t,maker:a,taker:a,percentage:!0,tierBased:!1}}return o}async createOrder(e,t,i,s,a=void 0,o={}){const n=this.market(e),d=this.numberToString(s),h=this.numberToString(a),c={market:n.id,amount_int:parseInt(r.Y.stringMul(d,"100000000")),fee_currency:n.quote,type:"buy"===i?"bid":"ask"};"limit"===t&&(c.price_int=parseInt(r.Y.stringMul(h,"100000.0")));const l=await this.privatePostMarketMoneyOrderAdd(this.extend(c,o)),u=this.safeString(l.data,"order_id");return this.safeOrder({info:l,id:u},n)}async cancelOrder(e,t=void 0,i={}){const s={order_id:e},r=await this.privatePostMarketMoneyOrderCancel(this.extend(s,i));return this.safeOrder({info:r})}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.privatePostGENMKTMoneyNewDepositAddress(this.extend(s,t)),a=this.safeDict(r,"data");return this.parseDepositAddress(a,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");return this.checkAddress(i),{info:e,currency:this.safeString(t,"code"),address:i,tag:void 0,network:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const n=this.implodeParams(e,s);let d=this.urls.api.rest+"/"+this.version+"/"+n;const h=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(h).length&&(d+="?"+this.urlencode(h));else{this.checkRequiredCredentials();const e=this.nonce();a=this.urlencode(this.extend({nonce:e},h));const t=this.base64ToBinary(this.secret),i=n+"\0"+a,s=this.hmac(this.encode(i),t,o.Zf,"base64");r={"Content-Type":"application/x-www-form-urlencoded","Rest-Key":this.apiKey,"Rest-Sign":s}}return{url:d,method:i,body:a,headers:r}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"blockchaincom",secret:void 0,name:"Blockchain.com",countries:["LX"],rateLimit:500,version:"v3",pro:!0,has:{CORS:!1,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchBalance:!0,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchL2OrderBook:!0,fetchL3OrderBook:!0,fetchLedger:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPositionMode:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!1,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!0,transfer:!1,withdraw:!0},timeframes:void 0,urls:{logo:"https://github.com/user-attachments/assets/975e3054-3399-4363-bcee-ec3c6d63d4e8",test:{public:"https://testnet-api.delta.exchange",private:"https://testnet-api.delta.exchange"},api:{public:"https://api.blockchain.com/v3/exchange",private:"https://api.blockchain.com/v3/exchange"},www:"https://blockchain.com",doc:["https://api.blockchain.com/v3"],fees:"https://exchange.blockchain.com/fees"},api:{public:{get:{tickers:1,"tickers/{symbol}":1,symbols:1,"symbols/{symbol}":1,"l2/{symbol}":1,"l3/{symbol}":1}},private:{get:{fees:1,orders:1,"orders/{orderId}":1,trades:1,fills:1,deposits:1,"deposits/{depositId}":1,accounts:1,"accounts/{account}/{currency}":1,whitelist:1,"whitelist/{currency}":1,withdrawals:1,"withdrawals/{withdrawalId}":1},post:{orders:1,"deposits/{currency}":1,withdrawals:1},delete:{orders:1,"orders/{orderId}":1}}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0045")],[this.parseNumber("10000"),this.parseNumber("0.0035")],[this.parseNumber("50000"),this.parseNumber("0.0018")],[this.parseNumber("100000"),this.parseNumber("0.0018")],[this.parseNumber("500000"),this.parseNumber("0.0018")],[this.parseNumber("1000000"),this.parseNumber("0.0018")],[this.parseNumber("2500000"),this.parseNumber("0.0018")],[this.parseNumber("5000000"),this.parseNumber("0.0016")],[this.parseNumber("25000000"),this.parseNumber("0.0014")],[this.parseNumber("100000000"),this.parseNumber("0.0011")],[this.parseNumber("500000000"),this.parseNumber("0.0008")],[this.parseNumber("1000000000"),this.parseNumber("0.0006")]],maker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("10000"),this.parseNumber("0.0017")],[this.parseNumber("50000"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.0008")],[this.parseNumber("500000"),this.parseNumber("0.0007")],[this.parseNumber("1000000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0005")],[this.parseNumber("5000000"),this.parseNumber("0.0004")],[this.parseNumber("25000000"),this.parseNumber("0.0003")],[this.parseNumber("100000000"),this.parseNumber("0.0002")],[this.parseNumber("500000000"),this.parseNumber("0.0001")],[this.parseNumber("1000000000"),this.parseNumber("0")]]}}},requiredCredentials:{apiKey:!1,secret:!0},options:{networks:{ERC20:"ETH",TRC20:"TRX",ALGO:"ALGO",ADA:"ADA",AR:"AR",ATOM:"ATOM",AVAXC:"AVAX",BCH:"BCH",BSV:"BSV",BTC:"BTC",DCR:"DCR",DESO:"DESO",DASH:"DASH",CELO:"CELO",CHZ:"CHZ",MATIC:"MATIC",SOL:"SOL",DOGE:"DOGE",DOT:"DOT",EOS:"EOS",ETC:"ETC",FIL:"FIL",KAVA:"KAVA",LTC:"LTC",IOTA:"MIOTA",NEAR:"NEAR",STX:"STX",XLM:"XLM",XMR:"XMR",XRP:"XRP",XTZ:"XTZ",ZEC:"ZEC",ZIL:"ZIL"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!0},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,symbolRequired:!1,trailing:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{401:r.AuthenticationError,404:r.OrderNotFound},broad:{}}})}async fetchMarkets(e={}){const t=await this.publicGetSymbols(e),i=Object.keys(t),s=[];for(let e=0;e<i.length;e++){const r=i[e],o=this.safeValue(t,r),n=this.safeString(o,"base_currency"),d=this.safeString(o,"counter_currency"),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d),l=this.safeNumber(o,"id");let u;u="open"===this.safeString(o,"status");const f=this.safeString(o,"min_price_increment"),p=this.safeString(o,"min_price_increment_scale"),m=this.parsePrecision(p),g=a.Y.stringMul(f,m),v=this.safeString(o,"lot_size"),y=this.safeString(o,"lot_size_scale"),w=this.parsePrecision(y),b=a.Y.stringMul(v,w),k=this.safeString(o,"min_order_size"),S=this.safeString(o,"min_order_size_scale"),O=this.parsePrecision(S),T=a.Y.stringMul(k,O),P=this.parseNumber(T);let I;if(I=this.safeString(o,"max_order_size"),"0"!==I){const e=this.safeString(o,"max_order_size_scale"),t=this.parsePrecision(e),i=a.Y.stringMul(I,t);I=this.parseNumber(i)}else I=void 0;s.push({info:o,id:r,numericId:l,symbol:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:u,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(b),price:this.parseNumber(g)},limits:{leverage:{min:void 0,max:void 0},amount:{min:P,max:I},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0})}return s}async fetchOrderBook(e,t=void 0,i={}){return await this.fetchL3OrderBook(e,t,i)}async fetchL3OrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetL3Symbol(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","px","qty")}async fetchL2OrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetL2Symbol(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","px","qty")}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,"-"),r=this.safeString(e,"last_trade_price"),a=this.safeString(e,"volume_24h"),o=this.safeString(e,"price_24h");return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:o,close:void 0,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:a,quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTickersSymbol(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t);return this.parseTickers(i,e)}parseOrderState(e){return this.safeString({OPEN:"open",REJECTED:"rejected",FILLED:"closed",CANCELED:"canceled",PART_FILLED:"open",EXPIRED:"expired"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"clOrdId"),s=this.safeStringLower(e,"ordType"),r=this.safeString(e,"ordStatus"),a=this.parseOrderState(r),o=this.safeStringLower(e,"side"),n=this.safeString(e,"symbol"),d=this.safeSymbol(n,t,"-"),h=this.safeString(e,"exOrdId"),c="market"!==s?this.safeString(e,"price"):void 0,l=this.safeNumber(e,"avgPx"),u=this.safeInteger(e,"timestamp"),f=this.iso8601(u),p=this.safeString(e,"cumQty"),m=this.safeString(e,"leavesQty");return this.safeOrder({id:h,clientOrderId:i,datetime:f,timestamp:u,lastTradeTimestamp:void 0,status:a,symbol:d,type:s,timeInForce:void 0,side:o,price:c,average:l,amount:void 0,filled:p,remaining:m,cost:void 0,trades:[],fees:[],info:e})}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=this.safeString(o,"ordType",t).toUpperCase(),h=this.safeString2(o,"clientOrderId","clOrdId",this.uuid16());o=this.omit(o,["ordType","clientOrderId","clOrdId"]);const c={ordType:d,symbol:n.id,side:i.toUpperCase(),orderQty:this.amountToPrecision(e,s),clOrdId:h},l=this.safeValueN(o,["triggerPrice","stopPx","stopPrice"]);if(o=this.omit(o,["triggerPrice","stopPx","stopPrice"]),("STOP"===d||"STOPLIMIT"===d)&&void 0===l)throw new r.ArgumentsRequired(this.id+" createOrder() requires a stopPx or triggerPrice param for a "+d+" order");void 0!==l&&("MARKET"===d?c.ordType="STOP":"LIMIT"===d&&(c.ordType="STOPLIMIT"));let u=!1,f=!1;"LIMIT"!==c.ordType&&"STOPLIMIT"!==c.ordType||(u=!0),"STOP"!==c.ordType&&"STOPLIMIT"!==c.ordType||(f=!0),u&&(c.price=this.priceToPrecision(e,a)),f&&(c.stopPx=this.priceToPrecision(e,l));const p=await this.privatePostOrders(this.extend(c,o));return this.parseOrder(p,n)}async cancelOrder(e,t=void 0,i={}){const s={orderId:e},r=await this.privateDeleteOrdersOrderId(this.extend(s,i));return this.safeOrder({id:e,info:r})}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=this.marketId(e);i.symbol=t}const s=await this.privateDeleteOrders(this.extend(i,t));return[this.safeOrder({info:s})]}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetFees(e),i=this.safeNumber(t,"makerRate"),s=this.safeNumber(t,"takerRate"),r={};for(let e=0;e<this.symbols.length;e++){const a=this.symbols[e];r[a]={info:t,symbol:a,maker:i,taker:s}}return r}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState("CANCELED",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState("FILLED",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState("OPEN",e,t,i,s)}async fetchOrdersByState(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={status:e,limit:100};let o;void 0!==t&&(o=this.market(t),a.symbol=o.id);const n=await this.privateGetOrders(this.extend(a,r));return this.parseOrders(n,o,i,s)}parseTrade(e,t=void 0){const i=this.safeString(e,"exOrdId"),s=this.safeString(e,"tradeId"),r=this.safeString(e,"side").toLowerCase(),a=this.safeString(e,"symbol"),o=this.safeString(e,"price"),n=this.safeString(e,"qty"),d=this.safeInteger(e,"timestamp"),h=this.iso8601(d),c=(t=this.safeMarket(a,t,"-")).symbol;let l;const u=this.safeString(e,"fee");if(void 0!==u){l={cost:u,currency:t.quote}}return this.safeTrade({id:s,timestamp:d,datetime:h,symbol:c,order:i,type:void 0,side:r,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:l,info:e},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==i&&(r.limit=i),void 0!==e&&(r.symbol=this.marketId(e),a=this.market(e));const o=await this.privateGetFills(this.extend(r,s));return this.parseTrades(o,a,t,i,s)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.privatePostDepositsCurrency(this.extend(s,t)),a=this.safeString(r,"address");let o,n;if(void 0!==a){const e=a.split(";");o=this.safeString(e,0),n=this.safeString(e,1)}return{info:r,currency:i.code,network:void 0,address:n,tag:o}}parseTransactionState(e){return this.safeString({COMPLETED:"ok",REJECTED:"failed",PENDING:"pending",FAILED:"failed",REFUNDED:"refunded"},e,e)}parseTransaction(e,t=void 0){let i,s;const r=this.safeNumber(e,"amount"),a=this.safeInteger(e,"timestamp"),o=this.safeString(e,"currency"),n=this.safeCurrencyCode(o,t),d=this.safeString(e,"state");"depositId"in e?(i="deposit",s=this.safeString(e,"depositId")):"withdrawalId"in e&&(i="withdrawal",s=this.safeString(e,"withdrawalId"));const h="withdrawal"===i?this.safeNumber(e,"fee"):void 0;let c;void 0!==h&&(c={currency:n,cost:h});const l=this.safeString(e,"address");return{info:e,id:s,txid:this.safeString(e,"txhash"),timestamp:a,datetime:this.iso8601(a),network:void 0,addressFrom:void 0,address:l,addressTo:l,tagFrom:void 0,tag:void 0,tagTo:void 0,type:i,amount:r,currency:n,status:this.parseTransactionState(d),updated:void 0,comment:void 0,internal:void 0,fee:c}}async withdraw(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(e),o={amount:t,currency:a.id,beneficiary:i,sendMax:!1},n=await this.privatePostWithdrawals(this.extend(o,r));return this.parseTransaction(n,a)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==t&&(r.from=t),void 0!==e&&(a=this.currency(e));const o=await this.privateGetWithdrawals(this.extend(r,s));return this.parseTransactions(o,a,t,i)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={withdrawalId:e},r=await this.privateGetWithdrawalsWithdrawalId(this.extend(s,i));return this.parseTransaction(r)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==t&&(r.from=t),void 0!==e&&(a=this.currency(e));const o=await this.privateGetDeposits(this.extend(r,s));return this.parseTransactions(o,a,t,i)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={depositId:this.safeString(i,"depositId",e)},r=await this.privateGetDepositsDepositId(this.extend(s,i));return this.parseTransaction(r)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(e,"account","primary");e=this.omit(e,"account");const i={account:t},s=await this.privateGetAccounts(this.extend(i,e)),a=this.safeValue(s,t);if(void 0===a)throw new r.ExchangeError(this.id+' fetchBalance() could not find the "'+t+'" account');const o={info:s};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"currency"),s=this.safeCurrencyCode(i),r=this.account();r.free=this.safeString(t,"available"),r.total=this.safeString(t,"balance"),o[s]=r}return this.safeBalance(o)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e},r=await this.privateGetOrdersOrderId(this.extend(s,i));return this.parseOrder(r)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o="/"+this.implodeParams(e,s);let n=this.urls.api[t]+o;const d=this.omit(s,this.extractParams(e));return"public"===t?Object.keys(d).length&&(n+="?"+this.urlencode(d)):"private"===t&&(this.checkRequiredCredentials(),r={"X-API-Token":this.secret},"GET"===i?Object.keys(d).length&&(n+="?"+this.urlencode(d)):(a=this.json(d),r["Content-Type"]="application/json")),{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"text");if(void 0!==c&&"Insufficient Balance"===c)throw new r.InsufficientFunds(this.id+" "+o);const l=this.safeString(n,"status"),u=this.safeString(n,"error");if(void 0!==e){const e=this.id+" "+this.json(n);this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,u,e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"blofin",name:"BloFin",countries:["US"],version:"v1",rateLimit:100,pro:!0,has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,borrowMargin:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,createDepositAddress:!1,createMarketBuyOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopLossOrder:!0,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!0,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:void 0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchGreeks:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!0,fetchLedgerEntry:void 0,fetchLeverage:!0,fetchLeverages:!0,fetchLeverageTiers:!1,fetchMarginMode:!0,fetchMarginModes:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrder:void 0,fetchOpenOrders:!0,fetchOrder:void 0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositions:!0,fetchPositionsForSymbol:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,setLeverage:!0,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!1},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1H","2h":"2H","4h":"4H","6h":"6H","8h":"8H","12h":"12H","1d":"1D","3d":"3D","1w":"1W","1M":"1M"},hostname:"www.blofin.com",urls:{logo:"https://github.com/user-attachments/assets/518cdf80-f05d-4821-a3e3-d48ceb41d73b",api:{rest:"https://openapi.blofin.com"},test:{rest:"https://demo-trading-openapi.blofin.com"},referral:{url:"https://blofin.com/register?referral_code=f79EsS",discount:.05},www:"https://www.blofin.com",doc:"https://blofin.com/docs"},api:{public:{get:{"market/instruments":1,"market/tickers":1,"market/books":1,"market/trades":1,"market/candles":1,"market/mark-price":1,"market/funding-rate":1,"market/funding-rate-history":1}},private:{get:{"asset/balances":1,"trade/orders-pending":1,"trade/fills-history":1,"asset/deposit-history":1,"asset/withdrawal-history":1,"asset/bills":1,"account/balance":1,"account/positions":1,"account/leverage-info":1,"account/margin-mode":1,"account/batch-leverage-info":1,"trade/orders-tpsl-pending":1,"trade/orders-history":1,"trade/orders-tpsl-history":1,"user/query-apikey":1,"affiliate/basic":1,"copytrading/instruments":1,"copytrading/account/balance":1,"copytrading/account/positions-by-order":1,"copytrading/account/positions-details-by-order":1,"copytrading/account/positions-by-contract":1,"copytrading/account/position-mode":1,"copytrading/account/leverage-info":1,"copytrading/trade/orders-pending":1,"copytrading/trade/pending-tpsl-by-contract":1,"copytrading/trade/position-history-by-order":1,"copytrading/trade/orders-history":1,"copytrading/trade/pending-tpsl-by-order":1},post:{"trade/order":1,"trade/cancel-order":1,"account/set-leverage":1,"trade/batch-orders":1,"trade/order-tpsl":1,"trade/cancel-batch-orders":1,"trade/cancel-tpsl":1,"trade/close-position":1,"asset/transfer":1,"copytrading/account/set-position-mode":1,"copytrading/account/set-leverage":1,"copytrading/trade/place-order":1,"copytrading/trade/cancel-order":1,"copytrading/trade/place-tpsl-by-contract":1,"copytrading/trade/cancel-tpsl-by-contract":1,"copytrading/trade/place-tpsl-by-order":1,"copytrading/trade/cancel-tpsl-by-order":1,"copytrading/trade/close-position-by-order":1,"copytrading/trade/close-position-by-contract":1}}},fees:{swap:{taker:this.parseNumber("0.00060"),maker:this.parseNumber("0.00020")}},requiredCredentials:{apiKey:!0,secret:!0,password:!0},features:{default:{sandbox:!1,createOrder:{timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1440}},spot:{extends:"default",createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,hedged:!1}},forDerivatives:{extends:"default",createOrder:{marginMode:!0,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!0},hedged:!0}},swap:{linear:{extends:"forDerivatives"},inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{400:r.BadRequest,401:r.AuthenticationError,500:r.ExchangeError,404:r.BadRequest,405:r.BadRequest,406:r.BadRequest,429:r.RateLimitExceeded,152001:r.BadRequest,152002:r.BadRequest,152003:r.BadRequest,152004:r.BadRequest,152005:r.BadRequest,152006:r.InvalidOrder,152007:r.InvalidOrder,152008:r.InvalidOrder,152009:r.InvalidOrder,150003:r.InvalidOrder,150004:r.InvalidOrder,542:r.InvalidOrder,102002:r.InvalidOrder,102005:r.InvalidOrder,102014:r.InvalidOrder,102015:r.InvalidOrder,102022:r.InvalidOrder,102037:r.InvalidOrder,102038:r.InvalidOrder,102039:r.InvalidOrder,102040:r.InvalidOrder,102047:r.InvalidOrder,102048:r.InvalidOrder,102049:r.InvalidOrder,102050:r.InvalidOrder,102051:r.InvalidOrder,102052:r.InvalidOrder,102053:r.InvalidOrder,102054:r.InvalidOrder,102055:r.InvalidOrder,102064:r.BadRequest,102065:r.BadRequest,102068:r.BadRequest,103013:r.ExchangeError,"Order failed. Insufficient USDT margin in account":r.InsufficientFunds},broad:{"Internal Server Error":r.ExchangeNotAvailable,"server error":r.ExchangeNotAvailable}},httpExceptions:{429:r.ExchangeNotAvailable},precisionMode:o.kb,options:{brokerId:"ec6dd3a7dd982d0b",accountsByType:{swap:"futures",funding:"funding",future:"futures",copy_trading:"copy_trading",earn:"earn",spot:"spot"},accountsById:{funding:"funding",futures:"swap",copy_trading:"copy_trading",earn:"earn",spot:"spot"},defaultNetwork:"ERC20",defaultNetworks:{ETH:"ERC20",BTC:"BTC",USDT:"TRC20"},networks:{BTC:"Bitcoin",BEP20:"BSC",ERC20:"ERC20",TRC20:"TRC20"},fetchOpenInterestHistory:{timeframes:{"5m":"5m","1h":"1H","8h":"8H","1d":"1D","5M":"5m","1H":"1H","8H":"8H","1D":"1D"}},fetchOHLCV:{timezone:"UTC"},fetchPositions:{method:"privateGetAccountPositions"},createOrder:"privatePostTradeOrder",createMarketBuyOrderRequiresPrice:!1,fetchMarkets:["swap"],defaultType:"swap",fetchLedger:{method:"privateGetAssetBills"},fetchOpenOrders:{method:"privateGetTradeOrdersPending"},cancelOrders:{method:"privatePostTradeCancelBatchOrders"},fetchCanceledOrders:{method:"privateGetTradeOrdersHistory"},fetchClosedOrders:{method:"privateGetTradeOrdersHistory"},withdraw:{password:void 0,pwd:void 0},exchangeType:{spot:"SPOT",swap:"SWAP",SPOT:"SPOT",SWAP:"SWAP"}}})}async fetchMarkets(e={}){const t=await this.publicGetMarketInstruments(e),i=this.safeList(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"instId"),i=this.safeStringLower(e,"instType"),s="spot"===i,r="future"===i,o="swap"===i,n="option"===i,d=o||r,h=this.safeString(e,"baseCurrency"),c=this.safeString(e,"quoteCurrency"),l=this.safeString(e,"quoteCurrency"),u=this.safeCurrencyCode(l),f=this.safeCurrencyCode(h),p=this.safeCurrencyCode(c);let m=f+"/"+p;o&&(m=m+":"+u);const g=void 0,v=this.safeString(e,"tickSize"),y=this.safeDict2(this.fees,i,"trading",{}),w=this.safeNumber(y,"taker"),b=this.safeNumber(y,"maker");let k=this.safeString(e,"maxLeverage","100");k=a.Y.stringMax(k,"1");const S="live"===this.safeString(e,"state");return this.safeMarketStructure({id:t,symbol:m,base:f,quote:p,baseId:h,quoteId:c,settle:u,settleId:l,type:i,spot:s,option:n,margin:s&&a.Y.stringGt(k,"1"),swap:o,future:r,active:S,taker:w,maker:b,contract:d,linear:d?c===l:void 0,inverse:d?h===l:void 0,contractSize:d?this.safeNumber(e,"contractValue"):void 0,expiry:g,expiryDatetime:g,strike:undefined,optionType:undefined,created:this.safeInteger(e,"listTime"),precision:{amount:this.safeNumber(e,"lotSize"),price:this.parseNumber(v)},limits:{leverage:{min:this.parseNumber("1"),max:this.parseNumber(k)},amount:{min:this.safeNumber(e,"minSize"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:e})}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={instId:this.market(e).id};void 0!==(t=void 0===t?50:t)&&(s.size=t);const r=await this.publicGetMarketBooks(this.extend(s,i)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{}),n=this.safeInteger(o,"ts");return this.parseOrderBook(o,e,n)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,a=this.safeString(e,"last"),o=this.safeString(e,"open24h"),n=this.safeBool(t,"spot",!1)?this.safeString(e,"volCurrency24h"):void 0,d=this.safeString(e,"vol24h"),h=this.safeString(e,"high24h"),c=this.safeString(e,"low24h");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:h,low:c,bid:this.safeString(e,"bidPrice"),bidVolume:this.safeString(e,"bidSize"),ask:this.safeString(e,"askPrice"),askVolume:this.safeString(e,"askSize"),vwap:void 0,open:o,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:d,quoteVolume:n,indexPrice:this.safeString(e,"indexPrice"),markPrice:this.safeString(e,"markPrice"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.publicGetMarketTickers(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetMarketMarkPrice(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarketTickers(t),s=this.safeList(i,"data",[]);return this.parseTickers(s,e)}parseTrade(e,t=void 0){const i=this.safeString(e,"tradeId"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,a=this.safeInteger(e,"ts"),o=this.safeString2(e,"price","fillPrice"),n=this.safeString2(e,"size","fillSize"),d=this.safeString(e,"side"),h=this.safeString(e,"orderId"),c=this.safeString(e,"fee");let l;return void 0!==c&&(l={cost:c,currency:t.settle}),this.safeTrade({info:e,timestamp:a,datetime:this.iso8601(a),symbol:r,id:i,order:h,type:void 0,takerOrMaker:void 0,side:d,price:o,amount:n,cost:void 0,fee:l},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchTrades",e,t,i,s,"tradeId","after",void 0,100);const a=this.market(e),o={instId:a.id};let n,d;void 0!==i&&(o.limit=i),[d,s]=this.handleOptionAndParams(s,"fetchTrades","method","publicGetMarketTrades"),"publicGetMarketTrades"===d&&(n=await this.publicGetMarketTrades(this.extend(o,s)));const h=this.safeList(n,"data",[]);return this.parseTrades(h,a,t,i)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,6)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,100);void 0===s&&(s=100);const n={instId:a.id,bar:this.safeString(this.timeframes,t,t),limit:s},d=this.safeInteger(r,"until");let h;void 0!==d&&(n.after=d,r=this.omit(r,"until")),h=await this.publicGetMarketCandles(this.extend(n,r));const c=this.safeList(h,"data",[]);return this.parseOHLCVs(c,a,t,i,s)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s);const o=this.market(e),n={instId:o.id};void 0!==t&&(n.before=Math.max(t-1,0)),void 0!==i&&(n.limit=i);const d=await this.publicGetMarketFundingRateHistory(this.extend(n,s)),h=[],c=this.safeList(d,"data",[]);for(let e=0;e<c.length;e++){const t=c[e],i=this.safeInteger(t,"fundingTime");h.push({info:t,symbol:o.symbol,fundingRate:this.safeNumber(t,"fundingRate"),timestamp:i,datetime:this.iso8601(i)})}const l=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(l,o.symbol,t,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"instId"),s=this.safeSymbol(i,t),r=this.safeInteger(e,"fundingTime");return{info:e,symbol:s,markPrice:void 0,indexPrice:void 0,interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:r,fundingDatetime:this.iso8601(r),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.ExchangeError(this.id+" fetchFundingRate() is only valid for swap markets");const s={instId:i.id},a=await this.publicGetMarketFundingRate(this.extend(s,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseFundingRate(n,i)}parseBalanceByType(e){const t=this.safeList(e,"data");return void 0!==t&&Array.isArray(t)?this.parseFundingBalance(e):this.parseBalance(e)}parseBalance(e){const t={info:e},i=this.safeDict(e,"data",{}),s=this.safeInteger(i,"ts"),r=this.safeList(i,"details",[]);for(let e=0;e<r.length;e++){const i=r[e],s=this.safeString(i,"currency"),a=this.safeCurrencyCode(s),o=this.account(),n=this.safeString(i,"equity"),d=this.safeString(i,"available");void 0===n||void 0===d?(o.free=this.safeString(i,"availableEquity"),o.used=this.safeString(i,"frozen")):(o.total=n,o.free=d),t[a]=o}return t.timestamp=s,t.datetime=this.iso8601(s),this.safeBalance(t)}parseFundingBalance(e){const t={info:e},i=this.safeList(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.free=this.safeString(s,"available"),o.used=this.safeString(s,"frozen"),t[a]=o}return this.safeBalance(t)}parseTradingFee(e,t=void 0){return{info:e,symbol:this.safeSymbol(void 0,t),maker:this.parseNumber(a.Y.stringNeg(this.safeString2(e,"maker","makerU"))),taker:this.parseNumber(a.Y.stringNeg(this.safeString2(e,"taker","takerU"))),percentage:void 0,tierBased:void 0}}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleOptionAndParams2(e,"fetchBalance","accountType","type");const i={};let s;if(void 0!==t&&"swap"!==t){const r=this.safeDict(this.options,"accountsByType",{}),a=this.safeString(r,t,t);i.accountType=a,s=await this.privateGetAssetBalances(this.extend(i,e))}else s=await this.privateGetAccountBalance(this.extend(i,e));return this.parseBalanceByType(s)}createOrderRequest(e,t,i,s,r=void 0,a={}){const o={instId:this.market(e).id,side:i,orderType:t,size:this.amountToPrecision(e,s),brokerId:this.safeString(this.options,"brokerId","ec6dd3a7dd982d0b")};let n;[n,a]=this.handleMarginModeAndParams("createOrder",a,"cross"),o.marginMode=n;const d=this.safeString(a,"timeInForce","GTC"),h="market"===t;a=this.omit(a,["timeInForce"]);h||h&&("IOC"===d||"ioc"===t)?o.orderType="market":o.price=this.priceToPrecision(e,r);let c=!1;[c,a]=this.handlePostOnly(h,"post_only"===t,a),c&&(o.type="post_only");const l=this.safeDict(a,"stopLoss"),u=this.safeDict(a,"takeProfit");a=this.omit(a,["stopLoss","takeProfit"]);const f=void 0!==l,p=void 0!==u;if(f||p){if(f){const t=this.safeString2(l,"triggerPrice","stopPrice");o.slTriggerPrice=this.priceToPrecision(e,t);const i=this.safeString(l,"price","-1");o.slOrderPrice=this.priceToPrecision(e,i)}if(p){const t=this.safeString2(u,"triggerPrice","stopPrice");o.tpTriggerPrice=this.priceToPrecision(e,t);const i=this.safeString(u,"price","-1");o.tpOrderPrice=this.priceToPrecision(e,i)}}return this.extend(o,a)}parseOrderStatus(e){return this.safeString({canceled:"canceled",order_failed:"canceled",live:"open",partially_filled:"open",filled:"closed",effective:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"tpslId","orderId"),s=this.safeInteger(e,"createTime"),r=this.safeInteger(e,"updateTime"),o=this.safeInteger(e,"fillTime"),n=this.safeString(e,"side");let d,h,c=this.safeString(e,"orderType");"post_only"===c?(d=!0,c="limit"):"fok"===c?(h="FOK",c="limit"):"ioc"===c&&(h="IOC",c="limit");const l=this.safeString(e,"instId");t=this.safeMarket(l,t);const u=this.safeSymbol(l,t,"-"),f=this.safeString(e,"filledSize"),p=this.safeString2(e,"px","price"),m=this.safeString(e,"averagePrice"),g=this.parseOrderStatus(this.safeString(e,"state")),v=this.safeString(e,"fee"),y=this.safeString(e,"size"),w=this.safeString(e,"leverage","1"),b=this.safeString(t,"contractSize"),k=a.Y.stringMul(b,f);let S,O;if(void 0!==m&&(S=a.Y.stringMul(m,k),S=a.Y.stringDiv(S,w)),void 0!==v){const t=a.Y.stringAbs(v),i=this.safeString(e,"feeCcy","USDT"),s=this.safeCurrencyCode(i);O={cost:this.parseNumber(t),currency:s}}let T=this.safeString(e,"clientOrderId");void 0!==T&&T.length<1&&(T=void 0);const P=this.safeNumber(e,"slTriggerPrice"),I=this.safeNumber(e,"slOrderPrice"),M=this.safeNumber(e,"tpTriggerPrice"),x=this.safeNumber(e,"tpOrderPrice"),A="true"===this.safeString(e,"reduceOnly");return this.safeOrder({info:e,id:i,clientOrderId:T,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:o,lastUpdateTimestamp:r,symbol:u,type:c,timeInForce:h,postOnly:d,side:n,price:p,stopLossTriggerPrice:P,takeProfitTriggerPrice:M,stopLossPrice:I,takeProfitPrice:x,average:m,cost:S,amount:y,filled:f,remaining:void 0,status:g,fee:O,trades:void 0,reduceOnly:A},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"tpsl",!1);let d;a=this.omit(a,"tpsl"),[d,a]=this.handleOptionAndParams(a,"createOrder","method","privatePostTradeOrder");const h=void 0!==this.safeString(a,"stopLossPrice"),c=void 0!==this.safeString(a,"takeProfitPrice");let l;if(n||"privatePostTradeOrderTpsl"===d||(h||c)){const o=this.createTpslOrderRequest(e,t,i,s,r,a);l=await this.privatePostTradeOrderTpsl(o)}else{const o=this.createOrderRequest(e,t,i,s,r,a);l=await this.privatePostTradeOrder(o)}const u=this.safeList(l,"data",[]),f=this.safeDict(u,0),p=this.parseOrder(f,o);return p.type=t,p.side=i,p}createTpslOrderRequest(e,t,i,s=void 0,a=void 0,o={}){const n=this.market(e),d=this.safeString(o,"positionSide","net"),h={instId:n.id,side:i,positionSide:d,brokerId:this.safeString(this.options,"brokerId","ec6dd3a7dd982d0b")};void 0!==s&&(h.size=this.amountToPrecision(e,s));const c=this.safeString(o,"marginMode","cross");if("cross"!==c&&"isolated"!==c)throw new r.BadRequest(this.id+" createTpslOrder() requires a marginMode parameter that must be either cross or isolated");const l=this.safeString(o,"stopLossPrice"),u=this.safeString(o,"takeProfitPrice");return void 0!==l?(h.slTriggerPrice=this.priceToPrecision(e,l),h.slOrderPrice="market"===t?"-1":this.priceToPrecision(e,a)):void 0!==u&&(h.tpTriggerPrice=this.priceToPrecision(e,u),h.tpOrderPrice="market"===t?"-1":this.priceToPrecision(e,a)),h.marginMode=c,o=this.omit(o,["stopLossPrice","takeProfitPrice"]),this.extend(h,o)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={instId:s.id},o=this.safeBoolN(i,["stop","trigger","tpsl"],!1),n=this.safeString(i,"clientOrderId");void 0!==n?a.clientOrderId=n:o?a.tpslId=e.toString():a.orderId=e.toString();const d=this.omit(i,["orderId","clientOrderId","stop","trigger","tpsl"]);if(o){const s=await this.cancelOrders([e],t,i);return this.safeDict(s,0)}const h=await this.privatePostTradeCancelOrder(this.extend(a,d)),c=this.safeList(h,"data",[]),l=this.safeDict(c,0);return this.parseOrder(l,s)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"symbol"),o=this.safeString(r,"type"),n=this.safeString(r,"side"),d=this.safeValue(r,"amount"),h=this.safeValue(r,"price"),c=this.safeDict(r,"params",{}),l=this.extend(c,t),u=this.createOrderRequest(a,o,n,d,h,l);i.push(u)}const s=await this.privatePostTradeBatchOrders(i),r=this.safeList(s,"data",[]);return this.parseOrders(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchOpenOrders",e,t,i,s);const a={};let o;void 0!==e&&(o=this.market(e),a.instId=o.id),void 0!==i&&(a.limit=i);const n=this.safeBoolN(s,["stop","trigger","tpsl","TPSL"],!1);let d;[d,s]=this.handleOptionAndParams(s,"fetchOpenOrders","method","privateGetTradeOrdersPending");const h=this.omit(s,["method","stop","trigger","tpsl","TPSL"]);let c;c=n||"privateGetTradeOrdersTpslPending"===d?await this.privateGetTradeOrdersTpslPending(this.extend(a,h)):await this.privateGetTradeOrdersPending(this.extend(a,h));const l=this.safeList(c,"data",[]);return this.parseOrders(l,o,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);let a,o={};void 0!==e&&(a=this.market(e),o.instId=a.id),[o,s]=this.handleUntilOption("end",o,s),void 0!==i&&(o.limit=i);const n=await this.privateGetTradeFillsHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchDeposits",e,t,i,s);let a,o={};void 0!==e&&(a=this.currency(e),o.currency=a.id),void 0!==t&&(o.before=Math.max(t-1,0)),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("after",o,s);const n=await this.privateGetAssetDepositHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchWithdrawals",e,t,i,s);let a,o={};void 0!==e&&(a=this.currency(e),o.currency=a.id),void 0!==t&&(o.before=Math.max(t-1,0)),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("after",o,s);const n=await this.privateGetAssetWithdrawalHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,s)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s);let a,o,n={};void 0!==i&&(n.limit=i),void 0!==e&&(a=this.currency(e),n.currency=a.id),[n,s]=this.handleUntilOption("end",n,s),o=await this.privateGetAssetBills(this.extend(n,s));const d=this.safeList(o,"data",[]);return this.parseLedger(d,a,t,i)}parseTransaction(e,t=void 0){let i,s;const r=this.safeString(e,"withdrawId"),a=this.safeString(e,"depositId"),o=this.safeString(e,"address"),n=o,d=this.safeString(e,"tag");void 0!==r?(i="withdrawal",s=r):(s=a,i="deposit");const h=this.safeString(e,"currency"),c=this.safeCurrencyCode(h),l=this.safeNumber(e,"amount"),u=this.parseTransactionStatus(this.safeString(e,"state")),f=this.safeString(e,"txId"),p=this.safeInteger(e,"ts"),m=this.safeString(e,"feeCurrency"),g=this.safeCurrencyCode(m),v=this.safeNumber(e,"fee");return{info:e,id:s,currency:c,amount:l,network:void 0,addressFrom:void 0,addressTo:o,address:n,tagFrom:void 0,tagTo:d,tag:d,status:u,type:i,updated:void 0,txid:f,timestamp:p,datetime:this.iso8601(p),internal:void 0,comment:void 0,fee:{currency:g,cost:v}}}parseTransactionStatus(e){return this.safeString({0:"pending",1:"ok",2:"failed",3:"pending"},e,e)}parseLedgerEntryType(e){return this.safeString({1:"transfer",2:"trade",3:"trade",4:"rebate",5:"trade",6:"transfer",7:"trade",8:"fee",9:"trade",10:"trade",11:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeInteger(e,"ts");return this.safeLedgerEntry({info:e,id:this.safeString(e,"transferId"),direction:void 0,account:void 0,referenceId:this.safeString(e,"clientId"),referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:s,amount:this.safeNumber(e,"amount"),timestamp:r,datetime:this.iso8601(r),before:void 0,after:void 0,status:"ok",fee:void 0},t)}parseIds(e){return"string"==typeof e?e.split(","):e}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=[],o=this.safeDict(this.options,"cancelOrders",{}),n=this.safeString(o,"method","privatePostTradeCancelBatchOrders");let d=this.safeString(i,"method",n);const h=this.parseIds(this.safeValue(i,"clientOrderId")),c=this.parseIds(this.safeValue(i,"tpslId")),l=this.safeBoolN(i,["stop","trigger","tpsl"]);if(l&&(d="privatePostTradeCancelTpsl"),void 0===h){if(e=this.parseIds(e),void 0!==c)for(let e=0;e<c.length;e++)a.push({tpslId:c[e],instId:s.id});for(let t=0;t<e.length;t++)l?a.push({tpslId:e[t],instId:s.id}):a.push({orderId:e[t],instId:s.id})}else for(let e=0;e<h.length;e++)a.push({instId:s.id,clientOrderId:h[e]});let u;u="privatePostTradeCancelTpsl"===d?await this.privatePostTradeCancelTpsl(a):await this.privatePostTradeCancelBatchOrders(a);const f=this.safeList(u,"data",[]);return this.parseOrders(f,s,void 0,void 0,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h={currency:a.id,amount:this.currencyToPrecision(e,t),fromAccount:n,toAccount:d},c=await this.privatePostAssetTransfer(this.extend(h,r)),l=this.safeDict(c,"data",{});return this.parseTransfer(l,a)}parseTransfer(e,t=void 0){return{info:e,id:this.safeString(e,"transferId"),timestamp:void 0,datetime:void 0,currency:void 0,amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0}}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.privateGetAccountPositions(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0);if(void 0!==o)return this.parsePosition(o,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.privateGetAccountPositions(t),s=this.safeList(i,"data",[]),r=this.parsePositions(s);return this.filterByArrayPositions(r,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"instId"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString(e,"positions"),o=a.Y.stringAbs(r);let n=this.safeString(e,"positionSide");const d="net"!==n,h=this.parseNumber(o);void 0!==r&&"net"===n&&(n=a.Y.stringGt(r,"0")?"long":a.Y.stringLt(r,"0")?"short":void 0);const c=this.safeNumber(t,"contractSize"),l=this.numberToString(c),u=this.safeString(e,"markPrice");let f=this.safeString(e,"notionalUsd");t.inverse&&(f=a.Y.stringDiv(a.Y.stringMul(o,l),u));const p=this.parseNumber(f),m=this.safeString(e,"marginMode");let g;const v=this.safeString(e,"averagePrice"),y=this.safeString(e,"unrealizedPnl"),w=this.safeString(e,"leverage");let b,k;"cross"===m?(g=this.safeString(e,"initialMargin"),k=a.Y.stringAdd(g,y)):"isolated"===m&&(b=a.Y.stringDiv("1",w),k=this.safeString(e,"margin"));const S=this.safeString(e,"maintenanceMargin"),O=this.parseNumber(S),T=a.Y.stringDiv(S,f);void 0===b?b=this.parseNumber(a.Y.stringDiv(g,f,4)):void 0===g&&(g=a.Y.stringMul(b,f));const P=this.parseNumber(a.Y.stringDiv(a.Y.stringAdd(T,"0.00005"),"1",4)),I=this.safeNumber(e,"liquidationPrice"),M=this.safeString(e,"unrealizedPnlRatio"),x=this.parseNumber(a.Y.stringMul(M,"100")),A=this.safeInteger(e,"updateTime"),C=this.parseNumber(a.Y.stringDiv(S,k,4));return this.safePosition({info:e,id:void 0,symbol:s,notional:p,marginMode:m,liquidationPrice:I,entryPrice:this.parseNumber(v),unrealizedPnl:this.parseNumber(y),percentage:x,contracts:h,contractSize:c,markPrice:this.parseNumber(u),lastPrice:void 0,side:n,hedged:d,timestamp:A,datetime:this.iso8601(A),lastUpdateTimestamp:void 0,maintenanceMargin:O,maintenanceMarginPercentage:P,collateral:this.parseNumber(k),initialMargin:this.parseNumber(g),initialMarginPercentage:this.parseNumber(b),leverage:this.parseNumber(w),marginRatio:C,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchLeverages(e=void 0,t={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchLeverages() requires a symbols argument");let i;if([i,t]=this.handleMarginModeAndParams("fetchLeverages",t),void 0===i&&(i=this.safeString(t,"marginMode","cross")),"cross"!==i&&"isolated"!==i)throw new r.BadRequest(this.id+" fetchLeverages() requires a marginMode parameter that must be either cross or isolated");e=this.marketSymbols(e);let s="";for(let t=0;t<e.length;t++){const i=e[t],r=this.market(i);t>0?s=s+","+r.id:s+=r.id}const a={instId:s,marginMode:i},o=await this.privateGetAccountBatchLeverageInfo(this.extend(a,t)),n=this.safeList(o,"data",[]);return this.parseLeverages(n,e,"instId")}async fetchLeverage(e,t={}){let i;if(await this.loadMarkets(),[i,t]=this.handleMarginModeAndParams("fetchLeverage",t),void 0===i&&(i=this.safeString(t,"marginMode","cross")),"cross"!==i&&"isolated"!==i)throw new r.BadRequest(this.id+" fetchLeverage() requires a marginMode parameter that must be either cross or isolated");const s=this.market(e),a={instId:s.id,marginMode:i},o=await this.privateGetAccountLeverageInfo(this.extend(a,t)),n=this.safeDict(o,"data",{});return this.parseLeverage(n,s)}parseLeverage(e,t=void 0){const i=this.safeString(e,"instId"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"marginMode"),longLeverage:s,shortLeverage:s}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<1||e>125)throw new r.BadRequest(this.id+" setLeverage() leverage should be between 1 and 125");await this.loadMarkets();const s=this.market(t);let a;if([a,i]=this.handleMarginModeAndParams("setLeverage",i,"cross"),"cross"!==a&&"isolated"!==a)throw new r.BadRequest(this.id+" setLeverage() requires a marginMode parameter that must be either cross or isolated");const o={leverage:e,marginMode:a,instId:s.id};return await this.privatePostAccountSetLeverage(this.extend(o,i))}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r=this.safeString(i,"clientOrderId");let a;[a,i]=this.handleMarginModeAndParams("closePosition",i,"cross");const o={instId:s.id,marginMode:a};void 0!==r&&(o.clientOrderId=r);const n=await this.privatePostTradeClosePosition(this.extend(o,i));return this.safeDict(n,"data")}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s);const a={};let o;void 0!==e&&(o=this.market(e),a.instId=o.id),void 0!==i&&(a.limit=i),void 0!==t&&(a.begin=t);const n=this.safeBoolN(s,["stop","trigger","tpsl","TPSL"],!1);let d;[d,s]=this.handleOptionAndParams(s,"fetchOpenOrders","method","privateGetTradeOrdersHistory");const h=this.omit(s,["method","stop","trigger","tpsl","TPSL"]);let c;c=n||"privateGetTradeOrdersTpslHistory"===d?await this.privateGetTradeOrdersTpslHistory(this.extend(a,h)):await this.privateGetTradeOrdersHistory(this.extend(a,h));const l=this.safeList(c,"data",[]);return this.parseOrders(l,o,t,i)}async fetchMarginMode(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.privateGetAccountMarginMode(t),r=this.safeDict(s,"data",{});return this.parseMarginMode(r,i)}parseMarginMode(e,t=void 0){return{info:e,symbol:t.symbol,marginMode:this.safeString(e,"marginMode")}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"msg"),u=this.id+" "+o;if(void 0!==c&&"0"!==c)throw this.throwExactlyMatchedException(this.exceptions.exact,l,u),this.throwExactlyMatchedException(this.exceptions.exact,c,u),this.throwBroadlyMatchedException(this.exceptions.broad,l,u),new r.ExchangeError(u);const f=this.safeList(n,"data"),p=this.safeDict(f,0),m=this.safeString(p,"msg"),g=this.safeString(p,"code");void 0!==g&&"0"!==g&&(this.throwExactlyMatchedException(this.exceptions.exact,g,u),this.throwExactlyMatchedException(this.exceptions.exact,m,u),this.throwBroadlyMatchedException(this.exceptions.broad,m,u))}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/api/"+this.version+"/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));let h=this.implodeHostname(this.urls.api.rest)+o;if("public"===t)this.isEmpty(d)||(h+="?"+this.urlencode(d));else if("private"===t){this.checkRequiredCredentials();const e=this.milliseconds().toString();r={"ACCESS-KEY":this.apiKey,"ACCESS-PASSPHRASE":this.password,"ACCESS-TIMESTAMP":e,"ACCESS-NONCE":e};let t="";if("GET"===i){if(!this.isEmpty(d)){const e="?"+this.urlencode(d);h+=e,o+=e}}else this.isEmpty(d)||(t=a=this.json(d)),r["Content-Type"]="application/json";const s=o+i+e+e+t,c=this.stringToBase64(this.hmac(this.encode(s),this.encode(this.secret),n.s));r["ACCESS-SIGN"]=c}return{url:h,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"btcalpha",name:"BTC-Alpha",countries:["US"],version:"v1",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL2OrderBook:!0,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{"5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","1d":"D"},urls:{logo:"https://github.com/user-attachments/assets/dce49f3a-61e5-4ba0-a2fe-41d192fd0e5d",api:{rest:"https://btc-alpha.com/api"},www:"https://btc-alpha.com",doc:"https://btc-alpha.github.io/api-docs",fees:"https://btc-alpha.com/fees/",referral:"https://btc-alpha.com/?r=123788"},api:{public:{get:["currencies/","pairs/","orderbook/{pair_name}","exchanges/","charts/{pair}/{type}/chart/","ticker/"]},private:{get:["wallets/","orders/own/","order/{id}/","exchanges/own/","deposits/","withdraws/"],post:["order/","order-cancel/"]}},fees:{trading:{maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")},funding:{withdraw:{}}},commonCurrencies:{CBC:"Cashbery"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:2e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:2e3,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:2e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{max:720}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{},broad:{"Out of balance":r.InsufficientFunds}}})}async fetchMarkets(e={}){const t=await this.publicGetPairs(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeString(e,"currency1"),s=this.safeString(e,"currency2"),r=this.safeCurrencyCode(i),o=this.safeCurrencyCode(s),n=this.safeString(e,"price_precision"),d=this.parsePrecision(n),h=this.safeString(e,"minimum_order_size");return{id:t,symbol:r+"/"+o,base:r,quote:o,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amount_precision"))),price:this.parseNumber(this.parsePrecision(n))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber(h),max:this.safeNumber(e,"maximum_order_size")},price:{min:this.parseNumber(d),max:void 0},cost:{min:this.parseNumber(a.Y.stringMul(d,h)),max:void 0}},created:void 0,info:e}}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTicker(t);return this.parseTickers(i,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(r,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"timestamp"),s=parseInt(a.Y.stringMul(i,"1000000")),r=this.safeString(e,"pair");t=this.safeMarket(r,t,"_");const o=this.safeString(e,"last");return this.safeTicker({info:e,symbol:t.symbol,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:o,last:o,previousClose:void 0,change:this.safeString(e,"diff"),percentage:void 0,average:void 0,baseVolume:void 0,quoteVolume:this.safeString(e,"vol")},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair_name:s.id};t&&(r.limit_sell=t,r.limit_buy=t);const a=await this.publicGetOrderbookPairName(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"buy","sell","price","amount")}parseBidsAsks(e,t=0,i=1,s=2){const r=[];for(let s=0;s<e.length;s++){const a=e[s];a&&r.push(this.parseBidAsk(a,t,i))}return r}parseTrade(e,t=void 0){const i=this.safeString(e,"pair");t=this.safeMarket(i,t,"_");const s=this.safeString(e,"timestamp"),r=this.parseToInt(a.Y.stringMul(s,"1000000")),o=this.safeString(e,"price"),n=this.safeString(e,"amount"),d=this.safeString(e,"id"),h=this.safeString2(e,"my_side","type");return this.safeTrade({id:d,info:e,timestamp:r,datetime:this.iso8601(r),symbol:t.symbol,order:d,type:"limit",side:h,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.pair=r.id),void 0!==i&&(a.limit=i);const o=await this.publicGetExchanges(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a=await this.privateGetDeposits(s);return this.parseTransactions(a,r,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.currency_id=r.id);const o=await this.privateGetWithdraws(this.extend(a,s));return this.parseTransactions(o,r,t,i,{type:"withdrawal"})}parseTransaction(e,t=void 0){const i=this.safeTimestamp(e,"timestamp"),s=this.safeString(e,"currency"),r=this.safeString(e,"status");return{id:this.safeString(e,"id"),info:e,timestamp:i,datetime:this.iso8601(i),network:void 0,address:void 0,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"amount"),txid:void 0,type:void 0,status:this.parseTransactionStatus(r),comment:void 0,internal:void 0,fee:void 0,updated:void 0}}parseTransactionStatus(e){return this.safeString({10:"pending",20:"pending",30:"ok",40:"failed",50:"canceled"},e,e)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"time"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="5m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={pair:a.id,type:this.safeString(this.timeframes,t,t)};void 0!==s&&(o.limit=s),void 0!==i&&(o.since=this.parseToInt(i/1e3));const n=await this.publicGetChartsPairTypeChart(this.extend(o,r));return this.parseOHLCVs(n,a,t,i,s)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.used=this.safeString(s,"reserve"),o.total=this.safeString(s,"balance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetWallets(e);return this.parseBalance(t)}parseOrderStatus(e){return this.safeString({1:"open",2:"canceled",3:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"pair"),s=(t=this.safeMarket(i,t,"_")).symbol;let r;r=this.safeBool(e,"success",!1)?this.safeTimestamp(e,"date"):this.safeInteger(e,"date");const a=this.safeString(e,"price"),o=this.safeString(e,"amount"),n=this.safeString(e,"amount_filled"),d=this.safeString(e,"amount_original"),h=this.parseOrderStatus(this.safeString(e,"status")),c=this.safeStringN(e,["oid","id","order"]),l=this.safeValue(e,"trades"),u=this.safeString2(e,"my_side","type");return this.safeOrder({id:c,clientOrderId:void 0,datetime:this.iso8601(r),timestamp:r,status:h,symbol:s,type:"limit",timeInForce:void 0,postOnly:void 0,side:u,price:a,triggerPrice:void 0,cost:void 0,amount:d,filled:n,remaining:o,trades:l,fee:void 0,info:e,lastTradeTimestamp:void 0,average:void 0},t)}async createOrder(e,t,i,s,o=void 0,n={}){if("market"===t)throw new r.InvalidOrder(this.id+" only limits orders are supported");await this.loadMarkets();const d=this.market(e),h={pair:d.id,type:i,amount:s,price:this.priceToPrecision(e,o)},c=await this.privatePostOrder(this.extend(h,n));if(!c.success)throw new r.InvalidOrder(this.id+" "+this.json(c));const l=this.parseOrder(c,d),u=l.amount.toString();return s=a.Y.stringGt(u,"0")?l.amount:s,l.amount=this.parseNumber(s),l}async cancelOrder(e,t=void 0,i={}){const s={order:e},r=await this.privatePostOrderCancel(this.extend(s,i));return this.parseOrder(r)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrderId(this.extend(s,i));return this.parseOrder(r)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.pair=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetOrdersOwn(this.extend(r,s));return this.parseOrders(o,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"1"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"3"},s))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==e){const t=this.market(e);r.pair=t.id}void 0!==i&&(r.limit=i);const a=await this.privateGetExchangesOwn(this.extend(r,s));return this.parseTrades(a,void 0,t,i)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.urlencode(this.keysort(this.omit(s,this.extractParams(e))));let d=this.urls.api.rest+"/";if("charts/{pair}/{type}/chart/"!==e&&(d+="v1/"),d+=this.implodeParams(e,s),r={Accept:"application/json"},"public"===t)o.length&&(d+="?"+o);else{this.checkRequiredCredentials();let e=this.apiKey;"POST"===i?(r["Content-Type"]="application/x-www-form-urlencoded",e+=a=o):o.length&&(d+="?"+o),r["X-KEY"]=this.apiKey,r["X-SIGN"]=this.hmac(this.encode(e),this.encode(this.secret),n.s),r["X-NONCE"]=this.nonce().toString()}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"error");if(void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),new r.ExchangeError(e)}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"btcbox",name:"BtcBox",countries:["JP"],rateLimit:1e3,version:"v1",pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1,ws:!1},urls:{logo:"https://github.com/user-attachments/assets/1e2cb499-8d0f-4f8f-9464-3c015cfbc76b",api:{rest:"https://www.btcbox.co.jp/api"},www:"https://www.btcbox.co.jp/",doc:"https://blog.btcbox.jp/en/archives/8762",fees:"https://support.btcbox.co.jp/hc/en-us/articles/360001235694-Fees-introduction"},api:{public:{get:["depth","orders","ticker","tickers"]},private:{post:["balance","trade_add","trade_cancel","trade_list","trade_view","wallet"]}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{104:r.AuthenticationError,105:r.PermissionDenied,106:r.InvalidNonce,107:r.InvalidOrder,200:r.InsufficientFunds,201:r.InvalidOrder,202:r.InvalidOrder,203:r.OrderNotFound,401:r.OrderNotFound,402:r.DDoSProtection}})}async fetchMarkets(e={}){const t=await this.publicGetTickers(),i=Object.keys(t),s=[];for(let e=0;e<i.length;e++){const r=i[e],a=r.split("_"),o=this.safeString(a,0),n=this.safeString(a,1),d=n.toLowerCase(),h=o.toLowerCase(),c=t[r],l=o+"/"+n,u="BTC"===h?this.parseNumber("0.0005"):this.parseNumber("0.0010");s.push(this.safeMarketStructure({id:h,uppercaseId:void 0,symbol:l,base:o,baseId:h,quote:n,quoteId:d,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,taker:u,maker:u,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0},leverage:{min:void 0,max:void 0}},precision:{price:void 0,amount:void 0},active:void 0,created:void 0,info:c}))}return s}parseMarket(e){const t=this.safeString(e,"base"),i=this.safeCurrencyCode(t),s=this.safeString(e,"quote"),r=this.safeCurrencyCode(s),a=i+"/"+r;return{id:this.safeString(e,"symbol"),uppercaseId:void 0,symbol:a,base:i,baseId:t,quote:r,quoteId:s,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,limits:{amount:{min:this.safeNumber(e,"minLimitBaseAmount"),max:this.safeNumber(e,"maxLimitBaseAmount")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0},leverage:{min:void 0,max:void 0}},precision:{price:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrecision"))),amount:this.parseNumber(this.parsePrecision(this.safeString(e,"basePrecision")))},active:void 0,created:void 0,info:e}}parseBalance(e){const t={info:e},i=Object.keys(this.currencies);for(let s=0;s<i.length;s++){const r=i[s],a=this.currency(r).id,o=a+"_balance";if(o in e){const i=this.account(),s=a+"_lock";i.free=this.safeString(e,o),i.used=this.safeString(e,s),t[r]=i}}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={};this.symbols.length>1&&(r.coin=s.baseId);const a=await this.publicGetDepth(this.extend(r,i));return this.parseOrderBook(a,s.symbol)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"vol"),quoteVolume:this.safeString(e,"volume"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={};this.symbols.length>1&&(s.coin=i.baseId);const r=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t);return this.parseTickers(i,e)}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"date");t=this.safeMarket(void 0,t);const s=this.safeString(e,"tid"),r=this.safeString(e,"price"),a=this.safeString(e,"amount"),o=this.safeString(e,"type");return this.safeTrade({info:e,id:s,order:void 0,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,type:undefined,side:o,takerOrMaker:void 0,price:r,amount:a,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={};this.symbols.length>1&&(a.coin=r.baseId);const o=await this.publicGetOrders(this.extend(a,s));return this.parseTrades(o,r,t,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={amount:s,price:r,type:i,coin:o.baseId},d=await this.privatePostTradeAdd(this.extend(n,a));return this.parseOrder(d,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets(),void 0===t&&(t="BTC/JPY");const s=this.market(t),r={id:e,coin:s.baseId},a=await this.privatePostTradeCancel(this.extend(r,i));return this.parseOrder(a,s)}parseOrderStatus(e){return this.safeString({part:"open",all:"closed",cancelled:"canceled",closed:"closed",no:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id");let s;void 0!==this.safeString(e,"datetime")&&(s=this.parse8601(e.datetime+"+09:00"));const r=this.safeString(e,"amount_original"),o=this.safeString(e,"amount_outstanding"),n=this.safeString(e,"price");let d=this.parseOrderStatus(this.safeString(e,"status"));void 0===d&&a.Y.stringEquals(o,"0")&&(d="closed");t=this.safeMarket(void 0,t);const h=this.safeString(e,"type");return this.safeOrder({id:i,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,amount:r,remaining:o,filled:void 0,side:h,type:void 0,timeInForce:void 0,postOnly:void 0,status:d,symbol:t.symbol,price:n,triggerPrice:void 0,cost:void 0,trades:undefined,fee:void 0,info:e,average:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets(),void 0===t&&(t="BTC/JPY");const s=this.market(t),r=this.extend({id:e,coin:s.baseId},i),a=await this.privatePostTradeView(this.extend(r,i));return this.parseOrder(a,s)}async fetchOrdersByType(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(t),o={type:e,coin:a.baseId},n=await this.privatePostTradeList(this.extend(o,r)),d=this.parseOrders(n,a,i,s);if("open"===e)for(let e=0;e<d.length;e++)d[e].status="open";return d}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByType("all",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByType("open",e,t,i,s)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/"+this.version+"/"+e;if("public"===t)Object.keys(s).length&&(o+="?"+this.urlencode(s));else{this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.extend({key:this.apiKey,nonce:e},s),i=this.urlencode(t),o=this.hash(this.encode(this.secret),d.F);t.signature=this.hmac(this.encode(i),this.encode(o),n.s),a=this.urlencode(t),r={"Content-Type":"application/x-www-form-urlencoded"}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(e>=400)return;const c=this.safeValue(n,"result");if(void 0===c||!0===c)return;const l=this.safeValue(n,"code"),u=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions,l,u),new r.ExchangeError(u)}async request(e,t="public",i="GET",s={},a=void 0,o=void 0,n={}){let d=await this.fetch2(e,t,i,s,a,o,n);if("string"==typeof d){if(d=this.strip(d),!this.isJsonEncodedObject(d))throw new r.ExchangeError(this.id+" "+d);d=JSON.parse(d)}return d}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"btcmarkets",name:"BTC Markets",countries:["AU"],rateLimit:1e3,version:"v3",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,createTriggerOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:"emulated",fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTime:!0,fetchTrades:!0,fetchTransactions:"emulated",fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},urls:{logo:"https://github.com/user-attachments/assets/8c8d6907-3873-4cc4-ad20-e22fba28247e",api:{public:"https://api.btcmarkets.net",private:"https://api.btcmarkets.net"},www:"https://btcmarkets.net",doc:["https://api.btcmarkets.net/doc/v3","https://github.com/BTCMarkets/API"]},api:{public:{get:["markets","markets/{marketId}/ticker","markets/{marketId}/trades","markets/{marketId}/orderbook","markets/{marketId}/candles","markets/tickers","markets/orderbooks","time"]},private:{get:["orders","orders/{id}","batchorders/{ids}","trades","trades/{id}","withdrawals","withdrawals/{id}","deposits","deposits/{id}","transfers","transfers/{id}","addresses","withdrawal-fees","assets","accounts/me/trading-fees","accounts/me/withdrawal-limits","accounts/me/balances","accounts/me/transactions","reports/{id}"],post:["orders","batchorders","withdrawals","reports"],delete:["orders","orders/{id}","batchorders/{ids}"],put:["orders/{id}"]}},timeframes:{"1m":"1m","1h":"1h","1d":"1d"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!0,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb,exceptions:{exact:{InsufficientFund:r.InsufficientFunds,InvalidPrice:r.InvalidOrder,InvalidAmount:r.InvalidOrder,MissingArgument:r.BadRequest,OrderAlreadyCancelled:r.InvalidOrder,OrderNotFound:r.OrderNotFound,OrderStatusIsFinal:r.InvalidOrder,InvalidPaginationParameter:r.BadRequest},broad:{}},fees:{percentage:!0,tierBased:!0,maker:this.parseNumber("-0.0005"),taker:this.parseNumber("0.0020")},options:{fees:{AUD:{maker:this.parseNumber("0.0085"),taker:this.parseNumber("0.0085")}}}})}async fetchTransactionsWithMethod(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==s&&(a.limit=s),void 0!==i&&(a.after=i),void 0!==t&&(o=this.currency(t));const n=await this[e](this.extend(a,r));return this.parseTransactions(n,o,i,s)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsWithMethod("privateGetTransfers",e,t,i,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsWithMethod("privateGetDeposits",e,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsWithMethod("privateGetWithdrawals",e,t,i,s)}parseTransactionStatus(e){return this.safeString({Accepted:"pending","Pending Authorization":"pending",Complete:"ok",Cancelled:"cancelled",Failed:"failed"},e,e)}parseTransactionType(e){return this.safeString({Withdraw:"withdrawal",Deposit:"deposit"},e,e)}parseTransaction(e,t=void 0){const i=this.parse8601(this.safeString(e,"creationTime")),s=this.parse8601(this.safeString(e,"lastUpdate"));let r=this.parseTransactionType(this.safeStringLower(e,"type"));"withdraw"===r&&(r="withdrawal");const a=this.safeDict(e,"paymentDetail",{}),n=this.safeString(a,"txId");let d,h=this.safeString(a,"address");if(void 0!==h){const e=h.split("?dt=");e.length>1&&(h=e[0],d=e[1])}const c=h,l=d,u=this.safeString(e,"fee"),f=this.parseTransactionStatus(this.safeString(e,"status")),p=this.safeString(e,"assetName"),m=this.safeCurrencyCode(p);let g=this.safeString(e,"amount");return u&&(g=o.Y.stringSub(g,u)),{id:this.safeString(e,"id"),txid:n,timestamp:i,datetime:this.iso8601(i),network:void 0,address:h,addressTo:c,addressFrom:undefined,tag:d,tagTo:l,tagFrom:undefined,type:r,amount:this.parseNumber(g),currency:m,status:f,updated:s,comment:this.safeString(e,"description"),internal:void 0,fee:{currency:m,cost:this.parseNumber(u),rate:void 0},info:e}}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"baseAssetName"),i=this.safeString(e,"quoteAssetName"),s=this.safeString(e,"marketId"),r=this.safeCurrencyCode(t),a=this.safeCurrencyCode(i),o=r+"/"+a,n=this.safeValue(this.safeDict(this.options,"fees",{}),a,this.fees),d=this.parseNumber(this.parsePrecision(this.safeString(e,"priceDecimals"))),h=this.safeNumber(e,"minOrderAmount"),c=this.safeNumber(e,"maxOrderAmount");let l;return"AUD"===a&&(l=d),{id:s,symbol:o,base:r,quote:a,settle:void 0,baseId:t,quoteId:i,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"Online"===this.safeString(e,"status"),contract:!1,linear:void 0,inverse:void 0,taker:n.taker,maker:n.maker,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amountDecimals"))),price:d},limits:{leverage:{min:void 0,max:void 0},amount:{min:h,max:c},price:{min:l,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.parse8601(this.safeString(t,"timestamp"))}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"assetName"),a=this.safeCurrencyCode(r),o=this.account();o.used=this.safeString(s,"locked"),o.total=this.safeString(s,"balance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountsMeBalances(e);return this.parseBalance(t)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,0)),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={marketId:a.id,timeWindow:this.safeString(this.timeframes,t,t)};void 0!==i&&(o.from=this.iso8601(i)),void 0!==s&&(o.limit=Math.min(s,200));const n=await this.publicGetMarketsMarketIdCandles(this.extend(o,r));return this.parseOHLCVs(n,a,t,i,s)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={marketId:this.market(e).id},r=await this.publicGetMarketsMarketIdOrderbook(this.extend(s,i)),a=this.safeIntegerProduct(r,"snapshotId",.001),o=this.parseOrderBook(r,e,a);return o.nonce=this.safeInteger(r,"snapshotId"),o}parseTicker(e,t=void 0){const i=this.safeString(e,"marketId"),s=(t=this.safeMarket(i,t,"-")).symbol,r=this.parse8601(this.safeString(e,"timestamp")),a=this.safeString(e,"lastPrice"),o=this.safeString(e,"volume24h"),n=this.safeString(e,"volumeQte24h"),d=this.safeString(e,"price24h"),h=this.safeString(e,"pricePct24h");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high24h"),low:this.safeString(e,"low"),bid:this.safeString(e,"bestBid"),bidVolume:void 0,ask:this.safeString(e,"bestAsk"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:d,percentage:h,average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={marketId:i.id},r=await this.publicGetMarketsMarketIdTicker(this.extend(s,t));return this.parseTicker(r,i)}async fetchTicker2(e,t={}){await this.loadMarkets();const i=this.market(e),s={id:i.id},r=await this.publicGetMarketsMarketIdTicker(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString(e,"timestamp")),s=this.safeString(e,"marketId"),r="AUD"===(t=this.safeMarket(s,t,"-")).quote?t.quote:t.base;let a=this.safeString(e,"side");"Bid"===a?a="buy":"Ask"===a&&(a="sell");const o=this.safeString(e,"id"),n=this.safeString(e,"price"),d=this.safeString(e,"amount"),h=this.safeString(e,"orderId");let c;const l=this.safeString(e,"fee");void 0!==l&&(c={cost:l,currency:r});const u=this.safeStringLower(e,"liquidityType");return this.safeTrade({info:e,id:o,timestamp:i,datetime:this.iso8601(i),order:h,symbol:t.symbol,type:void 0,side:a,price:n,amount:d,cost:void 0,takerOrMaker:u,fee:c},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={marketId:r.id},o=await this.publicGetMarketsMarketIdTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={marketId:n.id,amount:this.amountToPrecision(e,s),side:"buy"===i?"Bid":"Ask"},h=t.toLowerCase(),c=this.safeValue(this.options,"orderTypes",{limit:"Limit",market:"Market",stop:"Stop","stop limit":"Stop Limit","take profit":"Take Profit"});d.type=this.safeString(c,h,t);let l=!1,u=!1;if("limit"===h?l=!0:"stop limit"===h?(u=!0,l=!0):("take profit"===h||"stop"===h)&&(u=!0),l){if(void 0===a)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price argument for a "+t+"order");d.price=this.priceToPrecision(e,a)}if(u){const i=this.safeNumber(o,"triggerPrice");if(o=this.omit(o,"triggerPrice"),void 0===i)throw new r.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice parameter for a "+t+"order");d.triggerPrice=this.priceToPrecision(e,i)}const f=this.safeString(o,"clientOrderId");void 0!==f&&(d.clientOrderId=f),o=this.omit(o,"clientOrderId");const p=await this.privatePostOrders(this.extend(d,o));return this.parseOrder(p,n)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();for(let t=0;t<e.length;t++)e[t]=parseInt(e[t]);const s={ids:e},r=await this.privateDeleteBatchordersIds(this.extend(s,i)),a=this.safeList(r,"cancelOrders",[]),o=this.safeList(r,"unprocessedRequests",[]),n=this.arrayConcat(a,o);return this.parseOrders(n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateDeleteOrdersId(this.extend(s,i));return this.parseOrder(r)}calculateFee(e,t,i,s,r,a="taker",n={}){const d=this.markets[e];let h,c;if("AUD"===d.quote){h=d.quote;const t=this.numberToString(s),i=this.numberToString(r),a=o.Y.stringMul(t,i);c=this.costToPrecision(e,a)}else h=d.base,c=this.amountToPrecision(e,s);const l=d[a],u=o.Y.stringMul(this.numberToString(l),c);return{type:a,currency:h,rate:l,cost:parseFloat(this.feeToPrecision(e,u))}}parseOrderStatus(e){return this.safeString({Accepted:"open",Placed:"open","Partially Matched":"open","Fully Matched":"closed",Cancelled:"canceled","Partially Cancelled":"canceled",Failed:"rejected"},e,e)}parseOrder(e,t=void 0){const i=this.parse8601(this.safeString(e,"creationTime")),s=this.safeString(e,"marketId");t=this.safeMarket(s,t,"-");let r=this.safeString(e,"side");"Bid"===r?r="buy":"Ask"===r&&(r="sell");const a=this.safeStringLower(e,"type"),o=this.safeString(e,"price"),n=this.safeString(e,"amount"),d=this.safeString(e,"openAmount"),h=this.parseOrderStatus(this.safeString(e,"status")),c=this.safeString(e,"orderId"),l=this.safeString(e,"clientOrderId"),u=this.safeString(e,"timeInForce"),f=this.safeBool(e,"postOnly");return this.safeOrder({info:e,id:c,clientOrderId:l,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:t.symbol,type:a,timeInForce:u,postOnly:f,side:r,price:o,triggerPrice:this.safeNumber(e,"triggerPrice"),cost:void 0,amount:n,filled:void 0,remaining:d,average:void 0,status:h,trades:void 0,fee:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrdersId(this.extend(s,i));return this.parseOrder(r)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={status:"all"};let a;void 0!==e&&(a=this.market(e),r.marketId=a.id),void 0!==t&&(r.after=t),void 0!==i&&(r.limit=i);const o=await this.privateGetOrders(this.extend(r,s));return this.parseOrders(o,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"open"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){const r=await this.fetchOrders(e,t,i,s);return this.filterBy(r,"status","closed")}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.marketId=a.id),void 0!==t&&(r.after=t),void 0!==i&&(r.limit=i);const o=await this.privateGetTrades(this.extend(r,s));return this.parseTrades(o,a,t,i)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={currency_id:a.id,amount:this.currencyToPrecision(e,t)};"AUD"!==e&&(this.checkAddress(i),o.toAddress=i),void 0!==s&&(o.toAddress=i+"?dt="+s);const n=await this.privatePostWithdrawals(this.extend(o,r));return this.parseTransaction(n,a)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.version+"/"+this.implodeParams(e,s);const d=this.keysort(this.omit(s,this.extractParams(e)));if("private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.base64ToBinary(this.secret);let s=i+o+e;"GET"===i||"DELETE"===i?Object.keys(d).length&&(o+="?"+this.urlencode(d)):s+=a=this.json(d);const h=this.hmac(this.encode(s),t,n.Zf,"base64");r={Accept:"application/json","Accept-Charset":"UTF-8","Content-Type":"application/json","BM-AUTH-APIKEY":this.apiKey,"BM-AUTH-TIMESTAMP":e,"BM-AUTH-SIGNATURE":h}}else"public"===t&&Object.keys(d).length&&(o+="?"+this.urlencode(d));return{url:this.urls.api[t]+o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"message");if(void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"btcturk",name:"BTCTurk",countries:["TR"],rateLimit:100,pro:!1,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,ws:!1},timeframes:{"1m":1,"15m":15,"30m":30,"1h":60,"4h":240,"1d":"1 d","1w":"1 w","1y":"1 y"},urls:{logo:"https://github.com/user-attachments/assets/10e0a238-9f60-4b06-9dda-edfc7602f1d6",api:{public:"https://api.btcturk.com/api/v2",private:"https://api.btcturk.com/api/v1",graph:"https://graph-api.btcturk.com/v1"},www:"https://www.btcturk.com",doc:"https://github.com/BTCTrader/broker-api-docs"},api:{public:{get:{orderbook:1,ticker:.1,trades:1,ohlc:1,"server/exchangeinfo":1}},private:{get:{"users/balances":1,openOrders:1,allOrders:1,"users/transactions/trade":1},post:{"users/transactions/crypto":1,"users/transactions/fiat":1,order:1,cancelOrder:1},delete:{order:1}},graph:{get:{ohlcs:1,"klines/history":1}}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:30,symbolRequired:!0},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:30,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{maker:this.parseNumber("0.0005"),taker:this.parseNumber("0.0009")}},exceptions:{exact:{FAILED_ORDER_WITH_OPEN_ORDERS:r.InsufficientFunds,FAILED_LIMIT_ORDER:r.InvalidOrder,FAILED_MARKET_ORDER:r.InvalidOrder}},precisionMode:o.kb})}async fetchMarkets(e={}){const t=await this.publicGetServerExchangeinfo(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"symbols",[]);return this.parseMarkets(s)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeString(e,"numerator"),s=this.safeString(e,"denominator"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o=this.safeList(e,"filters",[]);let n,d,h,c,l;for(let e=0;e<o.length;e++){const t=o[e];"PRICE_FILTER"===this.safeString(t,"filterType")&&(n=this.safeNumber(t,"minPrice"),d=this.safeNumber(t,"maxPrice"),h=this.safeNumber(t,"minAmount"),c=this.safeNumber(t,"maxAmount"),l=this.safeNumber(t,"minExchangeValue"))}return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"TRADING"===this.safeString(e,"status"),contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"numeratorScale"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"denominatorScale")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:h,max:c},price:{min:n,max:d},cost:{min:l,max:void 0}},created:void 0,info:e}}parseBalance(e){const t=this.safeList(e,"data",[]),i={info:e,timestamp:void 0,datetime:void 0};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.free=this.safeString(s,"free"),o.used=this.safeString(s,"locked"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUsersBalances(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pairSymbol:s.id},a=await this.publicGetOrderbook(this.extend(r,i)),o=this.safeDict(a,"data",{}),n=this.safeInteger(o,"timestamp");return this.parseOrderBook(o,s.symbol,n,"bids","asks",0,1)}parseTicker(e,t=void 0){const i=this.safeString(e,"pair"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeInteger(e,"timestamp"),a=this.safeString(e,"last");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:a,last:a,previousClose:void 0,change:this.safeString(e,"daily"),percentage:this.safeString(e,"dailyPercent"),average:this.safeString(e,"average"),baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTicker(t),s=this.safeList(i,"data");return this.parseTickers(s,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=await this.fetchTickers([e],t);return this.safeValue(i,e)}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"date","timestamp"),s=this.safeString2(e,"tid","id"),r=this.safeString(e,"orderId"),o=this.safeString(e,"price"),n=a.Y.stringAbs(this.safeString(e,"amount")),d=this.safeString(e,"pair"),h=this.safeSymbol(d,t),c=this.safeString2(e,"side","orderType");let l;const u=this.safeString(e,"fee");if(void 0!==u){const t=this.safeString(e,"denominatorSymbol");l={cost:a.Y.stringAbs(u),currency:this.safeCurrencyCode(t)}}return this.safeTrade({info:e,id:s,order:r,timestamp:i,datetime:this.iso8601(i),symbol:h,type:void 0,side:c,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:l},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pairSymbol:r.id};void 0!==i&&(a.last=i);const o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,"data");return this.parseTrades(n,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1h",i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={symbol:o.id,resolution:this.safeValue(this.timeframes,t,t)},d=this.safeInteger(a,"until",this.milliseconds());if(n.to=this.parseToInt(d/1e3),void 0!==i?n.from=this.parseToInt(i/1e3):void 0===s&&(s=100),void 0!==s){if(s=Math.min(s,11e3),"1y"===t)throw new r.BadRequest(this.id+' fetchOHLCV () does not accept a limit parameter when timeframe == "1y"');const e=this.parseTimeframe(t)*(s-1);if(void 0!==i){const t=this.parseToInt(i/1e3)+e;n.to=Math.min(n.to,t)}else n.from=this.parseToInt(0)-e}const h=await this.graphGetKlinesHistory(this.extend(n,a));return this.parseOHLCVs(h,o,t,i,s)}parseOHLCVs(e,t=void 0,i="1m",s=void 0,r=void 0,a=!1){const o=[],n=this.safeList(e,"t",[]),d=this.safeList(e,"h",[]),h=this.safeList(e,"o",[]),c=this.safeList(e,"l",[]),l=this.safeList(e,"c",[]),u=this.safeList(e,"v",[]);for(let e=0;e<n.length;e++){const i={timestamp:this.safeInteger(n,e),high:this.safeNumber(d,e),open:this.safeNumber(h,e),low:this.safeNumber(c,e),close:this.safeNumber(l,e),volume:this.safeNumber(u,e)};o.push(this.parseOHLCV(i,t))}const f=this.sortBy(o,0);return this.filterBySinceLimit(f,s,r,0,a)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={orderType:i,orderMethod:t,pairSymbol:o.id,quantity:this.amountToPrecision(e,s)};"market"!==t&&(n.price=this.priceToPrecision(e,r)),"clientOrderId"in a?n.newClientOrderId=a.clientOrderId:"newClientOrderId"in a||(n.newClientOrderId=this.uuid());const d=await this.privatePostOrder(this.extend(n,a)),h=this.safeDict(d,"data");return this.parseOrder(h,o)}async cancelOrder(e,t=void 0,i={}){const s={id:e},r=await this.privateDeleteOrder(this.extend(s,i));return this.safeOrder({info:r})}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.pairSymbol=a.id);const o=await this.privateGetOpenOrders(this.extend(r,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"bids",[]),h=this.safeList(n,"asks",[]);return this.parseOrders(this.arrayConcat(d,h),a,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pairSymbol:r.id};void 0!==i&&(a.last=i),void 0!==t&&(a.startTime=Math.floor(t/1e3));const o=await this.privateGetAllOrders(this.extend(a,s)),n=this.safeList(o,"data");return this.parseOrders(n,r,t,i)}parseOrderStatus(e){return this.safeString({Untouched:"open",Partial:"open",Canceled:"canceled",Closed:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"price"),r=this.safeString2(e,"amount","quantity"),o=a.Y.stringAbs(r),n=this.safeString(e,"leftAmount"),d=this.safeString(e,"pairSymbol"),h=this.safeSymbol(d,t),c=this.safeString(e,"type"),l=this.safeString(e,"method"),u=this.safeString(e,"orderClientId"),f=this.safeInteger2(e,"updateTime","datetime"),p=this.safeString(e,"status"),m=this.parseOrderStatus(p);return this.safeOrder({info:e,id:i,price:s,amount:o,remaining:n,filled:void 0,cost:void 0,average:void 0,status:m,side:c,type:l,clientOrderId:u,timestamp:f,datetime:this.iso8601(f),symbol:h,fee:void 0},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privateGetUsersTransactionsTrade(),o=this.safeList(a,"data");return this.parseTrades(o,r,t,i)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},a=void 0,o=void 0){if("btctrader"===this.id)throw new r.ExchangeError(this.id+" is an abstract base API for BTCExchange, BTCTurk");let d=this.urls.api[t]+"/"+e;if("GET"===i||"DELETE"===i?Object.keys(s).length&&(d+="?"+this.urlencode(s)):o=this.json(s),"private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.base64ToBinary(this.secret),i=this.apiKey+e;a={"X-PCK":this.apiKey,"X-Stamp":e,"X-Signature":this.hmac(this.encode(i),t,n.s,"base64"),"Content-Type":"application/json"}}return{url:d,method:i,body:o,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){const c=this.safeString(n,"code","0"),l=this.safeString(n,"message"),u=void 0===l?o:l;if(this.throwExactlyMatchedException(this.exceptions.exact,l,this.id+" "+u),"0"!==c&&"SUCCESS"!==c)throw new r.ExchangeError(this.id+" "+u)}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"bybit",name:"Bybit",countries:["VG"],version:"v5",userAgent:void 0,rateLimit:20,hostname:"bybit.com",pro:!0,certified:!0,has:{CORS:!0,spot:!0,margin:!0,swap:!0,future:!0,option:!0,borrowCrossMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!0,closeAllPositions:!1,closePosition:!1,createConvertTrade:!0,createMarketBuyOrderWithCost:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingAmountOrder:!0,createTriggerOrder:!0,editOrder:!0,editOrders:!0,fetchBalance:!0,fetchBidsAsks:"emulated",fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!0,fetchClosedOrder:!0,fetchClosedOrders:!0,fetchConvertCurrencies:!0,fetchConvertQuote:!0,fetchConvertTrade:!0,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!0,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingRate:"emulated",fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchGreeks:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!0,fetchLongShortRatio:!1,fetchLongShortRatioHistory:!0,fetchMarginAdjustmentHistory:!1,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyLiquidations:!0,fetchMySettlementHistory:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!0,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:"emulated",fetchPositions:!0,fetchPositionsHistory:!0,fetchPremiumIndexOHLCV:!0,fetchSettlementHistory:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfers:!0,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!0,fetchWithdrawals:!0,repayCrossMargin:!0,sandbox:!0,setLeverage:!0,setMarginMode:!0,setPositionMode:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"1","3m":"3","5m":"5","15m":"15","30m":"30","1h":"60","2h":"120","4h":"240","6h":"360","12h":"720","1d":"D","1w":"W","1M":"M"},urls:{test:{spot:"https://api-testnet.{hostname}",futures:"https://api-testnet.{hostname}",v2:"https://api-testnet.{hostname}",public:"https://api-testnet.{hostname}",private:"https://api-testnet.{hostname}"},logo:"https://github.com/user-attachments/assets/97a5d0b3-de10-423d-90e1-6620960025ed",api:{spot:"https://api.{hostname}",futures:"https://api.{hostname}",v2:"https://api.{hostname}",public:"https://api.{hostname}",private:"https://api.{hostname}"},demotrading:{spot:"https://api-demo.{hostname}",futures:"https://api-demo.{hostname}",v2:"https://api-demo.{hostname}",public:"https://api-demo.{hostname}",private:"https://api-demo.{hostname}"},www:"https://www.bybit.com",doc:["https://bybit-exchange.github.io/docs/inverse/","https://bybit-exchange.github.io/docs/linear/","https://github.com/bybit-exchange"],fees:"https://help.bybit.com/hc/en-us/articles/360039261154",referral:"https://www.bybit.com/register?affiliate_id=35953"},api:{public:{get:{"spot/v3/public/symbols":1,"spot/v3/public/quote/depth":1,"spot/v3/public/quote/depth/merged":1,"spot/v3/public/quote/trades":1,"spot/v3/public/quote/kline":1,"spot/v3/public/quote/ticker/24hr":1,"spot/v3/public/quote/ticker/price":1,"spot/v3/public/quote/ticker/bookTicker":1,"spot/v3/public/server-time":1,"spot/v3/public/infos":1,"spot/v3/public/margin-product-infos":1,"spot/v3/public/margin-ensure-tokens":1,"v3/public/time":1,"contract/v3/public/copytrading/symbol/list":1,"derivatives/v3/public/order-book/L2":1,"derivatives/v3/public/kline":1,"derivatives/v3/public/tickers":1,"derivatives/v3/public/instruments-info":1,"derivatives/v3/public/mark-price-kline":1,"derivatives/v3/public/index-price-kline":1,"derivatives/v3/public/funding/history-funding-rate":1,"derivatives/v3/public/risk-limit/list":1,"derivatives/v3/public/delivery-price":1,"derivatives/v3/public/recent-trade":1,"derivatives/v3/public/open-interest":1,"derivatives/v3/public/insurance":1,"v5/announcements/index":5,"v5/market/time":5,"v5/market/kline":5,"v5/market/mark-price-kline":5,"v5/market/index-price-kline":5,"v5/market/premium-index-price-kline":5,"v5/market/instruments-info":5,"v5/market/orderbook":5,"v5/market/tickers":5,"v5/market/funding/history":5,"v5/market/recent-trade":5,"v5/market/open-interest":5,"v5/market/historical-volatility":5,"v5/market/insurance":5,"v5/market/risk-limit":5,"v5/market/delivery-price":5,"v5/market/account-ratio":5,"v5/spot-lever-token/info":5,"v5/spot-lever-token/reference":5,"v5/spot-margin-trade/data":5,"v5/spot-margin-trade/collateral":5,"v5/spot-cross-margin-trade/data":5,"v5/spot-cross-margin-trade/pledge-token":5,"v5/spot-cross-margin-trade/borrow-token":5,"v5/crypto-loan/collateral-data":5,"v5/crypto-loan/loanable-data":5,"v5/ins-loan/product-infos":5,"v5/ins-loan/ensure-tokens-convert":5}},private:{get:{"v5/market/instruments-info":5,"v2/private/wallet/fund/records":25,"spot/v3/private/order":2.5,"spot/v3/private/open-orders":2.5,"spot/v3/private/history-orders":2.5,"spot/v3/private/my-trades":2.5,"spot/v3/private/account":2.5,"spot/v3/private/reference":2.5,"spot/v3/private/record":2.5,"spot/v3/private/cross-margin-orders":10,"spot/v3/private/cross-margin-account":10,"spot/v3/private/cross-margin-loan-info":10,"spot/v3/private/cross-margin-repay-history":10,"spot/v3/private/margin-loan-infos":10,"spot/v3/private/margin-repaid-infos":10,"spot/v3/private/margin-ltv":10,"asset/v3/private/transfer/inter-transfer/list/query":50,"asset/v3/private/transfer/sub-member/list/query":50,"asset/v3/private/transfer/sub-member-transfer/list/query":50,"asset/v3/private/transfer/universal-transfer/list/query":25,"asset/v3/private/coin-info/query":25,"asset/v3/private/deposit/address/query":10,"contract/v3/private/copytrading/order/list":30,"contract/v3/private/copytrading/position/list":40,"contract/v3/private/copytrading/wallet/balance":25,"contract/v3/private/position/limit-info":25,"contract/v3/private/order/unfilled-orders":1,"contract/v3/private/order/list":1,"contract/v3/private/position/list":1,"contract/v3/private/execution/list":1,"contract/v3/private/position/closed-pnl":1,"contract/v3/private/account/wallet/balance":1,"contract/v3/private/account/fee-rate":1,"contract/v3/private/account/wallet/fund-records":1,"unified/v3/private/order/unfilled-orders":1,"unified/v3/private/order/list":1,"unified/v3/private/position/list":1,"unified/v3/private/execution/list":1,"unified/v3/private/delivery-record":1,"unified/v3/private/settlement-record":1,"unified/v3/private/account/wallet/balance":1,"unified/v3/private/account/transaction-log":1,"unified/v3/private/account/borrow-history":1,"unified/v3/private/account/borrow-rate":1,"unified/v3/private/account/info":1,"user/v3/private/frozen-sub-member":10,"user/v3/private/query-sub-members":5,"user/v3/private/query-api":5,"user/v3/private/get-member-type":1,"asset/v3/private/transfer/transfer-coin/list/query":50,"asset/v3/private/transfer/account-coin/balance/query":50,"asset/v3/private/transfer/account-coins/balance/query":25,"asset/v3/private/transfer/asset-info/query":50,"asset/v3/public/deposit/allowed-deposit-list/query":.17,"asset/v3/private/deposit/record/query":10,"asset/v3/private/withdraw/record/query":10,"v5/order/realtime":5,"v5/order/history":5,"v5/order/spot-borrow-check":1,"v5/position/list":5,"v5/execution/list":5,"v5/position/closed-pnl":5,"v5/position/move-history":5,"v5/pre-upgrade/order/history":5,"v5/pre-upgrade/execution/list":5,"v5/pre-upgrade/position/closed-pnl":5,"v5/pre-upgrade/account/transaction-log":5,"v5/pre-upgrade/asset/delivery-record":5,"v5/pre-upgrade/asset/settlement-record":5,"v5/account/wallet-balance":1,"v5/account/borrow-history":1,"v5/account/collateral-info":1,"v5/asset/coin-greeks":1,"v5/account/fee-rate":10,"v5/account/info":5,"v5/account/transaction-log":1,"v5/account/contract-transaction-log":1,"v5/account/smp-group":1,"v5/account/mmp-state":5,"v5/account/withdrawal":5,"v5/asset/exchange/query-coin-list":.5,"v5/asset/exchange/convert-result-query":.5,"v5/asset/exchange/query-convert-history":.5,"v5/asset/exchange/order-record":5,"v5/asset/delivery-record":5,"v5/asset/settlement-record":5,"v5/asset/transfer/query-asset-info":50,"v5/asset/transfer/query-account-coins-balance":25,"v5/asset/transfer/query-account-coin-balance":50,"v5/asset/transfer/query-transfer-coin-list":50,"v5/asset/transfer/query-inter-transfer-list":50,"v5/asset/transfer/query-sub-member-list":50,"v5/asset/transfer/query-universal-transfer-list":25,"v5/asset/deposit/query-allowed-list":5,"v5/asset/deposit/query-record":10,"v5/asset/deposit/query-sub-member-record":10,"v5/asset/deposit/query-internal-record":5,"v5/asset/deposit/query-address":10,"v5/asset/deposit/query-sub-member-address":10,"v5/asset/coin/query-info":28,"v5/asset/withdraw/query-record":10,"v5/asset/withdraw/withdrawable-amount":5,"v5/asset/withdraw/vasp/list":5,"v5/user/query-sub-members":5,"v5/user/query-api":5,"v5/user/sub-apikeys":5,"v5/user/get-member-type":5,"v5/user/aff-customer-info":5,"v5/user/del-submember":5,"v5/user/submembers":5,"v5/affiliate/aff-user-list":5,"v5/spot-lever-token/order-record":1,"v5/spot-margin-trade/interest-rate-history":5,"v5/spot-margin-trade/state":5,"v5/spot-cross-margin-trade/loan-info":1,"v5/spot-cross-margin-trade/account":1,"v5/spot-cross-margin-trade/orders":1,"v5/spot-cross-margin-trade/repay-history":1,"v5/crypto-loan/borrowable-collateralisable-number":5,"v5/crypto-loan/ongoing-orders":5,"v5/crypto-loan/repayment-history":5,"v5/crypto-loan/borrow-history":5,"v5/crypto-loan/max-collateral-amount":5,"v5/crypto-loan/adjustment-history":5,"v5/ins-loan/product-infos":5,"v5/ins-loan/ensure-tokens-convert":5,"v5/ins-loan/loan-order":5,"v5/ins-loan/repaid-history":5,"v5/ins-loan/ltv-convert":5,"v5/lending/info":5,"v5/lending/history-order":5,"v5/lending/account":5,"v5/broker/earning-record":5,"v5/broker/earnings-info":5,"v5/broker/account-info":5,"v5/broker/asset/query-sub-member-deposit-record":10},post:{"spot/v3/private/order":2.5,"spot/v3/private/cancel-order":2.5,"spot/v3/private/cancel-orders":2.5,"spot/v3/private/cancel-orders-by-ids":2.5,"spot/v3/private/purchase":2.5,"spot/v3/private/redeem":2.5,"spot/v3/private/cross-margin-loan":10,"spot/v3/private/cross-margin-repay":10,"asset/v3/private/transfer/inter-transfer":150,"asset/v3/private/withdraw/create":300,"asset/v3/private/withdraw/cancel":50,"asset/v3/private/transfer/sub-member-transfer":150,"asset/v3/private/transfer/transfer-sub-member-save":150,"asset/v3/private/transfer/universal-transfer":10,"user/v3/private/create-sub-member":10,"user/v3/private/create-sub-api":10,"user/v3/private/update-api":10,"user/v3/private/delete-api":10,"user/v3/private/update-sub-api":10,"user/v3/private/delete-sub-api":10,"contract/v3/private/copytrading/order/create":30,"contract/v3/private/copytrading/order/cancel":30,"contract/v3/private/copytrading/order/close":30,"contract/v3/private/copytrading/position/close":40,"contract/v3/private/copytrading/position/set-leverage":40,"contract/v3/private/copytrading/wallet/transfer":25,"contract/v3/private/copytrading/order/trading-stop":2.5,"contract/v3/private/order/create":1,"contract/v3/private/order/cancel":1,"contract/v3/private/order/cancel-all":1,"contract/v3/private/order/replace":1,"contract/v3/private/position/set-auto-add-margin":1,"contract/v3/private/position/switch-isolated":1,"contract/v3/private/position/switch-mode":1,"contract/v3/private/position/switch-tpsl-mode":1,"contract/v3/private/position/set-leverage":1,"contract/v3/private/position/trading-stop":1,"contract/v3/private/position/set-risk-limit":1,"contract/v3/private/account/setMarginMode":1,"unified/v3/private/order/create":30,"unified/v3/private/order/replace":30,"unified/v3/private/order/cancel":30,"unified/v3/private/order/create-batch":30,"unified/v3/private/order/replace-batch":30,"unified/v3/private/order/cancel-batch":30,"unified/v3/private/order/cancel-all":30,"unified/v3/private/position/set-leverage":2.5,"unified/v3/private/position/tpsl/switch-mode":2.5,"unified/v3/private/position/set-risk-limit":2.5,"unified/v3/private/position/trading-stop":2.5,"unified/v3/private/account/upgrade-unified-account":2.5,"unified/v3/private/account/setMarginMode":2.5,"fht/compliance/tax/v3/private/registertime":50,"fht/compliance/tax/v3/private/create":50,"fht/compliance/tax/v3/private/status":50,"fht/compliance/tax/v3/private/url":50,"v5/order/create":2.5,"v5/order/amend":5,"v5/order/cancel":2.5,"v5/order/cancel-all":50,"v5/order/create-batch":5,"v5/order/amend-batch":5,"v5/order/cancel-batch":5,"v5/order/disconnected-cancel-all":5,"v5/position/set-leverage":5,"v5/position/switch-isolated":5,"v5/position/set-tpsl-mode":5,"v5/position/switch-mode":5,"v5/position/set-risk-limit":5,"v5/position/trading-stop":5,"v5/position/set-auto-add-margin":5,"v5/position/add-margin":5,"v5/position/move-positions":5,"v5/position/confirm-pending-mmr":5,"v5/account/upgrade-to-uta":5,"v5/account/quick-repayment":5,"v5/account/set-margin-mode":5,"v5/account/set-hedging-mode":5,"v5/account/mmp-modify":5,"v5/account/mmp-reset":5,"v5/asset/exchange/quote-apply":1,"v5/asset/exchange/convert-execute":1,"v5/asset/transfer/inter-transfer":50,"v5/asset/transfer/save-transfer-sub-member":150,"v5/asset/transfer/universal-transfer":10,"v5/asset/deposit/deposit-to-account":5,"v5/asset/withdraw/create":50,"v5/asset/withdraw/cancel":50,"v5/user/create-sub-member":10,"v5/user/create-sub-api":10,"v5/user/frozen-sub-member":10,"v5/user/update-api":10,"v5/user/update-sub-api":10,"v5/user/delete-api":10,"v5/user/delete-sub-api":10,"v5/spot-lever-token/purchase":2.5,"v5/spot-lever-token/redeem":2.5,"v5/spot-margin-trade/switch-mode":5,"v5/spot-margin-trade/set-leverage":5,"v5/spot-cross-margin-trade/loan":2.5,"v5/spot-cross-margin-trade/repay":2.5,"v5/spot-cross-margin-trade/switch":2.5,"v5/crypto-loan/borrow":5,"v5/crypto-loan/repay":5,"v5/crypto-loan/adjust-ltv":5,"v5/ins-loan/association-uid":5,"v5/lending/purchase":5,"v5/lending/redeem":5,"v5/lending/redeem-cancel":5,"v5/account/set-collateral-switch":5,"v5/account/set-collateral-switch-batch":5,"v5/account/demo-apply-money":5,"v5/broker/award/info":5,"v5/broker/award/distribute-award":5,"v5/broker/award/distribution-record":5}}},httpExceptions:{403:a.RateLimitExceeded},exceptions:{exact:{"-10009":a.BadRequest,"-1004":a.BadRequest,"-1021":a.BadRequest,"-1103":a.BadRequest,"-1140":a.InvalidOrder,"-1197":a.InvalidOrder,"-2013":a.InvalidOrder,"-2015":a.AuthenticationError,"-6017":a.BadRequest,"-6025":a.BadRequest,"-6029":a.BadRequest,5004:a.ExchangeError,7001:a.BadRequest,10001:a.BadRequest,10002:a.InvalidNonce,10003:a.AuthenticationError,10004:a.AuthenticationError,10005:a.PermissionDenied,10006:a.RateLimitExceeded,10007:a.AuthenticationError,10008:a.AccountSuspended,10009:a.AuthenticationError,10010:a.PermissionDenied,10014:a.BadRequest,10016:a.ExchangeError,10017:a.BadRequest,10018:a.RateLimitExceeded,10020:a.PermissionDenied,10024:a.PermissionDenied,10027:a.PermissionDenied,10028:a.PermissionDenied,10029:a.PermissionDenied,12137:a.InvalidOrder,12201:a.BadRequest,12141:a.BadRequest,100028:a.PermissionDenied,110001:a.OrderNotFound,110003:a.InvalidOrder,110004:a.InsufficientFunds,110005:a.InvalidOrder,110006:a.InsufficientFunds,110007:a.InsufficientFunds,110008:a.InvalidOrder,110009:a.InvalidOrder,110010:a.InvalidOrder,110011:a.InvalidOrder,110012:a.InsufficientFunds,110013:a.BadRequest,110014:a.InsufficientFunds,110015:a.BadRequest,110016:a.InvalidOrder,110017:a.InvalidOrder,110018:a.BadRequest,110019:a.InvalidOrder,110020:a.InvalidOrder,110021:a.InvalidOrder,110022:a.InvalidOrder,110023:a.InvalidOrder,110024:a.BadRequest,110025:a.NoChange,110026:a.MarginModeAlreadySet,110027:a.NoChange,110028:a.BadRequest,110029:a.BadRequest,110030:a.InvalidOrder,110031:a.InvalidOrder,110032:a.InvalidOrder,110033:a.InvalidOrder,110034:a.InvalidOrder,110035:a.InvalidOrder,110036:a.InvalidOrder,110037:a.InvalidOrder,110038:a.InvalidOrder,110039:a.InvalidOrder,110040:a.InvalidOrder,110041:a.InvalidOrder,110042:a.InvalidOrder,110043:a.BadRequest,110044:a.InsufficientFunds,110045:a.InsufficientFunds,110046:a.BadRequest,110047:a.BadRequest,110048:a.BadRequest,110049:a.BadRequest,110050:a.BadRequest,110051:a.InsufficientFunds,110052:a.InsufficientFunds,110053:a.InsufficientFunds,110054:a.InvalidOrder,110055:a.InvalidOrder,110056:a.InvalidOrder,110057:a.InvalidOrder,110058:a.InvalidOrder,110059:a.InvalidOrder,110060:a.BadRequest,110061:a.BadRequest,110062:a.BadRequest,110063:a.ExchangeError,110064:a.InvalidOrder,110065:a.PermissionDenied,110066:a.ExchangeError,110067:a.PermissionDenied,110068:a.PermissionDenied,110069:a.PermissionDenied,110070:a.InvalidOrder,110071:a.ExchangeError,110072:a.InvalidOrder,110073:a.ExchangeError,110092:a.InvalidOrder,110093:a.InvalidOrder,110094:a.InvalidOrder,130006:a.InvalidOrder,130021:a.InsufficientFunds,130074:a.InvalidOrder,131001:a.InsufficientFunds,131084:a.ExchangeError,131200:a.ExchangeError,131201:a.ExchangeError,131202:a.BadRequest,131203:a.BadRequest,131204:a.BadRequest,131205:a.BadRequest,131206:a.ExchangeError,131207:a.BadRequest,131208:a.ExchangeError,131209:a.BadRequest,131210:a.BadRequest,131211:a.BadRequest,131212:a.InsufficientFunds,131213:a.BadRequest,131214:a.BadRequest,131215:a.BadRequest,131216:a.ExchangeError,131217:a.ExchangeError,131231:a.NotSupported,131232:a.NotSupported,131002:a.BadRequest,131003:a.ExchangeError,131004:a.AuthenticationError,131085:a.InsufficientFunds,131086:a.BadRequest,131088:a.BadRequest,131089:a.BadRequest,131090:a.ExchangeError,131091:a.ExchangeError,131092:a.ExchangeError,131093:a.ExchangeError,131094:a.BadRequest,131095:a.BadRequest,131096:a.BadRequest,131097:a.ExchangeError,131098:a.ExchangeError,131099:a.ExchangeError,140001:a.OrderNotFound,140003:a.InvalidOrder,140004:a.InsufficientFunds,140005:a.InvalidOrder,140006:a.InsufficientFunds,140007:a.InsufficientFunds,140008:a.InvalidOrder,140009:a.InvalidOrder,140010:a.InvalidOrder,140011:a.InvalidOrder,140012:a.InsufficientFunds,140013:a.BadRequest,140014:a.InsufficientFunds,140015:a.InvalidOrder,140016:a.InvalidOrder,140017:a.InvalidOrder,140018:a.BadRequest,140019:a.InvalidOrder,140020:a.InvalidOrder,140021:a.InvalidOrder,140022:a.InvalidOrder,140023:a.InvalidOrder,140024:a.BadRequest,140025:a.BadRequest,140026:a.BadRequest,140027:a.BadRequest,140028:a.InvalidOrder,140029:a.BadRequest,140030:a.InvalidOrder,140031:a.BadRequest,140032:a.InvalidOrder,140033:a.InvalidOrder,140034:a.InvalidOrder,140035:a.InvalidOrder,140036:a.BadRequest,140037:a.InvalidOrder,140038:a.BadRequest,140039:a.BadRequest,140040:a.InvalidOrder,140041:a.InvalidOrder,140042:a.InvalidOrder,140043:a.BadRequest,140044:a.InsufficientFunds,140045:a.InsufficientFunds,140046:a.BadRequest,140047:a.BadRequest,140048:a.BadRequest,140049:a.BadRequest,140050:a.InvalidOrder,140051:a.InsufficientFunds,140052:a.InsufficientFunds,140053:a.InsufficientFunds,140054:a.InvalidOrder,140055:a.InvalidOrder,140056:a.InvalidOrder,140057:a.InvalidOrder,140058:a.InvalidOrder,140059:a.InvalidOrder,140060:a.BadRequest,140061:a.BadRequest,140062:a.BadRequest,140063:a.ExchangeError,140064:a.InvalidOrder,140065:a.PermissionDenied,140066:a.ExchangeError,140067:a.PermissionDenied,140068:a.PermissionDenied,140069:a.PermissionDenied,140070:a.InvalidOrder,170001:a.ExchangeError,170005:a.InvalidOrder,170007:a.RequestTimeout,170010:a.InvalidOrder,170011:a.InvalidOrder,170019:a.InvalidOrder,170031:a.ExchangeError,170032:a.ExchangeError,170033:a.InsufficientFunds,170034:a.InsufficientFunds,170035:a.BadRequest,170036:a.BadRequest,170037:a.BadRequest,170105:a.BadRequest,170115:a.InvalidOrder,170116:a.InvalidOrder,170117:a.InvalidOrder,170121:a.InvalidOrder,170124:a.InvalidOrder,170130:a.BadRequest,170131:a.InsufficientFunds,170132:a.InvalidOrder,170133:a.InvalidOrder,170134:a.InvalidOrder,170135:a.InvalidOrder,170136:a.InvalidOrder,170137:a.InvalidOrder,170139:a.InvalidOrder,170140:a.InvalidOrder,170141:a.InvalidOrder,170142:a.InvalidOrder,170143:a.InvalidOrder,170144:a.InvalidOrder,170145:a.InvalidOrder,170146:a.InvalidOrder,170147:a.InvalidOrder,170148:a.InvalidOrder,170149:a.ExchangeError,170150:a.ExchangeError,170151:a.InvalidOrder,170157:a.InvalidOrder,170159:a.InvalidOrder,170190:a.InvalidOrder,170191:a.InvalidOrder,170192:a.InvalidOrder,170193:a.InvalidOrder,170194:a.InvalidOrder,170195:a.InvalidOrder,170196:a.InvalidOrder,170197:a.InvalidOrder,170198:a.InvalidOrder,170199:a.InvalidOrder,170200:a.InvalidOrder,170201:a.PermissionDenied,170202:a.InvalidOrder,170203:a.InvalidOrder,170204:a.InvalidOrder,170206:a.InvalidOrder,170210:a.InvalidOrder,170213:a.OrderNotFound,170217:a.InvalidOrder,170218:a.InvalidOrder,170221:a.BadRequest,170222:a.RateLimitExceeded,170223:a.InsufficientFunds,170224:a.PermissionDenied,170226:a.InsufficientFunds,170227:a.ExchangeError,170228:a.InvalidOrder,170229:a.InvalidOrder,170234:a.ExchangeError,170241:a.ManualInteractionNeeded,175e3:a.InvalidOrder,175001:a.InvalidOrder,175002:a.InvalidOrder,175003:a.InsufficientFunds,175004:a.InvalidOrder,175005:a.InvalidOrder,175006:a.InsufficientFunds,175007:a.InvalidOrder,175008:a.InvalidOrder,175009:a.InvalidOrder,175010:a.PermissionDenied,175012:a.InvalidOrder,175013:a.InvalidOrder,175014:a.InvalidOrder,175015:a.InvalidOrder,175016:a.InvalidOrder,175017:a.InvalidOrder,175027:a.ExchangeError,176002:a.BadRequest,176004:a.BadRequest,176003:a.BadRequest,176006:a.BadRequest,176005:a.BadRequest,176008:a.BadRequest,176007:a.BadRequest,176010:a.BadRequest,176009:a.BadRequest,176012:a.BadRequest,176011:a.BadRequest,176014:a.BadRequest,176013:a.BadRequest,176015:a.InsufficientFunds,176016:a.BadRequest,176017:a.BadRequest,176018:a.BadRequest,176019:a.BadRequest,176020:a.BadRequest,176021:a.BadRequest,176022:a.BadRequest,176023:a.BadRequest,176024:a.BadRequest,176025:a.BadRequest,176026:a.BadRequest,176027:a.BadRequest,176028:a.BadRequest,176029:a.BadRequest,176030:a.BadRequest,176031:a.BadRequest,176034:a.BadRequest,176035:a.PermissionDenied,176036:a.PermissionDenied,176037:a.PermissionDenied,176038:a.BadRequest,176039:a.BadRequest,176040:a.BadRequest,181e3:a.BadRequest,181001:a.BadRequest,181002:a.InvalidOrder,181003:a.InvalidOrder,181004:a.InvalidOrder,182e3:a.InvalidOrder,181017:a.BadRequest,20001:a.OrderNotFound,20003:a.InvalidOrder,20004:a.InvalidOrder,20005:a.InvalidOrder,20006:a.InvalidOrder,20007:a.InvalidOrder,20008:a.InvalidOrder,20009:a.InvalidOrder,20010:a.InvalidOrder,20011:a.InvalidOrder,20012:a.InvalidOrder,20013:a.InvalidOrder,20014:a.InvalidOrder,20015:a.InvalidOrder,20016:a.InvalidOrder,20017:a.InvalidOrder,20018:a.InvalidOrder,20019:a.InvalidOrder,20020:a.InvalidOrder,20021:a.InvalidOrder,20022:a.BadRequest,20023:a.BadRequest,20031:a.BadRequest,20070:a.BadRequest,20071:a.BadRequest,20084:a.BadRequest,30001:a.BadRequest,30003:a.InvalidOrder,30004:a.InvalidOrder,30005:a.InvalidOrder,30007:a.InvalidOrder,30008:a.InvalidOrder,30009:a.ExchangeError,30010:a.InsufficientFunds,30011:a.PermissionDenied,30012:a.PermissionDenied,30013:a.PermissionDenied,30014:a.InvalidOrder,30015:a.InvalidOrder,30016:a.ExchangeError,30017:a.InvalidOrder,30018:a.InvalidOrder,30019:a.InvalidOrder,30020:a.InvalidOrder,30021:a.InvalidOrder,30022:a.InvalidOrder,30023:a.InvalidOrder,30024:a.InvalidOrder,30025:a.InvalidOrder,30026:a.InvalidOrder,30027:a.InvalidOrder,30028:a.InvalidOrder,30029:a.InvalidOrder,30030:a.InvalidOrder,30031:a.InsufficientFunds,30032:a.InvalidOrder,30033:a.RateLimitExceeded,30034:a.OrderNotFound,30035:a.RateLimitExceeded,30036:a.ExchangeError,30037:a.InvalidOrder,30041:a.ExchangeError,30042:a.InsufficientFunds,30043:a.InvalidOrder,30044:a.InvalidOrder,30045:a.InvalidOrder,30049:a.InsufficientFunds,30050:a.ExchangeError,30051:a.ExchangeError,30052:a.ExchangeError,30054:a.ExchangeError,30057:a.ExchangeError,30063:a.ExchangeError,30067:a.InsufficientFunds,30068:a.ExchangeError,30074:a.InvalidOrder,30075:a.InvalidOrder,30078:a.ExchangeError,33004:a.AuthenticationError,34026:a.ExchangeError,34036:a.BadRequest,35015:a.BadRequest,340099:a.ExchangeError,3400045:a.ExchangeError,3100116:a.BadRequest,3100198:a.BadRequest,3200300:a.InsufficientFunds},broad:{"Not supported symbols":a.BadSymbol,"Request timeout":a.RequestTimeout,"unknown orderInfo":a.OrderNotFound,"invalid api_key":a.AuthenticationError,oc_diff:a.InsufficientFunds,new_oc:a.InsufficientFunds,"openapi sign params error!":a.AuthenticationError}},precisionMode:r.kb,options:{usePrivateInstrumentsInfo:!1,enableDemoTrading:!1,fetchMarkets:["spot","linear","inverse","option"],createOrder:{method:"privatePostV5OrderCreate"},enableUnifiedMargin:void 0,enableUnifiedAccount:void 0,unifiedMarginStatus:void 0,createMarketBuyOrderRequiresPrice:!1,createUnifiedMarginAccount:!1,defaultType:"swap",defaultSubType:"linear",defaultSettle:"USDT",code:"BTC",recvWindow:5e3,timeDifference:0,adjustForTimeDifference:!1,loadAllOptions:!1,loadExpiredOptions:!1,brokerId:"CCXT",accountsByType:{spot:"SPOT",margin:"SPOT",future:"CONTRACT",swap:"CONTRACT",option:"OPTION",investment:"INVESTMENT",unified:"UNIFIED",funding:"FUND",fund:"FUND",contract:"CONTRACT"},accountsById:{SPOT:"spot",MARGIN:"spot",CONTRACT:"contract",OPTION:"option",INVESTMENT:"investment",UNIFIED:"unified",FUND:"fund"},networks:{ERC20:"ETH",TRC20:"TRX",BEP20:"BSC",SOL:"SOL",ACA:"ACA",ADA:"ADA",ALGO:"ALGO",APT:"APTOS",AR:"AR",ARBONE:"ARBI",AVAXC:"CAVAX",AVAXX:"XAVAX",ATOM:"ATOM",BCH:"BCH",BEP2:"BNB",CHZ:"CHZ",DCR:"DCR",DGB:"DGB",DOGE:"DOGE",DOT:"DOT",EGLD:"EGLD",EOS:"EOS",ETC:"ETC",ETHF:"ETHF",ETHW:"ETHW",FIL:"FIL",STEP:"FITFI",FLOW:"FLOW",FTM:"FTM",GLMR:"GLMR",HBAR:"HBAR",HNT:"HNT",ICP:"ICP",ICX:"ICX",KDA:"KDA",KLAY:"KLAY",KMA:"KMA",KSM:"KSM",LTC:"LTC",MATIC:"MATIC",MINA:"MINA",MOVR:"MOVR",NEAR:"NEAR",NEM:"NEM",OASYS:"OAS",OASIS:"ROSE",OMNI:"OMNI",ONE:"ONE",OPTIMISM:"OP",POKT:"POKT",QTUM:"QTUM",RVN:"RVN",SC:"SC",SCRT:"SCRT",STX:"STX",THETA:"THETA",TON:"TON",WAVES:"WAVES",WAX:"WAXP",XDC:"XDC",XEC:"XEC",XLM:"XLM",XRP:"XRP",XTZ:"XTZ",XYM:"XYM",ZEN:"ZEN",ZIL:"ZIL",ZKSYNC:"ZKSYNC"},networksById:{ETH:"ERC20",TRX:"TRC20",BSC:"BEP20",OMNI:"OMNI",SPL:"SOL"},defaultNetwork:"ERC20",defaultNetworks:{USDT:"TRC20"},intervals:{"5m":"5min","15m":"15min","30m":"30min","1h":"1h","4h":"4h","1d":"1d"}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!0},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,selfTradePrevention:!0,trailing:!0,iceberg:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:100,daysBack:730,untilDays:7,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:50,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:50,daysBack:730,daysBackCanceled:1,untilDays:7,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3},editOrders:{max:10}},spot:{extends:"default",createOrder:{triggerPriceType:void 0,triggerDirection:!1,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!0},marketBuyRequiresPrice:!0}},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,taker:75e-5,maker:1e-4},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{}}}})}enableDemoTrading(e){if(this.isSandboxModeEnabled)throw new a.NotSupported(this.id+" demo trading does not support in sandbox environment");if(e)this.urls.apiBackupDemoTrading=this.urls.api,this.urls.api=this.urls.demotrading;else if("apiBackupDemoTrading"in this.urls){this.urls.api=this.urls.apiBackupDemoTrading;const e=this.omit(this.urls,"apiBackupDemoTrading");this.urls=e}this.options.enableDemoTrading=e}nonce(){return this.milliseconds()-this.options.timeDifference}addPaginationCursorToResult(e){const t=this.safeDict(e,"result",{}),i=this.safeListN(t,["list","rows","data","dataList"],[]),s=this.safeString2(t,"nextPageCursor","cursor"),r=i.length;if(void 0!==s&&r>0){const e=i[0];e.nextPageCursor=s,i[0]=e}return i}async isUnifiedEnabled(e={}){const t=this.safeBool(this.options,"enableUnifiedMargin"),i=this.safeBool(this.options,"enableUnifiedAccount");if(void 0===t||void 0===i){if(this.options.enableDemoTrading)return this.options.enableUnifiedMargin=!1,this.options.enableUnifiedAccount=!0,this.options.unifiedMarginStatus=6,[this.options.enableUnifiedMargin,this.options.enableUnifiedAccount];const t=[this.privateGetV5UserQueryApi(e),this.privateGetV5AccountInfo(e)],i=await Promise.all(t),s=i[0],r=i[1],a=this.safeDict(s,"result",{}),o=this.safeDict(r,"result",{});this.options.enableUnifiedMargin=1===this.safeInteger(a,"unified"),this.options.enableUnifiedAccount=1===this.safeInteger(a,"uta"),this.options.unifiedMarginStatus=this.safeInteger(o,"unifiedMarginStatus",6)}return[this.options.enableUnifiedMargin,this.options.enableUnifiedAccount]}async upgradeUnifiedTradeAccount(e={}){return await this.privatePostV5AccountUpgradeToUta(e)}createExpiredOptionMarket(e){let t,i;const s=e.split("-"),r=e.split("/");let a,o;if(e.indexOf("/")>-1){a=this.safeString(r,0),o=this.safeString(s,1);const e=this.safeString(r,1).split(":"),n=this.safeString(e,0);t=n,i=n}else a=this.safeString(s,0),o=this.convertMarketIdExpireDate(this.safeString(s,1)),e.endsWith("-USDT")?(t="USDT",i="USDT"):(t="USDC",i="USDC");const n=this.safeString(s,2),d=this.safeString(s,3),h=this.convertExpireDate(o),c=this.parse8601(h);let l,u;return"BTC"===a?(l=this.parseNumber("0.01"),u=this.parseNumber("5")):"ETH"===a?(l=this.parseNumber("0.1"),u=this.parseNumber("0.1")):"SOL"===a&&(l=this.parseNumber("1"),u=this.parseNumber("0.01")),{id:a+"-"+this.convertExpireDateToMarketIdDate(o)+"-"+n+"-"+d,symbol:a+"/"+t+":"+i+"-"+o+"-"+n+"-"+d,base:a,quote:t,settle:i,baseId:a,quoteId:t,settleId:i,active:!1,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:this.parseNumber("1"),expiry:c,expiryDatetime:h,optionType:"C"===d?"call":"put",strike:this.parseNumber(n),precision:{amount:l,price:u},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.indexOf("-C")>-1||e.indexOf("-P")>-1)&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}getBybitType(e,t,i={}){let s,r;return[s,i]=this.handleMarketTypeAndParams(e,t,i),[r,i]=this.handleSubTypeAndParams(e,t,i),"option"===s||"spot"===s?[s,i]:[r,i]}getAmount(e,t){const i=void 0===this.market(e).precision.amount,s=this.numberToString(t);return i||"0"===s?s:this.amountToPrecision(e,t)}getPrice(e,t){if(void 0===t)return t;return void 0===this.market(e).precision.price?t:this.priceToPrecision(e,t)}getCost(e,t){return void 0===this.market(e).precision.price?t:this.costToPrecision(e,t)}async fetchTime(e={}){const t=await this.publicGetV5MarketTime(e);return this.safeInteger(t,"time")}async fetchCurrencies(e={}){if(!this.checkRequiredCredentials(!1))return;if(this.options.enableDemoTrading)return;const t=await this.privateGetV5AssetCoinQueryInfo(e),i=this.safeDict(t,"result",{}),s=this.safeList(i,"rows",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"coin"),a=this.safeCurrencyCode(i),n=this.safeString(t,"name"),d=this.safeList(t,"chains",[]),h={};let c,l,u,f,p=!1,m=!1;for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"chain"),s=this.networkIdToCode(i),r=this.parseNumber(this.parsePrecision(this.safeString(t,"minAccuracy")));c=void 0===c?r:Math.min(c,r);const a=1===this.safeInteger(t,"chainDeposit");p=a||p;const n=1===this.safeInteger(t,"chainWithdraw");m=n||m;const g=this.safeString(t,"withdrawFee");void 0!==g&&(l=void 0===l?g:o.Y.stringMin(g,l));const v=this.safeString(t,"withdrawMin");void 0!==v&&(u=void 0===u?v:o.Y.stringMin(v,u));const y=this.safeString(t,"depositMin");void 0!==y&&(f=void 0===f?y:o.Y.stringMin(y,f)),h[s]={info:t,id:i,network:s,active:a&&n,deposit:a,withdraw:n,fee:this.parseNumber(g),precision:r,limits:{withdraw:{min:this.parseNumber(v),max:void 0},deposit:{min:this.parseNumber(y),max:void 0}}}}r[a]={info:t,code:a,id:i,name:n,active:p&&m,deposit:p,withdraw:m,fee:this.parseNumber(l),precision:c,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(u),max:void 0},deposit:{min:this.parseNumber(f),max:void 0}},networks:h}}return r}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=[],i=this.safeList(this.options,"fetchMarkets",["spot","linear","inverse"]);for(let s=0;s<i.length;s++){const r=i[s];if("spot"===r)t.push(this.fetchSpotMarkets(e));else if("linear"===r)t.push(this.fetchFutureMarkets({category:"linear"}));else if("inverse"===r)t.push(this.fetchFutureMarkets({category:"inverse"}));else{if("option"!==r)throw new a.ExchangeError(this.id+' fetchMarkets() this.options fetchMarkets "'+r+'" is not a supported market type');t.push(this.fetchOptionMarkets({baseCoin:"BTC"})),t.push(this.fetchOptionMarkets({baseCoin:"ETH"})),t.push(this.fetchOptionMarkets({baseCoin:"SOL"}))}}const s=await Promise.all(t),r=this.safeList(s,0,[]),o=this.safeList(s,1,[]),n=this.safeList(s,2,[]),d=this.safeList(s,3,[]),h=this.safeList(s,4,[]),c=this.safeList(s,5,[]),l=this.arrayConcat(o,n);let u=this.arrayConcat(d,h);u=this.arrayConcat(u,c);const f=this.arrayConcat(l,u);return this.arrayConcat(r,f)}async fetchSpotMarkets(e){const t={category:"spot"};let i;i=this.safeBool(this.options,"usePrivateInstrumentsInfo",!1)?await this.privateGetV5MarketInstrumentsInfo(this.extend(t,e)):await this.publicGetV5MarketInstrumentsInfo(this.extend(t,e));const s=this.safeDict(i,"result",{}),r=this.safeList(s,"list",[]),a=[],o=this.parseNumber("0.001"),n=this.parseNumber("0.001");for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"symbol"),s=this.safeString(t,"baseCoin"),d=this.safeString(t,"quoteCoin"),h=this.safeCurrencyCode(s),c=this.safeCurrencyCode(d),l=h+"/"+c,u="Trading"===this.safeString(t,"status"),f=this.safeDict(t,"lotSizeFilter"),p=this.safeDict(t,"priceFilter"),m=this.safeNumber(f,"quotePrecision"),g="none"!==this.safeString(t,"marginTrading","none");a.push(this.safeMarketStructure({id:i,symbol:l,base:h,quote:c,settle:void 0,baseId:s,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:g,swap:!1,future:!1,option:!1,active:u,contract:!1,linear:void 0,inverse:void 0,taker:o,maker:n,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(f,"basePrecision"),price:this.safeNumber(p,"tickSize",m)},limits:{leverage:{min:this.parseNumber("1"),max:void 0},amount:{min:this.safeNumber(f,"minOrderQty"),max:this.safeNumber(f,"maxOrderQty")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(f,"minOrderAmt"),max:this.safeNumber(f,"maxOrderAmt")}},created:void 0,info:t}))}return a}async fetchFutureMarkets(e){(e=this.extend(e)).limit=1e3;let t=[];const i=this.safeBool(this.options,"usePrivateInstrumentsInfo",!1);let s;if(i)s=await this.privateGetV5MarketInstrumentsInfo(e);else{const i=[this.publicGetV5MarketInstrumentsInfo(e),this.publicGetV5MarketInstrumentsInfo(this.extend(e,{status:"PreLaunch"}))],r=await Promise.all(i);s=this.safeDict(r,0,{}),t=this.safeDict(r,1,{})}const r=this.safeDict(s,"result",{});let a=this.safeList(r,"list",[]),o=this.safeString(r,"nextPageCursor");if(void 0!==o)for(;void 0!==o;){let t;e.cursor=o,t=i?await this.privateGetV5MarketInstrumentsInfo(e):await this.publicGetV5MarketInstrumentsInfo(e);const s=this.safeDict(t,"result",{}),r=this.safeList(s,"list",[]);if(0===r.length)break;a=this.arrayConcat(r,a),o=this.safeString(s,"nextPageCursor")}const n=this.safeDict(t,"result",{}),d=this.safeList(n,"list",[]);a=this.arrayConcat(a,d);const h=[];let c=this.safeString(r,"category");for(let e=0;e<a.length;e++){const t=a[e];void 0===c&&(c=this.safeString(t,"category"));const i="linear"===c,s="inverse"===c,r=this.safeString(t,"contractType"),o="InverseFutures"===r,n="LinearFutures"===r,d="LinearPerpetual"===r,l="InversePerpetual"===r,u=this.safeString(t,"symbol"),f=this.safeString(t,"baseCoin"),p=this.safeString(t,"quoteCoin"),m=i?p:f,g=this.safeString(t,"settleCoin",m),v=this.safeCurrencyCode(f),y=this.safeCurrencyCode(p);let w;w=d&&"USD"===g?"USDC":this.safeCurrencyCode(g);let b=v+"/"+y;const k=this.safeDict(t,"lotSizeFilter",{}),S=this.safeDict(t,"priceFilter",{}),O=this.safeDict(t,"leverageFilter",{}),T=this.safeString(t,"status"),P=d||l,I=o||n;let M,x;P?M="swap":I&&(M="future"),P||(x=this.omitZero(this.safeString(t,"deliveryTime")),void 0!==x&&(x=parseInt(x)));const A=this.iso8601(x);b=b+":"+w,void 0!==x&&(b=b+"-"+this.yymmdd(x));const C=s?this.safeNumber2(k,"minTradingQty","minOrderQty"):this.parseNumber("1");h.push(this.safeMarketStructure({id:u,symbol:b,base:v,quote:y,settle:w,baseId:f,quoteId:p,settleId:g,type:M,spot:!1,margin:void 0,swap:P,future:I,option:!1,active:"Trading"===T,contract:!0,linear:i,inverse:s,taker:this.safeNumber(t,"takerFee",this.parseNumber("0.0006")),maker:this.safeNumber(t,"makerFee",this.parseNumber("0.0001")),contractSize:C,expiry:x,expiryDatetime:A,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(k,"qtyStep"),price:this.safeNumber(S,"tickSize")},limits:{leverage:{min:this.safeNumber(O,"minLeverage"),max:this.safeNumber(O,"maxLeverage")},amount:{min:this.safeNumber2(k,"minTradingQty","minOrderQty"),max:this.safeNumber2(k,"maxTradingQty","maxOrderQty")},price:{min:this.safeNumber(S,"minPrice"),max:this.safeNumber(S,"maxPrice")},cost:{min:void 0,max:void 0}},created:this.safeInteger(t,"launchTime"),info:t}))}return h}async fetchOptionMarkets(e){const t={category:"option"},i=this.safeBool(this.options,"usePrivateInstrumentsInfo",!1);let s;s=i?await this.privateGetV5MarketInstrumentsInfo(this.extend(t,e)):await this.publicGetV5MarketInstrumentsInfo(this.extend(t,e));const r=this.safeDict(s,"result",{});let a=this.safeList(r,"list",[]);if(this.options.loadAllOptions){t.limit=1e3;let s=this.safeString(r,"nextPageCursor");if(void 0!==s)for(;void 0!==s;){let r;t.cursor=s,r=i?await this.privateGetV5MarketInstrumentsInfo(this.extend(t,e)):await this.publicGetV5MarketInstrumentsInfo(this.extend(t,e));const o=this.safeDict(r,"result",{}),n=this.safeList(o,"list",[]);if(0===n.length)break;a=this.arrayConcat(n,a),s=this.safeString(o,"nextPageCursor")}}const o=[];for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"symbol"),s=this.safeString(t,"baseCoin"),r=this.safeString(t,"quoteCoin"),n=this.safeString(t,"settleCoin"),d=this.safeCurrencyCode(s),h=this.safeCurrencyCode(r),c=this.safeCurrencyCode(n),l=this.safeDict(t,"lotSizeFilter",{}),u=this.safeDict(t,"priceFilter",{}),f=this.safeString(t,"status"),p=this.safeInteger(t,"deliveryTime"),m=i.split("-"),g=this.safeString(m,2),v=this.safeString(m,3),y="Trading"===f;(y||this.options.loadAllOptions||this.options.loadExpiredOptions)&&o.push(this.safeMarketStructure({id:i,symbol:d+"/"+h+":"+c+"-"+this.yymmdd(p)+"-"+g+"-"+v,base:d,quote:h,settle:c,baseId:s,quoteId:r,settleId:n,type:"option",subType:"linear",spot:!1,margin:!1,swap:!1,future:!1,option:!0,active:y,contract:!0,linear:!0,inverse:!1,taker:this.safeNumber(t,"takerFee",this.parseNumber("0.0006")),maker:this.safeNumber(t,"makerFee",this.parseNumber("0.0001")),contractSize:this.parseNumber("1"),expiry:p,expiryDatetime:this.iso8601(p),strike:this.parseNumber(g),optionType:this.safeStringLower(t,"optionsType"),precision:{amount:this.safeNumber(l,"qtyStep"),price:this.safeNumber(u,"tickSize")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(l,"minOrderQty"),max:this.safeNumber(l,"maxOrderQty")},price:{min:this.safeNumber(u,"minPrice"),max:this.safeNumber(u,"maxPrice")},cost:{min:void 0,max:void 0}},created:this.safeInteger(t,"launchTime"),info:t}))}return o}parseTicker(e,t=void 0){const i=void 0===this.safeString(e,"openInterestValue"),s=this.safeInteger(e,"time"),r=this.safeString(e,"symbol"),a=i?"spot":"contract";t=this.safeMarket(r,t,void 0,a);const n=this.safeSymbol(r,t,void 0,a),d=this.safeString(e,"lastPrice"),h=this.safeString(e,"prevPrice24h");let c=this.safeString(e,"price24hPcnt");c=o.Y.stringMul(c,"100");const l=this.safeString(e,"turnover24h"),u=this.safeString(e,"volume24h"),f=this.safeString(e,"bid1Price"),p=this.safeString(e,"ask1Price"),m=this.safeString(e,"highPrice24h"),g=this.safeString(e,"lowPrice24h");return this.safeTicker({symbol:n,timestamp:s,datetime:this.iso8601(s),high:m,low:g,bid:f,bidVolume:this.safeString2(e,"bidSize","bid1Size"),ask:p,askVolume:this.safeString2(e,"askSize","ask1Size"),vwap:void 0,open:h,close:d,last:d,previousClose:void 0,change:void 0,percentage:c,average:void 0,baseVolume:u,quoteVolume:l,markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchTicker(e,t={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchTicker() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:i.id};i.spot?s.category="spot":i.option?s.category="option":i.linear?s.category="linear":i.inverse&&(s.category="inverse");const r=await this.publicGetV5MarketTickers(this.extend(s,t)),o=this.safeDict(r,"result",{}),n=this.safeList(o,"list",[]),d=this.safeDict(n,0);return this.parseTicker(d,i)}async fetchTickers(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==e){s=[];const r=this.handleMarketTypeAndParams("fetchTickers",void 0,t)[0];let o;for(let t=0;t<e.length;t++){const n=e[t];if(i=-1===n.indexOf("/")?this.safeMarket(n,void 0,void 0,r):this.market(n),void 0===o)o=i.type;else if(i.type!==o)throw new a.BadRequest(this.id+" fetchTickers can only accept a list of symbols of the same type");s.push(i.symbol)}}const r={};let o;[o,t]=this.handleMarketTypeAndParams("fetchTickers",i,t);const n=this.safeString(t,"subType");let d;[d,t]=this.handleSubTypeAndParams("fetchTickers",i,t,"linear"),"spot"===o&&void 0===n?r.category="spot":"option"===o?(r.category="option",r.baseCoin=this.safeString(t,"baseCoin","BTC")):"swap"!==o&&"future"!==o&&void 0===d||(r.category=d);const h=await this.publicGetV5MarketTickers(this.extend(r,t)),c=this.safeDict(h,"result",{}),l=this.safeList(c,"list",[]);return this.parseTickers(l,s)}async fetchBidsAsks(e=void 0,t={}){return await this.fetchTickers(e,t)}parseOHLCV(e,t=void 0){const i=t.inverse?6:5;return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,i)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchOHLCV() requires a symbol argument");await this.loadMarkets();let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const n=this.market(e);let d,h={symbol:n.id};if(void 0===s&&(s=200),void 0!==i&&(h.start=i),void 0!==s&&(h.limit=s),[h,r]=this.handleUntilOption("end",h,r),h.interval=this.safeString(this.timeframes,t,t),n.spot)h.category="spot",d=await this.publicGetV5MarketKline(this.extend(h,r));else{const e=this.safeString(r,"price");if(r=this.omit(r,"price"),n.linear)h.category="linear";else{if(!n.inverse)throw new a.NotSupported(this.id+" fetchOHLCV() is not supported for option markets");h.category="inverse"}d="mark"===e?await this.publicGetV5MarketMarkPriceKline(this.extend(h,r)):"index"===e?await this.publicGetV5MarketIndexPriceKline(this.extend(h,r)):"premiumIndex"===e?await this.publicGetV5MarketPremiumIndexPriceKline(this.extend(h,r)):await this.publicGetV5MarketKline(this.extend(h,r))}const c=this.safeDict(d,"result",{}),l=this.safeList(c,"list",[]);return this.parseOHLCVs(l,n,t,i,s)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"timestamp");e=this.omit(e,"timestamp");const s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t,void 0,"swap"),a=this.safeNumber(e,"fundingRate"),o=this.safeInteger(e,"nextFundingTime"),n=this.safeNumber(e,"markPrice"),d=this.safeNumber(e,"indexPrice"),h=this.safeDict(this.safeMarket(s,t,void 0,"swap"),"info"),c=this.safeInteger(h,"fundingInterval");let l;if(void 0!==c){l=this.parseToInt(c/60).toString()+"h"}return{info:e,symbol:r,markPrice:n,indexPrice:d,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:i,datetime:this.iso8601(i),fundingRate:a,fundingTimestamp:o,fundingDatetime:this.iso8601(o),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:l}}async fetchFundingRates(e=void 0,t={}){let i;await this.loadMarkets();const s={};if(void 0!==e){e=this.marketSymbols(e),i=this.market(e[0]);1===e.length&&(s.symbol=i.id)}let r;if([r,t]=this.handleMarketTypeAndParams("fetchFundingRates",i,t),"swap"!==r)throw new a.NotSupported(this.id+" fetchFundingRates() does not support "+r+" markets");{let e;[e,t]=this.handleSubTypeAndParams("fetchFundingRates",i,t,"linear"),s.category=e}const o=await this.publicGetV5MarketTickers(this.extend(s,t)),n=this.safeDict(o,"result",{}),d=this.safeList(n,"list",[]),h=this.safeInteger(o,"time");for(let e=0;e<d.length;e++)d[e].timestamp=h;return this.parseFundingRates(d,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),r)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s,200);void 0===i&&(i=200);const o={limit:i},n=this.market(e);let d;if(e=n.symbol,o.symbol=n.id,[d,s]=this.getBybitType("fetchFundingRateHistory",n,s),"spot"===d||"option"===d)throw new a.NotSupported(this.id+" fetchFundingRateHistory() only support linear and inverse market");o.category=d,void 0!==t&&(o.startTime=t);const h=this.safeInteger(s,"until"),c=this.safeInteger(s,"endTime",h);if(s=this.omit(s,["endTime","until"]),void 0!==c)o.endTime=c;else if(void 0!==t){const e=288e5;o.endTime=t+i*e}const l=await this.publicGetV5MarketFundingHistory(this.extend(o,s)),u=[],f=this.safeDict(l,"result"),p=this.safeList(f,"list");for(let e=0;e<p.length;e++){const t=p[e],i=this.safeInteger(t,"fundingRateTimestamp");u.push({info:t,symbol:this.safeSymbol(this.safeString(t,"symbol"),void 0,void 0,"swap"),fundingRate:this.safeNumber(t,"fundingRate"),timestamp:i,datetime:this.iso8601(i)})}const m=this.sortBy(u,"timestamp");return this.filterBySymbolSinceLimit(m,e,t,i)}parseTrade(e,t=void 0){const i=this.safeStringN(e,["execId","id","tradeId"]),s=this.safeString(e,"symbol");let r="createType"in e?"contract":"spot";void 0!==t&&(r=t.type);const a=this.safeString(e,"category");void 0!==a&&"spot"===a&&(r="spot");const n=(t=this.safeMarket(s,t,void 0,r)).symbol,d=this.safeStringN(e,["execQty","orderQty","size"]),h=this.safeStringN(e,["execPrice","orderPrice","price"]),c=this.safeString(e,"execValue"),l=this.safeIntegerN(e,["time","execTime","tradeTime"]);let u=this.safeStringLower(e,"side");if(void 0===u){const t=this.safeInteger(e,"isBuyer");void 0!==t&&(u=t?"buy":"sell")}const f=this.safeBool(e,"isMaker");let p;if(void 0!==f)p=f?"maker":"taker";else{let t=this.safeString(e,"lastLiquidityInd");"UNKNOWN"===t&&(t=void 0),void 0!==t&&(p="TAKER"===t||"MAKER"===t?t.toLowerCase():"AddedLiquidity"===t?"maker":"taker")}let m=this.safeStringLower(e,"orderType");"unknown"===m&&(m=void 0);const g=this.safeString(e,"execFee");let v;if(void 0!==g){const i=this.safeString(e,"feeRate");let s;s=t.spot?o.Y.stringGt(g,"0")?"buy"===u?t.base:t.quote:"buy"===u?t.quote:t.base:t.inverse?t.base:t.settle,v={cost:g,currency:s,rate:i}}return this.safeTrade({id:i,info:e,timestamp:l,datetime:this.iso8601(l),symbol:n,order:this.safeString(e,"orderId"),type:m,side:u,takerOrMaker:p,price:h,amount:d,cost:c,fee:v},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchTrades() requires a symbol argument");await this.loadMarkets();const r=this.market(e),o={symbol:r.id};let n;void 0!==i&&(o.limit=i),[n,s]=this.getBybitType("fetchTrades",r,s),o.category=n;const d=await this.publicGetV5MarketRecentTrade(this.extend(o,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"list",[]);return this.parseTrades(c,r,t,i)}async fetchOrderBook(e,t=void 0,i={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchOrderBook() requires a symbol argument");await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let o=25;s.spot?(o=50,r.category="spot"):s.option?r.category="option":s.linear?r.category="linear":s.inverse&&(r.category="inverse"),r.limit=void 0!==t?t:o;const n=await this.publicGetV5MarketOrderbook(this.extend(r,i)),d=this.safeDict(n,"result",{}),h=this.safeInteger(d,"ts");return this.parseOrderBook(d,e,h,"b","a")}parseBalance(e){const t=this.safeInteger(e,"time"),i={info:e,timestamp:t,datetime:this.iso8601(t)},s=this.safeDict(e,"result",{}),r=this.safeListN(s,["loanAccountList","list","balance"]);if(void 0===r){const e="USDC",t=this.account();t.free=this.safeString(s,"availableBalance"),t.total=this.safeString(s,"walletBalance"),i[e]=t}else for(let e=0;e<r.length;e++){const t=r[e],s=this.safeString(t,"accountType");if("UNIFIED"===s||"CONTRACT"===s||"SPOT"===s){const e=this.safeList(t,"coin");for(let t=0;t<e.length;t++){const s=this.account(),r=e[t],a=this.safeString(r,"borrowAmount"),n=this.safeString(r,"accruedInterest");void 0!==a&&void 0!==n&&(s.debt=o.Y.stringAdd(a,n)),s.total=this.safeString(r,"walletBalance");const d=this.safeString2(r,"availableToWithdraw","free");if(void 0!==d)s.free=d;else{const e=this.safeString(r,"locked","0"),t=this.safeString(r,"totalPositionIM","0"),i=this.safeString(r,"totalOrderIM","0");let a=o.Y.stringAdd(e,t);a=o.Y.stringAdd(a,i),s.used=a}const h=this.safeString(r,"coin");i[this.safeCurrencyCode(h)]=s}}else{const e=this.account(),s=this.safeString(t,"loan"),r=this.safeString(t,"interest");void 0!==s&&void 0!==r&&(e.debt=o.Y.stringAdd(s,r)),e.total=this.safeString2(t,"total","walletBalance"),e.free=this.safeStringN(t,["free","availableBalanceWithoutConvert","availableBalance","transferBalance"]),e.used=this.safeString(t,"locked");const a=this.safeStringN(t,["tokenId","coin","currencyCoin"]);i[this.safeCurrencyCode(a)]=e}}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t={},[i,s]=await this.isUnifiedEnabled(),r=i||s;let a,o;[a,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[o,e]=this.handleSubTypeAndParams("fetchBalance",void 0,e),"swap"!==a&&"future"!==a||(a=o);const n=void 0!==a?a.toLowerCase():void 0,d="spot"===a,h="linear"===a,c="inverse"===a,l="fund"===n||"funding"===n;if(r){a=this.safeInteger(this.options,"unifiedMarginStatus",6)<5&&c?"contract":"unified"}else(h||c)&&(a="contract");const u=this.safeDict(this.options,"accountsByType",{}),f=this.safeStringUpper(u,a,a);let p,m;return[p,e]=this.handleMarginModeAndParams("fetchBalance",e),d&&void 0!==p?m=await this.privateGetV5SpotCrossMarginTradeAccount(this.extend(t,e)):l?(t.accountType="FUND",m=await this.privateGetV5AssetTransferQueryAccountCoinsBalance(this.extend(t,e))):(t.accountType=f,m=await this.privateGetV5AccountWalletBalance(this.extend(t,e))),this.parseBalance(m)}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",CANCELED:"canceled",PENDING_CANCEL:"open",PENDING_NEW:"open",REJECTED:"rejected",PARTIALLY_FILLED_CANCELLED:"closed",Created:"open",New:"open",Rejected:"rejected",PartiallyFilled:"open",PartiallyFilledCanceled:"closed",Filled:"closed",PendingCancel:"open",Cancelled:"canceled",Untriggered:"open",Deactivated:"canceled",Triggered:"open",Active:"open"},e,e)}parseTimeInForce(e){return this.safeString({GoodTillCancel:"GTC",ImmediateOrCancel:"IOC",FillOrKill:"FOK",PostOnly:"PO"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"code");if(void 0!==i&&"0"!==i){const t="spot"===this.safeString(e,"category")?"spot":"contract";return this.safeOrder({info:e,status:"rejected",id:this.safeString(e,"orderId"),clientOrderId:this.safeString(e,"orderLinkId"),symbol:this.safeSymbol(this.safeString(e,"symbol"),void 0,void 0,t)})}const s=this.safeString(e,"symbol"),r="tpslMode"in e;let a;a=void 0!==t?t.type:r?"contract":"spot";const n=(t=this.safeMarket(s,t,void 0,a)).symbol,d=this.safeInteger2(e,"createdTime","createdAt"),h=this.safeString(e,"marketUnit","baseCoin"),c=this.safeString(e,"orderId"),l=this.safeStringLower(e,"orderType"),u=this.safeString(e,"price");let f,p;"baseCoin"===h?(f=this.safeString(e,"qty"),p=this.safeString(e,"cumExecValue")):p=this.safeString(e,"cumExecValue");const m=this.safeString(e,"cumExecQty"),g=this.safeString(e,"leavesQty"),v=this.safeInteger2(e,"updatedTime","updatedAt"),y=this.safeString(e,"orderStatus"),w=this.parseOrderStatus(y),b=this.safeStringLower(e,"side");let k;const S=this.safeString(e,"cumExecFee");if(void 0!==S){let e;e=t.spot?o.Y.stringGt(S,"0")?"buy"===b?t.base:t.quote:"buy"===b?t.quote:t.base:t.inverse?t.base:t.settle,k={cost:this.parseNumber(S),currency:e}}let O=this.safeString(e,"orderLinkId");void 0!==O&&O.length<1&&(O=void 0);const T=this.omitZero(this.safeString(e,"avgPrice")),P=this.safeString(e,"timeInForce"),I=this.parseTimeInForce(P),M=this.omitZero(this.safeString(e,"triggerPrice")),x=this.safeBool(e,"reduceOnly");let A=this.omitZero(this.safeString(e,"takeProfit")),C=this.omitZero(this.safeString(e,"stopLoss"));const B="1"===this.safeString(e,"triggerDirection"),_=void 0!==M&&x;return void 0===C&&_&&(B&&"buy"===b&&(C=M),B||"sell"!==b||(C=M)),void 0===A&&_&&(B&&"sell"===b&&(A=M),B||"buy"!==b||(A=M)),this.safeOrder({info:e,id:c,clientOrderId:O,timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:v,lastUpdateTimestamp:v,symbol:n,type:l,timeInForce:I,postOnly:void 0,reduceOnly:this.safeBool(e,"reduceOnly"),side:b,price:u,triggerPrice:M,takeProfitPrice:A,stopLossPrice:C,amount:f,cost:p,average:T,filled:m,remaining:g,status:w,fee:k,trades:void 0},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new a.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","buy",t,1,i)}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();if(!(await this.isUnifiedEnabled())[1])throw new a.NotSupported(this.id+" createMarketSellOrderWithCost() supports UTA accounts only");if(!this.market(e).spot)throw new a.NotSupported(this.id+" createMarketSellOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","sell",t,1,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=(await this.isUnifiedEnabled())[1],d=void 0!==this.safeString2(a,"trailingAmount","trailingStop"),h=this.createOrderRequest(e,t,i,s,r,a,n),c=this.safeDict(this.options,"createOrder",{}),l=this.safeString(c,"method","privatePostV5OrderCreate");let u;u=d||"privatePostV5PositionTradingStop"===l?await this.privatePostV5PositionTradingStop(h):await this.privatePostV5OrderCreate(h);const f=this.safeDict(u,"result",{});return this.parseOrder(f,o)}createOrderRequest(e,t,i,s,r=void 0,n={},d=!0){const h=this.market(e);e=h.symbol;const c=t.toLowerCase();if(void 0===r&&"limit"===c)throw new a.ArgumentsRequired(this.id+" createOrder requires a price argument for limit orders");let l;[l,n]=this.handleOptionAndParams(n,"createOrder","method","privatePostV5OrderCreate");const u={symbol:h.id},f=this.safeBool(n,"hedged",!1),p=this.safeBool(n,"reduceOnly");let m=this.safeValue2(n,"triggerPrice","stopPrice");const g=this.safeValue(n,"stopLossPrice"),v=this.safeValue(n,"takeProfitPrice"),y=this.safeValue(n,"stopLoss"),w=this.safeValue(n,"takeProfit"),b=this.safeString2(n,"trailingTriggerPrice","activePrice",this.numberToString(r)),k=this.safeString2(n,"trailingAmount","trailingStop"),S=void 0!==k,O=void 0!==m,T=void 0!==g,P=void 0!==v,I=void 0!==y,M=void 0!==w,x="market"===c,A="limit"===c,C="buy"===i,B="privatePostV5PositionTradingStop"===l,_=this.getAmount(e,s),E=void 0!==r?this.getPrice(e,this.numberToString(r)):void 0;if(S||B){if(I||M||O||h.spot)throw new a.InvalidOrder(this.id+" the API endpoint used only supports contract trailingAmount, stopLossPrice and takeProfitPrice orders");(T||P)&&(T?(u.stopLoss=this.getPrice(e,g),A&&(u.tpslMode="Partial",u.slOrderType="Limit",u.slLimitPrice=E,u.slSize=_)):P&&(u.takeProfit=this.getPrice(e,v),A&&(u.tpslMode="Partial",u.tpOrderType="Limit",u.tpLimitPrice=E,u.tpSize=_)))}else{u.side=this.capitalize(i),u.orderType=this.capitalize(c);const e=this.safeStringLower(n,"timeInForce");let t;[t,n]=this.handlePostOnly(x,"postonly"===e,n),t?u.timeInForce="PostOnly":"gtc"===e?u.timeInForce="GTC":"fok"===e?u.timeInForce="FOK":"ioc"===e&&(u.timeInForce="IOC"),h.spot&&(void 0!==m?u.orderFilter="StopOrder":(void 0!==g||void 0!==v||I||M)&&(u.orderFilter="tpslOrder"));const s=this.safeString(n,"clientOrderId");void 0!==s?u.orderLinkId=s:h.option&&(u.orderLinkId=this.uuid16()),A&&(u.price=E)}h.spot?u.category="spot":h.linear?u.category="linear":h.inverse?u.category="inverse":h.option&&(u.category="option");const N=this.safeString(n,"cost");n=this.omit(n,"cost");const R="market"===c&&"buy"===i&&(void 0!==r||void 0!==N);if(h.spot&&"market"===t&&d&&!R)if(void 0!==N||void 0!==r){let t;if(u.marketUnit="quoteCoin",void 0!==N)t=N;else{t=o.Y.stringMul(_,E)}u.qty=this.getCost(e,t)}else u.marketUnit="baseCoin",u.qty=_;else if(h.spot&&"market"===t&&"buy"===i){let t=!0;if([t,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice"),t){if(void 0===r&&void 0===N)throw new a.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const t=o.Y.stringMul(_,E),i=void 0!==N?N:t;u.qty=this.getCost(e,i)}}else u.qty=void 0!==N?this.getCost(e,this.numberToString(N)):void 0!==r?this.getCost(e,o.Y.stringMul(_,E)):_}else S||B||(u.qty=_);if(S)void 0!==b&&(u.activePrice=this.getPrice(e,b)),u.trailingStop=k;else if(O&&!B){const t=this.safeString(n,"triggerDirection");if(n=this.omit(n,["triggerPrice","stopPrice","triggerDirection"]),h.spot){if(void 0!==t)throw new a.NotSupported(this.id+" createOrder() : trigger order does not support triggerDirection for spot markets yet")}else{if(void 0===t)throw new a.ArgumentsRequired(this.id+' stop/trigger orders require a triggerDirection parameter, either "above" or "below" to determine the direction of the trigger.');const e="above"===t||"1"===t;u.triggerDirection=e?1:2}u.triggerPrice=this.getPrice(e,m)}else!T&&!P||B||(u.triggerDirection=C?T?1:2:T?2:1,m=T?g:v,u.triggerPrice=this.getPrice(e,m),u.reduceOnly=!0);if((I||M)&&!B){if(I){const t=this.safeValue2(y,"triggerPrice","stopPrice",y);u.stopLoss=this.getPrice(e,t);const i=this.safeValue(y,"price");void 0!==i&&(u.tpslMode="Partial",u.slOrderType="Limit",u.slLimitPrice=this.getPrice(e,i))}if(M){const t=this.safeValue2(w,"triggerPrice","stopPrice",w);u.takeProfit=this.getPrice(e,t);const i=this.safeValue(w,"price");void 0!==i&&(u.tpslMode="Partial",u.tpOrderType="Limit",u.tpLimitPrice=this.getPrice(e,i))}}return!h.spot&&f&&(p&&(n=this.omit(n,"reduceOnly"),i="buy"===i?"sell":"buy"),u.positionIdx="buy"===i?1:2),n=this.omit(n,["stopPrice","timeInForce","stopLossPrice","takeProfitPrice","postOnly","clientOrderId","triggerPrice","stopLoss","takeProfit","trailingAmount","trailingTriggerPrice","hedged"]),this.extend(u,n)}async createOrders(e,t={}){await this.loadMarkets();const i=(await this.isUnifiedEnabled())[1],s=[],r=[];for(let t=0;t<e.length;t++){const a=e[t],o=this.safeString(a,"symbol");r.push(o);const n=this.safeString(a,"type"),d=this.safeString(a,"side"),h=this.safeValue(a,"amount"),c=this.safeValue(a,"price"),l=this.safeDict(a,"params",{}),u=this.createOrderRequest(o,n,d,h,c,l,i);delete u.category,s.push(u)}const o=this.marketSymbols(r,void 0,!1,!0,!0),n=this.market(o[0]),d=this.safeInteger(this.options,"unifiedMarginStatus",6);let h;if([h,t]=this.getBybitType("createOrders",n,t),"inverse"===h&&d<5)throw new a.NotSupported(this.id+" createOrders does not allow inverse orders for non UTA2.0 account");const c={category:h,request:s},l=await this.privatePostV5OrderCreateBatch(this.extend(c,t)),u=this.safeDict(l,"result",{}),f=this.safeList(u,"list",[]),p=this.safeDict(l,"retExtInfo",{}),m=this.safeList(p,"list",[]);for(let e=0;e<m.length;e++){const t=m[e];0!==this.safeInteger(t,"code")&&(f[e]=this.extend(f[e],t))}return this.parseOrders(f)}editOrderRequest(e,t,i,s,r=void 0,a=void 0,o={}){const n=this.market(t),d={symbol:n.id,orderId:e};n.spot?d.category="spot":n.linear?d.category="linear":n.inverse?d.category="inverse":n.option&&(d.category="option"),void 0!==r&&(d.qty=this.getAmount(t,r)),void 0!==a&&(d.price=this.getPrice(t,this.numberToString(a)));let h=this.safeString2(o,"triggerPrice","stopPrice");const c=this.safeString(o,"stopLossPrice"),l=this.safeString(o,"takeProfitPrice"),u=this.safeValue(o,"stopLoss"),f=this.safeValue(o,"takeProfit"),p=void 0!==c,m=void 0!==u,g=void 0!==f;if((p||void 0!==l)&&(h=p?c:l),void 0!==h){const e="0"===h?h:this.getPrice(t,h);d.triggerPrice=e;const i=this.safeString(o,"triggerBy","LastPrice");d.triggerBy=i}if(m||g){if(m){const e=this.safeString2(u,"triggerPrice","stopPrice",u),i="0"===e?e:this.getPrice(t,e);d.stopLoss=i;const s=this.safeString(o,"slTriggerBy","LastPrice");d.slTriggerBy=s}if(g){const e=this.safeString2(f,"triggerPrice","stopPrice",f),i="0"===e?e:this.getPrice(t,e);d.takeProfit=i;const s=this.safeString(o,"tpTriggerBy","LastPrice");d.tpTriggerBy=s}}const v=this.safeString(o,"clientOrderId");return void 0!==v&&(d.orderLinkId=v),o=this.omit(o,["stopPrice","stopLossPrice","takeProfitPrice","triggerPrice","clientOrderId","stopLoss","takeProfit"]),d}async editOrder(e,t,i,s,r=void 0,o=void 0,n={}){if(await this.loadMarkets(),void 0===t)throw new a.ArgumentsRequired(this.id+" editOrder() requires a symbol argument");const d=this.editOrderRequest(e,t,i,s,r,o,n),h=await this.privatePostV5OrderAmend(this.extend(d,n)),c=this.safeDict(h,"result",{});return this.safeOrder({info:h,id:this.safeString(c,"orderId")})}async editOrders(e,t={}){await this.loadMarkets();const i=[];let s=[];for(let t=0;t<e.length;t++){const r=e[t],a=this.safeString(r,"symbol");s.push(a);const o=this.safeString(r,"id"),n=this.safeString(r,"type"),d=this.safeString(r,"side"),h=this.safeValue(r,"amount"),c=this.safeValue(r,"price"),l=this.safeDict(r,"params",{}),u=this.editOrderRequest(o,a,n,d,h,c,l);delete u.category,i.push(u)}s=this.marketSymbols(s,void 0,!1,!0,!0);const r=this.market(s[0]),o=this.safeInteger(this.options,"unifiedMarginStatus",6);let n;if([n,t]=this.getBybitType("editOrders",r,t),"inverse"===n&&o<5)throw new a.NotSupported(this.id+" editOrders does not allow inverse orders for non UTA2.0 account");const d={category:n,request:i},h=await this.privatePostV5OrderAmendBatch(this.extend(d,t)),c=this.safeDict(h,"result",{}),l=this.safeList(c,"list",[]),u=this.safeDict(h,"retExtInfo",{}),f=this.safeList(u,"list",[]);for(let e=0;e<f.length;e++){const t=f[e];0!==this.safeInteger(t,"code")&&(l[e]=this.extend(l[e],t))}return this.parseOrders(l)}cancelOrderRequest(e,t=void 0,i={}){const s=this.market(t),r={symbol:s.id};if(s.spot){const e=this.safeBool2(i,"stop","trigger",!1);i=this.omit(i,["stop","trigger"]),r.orderFilter=e?"StopOrder":"Order"}return void 0!==e&&(r.orderId=e),s.spot?r.category="spot":s.linear?r.category="linear":s.inverse?r.category="inverse":s.option&&(r.category="option"),this.extend(r,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),r=this.cancelOrderRequest(e,t,i),o=await this.privatePostV5OrderCancel(r),n=this.safeDict(o,"result",{});return this.parseOrder(n,s)}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(!(await this.isUnifiedEnabled())[1])throw new a.NotSupported(this.id+" cancelOrders() supports UTA accounts only");let r;if([r,i]=this.getBybitType("cancelOrders",s,i),"inverse"===r)throw new a.NotSupported(this.id+" cancelOrders does not allow inverse orders");const o=[],n=this.safeList2(i,"clientOrderIds","clientOids",[]);i=this.omit(i,["clientOrderIds","clientOids"]);for(let e=0;e<n.length;e++)o.push({symbol:s.id,orderLinkId:this.safeString(n,e)});for(let t=0;t<e.length;t++)o.push({symbol:s.id,orderId:this.safeString(e,t)});const d={category:r,request:o},h=await this.privatePostV5OrderCancelBatch(this.extend(d,i)),c=this.safeDict(h,"result",{}),l=this.safeList(c,"list",[]);return this.parseOrders(l,s)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={timeWindow:this.parseToInt(e/1e3)};let s;[s,t]=this.handleMarketTypeAndParams("cancelAllOrdersAfter",void 0,t,"swap");const r=this.safeString({spot:"SPOT",swap:"DERIVATIVES",option:"OPTIONS"},s,s);i.product=r;return await this.privatePostV5OrderDisconnectedCancelAll(this.extend(i,t))}async cancelOrdersForSymbols(e,t={}){await this.loadMarkets();if(!(await this.isUnifiedEnabled())[1])throw new a.NotSupported(this.id+" cancelOrdersForSymbols() supports UTA accounts only");const i=[];let s;for(let r=0;r<e.length;r++){const o=e[r],n=this.safeString(o,"symbol"),d=this.market(n);let h;if([h,t]=this.getBybitType("cancelOrders",d,t),"inverse"===h)throw new a.NotSupported(this.id+" cancelOrdersForSymbols does not allow inverse orders");if(void 0!==s&&s!==h)throw new a.ExchangeError(this.id+" cancelOrdersForSymbols requires all orders to be of the same category (linear, spot or option))");s=h;const c=this.safeString(o,"id"),l=this.safeString(o,"clientOrderId");let u="orderId";void 0!==l&&(u="orderLinkId");const f={symbol:d.id};f[u]="orderId"===u?c:l,i.push(f)}const r={category:s,request:i},o=await this.privatePostV5OrderCancelBatch(this.extend(r,t)),n=this.safeDict(o,"result",{}),d=this.safeList(n,"list",[]);return this.parseOrders(d,void 0)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const[i,s]=await this.isUnifiedEnabled(),r=i||s;let o;const n={};let d;if(void 0!==e&&(o=this.market(e),n.symbol=o.id),[d,t]=this.getBybitType("cancelAllOrders",o,t),n.category=d,"option"===d&&!r)throw new a.NotSupported(this.id+" cancelAllOrders() Normal Account not support "+d+" market");if("linear"===d||"inverse"===d){const i=this.safeString(t,"baseCoin");if(void 0===e&&void 0===i){const e=this.safeString(this.options,"defaultSettle","USDT");n.settleCoin=this.safeString(t,"settleCoin",e)}}const h=this.safeBool2(t,"stop","trigger",!1);t=this.omit(t,["stop","trigger"]),h&&(n.orderFilter="StopOrder");const c=await this.privatePostV5OrderCancelAll(this.extend(n,t)),l=this.safeDict(c,"result",{}),u=this.safeList(l,"list");return Array.isArray(u)?this.parseOrders(u,o):c}async fetchOrderClassic(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();if(this.market(t).spot)throw new a.NotSupported(this.id+" fetchOrder() is not supported for spot markets");const s={orderId:e},r=await this.fetchOrders(t,void 0,void 0,this.extend(s,i)),o=r.length;if(0===o){const t=this.safeBoolN(i,["trigger","stop"],!1)?"":' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = true';throw new a.OrderNotFound("Order "+e.toString()+" was not found."+t)}if(o>1)throw new a.InvalidOrder(this.id+" returned more than one order");return this.safeValue(r,0)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const[s,r]=await this.isUnifiedEnabled();if(!(s||r))return await this.fetchOrderClassic(e,t,i);let o=!1;if([o,i]=this.handleOptionAndParams(i,"fetchOrder","acknowledged"),!o)throw new a.ArgumentsRequired(this.id+' fetchOrder() can only access an order if it is in last 500 orders (of any status) for your account. Set params["acknowledged"] = true to hide this warning. Alternatively, we suggest to use fetchOpenOrder or fetchClosedOrder');const n=this.market(t);let d;[d,i]=this.getBybitType("fetchOrder",n,i);const h={symbol:n.id,orderId:e,category:d};let c;[c,i]=this.handleParamBool2(i,"trigger","stop",!1),c&&(h.orderFilter="StopOrder");const l=await this.privateGetV5OrderRealtime(this.extend(h,i)),u=this.safeDict(l,"result",{}),f=this.safeList(u,"list",[]);if(0===f.length){const t=c?"":' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = true';throw new a.OrderNotFound("Order "+e.toString()+" was not found."+t)}const p=this.safeDict(f,0,{});return this.parseOrder(p,n)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){const r=await this.isUnifiedEnabled();if(this.safeBool(r,1))throw new a.NotSupported(this.id+" fetchOrders() is not supported after the 5/02 update for UTA accounts, please use fetchOpenOrders, fetchClosedOrders or fetchCanceledOrders");return await this.fetchOrdersClassic(e,t,i,s)}async fetchOrdersClassic(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),r)return await this.fetchPaginatedCallCursor("fetchOrders",e,t,i,s,"nextPageCursor","cursor",void 0,50);const o={};let n,d;if(void 0!==e&&(n=this.market(e),o.symbol=n.id),[d,s]=this.getBybitType("fetchOrders",n,s),"spot"===d)throw new a.NotSupported(this.id+" fetchOrders() is not supported for spot markets");o.category=d;const h=this.safeBoolN(s,["trigger","stop"],!1);s=this.omit(s,["trigger","stop"]),h&&(o.orderFilter="StopOrder"),void 0!==i&&(o.limit=i),void 0!==t&&(o.startTime=t);const c=this.safeInteger(s,"until"),l=this.safeInteger(s,"endTime",c);s=this.omit(s,["endTime","until"]),void 0!==l&&(o.endTime=l);const u=await this.privateGetV5OrderHistory(this.extend(o,s)),f=this.addPaginationCursorToResult(u);return this.parseOrders(f,n,t,i)}async fetchClosedOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e},r=await this.fetchClosedOrders(t,void 0,void 0,this.extend(s,i)),o=r.length;if(0===o){const t=this.safeBoolN(i,["trigger","stop"],!1)?"":' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = true';throw new a.OrderNotFound("Order "+e.toString()+" was not found."+t)}if(o>1)throw new a.InvalidOrder(this.id+" returned more than one order");return this.safeValue(r,0)}async fetchOpenOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e},r=await this.fetchOpenOrders(t,void 0,void 0,this.extend(s,i)),o=r.length;if(0===o){const t=this.safeBoolN(i,["trigger","stop"],!1)?"":' If you are trying to fetch SL/TP conditional order, you might try setting params["trigger"] = true';throw new a.OrderNotFound("Order "+e.toString()+" was not found."+t)}if(o>1)throw new a.InvalidOrder(this.id+" returned more than one order");return this.safeValue(r,0)}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchCanceledAndClosedOrders","paginate"),r)return await this.fetchPaginatedCallCursor("fetchCanceledAndClosedOrders",e,t,i,s,"nextPageCursor","cursor",void 0,50);const a={};let o,n;void 0!==e&&(o=this.market(e),a.symbol=o.id),[n,s]=this.getBybitType("fetchCanceledAndClosedOrders",o,s),a.category=n;const d=this.safeBoolN(s,["trigger","stop"],!1);s=this.omit(s,["trigger","stop"]),d&&(a.orderFilter="StopOrder"),void 0!==i&&(a.limit=i),void 0!==t&&(a.startTime=t);const h=this.safeInteger(s,"until"),c=this.safeInteger(s,"endTime",h);s=this.omit(s,["endTime","until"]),void 0!==c&&(a.endTime=c);const l=await this.privateGetV5OrderHistory(this.extend(a,s)),u=this.addPaginationCursorToResult(l);return this.parseOrders(u,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return await this.fetchCanceledAndClosedOrders(e,t,i,this.extend({orderStatus:"Filled"},s))}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return await this.fetchCanceledAndClosedOrders(e,t,i,this.extend({orderStatus:"Cancelled"},s))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r)return await this.fetchPaginatedCallCursor("fetchOpenOrders",e,t,i,s,"nextPageCursor","cursor",void 0,50);const a={};let o,n;if(void 0!==e&&(o=this.market(e),a.symbol=o.id),[n,s]=this.getBybitType("fetchOpenOrders",o,s),"linear"===n||"inverse"===n){const t=this.safeString(s,"baseCoin");if(void 0===e&&void 0===t){const e=this.safeString(this.options,"defaultSettle","USDT"),t=this.safeString(s,"settleCoin",e);a.settleCoin=t}}a.category=n;const d=this.safeBool2(s,"stop","trigger",!1);s=this.omit(s,["stop","trigger"]),d&&(a.orderFilter="StopOrder"),void 0!==i&&(a.limit=i);const h=await this.privateGetV5OrderRealtime(this.extend(a,s)),c=this.addPaginationCursorToResult(h);return this.parseOrders(c,o,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a={},o=this.safeString2(r,"clientOrderId","orderLinkId");return void 0!==o?a.orderLinkId=o:a.orderId=e,r=this.omit(r,["clientOrderId","orderLinkId"]),await this.fetchMyTrades(t,i,s,this.extend(a,r))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchMyTrades",e,t,i,s,"nextPageCursor","cursor",void 0,100);let a,o,n={execType:"Trade"};void 0!==e&&(a=this.market(e),n.symbol=a.id),[o,s]=this.getBybitType("fetchMyTrades",a,s),n.category=o,void 0!==i&&(n.limit=i),void 0!==t&&(n.startTime=t),[n,s]=this.handleUntilOption("endTime",n,s);const d=await this.privateGetV5ExecutionList(this.extend(n,s)),h=this.addPaginationCursorToResult(d);return this.parseTrades(h,a,t,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"addressDeposit"),s=this.safeString(e,"tagDeposit"),r=this.safeString(t,"code");return this.checkAddress(i),{info:e,currency:r,network:this.networkIdToCode(this.safeString(e,"chain"),r),address:i,tag:s}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();let i=this.currency(e);const s={coin:i.id};let r;[r,t]=this.handleNetworkCodeAndParams(t),void 0!==r&&(s.chainType=this.networkCodeToId(r,e));const a=await this.privateGetV5AssetDepositQueryAddress(this.extend(s,t)),o=this.safeDict(a,"result",{}),n=this.safeList(o,"chains",[]),d=this.safeString(o,"coin");i=this.currency(d);const h=this.parseDepositAddresses(n,[i.code],!1,{currency:i.code});return this.indexBy(h,"network")}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),[s,r]=this.handleNetworkCodeAndParams(t),a=await this.fetchDepositAddressesByNetwork(e,r);return a[this.selectNetworkCodeFromUnifiedNetworks(i.code,s,a)]}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallCursor("fetchDeposits",e,t,i,s,"nextPageCursor","cursor",void 0,50);let a,o={};void 0!==e&&(a=this.currency(e),o.coin=a.id),void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.privateGetV5AssetDepositQueryRecord(this.extend(o,s)),d=this.addPaginationCursorToResult(n);return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallCursor("fetchWithdrawals",e,t,i,s,"nextPageCursor","cursor",void 0,50);let a,o={};void 0!==e&&(a=this.currency(e),o.coin=a.id),void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.privateGetV5AssetWithdrawQueryRecord(this.extend(o,s)),d=this.addPaginationCursorToResult(n);return this.parseTransactions(d,a,t,i)}parseTransactionStatus(e){return this.safeString({0:"unknown",1:"pending",2:"processing",3:"ok",4:"fail",SecurityCheck:"pending",Pending:"pending",success:"ok",CancelByUser:"canceled",Reject:"rejected",Fail:"failed",BlockchainConfirmed:"ok"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeCurrencyCode(i,t),r=this.safeInteger2(e,"createTime","successAt"),a=this.safeInteger(e,"updateTime"),o=this.parseTransactionStatus(this.safeString(e,"status")),n=this.safeNumber2(e,"depositFee","withdrawFee"),d="depositFee"in e?"deposit":"withdrawal";let h;void 0!==n&&(h={cost:n,currency:s});const c=this.safeString(e,"toAddress");return{info:e,id:this.safeString2(e,"id","withdrawId"),txid:this.safeString(e,"txID"),timestamp:r,datetime:this.iso8601(r),network:this.networkIdToCode(this.safeString(e,"chain")),address:void 0,addressTo:c,addressFrom:void 0,tag:this.safeString(e,"tag"),tagTo:void 0,tagFrom:void 0,type:d,amount:this.safeNumber(e,"amount"),currency:s,status:o,updated:a,fee:h,internal:void 0,comment:void 0}}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),r)return await this.fetchPaginatedCallCursor("fetchLedger",e,t,i,s,"nextPageCursor","cursor",void 0,50);const a={},o=await this.isUnifiedEnabled();let n,d,h,c="coin";o[1]?(c="currency",void 0!==t&&(a.startTime=t)):void 0!==t&&(a.start_date=this.yyyymmdd(t)),void 0!==e&&(n=this.currency(e),a[c]=n.id),void 0!==i&&(a.limit=i),[d,s]=this.handleSubTypeAndParams("fetchLedger",void 0,s),h=o[1]?"inverse"===d?await this.privateGetV5AccountContractTransactionLog(this.extend(a,s)):await this.privateGetV5AccountTransactionLog(this.extend(a,s)):await this.privateGetV5AccountContractTransactionLog(this.extend(a,s));const l=this.addPaginationCursorToResult(h);return this.parseLedger(l,n,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeString2(e,"coin","currency"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeString2(e,"amount","change"),a=this.safeString2(e,"wallet_balance","cashBalance"),n=o.Y.stringLt(r,"0")?"out":"in";let d,h,c;if(void 0!==a&&void 0!==r){const e="out"===n?r:o.Y.stringNeg(r);d=this.parseToNumeric(o.Y.stringAdd(a,e)),h=this.parseToNumeric(a),c=this.parseToNumeric(o.Y.stringAbs(r))}let l=this.parse8601(this.safeString(e,"exec_time"));return void 0===l&&(l=this.safeInteger(e,"transactionTime")),this.safeLedgerEntry({info:e,id:this.safeString(e,"id"),direction:n,account:this.safeString(e,"wallet_id"),referenceId:this.safeString(e,"tx_id"),referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:s,amount:c,timestamp:l,datetime:this.iso8601(l),before:d,after:h,status:"ok",fee:{currency:s,cost:this.safeNumber(e,"fee")}},t)}parseLedgerEntryType(e){return this.safeString({Deposit:"transaction",Withdraw:"transaction",RealisedPNL:"trade",Commission:"fee",Refund:"cashback",Prize:"prize",ExchangeOrderWithdraw:"transaction",ExchangeOrderDeposit:"transaction",TRANSFER_IN:"transaction",TRANSFER_OUT:"transaction",TRADE:"trade",SETTLEMENT:"trade",DELIVERY:"trade",LIQUIDATION:"trade",BONUS:"Prize",FEE_REFUND:"cashback",INTEREST:"transaction",CURRENCY_BUY:"trade",CURRENCY_SELL:"trade"},e,e)}async withdraw(e,t,i,s=void 0,r={}){let a;[s,r]=this.handleWithdrawTagAndParams(s,r),[a,r]=this.handleOptionAndParams(r,"withdraw","accountType","SPOT"),await this.loadMarkets(),this.checkAddress(i);const o=this.currency(e),n={coin:o.id,amount:this.numberToString(t),address:i,timestamp:this.milliseconds(),accountType:a};void 0!==s&&(n.tag=s);const[d,h]=this.handleNetworkCodeAndParams(r),c=this.networkCodeToId(d);void 0!==c&&(n.chain=c.toUpperCase());const l=await this.privatePostV5AssetWithdrawCreate(this.extend(n,h)),u=this.safeDict(l,"result",{});return this.parseTransaction(u,o)}async fetchPosition(e,t={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchPosition() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,o;[o,t]=this.getBybitType("fetchPosition",i,t),s.category=o,r=await this.privateGetV5PositionList(this.extend(s,t));const n=this.safeDict(r,"result",{}),d=this.safeList2(n,"list","dataList",[]),h=this.safeInteger(r,"time"),c=this.safeDict(d,0,{}),l=this.parsePosition(c,i);return l.timestamp=h,l.datetime=this.iso8601(h),l}async fetchPositions(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==e&&Array.isArray(e)){const t=e.length;if(t>1)throw new a.ArgumentsRequired(this.id+" fetchPositions() does not accept an array with more than one symbol");1===t&&(i=e[0]),e=this.marketSymbols(e)}else void 0!==e&&(i=e,e=[this.symbol(i)]);const s={};let r,o;if(void 0!==i&&(r=this.market(i),i=r.symbol,s.symbol=r.id),[o,t]=this.getBybitType("fetchPositions",r,t),"linear"===o||"inverse"===o){const e=this.safeString(t,"baseCoin");if("linear"===o){if(void 0===i&&void 0===e){const e=this.safeString(this.options,"defaultSettle","USDT"),i=this.safeString(t,"settleCoin",e);s.settleCoin=i}}else void 0===i&&void 0===e&&(s.category="inverse")}t=this.omit(t,["type"]),s.category=o;const n=await this.privateGetV5PositionList(this.extend(s,t)),d=this.addPaginationCursorToResult(n),h=[];for(let e=0;e<d.length;e++){let t=d[e];"data"in t&&"is_valid"in t&&(t=this.safeDict(t,"data")),h.push(this.parsePosition(t))}return this.filterByArrayPositions(h,"symbol",e,!1)}parsePosition(e,t=void 0){const i=void 0!==this.safeString(e,"closedSize"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t,void 0,"contract");const r=o.Y.stringAbs(this.safeString2(e,"size","qty"));let a=this.safeString(e,"side");void 0!==a&&(a="Buy"===a?i?"short":"long":"Sell"===a?i?"long":"short":void 0);const n=this.safeString2(e,"positionValue","cumExitValue"),d=this.omitZero(this.safeString(e,"unrealisedPnl"));let h=this.safeStringN(e,["positionIM","cumEntryValue"]),c=this.safeString(e,"positionMM");const l=this.safeIntegerN(e,["createdTime","createdAt"]);let u=this.parse8601(this.safeString(e,"updated_at"));void 0===u&&(u=this.safeIntegerN(e,["updatedTime","updatedAt","updatedTime"]));const f=this.safeInteger(e,"tradeMode",0);let p;(!this.options.enableUnifiedAccount||this.options.enableUnifiedAccount&&t.inverse)&&(i||(p=1===f?"isolated":"cross"));let m=this.safeString(e,"positionBalance");const g=this.omitZero(this.safeStringN(e,["entryPrice","avgPrice","avgEntryPrice"])),v=this.omitZero(this.safeString(e,"liqPrice")),y=this.safeString(e,"leverage");if(void 0!==v)if("USDC"===t.settle){const e=o.Y.stringAbs(o.Y.stringSub(g,v));m=o.Y.stringAdd(o.Y.stringAdd(o.Y.stringMul(e,r),c),d)}else{const i=this.safeString(e,"bustPrice");if(t.linear){const e=o.Y.stringAbs(o.Y.stringSub(v,i));c=o.Y.stringMul(e,r),void 0!==g&&(h=o.Y.stringDiv(o.Y.stringMul(r,g),y))}else{const e=o.Y.stringAbs(o.Y.stringSub(i,v)),t=o.Y.stringMul(i,v);c=o.Y.stringDiv(o.Y.stringMul(r,e),t),void 0!==g&&(h=o.Y.stringDiv(r,o.Y.stringMul(g,y)))}}const w=o.Y.stringDiv(c,n),b=o.Y.stringDiv(c,m,4),k=this.safeString(e,"positionIdx"),S=void 0!==k&&"0"!==k;return this.safePosition({info:e,id:void 0,symbol:t.symbol,timestamp:l,datetime:this.iso8601(l),lastUpdateTimestamp:u,initialMargin:this.parseNumber(h),initialMarginPercentage:this.parseNumber(o.Y.stringDiv(h,n)),maintenanceMargin:this.parseNumber(c),maintenanceMarginPercentage:this.parseNumber(w),entryPrice:this.parseNumber(g),notional:this.parseNumber(n),leverage:this.parseNumber(y),unrealizedPnl:this.parseNumber(d),realizedPnl:this.safeNumber(e,"closedPnl"),contracts:this.parseNumber(r),contractSize:this.safeNumber(t,"contractSize"),marginRatio:this.parseNumber(b),liquidationPrice:this.parseNumber(v),markPrice:this.safeNumber(e,"markPrice"),lastPrice:this.safeNumber(e,"avgExitPrice"),collateral:this.parseNumber(m),marginMode:p,side:a,percentage:void 0,stopLossPrice:this.safeNumber2(e,"stop_loss","stopLoss"),takeProfitPrice:this.safeNumber2(e,"take_profit","takeProfit"),hedged:S})}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.fetchPosition(e,t);return this.parseLeverage(s,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"marginMode"),longLeverage:s,shortLeverage:s}}async setMarginMode(e,t=void 0,i={}){await this.loadMarkets();const[s,r]=await this.isUnifiedEnabled();let o,n;if(s||r){if("isolated"===e)e="ISOLATED_MARGIN";else if("cross"===e)e="REGULAR_MARGIN";else{if("portfolio"!==e)throw new a.NotSupported(this.id+" setMarginMode() marginMode must be either [isolated, cross, portfolio]");e="PORTFOLIO_MARGIN"}const t={setMarginMode:e};n=await this.privatePostV5AccountSetMarginMode(this.extend(t,i))}else{if(void 0===t)throw new a.ArgumentsRequired(this.id+" setMarginMode() requires a symbol parameter for non unified account");o=this.market(t);if("USDC"===o.settle){if("cross"===e)e="REGULAR_MARGIN";else{if("portfolio"!==e)throw new a.NotSupported(this.id+" setMarginMode() for usdc market marginMode must be either [cross, portfolio]");e="PORTFOLIO_MARGIN"}const t={setMarginMode:e};n=await this.privatePostV5AccountSetMarginMode(this.extend(t,i))}else{let t,s,r,d;if([t,i]=this.getBybitType("setPositionMode",o,i),"cross"===e)s=0;else{if("isolated"!==e)throw new a.NotSupported(this.id+" setMarginMode() with symbol marginMode must be either [isolated, cross]");s=1}const h=this.safeString(i,"leverage");if(void 0===h){if(r=this.safeString2(i,"sell_leverage","sellLeverage"),d=this.safeString2(i,"buy_leverage","buyLeverage"),void 0===r&&void 0===d)throw new a.ArgumentsRequired(this.id+" setMarginMode() requires a leverage parameter or sell_leverage and buy_leverage parameters");void 0===d&&(d=r),void 0===r&&(r=d),i=this.omit(i,["buy_leverage","sell_leverage","sellLeverage","buyLeverage"])}else r=h,d=h,i=this.omit(i,"leverage");const c={category:t,symbol:o.id,tradeMode:s,buyLeverage:d,sellLeverage:r};n=await this.privatePostV5PositionSwitchIsolated(this.extend(c,i))}}return n}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s=this.market(t),r=this.numberToString(e),o={symbol:s.id,buyLeverage:r,sellLeverage:r};if(o.buyLeverage=r,o.sellLeverage=r,s.linear)o.category="linear";else{if(!s.inverse)throw new a.NotSupported(this.id+" setLeverage() only support linear and inverse market");o.category="inverse"}return await this.privatePostV5PositionSetLeverage(this.extend(o,i))}async setPositionMode(e,t=void 0,i={}){let s,r;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),r=e?3:0;const a={mode:r};if(void 0===t?a.coin="USDT":a.symbol=s.id,void 0!==t)a.category=s.linear?"linear":"inverse";else{let e;[e,i]=this.getBybitType("setPositionMode",s,i),a.category=e}i=this.omit(i,"type");return await this.privatePostV5PositionSwitchMode(this.extend(a,i))}async fetchDerivativesOpenInterestHistory(e,t="1h",i=void 0,s=void 0,r={}){await this.loadMarkets();let o=this.market(e);const n=o.linear?"linear":"inverse",d=this.safeString(r,"category",n),h=this.safeDict(this.options,"intervals"),c=this.safeString(h,t);if(void 0===c)throw new a.BadRequest(this.id+" fetchOpenInterestHistory() cannot use the "+t+" timeframe");const l={symbol:o.id,intervalTime:c,category:d};void 0!==i&&(l.startTime=i);const u=this.safeInteger(r,"until");r=this.omit(r,["until"]),void 0!==u&&(l.endTime=u),void 0!==s&&(l.limit=s);const f=await this.publicGetV5MarketOpenInterest(this.extend(l,r)),p=this.safeDict(f,"result",{}),m=this.addPaginationCursorToResult(f),g=this.safeString(p,"symbol");return o=this.safeMarket(g,o,void 0,"contract"),this.parseOpenInterestsHistory(m,o,i,s)}async fetchOpenInterest(e,t={}){await this.loadMarkets();let i=this.market(e);if(!i.contract)throw new a.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s=this.safeString(t,"interval","1h"),r=this.safeDict(this.options,"intervals"),o=this.safeString(r,s);if(void 0===o)throw new a.BadRequest(this.id+" fetchOpenInterest() cannot use the "+s+" timeframe");const n=i.linear?"linear":"inverse",d=this.safeString(t,"category",n),h={symbol:i.id,intervalTime:o,category:d},c=await this.publicGetV5MarketOpenInterest(this.extend(h,t)),l=this.safeDict(c,"result",{}),u=this.safeString(l,"symbol");i=this.safeMarket(u,i,void 0,"contract");const f=this.addPaginationCursorToResult(c);return this.parseOpenInterest(f[0],i)}async fetchOpenInterestHistory(e,t="1h",i=void 0,s=void 0,r={}){if("1m"===t)throw new a.BadRequest(this.id+" fetchOpenInterestHistory cannot use the 1m timeframe");await this.loadMarkets();if(this.safeBool(r,"paginate"))return(r=this.omit(r,"paginate")).timeframe=t,await this.fetchPaginatedCallCursor("fetchOpenInterestHistory",e,i,s,r,"nextPageCursor","cursor",void 0,200);const o=this.market(e);if(o.spot||o.option)throw new a.BadRequest(this.id+" fetchOpenInterestHistory() symbol does not support market "+e);const n={symbol:o.id};return void 0!==s&&(n.limit=s),await this.fetchDerivativesOpenInterestHistory(e,t,i,s,r)}parseOpenInterest(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeNumber2(e,"open_interest","openInterest"),r=t.linear?s:void 0,a=t.inverse?s:void 0;return this.safeOpenInterest({symbol:t.symbol,openInterestAmount:r,openInterestValue:a,timestamp:i,datetime:this.iso8601(i),info:e},t)}async fetchCrossBorrowRate(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id},r=await this.privateGetV5SpotCrossMarginTradeLoanInfo(this.extend(s,t)),a=this.safeInteger(r,"time"),o=this.safeDict(r,"result",{});return o.timestamp=a,this.parseBorrowRate(o,i)}parseBorrowRate(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString2(e,"coin","currency"),r=this.safeNumber(e,"hourlyBorrowRate"),a=void 0!==r?36e5:864e5;return{currency:this.safeCurrencyCode(s,t),rate:this.safeNumber(e,"interestRate",r),period:a,timestamp:i,datetime:this.iso8601(i),info:e}}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=await this.privateGetV5SpotCrossMarginTradeAccount(this.extend({},r)),o=this.safeDict(a,"result",{}),n=this.safeList(o,"loanAccountList",[]),d=this.parseBorrowInterests(n,void 0);return this.filterByCurrencySinceLimit(d,e,i,s)}async fetchBorrowRateHistory(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={currency:this.currency(e).id};void 0===t&&(t=this.milliseconds()-2592e6),r.startTime=t;let a=this.safeInteger2(s,"until","endTime");s=this.omit(s,["until"]),void 0===a&&(a=t+2592e6),r.endTime=a;const o=await this.privateGetV5SpotMarginTradeInterestRateHistory(this.extend(r,s)),n=this.safeDict(o,"result"),d=this.safeList(n,"list",[]);return this.parseBorrowRateHistory(d,e,t,i)}parseBorrowInterest(e,t=void 0){return{info:e,symbol:void 0,currency:this.safeCurrencyCode(this.safeString(e,"tokenId")),interest:this.safeNumber(e,"interest"),interestRate:void 0,amountBorrowed:this.safeNumber(e,"loan"),marginMode:"cross",timestamp:void 0,datetime:void 0}}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.safeString(r,"transferId",this.uuid()),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.currency(e),c=this.currencyToPrecision(e,t),l={transferId:a,fromAccountType:n,toAccountType:d,coin:h.id,amount:c},u=await this.privatePostV5AssetTransferInterTransfer(this.extend(l,r)),f=this.safeInteger(u,"time"),p=this.safeDict(u,"result",{}),m=this.safeStringN(u,["retCode","retMsg"]),g=this.parseTransferStatus(m);return this.extend(this.parseTransfer(p,h),{timestamp:f,datetime:this.iso8601(f),amount:this.parseNumber(c),fromAccount:i,toAccount:s,status:g})}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchTransfers","paginate"),a)return await this.fetchPaginatedCallCursor("fetchTransfers",e,t,i,s,"nextPageCursor","cursor",void 0,50);let o={};void 0!==e&&(r=this.safeCurrency(e),o.coin=r.id),void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.privateGetV5AssetTransferQueryInterTransferList(this.extend(o,s)),d=this.addPaginationCursorToResult(n);return this.parseTransfers(d,r,t,i)}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={coin:s.id,qty:this.currencyToPrecision(e,t)},a=await this.privatePostV5SpotCrossMarginTradeLoan(this.extend(r,i)),o=this.safeDict(a,"result",{}),n=this.parseMarginLoan(o,s);return this.extend(n,{symbol:void 0,amount:t})}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={coin:s.id,qty:this.numberToString(t)},a=await this.privatePostV5SpotCrossMarginTradeRepay(this.extend(r,i)),o=this.safeDict(a,"result",{}),n=this.parseMarginLoan(o,s);return this.extend(n,{symbol:void 0,amount:t})}parseMarginLoan(e,t=void 0){return{id:this.safeString2(e,"transactId","repayId"),currency:this.safeString(t,"code"),amount:void 0,symbol:void 0,timestamp:void 0,datetime:void 0,info:e}}parseTransferStatus(e){return this.safeString({0:"ok",OK:"ok",SUCCESS:"ok"},e,e)}parseTransfer(e,t=void 0){const i=this.safeString(e,"coin"),s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"fromAccountType"),a=this.safeString(e,"toAccountType"),o=this.safeDict(this.options,"accountsById",{}),n=this.safeString(o,r,r),d=this.safeString(o,a,a);return{info:e,id:this.safeString(e,"transferId"),timestamp:s,datetime:this.iso8601(s),currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amount"),fromAccount:n,toAccount:d,status:this.parseTransferStatus(this.safeString(e,"status"))}}async fetchDerivativesMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};i.linear?s.category="linear":i.inverse&&(s.category="inverse");const r=await this.publicGetV5MarketRiskLimit(this.extend(s,t)),a=this.safeDict(r,"result"),o=this.safeList(a,"list");return this.parseMarketLeverageTiers(o,i)}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();let i;if(i=this.market(e),i.spot||i.option)throw new a.BadRequest(this.id+" fetchMarketLeverageTiers() symbol does not support market "+e);return i.id,await this.fetchDerivativesMarketLeverageTiers(e,t)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol"),s=void 0!==t?t.type:"contract";return{info:e,symbol:this.safeSymbol(i,t,void 0,s),maker:this.safeNumber(e,"makerFeeRate"),taker:this.safeNumber(e,"takerFeeRate"),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.linear?"linear":i.inverse?"inverse":i.spot?"spot":"option",s.category=r;const a=await this.privateGetV5AccountFeeRate(this.extend(s,t)),o=this.safeDict(a,"result",{}),n=this.safeList(o,"list",[]),d=this.safeDict(n,0,{});return this.parseTradingFee(d,i)}async fetchTradingFees(e={}){let t;if(await this.loadMarkets(),[t,e]=this.handleOptionAndParams(e,"fetchTradingFees","type","future"),"spot"===t)throw new a.NotSupported(this.id+" fetchTradingFees() is not supported for spot market");const i=await this.privateGetV5AccountFeeRate(e);let s=this.safeDict(i,"result",{});s=this.safeList(s,"list",[]);const r={};for(let e=0;e<s.length;e++){const t=this.parseTradingFee(s[e]);r[t.symbol]=t}return r}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"chains",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};if(0!==s)for(let e=0;e<s;e++){const a=i[e],o=this.safeString(a,"chain"),n=this.safeString(t,"code"),d=this.networkIdToCode(o,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(a,"withdrawFee"),percentage:!1}},1===s&&(r.withdraw.fee=this.safeNumber(a,"withdrawFee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){this.checkRequiredCredentials(),await this.loadMarkets();const i=await this.privateGetV5AssetCoinQueryInfo(t),s=this.safeDict(i,"result",{}),r=this.safeList(s,"rows",[]);return this.parseDepositWithdrawFees(r,e,"coin")}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let o,n;if(void 0!==e&&(o=this.market(e),r.symbol=o.id),[n,s]=this.getBybitType("fetchSettlementHistory",o,s),"spot"===n)throw new a.NotSupported(this.id+" fetchSettlementHistory() is not supported for spot market");r.category=n,void 0!==i&&(r.limit=i);const d=await this.publicGetV5MarketDeliveryPrice(this.extend(r,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"list",[]),l=this.parseSettlements(c,o),u=this.sortBy(l,"timestamp");return this.filterBySymbolSinceLimit(u,o.symbol,t,i)}async fetchMySettlementHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let o,n;if(void 0!==e&&(o=this.market(e),r.symbol=o.id),[n,s]=this.getBybitType("fetchMySettlementHistory",o,s),"spot"===n||"inverse"===n)throw new a.NotSupported(this.id+" fetchMySettlementHistory() is not supported for spot market");r.category="linear",void 0!==i&&(r.limit=i);const d=await this.privateGetV5AssetDeliveryRecord(this.extend(r,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"list",[]),l=this.parseSettlements(c,o),u=this.sortBy(l,"timestamp");return this.filterBySymbolSinceLimit(u,o.symbol,t,i)}parseSettlement(e,t){const i=this.safeInteger(e,"deliveryTime"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber(e,"deliveryPrice"),timestamp:i,datetime:this.iso8601(i)}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++)i.push(this.parseSettlement(e[s],t));return i}async fetchVolatilityHistory(e,t={}){await this.loadMarkets();const i={category:"option",baseCoin:this.currency(e).id},s=await this.publicGetV5MarketHistoricalVolatility(this.extend(i,t)),r=this.safeList(s,"result",[]);return this.parseVolatilityHistory(r)}parseVolatilityHistory(e){const t=[];for(let i=0;i<e.length;i++){const s=e[i],r=this.safeInteger(s,"time");t.push({info:e,timestamp:r,datetime:this.iso8601(r),volatility:this.safeNumber(s,"value")})}return t}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id,category:"option"},r=await this.publicGetV5MarketTickers(this.extend(s,t)),a=this.safeInteger(r,"time"),o=this.safeDict(r,"result",{}),n=this.safeList(o,"list",[]),d=this.parseGreeks(n[0],i);return this.extend(d,{timestamp:a,datetime:this.iso8601(a)})}parseGreeks(e,t=void 0){const i=this.safeString(e,"symbol");return{symbol:this.safeSymbol(i,t),timestamp:void 0,datetime:void 0,delta:this.safeNumber(e,"delta"),gamma:this.safeNumber(e,"gamma"),theta:this.safeNumber(e,"theta"),vega:this.safeNumber(e,"vega"),rho:void 0,bidSize:this.safeNumber(e,"bid1Size"),askSize:this.safeNumber(e,"ask1Size"),bidImpliedVolatility:this.safeNumber(e,"bid1Iv"),askImpliedVolatility:this.safeNumber(e,"ask1Iv"),markImpliedVolatility:this.safeNumber(e,"markIv"),bidPrice:this.safeNumber(e,"bid1Price"),askPrice:this.safeNumber(e,"ask1Price"),markPrice:this.safeNumber(e,"markPrice"),lastPrice:this.safeNumber(e,"lastPrice"),underlyingPrice:this.safeNumber(e,"underlyingPrice"),info:e}}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyLiquidations","paginate"),r)return await this.fetchPaginatedCallCursor("fetchMyLiquidations",e,t,i,s,"nextPageCursor","cursor",void 0,100);let a,o,n={execType:"BustTrade"};void 0!==e&&(a=this.market(e),n.symbol=a.id),[o,s]=this.getBybitType("fetchMyLiquidations",a,s),n.category=o,void 0!==i&&(n.limit=i),void 0!==t&&(n.startTime=t),[n,s]=this.handleUntilOption("endTime",n,s);const d=await this.privateGetV5ExecutionList(this.extend(n,s)),h=this.addPaginationCursorToResult(d);return this.parseLiquidations(h,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"execTime"),r=this.safeString(e,"execQty"),a=this.safeString(t,"contractSize"),n=this.safeString(e,"execPrice"),d=o.Y.stringMul(r,a),h=o.Y.stringMul(d,n);return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t,void 0,"contract"),contracts:this.parseNumber(r),contractSize:this.parseNumber(a),price:this.parseNumber(n),baseValue:this.parseNumber(d),quoteValue:this.parseNumber(h),timestamp:s,datetime:this.iso8601(s)})}async getLeverageTiersPaginated(e=void 0,t={}){let i;await this.loadMarkets(),void 0!==e&&(i=this.market(e));let s,r=!1;if([r,t]=this.handleOptionAndParams(t,"getLeverageTiersPaginated","paginate"),r)return await this.fetchPaginatedCallCursor("getLeverageTiersPaginated",e,void 0,void 0,t,"nextPageCursor","cursor",void 0,100);[s,t]=this.handleSubTypeAndParams("getLeverageTiersPaginated",i,t,"linear");const a={category:s},o=await this.publicGetV5MarketRiskLimit(this.extend(a,t)),n=this.addPaginationCursorToResult(o),d=this.safeDict(n,0),h=n.length-1,c=this.safeDict(n,h),l=this.safeString(d,"nextPageCursor");return c.info={nextPageCursor:l},n[h]=c,n}async fetchLeverageTiers(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==e){if(i=this.market(e[0]),i.spot)throw new a.NotSupported(this.id+" fetchLeverageTiers() is not supported for spot market");s=i.symbol}const r=await this.getLeverageTiersPaginated(s,this.extend({paginate:!0,paginationCalls:40},t));return e=this.marketSymbols(e),this.parseLeverageTiers(r,e,"symbol")}parseLeverageTiers(e,t=void 0,i=void 0){const s={},r=this.marketIds(t),a=this.filterByArray(e,i,r,!1),o=this.groupBy(a,i),n=Object.keys(o);for(let e=0;e<n.length;e++){const t=n[e],i=o[t];for(let e=0;e<i.length;e++){const t=this.safeInteger(i[e],"id");i[e].id=t}const r=this.safeMarket(t,void 0,void 0,"contract");s[r.symbol]=this.parseMarketLeverageTiers(this.sortBy(i,"id"),r)}return s}parseMarketLeverageTiers(e,t=void 0){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(e,"symbol");t=this.safeMarket(a);let o=this.parseNumber("0");0!==s&&(o=this.safeNumber(e[s-1],"riskLimitValue")),i.push({tier:this.safeInteger(r,"id"),symbol:this.safeSymbol(a,t),currency:t.settle,minNotional:o,maxNotional:this.safeNumber(r,"riskLimitValue"),maintenanceMarginRate:this.safeNumber(r,"maintenanceMargin"),maxLeverage:this.safeNumber(r,"maxLeverage"),info:r})}return i}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingHistory","paginate"),r)return await this.fetchPaginatedCallCursor("fetchFundingHistory",e,t,i,s,"nextPageCursor","cursor",void 0,100);let a,o,n={execType:"Funding"};void 0!==e&&(a=this.market(e),n.symbol=a.id),[o,s]=this.getBybitType("fetchFundingHistory",a,s),n.category=o,void 0!==e&&(n.symbol=a.id),void 0!==t&&(n.startTime=t),n.size=void 0!==i?i:100,[n,s]=this.handleUntilOption("endTime",n,s);const d=await this.privateGetV5ExecutionList(this.extend(n,s)),h=this.addPaginationCursorToResult(d);return this.parseIncomes(h,a,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"symbol");let s="USDT";(t=this.safeMarket(i,t,void 0,"contract")).inverse&&(s=t.quote);const r=this.safeInteger(e,"execTime");return{info:e,symbol:this.safeSymbol(i,t,"-","swap"),code:s,timestamp:r,datetime:this.iso8601(r),id:this.safeString(e,"execId"),amount:this.safeNumber(e,"execQty"),rate:this.safeNumber(e,"feeRate")}}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={category:"option",symbol:i.id},r=await this.publicGetV5MarketTickers(this.extend(s,t)),a=this.safeDict(r,"result",{}),o=this.safeList(a,"list",[]),n=this.safeDict(o,0,{});return this.parseOption(n,void 0,i)}async fetchOptionChain(e,t={}){await this.loadMarkets();const i={category:"option",baseCoin:this.currency(e).id},s=await this.publicGetV5MarketTickers(this.extend(i,t)),r=this.safeDict(s,"result",{}),a=this.safeList(r,"list",[]);return this.parseOptionChain(a,void 0,"symbol")}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"symbol");return{info:e,currency:void 0,symbol:(i=this.safeMarket(s,i)).symbol,timestamp:void 0,datetime:void 0,impliedVolatility:this.safeNumber(e,"markIv"),openInterest:this.safeNumber(e,"openInterest"),bidPrice:this.safeNumber(e,"bid1Price"),askPrice:this.safeNumber(e,"ask1Price"),midPrice:void 0,markPrice:this.safeNumber(e,"markPrice"),lastPrice:this.safeNumber(e,"lastPrice"),underlyingPrice:this.safeNumber(e,"underlyingPrice"),change:this.safeNumber(e,"change24h"),percentage:void 0,baseVolume:this.safeNumber(e,"totalVolume"),quoteVolume:void 0}}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets();let o=0;void 0!==e&&(o=e.length,o>0&&(r=this.market(e[0])));const n=this.safeInteger(s,"until");[a,s]=this.handleSubTypeAndParams("fetchPositionsHistory",r,s,"linear"),s=this.omit(s,"until");const d={category:a};void 0!==e&&1===o&&(d.symbol=r.id),void 0!==t&&(d.startTime=t),void 0!==i&&(d.limit=i),void 0!==n&&(d.endTime=n);const h=await this.privateGetV5PositionClosedPnl(this.extend(d,s)),c=this.safeDict(h,"result"),l=this.safeList(c,"list"),u=this.parsePositions(l,e,s);return this.filterBySinceLimit(u,t,i)}async fetchConvertCurrencies(e={}){let t;await this.loadMarkets();const[i,s]=await this.isUnifiedEnabled(),r=i||s?"eb_convert_uta":"eb_convert_spot";[t,e]=this.handleOptionAndParams(e,"fetchConvertCurrencies","accountType",r);const a={accountType:t},o=await this.privateGetV5AssetExchangeQueryCoinList(this.extend(a,e)),n={},d=this.safeDict(o,"result",{}),h=this.safeList(d,"coins",[]);for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"coin"),s=this.safeBool(t,"disableFrom"),r=this.safeBool(t,"disableTo"),a=s||r,o=this.safeCurrencyCode(i);n[o]={info:t,id:i,code:o,networks:void 0,type:this.safeString(t,"coinType"),name:this.safeString(t,"fullName"),active:!a,deposit:void 0,withdraw:this.safeNumber(t,"balance"),fee:void 0,precision:void 0,limits:{amount:{min:this.safeNumber(t,"singleFromMinLimit"),max:this.safeNumber(t,"singleFromMaxLimit")},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},created:void 0}}return n}async fetchConvertQuote(e,t,i=void 0,s={}){let r;await this.loadMarkets();const[a,o]=await this.isUnifiedEnabled(),n=a||o?"eb_convert_uta":"eb_convert_spot";[r,s]=this.handleOptionAndParams(s,"fetchConvertQuote","accountType",n);const d={fromCoin:e,toCoin:t,requestAmount:this.numberToString(i),requestCoin:e,accountType:r},h=await this.privatePostV5AssetExchangeQuoteApply(this.extend(d,s)),c=this.safeDict(h,"result",{}),l=this.safeString(c,"fromCoin",e),u=this.currency(l),f=this.safeString(c,"toCoin",t),p=this.currency(f);return this.parseConversion(c,u,p)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a={quoteTxId:e},o=await this.privatePostV5AssetExchangeConvertExecute(this.extend(a,r)),n=this.safeDict(o,"result",{});return this.parseConversion(n)}async fetchConvertTrade(e,t=void 0,i={}){let s;await this.loadMarkets();const[r,a]=await this.isUnifiedEnabled(),o=r||a?"eb_convert_uta":"eb_convert_spot";[s,i]=this.handleOptionAndParams(i,"fetchConvertQuote","accountType",o);const n={quoteTxId:e,accountType:s},d=await this.privateGetV5AssetExchangeConvertResultQuery(this.extend(n,i)),h=this.safeDict(d,"result",{}),c=this.safeDict(h,"result",{}),l=this.safeString(c,"fromCoin"),u=this.safeString(c,"toCoin");let f,p;return void 0!==l&&(f=this.currency(l)),void 0!==u&&(p=this.currency(u)),this.parseConversion(c,f,p)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==i&&(r.limit=i);const a=await this.privateGetV5AssetExchangeQueryConvertHistory(this.extend(r,s)),o=this.safeDict(a,"result",{}),n=this.safeList(o,"list",[]);return this.parseConversions(n,e,"fromCoin","toCoin",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeInteger2(e,"expiredTime","createdAt"),r=this.safeString(e,"fromCoin"),a=this.safeCurrencyCode(r,t),o=this.safeString(e,"toCoin"),n=this.safeCurrencyCode(o,i);return{info:e,timestamp:s,datetime:this.iso8601(s),id:this.safeString2(e,"quoteTxId","exchangeTxId"),fromCurrency:a,fromAmount:this.safeNumber(e,"fromAmount"),toCurrency:n,toAmount:this.safeNumber(e,"toAmount"),price:void 0,fee:void 0}}async fetchLongShortRatioHistory(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const o=this.market(e);let n;if([n,r]=this.getBybitType("fetchLongShortRatioHistory",o,r),"spot"===n||"option"===n)throw new a.NotSupported(this.id+" fetchLongShortRatioHistory() only support linear and inverse markets");void 0===t&&(t="1d");const d={symbol:o.id,period:t,category:n};void 0!==s&&(d.limit=s);const h=await this.publicGetV5MarketAccountRatio(this.extend(d,r)),c=this.safeDict(h,"result",{}),l=this.safeList(c,"list",[]);return this.parseLongShortRatioHistory(l,o)}parseLongShortRatio(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeIntegerOmitZero(e,"timestamp"),r=this.safeString(e,"buyRatio"),a=this.safeString(e,"sellRatio");return{info:e,symbol:this.safeSymbol(i,t,void 0,"contract"),timestamp:s,datetime:this.iso8601(s),timeframe:void 0,longShortRatio:this.parseToNumeric(o.Y.stringDiv(r,a))}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.implodeHostname(this.urls.api[t])+"/"+e;if("public"===t)Object.keys(s).length&&(o+="?"+this.rawencode(s));else if("private"===t){this.checkRequiredCredentials();const e=o.indexOf("openapi")>=0,t=o.indexOf("unified/v3")>=0,h=o.indexOf("contract/v3")>=0,c=o.indexOf("v5")>=0,l=this.nonce().toString();if(e){a=Object.keys(s).length?this.json(s):"{}";const e=l+this.apiKey+a,t=this.hmac(this.encode(e),this.encode(this.secret),n.s,"hex");r={"Content-Type":"application/json","X-BAPI-API-KEY":this.apiKey,"X-BAPI-TIMESTAMP":l,"X-BAPI-SIGN":t}}else if(t||h||c){r={"Content-Type":"application/json","X-BAPI-API-KEY":this.apiKey,"X-BAPI-TIMESTAMP":l,"X-BAPI-RECV-WINDOW":this.options.recvWindow.toString()},(t||h)&&(r["X-BAPI-SIGN-TYPE"]="2");const e=this.extend({},s),c=this.rawencode(e),u=l.toString()+this.apiKey+this.options.recvWindow.toString();let f,p;"POST"===i?f=u+(a=this.json(e)):(f=u+c,o+="?"+this.rawencode(e)),p=this.secret.indexOf("PRIVATE KEY")>-1?(0,d.n)(f,this.secret,n.s):this.hmac(this.encode(f),this.encode(this.secret),n.s),r["X-BAPI-SIGN"]=p}else{const e=this.extend(s,{api_key:this.apiKey,recv_window:this.options.recvWindow,timestamp:l}),t=this.keysort(e),h=this.rawencode(t);let c;if(c=this.secret.indexOf("PRIVATE KEY")>-1?(0,d.n)(h,this.secret,n.s):this.hmac(this.encode(h),this.encode(this.secret),n.s),"POST"===i){const t=o.indexOf("spot")>=0,i=this.extend(e,{sign:c});t?(a=this.urlencode(i),r={"Content-Type":"application/x-www-form-urlencoded"}):(a=this.json(i),r={"Content-Type":"application/json"})}else o+="?"+this.rawencode(t),o+="&sign="+c}}if("POST"===i){const e=this.safeString(this.options,"brokerId");void 0!==e&&(r.Referer=e)}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){if(!n)return;const c=this.safeString2(n,"ret_code","retCode");if("0"!==c){if("30084"===c)return;let e;throw e="10005"===c&&i.indexOf("order")<0?this.id+' private api uses /user/v3/private/query-api to check if you have a unified account. The API key of user id must own one of permissions: "Account Transfer", "Subaccount Transfer", "Withdrawal" '+o:this.id+" "+o,o.indexOf("Withdraw address chain or destination tag are not equal")&&(e+="; You might also need to ensure the address is whitelisted"),this.throwBroadlyMatchedException(this.exceptions.broad,o,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new a.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"cex",name:"CEX.IO",countries:["GB","EU","CY","RU"],rateLimit:300,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchClosedOrder:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchLedger:!0,fetchMarkets:!0,fetchOHLCV:!0,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOrderBook:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFees:!0,transfer:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766442-8ddc33b0-5ed8-11e7-8b98-f786aef0f3c9.jpg",api:{public:"https://trade.cex.io/api/spot/rest-public",private:"https://trade.cex.io/api/spot/rest"},www:"https://cex.io",doc:"https://trade.cex.io/docs/",fees:["https://cex.io/fee-schedule","https://cex.io/limits-commissions"],referral:"https://cex.io/r/0/up105393824/0/"},api:{public:{get:{},post:{get_server_time:1,get_pairs_info:1,get_currencies_info:1,get_processing_info:10,get_ticker:1,get_trade_history:1,get_order_book:1,get_candles:1}},private:{get:{},post:{get_my_current_fee:5,get_fee_strategy:1,get_my_volume:5,do_create_account:1,get_my_account_status_v3:5,get_my_wallet_balance:5,get_my_orders:5,do_my_new_order:1,do_cancel_my_order:1,do_cancel_all_orders:5,get_order_book:1,get_candles:1,get_trade_history:1,get_my_transaction_history:1,get_my_funding_history:5,do_my_internal_transfer:1,get_processing_info:10,get_deposit_address:5,do_deposit_funds_from_wallet:1,do_withdrawal_funds_to_wallet:1}}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!0},hedged:!1,leverage:!1,marketBuyRequiresPrice:!1,marketBuyByCost:!0,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{},broad:{"You have negative balance on following accounts":r.InsufficientFunds,"Mandatory parameter side should be one of BUY,SELL":r.BadRequest,"API orders from Main account are not allowed":r.BadRequest,"check failed":r.BadRequest,"Insufficient funds":r.InsufficientFunds,"Get deposit address for main account is not allowed":r.PermissionDenied,"Market Trigger orders are not allowed":r.BadRequest,"key not passed or incorrect":r.AuthenticationError}},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","1d":"1d"},options:{networks:{BTC:"bitcoin",ERC20:"ERC20",BSC20:"binancesmartchain",DOGE:"dogecoin",ALGO:"algorand",XLM:"stellar",ATOM:"cosmos",LTC:"litecoin",XRP:"ripple",FTM:"fantom",MINA:"mina",THETA:"theta",XTZ:"tezos",TIA:"celestia",CRONOS:"cronos",MATIC:"polygon",TON:"ton",TRC20:"tron",SOLANA:"solana",SGB:"songbird",DYDX:"dydx",DASH:"dash",ZIL:"zilliqa",EOS:"eos",AVALANCHEC:"avalanche",ETHPOW:"ethereumpow",NEAR:"near",ARB:"arbitrum",DOT:"polkadot",OPT:"optimism",INJ:"injective",ADA:"cardano",ONT:"ontology",ICP:"icp",KAVA:"kava",KSM:"kusama",SEI:"sei",NEO:"neo",NEO3:"neo3",XDC:"xdc"}}})}async fetchCurrencies(e={}){const t=[];t.push(this.publicPostGetCurrenciesInfo(e)),t.push(this.publicPostGetProcessingInfo(e));const i=await Promise.all(t),s=this.safeList(i[0],"data",[]),r=this.safeDict(i[1],"data",{}),a=this.indexBy(s,"currency"),o=this.deepExtend(a,r);return this.parseCurrencies(this.toArray(o))}parseCurrency(e){const t=this.safeString(e,"currency"),i=this.safeCurrencyCode(t),s=this.safeBool(e,"fiat")?"fiat":"crypto",r=this.safeBool(e,"walletDeposit"),a=this.safeBool(e,"walletWithdrawal"),o=this.parseNumber(this.parsePrecision(this.safeString(e,"precision"))),n={},d=this.safeDict(e,"blockchains",{}),h=Object.keys(d);for(let e=0;e<h.length;e++){const t=h[e],i=d[t],s=this.networkIdToCode(t),r="enabled"===this.safeString(i,"deposit"),a="enabled"===this.safeString(i,"withdrawal");n[s]={id:t,network:s,margin:void 0,deposit:r,withdraw:a,fee:this.safeNumber(i,"withdrawalFee"),precision:o,limits:{deposit:{min:this.safeNumber(i,"minDeposit"),max:void 0},withdraw:{min:this.safeNumber(i,"minWithdrawal"),max:void 0}},info:i}}return this.safeCurrencyStructure({id:t,code:i,name:void 0,type:s,active:void 0,deposit:r,withdraw:a,fee:void 0,precision:o,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:n,info:e})}async fetchMarkets(e={}){const t=await this.publicPostGetPairsInfo(e),i=this.safeList(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"base"),i=this.safeCurrencyCode(t),s=this.safeString(e,"quote"),r=this.safeCurrencyCode(s),a=i+"-"+r,o=i+"/"+r;return this.safeMarketStructure({id:a,symbol:o,base:i,baseId:t,quote:r,quoteId:s,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,limits:{amount:{min:this.safeNumber(e,"baseMin"),max:this.safeNumber(e,"baseMax")},price:{min:this.safeNumber(e,"minPrice"),max:this.safeNumber(e,"maxPrice")},cost:{min:this.safeNumber(e,"quoteMin"),max:this.safeNumber(e,"quoteMax")},leverage:{min:void 0,max:void 0}},precision:{amount:this.safeString(e,"baseLotSize"),price:this.parseNumber(this.parsePrecision(this.safeString(e,"pricePrecision"))),base:this.parseNumber(this.parsePrecision(this.safeString(e,"basePrecision"))),quote:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrecision")))},active:void 0,created:void 0,info:e})}async fetchTime(e={}){const t=await this.publicPostGetServerTime(e),i=this.safeDict(t,"data");return this.safeInteger(i,"timestamp")}async fetchTicker(e,t={}){await this.loadMarkets();const i=await this.fetchTickers([e],t);return this.safeDict(i,e,{})}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};void 0!==e&&(i.pairs=this.marketIds(e));const s=await this.publicPostGetTicker(this.extend(i,t)),r=this.safeDict(s,"data",{});return this.parseTickers(r,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeSymbol(i,t);return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:this.safeNumber(e,"high"),low:this.safeNumber(e,"low"),bid:this.safeNumber(e,"bestBid"),bidVolume:void 0,ask:this.safeNumber(e,"bestAsk"),askVolume:void 0,vwap:void 0,open:void 0,close:this.safeString(e,"lastTradePrice"),previousClose:void 0,change:this.safeNumber(e,"priceChange"),percentage:this.safeNumber(e,"priceChangePercentage"),average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:this.safeString(e,"quoteVolume"),info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};let o;void 0!==t&&(a.fromDateISO=this.iso8601(t)),[o,s]=this.handleParamInteger2(s,"until","till"),void 0!==o&&(a.toDateISO=this.iso8601(o)),void 0!==i&&(a.pageSize=Math.min(i,1e4));const n=await this.publicPostGetTradeHistory(this.extend(a,s)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"trades",[]);return this.parseTrades(h,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"dateISO"),s=this.parse8601(i);return t=this.safeMarket(void 0,t),this.safeTrade({info:e,timestamp:s,datetime:this.iso8601(s),symbol:t.symbol,id:this.safeString(e,"tradeId"),order:void 0,type:void 0,takerOrMaker:void 0,side:this.safeStringLower(e,"side"),price:this.safeString(e,"price"),amount:this.safeString(e,"amount"),cost:void 0,fee:void 0},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id},a=await this.publicPostGetOrderBook(this.extend(r,i)),o=this.safeDict(a,"data",{}),n=this.safeInteger(o,"timestamp");return this.parseOrderBook(o,s.symbol,n)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){let o;if([o,a]=this.handleOptionAndParams(a,"fetchOHLCV","dataType"),void 0===o)throw new r.ArgumentsRequired(this.id+' fetchOHLCV requires a parameter "dataType" to be either "bestBid" or "bestAsk"');await this.loadMarkets();const n=this.market(e),d={pair:n.id,resolution:this.timeframes[t],dataType:o};let h;if(void 0!==i&&(d.fromISO=this.iso8601(i)),[h,a]=this.handleParamInteger2(a,"until","till"),void 0!==h?d.toISO=this.iso8601(h):void 0===i&&(d.toISO=this.iso8601(this.milliseconds())),void 0!==i&&void 0!==h&&void 0!==s)throw new r.ArgumentsRequired(this.id+" fetchOHLCV does not support fetching candles with both a limit and since/until");if((void 0!==i||void 0!==h)&&void 0===s)throw new r.ArgumentsRequired(this.id+" fetchOHLCV requires a limit parameter when fetching candles with since or until");void 0!==s&&(d.limit=s);const c=await this.publicPostGetCandles(this.extend(d,a)),l=this.safeList(c,"data",[]);return this.parseOHLCVs(l,n,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostGetMyCurrentFee(e),i=this.safeDict(t,"data",{}),s=this.safeDict(i,"tradingFee",{});return this.parseTradingFees(s,!0)}parseTradingFees(e,t=!1){const i={},s=Object.keys(e);for(let r=0;r<s.length;r++){const a=s[r];let o;t&&(o=this.safeMarket(a));const n=this.parseTradingFee(e[a],o);i[n.symbol]=n}for(let t=0;t<this.symbols.length;t++){const s=this.symbols[t];if(!(s in i)){const t=this.market(s);i[s]=this.parseTradingFee(e,t)}}return i}parseTradingFee(e,t=void 0){return{info:e,symbol:this.safeString(t,"symbol"),maker:this.safeNumber(e,"percent"),taker:this.safeNumber(e,"percent"),percentage:void 0,tierBased:void 0}}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privatePostGetMyAccountStatusV3(e),i=this.safeDict(t,"data",{}),s=this.safeDict(i,"balancesPerAccounts",{}),r=this.toArray(s);return this.parseAccounts(r,e)}parseAccount(e){return{id:void 0,type:void 0,code:void 0,info:e}}async fetchBalance(e={}){let t,i,s;if([t,e]=this.handleParamString(e,"account",""),[i,e]=this.handleParamString(e,"method","privatePostGetMyWalletBalance"),"privatePostGetMyAccountStatusV3"===i){const i=await this.privatePostGetMyAccountStatusV3(e),r=this.safeDict(i,"data",{}),a=this.safeDict(r,"balancesPerAccounts",{});s=this.safeDict(a,t,{})}else{const t=await this.privatePostGetMyWalletBalance(e);s=this.safeDict(t,"data",{})}return this.parseBalance(s)}parseBalance(e){const t={info:e},i=Object.keys(e);for(let s=0;s<i.length;s++){const r=i[s],a=this.safeDict(e,r,{}),o=this.safeCurrencyCode(r),n={used:this.safeString(a,"balanceOnHold"),total:this.safeString(a,"balance")};t[o]=n}return this.safeBalance(t)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={},o="closed"===e;let n,d;o&&(a.archived=!0),void 0!==t&&(n=this.market(t),a.pair=n.id),void 0!==s&&(a.pageSize=s),void 0!==i?a.serverCreateTimestampFrom=i:o&&(a.serverCreateTimestampFrom=this.milliseconds()-314496e5),[d,r]=this.handleParamInteger2(r,"until","till"),void 0!==d&&(a.serverCreateTimestampTo=d);const h=await this.privatePostGetMyOrders(this.extend(a,r)),c=this.safeList(h,"data",[]);return this.parseOrders(c,n,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("closed",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("open",e,t,i,s)}async fetchOpenOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:parseInt(e)};return(await this.fetchOpenOrders(t,void 0,void 0,this.extend(s,i)))[0]}async fetchClosedOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:parseInt(e)};return(await this.fetchClosedOrders(t,void 0,void 0,this.extend(s,i)))[0]}parseOrderStatus(e){return this.safeString({PENDING_NEW:"open",NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",EXPIRED:"expired",REJECTED:"rejected",PENDING_CANCEL:"canceling",CANCELLED:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"currency1"),s=this.safeString(e,"currency2");let r;void 0!==i&&void 0!==s&&(r=i+"-"+s);const a=(t=this.safeMarket(r,t)).symbol,o=this.parseOrderStatus(this.safeString(e,"status")),n={},d=this.safeNumber(e,"feeAmount");if(void 0!==d){const t=this.safeString(e,"feeCurrency"),i=this.safeCurrencyCode(t);n.currency=i,n.cost=d}const h=this.safeInteger(e,"serverCreateTimestamp"),c=this.safeNumber(e,"requestedAmountCcy1"),l=this.safeNumber(e,"executedAmountCcy1"),u=this.safeNumber(e,"executedAmountCcy2");return this.safeOrder({id:this.safeString(e,"orderId"),clientOrderId:this.safeString(e,"clientOrderId"),timestamp:h,datetime:this.iso8601(h),lastUpdateTimestamp:this.safeInteger(e,"lastUpdateTimestamp"),lastTradeTimestamp:void 0,symbol:a,type:this.safeStringLower(e,"orderType"),timeInForce:this.safeString(e,"timeInForce"),postOnly:void 0,side:this.safeStringLower(e,"side"),price:this.safeNumber(e,"price"),triggerPrice:this.safeNumber(e,"stopPrice"),amount:c,cost:u,average:this.safeNumber(e,"averagePrice"),filled:l,remaining:void 0,status:o,fee:n,trades:void 0,info:e},t)}async createOrder(e,t,i,s,a=void 0,o={}){let n;if([n,o]=this.handleOptionAndParams(o,"createOrder","accountId"),void 0===n)throw new r.ArgumentsRequired(this.id+' createOrder() : API trading is now allowed from main account, set params["accountId"] or .options["createOrder"]["accountId"] to the name of your sub-account');await this.loadMarkets();const d=this.market(e),h={clientOrderId:this.uuid(),currency1:d.baseId,currency2:d.quoteId,accountId:n,orderType:this.capitalize(t.toLowerCase()),side:i.toUpperCase(),timestamp:this.milliseconds(),amountCcy1:this.amountToPrecision(e,s)};let c,l;[c,o]=this.handleOptionAndParams(o,"createOrder","timeInForce","GTC"),"limit"===t&&(h.price=this.priceToPrecision(e,a),h.timeInForce=c),[l,o]=this.handleParamString(o,"triggerPrice"),void 0!==l&&(h.type="Stop Limit",h.stopPrice=l);const u=await this.privatePostDoMyNewOrder(this.extend(h,o)),f=this.safeDict(u,"data");return this.parseOrder(f,d)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:parseInt(e),cancelRequestId:"c_"+this.milliseconds().toString(),timestamp:this.milliseconds()},r=await this.privatePostDoCancelMyOrder(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostDoCancelAllOrders(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"clientOrderIds",[]),a=[];for(let e=0;e<r.length;e++){const t=r[e];a.push({clientOrderId:t})}return this.parseOrders(a)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let o;void 0!==e&&(r=this.currency(e),a.currency=r.id),void 0!==t&&(a.dateFrom=t),void 0!==i&&(a.pageSize=i),[o,s]=this.handleParamInteger2(s,"until","till"),void 0!==o&&(a.dateTo=o);const n=await this.privatePostGetMyTransactionHistory(this.extend(a,s)),d=this.safeList(n,"data",[]);return this.parseLedger(d,r,t,i)}parseLedgerEntry(e,t=void 0){let i,s=this.safeString(e,"amount");a.Y.stringLe(s,"0")?(i="out",s=a.Y.stringMul("-1",s)):i="in";const r=this.safeString(e,"currency");t=this.safeCurrency(r,t);const o=this.safeCurrencyCode(r,t),n=this.safeString(e,"timestamp"),d=this.parse8601(n),h=this.safeString(e,"type");return this.safeLedgerEntry({info:e,id:this.safeString(e,"transactionId"),direction:i,account:this.safeString(e,"accountId",""),referenceAccount:void 0,referenceId:void 0,type:this.parseLedgerEntryType(h),currency:o,amount:this.parseNumber(s),timestamp:d,datetime:this.iso8601(d),before:void 0,after:void 0,status:void 0,fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({deposit:"deposit",withdraw:"withdrawal",commission:"fee"},e,e)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0!==e&&(a=this.currency(e)),void 0!==t&&(r.dateFrom=t),void 0!==i&&(r.pageSize=i),[o,s]=this.handleParamInteger2(s,"until","till"),void 0!==o&&(r.dateTo=o);const n=await this.privatePostGetMyFundingHistory(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"currency"),s="withdraw"===this.safeString(e,"direction")?"withdrawal":"deposit",r=this.safeCurrencyCode(i,t),a=this.safeString(e,"updatedAt"),o=this.parse8601(a);return{info:e,id:this.safeString(e,"txId"),txid:void 0,type:s,currency:r,network:void 0,amount:this.safeNumber(e,"amount"),status:this.parseTransactionStatus(this.safeString(e,"status")),timestamp:o,datetime:this.iso8601(o),address:void 0,addressFrom:void 0,addressTo:void 0,tag:void 0,tagFrom:void 0,tagTo:void 0,updated:void 0,comment:void 0,fee:{currency:r,cost:this.safeNumber(e,"commissionAmount")},internal:void 0}}parseTransactionStatus(e){return this.safeString({rejected:"rejected",pending:"pending",approved:"ok"},e,e)}async transfer(e,t,i,s,r={}){let a;a=""!==s&&""!==i?await this.transferBetweenSubAccounts(e,t,i,s,r):await this.transferBetweenMainAndSubAccount(e,t,i,s,r);return this.handleOption("transfer","fillResponseFromRequest",!0)&&(a.fromAccount=i,a.toAccount=s),a}async transferBetweenMainAndSubAccount(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=""===i,n=o?s:i,d=this.safeString(r,"guid",this.uuid()),h={currency:a.id,amount:this.currencyToPrecision(e,t),accountId:n,clientTxId:d};let c;c=o?await this.privatePostDoDepositFundsFromWallet(this.extend(h,r)):await this.privatePostDoWithdrawalFundsToWallet(this.extend(h,r));const l=this.safeDict(c,"data",{});return this.parseTransfer(l,a)}async transferBetweenSubAccounts(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={currency:a.id,amount:this.currencyToPrecision(e,t),fromAccountId:i,toAccountId:s},n=await this.privatePostDoMyInternalTransfer(this.extend(o,r)),d=this.safeDict(n,"data",{});return this.parseTransfer(d,a)}parseTransfer(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeCurrencyCode(i,t);return{info:e,id:this.safeString2(e,"transactionId","clientTxId"),timestamp:void 0,datetime:void 0,currency:s,amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.parseTransactionStatus(this.safeString(e,"status"))}}async fetchDepositAddress(e,t={}){let i,s;if([i,t]=this.handleOptionAndParams(t,"createOrder","accountId"),void 0===i)throw new r.ArgumentsRequired(this.id+' fetchDepositAddress() : main account is not allowed to fetch deposit address from api, set params["accountId"] or .options["createOrder"]["accountId"] to the name of your sub-account');await this.loadMarkets(),[s,t]=this.handleNetworkCodeAndParams(t);const a=this.currency(e),o={accountId:i,currency:a.id,blockchain:this.networkCodeToId(s)},n=await this.privatePostGetDepositAddress(this.extend(o,t)),d=this.safeDict(n,"data",{});return this.parseDepositAddress(d,a)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"currency");return t=this.safeCurrency(s,t),this.checkAddress(i),{info:e,currency:t.code,network:this.networkIdToCode(this.safeString(e,"blockchain")),address:i,tag:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if("public"===t)"GET"===i?Object.keys(d).length&&(o+="?"+this.urlencode(d)):(a=this.json(d),r={"Content-Type":"application/json"});else{this.checkRequiredCredentials();const t=this.seconds().toString(),i=e+t+(a=this.json(d)),s=this.hmac(this.encode(i),this.encode(this.secret),n.s,"base64");r={"Content-Type":"application/json","X-AGGR-KEY":this.apiKey,"X-AGGR-TIMESTAMP":t,"X-AGGR-SIGNATURE":s}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n){if(void 0===o)throw new r.NullResponse(this.id+" returned empty response");if("{"!==o[0])throw new r.NullResponse(this.id+" returned unparsed response: "+o);{const e=this.fixStringifiedJsonMembers(o);n=this.parseJson(e)}}const c=this.safeString(n,"error");if(void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),new r.ExchangeError(e)}if(i.indexOf("do_my_new_order")>=0){const e=this.safeDict(n,"data",{}),t=this.safeString(e,"rejectReason");if(void 0!==t)throw this.throwBroadlyMatchedException(this.exceptions.broad,t,t),new r.ExchangeError(this.id+" createOrder() "+t)}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinbase",name:"Coinbase Advanced",countries:["US"],pro:!0,certified:!1,rateLimit:34,version:"v2",userAgent:this.userAgents.chrome,headers:{"CB-VERSION":"2018-05-30"},has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,createConvertTrade:!0,createDepositAddress:!0,createLimitBuyOrder:!0,createLimitSellOrder:!0,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrder:!0,createMarketSellOrderWithCost:!1,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,deposit:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchConvertQuote:!0,fetchConvertTrade:!0,fetchConvertTradeHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:"emulated",fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDepositMethodId:!0,fetchDepositMethodIds:!0,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL2OrderBook:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyBuys:!0,fetchMySells:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:"emulated",fetchTradingFees:!0,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/40811661-b6eceae2-653a-11e8-829e-10bfadb078cf.jpg",api:{rest:"https://api.coinbase.com"},www:"https://www.coinbase.com",doc:["https://developers.coinbase.com/api/v2","https://docs.cloud.coinbase.com/advanced-trade/docs/welcome"],fees:["https://support.coinbase.com/customer/portal/articles/2109597-buy-sell-bank-transfer-fees","https://www.coinbase.com/advanced-fees"],referral:"https://www.coinbase.com/join/58cbe25a355148797479dbd2"},requiredCredentials:{apiKey:!0,secret:!0},api:{v2:{public:{get:{currencies:10.6,"currencies/crypto":10.6,time:10.6,"exchange-rates":10.6,"users/{user_id}":10.6,"prices/{symbol}/buy":10.6,"prices/{symbol}/sell":10.6,"prices/{symbol}/spot":10.6}},private:{get:{accounts:10.6,"accounts/{account_id}":10.6,"accounts/{account_id}/addresses":10.6,"accounts/{account_id}/addresses/{address_id}":10.6,"accounts/{account_id}/addresses/{address_id}/transactions":10.6,"accounts/{account_id}/transactions":10.6,"accounts/{account_id}/transactions/{transaction_id}":10.6,"accounts/{account_id}/buys":10.6,"accounts/{account_id}/buys/{buy_id}":10.6,"accounts/{account_id}/sells":10.6,"accounts/{account_id}/sells/{sell_id}":10.6,"accounts/{account_id}/deposits":10.6,"accounts/{account_id}/deposits/{deposit_id}":10.6,"accounts/{account_id}/withdrawals":10.6,"accounts/{account_id}/withdrawals/{withdrawal_id}":10.6,"payment-methods":10.6,"payment-methods/{payment_method_id}":10.6,user:10.6,"user/auth":10.6},post:{accounts:10.6,"accounts/{account_id}/primary":10.6,"accounts/{account_id}/addresses":10.6,"accounts/{account_id}/transactions":10.6,"accounts/{account_id}/transactions/{transaction_id}/complete":10.6,"accounts/{account_id}/transactions/{transaction_id}/resend":10.6,"accounts/{account_id}/buys":10.6,"accounts/{account_id}/buys/{buy_id}/commit":10.6,"accounts/{account_id}/sells":10.6,"accounts/{account_id}/sells/{sell_id}/commit":10.6,"accounts/{account_id}/deposits":10.6,"accounts/{account_id}/deposits/{deposit_id}/commit":10.6,"accounts/{account_id}/withdrawals":10.6,"accounts/{account_id}/withdrawals/{withdrawal_id}/commit":10.6},put:{"accounts/{account_id}":10.6,user:10.6},delete:{"accounts/{id}":10.6,"accounts/{account_id}/transactions/{transaction_id}":10.6}}},v3:{public:{get:{"brokerage/time":3,"brokerage/market/product_book":3,"brokerage/market/products":3,"brokerage/market/products/{product_id}":3,"brokerage/market/products/{product_id}/candles":3,"brokerage/market/products/{product_id}/ticker":3}},private:{get:{"brokerage/accounts":1,"brokerage/accounts/{account_uuid}":1,"brokerage/orders/historical/batch":1,"brokerage/orders/historical/fills":1,"brokerage/orders/historical/{order_id}":1,"brokerage/products":3,"brokerage/products/{product_id}":3,"brokerage/products/{product_id}/candles":3,"brokerage/products/{product_id}/ticker":3,"brokerage/best_bid_ask":3,"brokerage/product_book":3,"brokerage/transaction_summary":3,"brokerage/portfolios":1,"brokerage/portfolios/{portfolio_uuid}":1,"brokerage/convert/trade/{trade_id}":1,"brokerage/cfm/balance_summary":1,"brokerage/cfm/positions":1,"brokerage/cfm/positions/{product_id}":1,"brokerage/cfm/sweeps":1,"brokerage/intx/portfolio/{portfolio_uuid}":1,"brokerage/intx/positions/{portfolio_uuid}":1,"brokerage/intx/positions/{portfolio_uuid}/{symbol}":1,"brokerage/payment_methods":1,"brokerage/payment_methods/{payment_method_id}":1},post:{"brokerage/orders":1,"brokerage/orders/batch_cancel":1,"brokerage/orders/edit":1,"brokerage/orders/edit_preview":1,"brokerage/orders/preview":1,"brokerage/portfolios":1,"brokerage/portfolios/move_funds":1,"brokerage/convert/quote":1,"brokerage/convert/trade/{trade_id}":1,"brokerage/cfm/sweeps/schedule":1,"brokerage/intx/allocate":1,"brokerage/orders/close_position":1},put:{"brokerage/portfolios/{portfolio_uuid}":1},delete:{"brokerage/portfolios/{portfolio_uuid}":1,"brokerage/cfm/sweeps":1}}}},fees:{trading:{taker:this.parseNumber("0.012"),maker:this.parseNumber("0.006"),tierBased:!0,percentage:!0,tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.006")],[this.parseNumber("10000"),this.parseNumber("0.004")],[this.parseNumber("50000"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.002")],[this.parseNumber("1000000"),this.parseNumber("0.0018")],[this.parseNumber("15000000"),this.parseNumber("0.0016")],[this.parseNumber("75000000"),this.parseNumber("0.0012")],[this.parseNumber("250000000"),this.parseNumber("0.0008")],[this.parseNumber("400000000"),this.parseNumber("0.0005")]],maker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("10000"),this.parseNumber("0.0025")],[this.parseNumber("50000"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.001")],[this.parseNumber("1000000"),this.parseNumber("0.0008")],[this.parseNumber("15000000"),this.parseNumber("0.0006")],[this.parseNumber("75000000"),this.parseNumber("0.0003")],[this.parseNumber("250000000"),this.parseNumber("0.0")],[this.parseNumber("400000000"),this.parseNumber("0.0")]]}}},precisionMode:o.kb,exceptions:{exact:{two_factor_required:r.AuthenticationError,param_required:r.ExchangeError,validation_error:r.ExchangeError,invalid_request:r.ExchangeError,personal_details_required:r.AuthenticationError,identity_verification_required:r.AuthenticationError,jumio_verification_required:r.AuthenticationError,jumio_face_match_verification_required:r.AuthenticationError,unverified_email:r.AuthenticationError,authentication_error:r.AuthenticationError,invalid_authentication_method:r.AuthenticationError,invalid_token:r.AuthenticationError,revoked_token:r.AuthenticationError,expired_token:r.AuthenticationError,invalid_scope:r.AuthenticationError,not_found:r.ExchangeError,rate_limit_exceeded:r.RateLimitExceeded,internal_server_error:r.ExchangeError,UNSUPPORTED_ORDER_CONFIGURATION:r.BadRequest,INSUFFICIENT_FUND:r.BadRequest,PERMISSION_DENIED:r.PermissionDenied,INVALID_ARGUMENT:r.BadRequest},broad:{"request timestamp expired":r.InvalidNonce,"order with this orderID was not found":r.OrderNotFound}},timeframes:{"1m":"ONE_MINUTE","5m":"FIVE_MINUTE","15m":"FIFTEEN_MINUTE","30m":"THIRTY_MINUTE","1h":"ONE_HOUR","2h":"TWO_HOUR","6h":"SIX_HOUR","1d":"ONE_DAY"},commonCurrencies:{CGLD:"CELO"},options:{usePrivate:!1,brokerId:"ccxt",stablePairs:["BUSD-USD","CBETH-ETH","DAI-USD","GUSD-USD","GYEN-USD","PAX-USD","PAX-USDT","USDC-EUR","USDC-GBP","USDT-EUR","USDT-GBP","USDT-USD","USDT-USDC","WBTC-BTC"],fetchCurrencies:{expires:5e3},accounts:["wallet","fiat"],v3Accounts:["ACCOUNT_TYPE_CRYPTO","ACCOUNT_TYPE_FIAT"],networks:{ERC20:"ethereum",XLM:"stellar"},createMarketBuyOrderRequiresPrice:!0,advanced:!0,fetchMarkets:"fetchMarketsV3",timeDifference:0,adjustForTimeDifference:!1,fetchTicker:"fetchTickerV3",fetchTickers:"fetchTickersV3",fetchAccounts:"fetchAccountsV3",fetchBalance:"v2PrivateGetAccounts",fetchTime:"v2PublicGetTime",user_native_currency:"USD"},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:3e3,daysBack:void 0,untilDays:1e4,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:1e4,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:void 0,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e4,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:300}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:{extends:"default"},inverse:void 0}}})}async fetchTime(e={}){const t=this.safeString(this.options,"fetchTime","v2PublicGetTime"),i=this.safeString(e,"method",t);let s;return e=this.omit(e,"method"),"v2PublicGetTime"===i?(s=await this.v2PublicGetTime(e),s=this.safeDict(s,"data",{})):s=await this.v3PublicGetBrokerageTime(e),this.safeTimestamp2(s,"epoch","epochSeconds")}async fetchAccounts(e={}){return"fetchAccountsV3"===this.safeString(this.options,"fetchAccounts","fetchAccountsV3")?await this.fetchAccountsV3(e):await this.fetchAccountsV2(e)}async fetchAccountsV2(e={}){await this.loadMarkets();let t=!1;if([t,e]=this.handleOptionAndParams(e,"fetchAccounts","paginate"),t)return await this.fetchPaginatedCallCursor("fetchAccounts",void 0,void 0,void 0,e,"next_starting_after","starting_after",void 0,100);const i=await this.v2PrivateGetAccounts(this.extend({limit:100},e)),s=this.safeList(i,"data",[]),r=this.safeDict(i,"pagination",{}),a=this.safeString(r,"next_starting_after"),o=this.safeList(i,"data",[]),n=o.length-1,d=this.safeDict(o,n);return void 0!==a&&""!==a&&(d.next_starting_after=a,o[n]=d),this.parseAccounts(s,e)}async fetchAccountsV3(e={}){await this.loadMarkets();let t=!1;if([t,e]=this.handleOptionAndParams(e,"fetchAccounts","paginate"),t)return await this.fetchPaginatedCallCursor("fetchAccounts",void 0,void 0,void 0,e,"cursor","cursor",void 0,250);const i=await this.v3PrivateGetBrokerageAccounts(this.extend({limit:250},e)),s=this.safeList(i,"accounts",[]),r=s.length-1,a=this.safeDict(s,r),o=this.safeString(i,"cursor");return void 0!==o&&""!==o&&(a.cursor=o,s[r]=a),this.parseAccounts(s,e)}async fetchPortfolios(e={}){const t=await this.v3PrivateGetBrokeragePortfolios(e),i=this.safeList(t,"portfolios",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e];s.push({id:this.safeString(t,"uuid"),type:this.safeString(t,"type"),code:void 0,info:t})}return s}parseAccount(e){const t=this.safeBool(e,"active"),i=this.safeString(e,"currency"),s=this.safeDict(e,"currency",{}),r=this.safeString(s,"code",i),a=this.safeString(e,"name"),o=this.safeString(e,"type"),n=a.split(" ");return{id:this.safeString2(e,"id","uuid"),type:void 0!==t?this.safeStringLower(n,1):o,code:this.safeCurrencyCode(r),info:e}}async createDepositAddress(e,t={}){let i=this.safeString(t,"account_id");if(t=this.omit(t,"account_id"),void 0===i){await this.loadAccounts();for(let t=0;t<this.accounts.length;t++){const s=this.accounts[t];if(s.code===e&&"wallet"===s.type){i=s.id;break}}}if(void 0===i)throw new r.ExchangeError(this.id+" createDepositAddress() could not find the account with matching currency code "+e+", specify an `account_id` extra param to target specific wallet");const s={account_id:i},a=await this.v2PrivatePostAccountsAccountIdAddresses(this.extend(s,t)),o=this.safeDict(a,"data",{});return{currency:e,tag:this.safeString(o,"destination_tag"),address:this.safeString(o,"address"),info:a}}async fetchMySells(e=void 0,t=void 0,i=void 0,s={}){const r=this.prepareAccountRequest(i,s);await this.loadMarkets();const a=this.omit(s,["account_id","accountId"]),o=await this.v2PrivateGetAccountsAccountIdSells(this.extend(r,a));return this.parseTrades(o.data,void 0,t,i)}async fetchMyBuys(e=void 0,t=void 0,i=void 0,s={}){const r=this.prepareAccountRequest(i,s);await this.loadMarkets();const a=this.omit(s,["account_id","accountId"]),o=await this.v2PrivateGetAccountsAccountIdBuys(this.extend(r,a));return this.parseTrades(o.data,void 0,t,i)}async fetchTransactionsWithMethod(e,t=void 0,i=void 0,s=void 0,r={}){let a;[a,r]=await this.prepareAccountRequestWithCurrencyCode(t,s,r),await this.loadMarkets();const o=await this[e](this.extend(a,r));return this.parseTransactions(o.data,void 0,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","currencyType"),"crypto"===r){const r=await this.fetchTransactionsWithMethod("v2PrivateGetAccountsAccountIdTransactions",e,t,i,s);return this.filterByArray(r,"type","withdrawal",!1)}return await this.fetchTransactionsWithMethod("v2PrivateGetAccountsAccountIdWithdrawals",e,t,i,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","currencyType"),"crypto"===r){const r=await this.fetchTransactionsWithMethod("v2PrivateGetAccountsAccountIdTransactions",e,t,i,s);return this.filterByArray(r,"type","deposit",!1)}return await this.fetchTransactionsWithMethod("v2PrivateGetAccountsAccountIdDeposits",e,t,i,s)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchTransactionsWithMethod("v2PrivateGetAccountsAccountIdTransactions",e,t,i,s);return this.filterByArray(r,"type",["deposit","withdrawal"],!1)}parseTransactionStatus(e){return this.safeString({created:"pending",completed:"ok",canceled:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"type");let s,r;const o=this.safeDict(e,"network",{});"send"===i?(s=this.safeDict(o,"transaction_amount"),r=this.safeDict(o,"transaction_fee",{})):(s=this.safeDict(e,"subtotal"),r=this.safeDict(e,"fee",{})),void 0===s&&(s=this.safeDict(e,"amount"));const n=this.safeString(s,"amount"),d=a.Y.stringAbs(n);let h=this.parseTransactionStatus(this.safeString(e,"status"));if(void 0===h){h=this.safeBool(e,"committed")?"ok":"pending"}const c=this.safeString(e,"id"),l=this.safeString(s,"currency"),u=this.safeString(r,"currency"),f=this.safeString(e,"created_at");let p=this.safeString(e,"resource");this.inArray(p,["deposit","withdrawal"])||(a.Y.stringGt(n,"0")?p="deposit":a.Y.stringLt(n,"0")&&(p="withdrawal"));const m=this.safeDict(e,"to"),g=this.safeString(m,"address"),v=this.safeString(o,"network_name");return{info:e,id:c,txid:this.safeString(o,"hash",c),timestamp:this.parse8601(f),datetime:f,network:this.networkIdToCode(v),address:g,addressTo:g,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:p,amount:this.parseNumber(d),currency:this.safeCurrencyCode(l,t),status:h,updated:this.parse8601(this.safeString(e,"updated_at")),fee:{cost:this.safeNumber(r,"amount"),currency:this.safeCurrencyCode(u)}}}parseTrade(e,t=void 0){let i;const s=this.safeDict(e,"total",{}),r=this.safeDict(e,"amount",{}),o=this.safeDict(e,"subtotal",{}),n=this.safeDict(e,"fee",{}),d=this.safeString(e,"product_id");if(void 0!==(t=this.safeMarket(d,t,"-")))i=t.symbol;else{const e=this.safeString(r,"currency"),t=this.safeString(s,"currency");if(void 0!==e&&void 0!==t){i=this.safeCurrencyCode(e)+"/"+this.safeCurrencyCode(t)}}const h=this.safeBool(e,"size_in_quote"),c=this.safeString(e,"price");let l,u=this.safeString(e,"size");h&&(l=u,u=a.Y.stringDiv(u,c));const f=this.safeString(e,"commission"),p=this.safeString(r,"amount",u),m=this.safeString(o,"amount",l);let g,v;g=void 0!==m&&void 0!==p?a.Y.stringDiv(m,p):c,v=void 0!==g&&void 0!==p?a.Y.stringMul(g,p):m;let y=this.safeString(n,"currency");const w=this.safeNumber(n,"amount",this.parseNumber(f));void 0===y&&void 0!==t&&void 0!==w&&(y=t.quote);const b=this.safeStringN(e,["created_at","trade_time","time"]),k=this.safeStringLower2(e,"resource","side"),S=this.safeStringLower(e,"liquidity_indicator");return this.safeTrade({info:e,id:this.safeString2(e,"id","trade_id"),order:this.safeString(e,"order_id"),timestamp:this.parse8601(b),datetime:b,symbol:i,type:void 0,side:"unknown_order_side"===k?void 0:k,takerOrMaker:"unknown_liquidity_indicator"===S?void 0:S,price:g,amount:p,cost:v,fee:{cost:w,currency:this.safeCurrencyCode(y)}})}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();return"fetchMarketsV3"===this.safeString(this.options,"fetchMarkets","fetchMarketsV3")?await this.fetchMarketsV3(e):await this.fetchMarketsV2(e)}async fetchMarketsV2(e={}){const t=await this.fetchCurrenciesFromCache(e),i=this.safeDict(t,"currencies",{}),s=this.safeDict(t,"exchangeRates",{}),r=this.safeList(i,"data",[]),a=this.indexBy(r,"id"),o=this.safeDict(this.safeDict(s,"data",{}),"rates",{}),n=Object.keys(o),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeCurrencyCode(t);if("crypto"===(t in a?"fiat":"crypto"))for(let e=0;e<r.length;e++){const s=r[e],a=this.safeString(s,"id"),o=this.safeCurrencyCode(a);d.push(this.safeMarketStructure({id:t+"-"+a,symbol:i+"/"+o,base:i,quote:o,settle:void 0,baseId:t,quoteId:a,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:void 0,price:void 0},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(s,"min_size"),max:void 0}},info:s}))}}return d}async fetchMarketsV3(e={}){let t=!1;[t,e]=this.handleOptionAndParams(e,"fetchMarkets","usePrivate",!1);const i=[];t?i.push(this.v3PrivateGetBrokerageProducts(e)):i.push(this.v3PublicGetBrokerageMarketProducts(e)),this.checkRequiredCredentials(!1)&&i.push(this.v3PrivateGetBrokerageTransactionSummary(e));let s=[];try{s=[this.v3PublicGetBrokerageMarketProducts(this.extend(e,{product_type:"FUTURE"})),this.v3PublicGetBrokerageMarketProducts(this.extend(e,{product_type:"FUTURE",contract_expiry_type:"PERPETUAL"}))],this.checkRequiredCredentials(!1)&&(s.push(this.extend(e,{product_type:"FUTURE"})),s.push(this.extend(e,{product_type:"FUTURE",contract_expiry_type:"PERPETUAL"})))}catch(e){s=[]}const r=await Promise.all(i);let a;try{a=await Promise.all(s)}catch(e){a=[]}const o=this.safeDict(r,0,{}),n=this.safeDict(r,1,{}),d=this.safeDict(a,0,{}),h=this.safeDict(a,1,{}),c=this.safeDict(a,2,{}),l=this.safeDict(a,3,{}),u=this.safeDict(n,"fee_tier",{}),f=this.safeDict(c,"fee_tier",{}),p=this.safeDict(l,"fee_tier",{}),m=this.safeList(o,"products",[]),g=[];for(let e=0;e<m.length;e++)g.push(this.parseSpotMarket(m[e],u));const v=this.safeList(d,"products",[]);for(let e=0;e<v.length;e++)g.push(this.parseContractMarket(v[e],f));const y=this.safeList(h,"products",[]);for(let e=0;e<y.length;e++)g.push(this.parseContractMarket(y[e],p));return g}parseSpotMarket(e,t){const i=this.safeString(e,"product_id"),s=this.safeString(e,"base_currency_id"),r=this.safeString(e,"quote_currency_id"),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r),n=this.safeStringLower(e,"product_type"),d=this.safeBool(e,"trading_disabled"),h=this.safeList(this.options,"stablePairs",[]),c=this.safeNumber(this.fees.trading,"taker"),l=this.safeNumber(this.fees.trading,"maker"),u=this.inArray(i,h)?1e-5:this.safeNumber(t,"taker_fee_rate",c),f=this.inArray(i,h)?0:this.safeNumber(t,"maker_fee_rate",l);return this.safeMarketStructure({id:i,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:n,spot:"spot"===n,margin:void 0,swap:!1,future:!1,option:!1,active:!d,contract:!1,linear:void 0,inverse:void 0,taker:u,maker:f,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"base_increment"),price:this.safeNumber2(e,"price_increment","quote_increment")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"base_min_size"),max:this.safeNumber(e,"base_max_size")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"quote_min_size"),max:this.safeNumber(e,"quote_max_size")}},created:void 0,info:e})}parseContractMarket(e,t){const i=this.safeString(e,"product_id"),s=this.safeDict(e,"future_product_details",{}),r=this.safeString(s,"contract_expiry_type"),a=this.safeNumber(s,"contract_size"),o=this.safeString(s,"contract_expiry"),n=this.parse8601(o),d=this.iso8601(n),h="PERPETUAL"===r,c=this.safeString(s,"contract_root_unit"),l=this.safeString(e,"quote_currency_id"),u=this.safeCurrencyCode(c),f=this.safeCurrencyCode(l),p=this.safeBool(e,"is_disabled");let m,g=u+"/"+f;h?(m="swap",g=g+":"+f):(m="future",g=g+":"+f+"-"+this.yymmdd(n));const v=this.safeNumber(t,"taker_fee_rate"),y=this.safeNumber(t,"maker_fee_rate"),w=v||this.parseNumber("0.06"),b=y||this.parseNumber("0.04");return this.safeMarketStructure({id:i,symbol:g,base:u,quote:f,settle:f,baseId:c,quoteId:l,settleId:l,type:m,spot:!1,margin:!1,swap:h,future:!h,option:!1,active:!p,contract:!0,linear:!0,inverse:!1,taker:w,maker:b,contractSize:a,expiry:n,expiryDatetime:d,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"base_increment"),price:this.safeNumber2(e,"price_increment","quote_increment")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"base_min_size"),max:this.safeNumber(e,"base_max_size")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"quote_min_size"),max:this.safeNumber(e,"quote_max_size")}},created:void 0,info:e})}async fetchCurrenciesFromCache(e={}){const t=this.safeDict(this.options,"fetchCurrencies",{}),i=this.safeInteger(t,"timestamp"),s=this.safeInteger(t,"expires",1e3),r=this.milliseconds();if(void 0===i||r-i>s){const i=[this.v2PublicGetCurrencies(e),this.v2PublicGetCurrenciesCrypto(e)],s=await Promise.all(i),a=this.safeDict(s,0,{}),o=this.safeDict(s,1,{}),n=this.safeList(a,"data",[]),d=this.safeList(o,"data",[]),h=await this.v2PublicGetExchangeRates(e);this.options.fetchCurrencies=this.extend(t,{currencies:this.arrayConcat(n,d),exchangeRates:h,timestamp:r})}return this.safeDict(this.options,"fetchCurrencies",{})}async fetchCurrencies(e={}){const t=await this.fetchCurrenciesFromCache(e),i=this.safeList(t,"currencies",[]),s={},r={},a={};for(let e=0;e<i.length;e++){const t=i[e],o=this.safeString(t,"asset_id"),n=this.safeString2(t,"id","code"),d=this.safeCurrencyCode(n),h=this.safeString(t,"name");if(this.options.networks[d]=h.toLowerCase(),this.options.networksById[d]=h.toLowerCase(),s[d]={info:t,id:n,code:d,type:void 0!==o?"crypto":"fiat",name:this.safeString(t,"name"),active:!0,deposit:void 0,withdraw:void 0,fee:void 0,precision:void 0,limits:{amount:{min:this.safeNumber(t,"min_size"),max:void 0},withdraw:{min:void 0,max:void 0}}},void 0!==o){const e=h.toLowerCase();r[d]=e,a[e]=d}}return this.options.networks=this.extend(r,this.options.networks),this.options.networksById=this.extend(a,this.options.networksById),s}async fetchTickers(e=void 0,t={}){return"fetchTickersV3"===this.safeString(this.options,"fetchTickers","fetchTickersV3")?await this.fetchTickersV3(e,t):await this.fetchTickersV2(e,t)}async fetchTickersV2(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v2PublicGetExchangeRates(this.extend({},t)),s=this.safeDict(i,"data",{}),r=this.safeDict(s,"rates",{}),a=this.safeString(s,"currency"),o={},n=Object.keys(r);for(let e=0;e<n.length;e++){const t=n[e],i=t+"-"+a,s=this.safeMarket(i,void 0,"-");o[s.symbol]=this.parseTicker(r[t],s)}return this.filterByArrayTickers(o,"symbol",e)}async fetchTickersV3(e=void 0,t={}){await this.loadMarkets();const i={};let s,r;void 0!==(e=this.marketSymbols(e))&&(i.product_ids=this.marketIds(e)),[s,t]=this.handleMarketTypeAndParams("fetchTickers",this.getMarketFromSymbols(e),t,"default"),void 0!==s&&"default"!==s&&(i.product_type="swap"===s?"FUTURE":"SPOT");let a=!1;[a,t]=this.handleOptionAndParams(t,"fetchTickers","usePrivate",!1),r=a?await this.v3PrivateGetBrokerageProducts(this.extend(i,t)):await this.v3PublicGetBrokerageMarketProducts(this.extend(i,t));const o=this.safeList(r,"products",[]),n={};for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"product_id"),s=this.safeMarket(i,void 0,"-");n[s.symbol]=this.parseTicker(t,s)}return this.filterByArrayTickers(n,"symbol",e)}async fetchTicker(e,t={}){return"fetchTickerV3"===this.safeString(this.options,"fetchTicker","fetchTickerV3")?await this.fetchTickerV3(e,t):await this.fetchTickerV2(e,t)}async fetchTickerV2(e,t={}){await this.loadMarkets();const i=this.market(e),s=this.extend({symbol:i.id},t),r=await this.v2PublicGetPricesSymbolSpot(s),a=await this.v2PublicGetPricesSymbolBuy(s),o=await this.v2PublicGetPricesSymbolSell(s),n=this.safeDict(r,"data",{}),d=this.safeDict(a,"data",{}),h=this.safeDict(o,"data",{}),c={bid:this.safeNumber(h,"amount"),ask:this.safeNumber(d,"amount"),price:this.safeNumber(n,"amount")};return this.parseTicker(c,i)}async fetchTickerV3(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_id:i.id,limit:1};let r,a=!1;[a,t]=this.handleOptionAndParams(t,"fetchTicker","usePrivate",!1),r=a?await this.v3PrivateGetBrokerageProductsProductIdTicker(this.extend(s,t)):await this.v3PublicGetBrokerageMarketProductsProductIdTicker(this.extend(s,t));const o=this.safeList(r,"trades",[]),n=this.parseTicker(o[0],i);return n.bid=this.safeNumber(r,"best_bid"),n.ask=this.safeNumber(r,"best_ask"),n}parseTicker(e,t=void 0){let i,s,r=this.safeNumber(e,"bid"),a=this.safeNumber(e,"ask");if("bids"in e){const t=this.safeList(e,"bids",[]),o=this.safeList(e,"asks",[]);r=this.safeNumber(t[0],"price"),i=this.safeNumber(t[0],"size"),a=this.safeNumber(o[0],"price"),s=this.safeNumber(o[0],"size")}const o=this.safeString(e,"product_id"),n=this.safeNumber(e,"price"),d=this.safeString(e,"time");return this.safeTicker({symbol:this.safeSymbol(o,t),timestamp:this.parse8601(d),datetime:d,bid:r,ask:a,last:n,high:void 0,low:void 0,bidVolume:i,askVolume:s,vwap:void 0,open:void 0,close:n,previousClose:void 0,change:void 0,percentage:this.safeNumber(e,"price_percentage_change_24h"),average:void 0,baseVolume:void 0,quoteVolume:void 0,info:e},t)}parseCustomBalance(e,t={}){const i=this.safeList2(e,"data","accounts",[]),s=this.safeList(t,"type",this.options.accounts),r=this.safeList(t,"type",this.options.v3Accounts),o={info:e};for(let e=0;e<i.length;e++){const t=i[e],n=this.safeString(t,"type");if(this.inArray(n,s)){const e=this.safeDict(t,"balance");if(void 0!==e){const t=this.safeString(e,"currency"),i=this.safeCurrencyCode(t),s=this.safeString(e,"amount"),r=s;let n=this.safeDict(o,i);void 0===n?(n=this.account(),n.free=r,n.total=s):(n.free=a.Y.stringAdd(n.free,s),n.total=a.Y.stringAdd(n.total,s)),o[i]=n}}else if(this.inArray(n,r)){const e=this.safeDict(t,"available_balance"),i=this.safeDict(t,"hold");if(void 0!==e&&void 0!==i){const t=this.safeString(e,"currency"),s=this.safeCurrencyCode(t),r=this.safeString(i,"value"),n=this.safeString(e,"value"),d=a.Y.stringAdd(r,n);let h=this.safeDict(o,s);void 0===h?(h=this.account(),h.free=n,h.used=r,h.total=d):(h.free=a.Y.stringAdd(h.free,n),h.used=a.Y.stringAdd(h.used,r),h.total=a.Y.stringAdd(h.total,d)),o[s]=h}}}return this.safeBalance(o)}async fetchBalance(e={}){await this.loadMarkets();const t={};let i;const s=this.safeBool(e,"v3",!1);let r;e=this.omit(e,["v3"]),[r,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const a=this.safeString(this.options,"fetchBalance","v3PrivateGetBrokerageAccounts");return"future"===r?i=await this.v3PrivateGetBrokerageCfmBalanceSummary(this.extend(t,e)):s||"v3PrivateGetBrokerageAccounts"===a?(t.limit=250,i=await this.v3PrivateGetBrokerageAccounts(this.extend(t,e))):(t.limit=250,i=await this.v2PrivateGetAccounts(this.extend(t,e))),e.type=r,this.parseCustomBalance(i,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a,o=!1;if([o,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),o)return await this.fetchPaginatedCallCursor("fetchLedger",e,t,i,s,"next_starting_after","starting_after",void 0,100);void 0!==e&&(r=this.currency(e)),[a,s]=await this.prepareAccountRequestWithCurrencyCode(e,i,s);const n=await this.v2PrivateGetAccountsAccountIdTransactions(this.extend(a,s)),d=this.parseLedger(n.data,r,t,i),h=d.length;if(0===h)return d;const c=h-1,l=this.safeDict(d,c),u=this.safeDict(n,"pagination",{}),f=this.safeString(u,"next_starting_after");return void 0!==f&&""!==f&&(l.info.next_starting_after=f,d[c]=l),d}parseLedgerEntryStatus(e){return this.safeString({completed:"ok"},e,e)}parseLedgerEntryType(e){return this.safeString({buy:"trade",sell:"trade",fiat_deposit:"transaction",fiat_withdrawal:"transaction",exchange_deposit:"transaction",exchange_withdrawal:"transaction",send:"transaction",pro_deposit:"transaction",pro_withdrawal:"transaction"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeDict(e,"amount",{});let s,r=this.safeString(i,"amount");a.Y.stringLt(r,"0")?(s="out",r=a.Y.stringNeg(r)):s="in";const o=this.safeString(i,"currency"),n=this.safeCurrencyCode(o,t);let d;t=this.safeCurrency(o,t);const h=this.safeDict(e,"network",{}),c=this.safeDict(h,"transaction_fee");if(void 0!==c){const e=this.safeString(c,"currency"),i=this.safeCurrencyCode(e,t);d={cost:this.safeNumber(c,"amount"),currency:i}}const l=this.parse8601(this.safeString(e,"created_at")),u=this.safeString(e,"id"),f=this.parseLedgerEntryType(this.safeString(e,"type")),p=this.parseLedgerEntryStatus(this.safeString(e,"status")),m=this.safeString(e,"resource_path");let g;if(void 0!==m){const e=m.split("/");e.length>3&&(g=e[3])}return this.safeLedgerEntry({info:e,id:u,timestamp:l,datetime:this.iso8601(l),direction:s,account:g,referenceId:void 0,referenceAccount:void 0,type:f,currency:n,amount:this.parseNumber(r),before:void 0,after:void 0,status:p,fee:d},t)}async findAccountId(e,t={}){await this.loadMarkets(),await this.loadAccounts(!1,t);for(let t=0;t<this.accounts.length;t++){const i=this.accounts[t];if(i.code===e)return i.id}}prepareAccountRequest(e=void 0,t={}){const i=this.safeString2(t,"account_id","accountId");if(void 0===i)throw new r.ArgumentsRequired(this.id+" prepareAccountRequest() method requires an account_id (or accountId) parameter");const s={account_id:i};return void 0!==e&&(s.limit=e),s}async prepareAccountRequestWithCurrencyCode(e=void 0,t=void 0,i={}){let s=this.safeString2(i,"account_id","accountId");if(i=this.omit(i,["account_id","accountId"]),void 0===s){if(void 0===e)throw new r.ArgumentsRequired(this.id+" prepareAccountRequestWithCurrencyCode() method requires an account_id (or accountId) parameter OR a currency code argument");if(s=await this.findAccountId(e,i),void 0===s)throw new r.ExchangeError(this.id+" prepareAccountRequestWithCurrencyCode() could not find account id for "+e)}const a={account_id:s};return void 0!==t&&(a.limit=t),[a,i]}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e);let h={client_order_id:this.safeString(this.options,"brokerId","ccxt")+"-"+this.uuid(),product_id:d.id,side:i.toUpperCase()};const c=this.safeNumberN(n,["stopPrice","stop_price","triggerPrice"]),l=this.safeNumber(n,"stopLossPrice"),u=this.safeNumber(n,"takeProfitPrice"),f=void 0!==c,p=void 0!==l,m=void 0!==u,g=this.safeString(n,"timeInForce"),v="PO"===g||this.safeBool2(n,"postOnly","post_only",!1),y=this.safeString(n,"end_time");let w=this.safeString(n,"stop_direction");if("limit"===t)if(f)if(void 0===w&&(w="buy"===i?"STOP_DIRECTION_STOP_DOWN":"STOP_DIRECTION_STOP_UP"),"GTD"===g||void 0!==y){if(void 0===y)throw new r.ExchangeError(this.id+" createOrder() requires an end_time parameter for a GTD order");h.order_configuration={stop_limit_stop_limit_gtd:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o),stop_price:this.priceToPrecision(e,c),stop_direction:w,end_time:y}}}else h.order_configuration={stop_limit_stop_limit_gtc:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o),stop_price:this.priceToPrecision(e,c),stop_direction:w}};else if(p||m){let t;p?(void 0===w&&(w="buy"===i?"STOP_DIRECTION_STOP_UP":"STOP_DIRECTION_STOP_DOWN"),t=this.priceToPrecision(e,l)):(void 0===w&&(w="buy"===i?"STOP_DIRECTION_STOP_DOWN":"STOP_DIRECTION_STOP_UP"),t=this.priceToPrecision(e,u)),h.order_configuration={stop_limit_stop_limit_gtc:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o),stop_price:t,stop_direction:w}}}else if("GTD"===g||void 0!==y){if(void 0===y)throw new r.ExchangeError(this.id+" createOrder() requires an end_time parameter for a GTD order");h.order_configuration={limit_limit_gtd:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o),end_time:y,post_only:v}}}else h.order_configuration="IOC"===g?{sor_limit_ioc:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o)}}:"FOK"===g?{limit_limit_fok:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o)}}:{limit_limit_gtc:{base_size:this.amountToPrecision(e,s),limit_price:this.priceToPrecision(e,o),post_only:v}};else{if(f||p||m)throw new r.NotSupported(this.id+" createOrder() only stop limit orders are supported");if(d.spot&&"buy"===i){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);h.order_configuration={market_market_ioc:{quote_size:t}}}else h.order_configuration={market_market_ioc:{base_size:this.amountToPrecision(e,s)}}}const b=this.safeString(n,"marginMode");void 0!==b&&("isolated"===b?h.margin_type="ISOLATED":"cross"===b&&(h.margin_type="CROSS")),n=this.omit(n,["timeInForce","triggerPrice","stopLossPrice","takeProfitPrice","stopPrice","stop_price","stopDirection","stop_direction","clientOrderId","postOnly","post_only","end_time","marginMode"]);let k;this.safeBool2(n,"preview","test",!1)?(n=this.omit(n,["preview","test"]),h=this.omit(h,"client_order_id"),k=await this.v3PrivatePostBrokerageOrdersPreview(this.extend(h,n))):k=await this.v3PrivatePostBrokerageOrders(this.extend(h,n));if(!0!==this.safeBool(k,"success")){const e=this.safeDict(k,"error_response"),t=this.safeString(e,"error"),i=this.safeString(e,"message");if(void 0!==e)throw this.throwExactlyMatchedException(this.exceptions.exact,t,i),this.throwBroadlyMatchedException(this.exceptions.broad,t,i),new r.ExchangeError(i)}const S=this.safeDict(k,"success_response",{});return this.parseOrder(S,d)}parseOrder(e,t=void 0){const i=this.safeString(e,"product_id"),s=this.safeSymbol(i,t,"-");void 0!==s&&(t=this.safeMarket(s,t));const r=this.safeDict(e,"order_configuration",{}),a=this.safeDict(r,"limit_limit_gtc"),o=this.safeDict(r,"limit_limit_gtd"),n=this.safeDict(r,"sor_limit_ioc"),d=this.safeDict(r,"stop_limit_stop_limit_gtc"),h=this.safeDict(r,"stop_limit_stop_limit_gtd"),c=this.safeDict(r,"market_market_ioc"),l=void 0!==d||void 0!==h;let u,f,p,m;if(void 0!==a||void 0!==o||void 0!==n){let e;e=void 0!==a?a:void 0!==o?o:n,u=this.safeString(e,"limit_price"),f=this.safeString(e,"base_size"),p=this.safeBool(e,"post_only")}else if(l){const e=void 0!==d?d:h;u=this.safeString(e,"limit_price"),f=this.safeString(e,"base_size"),p=this.safeBool(e,"post_only"),m=this.safeString(e,"stop_price")}else f=this.safeString(c,"base_size");const g=this.safeString(e,"created_time");let v;return void 0!==this.safeString(e,"total_fees")&&void 0!==t&&(v=t.quote),this.safeOrder({info:e,id:this.safeString(e,"order_id"),clientOrderId:this.safeString(e,"client_order_id"),timestamp:this.parse8601(g),datetime:g,lastTradeTimestamp:void 0,symbol:s,type:this.parseOrderType(this.safeString(e,"order_type")),timeInForce:this.parseTimeInForce(this.safeString(e,"time_in_force")),postOnly:p,side:this.safeStringLower(e,"side"),price:u,triggerPrice:m,amount:f,filled:this.safeString(e,"filled_size"),remaining:void 0,cost:void 0,average:this.safeString(e,"average_filled_price"),status:this.parseOrderStatus(this.safeString(e,"status")),fee:{cost:this.safeString(e,"total_fees"),currency:v},trades:void 0},t)}parseOrderStatus(e){const t={OPEN:"open",FILLED:"closed",CANCELLED:"canceled",EXPIRED:"canceled",FAILED:"canceled",UNKNOWN_ORDER_STATUS:void 0};return this.safeString(t,e,e)}parseOrderType(e){if("UNKNOWN_ORDER_TYPE"===e)return;return this.safeString({MARKET:"market",LIMIT:"limit",STOP:"limit",STOP_LIMIT:"limit"},e,e)}parseTimeInForce(e){const t={GOOD_UNTIL_CANCELLED:"GTC",GOOD_UNTIL_DATE_TIME:"GTD",IMMEDIATE_OR_CANCEL:"IOC",FILL_OR_KILL:"FOK",UNKNOWN_TIME_IN_FORCE:void 0};return this.safeString(t,e,e)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.cancelOrders([e],t,i);return this.safeDict(s,0,{})}async cancelOrders(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const a={order_ids:e},o=await this.v3PrivatePostBrokerageOrdersBatchCancel(this.extend(a,i)),n=this.safeList(o,"results",[]);for(let e=0;e<n.length;e++){if(!0!==this.safeBool(n[e],"success"))throw new r.BadRequest(this.id+" cancelOrders() has failed, check your arguments and parameters")}return this.parseOrders(n,s)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={order_id:e};void 0!==r&&(d.size=this.amountToPrecision(t,r)),void 0!==a&&(d.price=this.priceToPrecision(t,a));let h;return this.safeBool2(o,"preview","test",!1)?(o=this.omit(o,["preview","test"]),h=await this.v3PrivatePostBrokerageOrdersEditPreview(this.extend(d,o))):h=await this.v3PrivatePostBrokerageOrdersEdit(this.extend(d,o)),this.parseOrder(h,n)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={order_id:e},a=await this.v3PrivateGetBrokerageOrdersHistoricalOrderId(this.extend(r,i)),o=this.safeDict(a,"order",{});return this.parseOrder(o,s)}async fetchOrders(e=void 0,t=void 0,i=100,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),a)return await this.fetchPaginatedCallCursor("fetchOrders",e,t,i,s,"cursor","cursor",void 0,1e3);void 0!==e&&(r=this.market(e));const o={};void 0!==r&&(o.product_id=r.id),void 0!==i&&(o.limit=i),void 0!==t&&(o.start_date=this.iso8601(t));const n=this.safeIntegerN(s,["until"]);void 0!==n&&(s=this.omit(s,["until"]),o.end_date=this.iso8601(n));const d=await this.v3PrivateGetBrokerageOrdersHistoricalBatch(this.extend(o,s)),h=this.safeList(d,"orders",[]),c=this.safeDict(h,0),l=this.safeString(d,"cursor");return void 0!==l&&""!==l&&(c.cursor=l,h[0]=c),this.parseOrders(h,r,t,i)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={order_status:e};void 0!==a&&(o.product_id=a.id),void 0===s&&(s=100),o.limit=s,void 0!==i&&(o.start_date=this.iso8601(i));const n=this.safeIntegerN(r,["until"]);void 0!==n&&(r=this.omit(r,["until"]),o.end_date=this.iso8601(n));const d=await this.v3PrivateGetBrokerageOrdersHistoricalBatch(this.extend(o,r)),h=this.safeList(d,"orders",[]),c=this.safeDict(h,0),l=this.safeString(d,"cursor");return void 0!==l&&""!==l&&(c.cursor=l,h[0]=c),this.parseOrders(h,a,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r?await this.fetchPaginatedCallCursor("fetchOpenOrders",e,t,i,s,"cursor","cursor",void 0,100):await this.fetchOrdersByStatus("OPEN",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r?await this.fetchPaginatedCallCursor("fetchClosedOrders",e,t,i,s,"cursor","cursor",void 0,100):await this.fetchOrdersByStatus("FILLED",e,t,i,s)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("CANCELLED",e,t,i,s)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();s=void 0===s?300:Math.min(s,300);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,299);const n=this.market(e),d={product_id:n.id,granularity:this.safeString(this.timeframes,t,t)},h=this.safeIntegerN(r,["until","end"]);r=this.omit(r,["until"]);const c=s*this.parseTimeframe(t);let l,u;if(void 0!==i)l=this.numberToString(this.parseToInt(i/1e3));else{const e=this.seconds().toString();l=a.Y.stringSub(e,c.toString())}d.start=l,d.end=void 0!==h?this.numberToString(this.parseToInt(h/1e3)):a.Y.stringAdd(l,c.toString());let f=!1;[f,r]=this.handleOptionAndParams(r,"fetchOHLCV","usePrivate",!1),u=f?await this.v3PrivateGetBrokerageProductsProductIdCandles(this.extend(d,r)):await this.v3PublicGetBrokerageMarketProductsProductIdCandles(this.extend(d,r));const p=this.safeList(u,"candles",[]);return this.parseOHLCVs(p,n,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"start"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e),o={product_id:a.id};let n,d;if(void 0!==t&&(o.start=this.numberToString(this.parseToInt(t/1e3))),void 0!==i&&(o.limit=Math.min(i,1e3)),[n,s]=this.handleOptionAndParams(s,"fetchTrades","until"),void 0!==n)o.end=this.numberToString(this.parseToInt(n/1e3));else if(void 0!==t)throw new r.ArgumentsRequired(this.id+" fetchTrades() requires a `until` parameter when you use `since` argument");let h=!1;[h,s]=this.handleOptionAndParams(s,"fetchTrades","usePrivate",!1),d=h?await this.v3PrivateGetBrokerageProductsProductIdTicker(this.extend(o,s)):await this.v3PublicGetBrokerageMarketProductsProductIdTicker(this.extend(o,s));const c=this.safeList(d,"trades",[]);return this.parseTrades(c,a,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallCursor("fetchMyTrades",e,t,i,s,"cursor","cursor",void 0,250);void 0!==e&&(r=this.market(e));const o={};void 0!==r&&(o.product_id=r.id),void 0!==i&&(o.limit=i),void 0!==t&&(o.start_sequence_timestamp=this.iso8601(t));const n=this.safeIntegerN(s,["until"]);void 0!==n&&(s=this.omit(s,["until"]),o.end_sequence_timestamp=this.iso8601(n));const d=await this.v3PrivateGetBrokerageOrdersHistoricalFills(this.extend(o,s)),h=this.safeList(d,"fills",[]),c=this.safeDict(h,0),l=this.safeString(d,"cursor");return void 0!==l&&""!==l&&(c.cursor=l,h[0]=c),this.parseTrades(h,r,t,i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={product_id:this.market(e).id};let r;void 0!==t&&(s.limit=t);let a=!1;[a,i]=this.handleOptionAndParams(i,"fetchOrderBook","usePrivate",!1),r=a?await this.v3PrivateGetBrokerageProductBook(this.extend(s,i)):await this.v3PublicGetBrokerageMarketProductBook(this.extend(s,i));const o=this.safeDict(r,"pricebook",{}),n=this.safeString(o,"time"),d=this.parse8601(n);return this.parseOrderBook(o,e,d,"bids","asks","price","size")}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets();const i={};void 0!==(e=this.marketSymbols(e))&&(i.product_ids=this.marketIds(e));const s=await this.v3PrivateGetBrokerageBestBidAsk(this.extend(i,t)),r=this.safeList(s,"pricebooks",[]);return this.parseTickers(r,e)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);let n=this.safeString2(a,"account_id","accountId");if(a=this.omit(a,["account_id","accountId"]),void 0===n){if(void 0===e)throw new r.ArgumentsRequired(this.id+" withdraw() requires an account_id (or accountId) parameter OR a currency code argument");if(n=await this.findAccountId(e,a),void 0===n)throw new r.ExchangeError(this.id+" withdraw() could not find account id for "+e)}const d={account_id:n,type:"send",to:i,amount:t,currency:o.id};void 0!==s&&(d.destination_tag=s);const h=await this.v2PrivatePostAccountsAccountIdTransactions(this.extend(d,a)),c=this.safeDict(h,"data",{});return this.parseTransaction(c,o)}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e);let s;[s,t]=await this.prepareAccountRequestWithCurrencyCode(i.code,void 0,t);const r=await this.v2PrivateGetAccountsAccountIdAddresses(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.parseDepositAddresses(a,void 0,!1);return this.indexBy(o,"network")}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");this.checkAddress(i);const s=this.safeString(e,"network"),r=this.safeCurrencyCode(void 0,t),a=this.safeString(e,"address_label");let o;if(void 0!==a){const e=a.split(" ");o=this.safeString(e,0)}const n=this.safeDict(e,"address_info");return{info:e,currency:this.safeCurrencyCode(o,t),network:this.networkIdToCode(s,r),address:i,tag:this.safeString(n,"destination_tag")}}async deposit(e,t,i,s={}){await this.loadMarkets();let a=this.safeString2(s,"account_id","accountId");if(s=this.omit(s,["account_id","accountId"]),void 0===a){if(void 0===e)throw new r.ArgumentsRequired(this.id+" deposit() requires an account_id (or accountId) parameter OR a currency code argument");if(a=await this.findAccountId(e,s),void 0===a)throw new r.ExchangeError(this.id+" deposit() could not find account id for "+e)}const o={account_id:a,amount:this.numberToString(t),currency:e.toUpperCase(),payment_method:i},n=await this.v2PrivatePostAccountsAccountIdDeposits(this.extend(o,s)),d=this.safeDict(n,"data",{});return this.parseTransaction(d)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();let s=this.safeString2(i,"account_id","accountId");if(i=this.omit(i,["account_id","accountId"]),void 0===s){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchDeposit() requires an account_id (or accountId) parameter OR a currency code argument");if(s=await this.findAccountId(t,i),void 0===s)throw new r.ExchangeError(this.id+" fetchDeposit() could not find account id for "+t)}const a={account_id:s,deposit_id:e},o=await this.v2PrivateGetAccountsAccountIdDepositsDepositId(this.extend(a,i)),n=this.safeDict(o,"data",{});return this.parseTransaction(n)}async fetchDepositMethodIds(e={}){await this.loadMarkets();const t=await this.v3PrivateGetBrokeragePaymentMethods(e),i=this.safeList(t,"payment_methods",[]);return this.parseDepositMethodIds(i)}async fetchDepositMethodId(e,t={}){await this.loadMarkets();const i={payment_method_id:e},s=await this.v3PrivateGetBrokeragePaymentMethodsPaymentMethodId(this.extend(i,t)),r=this.safeDict(s,"payment_method",{});return this.parseDepositMethodId(r)}parseDepositMethodIds(e,t={}){const i=[];for(let s=0;s<e.length;s++){const r=this.extend(this.parseDepositMethodId(e[s]),t);i.push(r)}return i}parseDepositMethodId(e){return{info:e,id:this.safeString(e,"id"),currency:this.safeString(e,"currency"),verified:this.safeBool(e,"verified"),tag:this.safeString(e,"name")}}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r={from_account:e,to_account:t,amount:this.numberToString(i)},a=await this.v3PrivatePostBrokerageConvertQuote(this.extend(r,s)),o=this.safeDict(a,"trade",{});return this.parseConversion(o)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a={trade_id:e,from_account:t,to_account:i},o=await this.v3PrivatePostBrokerageConvertTradeTradeId(this.extend(a,r)),n=this.safeDict(o,"trade",{});return this.parseConversion(n)}async fetchConvertTrade(e,t=void 0,i={}){if(await this.loadMarkets(),void 0===t)throw new r.ArgumentsRequired(this.id+" fetchConvertTrade() requires a code argument");const s=this.safeString(i,"toCode");if(void 0===s)throw new r.ArgumentsRequired(this.id+" fetchConvertTrade() requires a toCode parameter");i=this.omit(i,"toCode");const a={trade_id:e,from_account:t,to_account:s},o=await this.v3PrivateGetBrokerageConvertTradeTradeId(this.extend(a,i)),n=this.safeDict(o,"trade",{});return this.parseConversion(n)}parseConversion(e,t=void 0,i=void 0){const s=this.safeString(e,"source_currency"),r=this.safeCurrencyCode(s,t),a=this.safeString(e,"target_currency"),o=this.safeCurrencyCode(a,i),n=this.safeDict(e,"user_entered_amount"),d=this.safeDict(e,"total_fee"),h=this.safeDict(d,"amount");return{info:e,timestamp:void 0,datetime:void 0,id:this.safeString(e,"id"),fromCurrency:r,fromAmount:this.safeNumber(n,"value"),toCurrency:o,toAmount:void 0,price:void 0,fee:this.safeNumber(h,"value")}}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);if(!s.future)throw new r.NotSupported(this.id+" closePosition() only supported for futures markets");const a=this.safeString2(i,"client_order_id","clientOrderId");i=this.omit(i,"clientOrderId");const o={product_id:s.id};if(void 0===a)throw new r.ArgumentsRequired(this.id+" closePosition() requires a clientOrderId parameter");o.client_order_id=a;const n=await this.v3PrivatePostBrokerageOrdersClosePosition(this.extend(o,i)),d=this.safeDict(n,"success_response",{});return this.parseOrder(d)}async fetchPositions(e=void 0,t={}){let i,s,a;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))&&(i=this.market(e[0])),[s,t]=this.handleMarketTypeAndParams("fetchPositions",i,t),"future"===s)a=await this.v3PrivateGetBrokerageCfmPositions(t);else{let e;if([e,t]=this.handleOptionAndParams(t,"fetchPositions","portfolio"),void 0===e)throw new r.ArgumentsRequired(this.id+' fetchPositions() requires a "portfolio" value in params (eg: dbcb91e7-2bc9-515), or set as exchange.options["portfolio"]. You can get a list of portfolios with fetchPortfolios()');const i={portfolio_uuid:e};a=await this.v3PrivateGetBrokerageIntxPositionsPortfolioUuid(this.extend(i,t))}const o=this.safeList(a,"positions",[]);return this.parsePositions(o,e)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e);let s;if(i.future){const e=this.safeString(i,"product_id");if(void 0===e)throw new r.ArgumentsRequired(this.id+' fetchPosition() requires a "product_id" in params');const a={product_id:e};s=await this.v3PrivateGetBrokerageCfmPositionsProductId(this.extend(a,t))}else{let e;if([e,t]=this.handleOptionAndParams(t,"fetchPositions","portfolio"),void 0===e)throw new r.ArgumentsRequired(this.id+' fetchPosition() requires a "portfolio" value in params (eg: dbcb91e7-2bc9-515), or set as exchange.options["portfolio"]. You can get a list of portfolios with fetchPortfolios()');const a={symbol:i.id,portfolio_uuid:e};s=await this.v3PrivateGetBrokerageIntxPositionsPortfolioUuidSymbol(this.extend(a,t))}const a=this.safeDict(s,"position",{});return this.parsePosition(a,i)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol","");t=this.safeMarket(i,t);const s=this.safeString(e,"margin_type");let r;void 0!==s&&(r="MARGIN_TYPE_CROSS"===s?"cross":"isolated");const a=this.safeDict(e,"position_notional",{}),o="POSITION_SIDE_LONG"===this.safeString(e,"position_side")?"long":"short",n=this.safeDict(e,"unrealized_pnl",{}),d=this.safeDict(e,"liquidation_price",{}),h=this.safeNumber(d,"value"),c=this.safeDict(e,"vwap",{}),l=this.safeDict(e,"portfolio_summary",{});return this.safePosition({info:e,id:this.safeString(e,"product_id"),symbol:this.safeSymbol(i,t),notional:this.safeNumber(a,"value"),marginMode:r,liquidationPrice:h,entryPrice:this.safeNumber(c,"value"),unrealizedPnl:this.safeNumber(n,"value"),realizedPnl:void 0,percentage:void 0,contracts:this.safeNumber(e,"net_size"),contractSize:t.contractSize,markPrice:void 0,lastPrice:void 0,side:o,hedged:void 0,timestamp:void 0,datetime:void 0,lastUpdateTimestamp:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:this.safeNumber(l,"collateral"),initialMargin:void 0,initialMarginPercentage:void 0,leverage:this.safeNumber(e,"leverage"),marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchTradingFees(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchTradingFees",void 0,e);const i="spot"===t,s={product_type:i?"SPOT":"FUTURE"},r=await this.v3PrivateGetBrokerageTransactionSummary(this.extend(s,e)),a=this.safeDict(r,"fee_tier",{}),o=this.safeNumber(a,"taker_fee_rate"),n=this.safeNumber(a,"maker_fee_rate"),d={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e],s=this.market(t);(i&&s.spot||!i&&!s.spot)&&(d[t]={info:r,symbol:t,maker:o,taker:n,percentage:!0})}return d}createAuthToken(e,t=void 0,i=void 0){let s;if(void 0!==i){s=t+" "+i.replace("https://","");const e=s.indexOf("?");e>0&&(s=s.slice(0,e))}const r=this.randomBytes(16),a={aud:["retail_rest_api_proxy"],iss:"coinbase-cloud",nbf:e,exp:e+120,sub:this.apiKey,iat:e};void 0!==s&&(a.uri=s);return(0,d.a)(a,this.encode(this.secret),n.s,!1,{kid:this.apiKey,nonce:r,alg:"ES256"})}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t=[],i="GET",s={},a=void 0,o=void 0){const d=t[0],h="private"===t[1],c="v3"===d;let l="/"+(c?"api/v3":"v2")+"/"+this.implodeParams(e,s);const u=this.omit(s,this.extractParams(e)),f=l;"GET"===i&&Object.keys(u).length&&(l+="?"+this.urlencodeWithArrayRepeat(u));const p=this.urls.api.rest+l;if(h){const e=this.safeString(this.headers,"Authorization");let t;if(void 0!==e)t=e;else if(this.token&&!this.checkRequiredCredentials(!1))t="Bearer "+this.token;else{this.checkRequiredCredentials();const e=this.seconds();let s="";"GET"!==i?Object.keys(u).length&&(s=o=this.json(u)):c||Object.keys(u).length&&(s+="?"+this.urlencode(u));if(this.apiKey.indexOf("organizations/")>=0||this.secret.startsWith("-----BEGIN")){if(this.apiKey.startsWith("-----BEGIN"))throw new r.ArgumentsRequired(this.id+" apiKey should contain the name (eg: organizations/3b910e93....) and not the public key");t="Bearer "+this.createAuthToken(e,i,p)}else{const e=this.nonce(),t=this.parseToInt(e/1e3).toString(),r=t+i+f+s,o=this.hmac(this.encode(r),this.encode(this.secret),n.s);a={"CB-ACCESS-KEY":this.apiKey,"CB-ACCESS-SIGN":o,"CB-ACCESS-TIMESTAMP":t,"Content-Type":"application/json"}}}void 0!==t&&(a={Authorization:t,"Content-Type":"application/json"},"GET"!==i&&Object.keys(u).length&&(o=this.json(u)))}return{url:p,method:i,body:o,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.id+" "+o;let l=this.safeString(n,"error");if(void 0!==l){const e=this.safeString2(n,"error_description","preview_failure_reason");throw this.throwExactlyMatchedException(this.exceptions.exact,l,c),this.throwBroadlyMatchedException(this.exceptions.broad,e,c),new r.ExchangeError(c)}const u=this.safeList(n,"errors");if(void 0!==u&&Array.isArray(u)){if(u.length>0){l=this.safeString(u[0],"id");const e=this.safeString(u[0],"message");if(void 0!==l)throw this.throwExactlyMatchedException(this.exceptions.exact,l,c),this.throwBroadlyMatchedException(this.exceptions.broad,e,c),new r.ExchangeError(c)}}const f=this.options.advanced;if(!("data"in n)&&!f)throw new r.ExchangeError(this.id+" failed due to a malformed response "+this.json(n))}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinbaseadvanced",name:"Coinbase Advanced",alias:!0})}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinbaseexchange",name:"Coinbase Exchange",countries:["US"],rateLimit:100,userAgent:this.userAgents.chrome,pro:!0,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,createDepositAddress:!0,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchLedger:!0,fetchMarginMode:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:"emulated",fetchWithdrawals:!0,withdraw:!0},timeframes:{"1m":60,"5m":300,"15m":900,"1h":3600,"6h":21600,"1d":86400},hostname:"exchange.coinbase.com",urls:{test:{public:"https://api-public.sandbox.exchange.coinbase.com",private:"https://api-public.sandbox.exchange.coinbase.com"},logo:"https://github.com/ccxt/ccxt/assets/43336371/34a65553-88aa-4a38-a714-064bd228b97e",api:{public:"https://api.{hostname}",private:"https://api.{hostname}"},www:"https://coinbase.com/",doc:"https://docs.cloud.coinbase.com/exchange/docs/",fees:["https://docs.pro.coinbase.com/#fees","https://support.pro.coinbase.com/customer/en/portal/articles/2945310-fees"]},requiredCredentials:{apiKey:!0,secret:!0,password:!0},api:{public:{get:["currencies","products","products/{id}","products/{id}/book","products/{id}/candles","products/{id}/stats","products/{id}/ticker","products/{id}/trades","time","products/spark-lines","products/volume-summary"]},private:{get:["address-book","accounts","accounts/{id}","accounts/{id}/holds","accounts/{id}/ledger","accounts/{id}/transfers","coinbase-accounts","fills","funding","fees","margin/profile_information","margin/buying_power","margin/withdrawal_power","margin/withdrawal_power_all","margin/exit_plan","margin/liquidation_history","margin/position_refresh_amounts","margin/status","oracle","orders","orders/{id}","orders/client:{client_oid}","otc/orders","payment-methods","position","profiles","profiles/{id}","reports/{report_id}","transfers","transfers/{transfer_id}","users/self/exchange-limits","users/self/hold-balances","users/self/trailing-volume","withdrawals/fee-estimate","conversions/{conversion_id}","conversions/fees"],post:["conversions","deposits/coinbase-account","deposits/payment-method","coinbase-accounts/{id}/addresses","funding/repay","orders","position/close","profiles/margin-transfer","profiles/transfer","reports","withdrawals/coinbase","withdrawals/coinbase-account","withdrawals/crypto","withdrawals/payment-method"],delete:["orders","orders/client:{client_oid}","orders/{id}"]}},commonCurrencies:{CGLD:"CELO"},precisionMode:o.kb,fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.004"),taker:this.parseNumber("0.006")},funding:{tierBased:!1,percentage:!1,withdraw:{BCH:0,BTC:0,LTC:0,ETH:0,EUR:.15,USD:25},deposit:{BCH:0,BTC:0,LTC:0,ETH:0,EUR:.15,USD:10}}},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:300}},spot:{extends:"default"},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"Insufficient funds":r.InsufficientFunds,NotFound:r.OrderNotFound,"Invalid API Key":r.AuthenticationError,"invalid signature":r.AuthenticationError,"Invalid Passphrase":r.AuthenticationError,"Invalid order id":r.InvalidOrder,"Private rate limit exceeded":r.RateLimitExceeded,"Trading pair not available":r.PermissionDenied,"Product not found":r.InvalidOrder},broad:{"Order already done":r.OrderNotFound,"order not found":r.OrderNotFound,"price too small":r.InvalidOrder,"price too precise":r.InvalidOrder,"under maintenance":r.OnMaintenance,"size is too small":r.InvalidOrder,"Cancel only mode":r.OnMaintenance}}})}async fetchCurrencies(e={}){const t=await this.publicGetCurrencies(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"id"),a=this.safeString(s,"name"),o=this.safeCurrencyCode(r),n=this.safeValue(s,"details",{}),d="online"===this.safeString(s,"status");i[o]={id:r,code:o,info:s,type:this.safeString(n,"type"),name:a,active:d,deposit:void 0,withdraw:void 0,fee:void 0,precision:this.safeNumber(s,"max_precision"),limits:{amount:{min:this.safeNumber(n,"min_size"),max:void 0},withdraw:{min:this.safeNumber(n,"min_withdrawal_amount"),max:void 0}},networks:{}}}return i}async fetchMarkets(e={}){const t=await this.publicGetProducts(e),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"id"),[a,o]=r.split("-"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.safeString(s,"status");i.push(this.extend(this.fees.trading,{id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:this.safeValue(s,"margin_enabled"),swap:!1,future:!1,option:!1,active:"online"===h,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(s,"base_increment"),price:this.safeNumber(s,"quote_increment")},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(s,"min_market_funds"),max:void 0}},created:void 0,info:s}))}return i}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privateGetAccounts(e);return this.parseAccounts(t,e)}parseAccount(e){const t=this.safeString(e,"currency");return{id:this.safeString(e,"id"),type:void 0,code:this.safeCurrencyCode(t),info:e}}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"hold"),o.total=this.safeString(s,"balance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccounts(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={id:this.marketId(e),level:2},r=await this.publicGetProductsIdBook(this.extend(s,i)),a=this.parseOrderBook(r,e);return a.nonce=this.safeInteger(r,"sequence"),a}parseTicker(e,t=void 0){let i,s,r,a,o,n,d,h;const c=void 0===t?void 0:t.symbol;return Array.isArray(e)?(a=this.safeString(e,4),i=this.milliseconds()):(i=this.parse8601(this.safeValue(e,"time")),s=this.safeString(e,"bid"),r=this.safeString(e,"ask"),o=this.safeString(e,"high"),n=this.safeString(e,"low"),d=this.safeString(e,"open"),a=this.safeString2(e,"price","last"),h=this.safeString(e,"volume")),this.safeTicker({symbol:c,timestamp:i,datetime:this.iso8601(i),high:o,low:n,bid:s,bidVolume:void 0,ask:r,askVolume:void 0,vwap:void 0,open:d,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:h,quoteVolume:void 0,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetProductsSparkLines(this.extend({},t)),s={},r=Object.keys(i);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeValue(i,t,[]),o=this.safeValue(a,0,[]),n=this.safeMarket(t,void 0,"-");s[n.symbol]=this.parseTicker(o,n)}return this.filterByArrayTickers(s,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={id:i.id},r=this.safeString(this.options,"fetchTickerMethod","publicGetProductsIdTicker"),a=await this[r](this.extend(s,t));return this.parseTicker(a,i)}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString2(e,"time","created_at")),s=this.safeString(e,"product_id");let r,a,o;t=this.safeMarket(s,t,"-");const n=this.safeStringLower(t,"quoteId");if(void 0!==n){const i=n+"_value";o=this.safeString(e,i);const s=this.safeString(e,"liquidity");void 0!==s&&(a="T"===s?"taker":"maker",r=this.safeString(t,a))}const d={cost:this.safeString2(e,"fill_fees","fee"),currency:t.quote,rate:r},h=this.safeString(e,"trade_id");let c="buy"===e.side?"sell":"buy";const l=this.safeString(e,"order_id"),u=this.safeString(e,"maker_order_id"),f=this.safeString(e,"taker_order_id");(void 0!==l||void 0!==u&&void 0!==f)&&(c="buy"===e.side?"buy":"sell");const p=this.safeString(e,"price"),m=this.safeString(e,"size");return this.safeTrade({id:h,order:l,info:e,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,type:void 0,takerOrMaker:a,side:c,price:p,amount:m,fee:d,cost:o},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s,100);await this.loadMarkets();const o=this.market(e),n={product_id:o.id};void 0!==i&&(n.limit=i),void 0!==t&&(n.start_date=this.iso8601(t));const d=this.safeValue2(s,"until","end_date");void 0!==d&&(s=this.omit(s,["until"]),n.end_date=this.iso8601(d));const h=await this.privateGetFills(this.extend(n,s));return this.parseTrades(h,o,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={id:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetProductsIdTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetFees(e),i=this.safeNumber(t,"maker_fee_rate"),s=this.safeNumber(t,"taker_fee_rate"),r={};for(let e=0;e<this.symbols.length;e++){const a=this.symbols[e];r[a]={info:t,symbol:a,maker:i,taker:s,percentage:!0,tierBased:!0}}return r}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,3),this.safeNumber(e,2),this.safeNumber(e,1),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,300);const o=this.market(e),n=this.safeInteger(this.timeframes,t),d={id:o.id};d.granularity=void 0!==n?n:t;const h=this.safeValue2(r,"until","end");if(r=this.omit(r,["until"]),void 0!==i)if(d.start=this.iso8601(i),s=void 0===s?300:Math.min(300,s),void 0===h){const e=1e3*n;this.isRoundNumber(i%e)?d.end=this.iso8601(this.sum((s-1)*e,i)):d.end=this.iso8601(this.sum(s*e,i))}else d.end=this.iso8601(h);const c=await this.publicGetProductsIdCandles(this.extend(d,r));return this.parseOHLCVs(c,o,t,i,s)}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.safeTimestamp(t,"epoch")}parseOrderStatus(e){return this.safeString({pending:"open",active:"open",open:"open",done:"closed",canceled:"canceled",canceling:"open"},e,e)}parseOrder(e,t=void 0){const i=this.parse8601(this.safeString(e,"created_at")),s=this.safeString(e,"product_id");t=this.safeMarket(s,t,"-");let r=this.parseOrderStatus(this.safeString(e,"status"));const a=this.safeString(e,"done_reason");"closed"===r&&"canceled"===a&&(r="canceled");const o=this.safeString(e,"price"),n=this.safeString(e,"filled_size"),d=this.safeString(e,"size",n),h=this.safeString(e,"executed_value"),c=this.safeNumber(e,"fill_fees");let l;void 0!==c&&(l={cost:c,currency:t.quote,rate:void 0});const u=this.safeString(e,"id"),f=this.safeString(e,"type"),p=this.safeString(e,"side"),m=this.safeString(e,"time_in_force"),g=this.safeValue(e,"post_only"),v=this.safeNumber(e,"stop_price"),y=this.safeString(e,"client_oid");return this.safeOrder({id:u,clientOrderId:y,info:e,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,status:r,symbol:t.symbol,type:f,timeInForce:m,postOnly:g,side:p,price:o,triggerPrice:v,cost:h,amount:d,filled:n,remaining:void 0,fee:l,average:void 0,trades:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},r=this.safeString2(i,"clientOrderId","client_oid");let a;void 0===r?(a="privateGetOrdersId",s.id=e):(a="privateGetOrdersClientClientOid",s.client_oid=r,i=this.omit(i,["clientOrderId","client_oid"]));const o=await this[a](this.extend(s,i));return this.parseOrder(o)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={order_id:e},n=await this.privateGetFills(this.extend(o,r));return this.parseTrades(n,a,i,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOpenOrders(e,t,i,this.extend({status:"all"},s))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchOpenOrders",e,t,i,s,100);const a={};let o;void 0!==e&&(o=this.market(e),a.product_id=o.id),void 0!==i&&(a.limit=i),void 0!==t&&(a.start_date=this.iso8601(t));const n=this.safeValue2(s,"until","end_date");void 0!==n&&(s=this.omit(s,["until"]),a.end_date=this.iso8601(n));const d=await this.privateGetOrders(this.extend(a,s));return this.parseOrders(d,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOpenOrders(e,t,i,this.extend({status:"done"},s))}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={type:t,side:i,product_id:o.id},d=this.safeString2(a,"clientOrderId","client_oid");void 0!==d&&(n.client_oid=d);const h=this.safeNumberN(a,["stopPrice","stop_price","triggerPrice"]);void 0!==h&&(n.stop_price=this.priceToPrecision(e,h));const c=this.safeString2(a,"timeInForce","time_in_force");void 0!==c&&(n.time_in_force=c);if(this.safeValue2(a,"postOnly","post_only",!1)&&(n.post_only=!0),a=this.omit(a,["timeInForce","time_in_force","stopPrice","stop_price","clientOrderId","client_oid","postOnly","post_only","triggerPrice"]),"limit"===t)n.price=this.priceToPrecision(e,r),n.size=this.amountToPrecision(e,s);else if("market"===t){let t=this.safeNumber2(a,"cost","funds");void 0===t?void 0!==r&&(t=s*r):a=this.omit(a,["cost","funds"]),void 0!==t?n.funds=this.costToPrecision(e,t):n.size=this.amountToPrecision(e,s)}const l=await this.privatePostOrders(this.extend(n,a));return this.parseOrder(l,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},r=this.safeString2(i,"clientOrderId","client_oid");let a,o;return void 0===r?(a="privateDeleteOrdersId",s.id=e):(a="privateDeleteOrdersClientClientOid",s.client_oid=r,i=this.omit(i,["clientOrderId","client_oid"])),void 0!==t&&(o=this.market(t),s.product_id=o.symbol),await this[a](this.extend(s,i))}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;return void 0!==e&&(s=this.market(e),i.product_id=s.symbol),await this.privateDeleteOrders(this.extend(i,t))}async fetchPaymentMethods(e={}){return await this.privateGetPaymentMethods(e)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n={currency:o.id,amount:t};let d="privatePostWithdrawals";"payment_method_id"in a?d+="PaymentMethod":"coinbase_account_id"in a?d+="CoinbaseAccount":(d+="Crypto",n.crypto_address=i,void 0!==s&&(n.destination_tag=s));const h=await this[d](this.extend(n,a));if(!h)throw new r.ExchangeError(this.id+" withdraw() error: "+this.json(h));return this.parseTransaction(h,o)}parseLedgerEntryType(e){return this.safeString({transfer:"transfer",match:"trade",fee:"fee",rebate:"rebate",conversion:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"id");let s,r=this.safeString(e,"amount");const o=this.safeString(e,"balance"),n=a.Y.stringSub(o,r);a.Y.stringLt(r,"0")?(s="out",r=a.Y.stringAbs(r)):s="in";const d=this.parseNumber(r),h=this.parseNumber(o),c=this.parseNumber(n),l=this.parse8601(this.safeValue(e,"created_at")),u=this.parseLedgerEntryType(this.safeString(e,"type")),f=this.safeCurrencyCode(void 0,t),p=this.safeValue(e,"details",{});let m,g,v;"transfer"===u?(m=this.safeString(p,"from"),g=this.safeString(p,"to"),v=this.safeString(p,"profile_transfer_id")):v=this.safeString(p,"order_id");return this.safeLedgerEntry({info:e,id:i,timestamp:l,datetime:this.iso8601(l),direction:s,account:m,referenceAccount:g,referenceId:v,type:u,currency:f,amount:d,before:c,after:h,status:"ok",fee:void 0},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchLedger() requires a code param");await this.loadMarkets(),await this.loadAccounts();const a=this.currency(e),o=this.indexBy(this.accounts,"code"),n=this.safeValue(o,e);if(void 0===n)throw new r.ExchangeError(this.id+" fetchLedger() could not find account id for "+e);const d={id:n.id};void 0!==t&&(d.start_date=this.iso8601(t)),void 0!==i&&(d.limit=i);const h=this.safeValue2(s,"until","end_date");void 0!==h&&(s=this.omit(s,["until"]),d.end_date=this.iso8601(h));const c=await this.privateGetAccountsIdLedger(this.extend(d,s));for(let t=0;t<c.length;t++)c[t].currency=e;return this.parseLedger(c,a,t,i)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),await this.loadAccounts();let o=this.safeString(s,"id");if(void 0===o&&void 0!==e){a=this.currency(e);const t=this.indexBy(this.accounts,"code"),i=this.safeValue(t,e);if(void 0===i)throw new r.ExchangeError(this.id+" fetchDepositsWithdrawals() could not find account id for "+e);o=i.id}const n={};let d;if(void 0!==o&&(n.id=o),void 0!==i&&(n.limit=i),void 0===o){d=await this.privateGetTransfers(this.extend(n,s));for(let e=0;e<d.length;e++){const t=this.safeString(d[e],"account_id"),i=this.safeValue(this.accountsById,t),s=this.safeString(i,"code");d[e].currency=s}}else{d=await this.privateGetAccountsIdTransfers(this.extend(n,s));for(let t=0;t<d.length;t++)d[t].currency=e}return this.parseTransactions(d,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({type:"deposit"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({type:"withdraw"},s))}parseTransactionStatus(e){if(this.safeValue(e,"canceled_at"))return"canceled";const t=this.safeValue(e,"processed_at"),i=this.safeValue(e,"completed_at");return i?"ok":t&&!i?"failed":"pending"}parseTransaction(e,t=void 0){const i=this.safeValue(e,"details",{}),s=this.parse8601(this.safeString(e,"created_at")),r=this.safeString(e,"currency"),a=this.safeCurrencyCode(r,t);let o=this.safeNumber(e,"amount"),n=this.safeString(e,"type"),d=this.safeString(i,"crypto_address");d=this.safeString(e,"crypto_address",d);const h={currency:void 0,cost:void 0,rate:void 0};if("withdraw"===n){n="withdrawal",d=this.safeString(i,"sent_to_address",d);const e=this.safeNumber(i,"fee");void 0!==e&&(void 0!==o&&(o-=e),h.cost=e,h.currency=a)}const c=this.safeString(i,"network");return{info:e,id:this.safeString(e,"id"),txid:this.safeString(i,"crypto_transaction_hash"),type:n,currency:a,network:this.networkIdToCode(c),amount:o,status:this.parseTransactionStatus(e),timestamp:s,datetime:this.iso8601(s),address:d,addressFrom:void 0,addressTo:this.safeString(i,"crypto_address"),tag:this.safeString(i,"destination_tag"),tagFrom:void 0,tagTo:void 0,updated:this.parse8601(this.safeString(e,"processed_at")),comment:void 0,internal:!1,fee:h}}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e);let s=this.safeValue(this.options,"coinbaseAccounts");void 0===s&&(s=await this.privateGetCoinbaseAccounts(),this.options.coinbaseAccounts=s,this.options.coinbaseAccountsByCurrencyId=this.indexBy(s,"currency"));const a=i.id,o=this.safeValue(this.options.coinbaseAccountsByCurrencyId,a);if(void 0===o)throw new r.InvalidAddress(this.id+" createDepositAddress() could not find currency code "+e+" with id = "+a+" in this.options['coinbaseAccountsByCurrencyId']");const n={id:o.id},d=await this.privatePostCoinbaseAccountsIdAddresses(this.extend(n,t)),h=this.safeString(d,"address"),c=this.safeString(d,"destination_tag");return{currency:e,address:this.checkAddress(h),tag:c,info:d}}sign(e,t="public",i="GET",s={},a=void 0,o=void 0){let d="/"+this.implodeParams(e,s);const h=this.omit(s,this.extractParams(e));"GET"===i&&Object.keys(h).length&&(d+="?"+this.urlencode(h));const c=this.implodeHostname(this.urls.api[t])+d;if("private"===t){this.checkRequiredCredentials();const e=this.nonce().toString();let t="";"GET"!==i&&Object.keys(h).length&&(t=o=this.json(h));const s=e+i+d+t;let c;try{c=this.base64ToBinary(this.secret)}catch(e){throw new r.AuthenticationError(this.id+" sign() invalid base64 secret")}const l=this.hmac(this.encode(s),c,n.s,"base64");a={"CB-ACCESS-KEY":this.apiKey,"CB-ACCESS-SIGN":l,"CB-ACCESS-TIMESTAMP":e,"CB-ACCESS-PASSPHRASE":this.password,"Content-Type":"application/json"}}return{url:c,method:i,body:o,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){if(400===e||404===e){if("{"===o[0]){const e=this.safeString(n,"message"),t=this.id+" "+e;throw this.throwExactlyMatchedException(this.exceptions.exact,e,t),this.throwBroadlyMatchedException(this.exceptions.broad,e,t),new r.ExchangeError(t)}throw new r.ExchangeError(this.id+" "+o)}}async request(e,t="public",i="GET",s={},a=void 0,o=void 0,n={}){const d=await this.fetch2(e,t,i,s,a,o,n);if("string"!=typeof d&&"message"in d)throw new r.ExchangeError(this.id+" "+this.json(d));return d}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinbaseinternational",name:"Coinbase International",countries:["US"],certified:!1,pro:!0,rateLimit:100,version:"v1",userAgent:this.userAgents.chrome,headers:{"CB-VERSION":"2018-05-30"},has:{CORS:!0,spot:!0,margin:!0,swap:!0,future:!0,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createLimitBuyOrder:!0,createLimitSellOrder:!0,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrder:!0,createMarketSellOrderWithCost:!1,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposits:!0,fetchFundingHistory:!0,fetchFundingRate:!1,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL2OrderBook:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyBuys:!0,fetchMySells:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!1,fetchOrders:!1,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!1,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfers:!0,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!0,setLeverage:!1,setMargin:!0,setMarginMode:!1,setPositionMode:!1,withdraw:!0},urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/866ae638-6ab5-4ebf-ab2c-cdcce9545625",api:{rest:"https://api.international.coinbase.com/api"},test:{rest:"https://api-n5e1.coinbase.com/api"},www:"https://international.coinbase.com",doc:["https://docs.cloud.coinbase.com/intx/docs"],fees:["https://help.coinbase.com/en/international-exchange/trading-deposits-withdrawals/international-exchange-fees"],referral:""},requiredCredentials:{apiKey:!0,secret:!0,password:!0},api:{v1:{public:{get:["assets","assets/{assets}","assets/{asset}/networks","instruments","instruments/{instrument}","instruments/{instrument}/quote","instruments/{instrument}/funding","instruments/{instrument}/candles"]},private:{get:["orders","orders/{id}","portfolios","portfolios/{portfolio}","portfolios/{portfolio}/detail","portfolios/{portfolio}/summary","portfolios/{portfolio}/balances","portfolios/{portfolio}/balances/{asset}","portfolios/{portfolio}/positions","portfolios/{portfolio}/positions/{instrument}","portfolios/fills","portfolios/{portfolio}/fills","transfers","transfers/{transfer_uuid}"],post:["orders","portfolios","portfolios/margin","portfolios/transfer","transfers/withdraw","transfers/address","transfers/create-counterparty-id","transfers/validate-counterparty-id","transfers/withdraw/counterparty"],put:["orders/{id}","portfolios/{portfolio}"],delete:["orders","orders/{id}"]}}},fees:{trading:{taker:this.parseNumber("0.004"),maker:this.parseNumber("0.002"),tierBased:!0,percentage:!0,tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("1000000"),this.parseNumber("0.004")],[this.parseNumber("5000000"),this.parseNumber("0.0035")],[this.parseNumber("10000000"),this.parseNumber("0.0035")],[this.parseNumber("50000000"),this.parseNumber("0.003")],[this.parseNumber("250000000"),this.parseNumber("0.0025")]],maker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("1000000"),this.parseNumber("0.0016")],[this.parseNumber("5000000"),this.parseNumber("0.001")],[this.parseNumber("10000000"),this.parseNumber("0.0008")],[this.parseNumber("50000000"),this.parseNumber("0.0005")],[this.parseNumber("250000000"),this.parseNumber("0")]]}}},precisionMode:o.kb,exceptions:{exact:{},broad:{DUPLICATE_CLIENT_ORDER_ID:r.DuplicateOrderId,"Order rejected":r.InvalidOrder,"market orders must be IoC":r.InvalidOrder,"tif is required":r.InvalidOrder,"Invalid replace order request":r.InvalidOrder,Unauthorized:r.PermissionDenied,"invalid result_limit":r.BadRequest,"is a required field":r.BadRequest,"Not Found":r.BadRequest,"ip not allowed":r.AuthenticationError}},timeframes:{"1m":"ONE_MINUTE","5m":"FIVE_MINUTE","15m":"FIFTEEN_MINUTE","30m":"THIRTY_MINUTE","1h":"ONE_HOUR","2h":"TWO_HOUR","6h":"SIX_HOUR","1d":"ONE_DAY"},options:{brokerId:"nfqkvdjp",portfolio:"",withdraw:{method:"v1PrivatePostTransfersWithdraw"},networksById:{ethereum:"ETH",arbitrum:"ARBITRUM",avacchain:"AVAX",optimism:"OPTIMISM",polygon:"MATIC",solana:"SOL",bitcoin:"BTC"}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0,GTC:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!0,selfTradePrevention:!0,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:1e4,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:300}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:void 0,inverse:void 0}}})}async handlePortfolioAndParams(e,t={}){let i;if([i,t]=this.handleOptionAndParams(t,e,"portfolio"),void 0!==i&&""!==i)return[i,t];const s=this.safeString(this.options,"portfolio");if(void 0!==s&&""!==s)return[s,t];const a=await this.fetchAccounts();for(let e=0;e<a.length;e++){const i=a[e],s=this.safeDict(i,"info",{});if(this.safeBool(s,"is_default")){const e=this.safeString(s,"portfolio_id");return this.options.portfolio=e,[e,t]}}throw new r.ArgumentsRequired(this.id+" "+e+'() requires a portfolio parameter or set the default portfolio with this.options["portfolio"]')}async handleNetworkIdAndParams(e,t,i){let s;if([s,i]=this.handleOptionAndParams(i,t,"network_arn_id"),void 0===s){await this.loadCurrencyNetworks(e);const t=this.currencies[e].networks,a=this.safeString2(i,"networkCode","network");if(void 0===a){if(this.isEmpty(t))throw new r.BadRequest(this.id+" createDepositAddress network not found for currency "+e+" please specify networkId in params");s=this.findDefaultNetwork(t).id}else s=this.networkCodeToId(a,e)}return[s,i]}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.v1PrivateGetPortfolios(e);return this.parseAccounts(t,e)}parseAccount(e){return{id:this.safeString2(e,"portfolio_id","portfolio_uuid"),type:void 0,code:void 0,info:e}}async fetchOHLCV(e,t="1m",i=void 0,s=100,a={}){await this.loadMarkets();let o=!1;if([o,a]=this.handleOptionAndParams(a,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,a,1e4);const n=this.market(e),d={instrument:n.id,granularity:this.safeString(this.timeframes,t,t)};if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchOHLCV() requires a since argument");d.start=this.iso8601(i);const h=this.safeInteger(a,"until");void 0!==h&&(a=this.omit(a,"until"),d.end=this.iso8601(h));const c=await this.v1PublicGetInstrumentsInstrumentCandles(this.extend(d,a)),l=this.safeList(c,"aggregations",[]);return this.parseOHLCVs(l,n,t,i,s)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString2(e,"start","time")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a,o=!1;[o,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),[a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","maxEntriesPerRequest",100);const n="ccxtPageKey";if(o)return await this.fetchPaginatedCallIncremental("fetchFundingRateHistory",e,t,i,s,n,a);const d=this.market(e),h=this.safeInteger(s,n,1)-1,c={instrument:d.id,result_offset:this.safeInteger2(s,"offset","result_offset",h*a)};void 0!==i&&(c.result_limit=i);const l=await this.v1PublicGetInstrumentsInstrumentFunding(this.extend(c,s)),u=this.safeList(l,"results",[]);return this.parseFundingRateHistories(u,d,t,i)}parseFundingRateHistory(e,t=void 0){return this.parseFundingRate(e,t)}parseFundingRate(e,t=void 0){const i=this.safeString2(e,"event_time","time");return{info:e,symbol:this.safeSymbol(void 0,t),markPrice:this.safeNumber(e,"mark_price"),indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:this.parse8601(i),datetime:i,fundingRate:this.safeNumber(e,"funding_rate"),fundingTimestamp:this.parse8601(i),fundingDatetime:i,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={type:"FUNDING"};let a,o;void 0!==e&&(a=this.market(e)),[o,s]=this.handleOptionAndParams(s,"fetchFundingHistory","portfolios"),void 0!==o&&(r.portfolios=o),void 0!==t&&(r.time_from=this.iso8601(t)),r.result_limit=void 0!==i?i:100;const n=await this.v1PrivateGetTransfers(this.extend(r,s)),d=this.safeList(n,"results",[]);return this.parseIncomes(d,a,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeInteger(e,"created_at"),r=this.parse8601(s),a=this.safeString(e,"asset"),o=this.safeCurrencyCode(a);return{info:e,symbol:t.symbol,code:o,timestamp:r,datetime:this.iso8601(r),id:this.safeString(e,"transfer_uuid"),amount:this.safeNumber(e,"amount"),rate:void 0}}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={type:"INTERNAL"};let a,o;void 0!==e&&(a=this.currency(e)),[o,s]=this.handleOptionAndParams(s,"fetchTransfers","portfolios"),void 0!==o&&(r.portfolios=o),void 0!==t&&(r.time_from=this.iso8601(t)),r.result_limit=void 0!==i?i:100;const n=await this.v1PrivateGetTransfers(this.extend(r,s)),d=this.safeList(n,"results",[]);return this.parseTransfers(d,a,t,i)}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"created_at"),s=this.parse8601(i),r=this.safeString(e,"asset"),a=this.safeCurrencyCode(r),o=this.safeDict(e,"from_portfolio",{}),n=this.safeString(o,"id"),d=this.safeDict(e,"to_portfolio",{}),h=this.safeString(d,"id");return{info:e,id:this.safeString(e,"transfer_uuid"),timestamp:s,datetime:this.iso8601(s),currency:a,amount:this.safeNumber(e,"amount"),fromAccount:n,toAccount:h,status:this.parseTransferStatus(this.safeString(e,"status"))}}parseTransferStatus(e){return this.safeString({FAILED:"failed",PROCESSED:"ok",NEW:"pending",STARTED:"pending"},e,e)}async createDepositAddress(e,t={}){let i,s;await this.loadMarkets(),[i,t]=this.handleOptionAndParams(t,"createDepositAddress","method","v1PrivatePostTransfersAddress"),[s,t]=await this.handlePortfolioAndParams("createDepositAddress",t);const r={portfolio:s};if("v1PrivatePostTransfersAddress"===i){const i=this.currency(e);let s;r.asset=i.id,[s,t]=await this.handleNetworkIdAndParams(e,"createDepositAddress",t),r.network_arn_id=s}const a=await this[i](this.extend(r,t));return{currency:e,tag:this.safeString(a,"destination_tag"),address:this.safeString2(a,"address","counterparty_id"),info:a}}findDefaultNetwork(e){const t=this.toArray(e);for(let e=0;e<t.length;e++){const i=t[e].info;if(!0===this.safeBool(i,"is_default",!1))return t[e]}return t[0]}async loadCurrencyNetworks(e,t={}){const i=this.currency(e);if(void 0!==this.safeDict(i,"networks"))return!1;const s={asset:i.id},r=await this.v1PublicGetAssetsAssetNetworks(s);return i.networks=this.parseNetworks(r),!0}parseNetworks(e,t={}){const i={};for(let s=0;s<e.length;s++){const r=this.extend(this.parseNetwork(e[s]),t);i[r.network]=r}return i}parseNetwork(e,t={}){const i=this.safeString(e,"asset_name"),s=this.safeCurrencyCode(i),r=this.safeString(e,"network_arn_id"),a=this.safeStringN(e,["network_name","display_name","network_arn_id"],"");return this.safeNetwork({info:e,id:r,name:this.safeString(e,"display_name"),network:this.networkIdToCode(a,s),active:void 0,deposit:void 0,withdraw:void 0,precision:void 0,fee:void 0,limits:{withdraw:{min:this.safeNumber(e,"min_withdrawal_amt"),max:this.safeNumber(e,"max_withdrawal_amt")},deposit:{min:void 0,max:void 0}}})}async setMargin(e,t,i={}){let s;if([s,i]=await this.handlePortfolioAndParams("setMargin",i),void 0!==e)throw new r.BadRequest(this.id+" setMargin() only allows setting margin to full portfolio");const a={portfolio:s,margin_override:t};return await this.v1PrivatePostPortfoliosMargin(this.extend(a,i))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets(),[r,s]=this.handleOptionAndParams(s,"fetchDepositsWithdrawals","paginate"),[a,s]=this.handleOptionAndParams(s,"fetchDepositsWithdrawals","maxEntriesPerRequest",100);const o="ccxtPageKey";if(r)return await this.fetchPaginatedCallIncremental("fetchDepositsWithdrawals",e,t,i,s,o,a);const n=this.safeInteger(s,o,1)-1,d={result_offset:this.safeInteger2(s,"offset","result_offset",n*a)};if(void 0!==t&&(d.time_from=this.iso8601(t)),void 0!==i){const e=Math.min(i,100);d.result_limit=e}let h,c;[h,s]=this.handleOptionAndParams(s,"fetchDepositsWithdrawals","portfolios"),void 0!==h&&(d.portfolios=h),[c,s]=this.handleOptionAndParams(s,"fetchDepositsWithdrawals","until"),void 0!==c&&(d.time_to=this.iso8601(c));const l=await this.v1PrivateGetTransfers(this.extend(d,s)),u=this.safeList(l,"results",[]);return this.parseTransactions(u)}async fetchPosition(e,t={}){let i;await this.loadMarkets(),e=this.symbol(e),[i,t]=await this.handlePortfolioAndParams("fetchPosition",t);const s={portfolio:i,instrument:this.marketId(e)},r=await this.v1PrivateGetPortfoliosPortfolioPositionsInstrument(this.extend(s,t));return this.parsePosition(r)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");let s=this.safeString(e,"net_size");t=this.safeMarket(i,t,"-");let r="long";return a.Y.stringLe(s,"0")&&(r="short",s=a.Y.stringMul("-1",s)),this.safePosition({info:e,id:this.safeString(e,"id"),symbol:t.symbol,entryPrice:void 0,markPrice:this.safeNumber(e,"mark_price"),notional:void 0,collateral:void 0,unrealizedPnl:this.safeNumber(e,"unrealized_pnl"),side:r,contracts:this.parseNumber(s),contractSize:this.safeNumber(t,"contractSize"),timestamp:void 0,datetime:void 0,hedged:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,initialMargin:this.safeNumber(e,"im_contribution"),initialMarginPercentage:void 0,leverage:void 0,liquidationPrice:void 0,marginRatio:void 0,marginMode:void 0,percentage:void 0})}async fetchPositions(e=void 0,t={}){let i;await this.loadMarkets(),[i,t]=await this.handlePortfolioAndParams("fetchPositions",t);const s={portfolio:i},r=await this.v1PrivateGetPortfoliosPortfolioPositions(this.extend(s,t)),a=this.parsePositions(r);return this.isEmpty(e)?a:(e=this.marketSymbols(e),this.filterByArrayPositions(a,"symbol",e,!1))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.loadMarkets(),s.type="WITHDRAW",await this.fetchDepositsWithdrawals(e,t,i,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.loadMarkets(),s.type="DEPOSIT",await this.fetchDepositsWithdrawals(e,t,i,s)}parseTransactionStatus(e){return this.safeString({PROCESSED:"ok",NEW:"pending",STARTED:"pending",FAILED:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"updated_at"),s=this.safeDict(e,"from_portfolio",{}),r=this.safeStringN(e,["from_address","from_cb_account",this.safeStringN(s,["id","uuid","name"]),"from_counterparty_id"]),a=this.safeDict(e,"from_portfolio",{}),o=this.safeStringN(e,["to_address","to_cb_account",this.safeStringN(a,["id","uuid","name"]),"to_counterparty_id"]);return{info:e,id:this.safeString(e,"transfer_uuid"),txid:this.safeString(e,"transaction_uuid"),timestamp:this.parse8601(i),datetime:i,network:this.networkIdToCode(this.safeString(e,"network_name")),address:void 0,addressTo:o,addressFrom:r,tag:void 0,tagTo:void 0,tagFrom:void 0,type:this.safeString(e,"resource"),amount:this.safeNumber(e,"amount"),currency:this.safeCurrencyCode(this.safeString(e,"asset"),t),status:this.parseTransactionStatus(this.safeString(e,"status")),updated:this.parse8601(i),fee:{cost:void 0,currency:void 0}}}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"event_time");return this.safeTrade({info:e,id:this.safeString2(e,"fill_id","exec_id"),order:this.safeString(e,"order_id"),timestamp:this.parse8601(s),datetime:s,symbol:this.safeSymbol(i,t),type:void 0,side:this.safeStringLower(e,"side"),takerOrMaker:void 0,price:this.safeNumber(e,"fill_price"),amount:this.safeNumber(e,"fill_qty"),cost:void 0,fee:{cost:this.safeNumber(e,"fee"),currency:this.safeCurrencyCode(this.safeString(e,"fee_asset"))}})}async fetchMarkets(e={}){const t=await this.v1PublicGetInstruments(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"base_asset_name"),s=this.safeString(e,"quote_asset_name"),r="SPOT"===this.safeString(e,"type"),a=this.fees;let o,n=i+"/"+s;return r||(o=s,n+=":"+s),{id:t,lowercaseId:t.toLowerCase(),symbol:n,base:i,quote:s,settle:o||void 0,baseId:i,quoteId:s,settleId:o||void 0,type:r?"spot":"swap",spot:r,margin:!1,swap:!r,future:!1,option:!1,active:"TRADING"===this.safeString(e,"trading_state"),contract:!r,linear:r?void 0:o===s,inverse:r?void 0:o!==s,taker:a.trading.taker,maker:a.trading.maker,contractSize:r?void 0:1,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"base_increment"),price:this.safeNumber(e,"quote_increment"),cost:this.safeNumber(e,"quote_increment")},limits:{leverage:{min:void 0,max:this.safeNumber(e,"base_imf")},amount:{min:void 0,max:r?void 0:this.safeNumber(e,"position_limit_qty")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"min_notional_value"),max:void 0}},info:e,created:void 0}}async fetchCurrencies(e={}){const t=await this.v1PublicGetAssets(e);return this.parseCurrencies(t)}parseCurrency(e){const t=this.safeString(e,"asset_name"),i=this.safeCurrencyCode(t),s=this.safeString(e,"status");return this.safeCurrencyStructure({id:t,name:i,code:i,precision:void 0,info:e,active:"ACTIVE"===s,deposit:void 0,withdraw:void 0,networks:void 0,fee:void 0,fees:void 0,limits:this.limits})}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v1PublicGetInstruments(t),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeSymbol(r),o=this.safeDict(t,"quote",{});s[a]=this.parseTicker(o,this.safeMarket(r))}return this.filterByArray(s,"symbol",e,!0)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument:this.marketId(e)},r=await this.v1PublicGetInstrumentsInstrumentQuote(this.extend(s,t));return this.parseTicker(r,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"timestamp");return this.safeTicker({info:e,symbol:this.safeSymbol(void 0,t),timestamp:this.parse8601(i),datetime:i,bid:this.safeNumber(e,"best_bid_price"),bidVolume:this.safeNumber(e,"best_bid_size"),ask:this.safeNumber(e,"best_ask_price"),askVolume:this.safeNumber(e,"best_ask_size"),high:void 0,low:void 0,open:void 0,close:void 0,last:void 0,change:void 0,percentage:void 0,average:void 0,vwap:void 0,baseVolume:void 0,quoteVolume:void 0,previousClose:void 0,markPrice:this.safeNumber(e,"mark_price"),indexPrice:this.safeNumber(e,"index_price")})}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=await this.handlePortfolioAndParams("fetchBalance",e);const i={portfolio:t},s=await this.v1PrivateGetPortfoliosPortfolioBalances(this.extend(i,e));return this.parseBalance(s)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"asset_name"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"quantity"),o.used=this.safeString(s,"hold"),t[a]=o}return this.safeBalance(t)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a={asset:this.currency(e).id,ammount:t,from:i,to:s},o=await this.v1PrivatePostPortfoliosTransfer(this.extend(a,r));return{info:o,id:void 0,timestamp:void 0,datetime:void 0,currency:e,amount:t,fromAccount:i,toAccount:s,status:this.safeBool(o,"success")?"ok":"failed"}}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);let d=t.toUpperCase();const h=this.safeNumberN(o,["triggerPrice","stopPrice","stop_price"]);let c=this.safeString(this.options,"brokerId","nfqkvdjp")+"-"+this.uuid();c=c.slice(0,17);const l={client_order_id:c,side:i.toUpperCase(),instrument:n.id,size:this.amountToPrecision(n.symbol,s)};if(void 0!==h&&(d="limit"===t?"STOP_LIMIT":"STOP",l.stop_price=h),l.type=d,"limit"===t){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires a price parameter for a limit order types");l.price=a}let u;[u,o]=await this.handlePortfolioAndParams("createOrder",o),void 0!==u&&(l.portfolio=u);const f=this.safeBool2(o,"postOnly","post_only");let p=this.safeString2(o,"tif","timeInForce");if("MARKET"===d){if(void 0!==p&&"IOC"!==p)throw new r.InvalidOrder(this.id+' createOrder() market orders must have tif set to "IOC"');p="IOC"}else p=void 0===p?"GTC":p;void 0!==f&&(l.post_only=f),l.tif=p,o=this.omit(o,["client_order_id","user","postOnly","timeInForce"]);const m=await this.v1PrivatePostOrders(this.extend(l,o));return this.parseOrder(m,n)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeNumber(e,"fee");let r;void 0!==s&&(r={cost:s});const a=this.safeString2(e,"submit_time","event_time");return this.safeOrder({info:e,id:this.safeString(e,"order_id"),clientOrderId:this.safeString(e,"client_order_id"),timestamp:this.parse8601(a),datetime:a,lastTradeTimestamp:void 0,symbol:this.safeSymbol(i,t),type:this.parseOrderType(this.safeString(e,"type")),timeInForce:this.safeString(e,"tif"),postOnly:void 0,side:this.safeStringLower(e,"side"),price:this.safeString(e,"price"),triggerPrice:this.safeString(e,"stop_price"),amount:this.safeString(e,"size"),filled:this.safeString(e,"exec_qty"),remaining:this.safeString(e,"leaves_qty"),cost:void 0,average:this.safeString(e,"avg_price"),status:this.parseOrderStatus(this.safeString(e,"order_status")),fee:r,trades:void 0},t)}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIAL_FILLED:"open",FILLED:"closed",CANCELED:"canceled",REPLACED:"canceled",PENDING_CANCEL:"open",REJECTED:"rejected",PENDING_NEW:"open",EXPIRED:"expired",PENDING_REPLACE:"open"},e,e)}parseOrderType(e){if("UNKNOWN_ORDER_TYPE"===e)return;return this.safeString({MARKET:"market",LIMIT:"limit",STOP:"limit",STOP_LIMIT:"limit"},e,e)}async cancelOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),[s,i]=await this.handlePortfolioAndParams("cancelOrder",i);const r={portfolio:s,id:e};let a;void 0!==t&&(a=this.market(t));const o=await this.v1PrivateDeleteOrdersId(this.extend(r,i));return this.parseOrder(o,a)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets(),[i,t]=await this.handlePortfolioAndParams("cancelAllOrders",t);const s={portfolio:i};let r;e&&(r=this.market(e),s.instrument=r.id);const a=await this.v1PrivateDeleteOrders(this.extend(s,t));return this.parseOrders(a,r)}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t),h={id:e};let c;[c,n]=await this.handlePortfolioAndParams("editOrder",n),void 0!==c&&(h.portfolio=c),void 0!==a&&(h.size=this.amountToPrecision(t,a)),void 0!==o&&(h.price=this.priceToPrecision(t,o));const l=this.safeNumberN(n,["stopPrice","stop_price","triggerPrice"]);void 0!==l&&(h.stop_price=l);const u=this.safeString2(n,"client_order_id","clientOrderId");if(void 0===u)throw new r.BadRequest(this.id+" editOrder() requires a clientOrderId parameter");h.client_order_id=u;const f=await this.v1PrivatePutOrdersId(this.extend(h,n));return this.parseOrder(f,d)}async fetchOrder(e,t=void 0,i={}){let s,r;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),[r,i]=await this.handlePortfolioAndParams("fetchOrder",i);const a={id:e,portfolio:r},o=await this.v1PrivateGetOrdersId(this.extend(a,i));return this.parseOrder(o,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),[a,s]=await this.handlePortfolioAndParams("fetchOpenOrders",s);let o,n=!1;[n,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),[o,s]=this.handleOptionAndParams(s,"fetchOpenOrders","maxEntriesPerRequest",100);const d="ccxtPageKey";if(n)return await this.fetchPaginatedCallIncremental("fetchOpenOrders",e,t,i,s,d,o);const h=this.safeInteger(s,d,1)-1,c={portfolio:a,result_offset:this.safeInteger2(s,"offset","result_offset",h*o)};let l;if(e&&(l=this.market(e),c.instrument=e),void 0!==i){if(i>100)throw new r.BadRequest(this.id+" fetchOpenOrders() maximum limit is 100");c.result_limit=i}void 0!==t&&(c.ref_datetime=this.iso8601(t));const u=await this.v1PrivateGetOrders(this.extend(c,s)),f=this.safeList(u,"results",[]);return this.parseOrders(f,l,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a=!1;[a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate");const o="ccxtPageKey";let n,d;if([n,s]=this.handleOptionAndParams(s,"fetchMyTrades","maxEntriesPerRequest",100),a)return await this.fetchPaginatedCallIncremental("fetchMyTrades",e,t,i,s,o,n);void 0!==e&&(d=this.market(e));const h=this.safeInteger(s,o,1)-1,c={result_offset:this.safeInteger2(s,"offset","result_offset",h*n)};if(void 0!==i){if(i>100)throw new r.BadRequest(this.id+" fetchMyTrades() maximum limit is 100. Consider setting paginate to true to fetch more trades.");c.result_limit=i}void 0!==t&&(c.time_from=this.iso8601(t));const l=this.safeStringN(s,["until"]);void 0!==l&&(s=this.omit(s,["until"]),c.ref_datetime=this.iso8601(l));const u=await this.v1PrivateGetPortfoliosFills(this.extend(c,s)),f=this.safeList(u,"results",[]);return this.parseTrades(f,d,t,i)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e);let o,n,d;[o,r]=await this.handlePortfolioAndParams("withdraw",r),[n,r]=this.handleOptionAndParams(r,"withdraw","method","v1PrivatePostTransfersWithdraw"),[d,r]=await this.handleNetworkIdAndParams(e,"withdraw",r);const h={portfolio:o,type:"send",asset:a.id,address:i,amount:t,currency:a.id,network_arn_id:d,nonce:this.nonce()},c=await this[n](this.extend(h,r));return this.parseTransaction(c,a)}safeNetwork(e){let t=this.safeBool(e,"withdraw"),i=this.safeBool(e,"deposit");const s=this.safeDict(e,"limits"),r=this.safeDict(s,"withdraw"),a=this.safeNumber(r,"max"),o=this.safeDict(s,"deposit"),n=this.safeNumber(o,"max");void 0===t&&void 0!==a&&(t=a>0),void 0===i&&void 0!==n&&(i=n>0);const d=this.safeString(e,"id"),h=t&&i;return{info:e.info,id:d,name:this.safeString(e,"name"),network:this.safeString(e,"network"),active:this.safeBool(e,"active",h),deposit:i,withdraw:t,fee:this.safeNumber(e,"fee"),precision:this.safeNumber(e,"precision"),limits:{withdraw:{min:this.safeNumber(r,"min"),max:a},deposit:{min:this.safeNumber(o,"min"),max:n}}}}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){const o=t[0],d="private"===t[1];let h="/"+o+"/"+this.implodeParams(e,s);const c=this.omit(s,this.extractParams(e)),l="/api"+h;"GET"!==i&&"DELETE"!==i||Object.keys(c).length&&(h+="?"+this.urlencodeWithArrayRepeat(c));const u=this.urls.api.rest+h;if(d){this.checkRequiredCredentials();const e=this.nonce().toString();let t="";"GET"!==i&&Object.keys(c).length&&(t=a=this.json(c));const s=e+i+l+t;r={"CB-ACCESS-TIMESTAMP":e,"CB-ACCESS-SIGN":this.hmac(this.encode(s),this.base64ToBinary(this.secret),n.s,"base64"),"CB-ACCESS-PASSPHRASE":this.password,"CB-ACCESS-KEY":this.apiKey}}return{url:u,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.id+" "+o,l=this.safeString(n,"title");if(void 0!==l)throw this.throwExactlyMatchedException(this.exceptions.exact,l,c),this.throwBroadlyMatchedException(this.exceptions.broad,l,c),new r.ExchangeError(c)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coincatch",name:"CoinCatch",countries:["VG"],rateLimit:50,version:"v1",certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,addMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!0,cancelWithdraw:!1,closePosition:!1,createConvertTrade:!1,createDepositAddress:!1,createLimitBuyOrder:!0,createLimitSellOrder:!0,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrder:!0,createMarketOrderWithCost:!1,createMarketSellOrder:!0,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchConvertTrade:!1,fetchConvertTradeHistory:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!0,fetchPositions:!0,fetchPositionsForSymbol:!0,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!0,reduceMargin:!0,sandbox:!1,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!0,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m",15:"15m",30:"30m","1h":"1H","2h":"2H","4h":"4H","6h":"6H","12h":"12H","1d":"1D","3d":"3D","1w":"1W","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/3d49065f-f05d-4573-88a2-1b5201ec6ff3",api:{public:"https://api.coincatch.com",private:"https://api.coincatch.com"},www:"https://www.coincatch.com/",doc:"https://coincatch.github.io/github.io/en/",fees:"https://www.coincatch.com/en/rate/",referral:{url:"https://partner.coincatch.cc/bg/92hy70391729607848548",discount:.1}},api:{public:{get:{"api/spot/v1/public/time":1,"api/spot/v1/public/currencies":20/3,"api/spot/v1/market/ticker":1,"api/spot/v1/market/tickers":1,"api/spot/v1/market/fills":2,"api/spot/v1/market/fills-history":2,"api/spot/v1/market/candles":1,"api/spot/v1/market/history-candles":1,"api/spot/v1/market/depth":1,"api/spot/v1/market/merge-depth":1,"api/mix/v1/market/contracts":1,"api/mix/v1/market/merge-depth":1,"api/mix/v1/market/depth":1,"api/mix/v1/market/ticker":1,"api/mix/v1/market/tickers":1,"api/mix/v1/market/fills":1,"api/mix/v1/market/fills-history":1,"api/mix/v1/market/candles":1,"pi/mix/v1/market/index":1,"api/mix/v1/market/funding-time":1,"api/mix/v1/market/history-fundRate":1,"api/mix/v1/market/current-fundRate":1,"api/mix/v1/market/open-interest":1,"api/mix/v1/market/mark-price":1,"api/mix/v1/market/symbol-leverage":1,"api/mix/v1/market/queryPositionLever":1}},private:{get:{"api/spot/v1/wallet/deposit-address":4,"pi/spot/v1/wallet/withdrawal-list":1,"api/spot/v1/wallet/withdrawal-list-v2":1,"api/spot/v1/wallet/deposit-list":1,"api/spot/v1/account/getInfo":1,"api/spot/v1/account/assets":2,"api/spot/v1/account/transferRecords":1,"api/mix/v1/account/account":2,"api/mix/v1/account/accounts":2,"api/mix/v1/position/singlePosition-v2":2,"api/mix/v1/position/allPosition-v2":4,"api/mix/v1/account/accountBill":2,"api/mix/v1/account/accountBusinessBill":4,"api/mix/v1/order/current":1,"api/mix/v1/order/marginCoinCurrent":1,"api/mix/v1/order/history":2,"api/mix/v1/order/historyProductType":4,"api/mix/v1/order/detail":2,"api/mix/v1/order/fills":2,"api/mix/v1/order/allFills":2,"api/mix/v1/plan/currentPlan":1,"api/mix/v1/plan/historyPlan":2},post:{"api/spot/v1/wallet/transfer-v2":4,"api/spot/v1/wallet/withdrawal-v2":4,"api/spot/v1/wallet/withdrawal-inner-v2":1,"api/spot/v1/account/bills":2,"api/spot/v1/trade/orders":2,"api/spot/v1/trade/batch-orders":{cost:4,step:10},"api/spot/v1/trade/cancel-order":1,"api/spot/v1/trade/cancel-order-v2":2,"api/spot/v1/trade/cancel-symbol-order":2,"api/spot/v1/trade/cancel-batch-orders":1,"api/spot/v1/trade/cancel-batch-orders-v2":1,"api/spot/v1/trade/orderInfo":1,"api/spot/v1/trade/open-orders":1,"api/spot/v1/trade/history":1,"api/spot/v1/trade/fills":1,"api/spot/v1/plan/placePlan":1,"api/spot/v1/plan/modifyPlan":1,"api/spot/v1/plan/cancelPlan":1,"api/spot/v1/plan/currentPlan":1,"api/spot/v1/plan/historyPlan":1,"api/spot/v1/plan/batchCancelPlan":2,"api/mix/v1/account/open-count":1,"api/mix/v1/account/setLeverage":4,"api/mix/v1/account/setMargin":4,"api/mix/v1/account/setMarginMode":4,"api/mix/v1/account/setPositionMode":4,"api/mix/v1/order/placeOrder":2,"api/mix/v1/order/batch-orders":{cost:4,step:10},"api/mix/v1/order/cancel-order":2,"api/mix/v1/order/cancel-batch-orders":2,"api/mix/v1/order/cancel-symbol-orders":2,"api/mix/v1/order/cancel-all-orders":2,"api/mix/v1/plan/placePlan":2,"api/mix/v1/plan/modifyPlan":2,"api/mix/v1/plan/modifyPlanPreset":2,"api/mix/v1/plan/placeTPSL":2,"api/mix/v1/plan/placeTrailStop":2,"api/mix/v1/plan/placePositionsTPSL":2,"api/mix/v1/plan/modifyTPSLPlan":2,"api/mix/v1/plan/cancelPlan":2,"api/mix/v1/plan/cancelSymbolPlan":2,"api/mix/v1/plan/cancelAllPlan":2}}},requiredCredentials:{apiKey:!0,secret:!0,password:!0},fees:{trading:{spot:{tierBased:!1,percentage:!0,feeSide:"get",maker:this.parseNumber("0.001"),taker:this.parseNumber("0.001")}}},options:{brokerId:"47cfy",createMarketBuyOrderRequiresPrice:!0,timeframes:{spot:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","1h":"1h","4h":"4h","6h":"6h","12h":"12h","1d":"1day","3d":"3day","1w":"1week","1M":"1M"},swap:{"1m":"1m","3m":"3m","5m":"5m",15:"15m",30:"30m","1h":"1H","2h":"2H","4h":"4H","6h":"6H","12h":"12H","1d":"1D","3d":"3D","1w":"1W","1M":"1M"}},currencyIdsListForParseMarket:void 0,broker:"",networks:{BTC:"BITCOIN",ERC20:"ERC20",TRC20:"TRC20",BEP20:"BEP20",ARB:"ArbitrumOne",OPTIMISM:"Optimism",LTC:"LTC",BCH:"BCH",ETC:"ETC",SOL:"SOL",NEO3:"NEO3",STX:"stacks",EGLD:"Elrond",NEAR:"NEARProtocol",ACA:"AcalaToken",KLAY:"Klaytn",FTM:"Fantom",TERRA:"Terra",WAVES:"WAVES",TAO:"TAO",SUI:"SUI",SEI:"SEI",RUNE:"THORChain",ZIL:"ZIL",SXP:"Solar",FET:"FET",AVAX:"C-Chain",XRP:"XRP",EOS:"EOS",DOGE:"DOGECOIN",CAP20:"CAP20",MATIC:"Polygon",CSPR:"CSPR",GLMR:"Moonbeam",MINA:"MINA",CFX:"CFX",STRAT:"StratisEVM",TIA:"Celestia",ChilizChain:"ChilizChain",APT:"Aptos",ONT:"Ontology",ICP:"ICP",ADA:"Cardano",FIL:"FIL",CELO:"CELO",DOT:"DOT",XLM:"StellarLumens",ATOM:"ATOM",CRO:"CronosChain"},networksById:{BITCOIN:"BTC",ERC20:"ERC20",TRC20:"TRC20","TRX(TRC20)":"TRC20",BEP20:"BEP20",ArbitrumOne:"ARB",Optimism:"OPTIMISM",LTC:"LTC",BCH:"BCH",ETC:"ETC",SOL:"SOL",NEO3:"NEO3",stacks:"STX",Elrond:"EGLD",NEARProtocol:"NEAR",AcalaToken:"ACA",Klaytn:"KLAY",Fantom:"FTM",Terra:"TERRA",WAVES:"WAVES",TAO:"TAO",SUI:"SUI",SEI:"SEI",THORChain:"RUNE",ZIL:"ZIL",Solar:"SXP",FET:"FET","C-Chain":"AVAX",XRP:"XRP",EOS:"EOS",DOGECOIN:"DOGE",CAP20:"CAP20",Polygon:"MATIC",CSPR:"CSPR",Moonbeam:"GLMR",MINA:"MINA",CFXeSpace:"CFX",CFX:"CFX",StratisEVM:"STRAT",Celestia:"TIA",ChilizChain:"ChilizChain",Aptos:"APT",Ontology:"ONT",ICP:"ICP",Cardano:"ADA",FIL:"FIL",CELO:"CELO",DOT:"DOT",StellarLumens:"XLM",ATOM:"ATOM",CronosChain:"CRO"}},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:{max:50},fetchMyTrades:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!1,marketType:!0,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!1}},fetchMyTrades:{limit:100}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{22001:r.OrderNotFound,429:r.DDoSProtection,40001:r.AuthenticationError,40002:r.AuthenticationError,40003:r.AuthenticationError,40005:r.InvalidNonce,40006:r.AuthenticationError,40007:r.BadRequest,40008:r.InvalidNonce,40009:r.AuthenticationError,40011:r.AuthenticationError,40012:r.AuthenticationError,40013:r.ExchangeError,40014:r.PermissionDenied,40015:r.ExchangeError,40016:r.PermissionDenied,40017:r.ExchangeError,40018:r.PermissionDenied,40019:r.BadRequest,40020:r.BadRequest,40034:r.BadRequest,400172:r.BadRequest,40912:r.BadRequest,40913:r.BadRequest,40102:r.BadRequest,40200:r.OnMaintenance,40305:r.BadRequest,40409:r.ExchangeError,40704:r.ExchangeError,40724:r.BadRequest,40725:r.ExchangeError,40762:r.InsufficientFunds,40774:r.BadRequest,40808:r.BadRequest,43001:r.OrderNotFound,43002:r.InvalidOrder,43004:r.OrderNotFound,43005:r.RateLimitExceeded,43006:r.BadRequest,43007:r.BadRequest,43008:r.BadRequest,43009:r.BadRequest,43010:r.BadRequest,43011:r.BadRequest,43012:r.InsufficientFunds,43117:r.InsufficientFunds,43118:r.BadRequest,43122:r.BadRequest,45006:r.InsufficientFunds,45110:r.BadRequest},broad:{}},precisionMode:o.kb})}calculateRateLimiterCost(e,t,i,s,r={}){const a=this.safeInteger(r,"step"),o=this.safeInteger(r,"cost",1),n=this.safeList2(s,"orderList","orderDataList",[]).length;if(void 0!==a&&n>a){return o*Math.ceil(n/a)}return o}async fetchTime(e={}){const t=await this.publicGetApiSpotV1PublicTime(e);return this.safeInteger(t,"data")}async fetchCurrencies(e={}){const t=await this.publicGetApiSpotV1PublicCurrencies(e),i=this.safeList(t,"data",[]),s={},r=[];for(let e=0;e<i.length;e++){const t=i[e],o=this.safeString(t,"coinName");r.push(o);const n=this.safeCurrencyCode(o);let d,h,c=!1,l=!1;const u=this.safeList(t,"chains"),f=this.safeDict(this.options,"networksById"),p={};for(let e=0;e<u.length;e++){const t=u[e],i=this.safeString(t,"chain"),s=this.safeString(f,i,i),r="true"===this.safeString(t,"rechargeable"),o="true"===this.safeString(t,"withdrawable"),n=this.safeString(t,"minDepositAmount"),m=this.safeString(t,"minWithdrawAmount");p[i]={id:i,network:s,limits:{deposit:{min:this.parseNumber(n),max:void 0},withdraw:{min:this.parseNumber(m),max:void 0}},active:r&&o,deposit:r,withdraw:o,fee:this.safeNumber(t,"withdrawFee"),precision:void 0,info:t},c=c||r,l=l||o,d=d?a.Y.stringMin(n,d):n,h=h?a.Y.stringMin(m,h):m}s[n]={id:o,numericId:this.safeInteger(t,"coinId"),code:n,precision:void 0,type:void 0,name:void 0,active:l&&c,deposit:c,withdraw:l,fee:void 0,limits:{deposit:{min:this.parseNumber(d),max:void 0},withdraw:{min:this.parseNumber(h),max:void 0}},networks:p,info:t}}return void 0===this.safeList(this.options,"currencyIdsListForParseMarket")&&(this.options.currencyIdsListForParseMarket=r),s}async fetchMarkets(e={}){let t=await this.publicGetApiSpotV1MarketTickers(e);void 0===this.safeList(this.options,"currencyIdsListForParseMarket")&&await this.fetchCurrencies();const i=this.safeList(t,"data",[]),s={};let r;[r,e]=this.handleOptionAndParams(e,"fetchMarkets","productType",r);let a=[];s.productType="umcbl",t=await this.publicGetApiMixV1MarketContracts(this.extend(s,e));const o=this.safeList(t,"data",[]);s.productType="dmcbl",t=await this.publicGetApiMixV1MarketContracts(this.extend(s,e));const n=this.safeList(t,"data",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeList(t,"supportMarginCoins",[]);for(let e=0;e<i.length;e++){const s={supportMarginCoins:[i[e]]};d.push(this.extend(t,s))}}a=this.arrayConcat(o,d);const h=this.arrayConcat(i,a);return this.parseMarkets(h)}parseMarket(e){let t=this.safeString(e,"symbol");const i=this.safeDict(this.fees,"trading"),s=this.safeDict(i,"spot");let r,o,n,d,h,c=this.safeString(e,"baseCoin"),l=this.safeString(e,"quoteCoin"),u="",f="spot";const p=void 0===c;if(p){const e=this.parseSpotMarketId(t);c=this.safeString(e,"baseId"),l=this.safeString(e,"quoteId"),t+="_SPBL"}else{f="swap",s.taker=this.safeNumber(e,"takerFeeRate"),s.maker=this.safeNumber(e,"makerFeeRate");const t=this.safeList(e,"supportMarginCoins",[]);r=this.safeString(t,0),o=this.safeCurrencyCode(r),u=":"+o,n=l===r,d=c===r,n?h="linear":d&&(h="inverse")}const m=this.safeCurrencyCode(c),g=this.safeCurrencyCode(l),v=m+"/"+g+u,y=this.safeString(e,"symbolStatus"),w=y?"normal"===y:void 0,b=this.safeString(e,"volumePlace"),k=this.parsePrecision(b),S=this.safeString(e,"pricePlace"),O=this.safeString(e,"priceEndStep"),T=a.Y.stringMul(this.parsePrecision(S),O);return this.safeMarketStructure({id:t,symbol:v,base:m,quote:g,baseId:c,quoteId:l,active:w,type:f,subType:h,spot:p,margin:!p&&void 0,swap:!p,future:!1,option:!1,contract:!p,settle:o,settleId:r,contractSize:this.safeNumber(e,"sizeMultiplier"),linear:n,inverse:d,taker:this.safeNumber(s,"taker"),maker:this.safeNumber(s,"maker"),percentage:this.safeBool(s,"percentage"),tierBased:this.safeBool(s,"tierBased"),feeSide:this.safeString(s,"feeSide"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(k),price:this.parseNumber(T)},limits:{amount:{min:this.safeNumber(e,"minTradeNum"),max:void 0},price:{min:void 0,max:void 0},leverage:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e})}parseSpotMarketId(e){let t,i;const s=this.safeList(this.options,"currencyIdsListForParseMarket",[]);for(let r=0;r<s.length;r++){const a=s[r],o=e.indexOf(a);if(o>-1){const s=e.replace(a,"");0===o?(t=a,i=s):(t=s,i=a);break}}return{baseId:t,quoteId:i}}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let a;if(i.spot)a=await this.publicGetApiSpotV1MarketTicker(this.extend(s,t));else{if(!i.swap)throw new r.NotSupported(this.id+" fetchTicker() is not supported for "+i.type+" type of markets");a=await this.publicGetApiMixV1MarketTicker(this.extend(s,t))}const o=this.safeDict(a,"data",{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){const i="fetchTickers";await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0);const s=this.getMarketFromSymbols(e);let a,o="spot";if([o,t]=this.handleMarketTypeAndParams(i,s,t,o),"spot"===o)a=await this.publicGetApiSpotV1MarketTickers(t);else{if("swap"!==o)throw new r.NotSupported(this.id+" "+i+"() is not supported for "+o+" type of markets");{let e="umcbl";[e,t]=this.handleOptionAndParams(t,i,"productType",e);const s={productType:e};a=await this.publicGetApiMixV1MarketTickers(this.extend(s,t))}}const n=this.safeList(a,"data",[]);return this.parseTickers(n,e)}parseTicker(e,t=void 0){const i=this.safeInteger2(e,"ts","timestamp");let s=this.safeString(e,"symbol","");s.indexOf("_")<0&&(s+="_SPBL"),t=this.safeMarketCustom(s,t);const r=this.safeString2(e,"close","last");return this.safeTicker({symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high24h"),low:this.safeString(e,"low24h"),bid:this.safeString2(e,"buyOne","bestBid"),bidVolume:this.safeString(e,"bidSz"),ask:this.safeString2(e,"sellOne","bestAsk"),askVolume:this.safeString(e,"askSz"),vwap:void 0,open:this.safeString2(e,"openUtc0","openUtc"),close:r,last:r,previousClose:void 0,change:void 0,percentage:a.Y.stringMul(this.safeString2(e,"changeUtc","chgUtc"),"100"),average:void 0,baseVolume:this.safeString2(e,"baseVol","baseVolume"),quoteVolume:this.safeString2(e,"quoteVol","quoteVolume"),indexPrice:this.safeString(e,"indexPrice"),markPrice:void 0,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s="fetchOrderBook",a=this.market(e),o={symbol:a.id};let n,d;if(void 0!==t&&(o.limit=t),[n,i]=this.handleOptionAndParams(i,s,"precision"),void 0!==n&&(o.precision=n),a.spot)d=await this.publicGetApiSpotV1MarketMergeDepth(this.extend(o,i));else{if(!a.swap)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+a.type+" type of markets");d=await this.publicGetApiMixV1MarketMergeDepth(this.extend(o,i))}const h=this.safeDict(d,"data",{}),c=this.safeInteger(h,"ts");return this.parseOrderBook(h,e,c,"bids","asks")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){const o="fetchOHLCV";await this.loadMarkets();const n=this.market(e),d={symbol:n.id};let h;[h,a]=this.handleOptionAndParams(a,o,"until");const c=n.type,l=this.options.timeframes[c],u=this.safeString(l,t,t);let f,p=s;if(void 0===i&&void 0===h||(p=1e3),void 0!==p&&(d.limit=p),n.spot){d.period=u,void 0!==i&&(d.after=i),void 0!==h&&(d.before=h),f=await this.publicGetApiSpotV1MarketCandles(this.extend(d,a));const e=this.safeList(f,"data",[]);return this.parseOHLCVs(e,n,t,i,s)}if(n.swap){if(d.granularity=u,void 0===h&&(h=this.milliseconds()),void 0===i){i=h-1e3*this.parseTimeframe(t)*1e3}let e;return d.startTime=i,d.endTime=h,[e,a]=this.handleOptionAndParams(a,o,"price"),"mark"===e&&(d.kLineType="market mark index"),f=await this.publicGetApiMixV1MarketCandles(this.extend(d,a)),this.parseOHLCVs(f,n,t,i,s)}throw new r.NotSupported(this.id+" "+o+"() is not supported for "+n.type+" type of markets")}parseOHLCV(e,t=void 0){return[this.safeInteger2(e,"ts",0),this.safeNumber2(e,"open",1),this.safeNumber2(e,"high",2),this.safeNumber2(e,"low",3),this.safeNumber2(e,"close",4),this.safeNumber2(e,"baseVol",5)]}async fetchTrades(e,t=void 0,i=void 0,s={}){const a="fetchTrades";await this.loadMarkets();const o=this.market(e),n={symbol:o.id};let d;[d,s]=this.handleOptionAndParams(s,a,"until");let h,c=i;if(void 0===t&&void 0===d||(c=1e3,void 0!==t&&(n.startTime=t),void 0!==d&&(n.endTime=d)),void 0!==c&&(n.limit=c),o.spot)h=await this.publicGetApiSpotV1MarketFillsHistory(this.extend(n,s));else{if(!o.swap)throw new r.NotSupported(this.id+" "+a+"() is not supported for "+o.type+" type of markets");h=await this.publicGetApiMixV1MarketFillsHistory(this.extend(n,s))}const l=this.safeList(h,"data",[]);return this.parseTrades(l,o,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarketCustom(i,t);const s=this.safeIntegerN(e,["fillTime","timestamp","cTime"]),r=this.safeString2(e,"fees","fee");let o;void 0!==r&&(o=a.Y.stringAbs(r));let n=this.safeString(e,"feeCcy");void 0===n&&void 0!==t.settle&&(n=t.settle);const d=this.safeStringLower2(e,"tradeSide","side");return this.safeTrade({id:this.safeString2(e,"tradeId","fillId"),order:this.safeString(e,"orderId"),timestamp:s,datetime:this.iso8601(s),symbol:t.symbol,type:this.safeString(e,"orderType"),side:this.parseOrderSide(d),takerOrMaker:this.safeString(e,"takerMakerFlag"),price:this.safeString2(e,"fillPrice","price"),amount:this.safeStringN(e,["fillQuantity","size","sizeQty"]),cost:this.safeString2(e,"fillTotalAmount","fillAmount"),fee:{cost:o,currency:n},info:e},t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s=i.id,r=s.split("_"),a={symbol:s,productType:this.safeString(r,1)},o=await this.publicGetApiMixV1MarketCurrentFundRate(this.extend(a,t)),n=this.safeDict(o,"data",{});return this.parseFundingRate(n,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarketCustom(i,t);const s=this.safeNumber(e,"fundingRate");return{info:e,symbol:t.symbol,markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:s,fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0}}handleOptionParamsAndRequest(e,t,i,s,r,a=void 0){const[o,n]=this.handleOptionAndParams(e,t,i,a);return void 0!==o&&(s[r]=o),[s,n]}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};let n=i;void 0!==t&&(n=100),void 0!==n&&(o.pageSize=n);const d=await this.publicGetApiMixV1MarketHistoryFundRate(this.extend(o,s)),h=this.safeList(d,"data",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeInteger(t,"settleTime");c.push({info:t,symbol:this.safeSymbol(this.safeString(t,"symbol"),a,void 0,"swap"),fundingRate:this.safeNumber(t,"fundingRate"),timestamp:i,datetime:this.iso8601(i)})}const l=this.sortBy(c,"timestamp");return this.filterBySinceLimit(l,t,i)}async fetchBalance(e={}){await this.loadMarkets();const t="fetchBalance";let i,s;if([i,e]=this.handleMarketTypeAndParams(t,void 0,e),"spot"===i)s=await this.privateGetApiSpotV1AccountAssets(e);else{if("swap"!==i)throw new r.NotSupported(this.id+" "+t+"() is not supported for "+i+" type of markets");{let i="umcbl";[i,e]=this.handleOptionAndParams(e,t,"productType",i);const r={productType:i};s=await this.privateGetApiMixV1AccountAccounts(this.extend(r,e))}}const a=this.safeList(s,"data",[]);return this.parseBalance(a)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=this.safeDict(e,i,{}),r=this.safeString2(s,"coinName","marginCoin"),o=this.safeCurrencyCode(r),n=this.account();n.free=this.safeString(s,"available");const d=this.safeString2(s,"lock","locked"),h=this.safeString(s,"frozen","0");n.used=a.Y.stringAdd(d,h),n.total=this.safeString(s,"equity"),t[o]=n}return this.safeBalance(t)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e);"swap"===i&&(i="USDT"===e?"mix_usdt":"mix_usd"),"swap"===s&&(s="USDT"===e?"mix_usdt":"mix_usd");const o={coin:a.id,amount:this.currencyToPrecision(e,t),fromType:i,toType:s};let n;[n,r]=this.handleOptionAndParams(r,"transfer","clientOrderId"),void 0!==n&&(o.clientOid=n);const d=await this.privatePostApiSpotV1WalletTransferV2(this.extend(o,r));return this.parseTransfer(d,a)}parseTransfer(e,t=void 0){let i;"success"===this.safeString(e,"msg")&&(i="ok");const s=this.safeDict(e,"data",{});return{id:this.safeString(s,"transferId"),timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:i,info:e}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id};let a;if([a,t]=this.handleNetworkCodeAndParams(t),void 0===a&&(a=this.defaultNetworkCode(e)),void 0===a)throw new r.ArgumentsRequired(this.id+" fetchDepositAddress() requires a network parameter or a default network code");s.chain=this.networkCodeToId(a,e);const o=await this.privateGetApiSpotV1WalletDepositAddress(this.extend(s,t)),n=this.safeDict(o,"data",{});return this.parseDepositAddress(n,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");this.checkAddress(i);const s=this.safeString(e,"chain"),r=this.safeString(this.options.networksById,s,s),a=this.safeString(e,"tag");return{currency:t.code,address:i,tag:a,network:r,info:e}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),[o,s]=this.handleOptionAndParams(s,"fetchDeposits","until"),void 0!==o&&(r.endTime=o);const n=await this.privateGetApiSpotV1WalletDepositList(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[o,s]=this.handleOptionAndParams(s,"fetchWithdrawals","until"),void 0!==o&&(r.endTime=o);const n=await this.privateGetApiSpotV1WalletWithdrawalListV2(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={coin:a.id,address:i,amount:t};let n;void 0!==s&&(o.tag=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chain=this.networkCodeToId(n));const d=await this.privatePostApiSpotV1WalletWithdrawalV2(this.extend(o,r)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,a)}parseTransaction(e,t=void 0){let i=this.safeString(e,"status");"success"===i&&(i="ok");const s=this.safeString(e,"txId"),r=this.safeString(e,"coin"),a=this.safeCurrencyCode(r,t),o=this.safeInteger(e,"cTime"),n=this.safeNumber(e,"amount"),d=this.safeString(e,"chain"),h=this.safeString(this.options.networksById,d,d),c=this.safeString(e,"toAddress"),l=this.safeString(e,"fromAddress"),u=this.safeString(e,"tag"),f=this.safeString(e,"type"),p=this.safeNumber(e,"fee");let m;return void 0!==p&&(m={cost:p,currency:a}),{info:e,id:this.safeString2(e,"id","orderId"),txid:s,timestamp:o,datetime:this.iso8601(o),network:h,address:void 0,addressTo:c,addressFrom:l,tag:u,tagTo:void 0,tagFrom:void 0,type:f,amount:n,currency:a,status:i,updated:void 0,internal:void 0,comment:void 0,fee:m}}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();const s="createMarketBuyOrderWithCost";if(!this.market(e).spot)throw new r.NotSupported(this.id+" "+s+"() supports spot orders only");return i.methodName=s,i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets(),o.methodName=this.safeString(o,"methodName","createOrder");const n=this.market(e);if(n.spot)return await this.createSpotOrder(e,t,i,s,a,o);if(n.swap)return await this.createSwapOrder(e,t,i,s,a,o);throw new r.NotSupported(this.id+" createOrder() is not supported for "+n.type+" type of markets")}async createSpotOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets(),a.methodName=this.safeString(a,"methodName","createSpotOrder");const o=this.createSpotOrderRequest(e,t,i,s,r,a);let n;n=void 0!==this.safeString(o,"triggerPrice")?await this.privatePostApiSpotV1PlanPlacePlan(o):await this.privatePostApiSpotV1TradeOrders(o);const d=this.safeDict(n,"data",{}),h=this.market(e);return this.parseOrder(d,h)}createSpotOrderRequest(e,t,i,s,a=void 0,o={}){let n="createSpotOrderRequest";[n,o]=this.handleParamString(o,"methodName",n);const d={symbol:this.market(e).id,side:i,orderType:t},h="market"===t,c=this.handleTimeInForceAndPostOnly(n,o,h);o=c.params;const l=c.timeInForce;let u,f;[u,o]=this.handleParamString(o,"cost"),[f,o]=this.handleParamString(o,"triggerPrice");const p=h&&"buy"===i;if(!p&&void 0!==u)throw new r.NotSupported(this.id+" "+n+" supports cost parameter for market buy orders only");if(p){const e=this.handleRequiresPriceAndCost(n,o,a,s,u);u=e.cost,o=e.params}if(void 0===f)"limit"===t&&(d.price=a),d.quantity=p?u:this.numberToString(s),d.force=l||"normal";else{let e,i;d.triggerPrice=f,void 0!==l&&(d.timeInForceValue=l),[e,o]=this.handleParamString(o,"clientOrderId"),void 0!==e&&(d.clientOid=e),"limit"===t&&(d.executePrice=a),i=h?"market_price":"fill_price",d.triggerType=i,d.size=h?u:this.numberToString(s)}return this.extend(d,o)}handleRequiresPriceAndCost(e,t={},i=void 0,s=void 0,o=void 0,n="buy"){const d="createMarket"+this.capitalize(n)+"OrderRequiresPrice";let h,c,l=!0;if([l,t]=this.handleOptionAndParams(t,e,d,!0),void 0!==s&&(h=this.numberToString(s)),void 0!==i&&(c=this.numberToString(i)),l){if(void 0===i&&void 0===o)throw new r.InvalidOrder(this.id+" "+e+"() requires the price argument for market "+n+" orders to calculate the total cost to spend (amount * price), alternatively set the "+d+" option or param to false and pass the cost to spend in the amount argument");void 0===o&&(o=a.Y.stringMul(h,c))}else o=o||h;return{cost:o,params:t}}handleTimeInForceAndPostOnly(e,t={},i=!1){let s;[s,t]=this.handleOptionAndParams(t,e,"timeInForce");let r=!1;[r,t]=this.handlePostOnly(i,"post_only"===s,t),r&&(s="PO"),s=this.encodeTimeInForce(s);return{timeInForce:s,params:t}}async createSwapOrder(e,t,i,s,r=void 0,a={}){a.methodName=this.safeString(a,"methodName","createSwapOrder"),await this.loadMarkets();const o=this.market(e);let n=this.createSwapOrderRequest(e,t,i,s,r,a);const d=this.safeString(n,"endpointType");let h;n=this.omit(n,"endpointType"),h="trigger"===d?await this.privatePostApiMixV1PlanPlacePlan(n):"tpsl"===d?await this.privatePostApiMixV1PlanPlaceTPSL(n):await this.privatePostApiMixV1OrderPlaceOrder(n);const c=this.safeDict(h,"data",{});return this.parseOrder(c,o)}createSwapOrderRequest(e,t,i,s,r=void 0,a={}){let o="createSwapOrderRequest";[o,a]=this.handleParamString(a,"methodName",o);const n=this.market(e);let d={symbol:n.id,marginCoin:n.settleId,size:this.amountToPrecision(e,s)};[d,a]=this.handleOptionParamsAndRequest(a,o,"clientOrderId",d,"clientOid");const h="market"===t;a=this.handleTriggerStopLossAndTakeProfit(e,i,t,r,o,a);const c=this.safeString(a,"endpointType");if(void 0===c||"standard"===c){const t=this.handleTimeInForceAndPostOnly(o,a,h);a=t.params;const i=t.timeInForce;void 0!==i&&(d.timeInForceValue=i),void 0!==r&&(d.price=this.priceToPrecision(e,r))}if("tpsl"!==c){d.orderType=t;let e=!1;[e,a]=this.handleOptionAndParams(a,o,"hedged",e);let s=!1;[s,a]=this.handleParamBool(a,"reduceOnly",s),e?s?"buy"===i?i="close_short":"sell"===i&&(i="close_long"):"buy"===i?i="open_long":"sell"===i&&(i="open_short"):i=i.toLowerCase()+"_single",d.side=i}return this.extend(d,a)}handleTriggerStopLossAndTakeProfit(e,t,i,s,a="createOrder",o={}){const n={};let d,h="standard",c=this.safeString(o,"stopLossPrice"),l=this.safeString(o,"takeProfitPrice");const u=this.safeDict(o,"takeProfit"),f=this.safeDict(o,"stopLoss"),p=this.safeString2(o,"triggerPrice","stopPrice"),m=void 0!==p,g=this.safeString(o,"trailingPercent"),v=this.safeString(o,"trailingTriggerPrice");let y=void 0!==l,w=void 0!==c;void 0!==u&&!y&&(l=this.safeString(u,"triggerPrice"),y=void 0!==l);void 0!==f&&!w&&(c=this.safeString(f,"triggerPrice"),w=void 0!==c);const b=void 0!==g,k="market"===i;if(y&&w||m||"createOrderWithTakeProfitAndStopLoss"===a)m&&(k?n.triggerType="market_price":(n.triggerType="fill_price",n.executePrice=this.priceToPrecision(e,s)),n.triggerPrice=this.priceToPrecision(e,p),h="trigger"),"createOrders"===a&&(h=void 0),y&&(n.presetTakeProfitPrice=l),w&&(n.presetStopLossPrice=c);else if(y||w||b){if(!k)throw new r.NotSupported(this.id+" "+a+"() supports does not support "+i+" type of stop loss and take profit orders (only market type is supported for stop loss and take profit orders). To create a market order with stop loss or take profit attached use createOrderWithTakeProfitAndStopLoss()");h="tpsl";let s="long";if("buy"===t&&(s="short"),n.holdSide=s,b){if(void 0===v)throw new r.ArgumentsRequired(this.id+" "+a+"() requires the trailingTriggerPrice parameter for trailing stop orders");d=v,n.rangeRate=g,n.planType="moving_plan"}else y?(d=l,n.planType="profit_plan"):(d=c,n.planType="loss_plan");n.triggerPrice=this.priceToPrecision(e,d)}return void 0!==h&&(n.endpointType=h),o=this.omit(o,["stopLoss","takeProfit","stopLossPrice","takeProfitPrice","triggerPrice","stopPrice","trailingPercent","trailingTriggerPrice"]),this.extend(n,o)}async createOrderWithTakeProfitAndStopLoss(e,t,i,s,a=void 0,o=void 0,n=void 0,d={}){const h="createOrderWithTakeProfitAndStopLoss";await this.loadMarkets();if(!this.market(e).swap)throw new r.NotSupported(this.id+" "+h+"() is supported for swap markets only");return d.methodName=h,super.createOrderWithTakeProfitAndStopLoss(e,t,i,s,a,o,n,d)}encodeTimeInForce(e){return this.safeString({GTC:"normal",IOC:"iok",FOK:"fok",PO:"post_only"},e,e)}async createOrders(e,t={}){await this.loadMarkets();const i="createOrders";t.methodName=i;const s=[];let a=[];for(let t=0;t<e.length;t++){const o=e[t],n=this.safeString(o,"symbol");a.push(n);const d=this.safeString(o,"type"),h=this.safeString(o,"side"),c=this.safeNumber(o,"amount"),l=this.safeNumber(o,"price"),u=this.safeDict(o,"params",{}),f=this.createOrderRequest(n,d,h,c,l,u);if(void 0!==this.safeString(u,"triggerPrice"))throw new r.NotSupported(this.id+" "+i+"() does not support trigger orders");void 0===this.safeString(f,"clientOrderId")&&(f.clientOrderId=this.uuid()),s.push(f)}a=this.unique(a);if(1!==a.length)throw new r.BadRequest(this.id+" createOrders() requires all orders to be of the same symbol");const o=this.safeString(a,0),n=this.market(o),d={symbol:n.id},h=n.type;let c,l,u;if("spot"===h)d.orderList=s,c=await this.privatePostApiSpotV1TradeBatchOrders(this.extend(d,t)),u="resultList";else{if(!n.swap)throw new r.NotSupported(this.id+" "+i+"() is not supported for "+h+" type of markets");d.marginCoin=n.settleId,d.orderDataList=s,c=await this.privatePostApiMixV1OrderBatchOrders(this.extend(d,t)),u="orderInfo"}const f=this.safeDict(c,"data",{});return l=this.safeList(f,u,[]),this.parseOrders(l)}createOrderRequest(e,t,i,s,a=void 0,o={}){const n=this.safeString(o,"methodName","createOrderRequest");o.methodName=n;const d=this.market(e);if(d.spot)return this.createSpotOrderRequest(e,t,i,s,a,o);if(d.swap)return this.createSwapOrderRequest(e,t,i,s,a,o);throw new r.NotSupported(this.id+" "+n+"() is not supported for "+d.type+" type of markets")}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){const d="editOrder";n.methodName=d,await this.loadMarkets();const h=this.market(t);if(h.spot)return await this.editSpotOrder(e,t,i,s,a,o,n);throw new r.NotSupported(this.id+" "+d+"() is not supported for "+h.type+" type of markets")}async editSpotOrder(e,t,i,s,a,o=void 0,n={}){await this.loadMarkets();let d="editSpotOrder";[d,n]=this.handleParamString(n,"methodName",d);const h=this.market(t);if(!h.spot)throw new r.NotSupported(this.id+" editSpotOrder() does not support "+h.type+" orders");const c={orderType:i},l=this.safeString(n,"clientOrderId");if(void 0!==l)c.clientOid=l;else{if(void 0===e)throw new r.BadRequest(this.id+" "+d+"() requires id or clientOrderId");c.orderId=e}let u;[u,n]=this.handleParamString(n,"cost");const f="market"===i&&"buy"===s;if(!f&&void 0!==u)throw new r.NotSupported(this.id+" "+d+"() supports cost parameter for market buy orders only");if(void 0!==a)if(f){const e=this.handleRequiresPriceAndCost(d,n,o,a,u);u=e.cost,n=e.params}else c.size=this.numberToString(a);void 0!==u&&(c.size=u),"limit"===i&&void 0!==o&&(c.price=o);const p=await this.privatePostApiSpotV1PlanModifyPlan(this.extend(c,n)),m=this.safeDict(p,"data",{});return this.parseOrder(m,h)}async fetchOrder(e,t=void 0,i={}){const s="fetchOrder";await this.loadMarkets();const a={},o=this.safeString(i,"clientOrderId");let n;void 0===o&&(a.orderId=e),void 0!==t&&(n=this.market(t));let d,h,c="spot";if([c,i]=this.handleMarketTypeAndParams(s,n,i,c),"spot"===c){d=await this.privatePostApiSpotV1TradeOrderInfo(this.extend(a,i));let e=this.safeList(d,"data");void 0===e&&(d=JSON.parse(d),e=this.safeList(d,"data",[])),h=this.safeDict(e,0,{})}else{if("swap"!==c)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+c+" type of markets");if(void 0===n)throw new r.ArgumentsRequired(this.id+" "+s+"() requires a symbol argument for "+c+" type of markets");a.symbol=n.id,void 0!==o&&(i=this.omit(i,"clientOrderId"),a.clientOid=o),d=await this.privateGetApiMixV1OrderDetail(this.extend(a,i)),h=this.safeDict(d,"data",{})}return this.parseOrder(h,n)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const a="fetchOpenOrders";let o;await this.loadMarkets(),void 0!==e&&(o=this.market(e));let n="spot";if([n,s]=this.handleMarketTypeAndParams(a,o,s,n),s.methodName=a,"spot"===n)return await this.fetchOpenSpotOrders(e,t,i,s);if("swap"===n)return await this.fetchOpenSwapOrders(e,t,i,s);throw new r.NotSupported(this.id+" "+a+"() is not supported for "+n+" type of markets")}async fetchOpenSpotOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a="fetchOpenSpotOrders";[a,s]=this.handleParamString(s,"methodName",a);const o={};let n;void 0!==e&&(n=this.market(e),o.symbol=n.id);let d,h=!1;if([h,s]=this.handleOptionAndParams2(s,a,"trigger","stop",h),h){if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a symbol argument for trigger orders");void 0!==i&&(o.pageSize=i);const t=await this.privatePostApiSpotV1PlanCurrentPlan(this.extend(o,s)),n=this.safeDict(t,"data",{});d=this.safeList(n,"orderList",[])}else{const e=await this.privatePostApiSpotV1TradeOpenOrders(this.extend(o,s));d=this.safeList(e,"data",[])}return this.parseOrders(d,n,t,i)}async fetchOpenSwapOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a="fetchOpenSwapOrders";[a,s]=this.handleParamString(s,"methodName",a);let o,n=!1;[n,s]=this.handleOptionAndParams2(s,a,"trigger","stop",n),[o,s]=this.handleOptionAndParams(s,a,"isPlan",o);let d,h,c=this.handleOption(a,"productType");if(void 0!==e){d=this.market(e);const t={symbol:d.id};n||void 0!==o?(void 0!==c&&(t.productType=c),void 0!==o&&(t.isPlan=o),h=await this.privateGetApiMixV1PlanCurrentPlan(this.extend(t,s))):h=await this.privateGetApiMixV1OrderCurrent(this.extend(t,s))}else{if(n)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a symbol argument for swap trigger orders");{void 0===c&&(c="umcbl");const e={productType:c};let t;t=this.handleOption(a,"marginCoin",t),void 0!==t&&(e.marginCoin=t),h=await this.privateGetApiMixV1OrderMarginCoinCurrent(this.extend(e,s))}}const l=this.safeList(h,"data",[]);return this.parseOrders(l,d,t,i)}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){const a="fetchCanceledAndClosedOrders";let o;await this.loadMarkets(),void 0!==e&&(o=this.market(e));let n="spot";if([n,s]=this.handleMarketTypeAndParams(a,o,s,n),s.methodName=a,"spot"===n)return await this.fetchCanceledAndClosedSpotOrders(e,t,i,s);if("swap"===n)return await this.fetchCanceledAndClosedSwapOrders(e,t,i,s);throw new r.NotSupported(this.id+" "+a+"() is not supported for "+n+" type of markets")}async fetchCanceledAndClosedSpotOrders(e=void 0,t=void 0,i=void 0,s={}){let a="fetchCanceledAndClosedSpotOrders";if([a,s]=this.handleParamString(s,"methodName",a),void 0===e)throw new r.ArgumentsRequired(this.id+" "+a+" () requires a symbol argument for spot markets");await this.loadMarkets();const o=this.market(e),n={symbol:o.id};let d,h=i,c=!1;if([c,s]=this.handleOptionAndParams2(s,a,"trigger","stop",c),c){let e;[e,s]=this.handleOptionAndParams(s,a,"until",e);let i=t;const r=7776e6,o=this.milliseconds();void 0===e&&void 0===i?(i=o-r,e=o):void 0!==e?i=e-r:e=t+r,n.startTime=i,n.endTime=e,void 0===h&&(h=500),n.pageSize=h;const c=await this.privatePostApiSpotV1PlanHistoryPlan(this.extend(n,s)),l=this.safeDict(c,"data",{});d=this.safeList(l,"orderList",[])}else{void 0!==t&&(n.after=t,h=500),void 0!==h&&(n.limit=h);const e=await this.privatePostApiSpotV1TradeHistory(this.extend(n,s)),i=JSON.parse(e);d=this.safeList(i,"data",[])}return this.parseOrders(d,o,t,i)}async fetchCanceledAndClosedSwapOrders(e=void 0,t=void 0,i=void 0,s={}){let r="fetchCanceledAndClosedSwapOrders";[r,s]=this.handleParamString(s,"methodName",r);let a,o=t;[a,s]=this.handleOptionAndParams(s,r,"until",a);const n=this.milliseconds(),d=7776e6;void 0===a&&void 0===o?(o=n-d,a=n):void 0!==a?o=a-d:a=t+d;const h={startTime:o,endTime:a};let c;void 0!==i&&(h.pageSize=i),void 0!==e&&(c=this.market(e),h.symbol=c.id);let l,u,f,p=this.handleOption(r,"productType"),m=!1;if([m,s]=this.handleOptionAndParams2(s,r,"trigger","stop",m),[l,s]=this.handleOptionAndParams(s,r,"isPlan",l),m||void 0!==l)void 0!==l&&(h.isPlan=l),void 0!==p&&(h.productType=p),u=await this.privateGetApiMixV1PlanHistoryPlan(this.extend(h,s)),f=this.safeList(u,"data",[]);else{void 0!==e?(c=this.market(e),h.symbol=c.id,u=await this.privateGetApiMixV1OrderHistory(this.extend(h,s))):(void 0===p&&(p="umcbl"),h.productType=p,u=await this.privateGetApiMixV1OrderHistoryProductType(this.extend(h,s)));const t=this.safeDict(u,"data",{});f=this.safeList(t,"orderList",[])}return this.parseOrders(f,c)}async cancelOrder(e,t=void 0,i={}){const s="cancelOrder";if(void 0===t)throw new r.ArgumentsRequired(this.id+" "+s+" () requires a symbol argument");await this.loadMarkets();const a=this.market(t),o={};let n;if([n,i]=this.handleParamString(i,"clientOrderId"),void 0===e&&void 0===n)throw new r.ArgumentsRequired(this.id+" "+s+" () requires an id argument or clientOrderId parameter");void 0!==n?o.clientOid=n:o.orderId=e;const d=a.type;let h,c=!1;if([c,i]=this.handleOptionAndParams2(i,s,"trigger","stop",c),c&&"spot"===d||(o.symbol=a.id),"spot"===d)h=c?await this.privatePostApiSpotV1PlanCancelPlan(this.extend(o,i)):await this.privatePostApiSpotV1TradeCancelOrderV2(this.extend(o,i));else{if("swap"!==d)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+d+" type of markets");{let e;if([e,i]=this.handleOptionAndParams(i,s,"planType",e),o.marginCoin=a.settleId,c||void 0!==e){if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+s+' () requires a planType parameter for swap trigger orders ("profit_plan" - profit order, "loss_plan" - loss order, "normal_plan" - plan order, "pos_profit" - position profit, "pos_loss" - position loss, "moving_plan" - Trailing TP/SL, "track_plan" - Trailing Stop)');o.planType=e,h=await this.privatePostApiMixV1PlanCancelPlan(this.extend(o,i))}else h=await this.privatePostApiMixV1OrderCancelOrder(this.extend(o,i))}}const l=this.safeDict(h,"data",{});return this.parseOrder(l,a)}async cancelAllOrders(e=void 0,t={}){const i="cancelAllOrders";let s;await this.loadMarkets(),void 0!==e&&(s=this.market(e));const a={};let o="spot";[o,t]=this.handleMarketTypeAndParams(i,s,t,o);let n,d=!1;if([d,t]=this.handleOptionAndParams2(t,i,"trigger","stop",d),"spot"!==o){if("swap"===o){let o,h="umcbl";if(void 0!==e?a.symbol=s.id:(h=this.handleOption(i,"productType",h),a.productType=h),[o,t]=this.handleOptionAndParams(t,i,"planType",o),d||void 0!==o){if(void 0===o)throw new r.ArgumentsRequired(this.id+" "+i+' () requires a planType parameter for swap trigger orders ("profit_plan" - profit order, "loss_plan" - loss order, "normal_plan" - plan order, "pos_profit" - position profit, "pos_loss" - position loss, "moving_plan" - Trailing TP/SL, "track_plan" - Trailing Stop)');a.planType=o,n=void 0!==e?await this.privatePostApiMixV1PlanCancelSymbolPlan(this.extend(a,t)):await this.privatePostApiMixV1PlanCancelAllPlan(this.extend(a,t))}else if(void 0!==e)a.marginCoin=s.settleId,n=await this.privatePostApiMixV1OrderCancelSymbolOrders(this.extend(a,t));else{let e;if("umcbl"===h)e="USDT";else if([e,t]=this.handleOptionAndParams(t,i,"marginCoin",e),void 0===e)throw new r.ArgumentsRequired(this.id+" "+i+" () requires a marginCoin parameter for dmcbl product type");a.marginCoin=e,n=await this.privatePostApiMixV1OrderCancelAllOrders(this.extend(a,t))}const c=this.getResultFromBatchCancelingSwapOrders(n);return this.parseOrders(c,s)}throw new r.NotSupported(this.id+" "+i+"() is not supported for "+o+" type of markets")}if(d){void 0!==e&&(a.symbols=[s.id]),n=await this.privatePostApiSpotV1PlanBatchCancelPlan(this.extend(a,t));const i=this.safeList(n,"data",[]);return this.parseOrders(i,s)}if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+i+" () requires a symbol argument for spot non-trigger orders");a.symbol=s.id,n=await this.privatePostApiSpotV1TradeCancelSymbolOrder(this.extend(a,t));const h=this.safeOrder(n);return h.info=n,[h]}async cancelOrders(e,t=void 0,i={}){const s="cancelOrders";if(void 0===t)throw new r.ArgumentsRequired(this.id+" "+s+"() requires a symbol argument");await this.loadMarkets();const a=this.market(t),o={symbol:a.id},n=a.type,d=this.safeList(i,"clientOrderIds");if(void 0!==d)o.clientOids=d,i=this.omit(i,"clientOrderIds");else{if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+s+"() requires either ids argument or clientOrderIds parameter");o.orderIds=e}let h,c;if("spot"===n){h=await this.privatePostApiSpotV1TradeCancelBatchOrdersV2(this.extend(o));const e=this.safeDict(h,"data",{});c=this.safeList(e,"resultList",[])}else{if("swap"!==n)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+n+" type of markets");o.marginCoin=a.settleId,h=await this.privatePostApiMixV1OrderCancelBatchOrders(this.extend(o,i)),c=this.getResultFromBatchCancelingSwapOrders(h)}return this.parseOrders(c,a)}getResultFromBatchCancelingSwapOrders(e){const t=this.safeDict(e,"data",{}),i=[],s=this.safeValue(t,"order_ids",[]);for(let e=0;e<s.length;e++){const t={orderId:s[e]};i.push(t)}return i}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"marginCoin");t=this.safeMarketCustom(i,t,s);const r=this.safeInteger(e,"cTime");let o=this.omitZero(this.safeString2(e,"price","executePrice"));const n=this.omitZero(this.safeString(e,"priceAvg"));void 0===o&&(o=n);const d=this.safeString(e,"orderType"),h=this.parseOrderSide(this.safeStringLower(e,"side"));let c=this.safeString2(e,"quantity","size");const l=void 0!==this.safeString(e,"triggerType"),u="market"===d&&"buy"===h;t.spot&&u&&!l&&(c=void 0);const f=this.safeString2(e,"status","state"),p=this.safeString(e,"feeDetail");let m,g,v;void 0!==p?m=this.parseFeeDetailString(p):(g=s?this.safeCurrencyCode(s):void 0,v=a.Y.stringAbs(this.safeString(e,"fee")));const y=this.parseOrderTimeInForce(this.safeStringLower(e,"timeInForce"));let w;void 0!==y&&(w="PO"===y);const b=this.omitZero(this.safeString(e,"triggerPrice"));let k=this.omitZero(this.safeString(e,"presetTakeProfitPrice")),S=this.omitZero(this.safeString2(e,"presetTakeProfitPrice","presetTakeLossPrice"));const O=this.safeString(e,"planType");return"loss_plan"===O?S=b:"profit_plan"===O&&(k=b),this.safeOrder({id:this.safeString(e,"orderId"),clientOrderId:this.safeString2(e,"clientOrderId","clientOid"),datetime:this.iso8601(r),timestamp:r,lastTradeTimestamp:void 0,lastUpdateTimestamp:this.safeInteger(e,"uTime"),status:this.parseOrderStatus(f),symbol:t.symbol,type:d,timeInForce:y,side:h,price:o,average:n||this.safeString(e,"fillPrice"),amount:c,filled:this.safeString2(e,"fillQuantity","filledQty"),remaining:void 0,triggerPrice:b,takeProfitPrice:k,stopLossPrice:S,cost:this.safeString2(e,"fillTotalAmount","filledAmount"),trades:void 0,fee:{currency:g,cost:v},fees:m,reduceOnly:this.safeBool(e,"reduceOnly"),postOnly:w,info:e},t)}parseOrderStatus(e){return this.safeString({not_trigger:"open",init:"open",new:"open",partially_filled:"open",full_fill:"closed",filled:"closed",cancel:"canceled",canceled:"canceled",cancelled:"canceled"},e,e)}parseOrderSide(e){return this.safeString({buy:"buy",sell:"sell",open_long:"buy",open_short:"sell",close_long:"sell",close_short:"buy",reduce_close_long:"sell",reduce_close_short:"buy",offset_close_long:"sell",offset_close_short:"buy",burst_close_long:"sell",burst_close_short:"buy",delivery_close_long:"sell",delivery_close_short:"buy",buy_single:"buy",sell_single:"sell"},e,e)}parseOrderTimeInForce(e){return this.safeString({normal:"GTC",post_only:"PO",iok:"IOC",fok:"FOK"},e,e)}parseFeeDetailString(e){const t=[],i=this.parseJson(e);if(i){const e=Object.keys(i);for(let s=0;s<e.length;s++){const r=this.safeString(e,s);if(r in this.currencies_by_id){const e=this.safeCurrencyCode(r),s=this.safeDict(i,r,{}),o=a.Y.stringAbs(this.safeString(s,"totalFee"));t.push({currency:e,amount:o})}}}return t}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let a,o="fetchMyTrades";[o,s]=this.handleParamString(s,"methodName",o),await this.loadMarkets();let n="spot";const d={};if(void 0!==e)a=this.market(e),n=a.type,d.symbol=a.id;else if([n,s]=this.handleMarketTypeAndParams(o,a,s,n),"spot"===n)throw new r.ArgumentsRequired(this.id+" "+o+"() requires a symbol argument for spot markets");let h,c=i;if("spot"===n){void 0!==t&&(c=500),void 0!==c&&(d.limit=c),h=await this.privatePostApiSpotV1TradeFills(this.extend(d,s))}else{if("swap"!==n)throw new r.NotSupported(this.id+" "+o+"() is not supported for "+n+" type of markets");{let i;if(s.startTime=void 0!==t?t:0,[i,s]=this.handleOptionAndParams(s,o,"until"),d.endTime=void 0!==i?i:this.milliseconds(),void 0!==e)h=await this.privateGetApiMixV1OrderFills(this.extend(d,s));else{let e="umcbl";e=this.handleOption(o,"productType",e),d.productType=e,h=await this.privateGetApiMixV1OrderAllFills(this.extend(d,s))}}}const l=this.safeList(h,"data",[]);return this.parseTrades(l,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){const o="fetchOrderTrades";if(void 0===t)throw new r.ArgumentsRequired(this.id+" "+o+" () requires a symbol argument");const n={orderId:e,methodName:o};return await this.fetchMyTrades(t,i,s,this.extend(n,a))}async fetchMarginMode(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id,marginCoin:i.settleId},r=await this.privateGetApiMixV1AccountAccount(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseMarginMode(a,i)}parseMarginMode(e,t=void 0){const i=this.safeStringLower(e,"marginMode");return{info:e,symbol:this.safeSymbol(void 0,t),marginMode:this.parseMarginModeType(i)}}parseMarginModeType(e){return this.safeString({crossed:"cross",fixed:"isolated"},e,e)}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");e=e.toLowerCase(),await this.loadMarkets();const s=this.market(t);if("swap"!==s.type)throw new r.NotSupported(this.id+" setMarginMode() is not supported for "+s.type+" type of markets");const a={symbol:s.id,marginCoin:s.settleId,marginMode:this.encodeMarginModeType(e)};return await this.privatePostApiMixV1AccountSetMarginMode(this.extend(a,i))}encodeMarginModeType(e){return this.safeString({cross:"crossed",isolated:"fixed"},e,e)}async fetchPositionMode(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchPositionMode() requires a symbol argument");await this.loadMarkets();const i=this.market(e);if("swap"!==i.type)throw new r.NotSupported(this.id+" fetchPositionMode() is not supported for "+i.type+" type of markets");const s={symbol:i.id,marginCoin:i.settleId},a=await this.privateGetApiMixV1AccountAccount(this.extend(s,t)),o=this.safeDict(a,"data",{});return{info:a,hedged:"double_hold"===this.safeString(o,"holdMode")}}async setPositionMode(e,t=void 0,i={}){await this.loadMarkets();let s=this.safeString(i,"productType");if(void 0===s)if(void 0!==t){const e=this.market(t);if("swap"!==e.type)throw new r.NotSupported(this.id+" setPositionMode() is not supported for "+e.type+" type of markets");const i=e.id.split("_");s=this.safeStringLower(i,1,s)}else s=this.handleOption("setPositionMode","productType","umcbl");const a={productType:s,holdMode:e?"double_hold":"single_hold"};return await this.privatePostApiMixV1AccountSetPositionMode(this.extend(a,i))}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e);if("swap"!==i.type)throw new r.NotSupported(this.id+" fetchLeverage() is not supported for "+i.type+" type of markets");const s={symbol:i.id,marginCoin:i.settleId},a=await this.privateGetApiMixV1AccountAccount(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseLeverage(o,i)}async setLeverage(e,t=void 0,i={}){const s="setLeverage";if(void 0===t)throw new r.ArgumentsRequired(this.id+" "+s+"() requires a symbol argument");await this.loadMarkets();const a=this.market(t);if("swap"!==a.type)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+a.type+" type of markets");const o={symbol:a.id,marginCoin:a.settleId,leverage:e};let n;[n,i]=this.handleOptionAndParams(i,s,"side"),void 0!==n&&(o.holdSide=n);const d=await this.privatePostApiMixV1AccountSetLeverage(this.extend(o,i)),h=this.safeDict(d,"data",{});return this.parseLeverage(h,a)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarketCustom(i,t);const s=this.parseMarginModeType(this.safeStringLower(e,"marginMode"));let r=this.safeInteger2(e,"fixedLongLeverage","longLeverage"),a=this.safeInteger2(e,"fixedShortLeverage","shortLeverage");const o=this.safeInteger(e,"crossMarginLeverage");return"cross"===s&&(r=o,a=o),{info:e,symbol:t.symbol,marginMode:s,longLeverage:r,shortLeverage:a}}async modifyMarginHelper(e,t,i,s={}){let o="modifyMarginHelper";[o,s]=this.handleParamString(s,"methodName",o),await this.loadMarkets();const n=this.market(e);if("swap"!==n.type)throw new r.NotSupported(this.id+" "+o+"() is not supported for "+n.type+" type of markets");t=this.amountToPrecision(e,t);const d={symbol:n.id,marginCoin:n.settleId,amount:t};let h;[h,s]=this.handleOptionAndParams(s,o,"side"),void 0!==h&&(d.holdSide=h);const c=await this.privatePostApiMixV1AccountSetMargin(this.extend(d,s));return"reduce"===i&&(t=a.Y.stringAbs(t)),this.extend(this.parseMarginModification(c,n),{amount:this.parseNumber(t),type:i})}parseMarginModification(e,t=void 0){const i="success"===this.safeString(e,"msg")?"ok":"failed";return{info:e,symbol:t.symbol,type:void 0,marginMode:void 0,amount:void 0,total:void 0,code:t.quote,status:i,timestamp:void 0,datetime:void 0}}async reduceMargin(e,t,i={}){return i.methodName="reduceMargin",await this.modifyMarginHelper(e,-t,"reduce",i)}async addMargin(e,t,i={}){return i.methodName="addMargin",await this.modifyMarginHelper(e,t,"add",i)}async fetchPosition(e,t={}){let i="long";[i,t]=this.handleOptionAndParams(t,"fetchPosition","side");const s=await this.fetchPositionsForSymbol(e,t);if(s.length>1)for(let e=0;e<s.length;e++){const t=s[e];if(t.side===i)return t}return s[0]}async fetchPositionsForSymbol(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id,marginCoin:i.settleId},r=await this.privateGetApiMixV1PositionSinglePositionV2(this.extend(s,t)),a=this.safeList(r,"data",[]);return this.parsePositions(a,[e])}async fetchPositions(e=void 0,t={}){const i="fetchPositions";await this.loadMarkets();let s="umcbl";if(void 0!==e){const t=this.marketIds(e);let a=[];for(let e=0;e<t.length;e++){const i=t[e].split("_"),s=this.safeString(i,1);a.push(s)}a=this.unique(a);if(a.length>1)throw new r.BadSymbol(this.id+" "+i+"() requires all symbols to belong to the same product type (umcbl or dmcbl)");s=a[0]}else[s,t]=this.handleOptionAndParams(t,i,"productType",s);const a={productType:s};if("dmcbl"===s){let e;if([e,t]=this.handleOptionAndParams(t,i,"marginCoin"),void 0!==e){const t=this.currency(e);a.marginCoin=t.id}}const o=await this.privateGetApiMixV1PositionAllPositionV2(this.extend(a,t)),n=this.safeList(o,"data",[]);return this.parsePositions(n,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"marginCoin");t=this.safeMarketCustom(i,t,s);const r=this.safeInteger(e,"cTime"),o=this.safeString(e,"marginMode");let n;const d=this.safeString(e,"holdMode");"double_hold"===d?n=!0:"single_hold"===d&&(n=!1);const h=this.safeNumber(e,"margin"),c=this.safeString(e,"keepMarginRate");return this.safePosition({symbol:t.symbol,id:void 0,timestamp:r,datetime:this.iso8601(r),contracts:this.safeNumber(e,"total"),contractSize:void 0,side:this.safeStringLower(e,"holdSide"),notional:h,leverage:this.safeInteger(e,"leverage"),unrealizedPnl:this.safeNumber(e,"unrealizedPL"),realizedPnl:this.safeNumber(e,"achievedProfits"),collateral:void 0,entryPrice:this.safeNumber(e,"averageOpenPrice"),markPrice:this.safeNumber(e,"marketPrice"),liquidationPrice:this.safeNumber(e,"liquidationPrice"),marginMode:this.parseMarginModeType(o),hedged:n,maintenanceMargin:void 0,maintenanceMarginPercentage:this.parseNumber(a.Y.stringMul(c,"100")),initialMargin:h,initialMarginPercentage:void 0,marginRatio:this.safeNumber(e,"marginRatio"),lastUpdateTimestamp:this.safeInteger(e,"uTime"),lastPrice:void 0,stopLossPrice:void 0,takeProfitPrice:void 0,percentage:void 0,info:e})}safeMarketCustom(e,t=void 0,i=void 0){try{t=this.safeMarket(e,t)}catch(s){const r=this.safeList(this.markets_by_id,e,[]);if(void 0===i)t=r[0];else for(let e=0;e<r.length;e++){const s=r[e];if(s.settleId===i){t=s;break}}}return t}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const a="fetchLedger";await this.loadMarkets();const o={};let n,d,h="spot";if([h,s]=this.handleMarketTypeAndParams(a,void 0,s,h),void 0!==e&&(d=this.currency(e)),"spot"===h){if(void 0!==d){const e=this.safeString(d,"numericId");o.coinId=e}void 0!==i&&(o.limit=i);const e=await this.privatePostApiSpotV1AccountBills(this.extend(o,s));n=this.safeList(e,"data",[])}else{if("swap"!==h)throw new r.NotSupported(this.id+" "+a+"() does not support market type "+h);{let r;o.startTime=void 0!==t?t:0,[r,s]=this.handleOptionAndParams(s,a,"until"),o.endTime=void 0!==r?r:this.milliseconds(),void 0!==i&&(o.pageSize=i);let d="umcbl";d=void 0===e?this.handleOption(a,"productType",d):"USDT"===e?"umcbl":"dmcbl",[d,s]=this.handleParamString(s,"productType",d),o.productType=d;const h=await this.privateGetApiMixV1AccountAccountBusinessBill(this.extend(o,s)),c=this.safeDict(h,"data",{});n=this.safeList(c,"result",[])}}return this.parseLedger(n,d,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeInteger(e,"cTime"),s=this.safeString2(e,"coinName","marginCoin");let r;const o=this.safeString(e,"symbol");r=this.safeMarketCustom(o,r,s);let n=this.safeString2(e,"quantity","amount"),d="in";a.Y.stringLt(n,"0")&&(d="out",n=a.Y.stringMul(n,"-1"));const h={cost:a.Y.stringAbs(this.safeString2(e,"fee","fees")),currency:this.safeString(e,"feeCoin")};return this.safeLedgerEntry({id:this.safeString2(e,"billId","id"),info:e,timestamp:i,datetime:this.iso8601(i),account:void 0,direction:d,referenceId:void 0,referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeStringLower2(e,"bizType","business")),currency:this.safeCurrencyCode(s,t),symbol:r.symbol,amount:n,before:void 0,after:this.safeString(e,"balance"),status:"ok",fee:h},t)}parseLedgerEntryType(e){return this.safeString({deposit:"deposit",withdraw:"withdrawal",buy:"trade",sell:"trade","deduction of handling fee":"fee","transfer-in":"transfer","transfer in":"transfer","transfer out":"transfer","rebate rewards":"rebate","airdrop rewards":"rebate","usdt contract rewards":"rebate","mix contract rewards":"rebate","system lock":"system lock","user lock":"user lock",open_long:"trade",open_short:"trade",close_long:"trade",close_short:"trade",trans_from_exchange:"transfer",trans_to_exchange:"transfer",contract_settle_fee:"fee",burst_long_loss_query:"trade",burst_short_loss_query:"trade"},e,e)}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;let c=this.safeString(n,"msg");const l=this.id+" "+o;let u=this.safeString(n,"code"),f="success"===c||void 0===c;if(i.indexOf("batch")>=0){const e=this.safeDict(n,"data",{}),t=this.safeList2(e,"failure","fail_infos",[]);if(!this.isEmpty(t)){f=!1;const e=this.safeDict(t,0,{});u=this.safeString(e,"errorCode"),c=this.safeString(e,"errorMsg")}}if(!f)throw this.throwExactlyMatchedException(this.exceptions.exact,u,l),this.throwBroadlyMatchedException(this.exceptions.broad,c,l),new r.ExchangeError(l)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+e;if("GET"===i){const e=this.urlencode(s);0!==e.length&&(o+="?"+e)}if("private"===t){this.checkRequiredCredentials();const e=this.numberToString(this.milliseconds());let t="";"GET"!==i&&(t=a=this.json(s));const d=e+i+o+t,h=this.hmac(this.encode(d),this.encode(this.secret),n.s,"base64");r={"ACCESS-KEY":this.apiKey,"ACCESS-SIGN":h,"ACCESS-TIMESTAMP":e,"ACCESS-PASSPHRASE":this.password,"Content-Type":"application/json","X-CHANNEL-API-CODE":this.safeString(this.options,"brokerId","47cfy")}}return{url:this.urls.api[t]+o,method:i,body:a,headers:r}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coincheck",name:"coincheck",countries:["JP","ID"],rateLimit:1500,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,ws:!0},urls:{logo:"https://user-images.githubusercontent.com/51840849/87182088-1d6d6380-c2ec-11ea-9c64-8ab9f9b289f5.jpg",api:{rest:"https://coincheck.com/api"},www:"https://coincheck.com",doc:"https://coincheck.com/documents/exchange/api",fees:["https://coincheck.com/exchange/fee","https://coincheck.com/info/fee"]},api:{public:{get:["exchange/orders/rate","order_books","rate/{pair}","ticker","trades"]},private:{get:["accounts","accounts/balance","accounts/leverage_balance","bank_accounts","deposit_money","exchange/orders/opens","exchange/orders/transactions","exchange/orders/transactions_pagination","exchange/leverage/positions","lending/borrows/matches","send_money","withdraws"],post:["bank_accounts","deposit_money/{id}/fast","exchange/orders","exchange/transfers/to_leverage","exchange/transfers/from_leverage","lending/borrows","lending/borrows/{id}/repay","send_money","withdraws"],delete:["bank_accounts/{id}","exchange/orders/{id}","withdraws/{id}"]}},markets:{"BTC/JPY":this.safeMarketStructure({id:"btc_jpy",symbol:"BTC/JPY",base:"BTC",quote:"JPY",baseId:"btc",quoteId:"jpy",type:"spot",spot:!0}),"ETC/JPY":this.safeMarketStructure({id:"etc_jpy",symbol:"ETC/JPY",base:"ETC",quote:"JPY",baseId:"etc",quoteId:"jpy",type:"spot",spot:!0}),"FCT/JPY":this.safeMarketStructure({id:"fct_jpy",symbol:"FCT/JPY",base:"FCT",quote:"JPY",baseId:"fct",quoteId:"jpy",type:"spot",spot:!0}),"MONA/JPY":this.safeMarketStructure({id:"mona_jpy",symbol:"MONA/JPY",base:"MONA",quote:"JPY",baseId:"mona",quoteId:"jpy",type:"spot",spot:!0}),"ETC/BTC":this.safeMarketStructure({id:"etc_btc",symbol:"ETC/BTC",base:"ETC",quote:"BTC",baseId:"etc",quoteId:"btc",type:"spot",spot:!0})},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0"),taker:this.parseNumber("0")}},precisionMode:a.kb,exceptions:{exact:{"disabled API Key":r.AuthenticationError,"invalid authentication":r.AuthenticationError},broad:{}}})}parseBalance(e){const t={info:e},i=Object.keys(this.currencies);for(let s=0;s<i.length;s++){const r=i[s],a=this.currency(r).id;if(a in e){const i=this.account(),s=a+"_reserved";i.free=this.safeString(e,a),i.used=this.safeString(e,s),t[r]=i}}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountsBalance(e);return this.parseBalance(t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privateGetExchangeOrdersOpens(s),o=this.safeValue(a,"orders",[]),n=this.parseOrders(o,r,t,i),d=[];for(let e=0;e<n.length;e++)d.push(this.extend(n[e],{status:"open"}));return d}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"order_type"),r=this.parse8601(this.safeString(e,"created_at")),a=this.safeString(e,"pending_amount"),o=this.safeString(e,"pending_amount"),n=this.safeString(e,"rate"),d=this.safeString(e,"pair"),h=this.safeSymbol(d,t,"_");return this.safeOrder({id:i,clientOrderId:void 0,timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,amount:a,remaining:o,filled:void 0,side:s,type:void 0,timeInForce:void 0,postOnly:void 0,status:undefined,symbol:h,price:n,triggerPrice:void 0,cost:void 0,fee:void 0,info:e,average:void 0,trades:void 0},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id},a=await this.publicGetOrderBooks(this.extend(r,i));return this.parseOrderBook(a,s.symbol)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeTimestamp(e,"timestamp"),r=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){if("BTC/JPY"!==e)throw new r.BadSymbol(this.id+" fetchTicker() supports BTC/JPY only");await this.loadMarkets();const i=this.market(e),s={pair:i.id},a=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(a,i)}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString(e,"created_at")),s=this.safeString(e,"id"),r=this.safeString(e,"rate"),a=this.safeString(e,"pair"),o=(t=this.safeMarket(a,t,"_")).baseId,n=t.quoteId,d=t.symbol;let h,c,l,u,f,p;if("liquidity"in e){"T"===this.safeString(e,"liquidity")?h="taker":"M"===this.safeString(e,"liquidity")&&(h="maker");const t=this.safeValue(e,"funds",{});c=this.safeString(t,o),l=this.safeString(t,n),f={currency:this.safeString(e,"fee_currency"),cost:this.safeString(e,"fee")},u=this.safeString(e,"side"),p=this.safeString(e,"order_id")}else c=this.safeString(e,"amount"),u=this.safeString(e,"order_type");return this.safeTrade({id:s,info:e,datetime:this.iso8601(i),timestamp:i,symbol:d,type:void 0,side:u,order:p,takerOrMaker:h,price:r,amount:c,cost:l,fee:f},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={};void 0!==i&&(a.limit=i);const o=await this.privateGetExchangeOrdersTransactionsPagination(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetAccounts(e),i=this.safeValue(t,"exchange_fees",{}),s={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e],r=this.market(t),a=this.safeValue(i,r.id,{});s[t]={info:a,symbol:t,maker:this.safeNumber(a,"maker_fee"),taker:this.safeNumber(a,"taker_fee"),percentage:!0,tierBased:!1}}return s}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={pair:o.id};if("market"===t){const e=t+"_"+i;n.order_type=e;n[("buy"===i?e+"_":"")+"amount"]=s}else n.order_type=i,n.rate=r,n.amount=s;const d=await this.privatePostExchangeOrders(this.extend(n,a)),h=this.safeString(d,"id");return this.safeOrder({id:h,info:d},o)}async cancelOrder(e,t=void 0,i={}){const s={id:e},r=await this.privateDeleteExchangeOrdersId(this.extend(s,i));return this.parseOrder(r)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.currency=r.id),void 0!==i&&(a.limit=i);const o=await this.privateGetDepositMoney(this.extend(a,s)),n=this.safeList(o,"deposits",[]);return this.parseTransactions(n,r,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={};void 0!==i&&(a.limit=i);const o=await this.privateGetWithdraws(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,r,t,i,{type:"withdrawal"})}parseTransactionStatus(e){return this.safeString({pending:"pending",processing:"pending",finished:"ok",canceled:"canceled",confirmed:"pending",received:"ok"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.parse8601(this.safeString(e,"created_at")),r=this.safeString(e,"address"),a=this.safeNumber(e,"amount"),o=this.safeString(e,"currency"),n=this.safeCurrencyCode(o,t),d=this.parseTransactionStatus(this.safeString(e,"status")),h=this.parse8601(this.safeString(e,"confirmed_at"));let c;const l=this.safeNumber(e,"fee");return void 0!==l&&(c={cost:l,currency:n}),{info:e,id:i,txid:void 0,timestamp:s,datetime:this.iso8601(s),network:void 0,address:r,addressTo:r,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:void 0,amount:a,currency:n,status:d,updated:h,comment:void 0,internal:void 0,fee:c}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n=this.urls.api.rest+"/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(d).length&&(n+="?"+this.urlencode(d));else{this.checkRequiredCredentials();const e=this.nonce().toString();let t="";"GET"===i?Object.keys(d).length&&(n+="?"+this.urlencode(this.keysort(d))):Object.keys(d).length&&(t=a=this.urlencode(this.keysort(d)));const s=e+n+t;r={"Content-Type":"application/x-www-form-urlencoded","ACCESS-KEY":this.apiKey,"ACCESS-NONCE":e,"ACCESS-SIGNATURE":this.hmac(this.encode(s),this.encode(this.secret),o.s)}}return{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(!this.safeBool(n,"success",!0)){const e=this.safeString(n,"error"),t=this.id+" "+this.json(n);throw this.throwExactlyMatchedException(this.exceptions.exact,e,t),this.throwBroadlyMatchedException(this.exceptions.broad,o,t),new r.ExchangeError(this.id+" "+this.json(n))}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinex",name:"CoinEx",version:"v2",countries:["CN"],rateLimit:2.5,pro:!0,certified:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!0,borrowCrossMargin:!1,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createReduceOnlyOrder:!0,createStopLossOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!0,fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!0,fetchIsolatedBorrowRates:!1,fetchLeverage:!0,fetchLeverages:!1,fetchLeverageTiers:!0,fetchMarginAdjustmentHistory:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!0,fetchPositionHistory:!0,fetchPositions:!0,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!0,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!0,repayCrossMargin:!1,repayIsolatedMargin:!0,setLeverage:!0,setMarginMode:!0,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1min","3m":"3min","5m":"5min","15m":"15min","30m":"30min","1h":"1hour","2h":"2hour","4h":"4hour","6h":"6hour","12h":"12hour","1d":"1day","3d":"3day","1w":"1week"},urls:{logo:"https://user-images.githubusercontent.com/51840849/87182089-1e05fa00-c2ec-11ea-8da9-cc73b45abbbc.jpg",api:{public:"https://api.coinex.com",private:"https://api.coinex.com",perpetualPublic:"https://api.coinex.com/perpetual",perpetualPrivate:"https://api.coinex.com/perpetual"},www:"https://www.coinex.com",doc:"https://docs.coinex.com/api/v2",fees:"https://www.coinex.com/fees",referral:"https://www.coinex.com/register?refer_code=yw5fz"},api:{v1:{public:{get:{"amm/market":1,"common/currency/rate":1,"common/asset/config":1,"common/maintain/info":1,"common/temp-maintain/info":1,"margin/market":1,"market/info":1,"market/list":1,"market/ticker":1,"market/ticker/all":1,"market/depth":1,"market/deals":1,"market/kline":1,"market/detail":1}},private:{get:{"account/amm/balance":40,"account/investment/balance":40,"account/balance/history":40,"account/market/fee":40,"balance/coin/deposit":40,"balance/coin/withdraw":40,"balance/info":40,"balance/deposit/address/{coin_type}":40,"contract/transfer/history":40,"credit/info":40,"credit/balance":40,"investment/transfer/history":40,"margin/account":1,"margin/config":1,"margin/loan/history":40,"margin/transfer/history":40,"order/deals":40,"order/finished":40,"order/pending":8,"order/status":8,"order/status/batch":8,"order/user/deals":40,"order/stop/finished":40,"order/stop/pending":8,"order/user/trade/fee":1,"order/market/trade/info":1,"sub_account/balance":1,"sub_account/transfer/history":40,"sub_account/auth/api":40,"sub_account/auth/api/{user_auth_id}":40},post:{"balance/coin/withdraw":40,"contract/balance/transfer":40,"margin/flat":40,"margin/loan":40,"margin/transfer":40,"order/limit/batch":40,"order/ioc":13.334,"order/limit":13.334,"order/market":13.334,"order/modify":13.334,"order/stop/limit":13.334,"order/stop/market":13.334,"order/stop/modify":13.334,"sub_account/transfer":40,"sub_account/register":1,"sub_account/unfrozen":40,"sub_account/frozen":40,"sub_account/auth/api":40},put:{"balance/deposit/address/{coin_type}":40,"sub_account/unfrozen":40,"sub_account/frozen":40,"sub_account/auth/api/{user_auth_id}":40,"v1/account/settings":40},delete:{"balance/coin/withdraw":40,"order/pending/batch":40,"order/pending":13.334,"order/stop/pending":40,"order/stop/pending/{id}":13.334,"order/pending/by_client_id":40,"order/stop/pending/by_client_id":40,"sub_account/auth/api/{user_auth_id}":40,"sub_account/authorize/{id}":40}},perpetualPublic:{get:{ping:1,time:1,"market/list":1,"market/limit_config":1,"market/ticker":1,"market/ticker/all":1,"market/depth":1,"market/deals":1,"market/funding_history":1,"market/kline":1}},perpetualPrivate:{get:{"market/user_deals":1,"asset/query":40,"order/pending":8,"order/finished":40,"order/stop_finished":40,"order/stop_pending":8,"order/status":8,"order/stop_status":8,"position/finished":40,"position/pending":40,"position/funding":40,"position/adl_history":40,"market/preference":40,"position/margin_history":40,"position/settle_history":40},post:{"market/adjust_leverage":1,"market/position_expect":1,"order/put_limit":20,"order/put_market":20,"order/put_stop_limit":20,"order/put_stop_market":20,"order/modify":20,"order/modify_stop":20,"order/cancel":20,"order/cancel_all":40,"order/cancel_batch":40,"order/cancel_stop":20,"order/cancel_stop_all":40,"order/close_limit":20,"order/close_market":20,"position/adjust_margin":20,"position/stop_loss":20,"position/take_profit":20,"position/market_close":20,"order/cancel/by_client_id":20,"order/cancel_stop/by_client_id":20,"market/preference":20}}},v2:{public:{get:{"maintain/info":1,ping:1,time:1,"spot/market":1,"spot/ticker":1,"spot/depth":1,"spot/deals":1,"spot/kline":1,"spot/index":1,"futures/market":1,"futures/ticker":1,"futures/depth":1,"futures/deals":1,"futures/kline":1,"futures/index":1,"futures/funding-rate":1,"futures/funding-rate-history":1,"futures/position-level":1,"futures/liquidation-history":1,"futures/basis-history":1,"assets/deposit-withdraw-config":1,"assets/all-deposit-withdraw-config":1}},private:{get:{"account/subs":1,"account/subs/api-detail":40,"account/subs/info":1,"account/subs/api":40,"account/subs/transfer-history":40,"account/subs/spot-balance":1,"account/trade-fee-rate":40,"assets/spot/balance":40,"assets/futures/balance":40,"assets/margin/balance":1,"assets/financial/balance":40,"assets/amm/liquidity":40,"assets/credit/info":40,"assets/margin/borrow-history":40,"assets/margin/interest-limit":1,"assets/deposit-address":40,"assets/deposit-history":40,"assets/withdraw":40,"assets/transfer-history":40,"spot/order-status":8,"spot/batch-order-status":8,"spot/pending-order":8,"spot/finished-order":40,"spot/pending-stop-order":8,"spot/finished-stop-order":40,"spot/user-deals":40,"spot/order-deals":40,"futures/order-status":8,"futures/batch-order-status":1,"futures/pending-order":8,"futures/finished-order":40,"futures/pending-stop-order":8,"futures/finished-stop-order":40,"futures/user-deals":1,"futures/order-deals":1,"futures/pending-position":40,"futures/finished-position":1,"futures/position-margin-history":1,"futures/position-funding-history":40,"futures/position-adl-history":1,"futures/position-settle-history":1},post:{"account/subs":40,"account/subs/frozen":40,"account/subs/unfrozen":40,"account/subs/api":40,"account/subs/edit-api":40,"account/subs/delete-api":40,"account/subs/transfer":40,"account/settings":40,"assets/margin/borrow":40,"assets/margin/repay":40,"assets/renewal-deposit-address":40,"assets/withdraw":40,"assets/cancel-withdraw":40,"assets/transfer":40,"assets/amm/add-liquidity":1,"assets/amm/remove-liquidity":1,"spot/order":13.334,"spot/stop-order":13.334,"spot/batch-order":40,"spot/batch-stop-order":1,"spot/modify-order":13.334,"spot/modify-stop-order":13.334,"spot/cancel-all-order":1,"spot/cancel-order":6.667,"spot/cancel-stop-order":6.667,"spot/cancel-batch-order":10,"spot/cancel-batch-stop-order":10,"spot/cancel-order-by-client-id":1,"spot/cancel-stop-order-by-client-id":1,"futures/order":20,"futures/stop-order":20,"futures/batch-order":1,"futures/batch-stop-order":1,"futures/modify-order":20,"futures/modify-stop-order":20,"futures/cancel-all-order":1,"futures/cancel-order":10,"futures/cancel-stop-order":10,"futures/cancel-batch-order":20,"futures/cancel-batch-stop-order":20,"futures/cancel-order-by-client-id":1,"futures/cancel-stop-order-by-client-id":1,"futures/close-position":20,"futures/adjust-position-margin":20,"futures/adjust-position-leverage":20,"futures/set-position-stop-loss":20,"futures/set-position-take-profit":20}}}},fees:{trading:{maker:.001,taker:.001},funding:{withdraw:{BCH:0,BTC:.001,LTC:.001,ETH:.001,ZEC:1e-4,DASH:1e-4}}},limits:{amount:{min:.001,max:void 0}},options:{brokerId:"x-167673045",createMarketBuyOrderRequiresPrice:!0,defaultType:"spot",defaultSubType:"linear",fetchDepositAddress:{fillResponseFromRequest:!0},accountsByType:{spot:"SPOT",margin:"MARGIN",swap:"FUTURES"},accountsById:{SPOT:"spot",MARGIN:"margin",FUTURES:"swap"},networks:{BTC:"BTC",BEP20:"BSC",TRC20:"TRC20",ERC20:"ERC20",BRC20:"BRC20",SOL:"SOL",TON:"TON",BSV:"BSV",AVAXC:"AVA_C",AVAXX:"AVA",SUI:"SUI",ACA:"ACA",CHZ:"CHILIZ",ADA:"ADA",ARB:"ARBITRUM",ARBNOVA:"ARBITRUM_NOVA",OP:"OPTIMISM",APT:"APTOS",ATOM:"ATOM",FTM:"FTM",BCH:"BCH",ASTR:"ASTR",LTC:"LTC",MATIC:"MATIC",CRONOS:"CRONOS",DASH:"DASH",DOT:"DOT",ETC:"ETC",ETHW:"ETHPOW",FIL:"FIL",ZIL:"ZIL",DOGE:"DOGE",TIA:"CELESTIA",SEI:"SEI",XRP:"XRP",XMR:"XMR"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!0,iceberg:!0},createOrders:{max:5},fetchMyTrades:{marginMode:!0,limit:1e3,daysBack:void 0,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:1e3,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},forDerivatives:{extends:"spot",createOrder:{marginMode:!0,stopLossPrice:!0,takeProfitPrice:!0},fetchOpenOrders:{marginMode:!1},fetchClosedOrders:{marginMode:!1}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},commonCurrencies:{ACM:"Actinium"},precisionMode:o.kb,exceptions:{exact:{23:r.PermissionDenied,24:r.AuthenticationError,25:r.AuthenticationError,34:r.AuthenticationError,35:r.ExchangeNotAvailable,36:r.RequestTimeout,213:r.RateLimitExceeded,107:r.InsufficientFunds,158:r.PermissionDenied,600:r.OrderNotFound,601:r.InvalidOrder,602:r.InvalidOrder,606:r.InvalidOrder,3008:r.RequestTimeout,3109:r.InsufficientFunds,3127:r.InvalidOrder,3600:r.OrderNotFound,3606:r.InvalidOrder,3610:r.ExchangeError,3612:r.InvalidOrder,3613:r.InvalidOrder,3614:r.InvalidOrder,3615:r.InvalidOrder,3616:r.InvalidOrder,3617:r.InvalidOrder,3618:r.InvalidOrder,3619:r.InvalidOrder,3620:r.InvalidOrder,3621:r.InvalidOrder,3622:r.InvalidOrder,3627:r.InvalidOrder,3628:r.InvalidOrder,3629:r.InvalidOrder,3632:r.InvalidOrder,3633:r.InvalidOrder,3634:r.InvalidOrder,3635:r.InvalidOrder,4001:r.ExchangeNotAvailable,4002:r.RequestTimeout,4003:r.ExchangeError,4004:r.BadRequest,4005:r.AuthenticationError,4006:r.AuthenticationError,4007:r.PermissionDenied,4008:r.AuthenticationError,4009:r.ExchangeError,4010:r.ExchangeError,4011:r.PermissionDenied,4017:r.ExchangeError,4115:r.AccountSuspended,4117:r.BadSymbol,4123:r.RateLimitExceeded,4130:r.ExchangeError,4158:r.ExchangeError,4213:r.RateLimitExceeded,4512:r.PermissionDenied},broad:{"ip not allow visit":r.PermissionDenied,"service too busy":r.ExchangeNotAvailable}}})}async fetchCurrencies(e={}){const t=await this.v2PublicGetAssetsAllDepositWithdrawConfig(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeDict(t,"asset",{}),a=this.safeList(t,"chains",[]),o=this.safeString(r,"ccy");if(void 0===o)continue;const n=this.safeCurrencyCode(o),d=this.safeBool(r,"deposit_enabled"),h=this.safeBool(r,"withdraw_enabled"),c=this.safeDict(a,0,{}),l=this.parsePrecision(this.safeString(c,"withdrawal_precision"));s[n]={id:o,code:n,name:void 0,active:d&&h,deposit:d,withdraw:h,fee:void 0,precision:this.parseNumber(l),limits:{amount:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{},info:t};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"chain"),r=this.parsePrecision(this.safeString(t,"withdrawal_precision")),o=this.safeString(t,"withdrawal_fee"),d=this.safeString(t,"min_deposit_amount"),h=this.safeString(t,"min_withdraw_amount"),c=this.safeBool(t,"deposit_enabled"),l=this.safeBool(t,"withdraw_enabled"),u={id:i,network:i,name:void 0,active:c&&l,deposit:c,withdraw:l,fee:this.parseNumber(o),precision:this.parseNumber(r),limits:{amount:{min:void 0,max:void 0},deposit:{min:this.parseNumber(d),max:void 0},withdraw:{min:this.parseNumber(h),max:void 0}},info:t},f=this.safeDict(s[n],"networks",{});f[i]=u,s[n].networks=f}}return s}async fetchMarkets(e={}){const t=[this.fetchSpotMarkets(e),this.fetchContractMarkets(e)],i=await Promise.all(t),s=i[0],r=i[1];return this.arrayConcat(s,r)}async fetchSpotMarkets(e){const t=await this.v2PublicGetSpotMarket(e),i=this.safeList(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"market"),a=this.safeString(t,"base_ccy"),o=this.safeString(t,"quote_ccy"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=n+"/"+d;s.push({id:r,symbol:h,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:void 0,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(t,"taker_fee_rate"),maker:this.safeNumber(t,"maker_fee_rate"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"base_ccy_precision"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"quote_ccy_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"min_amount"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}async fetchContractMarkets(e){const t=await this.v2PublicGetFuturesMarket(e),i=this.safeList(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.fees,a=this.safeList(t,"leverage",[]),o=this.safeString(t,"contract_type"),n="linear"===o,d="inverse"===o,h=this.safeString(t,"market"),c=this.safeString(t,"base_ccy"),l=this.safeString(t,"quote_ccy"),u=this.safeCurrencyCode(c),f=this.safeCurrencyCode(l),p="linear"===o?"USDT":c,m=this.safeCurrencyCode(p),g=u+"/"+f+":"+m,v=a.length;s.push({id:h,symbol:g,base:u,quote:f,settle:m,baseId:c,quoteId:l,settleId:p,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:void 0,contract:!0,linear:n,inverse:d,taker:r.trading.taker,maker:r.trading.maker,contractSize:this.parseNumber("1"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"base_ccy_precision"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"quote_ccy_precision")))},limits:{leverage:{min:this.safeNumber(a,0),max:this.safeNumber(a,v-1)},amount:{min:this.safeNumber(t,"min_amount"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}parseTicker(e,t=void 0){const i="mark_price"in e?"swap":"spot",s=this.safeString(e,"market"),r=this.safeSymbol(s,t,void 0,i);return this.safeTicker({symbol:r,timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:void 0,bidVolume:this.safeString(e,"volume_buy"),ask:void 0,askVolume:this.safeString(e,"volume_sell"),vwap:void 0,open:this.safeString(e,"open"),close:this.safeString(e,"close"),last:this.safeString(e,"last"),previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,markPrice:this.safeString(e,"mark_price"),indexPrice:this.safeString(e,"index_price"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id};let r;r=i.swap?await this.v2PublicGetFuturesTicker(this.extend(s,t)):await this.v2PublicGetSpotTicker(this.extend(s,t));const a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))){const t=this.safeValue(e,0);i=this.market(t)}const[s,r]=this.handleMarketTypeAndParams("fetchTickers",i,t);let a;a="swap"===s?await this.v2PublicGetFuturesTicker(r):await this.v2PublicGetSpotTicker(r);const o=this.safeList(a,"data",[]);return this.parseTickers(o,e)}async fetchTime(e={}){const t=await this.v2PublicGetTime(e),i=this.safeDict(t,"data",{});return this.safeInteger(i,"timestamp")}async fetchOrderBook(e,t=20,i={}){await this.loadMarkets();const s=this.market(e);void 0===t&&(t=20);const r={market:s.id,limit:t,interval:"0"};let a;a=s.swap?await this.v2PublicGetFuturesDepth(this.extend(r,i)):await this.v2PublicGetSpotDepth(this.extend(r,i));const o=this.safeDict(a,"data",{}),n=this.safeDict(o,"depth",{}),d=this.safeInteger(n,"updated_at");return this.parseOrderBook(n,e,d)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"created_at");let s=this.safeString(this.options,"defaultType");void 0!==t&&(s=t.type);const r=this.safeString(e,"market");t=this.safeMarket(r,t,void 0,s);const a=this.safeString(e,"fee");let o;if(void 0!==a){const t=this.safeString(e,"fee_ccy");o={cost:a,currency:this.safeCurrencyCode(t)}}return this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,id:this.safeString(e,"deal_id"),order:this.safeString(e,"order_id"),type:void 0,side:this.safeString(e,"side"),takerOrMaker:this.safeString(e,"role"),price:this.safeString(e,"price"),amount:this.safeString(e,"amount"),cost:this.safeString(e,"deal_money"),fee:o},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market:r.id};let o;return void 0!==i&&(a.limit=i),o=r.swap?await this.v2PublicGetFuturesDeals(this.extend(a,s)):await this.v2PublicGetSpotDeals(this.extend(a,s)),this.parseTrades(o.data,r,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id};let r;r=i.spot?await this.v2PublicGetSpotMarket(this.extend(s,t)):await this.v2PublicGetFuturesMarket(this.extend(s,t));const a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTradingFee(o,i)}async fetchTradingFees(e={}){let t,i;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchTradingFees",void 0,e),i="swap"===t?await this.v2PublicGetFuturesMarket(e):await this.v2PublicGetSpotMarket(e);const s=this.safeList(i,"data",[]),r={};for(let e=0;e<s.length;e++){const i=s[e],a=this.safeString(i,"market"),o=this.safeMarket(a,void 0,void 0,t);r[o.symbol]=this.parseTradingFee(i,o)}return r}parseTradingFee(e,t=void 0){const i=this.safeValue(e,"market");return{info:e,symbol:this.safeSymbol(i,t),maker:this.safeNumber(e,"maker_fee_rate"),taker:this.safeNumber(e,"taker_fee_rate"),percentage:!0,tierBased:!0}}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"created_at"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"value")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,period:this.safeString(this.timeframes,t,t)};let n;void 0!==s&&(o.limit=s),n=a.swap?await this.v2PublicGetFuturesKline(this.extend(o,r)):await this.v2PublicGetSpotKline(this.extend(o,r));const d=this.safeList(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}async fetchMarginBalance(e={}){await this.loadMarkets();const t=await this.v2PrivateGetAssetsMarginBalance(e),i={info:t},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeDict(t,"available",{}),o=this.safeDict(t,"frozen",{}),n=this.safeDict(t,"repaid",{}),d=this.safeDict(t,"interest",{}),h=this.account(),c=this.safeString(t,"base_ccy"),l=this.safeCurrencyCode(c);h.free=this.safeString(r,"base_ccy"),h.used=this.safeString(o,"base_ccy");const u=this.safeString(n,"base_ccy"),f=this.safeString(d,"base_ccy");h.debt=a.Y.stringAdd(u,f),i[l]=h}return this.safeBalance(i)}async fetchSpotBalance(e={}){await this.loadMarkets();const t=await this.v2PrivateGetAssetsSpotBalance(e),i={info:t},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"ccy"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"available"),o.used=this.safeString(t,"frozen"),i[a]=o}return this.safeBalance(i)}async fetchSwapBalance(e={}){await this.loadMarkets();const t=await this.v2PrivateGetAssetsFuturesBalance(e),i={info:t},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"ccy"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"available"),o.used=this.safeString(t,"frozen"),i[a]=o}return this.safeBalance(i)}async fetchFinancialBalance(e={}){await this.loadMarkets();const t=await this.v2PrivateGetAssetsFinancialBalance(e),i={info:t},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"ccy"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"available"),o.used=this.safeString(t,"frozen"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){let t,i;[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[i,e]=this.handleMarginModeAndParams("fetchBalance",e);const s=void 0!==i||"margin"===t;return"swap"===t?await this.fetchSwapBalance(e):"financial"===t?await this.fetchFinancialBalance(e):s?await this.fetchMarginBalance(e):await this.fetchSpotBalance(e)}parseOrderStatus(e){return this.safeString({rejected:"rejected",open:"open",not_deal:"open",part_deal:"open",done:"closed",cancel:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"status"),s=this.safeInteger(e,"created_at");let r=this.safeInteger(e,"updated_at");0===r&&(r=s);const a=this.safeString(e,"market"),o=this.safeString(this.options,"defaultType");let n=this.safeStringLower(e,"market_type",o);"futures"===n&&(n="swap");const d="swap"===n?"swap":"spot";t=this.safeMarket(a,t,void 0,d);const h=this.safeString(e,"fee_ccy");let c=this.safeCurrencyCode(h);void 0===c&&(c=t.quote);let l=this.safeString(e,"side");"long"===l?l="buy":"short"===l&&(l="sell");let u=this.safeString(e,"client_id");return""===u&&(u=void 0),this.safeOrder({id:this.safeStringN(e,["position_id","order_id","stop_id"]),clientOrderId:u,datetime:this.iso8601(s),timestamp:s,lastTradeTimestamp:r,status:this.parseOrderStatus(i),symbol:t.symbol,type:this.safeString(e,"type"),timeInForce:void 0,postOnly:void 0,reduceOnly:void 0,side:l,price:this.safeString(e,"price"),triggerPrice:this.safeString(e,"trigger_price"),takeProfitPrice:this.safeNumber(e,"take_profit_price"),stopLossPrice:this.safeNumber(e,"stop_loss_price"),cost:this.safeString(e,"filled_value"),average:this.safeString(e,"avg_entry_price"),amount:this.safeString(e,"amount"),filled:this.safeString(e,"filled_amount"),remaining:this.safeString(e,"unfilled_amount"),trades:void 0,fee:{currency:c,cost:this.safeString2(e,"quote_fee","fee")},info:e},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}createOrderRequest(e,t,i,s,o=void 0,n={}){const d=this.market(e),h=d.swap,c=this.safeString2(n,"client_id","clientOrderId"),l=this.safeString2(n,"stopPrice","triggerPrice"),u=this.safeString(n,"stopLossPrice"),f=this.safeString(n,"takeProfitPrice"),p=this.safeString(n,"option"),m="market"===t,g=this.isPostOnly(m,"maker_only"===p,n),v=this.safeStringUpper(n,"timeInForce"),y=this.safeBool(n,"reduceOnly");if(y&&!d.swap)throw new r.InvalidOrder(this.id+" createOrder() does not support reduceOnly for "+d.type+" orders, reduceOnly orders are supported for swap markets only");const w={market:d.id};if(void 0===c){const e="x-167673045",t=this.safeString(this.options,"brokerId",e);w.client_id=t+"-"+this.uuid16()}else w.client_id=c;if(void 0===u&&void 0===f){y||(w.side=i);let s=t;g?s="maker_only":void 0!==v&&("IOC"===v?s="ioc":"FOK"===v&&(s="fok")),m||(w.price=this.priceToPrecision(e,o)),w.type=s}if(h)w.market_type="FUTURES",u||f?u?(w.stop_loss_price=this.priceToPrecision(e,u),w.stop_loss_type=this.safeString(n,"stop_type","latest_price")):f&&(w.take_profit_price=this.priceToPrecision(e,f),w.take_profit_type=this.safeString(n,"stop_type","latest_price")):(w.amount=this.amountToPrecision(e,s),void 0!==l&&(w.trigger_price=this.priceToPrecision(e,l),w.trigger_price_type=this.safeString(n,"stop_type","latest_price")));else{let d;if([d,n]=this.handleMarginModeAndParams("createOrder",n),w.market_type=void 0!==d?"MARGIN":"SPOT","market"===t&&"buy"===i){let t=!0;[t,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const i=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),t){if(void 0===o&&void 0===i)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const t=this.numberToString(s),r=this.numberToString(o),n=this.parseToNumeric(a.Y.stringMul(t,r)),d=void 0!==i?i:n;w.amount=this.costToPrecision(e,d)}}else w.amount=this.costToPrecision(e,s)}else w.amount=this.amountToPrecision(e,s);void 0!==l&&(w.trigger_price=this.priceToPrecision(e,l))}return n=this.omit(n,["reduceOnly","timeInForce","postOnly","stopPrice","triggerPrice","stopLossPrice","takeProfitPrice"]),this.extend(w,n)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"reduceOnly"),d=void 0!==this.safeString2(a,"stopPrice","triggerPrice"),h=void 0!==this.safeString(a,"stopLossPrice"),c=void 0!==this.safeString(a,"takeProfitPrice"),l=h||c,u=this.createOrderRequest(e,t,i,s,r,a);let f;o.spot?f=d?await this.v2PrivatePostSpotStopOrder(u):await this.v2PrivatePostSpotOrder(u):d?f=await this.v2PrivatePostFuturesStopOrder(u):l?h?f=await this.v2PrivatePostFuturesSetPositionStopLoss(u):c&&(f=await this.v2PrivatePostFuturesSetPositionTakeProfit(u)):f=n?await this.v2PrivatePostFuturesClosePosition(u):await this.v2PrivatePostFuturesOrder(u);const p=this.safeDict(f,"data",{});return this.parseOrder(p,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s,a=!1,o=!1,n=!1;for(let t=0;t<e.length;t++){const d=e[t],h=this.safeString(d,"symbol");if(void 0===s)s=h;else if(s!==h)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const c=this.safeString(d,"type"),l=this.safeString(d,"side"),u=this.safeValue(d,"amount"),f=this.safeValue(d,"price"),p=this.safeValue(d,"params",{});if("limit"!==c)throw new r.NotSupported(this.id+" createOrders() does not support "+c+" orders, only limit orders are accepted");a=this.safeValue(p,"reduceOnly");const m=this.safeNumber2(p,"stopPrice","triggerPrice"),g=this.safeNumber(p,"stopLossPrice"),v=this.safeNumber(p,"takeProfitPrice");o=void 0!==m;n=void 0!==g||void 0!==v;const y=this.createOrderRequest(h,c,l,u,f,p);i.push(y)}const d=this.market(s),h={market:d.id,orders:i};let c;if(d.spot)c=o?await this.v2PrivatePostSpotBatchStopOrder(h):await this.v2PrivatePostSpotBatchOrder(h);else if(o)c=await this.v2PrivatePostFuturesBatchStopOrder(h);else{if(n)throw new r.NotSupported(this.id+" createOrders() does not support stopLossPrice or takeProfitPrice orders");if(a)throw new r.NotSupported(this.id+" createOrders() does not support reduceOnly orders");c=await this.v2PrivatePostFuturesBatchOrder(h)}const l=this.safeList(c,"data",[]),u=[];for(let e=0;e<l.length;e++){const t=l[e];let i;const s=this.safeInteger(t,"code");void 0!==s&&(i=0!==s?"rejected":"open");const r=this.safeDict(t,"data",{});let a;d.spot&&!o?(t.status=i,a=this.parseOrder(t,d)):(r.status=i,a=this.parseOrder(r,d)),u.push(a)}return u}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={market:s.id},o=this.safeBool2(i,"stop","trigger");let n;i=this.omit(i,["stop","trigger"]);const d=[];for(let t=0;t<e.length;t++)d.push(parseInt(e[t]));o?a.stop_ids=d:a.order_ids=d,s.spot?n=o?await this.v2PrivatePostSpotCancelBatchStopOrder(this.extend(a,i)):await this.v2PrivatePostSpotCancelBatchOrder(this.extend(a,i)):(a.market_type="FUTURES",n=o?await this.v2PrivatePostFuturesCancelBatchStopOrder(this.extend(a,i)):await this.v2PrivatePostFuturesCancelBatchOrder(this.extend(a,i)));const h=this.safeList(n,"data",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeDict(t,"data",{}),r=this.parseOrder(i,s);c.push(r)}return c}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" editOrder() requires a symbol argument");await this.loadMarkets();const d=this.market(t),h={market:d.id};let c;void 0!==a&&(h.amount=this.amountToPrecision(t,a)),void 0!==o&&(h.price=this.priceToPrecision(t,o));const l=this.safeStringN(n,["stopPrice","triggerPrice","trigger_price"]);n=this.omit(n,["stopPrice","triggerPrice"]);const u=void 0!==l;let f;u?(h.trigger_price=this.priceToPrecision(t,l),h.stop_id=this.parseToNumeric(e)):h.order_id=this.parseToNumeric(e),[f,n]=this.handleMarginModeAndParams("editOrder",n),d.spot?(h.market_type=void 0!==f?"MARGIN":"SPOT",c=u?await this.v2PrivatePostSpotModifyStopOrder(this.extend(h,n)):await this.v2PrivatePostSpotModifyOrder(this.extend(h,n))):(h.market_type="FUTURES",c=u?await this.v2PrivatePostFuturesModifyStopOrder(this.extend(h,n)):await this.v2PrivatePostFuturesModifyOrder(this.extend(h,n)));const p=this.safeDict(c,"data",{});return this.parseOrder(p,d)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeBool2(i,"stop","trigger"),o=s.swap,n={market:s.id};let d;[d,i]=this.handleMarginModeAndParams("cancelOrder",i),n.market_type=o?"FUTURES":void 0!==d?"MARGIN":"SPOT";const h=this.safeString2(i,"client_id","clientOrderId");let c,l;if(i=this.omit(i,["stop","trigger","clientOrderId"]),void 0!==h?(n.client_id=h,c=a?o?await this.v2PrivatePostFuturesCancelStopOrderByClientId(this.extend(n,i)):await this.v2PrivatePostSpotCancelStopOrderByClientId(this.extend(n,i)):o?await this.v2PrivatePostFuturesCancelOrderByClientId(this.extend(n,i)):await this.v2PrivatePostSpotCancelOrderByClientId(this.extend(n,i))):a?(n.stop_id=this.parseToNumeric(e),c=o?await this.v2PrivatePostFuturesCancelStopOrder(this.extend(n,i)):await this.v2PrivatePostSpotCancelStopOrder(this.extend(n,i))):(n.order_id=this.parseToNumeric(e),c=o?await this.v2PrivatePostFuturesCancelOrder(this.extend(n,i)):await this.v2PrivatePostSpotCancelOrder(this.extend(n,i))),void 0!==h){const e=this.safeList(c,"data",[]);l=this.safeDict(e[0],"data",{})}else l=this.safeDict(c,"data",{});return this.parseOrder(l,s)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={market:i.id};let a;if(i.swap)s.market_type="FUTURES",a=await this.v2PrivatePostFuturesCancelAllOrder(this.extend(s,t));else{let e;[e,t]=this.handleMarginModeAndParams("cancelAllOrders",t),s.market_type=void 0!==e?"MARGIN":"SPOT",a=await this.v2PrivatePostSpotCancelAllOrder(this.extend(s,t))}return[this.safeOrder({info:a})]}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={market:s.id,order_id:this.parseToNumeric(e)};let o;o=s.swap?await this.v2PrivateGetFuturesOrderStatus(this.extend(a,i)):await this.v2PrivateGetSpotOrderStatus(this.extend(a,i));const n=this.safeDict(o,"data",{});return this.parseOrder(n,s)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==t&&(o=this.market(t),a.market=o.id),void 0!==s&&(a.limit=s);const n=this.safeBool2(r,"stop","trigger");let d,h;r=this.omit(r,["stop","trigger"]),[d,r]=this.handleMarketTypeAndParams("fetchOrdersByStatus",o,r);const c="finished"===e||"closed"===e,l="pending"===e||"open"===e;if("swap"===d)a.market_type="FUTURES",c?h=n?await this.v2PrivateGetFuturesFinishedStopOrder(this.extend(a,r)):await this.v2PrivateGetFuturesFinishedOrder(this.extend(a,r)):l&&(h=n?await this.v2PrivateGetFuturesPendingStopOrder(this.extend(a,r)):await this.v2PrivateGetFuturesPendingOrder(this.extend(a,r)));else{let t;[t,r]=this.handleMarginModeAndParams("fetchOrdersByStatus",r),a.market_type=void 0!==t?"MARGIN":"SPOT",c?h=n?await this.v2PrivateGetSpotFinishedStopOrder(this.extend(a,r)):await this.v2PrivateGetSpotFinishedOrder(this.extend(a,r)):"pending"===e&&(h=n?await this.v2PrivateGetSpotPendingStopOrder(this.extend(a,r)):await this.v2PrivateGetSpotPendingOrder(this.extend(a,r)))}const u=this.safeList(h,"data",[]);return this.parseOrders(u,o,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const r=await this.fetchOrdersByStatus("pending",e,t,i,s);for(let e=0;e<r.length;e++)r[e].status="open";return r}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("finished",e,t,i,s)}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s=this.safeString2(t,"chain","network");if(void 0===s)throw new r.ArgumentsRequired(this.id+" createDepositAddress() requires a network parameter");t=this.omit(t,"network");const a={ccy:i.id,chain:this.networkCodeToId(s,i.code)},o=await this.v2PrivatePostAssetsRenewalDepositAddress(this.extend(a,t)),n=this.safeDict(o,"data",{});return this.parseDepositAddress(n,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={ccy:i.id};let a;if([a,t]=this.handleNetworkCodeAndParams(t),void 0===a)throw new r.ArgumentsRequired(this.id+' fetchDepositAddress() requires a "network" parameter');s.chain=this.networkCodeToId(a);const o=await this.v2PrivateGetAssetsDepositAddress(this.extend(s,t)),n=this.safeDict(o,"data",{});return this.parseDepositAddress(n,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=i.split(":");let r,a;return s.length>1&&"cfx"!==s[0]?(r=s[0],a=s[1]):r=i,{info:e,currency:this.safeCurrencyCode(void 0,t),network:void 0,address:r,tag:this.safeString(e,"memo",a)}}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e);let o,n={market:a.id};if(void 0!==i&&(n.limit=i),void 0!==t&&(n.start_time=t),[n,s]=this.handleUntilOption("end_time",n,s),a.swap)n.market_type="FUTURES",o=await this.v2PrivateGetFuturesUserDeals(this.extend(n,s));else{let e;[e,s]=this.handleMarginModeAndParams("fetchMyTrades",s),n.market_type=void 0!==e?"MARGIN":"SPOT",o=await this.v2PrivateGetSpotUserDeals(this.extend(n,s))}const d=this.safeList(o,"data",[]);return this.parseTrades(d,a,t,i)}async fetchPositions(e=void 0,t={}){let i;await this.loadMarkets(),[i,t]=this.handleOptionAndParams(t,"fetchPositions","method","v2PrivateGetFuturesPendingPosition");const s={market_type:"FUTURES"};let a,o;if(void 0!==(e=this.marketSymbols(e))){let t;if(Array.isArray(e)){if(e.length>1)throw new r.BadRequest(this.id+" fetchPositions() symbols argument cannot contain more than 1 symbol");t=e[0]}else t=e;a=this.market(t),s.market=a.id}o="v2PrivateGetFuturesPendingPosition"===i?await this.v2PrivateGetFuturesPendingPosition(this.extend(s,t)):await this.v2PrivateGetFuturesFinishedPosition(this.extend(s,t));const n=this.safeList(o,"data",[]),d=[];for(let e=0;e<n.length;e++)d.push(this.parsePosition(n[e],a));return this.filterByArrayPositions(d,"symbol",e,!1)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={market_type:"FUTURES",market:i.id},r=await this.v2PrivateGetFuturesPendingPosition(this.extend(s,t)),a=this.safeList(r,"data",[]);return this.parsePosition(a[0],i)}parsePosition(e,t=void 0){const i=this.safeString(e,"market");t=this.safeMarket(i,t,void 0,"swap");const s=this.safeInteger(e,"created_at");return this.safePosition({info:e,id:this.safeInteger(e,"position_id"),symbol:t.symbol,notional:this.safeNumber(e,"settle_value"),marginMode:this.safeString(e,"margin_mode"),liquidationPrice:this.safeNumber(e,"liq_price"),entryPrice:this.safeNumber(e,"avg_entry_price"),unrealizedPnl:this.safeNumber(e,"unrealized_pnl"),realizedPnl:this.safeNumber(e,"realized_pnl"),percentage:void 0,contracts:this.safeNumber(e,"close_avbl"),contractSize:this.safeNumber(t,"contractSize"),markPrice:void 0,lastPrice:void 0,side:this.safeString(e,"side"),hedged:void 0,timestamp:s,datetime:this.iso8601(s),lastUpdateTimestamp:this.safeInteger(e,"updated_at"),maintenanceMargin:this.safeNumber(e,"maintenance_margin_value"),maintenanceMarginPercentage:this.safeNumber(e,"maintenance_margin_rate"),collateral:this.safeNumber(e,"margin_avbl"),initialMargin:void 0,initialMarginPercentage:void 0,leverage:this.safeNumber(e,"leverage"),marginRatio:this.safeNumber(e,"position_margin_rate"),stopLossPrice:this.omitZero(this.safeString(e,"stop_loss_price")),takeProfitPrice:this.omitZero(this.safeString(e,"take_profit_price"))})}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("isolated"!==(e=e.toLowerCase())&&"cross"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");await this.loadMarkets();const s=this.market(t);if("swap"!==s.type)throw new r.BadSymbol(this.id+" setMarginMode() supports swap contracts only");const a=this.safeInteger(i,"leverage"),o=this.safeInteger(s.limits.leverage,"max",100);if(void 0===a)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a leverage parameter");if(a<1||a>o)throw new r.BadRequest(this.id+" setMarginMode() leverage should be between 1 and "+o.toString()+" for "+t);const n={market:s.id,market_type:"FUTURES",margin_mode:e,leverage:a};return await this.v2PrivatePostFuturesAdjustPositionLeverage(this.extend(n,i))}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(!s.swap)throw new r.BadSymbol(this.id+" setLeverage() supports swap contracts only");let a;[a,i]=this.handleMarginModeAndParams("setLeverage",i,"cross");const o=this.safeInteger(s.limits.leverage,"min",1),n=this.safeInteger(s.limits.leverage,"max",100);if(e<o||e>n)throw new r.BadRequest(this.id+" setLeverage() leverage should be between "+o.toString()+" and "+n.toString()+" for "+t);const d={market:s.id,market_type:"FUTURES",margin_mode:a,leverage:e};return await this.v2PrivatePostFuturesAdjustPositionLeverage(this.extend(d,i))}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=this.marketIds(e);i.market=t.join(",")}const s=await this.v2PublicGetFuturesPositionLevel(this.extend(i,t)),r=this.safeList(s,"data",[]);return this.parseLeverageTiers(r,e,"market")}parseMarketLeverageTiers(e,t=void 0){const i=[],s=this.safeList(e,"level",[]);let r=0;for(let a=0;a<s.length;a++){const o=s[a],n=this.safeString(e,"market");t=this.safeMarket(n,t,void 0,"swap");const d=this.safeNumber(o,"amount");i.push({tier:this.sum(a,1),symbol:this.safeSymbol(n,t,void 0,"swap"),currency:t.linear?t.base:t.quote,minNotional:r,maxNotional:d,maintenanceMarginRate:this.safeNumber(o,"maintenance_margin_rate"),maxLeverage:this.safeInteger(o,"leverage"),info:o}),r=d}return i}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),o=this.amountToPrecision(e,t);let n=o;"reduce"===i&&(n=a.Y.stringNeg(o));const d={market:r.id,market_type:"FUTURES",amount:n},h=await this.v2PrivatePostFuturesAdjustPositionMargin(this.extend(d,s)),c=this.safeDict(h,"data"),l=this.safeStringLower(h,"message"),u="reduce"===i?"reduce":"add";return this.extend(this.parseMarginModification(c,r),{type:u,amount:this.parseNumber(t),status:l})}parseMarginModification(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeInteger2(e,"updated_at","created_at"),r=this.safeString(e,"margin_change");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),type:void 0,marginMode:"isolated",amount:this.parseNumber(a.Y.stringAbs(r)),total:this.safeNumber(e,"margin_avbl"),code:t.quote,status:void 0,timestamp:s,datetime:this.iso8601(s)}}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"reduce",i)}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");await this.loadMarkets();let a={market:this.market(e).id,market_type:"FUTURES"};[a,s]=this.handleUntilOption("end_time",a,s),void 0!==t&&(a.start_time=t),void 0!==i&&(a.limit=i);const o=await this.v2PrivateGetFuturesPositionFundingHistory(this.extend(a,s)),n=this.safeList(o,"data",[]),d=[];for(let t=0;t<n.length;t++){const i=n[t],s=this.safeInteger(i,"created_at"),r=this.safeString(i,"ccy"),a=this.safeCurrencyCode(r);d.push({info:i,symbol:e,code:a,timestamp:s,datetime:this.iso8601(s),id:this.safeNumber(i,"position_id"),amount:this.safeNumber(i,"funding_value")})}return d}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={market:i.id},a=await this.v2PublicGetFuturesFundingRate(this.extend(s,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseFundingRate(n,i)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"latest_funding_time"),s=this.safeInteger(e,"next_funding_time"),r=this.safeString(e,"latest_funding_time"),o=this.safeString(e,"next_funding_time"),n=a.Y.stringSub(o,r),d=this.safeString(e,"market");return{info:e,symbol:this.safeSymbol(d,t,void 0,"swap"),markPrice:this.safeNumber(e,"mark_price"),indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"latest_funding_rate"),fundingTimestamp:i,fundingDatetime:this.iso8601(i),nextFundingRate:this.safeNumber(e,"next_funding_rate"),nextFundingTimestamp:s,nextFundingDatetime:this.iso8601(s),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(n)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets();const i={};let s;if(void 0!==(e=this.marketSymbols(e))){const t=this.safeValue(e,0);if(s=this.market(t),!s.swap)throw new r.BadSymbol(this.id+" fetchFundingRates() supports swap contracts only");const a=this.marketIds(e);i.market=a.join(",")}const a=await this.v2PublicGetFuturesFundingRate(this.extend(i,t)),o=this.safeList(a,"data",[]);return this.parseFundingRates(o,e)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={ccy:a.id,to_address:i,amount:this.currencyToPrecision(e,t)};let n;void 0!==s&&(o.memo=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chain=this.networkCodeToId(n));const d=await this.v2PrivatePostAssetsWithdraw(this.extend(o,r)),h=this.safeDict(d,"data",{});return this.parseTransaction(h,a)}parseTransactionStatus(e){return this.safeString({audit:"pending",pass:"pending",audit_required:"pending",processing:"pending",confirming:"pending",not_pass:"failed",cancel:"canceled",finish:"ok",finished:"ok",fail:"failed"},e,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s,1e3);const o=this.market(e);let n={market:o.id};void 0!==t&&(n.start_time=t),void 0!==i&&(n.limit=i),[n,s]=this.handleUntilOption("end_time",n,s);const d=await this.v2PublicGetFuturesFundingRateHistory(this.extend(n,s)),h=this.safeList(d,"data",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"market"),s=this.safeSymbol(i,o,void 0,"swap"),r=this.safeInteger(t,"funding_time");c.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"actual_funding_rate"),timestamp:r,datetime:this.iso8601(r)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,o.symbol,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"to_address");let s=this.safeString(e,"memo");void 0!==s&&s.length<1&&(s=void 0);let r=this.safeString(e,"remark");void 0!==r&&r.length<1&&(r=void 0);let a=this.safeString(e,"tx_id");void 0!==a&&a.length<1&&(a=void 0);const o=this.safeString(e,"ccy"),n=this.safeCurrencyCode(o,t),d=this.safeInteger(e,"created_at"),h="withdraw_id"in e?"withdrawal":"deposit",c=this.safeString(e,"chain");let l=this.safeString(e,"tx_fee");const u="local"===this.safeStringLower2(e,"withdraw_method","deposit_method");let f=this.safeNumber(e,"actual_amount");void 0===f&&(f=this.safeNumber(e,"amount")),"deposit"===h&&(l="0");const p=this.safeString(e,"fee_asset"),m={cost:this.parseNumber(l),currency:this.safeCurrencyCode(p)};return{info:e,id:this.safeString2(e,"withdraw_id","deposit_id"),txid:a,timestamp:d,datetime:this.iso8601(d),network:this.networkIdToCode(c),address:i,addressTo:i,addressFrom:void 0,tag:s,tagTo:void 0,tagFrom:void 0,type:h,amount:f,currency:n,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:void 0,fee:m,comment:r,internal:u}}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n=this.currencyToPrecision(e,t),d=this.safeDict(this.options,"accountsByType",{}),h=this.safeString(d,i,i),c=this.safeString(d,s,s),l={ccy:o.id,amount:n,from_account_type:h,to_account_type:c};if("margin"===i||"margin"===s){const e=this.safeString(a,"symbol");if(void 0===e)throw new r.ArgumentsRequired(this.id+" transfer() the symbol parameter must be defined for a margin account");a=this.omit(a,"symbol"),l.market=this.marketId(e)}if("spot"!==i&&"spot"!==s)throw new r.BadRequest(this.id+" transfer() can only be between spot and swap, or spot and margin, either the fromAccount or toAccount must be spot");const u=await this.v2PrivatePostAssetsTransfer(this.extend(l,a));return this.extend(this.parseTransfer(u,o),{amount:this.parseNumber(n),fromAccount:i,toAccount:s})}parseTransferStatus(e){return this.safeString({0:"ok",SUCCESS:"ok",OK:"ok",finished:"ok",FINISHED:"ok"},e,e)}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"created_at"),s=this.safeString(e,"ccy"),r=this.safeString(e,"from_account_type"),a=this.safeString(e,"to_account_type"),o=this.safeValue(this.options,"accountsById",{});return{id:void 0,timestamp:i,datetime:this.iso8601(i),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"amount"),fromAccount:this.safeString(o,r,r),toAccount:this.safeString(o,a,a),status:this.parseTransferStatus(this.safeString2(e,"code","status"))}}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchTransfers() requires a code argument");const a=this.currency(e);let o,n={ccy:a.id};[o,s]=this.handleMarginModeAndParams("fetchTransfers",s),n.transfer_type=void 0!==o?"MARGIN":"FUTURES",void 0!==t&&(n.start_time=t),void 0!==i&&(n.limit=i),[n,s]=this.handleUntilOption("end_time",n,s);const d=await this.v2PrivateGetAssetsTransferHistory(this.extend(n,s)),h=this.safeList(d,"data",[]);return this.parseTransfers(h,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.ccy=a.id),void 0!==i&&(r.limit=i);const o=await this.v2PrivateGetAssetsWithdraw(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.ccy=a.id),void 0!==i&&(r.limit=i);const o=await this.v2PrivateGetAssetsDepositHistory(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}parseIsolatedBorrowRate(e,t=void 0){const i=this.safeString(e,"market");t=this.safeMarket(i,t,void 0,"spot");const s=this.safeString(e,"ccy"),r=this.safeNumber(e,"daily_interest_rate");let a,o;return s===t.baseId?a=r:s===t.quoteId&&(o=r),{symbol:t.symbol,base:t.base,baseRate:a,quote:t.quote,quoteRate:o,period:864e5,timestamp:void 0,datetime:void 0,info:e}}async fetchIsolatedBorrowRate(e,t={}){await this.loadMarkets();const i=this.safeString(t,"code");if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchIsolatedBorrowRate() requires a code parameter");t=this.omit(t,"code");const s=this.currency(i),a=this.market(e),o={market:a.id,ccy:s.id},n=await this.v2PrivateGetAssetsMarginInterestLimit(this.extend(o,t)),d=this.safeDict(n,"data",{});return this.parseIsolatedBorrowRate(d,a)}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==t&&(o=this.market(t),a.market=o.id),void 0!==s&&(a.limit=s);const n=await this.v2PrivateGetAssetsMarginBorrowHistory(this.extend(a,r)),d=this.safeValue(n,"data",[]),h=this.parseBorrowInterests(d,o);return this.filterByCurrencySinceLimit(h,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"market");t=this.safeMarket(i,t,void 0,"spot");const s=this.safeInteger(e,"expired_at");return{info:e,symbol:t.symbol,currency:this.safeCurrencyCode(this.safeString(e,"ccy")),interest:this.safeNumber(e,"to_repaied_amount"),interestRate:this.safeNumber(e,"daily_interest_rate"),amountBorrowed:this.safeNumber(e,"borrow_amount"),marginMode:"isolated",timestamp:s,datetime:this.iso8601(s)}}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o=this.safeBool2(s,"isAutoRenew","is_auto_renew",!1);s=this.omit(s,"isAutoRenew");const n={market:r.id,ccy:a.id,borrow_amount:this.currencyToPrecision(t,i),is_auto_renew:o},d=await this.v2PrivatePostAssetsMarginBorrow(this.extend(n,s)),h=this.safeDict(d,"data",{}),c=this.parseMarginLoan(h,a);return this.extend(c,{amount:i,symbol:e})}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o={market:r.id,ccy:a.id,amount:this.currencyToPrecision(t,i)},n=await this.v2PrivatePostAssetsMarginRepay(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.parseMarginLoan(d,a);return this.extend(h,{amount:i,symbol:e})}parseMarginLoan(e,t=void 0){const i=this.safeString(e,"ccy"),s=this.safeString(e,"market"),r=this.safeInteger(e,"expired_at");return{id:this.safeInteger(e,"borrow_id"),currency:this.safeCurrencyCode(i,t),amount:this.safeString(e,"borrow_amount"),symbol:this.safeSymbol(s,void 0,void 0,"spot"),timestamp:r,datetime:this.iso8601(r),info:e}}async fetchDepositWithdrawFee(e,t={}){await this.loadMarkets();const i=this.currency(e),s={ccy:i.id},r=await this.v2PublicGetAssetsDepositWithdrawConfig(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseDepositWithdrawFee(a,i)}parseDepositWithdrawFee(e,t=void 0){const i={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}},s=this.safeList(e,"chains",[]),r=this.safeDict(e,"asset",{});for(let e=0;e<s.length;e++){const t=s[e];if(this.safeBool(t,"withdraw_enabled")){i.withdraw.fee=this.safeNumber(t,"withdrawal_fee"),i.withdraw.percentage=!1;const e=this.safeString(t,"chain");if(e){const s=this.networkIdToCode(e,this.safeString(r,"ccy"));i.networks[s]={withdraw:{fee:this.safeNumber(t,"withdrawal_fee"),percentage:!1},deposit:{fee:void 0,percentage:void 0}}}}}return i}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.safeString(t,"code");if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchLeverage() requires a code parameter");t=this.omit(t,"code");const s=this.currency(i),a=this.market(e),o={market:a.id,ccy:s.id},n=await this.v2PrivateGetAssetsMarginInterestLimit(this.extend(o,t)),d=this.safeDict(n,"data",{});return this.parseLeverage(d,a)}parseLeverage(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t,void 0,"spot"),marginMode:"isolated",longLeverage:s,shortLeverage:s}}async fetchPositionHistory(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={market_type:"FUTURES",market:this.market(e).id};void 0!==i&&(r.limit=i),void 0!==t&&(r.start_time=t),[r,s]=this.handleUntilOption("end_time",r,s);const a=await this.v2PrivateGetFuturesFinishedPosition(this.extend(r,s)),o=this.safeList(a,"data",[]),n=this.parsePositions(o);return this.filterBySymbolSinceLimit(n,e,t,i)}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r=this.safeString(i,"type","market"),a={market:s.id,market_type:"FUTURES",type:r},o=this.safeString2(i,"client_id","clientOrderId");void 0!==o&&(a.client_id=o),i=this.omit(i,"clientOrderId");const n=await this.v2PrivatePostFuturesClosePosition(this.extend(a,i)),d=this.safeDict(n,"data",{});return this.parseOrder(d,s)}handleMarginModeAndParams(e,t={},i=void 0){const s=this.safeString(this.options,"defaultType"),r=this.safeBool(t,"margin",!1);let a;return[a,t]=super.handleMarginModeAndParams(e,t,i),void 0===a&&("margin"!==s&&!0!==r||(a="isolated")),[a,t]}nonce(){return this.milliseconds()}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){e=this.implodeParams(e,s);const o=t[0],h=t[1];let c=this.urls.api[h]+"/"+o+"/"+e,l=this.omit(s,this.extractParams(e));const u=this.nonce().toString();if("POST"===i){const t=e.split("/"),i=this.safeString(t,0,""),r=t.length,a=this.safeString(t,r-1,"").split("_"),o=a.length,n=this.safeString(a,o-1,"");if("order"===i&&("limit"===n||"market"===n)){if(void 0===this.safeString(s,"client_id")){const e="x-167673045",t=this.safeValue(this.options,"brokerId",e);l.client_id=t+"_"+this.uuid16()}}}if("perpetualPrivate"===h){this.checkRequiredCredentials(),l=this.extend({access_id:this.apiKey,timestamp:u},l),l=this.keysort(l);const e=this.rawencode(l);r={Authorization:this.hash(this.encode(e+"&secret_key="+this.secret),n.s).toLowerCase(),AccessId:this.apiKey},"GET"===i||"PUT"===i?c+="?"+e:(r["Content-Type"]="application/x-www-form-urlencoded",a=e)}else if("public"===h||"perpetualPublic"===h)Object.keys(l).length&&(c+="?"+this.urlencode(l));else if("v1"===o){this.checkRequiredCredentials(),l=this.extend({access_id:this.apiKey,tonce:u},l),l=this.keysort(l);const e=this.rawencode(l);r={Authorization:this.hash(this.encode(e+"&secret_key="+this.secret),d.F).toUpperCase(),"Content-Type":"application/json"},"GET"===i||"DELETE"===i||"PUT"===i?c+="?"+e:a=this.json(l)}else if("v2"===o){this.checkRequiredCredentials(),l=this.keysort(l);const t=this.rawencode(l);let s=i+"/"+o+"/"+e;"POST"===i?s+=a=this.json(l):t&&(s+="?"+t),s+=u+this.secret;const d=this.hash(this.encode(s),n.s);r={"Content-Type":"application/json",Accept:"application/json","X-COINEX-KEY":this.apiKey,"X-COINEX-SIGN":d,"X-COINEX-TIMESTAMP":u},"POST"!==i&&t&&(c+="?"+t)}return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeValue(n,"data"),u=this.safeString(n,"message");if("0"!==c||"Success"!==u&&"Succeeded"!==u&&"ok"!==u.toLowerCase()&&!l){const e=this.id+" "+u;throw this.throwBroadlyMatchedException(this.exceptions.broad,u,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}async fetchMarginAdjustmentHistory(e=void 0,t=void 0,i=void 0,s=void 0,a={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMarginAdjustmentHistory() requires a symbol argument");const o=this.safeInteger2(a,"positionId","position_id");if(a=this.omit(a,"positionId"),void 0===o)throw new r.ArgumentsRequired(this.id+" fetchMarginAdjustmentHistory() requires a positionId parameter");let n={market:this.market(e).id,market_type:"FUTURES",position_id:o};[n,a]=this.handleUntilOption("end_time",n,a),void 0!==i&&(n.start_time=i),void 0!==s&&(n.limit=s);const d=await this.v2PrivateGetFuturesPositionMarginHistory(this.extend(n,a)),h=this.safeList(d,"data",[]),c=this.parseMarginModifications(h,void 0,"market","swap");return this.filterBySymbolSinceLimit(c,e,i,s)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinlist",name:"Coinlist",countries:["US"],version:"v1",rateLimit:300,certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,deposit:!1,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!0,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!0,fetchTransfers:!0,fetchWithdrawal:!1,fetchWithdrawals:!1,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!0,ws:!1},timeframes:{"1m":"1m","5m":"5m","30m":"30m"},urls:{logo:"https://github-production-user-asset-6210df.s3.amazonaws.com/1294454/281108917-eff2ae1d-ce8a-4b2a-950d-8678b12da965.jpg",api:{public:"https://trade-api.coinlist.co",private:"https://trade-api.coinlist.co"},www:"https://coinlist.co",doc:["https://trade-docs.coinlist.co"],fees:"https://coinlist.co/fees"},api:{public:{get:{"v1/symbols":1,"v1/symbols/summary":1,"v1/symbols/{symbol}":1,"v1/symbols/{symbol}/summary":1,"v1/symbols/{symbol}/book":1,"v1/symbols/{symbol}/quote":1,"v1/symbols/{symbol}/candles":1,"v1/symbols/{symbol}/auctions":1,"v1/symbols/{symbol}/auctions/{auction_code}":1,"v1/time":1,"v1/assets":1,"v1/leaderboard":1,"v1/affiliate/{competition_code}":1,"v1/competition/{competition_id}":1}},private:{get:{"v1/fees":1,"v1/accounts":1,"v1/accounts/{trader_id}":1,"v1/accounts/{trader_id}/alias":1,"v1/accounts/{trader_id}/ledger":1,"v1/accounts/{trader_id}/wallets":1,"v1/accounts/{trader_id}/wallet-ledger":1,"v1/accounts/{trader_id}/ledger-summary":1,"v1/keys":1,"v1/fills":1,"v1/orders":1,"v1/orders/{order_id}":1,"v1/reports":1,"v1/balances":1,"v1/transfers":1,"v1/user":1,"v1/credits":1,"v1/positions":1,"v1/accounts/{trader_id}/competitions":1},post:{"v1/keys":1,"v1/orders":1,"v1/orders/cancel-all-after":1,"v1/reports":1,"v1/transfers/to-wallet":1,"v1/transfers/from-wallet":1,"v1/transfers/internal-transfer":1,"v1/transfers/withdrawal-request":1,"v1/orders/bulk":1,"v1/accounts/{trader_id}/competitions":1,"v1/accounts/{trader_id}/create-competition":1},patch:{"v1/orders/{order_id}":1,"v1/orders/bulk":1},delete:{"v1/keys/{key}":1,"v1/orders":1,"v1/orders/{order_id}":1,"v1/orders/bulk":1}}},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:500,daysBack:1e5,daysBackCanceled:void 0,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:300}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,taker:this.parseNumber("0.0045"),maker:this.parseNumber("0.0025"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0045")],[this.parseNumber("20000"),this.parseNumber("0.003")],[this.parseNumber("50000"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.002")],[this.parseNumber("500000"),this.parseNumber("0.0018")],[this.parseNumber("750000"),this.parseNumber("0.0018")],[this.parseNumber("1000000"),this.parseNumber("0.0016")],[this.parseNumber("2500000"),this.parseNumber("0.0013")],[this.parseNumber("5000000"),this.parseNumber("0.0012")],[this.parseNumber("10000000"),this.parseNumber("0.001")],[this.parseNumber("50000000"),this.parseNumber("0.0005")],[this.parseNumber("100000000"),this.parseNumber("0.0005")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0025")],[this.parseNumber("20000"),this.parseNumber("0.0025")],[this.parseNumber("50000"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.002")],[this.parseNumber("500000"),this.parseNumber("0.0015")],[this.parseNumber("750000"),this.parseNumber("0.0012")],[this.parseNumber("1000000"),this.parseNumber("0.001")],[this.parseNumber("2500000"),this.parseNumber("0.0008")],[this.parseNumber("5000000"),this.parseNumber("0.0007")],[this.parseNumber("10000000"),this.parseNumber("0.0006")],[this.parseNumber("50000000"),this.parseNumber("0.0000")],[this.parseNumber("100000000"),this.parseNumber("0.00")]]}}},precisionMode:a.kb,options:{accountsByType:{"CoinList Pro":"trading","CoinList Pro trading account":"trading",Pro:"trading",pro:"trading",trade:"trading",trading:"trading",CoinList:"funding","CoinList wallet":"funding",Wallet:"funding",wallet:"funding",fund:"funding",funding:"funding"}},exceptions:{exact:{AUTH_SIG_INVALID:r.AuthenticationError,DENIED_MAINTENANCE:r.OnMaintenance,ORDER_REJECT_BAD_STATUS:r.InvalidOrder,ORDER_REJECT_INVALID_POST_ONLY:r.InvalidOrder,ORDER_REJECT_INVALID_CLOSE_ONLY:r.InvalidOrder,ORDER_REJECT_POST_ONLY_REQUIRED:r.InvalidOrder,ORDER_REJECT_FROZEN_ORDER:r.InvalidOrder,ORDER_REJECT_LIMIT_PRICE_PROTECTION_VIOLATION:r.InvalidOrder,ORDER_REJECT_CLOSED:r.NotSupported,ORDER_REJECT_MAX_ORDERS:r.BadRequest,ORDER_REJECT_NOT_FOUND:r.OrderNotFound,ORDER_REJECT_PARSE_ERROR:r.BadRequest,ORDER_REJECT_PRICE_INVALID:r.InvalidOrder,ORDER_REJECT_QUANTITY_ZERO:r.InvalidOrder,ORDER_REJECT_TOKEN_LIMIT:r.InsufficientFunds,ORDER_REJECT_TOKEN_LIMIT_OTHER:r.InvalidOrder,ORDER_REJECT_SELF_TRADE:r.InvalidOrder,ORDER_VALIDATE_BAD_SIZE_ALIGNMENT:r.InvalidOrder,ORDER_VALIDATE_BAD_TICK_ALIGNMENT:r.InvalidOrder,ORDER_VALIDATE_SYMBOL_NOT_FOUND:r.BadSymbol,TRANSFERS_WITHDRAWAL_REQUEST_TOO_LARGE:r.InsufficientFunds,WITHDRAWAL_REQUEST_NOT_ALLOWED:r.PermissionDenied},broad:{"A destinationAddress is required for non-USD withdrawals":r.InvalidAddress,"fails to match the JsonSchema date-time format pattern":r.BadRequest,"is required":r.ArgumentsRequired,"must be a string":r.BadRequest,"must be a valid GUID":r.BadRequest,"must be greater than or equal to":r.BadRequest,"must be less than or equal to":r.BadRequest,"must be one of":r.BadRequest,"Symbol not found":r.BadSymbol}}})}calculateRateLimiterCost(e,t,i,s,r={}){if(Array.isArray(s)){const e=s.length;return Math.ceil(e/2)}return 1}async fetchTime(e={}){const t=await this.publicGetV1Time(e),i=this.safeString(t,"iso");return this.parse8601(i)}async fetchCurrencies(e={}){const t=await this.publicGetV1Assets(e),i=this.safeValue(t,"assets",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"asset"),a=this.safeCurrencyCode(r),o=this.safeBool(t,"is_transferable",!1),n=o,d=o,h=o,c=this.safeString(t,"decimal_places"),l=this.parseNumber(this.parsePrecision(c)),u=this.safeString(t,"min_withdrawal");s[a]={id:r,code:a,name:a,info:t,active:h,deposit:d,withdraw:n,fee:void 0,precision:l,limits:{amount:{min:void 0,max:void 0},withdraw:{min:u,max:void 0}},networks:{}}}return s}async fetchMarkets(e={}){const t=await this.publicGetV1Symbols(e),i=this.safeValue(t,"symbols",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"base_currency"),s=this.safeString(e,"quote_currency"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o=this.safeString(e,"minimum_size_increment"),n=this.safeString(e,"minimum_price_increment"),d=this.safeString(e,"list_time");return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(o),price:this.parseNumber(n)},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:this.parse8601(d),info:e}}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetV1SymbolsSummary(this.extend({},t));return this.parseTickers(i,e,t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetV1SymbolsSymbolSummary(this.extend(s,t));return this.parseTicker(r,i)}parseTicker(e,t=void 0){const i=this.safeValue(e,"last_trade",{}),s=this.parse8601(this.safeString(i,"logicalTime")),r=this.safeString(e,"highest_bid"),a=this.safeString(e,"lowest_ask"),o=this.safeString(e,"volume_base_24h"),n=this.safeString(e,"volume_quote_24h"),d=this.safeString(e,"highest_price_24h"),h=this.safeString(e,"lowest_price_24h"),c=this.safeString(e,"last_price"),l=this.safeString(e,"price_change_percent_24h");return this.safeTicker({symbol:t.symbol,timestamp:s,datetime:this.iso8601(s),open:void 0,high:d,low:h,close:c,bid:r,bidVolume:void 0,ask:a,askVolume:void 0,vwap:void 0,previousClose:void 0,change:void 0,percentage:l,average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id},r=await this.publicGetV1SymbolsSymbolBook(this.extend(s,i)),a=this.parse8601(this.safeString(r,"logical_time")),o=this.parseOrderBook(r,e,a);return o.nonce=void 0,o}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t),n={symbol:a.id,granularity:o};if(void 0!==i)if(n.start_time=this.iso8601(i),void 0!==s){const e=1e3*this.parseTimeframe(t);n.end_time=this.iso8601(this.sum(i,e*s))}else n.end_time=this.iso8601(this.milliseconds());const d=this.safeInteger(r,"until");void 0!==d&&(r=this.omit(r,["until"]),n.end_time=this.iso8601(d));const h=await this.publicGetV1SymbolsSymbolCandles(this.extend(n,r)),c=this.safeList(h,"candles",[]);return this.parseOHLCVs(c,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,0)),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==t&&(a.start_time=this.iso8601(t)),void 0!==i&&(a.count=Math.min(i,500));const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,["until"]),a.end_time=this.iso8601(o));const n=await this.publicGetV1SymbolsSymbolAuctions(this.extend(a,s)),d=this.safeList(n,"auctions",[]);return this.parseTrades(d,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString(e,"auction_code"),a=this.parse8601(this.safeString(e,"logical_time")),n=this.safeString(e,"price");let d=this.safeString2(e,"volume","quantity");const h=this.safeString(e,"order_id");let c,l;const u=this.safeString(e,"fee");if(void 0!==u){o.Y.stringLt(d,"0")?(l="sell",d=o.Y.stringNeg(d)):l="buy",c={cost:u,currency:this.safeString(e,"fee_currency")}}else{const t=this.safeString(e,"imbalance");l=o.Y.stringLt(t,"0")?"buy":"sell"}const f=this.safeString(e,"fee_type");return this.safeTrade({id:r,order:h,timestamp:a,datetime:this.iso8601(a),symbol:s,type:void 0,side:l,takerOrMaker:f,price:n,amount:d,cost:void 0,fee:c,info:e},t)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetV1Fees(e),i=this.safeValue(t,"fees_by_symbols",{}),s={},r=Object.keys(i);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeValue(i,t,{}),o=this.parseFeeTiers(a),n=this.safeValue(a,"base",{}),d=this.safeValue(n,"fees",{}),h=t.split(",");for(let e=0;e<h.length;e++){const i=h[e],r=this.safeMarket(i).symbol,n={};n[t]=a,s[r]={info:n,symbol:r,maker:this.safeNumber(d,"maker"),taker:this.safeNumber(d,"taker"),percentage:!0,tierBased:!0,tiers:o}}}return s}parseFeeTiers(e,t=void 0){let i=[],s=[];const r=Object.keys(e),a=r.length;if(a>0){for(let t=0;t<a;t++){const a=r[t],o=this.safeValue(e,a,{}),n=this.safeValue(o,"fees",{}),d=this.safeString(n,"taker"),h=this.safeString(n,"maker");s.push([void 0,this.parseNumber(h)]),i.push([void 0,this.parseNumber(d)])}i=this.sortBy(i,1,!0),s=this.sortBy(s,1,!0);const t=this.safeDict(i,0,[]),o=this.safeDict(this,"fees",{}),n=this.safeDict(o,"trading",{}),d=this.safeDict(n,"tiers",{}),h=this.safeList(d,"taker",[]),c=this.safeList(d,"maker",[]),l=h.length,u=t.length;if(a===l&&u>0)for(let e=0;e<a;e++)i[e][0]=h[e][0],s[e][0]=c[e][0]}return{maker:s,taker:i}}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privateGetV1Accounts(e),i=this.safeValue(t,"accounts",[]);return this.parseAccounts(i,e)}parseAccount(e){return{id:this.safeString(e,"trader_id"),type:"trading",code:void 0,info:e}}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetV1Balances(e);return this.parseBalance(t)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeValue(e,"asset_balances",{}),s=this.safeValue(e,"asset_holds",{}),r=Object.keys(i);for(let e=0;e<r.length;e++){const a=r[e],o=this.safeCurrencyCode(a),n=this.account();n.total=this.safeString(i,a),n.used=this.safeString(s,a,"0"),t[o]=n}return this.safeBalance(t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==t&&(r.start_time=this.iso8601(t)),void 0!==i&&(r.count=i);const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,["until"]),r.end_time=this.iso8601(o));const n=await this.privateGetV1Fills(this.extend(r,s)),d=this.safeList(n,"fills",[]);return this.parseTrades(d,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a={order_id:e};return await this.fetchMyTrades(t,i,s,this.extend(a,r))}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=this.safeString(s,"status");void 0===r&&(r=["accepted","done","canceled","rejected","pending"]);const a={status:r};let o;void 0!==e&&(o=this.market(e),a.symbol=o.id),void 0!==t&&(a.start_time=this.iso8601(t)),void 0!==i&&(a.count=i);const n=this.safeInteger(s,"until");void 0!==n&&(s=this.omit(s,["until"]),a.end_time=this.iso8601(n));const d=await this.privateGetV1Orders(this.extend(a,s)),h=this.safeList(d,"orders",[]);return this.parseOrders(h,o,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateGetV1OrdersOrderId(this.extend(s,i));return this.parseOrder(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return this.fetchOrders(e,t,i,this.extend({status:"accepted"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return this.fetchOrders(e,t,i,this.extend({status:"done"},s))}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();return this.fetchOrders(e,t,i,this.extend({status:"canceled"},s))}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};void 0!==e&&(i=this.market(e),s.symbol=i.id);const r=[await this.privateDeleteV1Orders(this.extend(s,t))];return this.parseOrders(r,i)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateDeleteV1OrdersOrderId(this.extend(s,i));return this.parseOrder(r)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets(),i=e;const s=await this.privateDeleteV1OrdersBulk(i),r=this.safeList(s,"order_ids",[]),a=[],o=this.safeString(s,"timestamp");for(let e=0;e<r.length;e++)a.push(this.safeOrder({info:r[e],id:r[e],lastUpdateTimestamp:this.parse8601(o)}));return a}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={symbol:n.id,type:t,side:i,size:this.amountToPrecision(e,s)};let h,c=!1;if("limit"===t||"stop_limit"===t||"take_limit"===t){if(void 0===a)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price argument for a "+t+" order");d.price=this.priceToPrecision(e,a)}else c=!0;[h,o]=this.handlePostOnly(c,!1,o),h&&(d.post_only=!0);const l=this.safeNumberN(o,["triggerPrice","trigger_price","stopPrice","stop_price"]);if(void 0!==l)o=this.omit(o,["triggerPrice","trigger_price","stopPrice"]),d.stop_price=this.priceToPrecision(e,l),"market"===t?d.type="stop_market":"limit"===t&&(d.type="stop_limit");else if("stop_market"===t||"stop_limit"===t||"take_market"===t||"take_limit"===t)throw new r.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice parameter for stop-loss and take-profit orders");const u=this.safeString2(o,"clientOrderId","client_id");void 0!==u&&(d.client_id=u,o=this.omit(o,["clientOrderId","client_id"]));const f=await this.privatePostV1Orders(this.extend(d,o)),p=this.safeDict(f,"order",{});return this.parseOrder(p,n)}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){if(await this.loadMarkets(),void 0===a)throw new r.ArgumentsRequired(this.id+" editOrder() requires an amount argument");const d=this.market(t),h={order_id:e,type:i,side:s,size:this.amountToPrecision(t,a)};void 0!==o&&(h.price=this.priceToPrecision(t,o));const c=await this.privatePatchV1OrdersOrderId(this.extend(h,n));return this.parseOrder(c,d)}parseOrder(e,t=void 0){const i=this.safeString(e,"order_id"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=this.safeString(e,"client_id");let a=this.safeString2(e,"created_at","epoch_timestamp");void 0===a&&(a=this.safeString(e,"timestamp"));const o=this.parse8601(a),n=this.parseOrderStatus(this.safeString(e,"status")),d=this.parseOrderType(this.safeString(e,"type")),h=this.safeString(e,"side"),c=this.safeString(e,"price"),l=this.safeString(e,"stop_price"),u=this.safeString(e,"average_fill_price"),f=this.safeString(e,"size"),p=this.safeString(e,"size_filled"),m=this.safeString(e,"fill_fees"),g=this.safeValue(e,"post_only");let v;return void 0!==m&&(v={currency:t.quote,cost:m,rate:void 0}),this.safeOrder({id:i,clientOrderId:r,timestamp:o,datetime:this.iso8601(o),lastTradeTimestamp:void 0,status:n,symbol:t.symbol,type:d,timeInForce:"GTC",side:h,price:c,triggerPrice:l,average:u,amount:f,cost:void 0,filled:p,remaining:void 0,fee:v,trades:void 0,info:e,postOnly:g},t)}parseOrderStatus(e){return this.safeString({pending:"open",accepted:"open",rejected:"rejected",done:"closed",canceled:"canceled"},e,e)}parseOrderType(e){return this.safeString({market:"market",limit:"limit",stop_market:"market",stop_limit:"limit",take_market:"market",take_limit:"limit"},e,e)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={asset:a.id,amount:this.currencyToPrecision(e,t)},n=this.safeValue(this.options,"accountsByType",{}),d=this.safeString(n,i,i),h=this.safeString(n,s,s);let c;"funding"===d&&"trading"===h?c=await this.privatePostV1TransfersFromWallet(this.extend(o,r)):"trading"===d&&"funding"===h?c=await this.privatePostV1TransfersToWallet(this.extend(o,r)):(o.from_trader_id=d,o.to_trader_id=h,c=await this.privatePostV1TransfersInternalTransfer(this.extend(o,r)));return this.parseTransfer(c,a)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={};void 0!==t&&(a.start_time=this.iso8601(t)),void 0!==i&&(a.count=i);const o=this.safeInteger(s,"until");void 0!==o&&(s=this.omit(s,["until"]),a.end_time=this.iso8601(o));const n=await this.privateGetV1Transfers(this.extend(a,s)),d=this.safeList(n,"transfers",[]);return this.parseTransfers(d,r,t,i)}parseTransfer(e,t=void 0){const i=this.safeString(e,"asset"),s=this.safeString(e,"confirmed_at"),r=this.parse8601(s),a=this.safeString(e,"status");let n,d,h,c=this.safeString(e,"amount");if(void 0!==c){o.Y.stringLt(c,"0")?(n="trading",d="funding",c=o.Y.stringNeg(c)):(n="funding",d="trading"),h=this.parseNumber(c)}return{info:e,id:this.safeString(e,"transfer_id"),timestamp:r,datetime:this.iso8601(r),currency:this.safeCurrencyCode(i,t),amount:h,fromAccount:n,toAccount:d,status:this.parseTransferStatus(a)}}parseTransferStatus(e){return this.safeString({confirmed:"ok"},e,e)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDepositsWithdrawals() requires a code argument");const a=this.safeString2(s,"trader_id","traderId");if(void 0===a)throw new r.ArgumentsRequired(this.id+" fetchDepositsWithdrawals() requires a traderId argument in the params");await this.loadMarkets();const o=this.currency(e),n={asset:o.id,trader_id:a};void 0!==i&&(n.count=i),s=this.omit(s,["trader_id","traderId"]);const d=await this.privateGetV1AccountsTraderIdWalletLedger(this.extend(n,s));return this.parseTransactions(d,o,t,i)}async withdraw(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(e),o={asset:a.id,amount:this.currencyToPrecision(e,t),destination_address:i},n=await this.privatePostV1TransfersWithdrawalRequest(this.extend(o,r)),d=this.safeDict(n,"data",{});return this.parseTransaction(d,a)}parseTransaction(e,t=void 0){const i=this.safeString(e,"asset"),s=this.safeCurrencyCode(i,t),r=this.safeString2(e,"id","transfer_id"),a=this.safeNumber(e,"amount"),o=this.parse8601(this.safeString(e,"created_at"));let n,d=this.safeString(e,"type",void 0);d=void 0===d?"withdrawal":this.parseTransactionType(d);const h=this.safeString(e,"withdrawal_fee_amount");return void 0!==h&&(n={cost:h,currency:s}),{info:e,id:r,txid:void 0,timestamp:o,datetime:this.iso8601(o),network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,type:d,amount:a,currency:s,status:void 0,updated:void 0,fee:n,comment:this.safeString(e,"description"),internal:void 0}}parseTransactionType(e){return this.safeString({CRYPTO_DEPOSIT:"deposit",CRYPTO_WITHDRAWAL:"withdrawal",PRO_TRANSFER:"transfer"},e,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const a=this.safeString2(s,"trader_id","traderId");if(void 0===a)throw new r.ArgumentsRequired(this.id+" fetchLedger() requires a traderId argument in the params");await this.loadMarkets();const o={trader_id:a};let n;void 0!==e&&(n=this.currency(e)),void 0!==t&&(o.start_time=this.iso8601(t)),void 0!==i&&(o.count=i);const d=this.safeInteger(s,"until");void 0!==d&&(s=this.omit(s,["until"]),o.end_time=this.iso8601(d)),s=this.omit(s,["trader_id","traderId"]);const h=await this.privateGetV1AccountsTraderIdLedger(this.extend(o,s)),c=this.safeValue(h,"transactions",[]);return this.parseLedger(c,n,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"transaction_id"),s=this.safeString(e,"created_at"),r=this.parse8601(s);let a=this.safeString(e,"amount");let n;o.Y.stringLt(a,"0")?(n="out",a=o.Y.stringNeg(a)):n="in";const d=this.safeString(e,"asset"),h=this.safeCurrencyCode(d,t);t=this.safeCurrency(d,t);const c=this.parseLedgerEntryType(this.safeString(e,"type"));return this.safeLedgerEntry({info:e,id:i,timestamp:r,datetime:this.iso8601(r),direction:n,account:"trading",referenceId:void 0,referenceAccount:void 0,type:c,currency:h,amount:this.parseNumber(a),before:void 0,after:void 0,status:"ok",fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({"atomic token swap":"trade",fee:"fee",deposit:"transfer",withdrawal:"transfer"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),d="/"+this.implodeParams(e,s);let h=this.urls.api[t]+d;const c=Array.isArray(s);let l;if(c||(l=this.urlencode(o)),"private"===t){this.checkRequiredCredentials();const e=this.seconds().toString();let t=e+i+d;"POST"===i||"PATCH"===i||c?t+=a=this.json(o):void 0!==l&&0!==l.length&&(t+="?"+l,h+="?"+l);const s=this.hmac(this.encode(t),this.base64ToBinary(this.secret),n.s,"base64");r={"CL-ACCESS-KEY":this.apiKey,"CL-ACCESS-SIG":s,"CL-ACCESS-TIMESTAMP":e,"Content-Type":"application/json"}}else void 0!==l&&0!==l.length&&(h+="?"+l);return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n){if(404===e&&i.indexOf("/orders/")>=0&&"GET"===s){const e=i.split("/orders/"),t=this.safeString(e,1);throw new r.OrderNotFound(this.id+" order "+t+" not found (or rejected on the exchange side)")}return}const c=this.safeString(n,"status"),l=this.safeString(n,"message_code");if(void 0!==l||void 0!==c&&200!==e&&202!==e&&"200"!==c&&"202"!==c){const e=this.id+" "+o,t=this.safeString(n,"message");throw this.throwBroadlyMatchedException(this.exceptions.broad,t,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinmate",name:"CoinMate",countries:["GB","CZ","EU"],rateLimit:600,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactions:"emulated",reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/51840849/87460806-1c9f3f00-c616-11ea-8c46-a77018a8f3f4.jpg",api:{rest:"https://coinmate.io/api"},www:"https://coinmate.io",fees:"https://coinmate.io/fees",doc:["https://coinmate.docs.apiary.io","https://coinmate.io/developers"],referral:"https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0"},requiredCredentials:{apiKey:!0,secret:!0,uid:!0},api:{public:{get:["orderBook","ticker","tickerAll","products","transactions","tradingPairs"]},private:{post:["balances","bitcoinCashWithdrawal","bitcoinCashDepositAddresses","bitcoinDepositAddresses","bitcoinWithdrawal","bitcoinWithdrawalFees","buyInstant","buyLimit","cancelOrder","cancelOrderWithInfo","createVoucher","dashDepositAddresses","dashWithdrawal","ethereumWithdrawal","ethereumDepositAddresses","litecoinWithdrawal","litecoinDepositAddresses","openOrders","order","orderHistory","orderById","pusherAuth","redeemVoucher","replaceByBuyLimit","replaceByBuyInstant","replaceBySellLimit","replaceBySellInstant","rippleDepositAddresses","rippleWithdrawal","sellInstant","sellLimit","transactionHistory","traderFees","tradeHistory","transfer","transferHistory","unconfirmedBitcoinDeposits","unconfirmedBitcoinCashDeposits","unconfirmedDashDeposits","unconfirmedEthereumDeposits","unconfirmedLitecoinDeposits","unconfirmedRippleDeposits","cancelAllOpenOrders","withdrawVirtualCurrency","virtualCurrencyDepositAddresses","unconfirmedVirtualCurrencyDeposits","adaWithdrawal","adaDepositAddresses","unconfirmedAdaDeposits","solWithdrawal","solDepositAddresses","unconfirmedSolDeposits"]}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.006"),maker:this.parseNumber("0.004"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.006")],[this.parseNumber("10000"),this.parseNumber("0.003")],[this.parseNumber("100000"),this.parseNumber("0.0023")],[this.parseNumber("250000"),this.parseNumber("0.0021")],[this.parseNumber("500000"),this.parseNumber("0.0018")],[this.parseNumber("1000000"),this.parseNumber("0.0015")],[this.parseNumber("3000000"),this.parseNumber("0.0012")],[this.parseNumber("15000000"),this.parseNumber("0.001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("10000"),this.parseNumber("0.002")],[this.parseNumber("100000"),this.parseNumber("0.0012")],[this.parseNumber("250000"),this.parseNumber("0.0009")],[this.parseNumber("500000"),this.parseNumber("0.0005")],[this.parseNumber("1000000"),this.parseNumber("0.0003")],[this.parseNumber("3000000"),this.parseNumber("0.0002")],[this.parseNumber("15000000"),this.parseNumber("-0.0004")]]}}},options:{withdraw:{fillResponsefromRequest:!0,methods:{BTC:"privatePostBitcoinWithdrawal",LTC:"privatePostLitecoinWithdrawal",BCH:"privatePostBitcoinCashWithdrawal",ETH:"privatePostEthereumWithdrawal",XRP:"privatePostRippleWithdrawal",DASH:"privatePostDashWithdrawal",DAI:"privatePostDaiWithdrawal",ADA:"privatePostAdaWithdrawal",SOL:"privatePostSolWithdrawal"}}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"No order with given ID":r.OrderNotFound},broad:{"Not enough account balance available":r.InsufficientFunds,"Incorrect order ID":r.InvalidOrder,"Minimum Order Size ":r.InvalidOrder,"max allowed precision":r.InvalidOrder,"TOO MANY REQUESTS":r.RateLimitExceeded,"Access denied.":r.AuthenticationError}},precisionMode:o.kb})}async fetchMarkets(e={}){const t=await this.publicGetTradingPairs(e),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"name"),a=this.safeString(t,"firstCurrency"),o=this.safeString(t,"secondCurrency"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=n+"/"+d;s.push({id:r,symbol:h,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"lotDecimals"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"priceDecimals")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minAmount"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}parseBalance(e){const t=this.safeValue(e,"data",{}),i={info:e},s=Object.keys(t);for(let e=0;e<s.length;e++){const r=s[e],a=this.safeCurrencyCode(r),o=this.safeValue(t,r),n=this.account();n.free=this.safeString(o,"available"),n.used=this.safeString(o,"reserved"),n.total=this.safeString(o,"balance"),i[a]=n}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostBalances(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={currencyPair:s.id,groupByPriceLimit:"False"},a=(await this.publicGetOrderBook(this.extend(r,i))).data,o=this.safeTimestamp(a,"timestamp");return this.parseOrderBook(a,s.symbol,o,"bids","asks","price","amount")}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={currencyPair:i.id},r=await this.publicGetTicker(this.extend(s,t)),a=this.safeDict(r,"data");return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickerAll(t),s=this.safeValue(i,"data",{}),r=Object.keys(s),a={};for(let e=0;e<r.length;e++){const t=this.market(r[e]),i=this.parseTicker(this.safeValue(s,r[e]),t);a[t.symbol]=i}return this.filterByArrayTickers(a,"symbol",e)}parseTicker(e,t=void 0){const i=this.safeTimestamp(e,"timestamp"),s=this.safeNumber(e,"last");return this.safeTicker({symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeNumber(e,"high"),low:this.safeNumber(e,"low"),bid:this.safeNumber(e,"bid"),bidVolume:void 0,ask:this.safeNumber(e,"ask"),vwap:void 0,askVolume:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeNumber(e,"amount"),quoteVolume:void 0,info:e},t)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={limit:1e3};if(void 0!==i&&(r.limit=i),void 0!==t&&(r.timestampFrom=t),void 0!==e){const t=this.currency(e);r.currency=t.id}const a=(await this.privatePostTransferHistory(this.extend(r,s))).data;return this.parseTransactions(a,void 0,t,i)}parseTransactionStatus(e){return this.safeString({COMPLETED:"ok",WAITING:"pending",SENT:"pending",CREATED:"pending",OK:"ok",NEW:"pending",CANCELED:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"amountCurrency"),r=this.safeCurrencyCode(s,t);return{info:e,id:this.safeString2(e,"transactionId","id"),txid:this.safeString(e,"txid"),type:this.safeStringLower(e,"transferType"),currency:r,network:this.safeString(e,"walletType"),amount:this.safeNumber(e,"amount"),status:this.parseTransactionStatus(this.safeString(e,"transferStatus")),timestamp:i,datetime:this.iso8601(i),address:this.safeString(e,"destination"),addressFrom:void 0,addressTo:void 0,tag:this.safeString(e,"destinationTag"),tagFrom:void 0,tagTo:void 0,updated:void 0,comment:void 0,internal:void 0,fee:{cost:this.safeNumber(e,"fee"),currency:r,rate:void 0}}}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n=this.safeValue(this.options,"withdraw",{}),d=this.safeValue(n,"methods",{}),h=this.safeString(d,e);if(void 0===h){const e=Object.keys(d);throw new r.ExchangeError(this.id+" withdraw() only allows withdrawing the following currencies: "+e.join(", "))}const c={amount:this.currencyToPrecision(e,t),address:i};void 0!==s&&(c.destinationTag=s);const l=await this[h](this.extend(c,a)),u=this.safeValue(l,"data"),f=this.parseTransaction(u,o);return this.safeBool(n,"fillResponseFromRequest",!0)&&(f.amount=t,f.currency=e,f.address=i,f.tag=s,f.type="withdrawal",f.status="pending"),f}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),void 0===i&&(i=1e3);const r={limit:i};if(void 0!==e){const t=this.market(e);r.currencyPair=t.id}void 0!==t&&(r.timestampFrom=t);const a=await this.privatePostTradeHistory(this.extend(r,s)),o=this.safeList(a,"data",[]);return this.parseTrades(o,void 0,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"currencyPair");t=this.safeMarket(i,t,"_");const s=this.safeString(e,"price"),r=this.safeString(e,"amount"),a=this.safeStringLower2(e,"type","tradeType"),o=this.safeStringLower(e,"orderType"),n=this.safeString(e,"orderId"),d=this.safeString(e,"transactionId"),h=this.safeInteger2(e,"timestamp","createdTimestamp");let c;const l=this.safeString(e,"fee");void 0!==l&&(c={cost:l,currency:t.quote});let u=this.safeString(e,"feeType");return u="MAKER"===u?"maker":"taker",this.safeTrade({id:d,info:e,timestamp:h,datetime:this.iso8601(h),symbol:t.symbol,type:o,side:a,order:n,takerOrMaker:u,price:s,amount:r,cost:void 0,fee:c},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={currencyPair:r.id,minutesIntoHistory:10},o=await this.publicGetTransactions(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={currencyPair:i.id},r=await this.privatePostTraderFees(this.extend(s,t)),o=this.safeValue(r,"data",{}),n=this.safeString(o,"maker"),d=this.safeString(o,"taker"),h=this.parseNumber(a.Y.stringDiv(n,"100")),c=this.parseNumber(a.Y.stringDiv(d,"100"));return{info:o,symbol:i.symbol,maker:h,taker:c,percentage:!0,tierBased:!0}}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const r=await this.privatePostOpenOrders(this.extend({},s));return this.parseOrders(r.data,void 0,t,i,{status:"open"})}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={currencyPair:a.id};void 0!==i&&(o.limit=i);const n=await this.privatePostOrderHistory(this.extend(o,s));return this.parseOrders(n.data,a,t,i)}parseOrderStatus(e){return this.safeString({FILLED:"closed",CANCELLED:"canceled",PARTIALLY_FILLED:"open",OPEN:"open"},e,e)}parseOrderType(e){return this.safeString({LIMIT:"limit",MARKET:"market"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeInteger(e,"timestamp"),r=this.safeStringLower(e,"type"),a=this.safeString(e,"price"),o=this.safeString(e,"originalAmount"),n=this.safeString2(e,"remainingAmount","amount"),d=this.parseOrderStatus(this.safeString(e,"status")),h=this.parseOrderType(this.safeString(e,"orderTradeType")),c=this.safeString(e,"avgPrice"),l=this.safeString(e,"currencyPair"),u=this.safeSymbol(l,t,"_"),f=this.safeString(e,"clientOrderId");return this.safeOrder({id:i,clientOrderId:f,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,symbol:u,type:h,timeInForce:void 0,postOnly:void 0,side:r,price:a,triggerPrice:this.safeNumber(e,"stopPrice"),amount:o,cost:void 0,average:c,filled:void 0,remaining:n,status:d,trades:void 0,info:e,fee:void 0},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();let o="privatePost"+this.capitalize(i);const n=this.market(e),d={currencyPair:n.id};"market"===t?("buy"===i?d.total=this.amountToPrecision(e,s):d.amount=this.amountToPrecision(e,s),o+="Instant"):(d.amount=this.amountToPrecision(e,s),d.price=this.priceToPrecision(e,r),o+=this.capitalize(t));const h=await this[o](this.extend(d,a)),c=this.safeString(h,"data");return this.safeOrder({info:h,id:c},n)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e};let r;t&&(r=this.market(t));const a=await this.privatePostOrderById(this.extend(s,i)),o=this.safeDict(a,"data");return this.parseOrder(o,r)}async cancelOrder(e,t=void 0,i={}){const s={orderId:e},r=await this.privatePostCancelOrderWithInfo(this.extend(s,i)),a=this.safeDict(r,"data");return this.parseOrder(a)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/"+e;if("public"===t)Object.keys(s).length&&(o+="?"+this.urlencode(s));else{this.checkRequiredCredentials();const e=this.nonce().toString(),t=e+this.uid+this.apiKey,i=this.hmac(this.encode(t),this.encode(this.secret),n.s);a=this.urlencode(this.extend({clientId:this.uid,nonce:e,publicKey:this.apiKey,signature:i.toUpperCase()},s)),r={"Content-Type":"application/x-www-form-urlencoded"}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"errorMessage");if(void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),new r.ExchangeError(e)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinmetro",name:"Coinmetro",countries:["EE"],version:"v1",rateLimit:200,certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,addMargin:!1,borrowCrossMargin:!0,borrowIsolatedMargin:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!0,createDepositAddress:!1,createOrder:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,deposit:!1,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!1,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!1,ws:!1},timeframes:{"1m":"60000","5m":"300000","30m":"1800000","4h":"14400000","1d":"86400000"},urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/e86f87ec-6ba3-4410-962b-f7988c5db539",api:{public:"https://api.coinmetro.com",private:"https://api.coinmetro.com"},test:{public:"https://api.coinmetro.com/open",private:"https://api.coinmetro.com/open"},www:"https://coinmetro.com/",doc:["https://documenter.getpostman.com/view/3653795/SVfWN6KS"],fees:"https://help.coinmetro.com/hc/en-gb/articles/6844007317789-What-are-the-fees-on-Coinmetro-",referral:"https://go.coinmetro.com/?ref=crypto24"},api:{public:{get:{"demo/temp":1,"exchange/candles/{pair}/{timeframe}/{from}/{to}":3,"exchange/prices":1,"exchange/ticks/{pair}/{from}":3,assets:1,markets:1,"exchange/book/{pair}":3,"exchange/bookUpdates/{pair}/{from}":1}},private:{get:{"users/balances":1,"users/wallets":1,"users/wallets/history/{since}":1.67,"exchange/orders/status/{orderID}":1,"exchange/orders/active":1,"exchange/orders/history/{since}":1.67,"exchange/fills/{since}":1.67,"exchange/margin":1},post:{jwt:1,jwtDevice:1,devices:1,"jwt-read-only":1,"exchange/orders/create":1,"exchange/orders/modify/{orderID}":1,"exchange/swap":1,"exchange/swap/confirm/{swapId}":1,"exchange/orders/close/{orderID}":1,"exchange/orders/hedge":1},put:{jwt:1,"exchange/orders/cancel/{orderID}":1,"users/margin/collateral":1,"users/margin/primary/{currency}":1}}},requiredCredentials:{apiKey:!1,secret:!1,uid:!0,token:!0},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0")}},precisionMode:a.kb,options:{currenciesByIdForParseMarket:void 0,currencyIdsListForParseMarket:["QRDO"]},features:{spot:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!1},timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"Both buyingCurrency and sellingCurrency are required":r.InvalidOrder,"One and only one of buyingQty and sellingQty is required":r.InvalidOrder,"Invalid buyingCurrency":r.InvalidOrder,"Invalid 'from'":r.BadRequest,"Invalid sellingCurrency":r.InvalidOrder,"Invalid buyingQty":r.InvalidOrder,"Invalid sellingQty":r.InvalidOrder,"Insufficient balance":r.InsufficientFunds,"Expiration date is in the past or too near in the future":r.InvalidOrder,Forbidden:r.PermissionDenied,"Order Not Found":r.OrderNotFound,"since must be a millisecond timestamp":r.BadRequest,"This pair is disabled on margin":r.BadSymbol},broad:{"accessing from a new IP":r.PermissionDenied,"available to allocate as collateral":r.InsufficientFunds,"At least":r.BadRequest,"collateral is not allowed":r.BadRequest,"Insufficient liquidity":r.InvalidOrder,"Insufficient order size":r.InvalidOrder,"Invalid quantity":r.InvalidOrder,"Invalid Stop Loss":r.InvalidOrder,"Invalid stop price!":r.InvalidOrder,"Not enough balance":r.InsufficientFunds,"Not enough margin":r.InsufficientFunds,"orderType missing":r.BadRequest,"Server Timeout":r.ExchangeError,"Time in force has to be IOC or FOK for market orders":r.InvalidOrder,"Too many attempts":r.RateLimitExceeded}}})}async fetchCurrencies(e={}){const t=await this.publicGetAssets(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"symbol"),a=this.safeCurrencyCode(r),o=this.safeValue(s,"canWithdraw"),n=this.safeValue(s,"canDeposit"),d=!this.safeValue(s,"canTrade")||o,h=this.safeNumber(s,"minQty");i[a]=this.safeCurrencyStructure({id:r,code:a,name:a,info:s,active:d,deposit:n,withdraw:o,fee:void 0,precision:this.parseNumber(this.parsePrecision(this.safeString(s,"digits"))),limits:{amount:{min:h,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}})}if(void 0===this.safeValue(this.options,"currenciesByIdForParseMarket")){const e=this.indexBy(i,"id");this.options.currenciesByIdForParseMarket=e;const t=this.safeList(this.options,"currencyIdsListForParseMarket",[]),s=Object.keys(e);for(let e=0;e<s.length;e++)t.push(s[e]);this.options.currencyIdsListForParseMarket=t}return i}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e);return void 0===this.safeValue(this.options,"currenciesByIdForParseMarket")&&await this.fetchCurrencies(),this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"pair"),i=this.parseMarketId(t),s=this.safeString(i,"baseId"),r=this.safeString(i,"quoteId"),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r),n=this.parseMarketPrecisionAndLimits(s),d=this.parseMarketPrecisionAndLimits(r),h=this.safeBool(e,"margin",!1),c=this.safeValue(this.fees,"trading",{});return this.safeMarketStructure({id:t,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:h,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(c,"taker"),maker:this.safeNumber(c,"maker"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:n.precision,price:this.parseNumber(this.parsePrecision(this.safeString(e,"precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:n.minLimit,max:void 0},price:{min:void 0,max:void 0},cost:{min:d.minLimit,max:void 0}},created:void 0,info:e})}parseMarketId(e){let t,i;const s=this.safeValue(this.options,"currencyIdsListForParseMarket",[]),r=s.length;for(let e=0;e<r;e++)for(let t=0;t<r-e-1;t++){const e=s[t],i=s[t+1];e.length<i.length&&(s[t]=i,s[t+1]=e)}for(let r=0;r<s.length;r++){const a=s[r],o=e.indexOf(a);if(0===o){const r=e.replace(a,"");if(this.inArray(r,s)){0===o?(t=a,i=r):(t=r,i=a);break}}}return{baseId:t,quoteId:i}}parseMarketPrecisionAndLimits(e){const t=this.safeValue(this.options,"currenciesByIdForParseMarket",{}),i=this.safeValue(t,e,{}),s=this.safeValue(i,"limits",{}),r=this.safeValue(s,"amount",{}),a=this.safeNumber(r,"min");return{precision:this.safeNumber(i,"precision"),minLimit:a}}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={pair:a.id,timeframe:this.safeString(this.timeframes,t,t)};let n;if(void 0!==i){if(o.from=i,void 0!==s){const e=1e3*this.parseTimeframe(t);n=this.sum(i,e*s)}}else o.from=":from";n=this.safeInteger(r,"until",n),void 0!==n?(r=this.omit(r,["until"]),o.to=n):o.to=":to";const d=await this.publicGetExchangeCandlesPairTimeframeFromTo(this.extend(o,r)),h=this.safeList(d,"candleHistory",[]);return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"timestamp"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};a.from=void 0!==t?t:"";const o=await this.publicGetExchangeTicksPairFrom(this.extend(a,s)),n=this.safeList(o,"tickHistory",[]);return this.parseTrades(n,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};a.since=void 0!==t?t:0;const o=await this.privateGetExchangeFillsSince(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString2(e,"symbol","pair"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeStringN(e,["_id","seqNum","seqNumber"]),a=this.safeInteger(e,"timestamp"),o=this.safeString(e,"price"),n=this.safeString(e,"qty"),d=this.safeString(e,"orderID"),h=this.safeString(e,"side");return this.safeTrade({id:r,order:d,timestamp:a,datetime:this.iso8601(a),symbol:s,type:void 0,side:h,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:void 0,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={pair:this.market(e).id},r=await this.publicGetExchangeBookPair(this.extend(s,i)),a=this.safeValue(r,"book",{}),o={bids:this.safeValue(a,"bid",{}),asks:this.safeValue(a,"ask",{})},n=this.parseOrderBook(o,e);return n.nonce=this.safeInteger(a,"seqNumber"),n}parseBidsAsks(e,t=0,i=1,s=2){const r=Object.keys(e),a=[];for(let t=0;t<r.length;t++){const i=this.safeString(r,t),s=this.safeNumber(r,t),o=this.safeNumber(e,i);a.push([s,o])}return a}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetExchangePrices(t),s=this.safeValue(i,"latestPrices",[]),r=this.safeValue(i,"24hInfo",[]),a={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"pair");void 0!==i&&(a[i]=t)}for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"pair");if(void 0!==i){const e=this.safeValue(a,i,{});a[i]=this.extend(t,e)}}const o=Object.values(a);return this.parseTickers(o,e)}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetExchangePrices(t),s=this.safeList(i,"latestPrices",[]);return this.parseTickers(s,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"pair");t=this.safeMarket(i,t);const s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"bid"),a=this.safeString(e,"ask"),n=this.safeString(e,"h"),d=this.safeString(e,"l"),h=this.safeString(e,"price"),c=this.safeString(e,"v"),l=this.safeString(e,"delta"),u=o.Y.stringMul(l,"100");return this.safeTicker({symbol:t.symbol,timestamp:s,datetime:this.iso8601(s),open:void 0,high:n,low:d,close:void 0,last:h,bid:r,bidVolume:void 0,ask:a,askVolume:void 0,vwap:void 0,previousClose:void 0,change:void 0,percentage:u,average:void 0,baseVolume:c,quoteVolume:void 0,info:e},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUsersWallets(e),i=this.safeList(t,"list",[]);return this.parseBalance(i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=this.safeDict(e,i,{}),r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.used=this.safeString(s,"reserved"),t[a]=o}return this.safeBalance(t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;r.since=void 0!==t?t:"",void 0!==e&&(a=this.currency(e));const o=await this.privateGetUsersWalletsHistorySince(this.extend(r,s)),n=this.safeValue(o,"list",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"currency"),s=this.safeValue(t,"balanceHistory",[]);for(let e=0;e<s.length;e++){const t=s[e];t.currencyId=i,d.push(t)}}return this.parseLedger(d,a,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"timestamp"),s=this.safeString(e,"currencyId");e=this.omit(e,"currencyId"),t=this.safeCurrency(s,t);const r=this.safeString(e,"description",""),[a,n]=this.parseLedgerEntryDescription(r),d=this.safeValue(e,"JSONdata",{}),h={cost:this.safeString(d,"fees"),currency:void 0};let c,l=this.safeString(e,"amount");return void 0!==l&&(o.Y.stringLt(l,"0")?(c="out",l=o.Y.stringAbs(l)):o.Y.stringGt(l,"0")&&(c="in")),this.safeLedgerEntry({info:e,id:void 0,timestamp:this.parse8601(i),datetime:i,direction:c,account:void 0,referenceId:n,referenceAccount:void 0,type:a,currency:t,amount:l,before:void 0,after:void 0,status:void 0,fee:h},t)}parseLedgerEntryDescription(e){let t,i,s=[];void 0!==e&&(s=e.split(" "));return s.length>1&&(t=this.parseLedgerEntryType(s[0]),i="-"!==s[1]?s[1]:this.safeString(s,2)),[t,i]}parseLedgerEntryType(e){return this.safeString({Deposit:"transaction",Withdraw:"transaction",Order:"trade"},e,e)}async createOrder(e,t,i,s,a=void 0,n={}){await this.loadMarkets();const d=this.market(e);let h,c={};c.orderType=t,void 0!==s&&(h=this.amountToPrecision(e,s));let l,u=this.safeValue(n,"cost");if(n=this.omit(n,"cost"),"limit"===t){if(void 0===a&&void 0===u)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price or params.cost argument for a "+t+" order");if(void 0!==a&&void 0!==s){const e=o.Y.stringMul(this.numberToString(a),this.numberToString(h));u=this.parseToNumeric(e)}}void 0!==u&&(l=this.costToPrecision(e,u)),"sell"===i?c=this.handleCreateOrderSide(d.baseId,d.quoteId,h,l,c):"buy"===i&&(c=this.handleCreateOrderSide(d.quoteId,d.baseId,l,h,c));const f=this.safeValue(n,"timeInForce");void 0!==f&&(n=this.omit(n,"timeInForce"),c.timeInForce=this.encodeOrderTimeInForce(f));const p=this.safeString2(n,"triggerPrice","stopPrice");void 0!==p&&(n=this.omit(n,["triggerPrice"]),c.stopPrice=this.priceToPrecision(e,p));const m=this.safeValue(n,"userData",{}),g=this.safeString2(n,"clientOrderId","comment");void 0!==g&&(n=this.omit(n,["clientOrderId"]),m.comment=g);const v=this.safeString(n,"stopLossPrice");void 0!==v&&(n=this.omit(n,"stopLossPrice"),m.stopLoss=this.priceToPrecision(e,v));const y=this.safeString(n,"takeProfitPrice");void 0!==y&&(n=this.omit(n,"takeProfitPrice"),m.takeProfit=this.priceToPrecision(e,y)),this.isEmpty(m)||(c.userData=m);const w=await this.privatePostExchangeOrdersCreate(this.extend(c,n));return this.parseOrder(w,d)}handleCreateOrderSide(e,t,i,s,r={}){return r.sellingCurrency=e,r.buyingCurrency=t,void 0!==i&&(r.sellingQty=i),void 0!==s&&(r.buyingQty=s),r}encodeOrderTimeInForce(e){return this.safeValue({GTC:1,IOC:2,GTD:3,FOK:4},e,e)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderID:e};[i,i]=this.handleMarginModeAndParams("cancelOrder",i);const r=this.safeBool(i,"margin",!1);let a;return i=this.omit(i,"margin"),a=r?await this.privatePostExchangeOrdersCloseOrderID(this.extend(s,i)):await this.privatePutExchangeOrdersCancelOrderID(this.extend(s,i)),this.parseOrder(a)}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeString(i,"orderId");if(void 0===s)throw new r.ArgumentsRequired(this.id+" closePosition() requires a orderId parameter");const a={orderID:s},o=await this.privatePostExchangeOrdersCloseOrderID(this.extend(a,i));return this.parseOrder(o)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privateGetExchangeOrdersActive(s),o=this.parseOrders(a,r,t,i);for(let e=0;e<o.length;e++){o[e].status="open"}return o}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==t&&(a.since=t);const o=await this.privateGetExchangeOrdersHistorySince(this.extend(a,s));return this.parseOrders(o,r,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderID:e},r=await this.privateGetExchangeOrdersStatusOrderID(this.extend(s,i));return this.parseOrder(r)}parseOrder(e,t=void 0){let i=this.safeInteger(e,"creationTime");let s;!0===this.safeValue(e,"canceled")?void 0===i?(i=this.safeInteger(e,"completionTime"),s="rejected"):s="canceled":(s=this.safeString(e,"status"),e=this.omit(e,"status"));const r=this.safeString(e,"orderType");let a=this.safeString(e,"buyingQty"),n=this.safeString(e,"sellingQty");const d=this.safeString(e,"boughtQty"),h=this.safeString(e,"soldQty");"market"===r&&(void 0===a&&void 0!==d&&"0"!==d&&(a=d),void 0===n&&void 0!==h&&"0"!==h&&(n=h));const c=this.safeString(e,"buyingCurrency",""),l=this.safeString(e,"sellingCurrency",""),u=c+l,f=l+c;let p,m,g,v,y,w=a,b=a;const k=this.indexBy(this.markets,"id");let S,O;void 0!==this.safeValue(k,u)?(p="buy",m=u,b=n,g=d,v=h,y="base"):void 0!==this.safeValue(k,f)&&(p="sell",m=f,w=n,g=h,v=d,y="quote"),void 0!==w&&void 0!==b&&(S=o.Y.stringDiv(b,w)),t=this.safeMarket(m,t);const T=this.safeString(e,"fees");void 0!==T&&void 0!==y&&(O={currency:t[y],cost:T,rate:void 0});const P=this.safeValue(e,"fills",[]),I=this.safeValue(e,"userData",{}),M=this.safeString(I,"comment"),x=this.safeString(I,"takeProfit"),A=this.safeString(I,"stopLoss");return this.safeOrder({id:this.safeString(e,"orderID"),clientOrderId:M,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:this.safeInteger(e,"lastFillTime"),status:s,symbol:t.symbol,type:r,timeInForce:this.parseOrderTimeInForce(this.safeInteger(e,"timeInForce")),side:p,price:S,triggerPrice:this.safeString(e,"stopPrice"),takeProfitPrice:x,stopLossPrice:A,average:void 0,amount:w,cost:v,filled:g,remaining:void 0,fee:O,fees:void 0,trades:P,info:e},t)}parseOrderTimeInForce(e){const t=[void 0,"GTC","IOC","GTD","FOK"];return this.safeValue(t,e,e)}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={};r[s.id]=this.currencyToPrecision(e,t);const a=await this.privatePutUsersMarginCollateral(this.extend(r,i)),o=this.safeValue(a,"result",{}),n=this.parseMarginLoan(o,s);return this.extend(n,{amount:t})}parseMarginLoan(e,t=void 0){const i=this.safeString(e,"coin");return{id:void 0,currency:this.safeCurrencyCode(i,t),amount:void 0,symbol:void 0,timestamp:void 0,datetime:void 0,info:e}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),n="/"+this.implodeParams(e,s);let d=this.urls.api[t]+n;const h=this.urlencode(o);for(void 0===r&&(r={}),r.CCXT="true","private"===t?(void 0===this.uid&&void 0!==this.apiKey&&(this.uid=this.apiKey),void 0===this.token&&void 0!==this.secret&&(this.token=this.secret),"https://api.coinmetro.com/jwt"===d?(r["X-Device-Id"]="bypass",void 0!==this.twofa&&(r["X-OTP"]=this.twofa)):"https://api.coinmetro.com/jwtDevice"===d?(r["X-Device-Id"]=this.uid,void 0!==this.twofa&&(r["X-OTP"]=this.twofa)):(r.Authorization="Bearer "+this.token,d.startsWith("https://api.coinmetro.com/open")||(this.checkRequiredCredentials(),r["X-Device-Id"]=this.uid)),"POST"!==i&&"PUT"!==i||(r["Content-Type"]="application/x-www-form-urlencoded",a=this.urlencode(o))):0!==h.length&&(d+="?"+h);d.endsWith("/");)d=d.slice(0,d.length-1);return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&200!==e&&201!==e&&202!==e){const e=this.id+" "+o,t=this.safeString(n,"message");throw this.throwBroadlyMatchedException(this.exceptions.broad,t,e),this.throwExactlyMatchedException(this.exceptions.exact,t,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinone",name:"CoinOne",countries:["KR"],rateLimit:50,version:"v2",pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketOrder:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,ws:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/38003300-adc12fba-323f-11e8-8525-725f53c4a659.jpg",api:{rest:"https://api.coinone.co.kr",v2Public:"https://api.coinone.co.kr/public/v2",v2Private:"https://api.coinone.co.kr/v2",v2_1Private:"https://api.coinone.co.kr/v2.1"},www:"https://coinone.co.kr",doc:"https://doc.coinone.co.kr"},requiredCredentials:{apiKey:!0,secret:!0},api:{public:{get:["orderbook","ticker","ticker_utc","trades"]},v2Public:{get:["range_units","markets/{quote_currency}","markets/{quote_currency}/{target_currency}","orderbook/{quote_currency}/{target_currency}","trades/{quote_currency}/{target_currency}","ticker_new/{quote_currency}","ticker_new/{quote_currency}/{target_currency}","ticker_utc_new/{quote_currency}","ticker_utc_new/{quote_currency}/{target_currency}","currencies","currencies/{currency}","chart/{quote_currency}/{target_currency}"]},private:{post:["account/deposit_address","account/btc_deposit_address","account/balance","account/daily_balance","account/user_info","account/virtual_account","order/cancel_all","order/cancel","order/limit_buy","order/limit_sell","order/complete_orders","order/limit_orders","order/order_info","transaction/auth_number","transaction/history","transaction/krw/history","transaction/btc","transaction/coin"]},v2Private:{post:["account/balance","account/deposit_address","account/user_info","account/virtual_account","order/cancel","order/limit_buy","order/limit_sell","order/limit_orders","order/complete_orders","order/query_order","transaction/auth_number","transaction/btc","transaction/history","transaction/krw/history"]},v2_1Private:{post:["account/balance/all","account/balance","account/trade_fee","account/trade_fee/{quote_currency}/{target_currency}","order/limit","order/cancel","order/cancel/all","order/open_orders","order/open_orders/all","order/complete_orders","order/complete_orders/all","order/info","transaction/krw/history","transaction/coin/history","transaction/coin/withdrawal/limit"]}},fees:{trading:{tierBased:!1,percentage:!0,taker:.002,maker:.002}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{104:r.OrderNotFound,107:r.BadRequest,108:r.BadSymbol,405:r.OnMaintenance},commonCurrencies:{SOC:"Soda Coin"}})}async fetchCurrencies(e={}){const t=await this.v2PublicGetCurrencies(e),i={},s=this.safeList(t,"currencies",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"symbol"),a=this.safeString(t,"name"),o=this.safeCurrencyCode(r),n="normal"===this.safeString(t,"withdraw_status",""),d="normal"===this.safeString(t,"deposit_status","");i[o]={id:r,code:o,info:t,name:a,active:n&&d,deposit:d,withdraw:n,fee:this.safeNumber(t,"withdrawal_fee"),precision:this.parseNumber(this.parsePrecision(this.safeString(t,"max_precision"))),limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.safeNumber(t,"withdrawal_min_amount"),max:void 0}},networks:{}}}return i}async fetchMarkets(e={}){const t=await this.v2PublicGetTickerNewQuoteCurrency({quote_currency:"KRW"}),i=this.safeList(t,"tickers",[]),s=[];for(let e=0;e<i.length;e++){const t=this.safeValue(i,e),r=this.safeString(t,"id"),a=this.safeStringUpper(t,"target_currency"),o=this.safeStringUpper(t,"quote_currency"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o);s.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber("1e-4"),price:this.parseNumber("1e-4"),cost:this.parseNumber("1e-8")},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}parseBalance(e){const t={info:e},i=this.omit(e,["errorCode","result","normalWallets"]),s=Object.keys(i);for(let e=0;e<s.length;e++){const r=s[e],a=i[r],o=this.safeCurrencyCode(r),n=this.account();n.free=this.safeString(a,"avail"),n.total=this.safeString(a,"balance"),t[o]=n}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v2PrivatePostAccountBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={quote_currency:s.quote,target_currency:s.base};void 0!==t&&(r.size=t);const a=await this.v2PublicGetOrderbookQuoteCurrencyTargetCurrency(this.extend(r,i)),o=this.safeInteger(a,"timestamp");return this.parseOrderBook(a,s.symbol,o,"bids","asks","price","qty")}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={quote_currency:"KRW"};let s,r;if(void 0!==(e=this.marketSymbols(e))){const a=this.safeString(e,0);s=this.market(a),i.quote_currency=s.quote,i.target_currency=s.base,r=await this.v2PublicGetTickerNewQuoteCurrencyTargetCurrency(this.extend(i,t))}else r=await this.v2PublicGetTickerNewQuoteCurrency(this.extend(i,t));const a=this.safeList(r,"tickers",[]);return this.parseTickers(a,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={quote_currency:i.quote,target_currency:i.base},r=await this.v2PublicGetTickerNewQuoteCurrencyTargetCurrency(this.extend(s,t)),a=this.safeList(r,"tickers",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"last"),r=this.safeList(e,"best_asks",[]),a=this.safeList(e,"best_bids",[]),o=this.safeString(e,"target_currency"),n=this.safeString(e,"quote_currency"),d=this.safeCurrencyCode(o),h=this.safeCurrencyCode(n);return this.safeTicker({symbol:d+"/"+h,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(a,"price"),bidVolume:this.safeString(a,"qty"),ask:this.safeString(r,"price"),askVolume:this.safeString(r,"qty"),vwap:void 0,open:this.safeString(e,"first"),close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"target_volume"),quoteVolume:this.safeString(e,"quote_volume"),info:e},t)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"timestamp");t=this.safeMarket(void 0,t);const s=this.safeBool(e,"is_seller_maker");let r;void 0!==s&&(r=s?"sell":"buy");const o=this.safeString(e,"price"),n=this.safeString(e,"qty"),d=this.safeString(e,"orderId");let h,c=this.safeString(e,"fee");if(void 0!==c){c=a.Y.stringAbs(c);let i=this.safeString(e,"feeRate");i=a.Y.stringAbs(i);h={cost:c,currency:"sell"===r?t.quote:t.base,rate:i}}return this.safeTrade({id:this.safeString(e,"id"),info:e,timestamp:i,datetime:this.iso8601(i),order:d,symbol:t.symbol,type:void 0,side:r,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:h},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={quote_currency:r.quote,target_currency:r.base};void 0!==i&&(a.size=Math.min(i,200));const o=await this.v2PublicGetTradesQuoteCurrencyTargetCurrency(this.extend(a,s)),n=this.safeList(o,"transactions",[]);return this.parseTrades(n,r,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){if("limit"!==t)throw new r.ExchangeError(this.id+" createOrder() allows limit orders only");await this.loadMarkets();const n=this.market(e),d={price:a,currency:n.id,qty:s},h="privatePostOrder"+this.capitalize(t)+this.capitalize(i),c=await this[h](this.extend(d,o));return this.parseOrder(c,n)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={order_id:e,currency:s.id},o=await this.v2PrivatePostOrderQueryOrder(this.extend(a,i));return this.parseOrder(o,s)}parseOrderStatus(e){return this.safeString({live:"open",partially_filled:"open",partially_canceled:"open",filled:"closed",canceled:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"orderId"),s=this.safeString(e,"baseCurrency"),r=this.safeString(e,"targetCurrency");let o,n,d;void 0!==s&&(o=this.safeCurrencyCode(s)),void 0!==r&&(n=this.safeCurrencyCode(r)),void 0!==o&&void 0!==n&&(d=o+"/"+n,t=this.safeMarket(d,t,"/"));const h=this.safeTimestamp2(e,"timestamp","updatedAt");let c=this.safeString2(e,"type","side");"ask"===c?c="sell":"bid"===c&&(c="buy");const l=this.safeString(e,"remainQty"),u=this.safeString2(e,"originalQty","qty");let f,p=this.safeString(e,"status");if("live"===p&&void 0!==l&&void 0!==u){a.Y.stringLt(l,u)&&(p="canceled")}p=this.parseOrderStatus(p);const m=this.safeString(e,"fee");if(void 0!==m){const t="sell"===c?n:o;f={cost:m,rate:this.safeString(e,"feeRate"),currency:t}}return this.safeOrder({info:e,id:i,clientOrderId:void 0,timestamp:h,datetime:this.iso8601(h),lastTradeTimestamp:void 0,symbol:d,type:"limit",timeInForce:void 0,postOnly:void 0,side:c,price:this.safeString(e,"price"),triggerPrice:void 0,cost:void 0,average:this.safeString(e,"averageExecutedPrice"),amount:u,filled:this.safeString(e,"executedQty"),remaining:l,status:p,fee:f,trades:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ExchangeError(this.id+" fetchOpenOrders() allows fetching closed orders with a specific symbol");await this.loadMarkets();const a=this.market(e),o={currency:a.id},n=await this.privatePostOrderLimitOrders(this.extend(o,s)),d=this.safeList(n,"limitOrders",[]);return this.parseOrders(d,a,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={currency:a.id},n=await this.v2PrivatePostOrderCompleteOrders(this.extend(o,s)),d=this.safeList(n,"completeOrders",[]);return this.parseTrades(d,a,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument. To cancel the order, pass a symbol argument and {'price': 12345, 'qty': 1.2345, 'is_ask': 0} in the params argument of cancelOrder.");const s=this.safeNumber(i,"price"),a=this.safeNumber(i,"qty"),o=this.safeInteger(i,"is_ask");if(void 0===s||void 0===a||void 0===o)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires {'price': 12345, 'qty': 1.2345, 'is_ask': 0} in the params argument.");await this.loadMarkets();const n={order_id:e,price:s,qty:a,is_ask:o,currency:this.marketId(t)},d=await this.v2PrivatePostOrderCancel(this.extend(n,i));return this.safeOrder(d)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=await this.v2PrivatePostAccountDepositAddress(t),s=this.safeDict(i,"walletAddress",{}),r=Object.keys(s),a={};for(let e=0;e<r.length;e++){const t=r[e],i=s[t];if(!i||"-1"===i)continue;const o=t.split("_"),n=this.safeValue(o,0),d=this.safeValue(o,1),h=this.safeCurrencyCode(n);let c=this.safeValue(a,h);void 0===c&&(c={info:i,currency:h,network:void 0,address:void 0,tag:void 0});const l=this.safeString(c,"address",i);this.checkAddress(l),c.address=l,c.info=l,"tag"!==d&&"memo"!==d||(c.tag=i,c.info=[l,i]),a[h]=c}return a}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.implodeParams(e,s),d=this.omit(s,this.extractParams(e));let h=this.urls.api.rest+"/";if("v2Public"===t?(h=this.urls.api.v2Public+"/",t="public"):"v2Private"===t?h=this.urls.api.v2Private+"/":"v2_1Private"===t&&(h=this.urls.api.v2_1Private+"/"),"public"===t)h+=o,Object.keys(d).length&&(h+="?"+this.urlencode(d));else{this.checkRequiredCredentials(),h+=o;const e=this.nonce().toString(),t=this.json(this.extend({access_token:this.apiKey,nonce:e},s)),i=this.stringToBase64(t);a=i;const d=this.secret.toUpperCase();r={"Content-Type":"application/json","X-COINONE-PAYLOAD":i,"X-COINONE-SIGNATURE":this.hmac(this.encode(i),this.encode(d),n.Zf)}}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"error_code");if(void 0!==c&&"0"!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions,c,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinsph",name:"Coins.ph",countries:["PH"],version:"v1",rateLimit:50,certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,deposit:!0,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDeposit:void 0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:void 0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawal:void 0,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!0,ws:!1},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/225719995-48ab2026-4ddb-496c-9da7-0d7566617c9b.jpg",api:{public:"https://api.pro.coins.ph",private:"https://api.pro.coins.ph"},www:"https://coins.ph/",doc:["https://coins-docs.github.io/rest-api"],fees:"https://support.coins.ph/hc/en-us/sections/4407198694681-Limits-Fees"},api:{public:{get:{"openapi/v1/ping":1,"openapi/v1/time":1,"openapi/quote/v1/ticker/24hr":{cost:1,noSymbolAndNoSymbols:40,byNumberOfSymbols:[[101,40],[21,20],[0,1]]},"openapi/quote/v1/ticker/price":{cost:1,noSymbol:2},"openapi/quote/v1/ticker/bookTicker":{cost:1,noSymbol:2},"openapi/v1/exchangeInfo":10,"openapi/quote/v1/depth":{cost:1,byLimit:[[101,5],[0,1]]},"openapi/quote/v1/klines":1,"openapi/quote/v1/trades":1,"openapi/v1/pairs":1,"openapi/quote/v1/avgPrice":1}},private:{get:{"openapi/wallet/v1/config/getall":10,"openapi/wallet/v1/deposit/address":10,"openapi/wallet/v1/deposit/history":1,"openapi/wallet/v1/withdraw/history":1,"openapi/v1/account":10,"openapi/v1/openOrders":{cost:3,noSymbol:40},"openapi/v1/asset/tradeFee":1,"openapi/v1/order":2,"openapi/v1/historyOrders":{cost:10,noSymbol:40},"openapi/v1/myTrades":10,"openapi/v1/capital/deposit/history":1,"openapi/v1/capital/withdraw/history":1,"openapi/v3/payment-request/get-payment-request":1,"merchant-api/v1/get-invoices":1,"openapi/account/v3/crypto-accounts":1,"openapi/transfer/v3/transfers/{id}":1},post:{"openapi/wallet/v1/withdraw/apply":600,"openapi/v1/order/test":1,"openapi/v1/order":1,"openapi/v1/capital/withdraw/apply":1,"openapi/v1/capital/deposit/apply":1,"openapi/v3/payment-request/payment-requests":1,"openapi/v3/payment-request/delete-payment-request":1,"openapi/v3/payment-request/payment-request-reminder":1,"openapi/v1/userDataStream":1,"merchant-api/v1/invoices":1,"merchant-api/v1/invoices-cancel":1,"openapi/convert/v1/get-supported-trading-pairs":1,"openapi/convert/v1/get-quote":1,"openapi/convert/v1/accpet-quote":1,"openapi/fiat/v1/support-channel":1,"openapi/fiat/v1/cash-out":1,"openapi/fiat/v1/history":1,"openapi/migration/v4/sellorder":1,"openapi/migration/v4/validate-field":1,"openapi/transfer/v3/transfers":1},delete:{"openapi/v1/order":1,"openapi/v1/openOrders":1,"openapi/v1/userDataStream":1}}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,maker:this.parseNumber("0.0025"),taker:this.parseNumber("0.003"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.003")],[this.parseNumber("500000"),this.parseNumber("0.0027")],[this.parseNumber("1000000"),this.parseNumber("0.0024")],[this.parseNumber("2500000"),this.parseNumber("0.002")],[this.parseNumber("5000000"),this.parseNumber("0.0018")],[this.parseNumber("10000000"),this.parseNumber("0.0015")],[this.parseNumber("100000000"),this.parseNumber("0.0012")],[this.parseNumber("500000000"),this.parseNumber("0.0009")],[this.parseNumber("1000000000"),this.parseNumber("0.0007")],[this.parseNumber("2500000000"),this.parseNumber("0.0005")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0025")],[this.parseNumber("500000"),this.parseNumber("0.0022")],[this.parseNumber("1000000"),this.parseNumber("0.0018")],[this.parseNumber("2500000"),this.parseNumber("0.0015")],[this.parseNumber("5000000"),this.parseNumber("0.0012")],[this.parseNumber("10000000"),this.parseNumber("0.001")],[this.parseNumber("100000000"),this.parseNumber("0.0008")],[this.parseNumber("500000000"),this.parseNumber("0.0007")],[this.parseNumber("1000000000"),this.parseNumber("0.0006")],[this.parseNumber("2500000000"),this.parseNumber("0.0005")]]}}},precisionMode:a.kb,options:{createMarketBuyOrderRequiresPrice:!0,withdraw:{warning:!1},deposit:{warning:!1},createOrder:{timeInForce:"GTC",newOrderRespType:{market:"FULL",limit:"FULL"}},fetchTicker:{method:"publicGetOpenapiQuoteV1Ticker24hr"},fetchTickers:{method:"publicGetOpenapiQuoteV1Ticker24hr"},networks:{TRC20:"TRX",ERC20:"ETH",BEP20:"BSC",ARB:"ARBITRUM"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"-1000":r.BadRequest,"-1001":r.BadRequest,"-1002":r.AuthenticationError,"-1003":r.RateLimitExceeded,"-1004":r.InvalidOrder,"-1006":r.BadResponse,"-1007":r.BadResponse,"-1014":r.InvalidOrder,"-1015":r.RateLimitExceeded,"-1016":r.NotSupported,"-1020":r.NotSupported,"-1021":r.BadRequest,"-1022":r.BadRequest,"-1023":r.AuthenticationError,"-1024":r.BadRequest,"-1025":r.BadRequest,"-1030":r.ExchangeError,"-1100":r.BadRequest,"-1101":r.BadRequest,"-1102":r.BadRequest,"-1103":r.BadRequest,"-1104":r.BadRequest,"-1105":r.BadRequest,"-1106":r.BadRequest,"-1111":r.BadRequest,"-1112":r.BadResponse,"-1114":r.BadRequest,"-1115":r.InvalidOrder,"-1116":r.InvalidOrder,"-1117":r.InvalidOrder,"-1118":r.InvalidOrder,"-1119":r.InvalidOrder,"-1120":r.BadRequest,"-1121":r.BadSymbol,"-1122":r.InvalidOrder,"-1125":r.BadRequest,"-1127":r.BadRequest,"-1128":r.BadRequest,"-1130":r.BadRequest,"-1131":r.InsufficientFunds,"-1132":r.InvalidOrder,"-1133":r.InvalidOrder,"-1134":r.InvalidOrder,"-1135":r.InvalidOrder,"-1136":r.InvalidOrder,"-1137":r.InvalidOrder,"-1138":r.InvalidOrder,"-1139":r.InvalidOrder,"-1140":r.InvalidOrder,"-1141":r.DuplicateOrderId,"-1142":r.InvalidOrder,"-1143":r.OrderNotFound,"-1144":r.InvalidOrder,"-1145":r.InvalidOrder,"-1146":r.InvalidOrder,"-1147":r.InvalidOrder,"-1148":r.InvalidOrder,"-1149":r.InvalidOrder,"-1150":r.InvalidOrder,"-1151":r.BadSymbol,"-1152":r.NotSupported,"-1153":r.AuthenticationError,"-1154":r.BadRequest,"-1155":r.BadRequest,"-1156":r.InvalidOrder,"-1157":r.BadSymbol,"-1158":r.InvalidOrder,"-1159":r.InvalidOrder,"-1160":r.BadRequest,"-1161":r.BadRequest,"-2010":r.InvalidOrder,"-2013":r.OrderNotFound,"-2011":r.BadRequest,"-2014":r.BadRequest,"-2015":r.AuthenticationError,"-2016":r.BadResponse,"-3126":r.InvalidOrder,"-3127":r.InvalidOrder,"-4001":r.BadRequest,"-100011":r.BadSymbol,"-100012":r.BadSymbol,"-30008":r.InsufficientFunds,"-30036":r.InsufficientFunds,403:r.ExchangeNotAvailable},broad:{"Unknown order sent":r.OrderNotFound,"Duplicate order sent":r.DuplicateOrderId,"Market is closed":r.BadSymbol,"Account has insufficient balance for requested action":r.InsufficientFunds,"Market orders are not supported for this symbol":r.BadSymbol,"Iceberg orders are not supported for this symbol":r.BadSymbol,"Stop loss orders are not supported for this symbol":r.BadSymbol,"Stop loss limit orders are not supported for this symbol":r.BadSymbol,"Take profit orders are not supported for this symbol":r.BadSymbol,"Take profit limit orders are not supported for this symbol":r.BadSymbol,"Price* QTY is zero or less":r.BadRequest,"IcebergQty exceeds QTY":r.BadRequest,"This action disabled is on this account":r.PermissionDenied,"Unsupported order combination":r.InvalidOrder,"Order would trigger immediately":r.InvalidOrder,"Cancel order is invalid. Check origClOrdId and orderId":r.InvalidOrder,"Order would immediately match and take":r.OrderImmediatelyFillable,PRICE_FILTER:r.InvalidOrder,LOT_SIZE:r.InvalidOrder,MIN_NOTIONAL:r.InvalidOrder,MAX_NUM_ORDERS:r.InvalidOrder,MAX_ALGO_ORDERS:r.InvalidOrder,BROKER_MAX_NUM_ORDERS:r.InvalidOrder,BROKER_MAX_ALGO_ORDERS:r.InvalidOrder,ICEBERG_PARTS:r.BadRequest}}})}calculateRateLimiterCost(e,t,i,s,r={}){if("noSymbol"in r&&!("symbol"in s))return r.noSymbol;if("noSymbolAndNoSymbols"in r&&!("symbol"in s)&&!("symbols"in s))return r.noSymbolAndNoSymbols;if("byNumberOfSymbols"in r&&"symbols"in s){const e=s.symbols.length,t=r.byNumberOfSymbols;for(let i=0;i<t.length;i++){const s=t[i];if(e>=s[0])return s[1]}}else if("byLimit"in r&&"limit"in s){const e=s.limit,t=r.byLimit;for(let i=0;i<t.length;i++){const s=t[i];if(e>=s[0])return s[1]}}return this.safeValue(r,"cost",1)}async fetchStatus(e={}){return{status:"ok",updated:void 0,eta:void 0,url:void 0,info:await this.publicGetOpenapiV1Ping(e)}}async fetchTime(e={}){const t=await this.publicGetOpenapiV1Time(e);return this.safeInteger(t,"serverTime")}async fetchMarkets(e={}){const t=await this.publicGetOpenapiV1ExchangeInfo(e),i=this.safeList(t,"symbols",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeString(t,"baseAsset"),o=this.safeString(t,"quoteAsset"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.indexBy(this.safeList(t,"filters",[]),"filterType"),c=this.safeValue(h,"LOT_SIZE",{}),l=this.safeValue(h,"PRICE_FILTER",{}),u=this.safeValue(h,"NOTIONAL",{});s.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"trading"===this.safeStringLower(t,"status"),contract:!1,linear:void 0,inverse:void 0,taker:void 0,maker:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.safeString(c,"stepSize")),price:this.parseNumber(this.safeString(l,"tickSize"))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber(this.safeString(c,"minQty")),max:this.parseNumber(this.safeString(c,"maxQty"))},price:{min:this.parseNumber(this.safeString(l,"minPrice")),max:this.parseNumber(this.safeString(l,"maxPrice"))},cost:{min:this.parseNumber(this.safeString(u,"minNotional")),max:void 0}},created:void 0,info:t})}return this.setMarkets(s),s}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=[];for(let i=0;i<e.length;i++){const s=this.market(e[i]).id;t.push(s)}i.symbols=t}const s=this.safeDict(this.options,"fetchTickers",{}),r=this.safeString(s,"method","publicGetOpenapiQuoteV1Ticker24hr");let a;return a="publicGetOpenapiQuoteV1TickerPrice"===r?await this.publicGetOpenapiQuoteV1TickerPrice(this.extend(i,t)):"publicGetOpenapiQuoteV1TickerBookTicker"===r?await this.publicGetOpenapiQuoteV1TickerBookTicker(this.extend(i,t)):await this.publicGetOpenapiQuoteV1Ticker24hr(this.extend(i,t)),this.parseTickers(a,e,t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=this.safeDict(this.options,"fetchTicker",{}),a=this.safeString(r,"method","publicGetOpenapiQuoteV1Ticker24hr");let o;return o="publicGetOpenapiQuoteV1TickerPrice"===a?await this.publicGetOpenapiQuoteV1TickerPrice(this.extend(s,t)):"publicGetOpenapiQuoteV1TickerBookTicker"===a?await this.publicGetOpenapiQuoteV1TickerBookTicker(this.extend(s,t)):await this.publicGetOpenapiQuoteV1Ticker24hr(this.extend(s,t)),this.parseTicker(o,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeInteger(e,"closeTime"),r=this.safeString(e,"bidPrice"),a=this.safeString(e,"askPrice"),n=this.safeString(e,"bidQty"),d=this.safeString(e,"askQty"),h=this.safeString(e,"volume"),c=this.safeString(e,"quoteVolume"),l=this.safeString(e,"openPrice"),u=this.safeString(e,"highPrice"),f=this.safeString(e,"lowPrice"),p=this.safeString(e,"prevClosePrice"),m=this.safeString(e,"weightedAvgPrice"),g=this.safeString(e,"priceChange");let v=this.safeString(e,"priceChangePercent");return v=o.Y.stringMul(v,"100"),this.safeTicker({symbol:t.symbol,timestamp:s,datetime:this.iso8601(s),open:l,high:u,low:f,close:this.safeString2(e,"lastPrice","price"),bid:r,bidVolume:n,ask:a,askVolume:d,vwap:m,previousClose:p,change:g,percentage:v,average:void 0,baseVolume:h,quoteVolume:c,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(s.limit=t);const r=await this.publicGetOpenapiQuoteV1Depth(this.extend(s,i)),a=this.parseOrderBook(r,e);return a.nonce=this.safeInteger(r,"lastUpdateId"),a}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t),n=this.safeInteger(r,"until"),d={symbol:a.id,interval:o};if(void 0===s&&(s=1e3),void 0!==i)if(d.startTime=i,void 0!==n)d.endTime=n;else{const e=1e3*this.parseTimeframe(t),r=this.sum(i,e*(s-1)),a=this.milliseconds();d.endTime=Math.min(r,a)}else if(void 0!==n){d.endTime=n;const e=1e3*this.parseTimeframe(t);d.startTime=n-e*(s-1)}d.limit=s,r=this.omit(r,"until");const h=await this.publicGetOpenapiQuoteV1Klines(this.extend(d,r));return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==t?a.limit=1e3:void 0!==i&&(a.limit=i);const o=await this.publicGetOpenapiQuoteV1Trades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==t?(o.startTime=t,o.limit=1e3):void 0!==i&&(o.limit=i);const n=await this.privateGetOpenapiV1MyTrades(this.extend(o,s));return this.parseTrades(n,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrderTrades() requires a symbol argument");const o={orderId:e};return await this.fetchMyTrades(t,i,s,this.extend(o,a))}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString2(e,"id","tradeId"),a=this.safeString(e,"orderId"),o=this.safeInteger(e,"time"),n=this.safeString(e,"price"),d=this.safeString(e,"qty");let h;const c=this.safeString(e,"commission");if(void 0!==c){const t=this.safeString(e,"commissionAsset");h={cost:c,currency:this.safeCurrencyCode(t)}}const l=this.safeBool2(e,"isBuyer","isBuyerMaker",void 0);let u;void 0!==l&&(u=!0===l?"buy":"sell");const f=this.safeString2(e,"isMaker",void 0);let p,m;return void 0!==f&&(p="true"===f?"maker":"taker"),void 0!==a&&(m=this.safeString(e,"quoteQty")),this.safeTrade({id:r,order:a,timestamp:o,datetime:this.iso8601(o),symbol:s,type:undefined,side:u,takerOrMaker:p,price:n,amount:d,cost:m,fee:h,info:e},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetOpenapiV1Account(e);return this.parseBalance(t)}parseBalance(e){const t=this.safeList(e,"balances",[]),i={info:e,timestamp:void 0,datetime:void 0};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"free"),o.used=this.safeString(s,"locked"),i[a]=o}return this.safeBalance(i)}async createOrder(e,t,i,s,a=void 0,n={}){await this.loadMarkets();const d=this.market(e),h=this.safeBool(n,"test",!1);n=this.omit(n,"test");let c=this.safeString(n,"type",t);c=this.encodeOrderType(c),n=this.omit(n,"type");const l=this.encodeOrderSide(i),u={symbol:d.id,type:c,side:l},f=this.safeValue(this.options,"createOrder",{});let p,m=this.safeValue(f,"newOrderRespType",{});if("LIMIT"===c||"STOP_LOSS_LIMIT"===c||"TAKE_PROFIT_LIMIT"===c||"LIMIT_MAKER"===c){if(void 0===a)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price argument for a "+t+" order");m=this.safeString(m,"limit","FULL"),u.price=this.priceToPrecision(e,a),u.quantity=this.amountToPrecision(e,s),"LIMIT_MAKER"!==c&&(u.timeInForce=this.safeString(f,"timeInForce","GTC"))}else if("MARKET"===c||"STOP_LOSS"===c||"TAKE_PROFIT"===c)if(m=this.safeString(m,"market","FULL"),"SELL"===l)u.quantity=this.amountToPrecision(e,s);else if("BUY"===l){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber2(n,"cost","quoteOrderQty");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(a),n=o.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);u.quoteOrderQty=t}if("STOP_LOSS"===c||"STOP_LOSS_LIMIT"===c||"TAKE_PROFIT"===c||"TAKE_PROFIT_LIMIT"===c){const t=this.safeString2(n,"triggerPrice","stopPrice");if(void 0===t)throw new r.InvalidOrder(this.id+" createOrder () requires a triggerPrice or stopPrice param for stop_loss, take_profit, stop_loss_limit, and take_profit_limit orders");u.stopPrice=this.priceToPrecision(e,t)}return u.newOrderRespType=m,n=this.omit(n,"price","stopPrice","triggerPrice","quantity","quoteOrderQty"),p=h?await this.privatePostOpenapiV1OrderTest(this.extend(u,n)):await this.privatePostOpenapiV1Order(this.extend(u,n)),this.parseOrder(p,d)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},r=this.safeValue2(i,"origClientOrderId","clientOrderId");void 0!==r?s.origClientOrderId=r:s.orderId=e,i=this.omit(i,["clientOrderId","origClientOrderId"]);const a=await this.privateGetOpenapiV1Order(this.extend(s,i));return this.parseOrder(a)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.symbol=r.id);const o=await this.privateGetOpenapiV1OpenOrders(this.extend(a,s));return this.parseOrders(o,r,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchClosedOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==t?(o.startTime=t,o.limit=1e3):void 0!==i&&(o.limit=i);const n=await this.privateGetOpenapiV1HistoryOrders(this.extend(o,s));return this.parseOrders(n,a,t,i)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},r=this.safeValue2(i,"origClientOrderId","clientOrderId");void 0!==r?s.origClientOrderId=r:s.orderId=e,i=this.omit(i,["clientOrderId","origClientOrderId"]);const a=await this.privateDeleteOpenapiV1Order(this.extend(s,i));return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");let i;await this.loadMarkets();const s={};void 0!==e&&(i=this.market(e),s.symbol=i.id);const a=await this.privateDeleteOpenapiV1OpenOrders(this.extend(s,t));return this.parseOrders(a,i)}parseOrder(e,t=void 0){const i=this.safeString(e,"orderId"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=this.safeInteger2(e,"time","transactTime"),a=this.safeValue(e,"fills",void 0);let n=this.safeString(e,"stopPrice");return o.Y.stringEq(n,"0")&&(n=void 0),this.safeOrder({id:i,clientOrderId:this.safeString(e,"clientOrderId"),timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,status:this.parseOrderStatus(this.safeString(e,"status")),symbol:t.symbol,type:this.parseOrderType(this.safeString(e,"type")),timeInForce:this.parseOrderTimeInForce(this.safeString(e,"timeInForce")),side:this.parseOrderSide(this.safeString(e,"side")),price:this.safeString(e,"price"),triggerPrice:n,average:void 0,amount:this.safeString(e,"origQty"),cost:this.safeString(e,"cummulativeQuoteQty"),filled:this.safeString(e,"executedQty"),remaining:void 0,fee:void 0,fees:void 0,trades:a,info:e},t)}parseOrderSide(e){return this.safeString({BUY:"buy",SELL:"sell"},e,e)}encodeOrderSide(e){return this.safeString({buy:"BUY",sell:"SELL"},e,e)}parseOrderType(e){return this.safeString({MARKET:"market",LIMIT:"limit",LIMIT_MAKER:"limit",STOP_LOSS:"market",STOP_LOSS_LIMIT:"limit",TAKE_PROFIT:"market",TAKE_PROFIT_LIMIT:"limit"},e,e)}encodeOrderType(e){return this.safeString({market:"MARKET",limit:"LIMIT",limit_maker:"LIMIT_MAKER",stop_loss:"STOP_LOSS",stop_loss_limit:"STOP_LOSS_LIMIT",take_profit:"TAKE_PROFIT",take_profit_limit:"TAKE_PROFIT_LIMIT"},e,e)}parseOrderStatus(e){return this.safeString({NEW:"open",FILLED:"closed",CANCELED:"canceled",PARTIALLY_FILLED:"open",PARTIALLY_CANCELED:"canceled",REJECTED:"rejected"},e,e)}parseOrderTimeInForce(e){return this.safeString({GTC:"GTC",FOK:"FOK",IOC:"IOC"},e,e)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.privateGetOpenapiV1AssetTradeFee(this.extend(s,t)),a=this.safeDict(r,0,{});return this.parseTradingFee(a,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetOpenapiV1AssetTradeFee(e),i={};for(let e=0;e<t.length;e++){const s=this.parseTradingFee(t[e]);i[s.symbol]=s}return i}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:(t=this.safeMarket(i,t)).symbol,maker:this.safeNumber(e,"makerCommission"),taker:this.safeNumber(e,"takerCommission"),percentage:void 0,tierBased:void 0}}async withdraw(e,t,i,s=void 0,a={}){const o=this.safeValue(this.options,"withdraw");if(this.safeBool(o,"warning",!0))throw new r.InvalidAddress(this.id+" withdraw() makes a withdrawals only to coins_ph account, add .options['withdraw']['warning'] = false to make a withdrawal to your coins_ph account");const n=this.safeString(a,"network"),d=this.networkCodeToId(n,e);if(void 0===d)throw new r.BadRequest(this.id+" withdraw() require network parameter");await this.loadMarkets();const h=this.currency(e),c={coin:h.id,amount:this.numberToString(t),network:d,address:i};void 0!==s&&(c.withdrawOrderId=s),a=this.omit(a,"network");const l=await this.privatePostOpenapiWalletV1WithdrawApply(this.extend(c,a));return this.parseTransaction(l,h)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.coin=r.id),void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i);const o=await this.privateGetOpenapiWalletV1DepositHistory(this.extend(a,s));return this.parseTransactions(o,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.coin=r.id),void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i);const o=await this.privateGetOpenapiWalletV1WithdrawHistory(this.extend(a,s));return this.parseTransactions(o,r,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"address");let r=this.safeString(e,"addressTag");void 0!==r&&r.length<1&&(r=void 0);const a=this.safeString(e,"txId"),o=this.safeString(e,"coin"),n=this.safeCurrencyCode(o,t);let d;d=this.safeInteger2(e,"insertTime","applyTime");let h;const c=this.safeString(e,"withdrawOrderId"),l=this.safeString(e,"depositOrderId");void 0!==c?h="withdrawal":void 0!==l&&(h="deposit");const u=this.parseTransactionStatus(this.safeString(e,"status")),f=this.safeNumber(e,"amount"),p=this.safeNumber(e,"transactionFee");let m;void 0!==p&&(m={currency:n,cost:p});const g=this.safeString(e,"network"),v="Internal"===g;return{info:e,id:i,txid:a,timestamp:d,datetime:this.iso8601(d),network:g,address:s,addressTo:s,addressFrom:void 0,tag:r,tagTo:r,tagFrom:void 0,type:h,amount:f,currency:n,status:u,updated:undefined,internal:v,comment:void 0,fee:m}}parseTransactionStatus(e){return this.safeString({0:"pending",1:"ok",2:"failed",3:"pending"},e,e)}async fetchDepositAddress(e,t={}){const i=this.safeString(t,"network"),s=this.networkCodeToId(i,e);if(void 0===s)throw new r.BadRequest(this.id+" fetchDepositAddress() require network parameter");await this.loadMarkets();const a=this.currency(e),o={coin:a.id,network:s};t=this.omit(t,"network");const n=await this.privateGetOpenapiWalletV1DepositAddress(this.extend(o,t));return this.parseDepositAddress(n,a)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"coin");return{info:e,currency:this.safeCurrencyCode(i,t),network:null,address:this.safeString(e,"address"),tag:this.safeString(e,"addressTag")}}urlEncodeQuery(e={}){let t="";const i=Object.keys(e);for(let s=0;s<i.length;s++){const r=i[s];if(Array.isArray(e[r])){0!==s&&(t+="&");const i=e[r];e=this.omit(e,r);t+=this.parseArrayParam(i,r)}}const s=this.urlencode(e);return 0!==s.length?s+"&"+t:t}parseArrayParam(e,t){let i=this.json(e);i=i.replace("[","%5B"),i=i.replace("]","%5D");return t+"="+i}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t],d=this.omit(s,this.extractParams(e));if(o=o+"/"+this.implodeParams(e,s),"private"===t){this.checkRequiredCredentials(),d.timestamp=this.milliseconds();if(void 0===this.safeInteger(d,"recvWindow")){const e=this.safeInteger(this.options,"recvWindow");void 0!==e&&(d.recvWindow=e)}d=this.urlEncodeQuery(d);o=o+"?"+d+"&signature="+this.hmac(this.encode(d),this.encode(this.secret),n.s),r={"X-COINS-APIKEY":this.apiKey}}else d=this.urlEncodeQuery(d),0!==d.length&&(o+="?"+d);return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code",void 0);if(void 0!==c&&"200"!==c&&"0"!==c){const e=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,o,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"coinspot",name:"CoinSpot",countries:["AU"],rateLimit:1e3,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketOrder:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,ws:!1},urls:{logo:"https://user-images.githubusercontent.com/1294454/28208429-3cacdf9a-6896-11e7-854e-4c79a772a30f.jpg",api:{public:"https://www.coinspot.com.au/pubapi",private:"https://www.coinspot.com.au/api"},www:"https://www.coinspot.com.au",doc:"https://www.coinspot.com.au/api",referral:"https://www.coinspot.com.au/register?code=PJURCU"},api:{public:{get:["latest"]},private:{post:["orders","orders/history","my/coin/deposit","my/coin/send","quote/buy","quote/sell","my/balances","my/orders","my/buy","my/sell","my/buy/cancel","my/sell/cancel","ro/my/balances","ro/my/balances/{cointype}","ro/my/deposits","ro/my/withdrawals","ro/my/transactions","ro/my/transactions/{cointype}","ro/my/transactions/open","ro/my/transactions/{cointype}/open","ro/my/sendreceive","ro/my/affiliatepayments","ro/my/referralpayments"]}},markets:{"ADA/AUD":this.safeMarketStructure({id:"ada",symbol:"ADA/AUD",base:"ADA",quote:"AUD",baseId:"ada",quoteId:"aud",type:"spot",spot:!0}),"BTC/AUD":this.safeMarketStructure({id:"btc",symbol:"BTC/AUD",base:"BTC",quote:"AUD",baseId:"btc",quoteId:"aud",type:"spot",spot:!0}),"ETH/AUD":this.safeMarketStructure({id:"eth",symbol:"ETH/AUD",base:"ETH",quote:"AUD",baseId:"eth",quoteId:"aud",type:"spot",spot:!0}),"XRP/AUD":this.safeMarketStructure({id:"xrp",symbol:"XRP/AUD",base:"XRP",quote:"AUD",baseId:"xrp",quoteId:"aud",type:"spot",spot:!0}),"LTC/AUD":this.safeMarketStructure({id:"ltc",symbol:"LTC/AUD",base:"LTC",quote:"AUD",baseId:"ltc",quoteId:"aud",type:"spot",spot:!0}),"DOGE/AUD":this.safeMarketStructure({id:"doge",symbol:"DOGE/AUD",base:"DOGE",quote:"AUD",baseId:"doge",quoteId:"aud",type:"spot",spot:!0}),"RFOX/AUD":this.safeMarketStructure({id:"rfox",symbol:"RFOX/AUD",base:"RFOX",quote:"AUD",baseId:"rfox",quoteId:"aud",type:"spot",spot:!0}),"POWR/AUD":this.safeMarketStructure({id:"powr",symbol:"POWR/AUD",base:"POWR",quote:"AUD",baseId:"powr",quoteId:"aud",type:"spot",spot:!0}),"NEO/AUD":this.safeMarketStructure({id:"neo",symbol:"NEO/AUD",base:"NEO",quote:"AUD",baseId:"neo",quoteId:"aud",type:"spot",spot:!0}),"TRX/AUD":this.safeMarketStructure({id:"trx",symbol:"TRX/AUD",base:"TRX",quote:"AUD",baseId:"trx",quoteId:"aud",type:"spot",spot:!0}),"EOS/AUD":this.safeMarketStructure({id:"eos",symbol:"EOS/AUD",base:"EOS",quote:"AUD",baseId:"eos",quoteId:"aud",type:"spot",spot:!0}),"XLM/AUD":this.safeMarketStructure({id:"xlm",symbol:"XLM/AUD",base:"XLM",quote:"AUD",baseId:"xlm",quoteId:"aud",type:"spot",spot:!0}),"RHOC/AUD":this.safeMarketStructure({id:"rhoc",symbol:"RHOC/AUD",base:"RHOC",quote:"AUD",baseId:"rhoc",quoteId:"aud",type:"spot",spot:!0}),"GAS/AUD":this.safeMarketStructure({id:"gas",symbol:"GAS/AUD",base:"GAS",quote:"AUD",baseId:"gas",quoteId:"aud",type:"spot",spot:!0})},commonCurrencies:{DRK:"DASH"},options:{fetchBalance:"private_post_my_balances"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:void 0,fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb})}parseBalance(e){const t={info:e},i=this.safeValue2(e,"balance","balances");if(Array.isArray(i))for(let e=0;e<i.length;e++){const s=i[e],r=Object.keys(s);for(let e=0;e<r.length;e++){const i=r[e],a=s[i],o=this.safeCurrencyCode(i),n=this.account();n.total=this.safeString(a,"balance"),t[o]=n}}else{const e=Object.keys(i);for(let s=0;s<e.length;s++){const r=e[s],a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(i,r),t[a]=o}}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(this.options,"fetchBalance","private_post_my_balances"),i=await this[t](e);return this.parseBalance(i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={cointype:s.id},a=await this.privatePostOrders(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"buyorders","sellorders","rate","amount")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:void 0,quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.publicGetLatest(t);let r=i.id;r=r.toLowerCase();const a=this.safeDict(s,"prices",{}),o=this.safeDict(a,r);return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetLatest(t),s={},r=this.safeDict(i,"prices",{}),a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e],i=this.safeMarket(t);if(i.spot){const e=i.symbol,a=r[t];s[e]=this.parseTicker(a,i)}}return this.filterByArrayTickers(s,"symbol",e)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={cointype:r.id},o=await this.privatePostOrdersHistory(this.extend(a,s)),n=this.safeList(o,"orders",[]);return this.parseTrades(n,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e)),void 0!==t&&(r.startdate=this.yyyymmdd(t));const o=await this.privatePostRoMyTransactions(this.extend(r,s)),n=this.safeList(o,"buyorders",[]);for(let e=0;e<n.length;e++)n[e].side="buy";const d=this.safeList(o,"sellorders",[]);for(let e=0;e<d.length;e++)d[e].side="sell";const h=this.arrayConcat(n,d);return this.parseTrades(h,a,t,i)}parseTrade(e,t=void 0){let i,s,r;const a=this.safeString(e,"audtotal"),o=this.safeString(e,"total",a),d=this.safeString(e,"side"),h=this.safeString(e,"amount"),c=this.safeString(e,"market"),l=this.safeSymbol(c,t,"/"),u=this.safeInteger(e,"solddate");if(void 0!==u)s=this.safeString(e,"rate"),i=u;else{s=n.Y.stringDiv(o,h);const t=this.safeString(e,"created");i=this.parse8601(t);const a=this.safeString(e,"audfeeExGst"),d=this.safeString(e,"audGst"),c=n.Y.stringAdd(a,d),l="AUD";r={cost:this.parseNumber(c),currency:this.safeCurrencyCode(l)}}return this.safeTrade({info:e,id:void 0,symbol:l,timestamp:i,datetime:this.iso8601(i),order:void 0,type:void 0,side:d,takerOrMaker:void 0,price:this.parseNumber(s),amount:this.parseNumber(h),cost:this.parseNumber(o),fee:r},t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n="privatePostMy"+this.capitalize(i);if("market"===t)throw new r.ExchangeError(this.id+" createOrder() allows limit orders only");const d={cointype:this.market(e).id,amount:s,rate:a};return await this[n](this.extend(d,o))}async cancelOrder(e,t=void 0,i={}){const s=this.safeString(i,"side");if("buy"!==s&&"sell"!==s)throw new r.ArgumentsRequired(this.id+' cancelOrder() requires a side parameter, "buy" or "sell"');i=this.omit(i,"side");const a={id:e};let o;return o="buy"===s?await this.privatePostMyBuyCancel(this.extend(a,i)):await this.privatePostMySellCancel(this.extend(a,i)),this.safeOrder({info:o})}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const n=this.urls.api[t]+"/"+e;if("private"===t){this.checkRequiredCredentials();const e=this.nonce();a=this.json(this.extend({nonce:e},s)),r={"Content-Type":"application/json",key:this.apiKey,sign:this.hmac(this.encode(a),this.encode(this.secret),o.Zf)}}return{url:n,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"cryptocom",name:"Crypto.com",countries:["MT"],version:"v2",rateLimit:10,certified:!0,pro:!0,has:{CORS:!1,spot:!0,margin:!0,swap:!0,future:!0,option:!0,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!0,closeAllPositions:!1,closePosition:!0,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createStopOrder:!0,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:"emulated",fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchGreeks:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!0,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","6h":"6h","12h":"12h","1d":"1D","1w":"7D","2w":"14D","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/147792121-38ed5e36-c229-48d6-b49a-48d05fc19ed4.jpeg",test:{v1:"https://uat-api.3ona.co/exchange/v1",v2:"https://uat-api.3ona.co/v2",derivatives:"https://uat-api.3ona.co/v2"},api:{v1:"https://api.crypto.com/exchange/v1",v2:"https://api.crypto.com/v2",derivatives:"https://deriv-api.crypto.com/v1"},www:"https://crypto.com/",referral:{url:"https://crypto.com/exch/kdacthrnxt",discount:.75},doc:["https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html","https://exchange-docs.crypto.com/spot/index.html","https://exchange-docs.crypto.com/derivatives/index.html"],fees:"https://crypto.com/exchange/document/fees-limits"},api:{v1:{public:{get:{"public/auth":10/3,"public/get-instruments":10/3,"public/get-book":1,"public/get-candlestick":1,"public/get-trades":1,"public/get-tickers":1,"public/get-valuations":1,"public/get-expired-settlement-price":10/3,"public/get-insurance":1,"public/get-risk-parameters":1},post:{"public/staking/get-conversion-rate":2}},private:{post:{"private/set-cancel-on-disconnect":10/3,"private/get-cancel-on-disconnect":10/3,"private/user-balance":10/3,"private/user-balance-history":10/3,"private/get-positions":10/3,"private/create-order":2/3,"private/create-order-list":10/3,"private/cancel-order":2/3,"private/cancel-order-list":10/3,"private/cancel-all-orders":2/3,"private/close-position":10/3,"private/get-order-history":100,"private/get-open-orders":10/3,"private/get-order-detail":1/3,"private/get-trades":100,"private/change-account-leverage":10/3,"private/get-transactions":10/3,"private/create-subaccount-transfer":10/3,"private/get-subaccount-balances":10/3,"private/get-order-list":10/3,"private/create-withdrawal":10/3,"private/get-currency-networks":10/3,"private/get-deposit-address":10/3,"private/get-accounts":10/3,"private/get-withdrawal-history":10/3,"private/get-deposit-history":10/3,"private/get-fee-rate":2,"private/get-instrument-fee-rate":2,"private/staking/stake":2,"private/staking/unstake":2,"private/staking/get-staking-position":2,"private/staking/get-staking-instruments":2,"private/staking/get-open-stake":2,"private/staking/get-stake-history":2,"private/staking/get-reward-history":2,"private/staking/convert":2,"private/staking/get-open-convert":2,"private/staking/get-convert-history":2}}},v2:{public:{get:{"public/auth":1,"public/get-instruments":1,"public/get-book":1,"public/get-candlestick":1,"public/get-ticker":1,"public/get-trades":1,"public/margin/get-transfer-currencies":1,"public/margin/get-load-currenices":1,"public/respond-heartbeat":1}},private:{post:{"private/set-cancel-on-disconnect":10/3,"private/get-cancel-on-disconnect":10/3,"private/create-withdrawal":10/3,"private/get-withdrawal-history":10/3,"private/get-currency-networks":10/3,"private/get-deposit-history":10/3,"private/get-deposit-address":10/3,"private/export/create-export-request":10/3,"private/export/get-export-requests":10/3,"private/export/download-export-output":10/3,"private/get-account-summary":10/3,"private/create-order":2/3,"private/cancel-order":2/3,"private/cancel-all-orders":2/3,"private/create-order-list":10/3,"private/get-order-history":10/3,"private/get-open-orders":10/3,"private/get-order-detail":1/3,"private/get-trades":100,"private/get-accounts":10/3,"private/get-subaccount-balances":10/3,"private/create-subaccount-transfer":10/3,"private/otc/get-otc-user":10/3,"private/otc/get-instruments":10/3,"private/otc/request-quote":100,"private/otc/accept-quote":100,"private/otc/get-quote-history":10/3,"private/otc/get-trade-history":10/3,"private/otc/create-order":10/3}}},derivatives:{public:{get:{"public/auth":10/3,"public/get-instruments":10/3,"public/get-book":1,"public/get-candlestick":1,"public/get-trades":1,"public/get-tickers":1,"public/get-valuations":1,"public/get-expired-settlement-price":10/3,"public/get-insurance":1}},private:{post:{"private/set-cancel-on-disconnect":10/3,"private/get-cancel-on-disconnect":10/3,"private/user-balance":10/3,"private/user-balance-history":10/3,"private/get-positions":10/3,"private/create-order":2/3,"private/create-order-list":10/3,"private/cancel-order":2/3,"private/cancel-order-list":10/3,"private/cancel-all-orders":2/3,"private/close-position":10/3,"private/convert-collateral":10/3,"private/get-order-history":100,"private/get-open-orders":10/3,"private/get-order-detail":1/3,"private/get-trades":100,"private/change-account-leverage":10/3,"private/get-transactions":10/3,"private/create-subaccount-transfer":10/3,"private/get-subaccount-balances":10/3,"private/get-order-list":10/3}}}},fees:{trading:{maker:this.parseNumber("0.004"),taker:this.parseNumber("0.004"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("25000"),this.parseNumber("0.0035")],[this.parseNumber("50000"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.001")],[this.parseNumber("250000"),this.parseNumber("0.0009")],[this.parseNumber("1000000"),this.parseNumber("0.0008")],[this.parseNumber("20000000"),this.parseNumber("0.0007")],[this.parseNumber("100000000"),this.parseNumber("0.0006")],[this.parseNumber("200000000"),this.parseNumber("0.0004")]],taker:[[this.parseNumber("0"),this.parseNumber("0.004")],[this.parseNumber("25000"),this.parseNumber("0.0035")],[this.parseNumber("50000"),this.parseNumber("0.0025")],[this.parseNumber("100000"),this.parseNumber("0.0016")],[this.parseNumber("250000"),this.parseNumber("0.00015")],[this.parseNumber("1000000"),this.parseNumber("0.00014")],[this.parseNumber("20000000"),this.parseNumber("0.00013")],[this.parseNumber("100000000"),this.parseNumber("0.00012")],[this.parseNumber("200000000"),this.parseNumber("0.0001")]]}}},options:{defaultType:"spot",accountsById:{funding:"SPOT",spot:"SPOT",margin:"MARGIN",derivatives:"DERIVATIVES",swap:"DERIVATIVES",future:"DERIVATIVES"},networks:{BEP20:"BSC",ERC20:"ETH",TRC20:"TRON"},broker:"CCXT"},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!0,trailing:!1,iceberg:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:1,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:void 0,untilDays:1,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:300}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},commonCurrencies:{USD_STABLE_COIN:"USDC"},precisionMode:o.kb,exceptions:{exact:{219:a.InvalidOrder,314:a.InvalidOrder,325:a.InvalidOrder,415:a.InvalidOrder,10001:a.ExchangeError,10002:a.PermissionDenied,10003:a.PermissionDenied,10004:a.BadRequest,10005:a.PermissionDenied,10006:a.DDoSProtection,10007:a.InvalidNonce,10008:a.BadRequest,10009:a.BadRequest,20001:a.BadRequest,20002:a.InsufficientFunds,20005:a.AccountNotEnabled,30003:a.BadSymbol,30004:a.BadRequest,30005:a.BadRequest,30006:a.InvalidOrder,30007:a.InvalidOrder,30008:a.InvalidOrder,30009:a.InvalidOrder,30010:a.BadRequest,30013:a.InvalidOrder,30014:a.InvalidOrder,30016:a.InvalidOrder,30017:a.InvalidOrder,30023:a.InvalidOrder,30024:a.InvalidOrder,30025:a.InvalidOrder,40001:a.BadRequest,40002:a.BadRequest,40003:a.BadRequest,40004:a.BadRequest,40005:a.BadRequest,40006:a.BadRequest,40007:a.BadRequest,40101:a.AuthenticationError,40102:a.InvalidNonce,40103:a.AuthenticationError,40104:a.AuthenticationError,40107:a.BadRequest,40401:a.OrderNotFound,40801:a.RequestTimeout,42901:a.RateLimitExceeded,43005:a.InvalidOrder,43003:a.InvalidOrder,43004:a.InvalidOrder,43012:a.BadRequest,50001:a.ExchangeError,9010001:a.OnMaintenance},broad:{}}})}async fetchMarkets(e={}){const t=await this.v1PublicGetPublicGetInstruments(e),i=this.safeDict(t,"result",{}),s=this.safeList(i,"data",[]),r=[];for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"inst_type"),a="CCY_PAIR"===i,o="PERPETUAL_SWAP"===i,n="FUTURE"===i,d="WARRANT"===i,h=this.safeString(t,"base_ccy"),c=this.safeString(t,"quote_ccy"),l=a?void 0:c,u=this.safeCurrencyCode(h),f=this.safeCurrencyCode(c),p=a?void 0:this.safeCurrencyCode(l),m=this.safeStringLower(t,"put_call"),g=this.safeString(t,"strike"),v=this.safeBool(t,"margin_buy_enabled"),y=this.safeBool(t,"margin_sell_enabled"),w=this.omitZero(this.safeString(t,"expiry_timestamp_ms")),b=void 0!==w?parseInt(w):void 0;let k,S,O=u+"/"+f;if("CCY_PAIR"===i)k="spot",S=!1;else if("PERPETUAL_SWAP"===i)k="swap",O=O+":"+f,S=!0;else if("FUTURE"===i)k="future",O=O+":"+f+"-"+this.yymmdd(b),S=!0;else if("WARRANT"===i){k="option";const e="call"===m?"C":"P";O=O+":"+f+"-"+this.yymmdd(b)+"-"+g+"-"+e,S=!0}r.push({id:this.safeString(t,"symbol"),symbol:O,base:u,quote:f,settle:p,baseId:h,quoteId:c,settleId:l,type:k,spot:a,margin:v||y,swap:o,future:n,option:d,active:this.safeBool(t,"tradable"),contract:S,linear:!!S||void 0,inverse:!S&&void 0,contractSize:this.safeNumber(t,"contract_size"),expiry:b,expiryDatetime:this.iso8601(b),strike:this.parseNumber(g),optionType:m,precision:{price:this.parseNumber(this.safeString(t,"price_tick_size")),amount:this.parseNumber(this.safeString(t,"qty_tick_size"))},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(t,"max_leverage")},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return r}async fetchTickers(e=void 0,t={}){let i;await this.loadMarkets();const s={};if(void 0!==e){let t;if(Array.isArray(e)){if(e.length>1)throw new a.BadRequest(this.id+" fetchTickers() symbols argument cannot contain more than 1 symbol");t=e[0]}else t=e;i=this.market(t),s.instrument_name=i.id}const r=await this.v1PublicGetPublicGetTickers(this.extend(s,t)),o=this.safeDict(r,"result",{}),n=this.safeList(o,"data",[]);return this.parseTickers(n,e)}async fetchTicker(e,t={}){await this.loadMarkets(),e=this.symbol(e);const i=await this.fetchTickers([e],t);return this.safeValue(i,e)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchOrders",e,t,i,s);const o={};void 0!==e&&(r=this.market(e),o.instrument_name=r.id),void 0!==t&&(o.start_time=t),void 0!==i&&(o.limit=i);const n=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==n&&(o.end_time=n);const d=await this.v1PrivatePostPrivateGetOrderHistory(this.extend(o,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"data",[]);return this.parseOrders(c,r,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);const a=this.market(e),o={instrument_name:a.id};void 0!==t&&(o.start_ts=t),void 0!==i&&(o.count=i);const n=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==n&&(o.end_ts=n);const d=await this.v1PublicGetPublicGetTrades(this.extend(o,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"data",[]);return this.parseTrades(c,a,t,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,300);const o=this.market(e),n={instrument_name:o.id,timeframe:this.safeString(this.timeframes,t,t)};void 0!==s&&(s>300&&(s=300),n.count=s);const d=this.microseconds(),h=this.parseTimeframe(t),c=this.safeInteger(r,"until",d);r=this.omit(r,["until"]),void 0!==i?(n.start_ts=i-1e3*h,n.end_ts=void 0!==s?this.sum(i,h*s*1e3):c):n.end_ts=c;const l=await this.v1PublicGetPublicGetCandlestick(this.extend(n,r)),u=this.safeDict(l,"result",{}),f=this.safeList(u,"data",[]);return this.parseOHLCVs(f,o,t,i,s)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={instrument_name:this.market(e).id};t&&(s.depth=t);const r=await this.v1PublicGetPublicGetBook(this.extend(s,i)),a=this.safeDict(r,"result",{}),o=this.safeList(a,"data",[]),n=this.safeValue(o,0),d=this.safeInteger(n,"t");return this.parseOrderBook(n,e,d)}parseBalance(e){const t=this.safeDict(e,"result",{}),i=this.safeList(t,"data",[]),s=this.safeValue(i[0],"position_balances",[]),r={info:e};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"instrument_name"),a=this.safeCurrencyCode(i),o=this.account();o.total=this.safeString(t,"quantity"),o.used=this.safeString(t,"reserved_qty"),r[a]=o}return this.safeBalance(r)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v1PrivatePostPrivateUserBalance(e);return this.parseBalance(t)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={order_id:e},a=await this.v1PrivatePostPrivateGetOrderDetail(this.extend(r,i)),o=this.safeDict(a,"result",{});return this.parseOrder(o,s)}createOrderRequest(e,t,i,s,a=void 0,o={}){const n=this.market(e),d=t.toUpperCase(),h={instrument_name:n.id,side:i.toUpperCase(),quantity:this.amountToPrecision(e,s)};"LIMIT"!==d&&"STOP_LIMIT"!==d&&"TAKE_PROFIT_LIMIT"!==d||(h.price=this.priceToPrecision(e,a));const c=this.safeString(this.options,"broker","CCXT");let l,u;h.broker_id=c,[l,o]=this.handleMarketTypeAndParams("createOrder",n,o),[u,o]=this.customHandleMarginModeAndParams("createOrder",o),"margin"===l||void 0!==u?h.spot_margin="MARGIN":"spot"===l&&(h.spot_margin="SPOT");const f=this.safeStringUpper2(o,"timeInForce","time_in_force");void 0!==f&&(h.time_in_force="GTC"===f?"GOOD_TILL_CANCEL":"IOC"===f?"IMMEDIATE_OR_CANCEL":"FOK"===f?"FILL_OR_KILL":f);(this.safeBool(o,"postOnly",!1)||"PO"===f)&&(h.exec_inst=["POST_ONLY"],h.time_in_force="GOOD_TILL_CANCEL");const p=this.safeStringN(o,["stopPrice","triggerPrice","ref_price"]),m=this.safeNumber(o,"stopLossPrice"),g=this.safeNumber(o,"takeProfitPrice"),v=void 0!==m,y=void 0!==g;if(void 0!==p){h.ref_price=this.priceToPrecision(e,p);const t=this.numberToString(a);"LIMIT"===d||"STOP_LIMIT"===d||"TAKE_PROFIT_LIMIT"===d?"buy"===i?r.Y.stringLt(t,p)?h.type="TAKE_PROFIT_LIMIT":h.type="STOP_LIMIT":r.Y.stringLt(t,p)?h.type="STOP_LIMIT":h.type="TAKE_PROFIT_LIMIT":"buy"===i?r.Y.stringLt(t,p)?h.type="TAKE_PROFIT":h.type="STOP_LOSS":r.Y.stringLt(t,p)?h.type="STOP_LOSS":h.type="TAKE_PROFIT"}else v?(h.type="LIMIT"===d||"STOP_LIMIT"===d?"STOP_LIMIT":"STOP_LOSS",h.ref_price=this.priceToPrecision(e,m)):y?(h.type="LIMIT"===d||"TAKE_PROFIT_LIMIT"===d?"TAKE_PROFIT_LIMIT":"TAKE_PROFIT",h.ref_price=this.priceToPrecision(e,g)):h.type=d;return o=this.omit(o,["postOnly","clientOrderId","timeInForce","stopPrice","triggerPrice","stopLossPrice","takeProfitPrice"]),this.extend(h,o)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.createOrderRequest(e,t,i,s,r,a),d=await this.v1PrivatePostPrivateCreateOrder(n),h=this.safeDict(d,"result",{});return this.parseOrder(h,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.safeString(s,"type"),o=this.safeString(s,"side"),n=this.safeValue(s,"amount"),d=this.safeValue(s,"price"),h=this.safeDict(s,"params",{}),c=this.createAdvancedOrderRequest(r,a,o,n,d,h);i.push(c)}const s={contingency_type:this.safeString(t,"contingency_type","LIST"),order_list:i},r=await this.v1PrivatePostPrivateCreateOrderList(this.extend(s,t)),a=this.safeValue(r,"result",[]),o=this.safeString(a,"list_id");if(void 0!==o){const e=[{order_id:o}];return this.parseOrders(e)}return this.parseOrders(a)}createAdvancedOrderRequest(e,t,i,s,o=void 0,n={}){const d=this.market(e),h=t.toUpperCase(),c={instrument_name:d.id,side:i.toUpperCase()};"LIMIT"!==h&&"STOP_LIMIT"!==h&&"TAKE_PROFIT_LIMIT"!==h||(c.price=this.priceToPrecision(e,o));const l=this.safeString(this.options,"broker","CCXT");c.broker_id=l;const u=this.safeStringUpper2(n,"timeInForce","time_in_force");void 0!==u&&(c.time_in_force="GTC"===u?"GOOD_TILL_CANCEL":"IOC"===u?"IMMEDIATE_OR_CANCEL":"FOK"===u?"FILL_OR_KILL":u);(this.safeBool(n,"postOnly",!1)||"PO"===u)&&(c.exec_inst=["POST_ONLY"],c.time_in_force="GOOD_TILL_CANCEL");const f=this.safeStringN(n,["stopPrice","triggerPrice","ref_price"]),p=void 0!==this.safeNumber(n,"stopLossPrice"),m=void 0!==this.safeNumber(n,"takeProfitPrice");if(void 0!==f){const e=this.numberToString(o);"LIMIT"===h||"STOP_LIMIT"===h||"TAKE_PROFIT_LIMIT"===h?"buy"===i?r.Y.stringLt(e,f)?c.type="TAKE_PROFIT_LIMIT":c.type="STOP_LIMIT":r.Y.stringLt(e,f)?c.type="STOP_LIMIT":c.type="TAKE_PROFIT_LIMIT":"buy"===i?r.Y.stringLt(e,f)?c.type="TAKE_PROFIT":c.type="STOP_LOSS":r.Y.stringLt(e,f)?c.type="STOP_LOSS":c.type="TAKE_PROFIT"}else c.type=p?"LIMIT"===h||"STOP_LIMIT"===h?"STOP_LIMIT":"STOP_LOSS":m?"LIMIT"===h||"TAKE_PROFIT_LIMIT"===h?"TAKE_PROFIT_LIMIT":"TAKE_PROFIT":h;if("buy"!==i||"MARKET"!==h&&"STOP_LOSS"!==h&&"TAKE_PROFIT"!==h)c.quantity=this.amountToPrecision(e,s);else{let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber2(n,"cost","notional");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===o)throw new a.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),a=this.numberToString(o),n=r.Y.stringMul(i,a);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);c.notional=t}return n=this.omit(n,["postOnly","clientOrderId","timeInForce","stopPrice","triggerPrice","stopLossPrice","takeProfitPrice"]),this.extend(c,n)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};return void 0!==e&&(i=this.market(e),s.instrument_name=i.id),await this.v1PrivatePostPrivateCancelAllOrders(this.extend(s,t))}async cancelOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={order_id:e},a=await this.v1PrivatePostPrivateCancelOrder(this.extend(r,i)),o=this.safeDict(a,"result",{});return this.parseOrder(o,s)}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),r=[];for(let t=0;t<e.length;t++){const i=e[t],a={instrument_name:s.id,order_id:i.toString()};r.push(a)}const o={contingency_type:"LIST",order_list:r},n=await this.v1PrivatePostPrivateCancelOrderList(this.extend(o,i)),d=this.safeList(n,"result",[]);return this.parseOrders(d,s,void 0,void 0,i)}async cancelOrdersForSymbols(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"id"),a=this.safeString(s,"symbol"),o={instrument_name:this.market(a).id,order_id:r.toString()};i.push(o)}const s={contingency_type:"LIST",order_list:i},r=await this.v1PrivatePostPrivateCancelOrderList(this.extend(s,t)),a=this.safeList(r,"result",[]);return this.parseOrders(a,void 0,void 0,void 0,t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.instrument_name=r.id);const o=await this.v1PrivatePostPrivateGetOpenOrders(this.extend(a,s)),n=this.safeDict(o,"result",{}),d=this.safeList(n,"data",[]);return this.parseOrders(d,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s,100);const a={};let o;void 0!==e&&(o=this.market(e),a.instrument_name=o.id),void 0!==t&&(a.start_time=t),void 0!==i&&(a.limit=i);const n=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==n&&(a.end_time=n);const d=await this.v1PrivatePostPrivateGetTrades(this.extend(a,s)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"data",[]);return this.parseTrades(c,o,t,i)}parseAddress(e){let t,i,s;if(e.indexOf("?")>0){[t,s]=e.split("?");i=s.split("=")[1]}else t=e;return[t,i]}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.safeCurrency(e),o={currency:a.id,amount:t,address:i};let n;void 0!==s&&(o.address_tag=s),[n,r]=this.handleNetworkCodeAndParams(r);const d=this.networkCodeToId(n);void 0!==d&&(o.network_id=d);const h=await this.v1PrivatePostPrivateCreateWithdrawal(this.extend(o,r)),c=this.safeDict(h,"result");return this.parseTransaction(c,a)}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i={currency:this.safeCurrency(e).id},s=await this.v1PrivatePostPrivateGetDepositAddress(this.extend(i,t)),r=this.safeDict(s,"result",{}),o=this.safeList(r,"deposit_address_list",[]),n=o.length;if(0===n)throw new a.ExchangeError(this.id+" fetchDepositAddressesByNetwork() generating address...");const d={};for(let e=0;e<n;e++){const t=this.safeDict(o,e),i=this.safeString(t,"address"),s=this.safeString(t,"currency"),r=this.safeCurrencyCode(s),[a,n]=this.parseAddress(i);this.checkAddress(a);const h=this.safeString(t,"network"),c=this.networkIdToCode(h,r);d[c]={info:t,currency:r,network:c,address:a,tag:n}}return d}async fetchDepositAddress(e,t={}){const i=this.safeStringUpper(t,"network");t=this.omit(t,["network"]);const s=await this.fetchDepositAddressesByNetwork(e,t);if(i in s)return s[i];return s[Object.keys(s)[0]]}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.safeCurrency(e),a.currency=r.id),void 0!==t&&(a.start_ts=t),void 0!==i&&(a.page_size=i);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(a.end_ts=o);const n=await this.v1PrivatePostPrivateGetDepositHistory(this.extend(a,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"deposit_list",[]);return this.parseTransactions(h,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.safeCurrency(e),a.currency=r.id),void 0!==t&&(a.start_ts=t),void 0!==i&&(a.page_size=i);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(a.end_ts=o);const n=await this.v1PrivatePostPrivateGetWithdrawalHistory(this.extend(a,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"withdrawal_list",[]);return this.parseTransactions(h,r,t,i)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"t"),s=this.safeString(e,"i");t=this.safeMarket(s,t,"_");const r=this.safeString(t,"quote"),a=this.safeString(e,"a");return this.safeTicker({symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeNumber(e,"h"),low:this.safeNumber(e,"l"),bid:this.safeNumber(e,"b"),bidVolume:void 0,ask:this.safeNumber(e,"k"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:this.safeString(e,"c"),average:void 0,baseVolume:this.safeString(e,"v"),quoteVolume:"USD"===r?this.safeString(e,"vv"):void 0,info:e},t)}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"t","create_time"),s=this.safeString2(e,"i","instrument_name");t=this.safeMarket(s,t,"_");const a=this.safeString(e,"fee_instrument_name"),o=this.safeString(e,"fees");return this.safeTrade({info:e,id:this.safeString2(e,"d","trade_id"),timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,order:this.safeString(e,"order_id"),side:this.safeStringLower2(e,"s","side"),takerOrMaker:this.safeStringLower(e,"taker_side"),price:this.safeNumber2(e,"p","traded_price"),amount:this.safeNumber2(e,"q","traded_quantity"),cost:void 0,type:void 0,fee:{currency:this.safeCurrencyCode(a),cost:this.parseNumber(r.Y.stringNeg(o))}},t)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}parseOrderStatus(e){return this.safeString({ACTIVE:"open",CANCELED:"canceled",FILLED:"closed",REJECTED:"rejected",EXPIRED:"expired"},e,e)}parseTimeInForce(e){return this.safeString({GOOD_TILL_CANCEL:"GTC",IMMEDIATE_OR_CANCEL:"IOC",FILL_OR_KILL:"FOK"},e,e)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"code");if(void 0!==i&&0!==i)return this.safeOrder({id:this.safeString(e,"order_id"),clientOrderId:this.safeString(e,"client_oid"),info:e,status:"rejected"});const s=this.safeInteger(e,"create_time"),r=this.safeString(e,"instrument_name"),a=this.safeSymbol(r,t),o=this.safeValue(e,"exec_inst");let n;if(void 0!==o){n=!1;for(let e=0;e<o.length;e++){if("POST_ONLY"===o[e]){n=!0;break}}}const d=this.safeString(e,"fee_instrument_name");return this.safeOrder({info:e,id:this.safeString(e,"order_id"),clientOrderId:this.safeString(e,"client_oid"),timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:this.safeInteger(e,"update_time"),status:this.parseOrderStatus(this.safeString(e,"status")),symbol:a,type:this.safeStringLower(e,"order_type"),timeInForce:this.parseTimeInForce(this.safeString(e,"time_in_force")),postOnly:n,side:this.safeStringLower(e,"side"),price:this.safeNumber(e,"limit_price"),amount:this.safeNumber(e,"quantity"),filled:this.safeNumber(e,"cumulative_quantity"),remaining:void 0,average:this.safeNumber(e,"avg_price"),cost:this.safeNumber(e,"cumulative_value"),fee:{currency:this.safeCurrencyCode(d),cost:this.safeNumber(e,"cumulative_fee")},trades:[]},t)}parseDepositStatus(e){return this.safeString({0:"pending",1:"ok",2:"failed",3:"pending"},e,e)}parseWithdrawalStatus(e){return this.safeString({0:"pending",1:"pending",2:"failed",3:"pending",4:"failed",5:"ok",6:"canceled"},e,e)}parseTransaction(e,t=void 0){let i;const s=this.safeString(e,"status");let r;"client_wid"in e?(i="withdrawal",r=this.parseWithdrawalStatus(s)):(i="deposit",r=this.parseDepositStatus(s));const a=this.safeString(e,"address"),[o,n]=this.parseAddress(a),d=this.safeString(e,"currency"),h=this.safeCurrencyCode(d,t),c=this.safeInteger(e,"create_time"),l=this.safeNumber(e,"fee");let u;return void 0!==l&&(u={currency:h,cost:l}),{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"txid"),timestamp:c,datetime:this.iso8601(c),network:void 0,address:o,addressTo:o,addressFrom:void 0,tag:n,tagTo:n,tagFrom:void 0,type:i,amount:this.safeNumber(e,"amount"),currency:h,status:r,updated:this.safeInteger(e,"update_time"),internal:void 0,comment:this.safeString(e,"client_wid"),fee:u}}customHandleMarginModeAndParams(e,t={}){const i=this.safeString(this.options,"defaultType"),s=this.safeBool(t,"margin",!1);let r;if(t=this.omit(t,"margin"),[r,t]=this.handleMarginModeAndParams(e,t),void 0!==r){if("cross"!==r)throw new a.NotSupported(this.id+" only cross margin is supported")}else"margin"!==i&&!0!==s||(r="cross");return[r,t]}parseDepositWithdrawFee(e,t=void 0){const i=this.safeList(e,"network_list",[]),s=i.length,r={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};if(void 0!==i)for(let e=0;e<s;e++){const a=i[e],o=this.safeString(a,"network_id"),n=this.safeString(t,"code"),d=this.networkIdToCode(o,n);r.networks[d]={deposit:{fee:void 0,percentage:void 0},withdraw:{fee:this.safeNumber(a,"withdrawal_fee"),percentage:!1}},1===s&&(r.withdraw.fee=this.safeNumber(a,"withdrawal_fee"),r.withdraw.percentage=!1)}return r}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.v1PrivatePostPrivateGetCurrencyNetworks(t),s=this.safeValue(i,"result"),r=this.safeList(s,"currency_map");return this.parseDepositWithdrawFees(r,e,"full_name")}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.safeCurrency(e)),void 0!==t&&(r.start_time=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(r.end_time=o);const n=await this.v1PrivatePostPrivateGetTransactions(this.extend(r,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"data",[]);return this.parseLedger(h,a,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeInteger(e,"event_timestamp_ms"),s=this.safeString(e,"instrument_name"),a=this.safeCurrencyCode(s,t);t=this.safeCurrency(s,t);let o,n=this.safeString(e,"transaction_qty");return r.Y.stringLt(n,"0")?(o="out",n=r.Y.stringAbs(n)):o="in",this.safeLedgerEntry({info:e,id:this.safeString(e,"order_id"),direction:o,account:this.safeString(e,"account_id"),referenceId:this.safeString(e,"trade_id"),referenceAccount:this.safeString(e,"trade_match_id"),type:this.parseLedgerEntryType(this.safeString(e,"journal_type")),currency:a,amount:this.parseNumber(n),timestamp:i,datetime:this.iso8601(i),before:void 0,after:void 0,status:void 0,fee:{currency:void 0,cost:void 0}},t)}parseLedgerEntryType(e){return this.safeString({TRADING:"trade",TRADE_FEE:"fee",WITHDRAW_FEE:"fee",WITHDRAW:"withdrawal",DEPOSIT:"deposit",ROLLBACK_WITHDRAW:"rollback",ROLLBACK_DEPOSIT:"rollback",FUNDING:"fee",REALIZED_PNL:"trade",INSURANCE_FUND:"insurance",SOCIALIZED_LOSS:"trade",LIQUIDATION_FEE:"fee",SESSION_RESET:"reset",ADJUSTMENT:"adjustment",SESSION_SETTLE:"settlement",UNCOVERED_LOSS:"trade",ADMIN_ADJUSTMENT:"adjustment",DELIST:"delist",SETTLEMENT_FEE:"fee",AUTO_CONVERSION:"conversion",MANUAL_CONVERSION:"conversion"},e,e)}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.v1PrivatePostPrivateGetAccounts(e),i=this.safeDict(t,"result",{}),s=this.safeDict(i,"master_account",{}),r=this.safeList(i,"sub_account_list",[]);return r.push(s),this.parseAccounts(r,e)}parseAccount(e){return{id:this.safeString(e,"uuid"),type:this.safeString(e,"label"),code:void 0,info:e}}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets(),void 0!==e&&(r=this.market(e)),[a,s]=this.handleMarketTypeAndParams("fetchSettlementHistory",r,s),this.checkRequiredArgument("fetchSettlementHistory",a,"type",["future","option","WARRANT","FUTURE"]),"option"===a&&(a="WARRANT");const o={instrument_type:a.toUpperCase()},n=await this.v1PublicGetPublicGetExpiredSettlementPrice(this.extend(o,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"data",[]),c=this.parseSettlements(h,r),l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,e,t,i)}parseSettlement(e,t){const i=this.safeInteger(e,"x"),s=this.safeString(e,"i");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber(e,"v"),timestamp:i,datetime:this.iso8601(i)}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++)i.push(this.parseSettlement(e[s],t));return i}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),r)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s);const o=this.market(e);if(!o.swap)throw new a.BadSymbol(this.id+" fetchFundingRateHistory() supports swap contracts only");const n={instrument_name:o.id,valuation_type:"funding_hist"};void 0!==t&&(n.start_ts=t),void 0!==i&&(n.count=i);const d=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==d&&(n.end_ts=d);const h=await this.v1PublicGetPublicGetValuations(this.extend(n,s)),c=this.safeDict(h,"result",{}),l=this.safeList(c,"data",[]),u=this.safeString(c,"instrument_name"),f=[];for(let e=0;e<l.length;e++){const t=l[e],i=this.safeInteger(t,"t");f.push({info:t,symbol:this.safeSymbol(u,o),fundingRate:this.safeNumber(t,"v"),timestamp:i,datetime:this.iso8601(i)})}const p=this.sortBy(f,"timestamp");return this.filterBySymbolSinceLimit(p,o.symbol,t,i)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.v1PrivatePostPrivateGetPositions(this.extend(s,t)),a=this.safeDict(r,"result",{}),o=this.safeList(a,"data",[]);return this.parsePosition(this.safeDict(o,0),i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i={};let s;if(void 0!==(e=this.marketSymbols(e))){let t;if(Array.isArray(e)){if(e.length>1)throw new a.BadRequest(this.id+" fetchPositions() symbols argument cannot contain more than 1 symbol");t=e[0]}else t=e;s=this.market(t),i.instrument_name=s.id}const r=await this.v1PrivatePostPrivateGetPositions(this.extend(i,t)),o=this.safeDict(r,"result",{}),n=this.safeList(o,"data",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"instrument_name"),s=this.safeMarket(i,void 0,void 0,"contract");d.push(this.parsePosition(t,s))}return this.filterByArrayPositions(d,"symbol",void 0,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"instrument_name");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeSymbol(i,t,void 0,"contract"),a=this.safeInteger(e,"update_timestamp_ms"),o=this.safeString(e,"quantity");return this.safePosition({info:e,id:void 0,symbol:s,timestamp:a,datetime:this.iso8601(a),hedged:void 0,side:r.Y.stringGt(o,"0")?"buy":"sell",contracts:r.Y.stringAbs(o),contractSize:t.contractSize,entryPrice:void 0,markPrice:void 0,notional:void 0,leverage:void 0,collateral:this.safeNumber(e,"open_pos_cost"),initialMargin:this.safeNumber(e,"cost"),maintenanceMargin:void 0,initialMarginPercentage:void 0,maintenanceMarginPercentage:void 0,unrealizedPnl:this.safeNumber(e,"open_position_pnl"),liquidationPrice:void 0,marginMode:void 0,percentage:void 0,marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}nonce(){return this.milliseconds()}paramsToString(e,t){if(t>=3)return e.toString();if("string"==typeof e)return e;let i,s="";if(Array.isArray(e))i=e;else{const t=this.keysort(e);i=Object.keys(t)}for(let r=0;r<i.length;r++){const a=i[r];s+=a;const o=e[a];if("undefined"===o)s+="null";else if(Array.isArray(o))for(let e=0;e<o.length;e++)s+=this.paramsToString(o[e],t+1);else s+=o.toString()}return s}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={instrument_name:s.id,type:"MARKET"},a=this.safeStringUpper(i,"type"),o=this.safeString(i,"price");void 0!==a&&(r.type=a),void 0!==o&&(r.price=this.priceToPrecision(s.symbol,o));const n=await this.v1PrivatePostPrivateClosePosition(this.extend(r,i)),d=this.safeDict(n,"result");return this.parseOrder(d,s)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.v1PrivatePostPrivateGetInstrumentFeeRate(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseTradingFee(a,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.v1PrivatePostPrivateGetFeeRate(e),i=this.safeDict(t,"result",{});return this.parseTradingFees(i)}parseTradingFees(e){const t={};t.info=e;for(let i=0;i<this.symbols.length;i++){const s=this.symbols[i],a=this.market(s).swap,o=a?"effective_deriv_taker_rate_bps":"effective_spot_taker_rate_bps",n=a?"effective_deriv_maker_rate_bps":"effective_spot_maker_rate_bps",d={info:e,symbol:s,maker:this.parseNumber(r.Y.stringDiv(this.safeString(e,n),"10000")),taker:this.parseNumber(r.Y.stringDiv(this.safeString(e,o),"10000")),percentage:void 0,tierBased:void 0};t[s]=d}return t}parseTradingFee(e,t=void 0){const i=this.safeString(e,"instrument_name");return{info:e,symbol:this.safeSymbol(i,t),maker:this.parseNumber(r.Y.stringDiv(this.safeString(e,"effective_maker_rate_bps"),"10000")),taker:this.parseNumber(r.Y.stringDiv(this.safeString(e,"effective_taker_rate_bps"),"10000")),percentage:void 0,tierBased:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeString(t,0),d=this.safeString(t,1);let h=this.urls.api[o]+"/"+e;const c=this.omit(s,this.extractParams(e));if("public"===d)Object.keys(c).length&&(h+="?"+this.urlencode(c));else{this.checkRequiredCredentials();const t=this.nonce().toString(),i=this.extend({},s),o=Object.keys(i),d=this.paramsToString(i,0),h=e+t+this.apiKey+d+t,c=this.hmac(this.encode(h),this.encode(this.secret),n.s),l=o.length;if(a=this.json({id:t,method:e,params:s,api_key:this.apiKey,sig:c,nonce:t}),0===l){const e="{}",t="[]";a=a.replace(t,e)}r={"Content-Type":"application/json"}}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){const c=this.safeString(n,"code");if("0"!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),new a.ExchangeError(this.id+" "+o)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"cryptomus",name:"Cryptomus",countries:["CA"],rateLimit:100,version:"v1",certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!1,cancelWithdraw:!1,closePosition:!1,createConvertTrade:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!1,createMarketOrder:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopLossOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!1,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchConvertTrade:!1,fetchConvertTradeHistory:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!1,fetchOHLCV:!1,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!1,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!1,reduceMargin:!1,sandbox:!1,setLeverage:!1,setMargin:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{},urls:{logo:"https://github.com/user-attachments/assets/8e0b1c48-7c01-4177-9224-f1b01d89d7e7",api:{public:"https://api.cryptomus.com",private:"https://api.cryptomus.com"},www:"https://cryptomus.com",doc:"https://doc.cryptomus.com/personal",fees:"https://cryptomus.com/tariffs",referral:"https://app.cryptomus.com/signup/?ref=JRP4yj"},api:{public:{get:{"v2/user-api/exchange/markets":1,"v2/user-api/exchange/market/price":1,"v1/exchange/market/assets":1,"v1/exchange/market/order-book/{currencyPair}":1,"v1/exchange/market/tickers":1,"v1/exchange/market/trades/{currencyPair}":1}},private:{get:{"v2/user-api/exchange/orders":1,"v2/user-api/exchange/orders/history":1,"v2/user-api/exchange/account/balance":1,"v2/user-api/exchange/account/tariffs":1,"v2/user-api/payment/services":1,"v2/user-api/payout/services":1,"v2/user-api/transaction/list":1},post:{"v2/user-api/exchange/orders":1,"v2/user-api/exchange/orders/market":1},delete:{"v2/user-api/exchange/orders/{orderId}":1}}},fees:{trading:{percentage:!0,feeSide:"get",maker:this.parseNumber("0.02"),taker:this.parseNumber("0.02")}},options:{createMarketBuyOrderRequiresPrice:!0,networks:{BEP20:"bsc",DASH:"dash",POLYGON:"polygon",ARB:"arbitrum",SOL:"sol",TON:"ton",ERC20:"eth",TRC20:"tron",LTC:"ltc",XMR:"xmr",BCH:"bch",DOGE:"doge",AVAX:"avalanche",BTC:"btc",RUB:"rub"},networksById:{bsc:"BEP20",dash:"DASH",polygon:"POLYGON",arbitrum:"ARB",sol:"SOL",ton:"TON",eth:"ERC20",tron:"TRC20",ltc:"LTC",xmr:"XMR",bch:"BCH",doge:"DOGE",avalanche:"AVAX",btc:"BTC",rub:"RUB"},fetchOrderBook:{level:0}},commonCurrencies:{},exceptions:{exact:{500:r.ExchangeError,6:r.InsufficientFunds,"Insufficient funds.":r.InsufficientFunds,"Minimum amount 15 USDT":r.InvalidOrder},broad:{}},precisionMode:o.kb,requiredCredentials:{apiKey:!1,uid:!0},features:{}})}async fetchMarkets(e={}){const t=await this.publicGetV2UserApiExchangeMarkets(e),i=this.safeList(t,"result",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=t.split("_"),s=i[0],r=i[1],a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r),n=this.safeDict(this.fees,"trading");return this.safeMarketStructure({id:t,symbol:a+"/"+o,base:a,quote:o,baseId:s,quoteId:r,active:!0,type:"spot",subType:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,contract:!1,settle:void 0,settleId:void 0,contractSize:void 0,linear:void 0,inverse:void 0,taker:this.safeNumber(n,"taker"),maker:this.safeNumber(n,"maker"),percentage:this.safeBool(n,"percentage"),tierBased:void 0,feeSide:this.safeString(n,"feeSide"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"quotePrec"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"basePrec")))},limits:{amount:{min:this.safeNumber(e,"quoteMinSize"),max:this.safeNumber(e,"quoteMaxSize")},price:{min:this.safeNumber(e,"baseMinSize"),max:this.safeNumber(e,"baseMaxSize")},leverage:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e})}async fetchCurrencies(e={}){const t=await this.publicGetV1ExchangeMarketAssets(e),i=this.safeList(t,"result"),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency_code"),a=this.safeCurrencyCode(r),o=this.safeBool(t,"can_withdraw"),n=this.safeBool(t,"can_deposit"),d=o&&n,h=this.safeString(t,"network_code"),c=this.safeDict(this.options,"networksById"),l=this.safeString(c,h,h),u=this.safeNumber(t,"min_withdraw"),f=this.safeNumber(t,"max_withdraw"),p=this.safeNumber(t,"min_deposit"),m=this.safeNumber(t,"max_deposit"),g={id:h,network:l,limits:{withdraw:{min:u,max:f},deposit:{min:p,max:m}},active:d,deposit:n,withdraw:o,fee:void 0,precision:void 0,info:t},v={};if(v[l]=g,a in s){const e=s[a],t=this.safeDict(e,"networks");e.networks=this.extend(t,v),d?(e.active=!0,e.deposit=!0,e.withdraw=!0):(o&&(e.withdraw=!0),n&&(e.deposit=!0));const i=this.safeDict(e,"limits"),r={min:void 0,max:void 0},h=this.safeDict(i,"withdraw",r),c={min:void 0,max:void 0},l=this.safeDict(i,"deposit",c);u&&(r.min=h.min?Math.min(h.min,u):u),f&&(r.max=h.max?Math.max(h.max,f):f),p&&(c.min=l.min?Math.min(l.min,p):p),m&&(c.max=l.max?Math.max(l.max,m):m);const g={withdraw:r,deposit:c};e.limits=g}else s[a]={id:r,code:a,precision:void 0,type:void 0,name:void 0,active:d,deposit:n,withdraw:o,fee:void 0,limits:{withdraw:{min:u,max:f},deposit:{min:p,max:m}},networks:v,info:t}}return s}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetV1ExchangeMarketTickers(t),s=this.safeList(i,"data");return this.parseTickers(s,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"currency_pair"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString(e,"last_price");return this.safeTicker({symbol:s,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"base_volume"),quoteVolume:this.safeString(e,"quote_volume"),info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={currencyPair:this.market(e).id};let r=0;[r,i]=this.handleOptionAndParams(i,"fetchOrderBook","level",r),s.level=r;const a=await this.publicGetV1ExchangeMarketOrderBookCurrencyPair(this.extend(s,i)),o=this.safeDict(a,"data",{}),n=this.safeTimestamp(o,"timestamp");return this.parseOrderBook(o,e,n,"bids","asks","price","quantity")}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={currencyPair:r.id},o=await this.publicGetV1ExchangeMarketTradesCurrencyPair(this.extend(a,s)),n=this.safeList(o,"data");return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"timestamp");return this.safeTrade({id:this.safeString(e,"trade_id"),timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,side:this.safeString(e,"type"),price:this.safeString(e,"price"),amount:this.safeString(e,"quote_volume"),cost:this.safeString(e,"base_volume"),takerOrMaker:void 0,type:void 0,order:void 0,fee:{currency:void 0,cost:void 0},info:e},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetV2UserApiExchangeAccountBalance(this.extend({},e)),i=this.safeList(t,"result",[]);return this.parseBalance(i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"ticker"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"held"),t[a]=o}return this.safeBalance(t)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e),h={market:d.id,direction:i,tag:"ccxt"},c=this.safeString(n,"clientOrderId");void 0!==c&&(n=this.omit(n,"clientOrderId"),h.client_order_id=c);const l="buy"===i,u=this.numberToString(s),f=this.numberToString(o);let p,m;if([p,n]=this.handleParamString(n,"cost"),"market"===t){if(l){let e=!0;if([e,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0),e){if(void 0===o&&void 0===p)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option of param to false and pass the cost to spend in the amount argument");void 0===p&&(p=a.Y.stringMul(u,f))}else p=p||u;h.value=p}else h.quantity=u;m=await this.privatePostV2UserApiExchangeOrdersMarket(this.extend(h,n))}else{if("limit"!==t)throw new r.ArgumentsRequired(this.id+" createOrder() requires a type parameter (limit or market)");if(void 0===o)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price parameter for a "+t+" order");h.quantity=u,h.price=o,m=await this.privatePostV2UserApiExchangeOrders(this.extend(h,n))}return this.parseOrder(m,d)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={};s.orderId=e;return await this.privateDeleteV2UserApiExchangeOrdersOrderId(this.extend(s,i))}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.market=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetV2UserApiExchangeOrdersHistory(this.extend(r,s)),n=this.safeList(o,"result",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e];d.push(this.parseOrder(t,a))}return d}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==r&&(a.market=r.id);const o=await this.privateGetV2UserApiExchangeOrders(this.extend(a,s)),n=this.safeList(o,"result",[]);return this.parseOrders(n,r,void 0,void 0)}parseOrder(e,t=void 0){const i=this.safeString2(e,"order_id","id"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=this.safeString(e,"createdAt"),a=this.parse8601(r),o=this.safeDict(e,"deal",{}),n=this.safeNumber(o,"averageFilledPrice"),d=this.safeString(e,"type"),h=this.safeString(e,"direction");let c=this.safeNumber(e,"price");const l=this.safeList(o,"transactions",[]);let u;const f=this.safeDict(l,0),p=this.safeString(f,"feeCurrency");void 0!==p&&(u={currency:this.safeCurrencyCode(p),cost:this.safeNumber(f,"fee")}),void 0===c&&(c=this.safeNumber(f,"filledPrice"));const m=this.safeNumber(e,"quantity"),g=this.safeNumber(e,"value"),v=this.parseOrderStatus(this.safeString(e,"state")),y=this.safeString(e,"clientOrderId");return this.safeOrder({id:i,clientOrderId:y,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:void 0,symbol:t.symbol,type:d,timeInForce:void 0,postOnly:void 0,side:h,price:c,stopPrice:this.safeString(e,"stopLossPrice"),triggerPrice:this.safeString(e,"stopLossPrice"),amount:m,cost:g,average:n,filled:this.safeString(e,"filledQuantity"),remaining:void 0,status:v,fee:u,trades:void 0,info:e},t)}parseOrderStatus(e=void 0){return this.safeString({active:"open",completed:"closed",partially_completed:"open",cancelled:"canceled",expired:"expired",failed:"failed"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.implodeParams(e,s);s=this.omit(s,this.extractParams(e));let d=this.urls.api[t]+"/"+o;if("private"===t){this.checkRequiredCredentials();let e="";if(r={userId:this.uid},"GET"!==i)e=a=this.json(s),r["Content-Type"]="application/json";else{const e=this.urlencode(s);0!==e.length&&(d+="?"+e)}const t=this.stringToBase64(e)+this.secret,o=this.hash(this.encode(t),n.F);r.sign=o}else{const e=this.urlencode(s);0!==e.length&&(d+="?"+e)}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n){if("code"in n){const e=this.safeString(n,"code"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,t),new r.ExchangeError(t)}if("message"in n){const e=this.safeString(n,"message"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,t),this.throwBroadlyMatchedException(this.exceptions.broad,e,t),new r.ExchangeError(t)}}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"defx",name:"Defx X",rateLimit:100,version:"v1",certified:!1,pro:!1,hostname:"defx.com",dex:!0,has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!1,option:!1,addMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelWithdraw:!1,closeAllPositions:!0,closePosition:!0,createConvertTrade:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!1,createMarketOrder:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!1,createStopLossOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!0,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchCanceledOrders:!0,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchConvertTrade:!1,fetchConvertTradeHistory:!1,fetchCurrencies:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrice:!1,fetchMarkPrices:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!1,reduceMargin:!1,sandbox:!0,setLeverage:!0,setMargin:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","12h":"12h","1d":"1d","1w":"1w","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/4e92bace-d7a9-45ea-92be-122168dc87e4",api:{public:"https://api.{hostname}",private:"https://api.{hostname}"},test:{public:"https://api.testnet.{hostname}",private:"https://api.testnet.{hostname}"},www:"https://defx.com/home",doc:["https://docs.defx.com/docs","https://api-docs.defx.com/"],fees:[""],referral:{url:"https://app.defx.com/join/6I2CZ7"}},api:{v1:{public:{get:{"healthcheck/ping":1,"symbols/{symbol}/ohlc":1,"symbols/{symbol}/trades":1,"symbols/{symbol}/prices":1,"symbols/{symbol}/ticker/24hr":1,"symbols/{symbol}/depth/{level}/{slab}":1,"ticker/24HrAgg":1,"c/markets":1,"c/markets/metadata":1,"analytics/market/stats/newUsers":1,"analytics/market/stats/tvl":1,"analytics/market/stats/volumeByInstrument":1,"analytics/market/stats/liquidation":1,"analytics/market/stats/totalVolume":1,"analytics/market/stats/openInterest":1,"analytics/market/stats/totalTrades":1,"analytics/market/stats/basis":1,"analytics/market/stats/insuranceFund":1,"analytics/market/stats/longAndShortRatio":1,"analytics/market/stats/fundingRate":1,"analytics/market/overview":1,"explorer/search":1,"explorer/transactions":1,"explorer/blocks":1}},private:{get:{"api/order/{orderId}":1,"api/orders":1,"api/orders/oco/{parentOrderId}":1,"api/trades":1,"api/position/active":1,"api/users/metadata/leverage":1,"api/users/metadata/feeMultiplier":1,"api/users/metadata/slippage":1,"api/users/referral":1,"api/users/apikeys":1,"connection-signature-message/evm":1,"api/users/profile/wallets":1,"api/notifications":1,"api/wallet/balance":1,"api/wallet/transactions":1,"api/analytics/user/overview":1,"api/analytics/user/pnl":1,"api/analytics/points/overview":1,"api/analytics/points/history":1},post:{"api/order":1,"api/position/oco":1,"api/users/socket/listenKeys":1,"api/users/metadata/leverage":1,"api/users/metadata/feeMultiplier":1,"api/users/metadata/slippage":1,"api/users/referral/recordReferralSignup":1,"api/users/apikeys":1,"api/users/profile/wallets":1,"api/transfers/withdrawal":1,"api/transfers/bridge/withdrawal":1},put:{"api/position/updatePositionMargin":1,"api/users/socket/listenKeys/{listenKey}":1,"api/users/apikeys/{accessKey}/status":1,"api/users/referral":1},patch:{"api/users/apikeys/{accessKey}":1},delete:{"api/orders/allOpen":1,"api/order/{orderId}":1,"api/position/{positionId}":1,"api/position/all":1,"api/users/socket/listenKeys/{listenKey}":1,"api/users/apikeys/{accessKey}":1}}}},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.0002"),taker:this.parseNumber("0.0005")}},options:{sandboxMode:!1},features:{spot:void 0,forDerivatives:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:500,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:{extends:"forDerivatives"},inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{404:n.BadRequest,missing_auth_signature:n.AuthenticationError,order_rejected:n.InvalidOrder,invalid_order_id:n.InvalidOrder,filter_lotsize_maxqty:n.InvalidOrder,filter_notional_min:n.InvalidOrder,failed_index_price_up_multiplier_filter:n.InvalidOrder,no_open_orders:n.InvalidOrder,active_position_not_found:n.InvalidOrder,position_inactive:n.InvalidOrder,invalid_position_id:n.InvalidOrder,"Internal server error":n.ExchangeError},broad:{"Bad Request":n.BadRequest}},precisionMode:a.kb})}async fetchStatus(e={}){const t=await this.v1PublicGetHealthcheckPing(e);let i;return i=this.safeBool(t,"success")?"ok":"error",{status:i,updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTime(e={}){const t=await this.v1PublicGetHealthcheckPing(e);return this.safeInteger(t,"t")}async fetchMarkets(e={}){const t={type:"perps"},i=[this.v1PublicGetCMarkets(this.extend(t,e)),this.v1PublicGetCMarketsMetadata(this.extend(t,e))],s=await Promise.all(i),r=this.safeList(s[0],"data"),a=this.indexBy(r,"market"),o=this.safeList(s[1],"data");for(let e=0;e<o.length;e++){const t=o[e].market;let i;t in a&&(i=a[t].status),o[e].status=i}return this.parseMarkets(o)}parseMarket(e){const t=this.safeString(e,"market"),i=t.split("_"),s=this.safeString(i,0),r=this.safeString(i,1),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r),n=a+"/"+o+":"+o,d=this.safeList(e,"filters",[]),h=this.safeDict(e,"fees",{}),c=this.indexBy(d,"filterType"),l=this.safeDict(c,"PRICE_FILTER",{}),u=this.safeDict(c,"LOT_SIZE",{}),f=this.safeDict(c,"MARKET_LOT_SIZE",{}),p=this.safeDict(c,"NOTIONAL",{});return{id:t,symbol:n,base:a,quote:o,settle:o,baseId:s,quoteId:r,settleId:r,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:"active"===this.safeString(e,"status",""),contract:!0,linear:!0,inverse:void 0,taker:this.safeNumber(h,"taker"),maker:this.safeNumber(h,"maker"),contractSize:this.parseNumber("1"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(u,"stepSize"),price:this.safeNumber(l,"tickSize")},limits:{leverage:{min:void 0,max:this.safeNumber(e,"cappedLeverage")},amount:{min:this.safeNumber(u,"minQty"),max:this.safeNumber(u,"maxQty")},price:{min:this.safeNumber(l,"minPrice"),max:this.safeNumber(l,"maxPrice")},cost:{min:this.safeNumber(p,"minNotional"),max:void 0},market:{min:this.safeNumber(f,"minQty"),max:this.safeNumber(f,"maxQty")}},created:void 0,info:e}}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetSymbolsSymbolTicker24hr(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==e){e=this.marketSymbols(e);const t=this.safeString(e,0);void 0!==t&&(i=this.market(t))}if([s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),"spot"===s)throw new n.NotSupported(this.id+" fetchTickers() is not supported for "+s+" markets");const r=await this.v1PublicGetTicker24HrAgg(t);return this.parseTickers(r,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol");void 0!==i&&(t=this.market(i));const s=t.symbol,r=this.safeString(e,"openPrice"),a=this.safeString(e,"highPrice"),o=this.safeString(e,"lowPrice"),n=this.safeString(e,"lastPrice"),d=this.safeString(e,"quoteVolume"),h=this.safeString(e,"volume"),c=this.safeString(e,"priceChangePercent"),l=this.safeString(e,"priceChange");let u=this.safeInteger(e,"closeTime");0===u&&(u=void 0);const f=this.iso8601(u),p=this.safeString(e,"bestBidPrice"),m=this.safeString(e,"bestBidQty"),g=this.safeString(e,"bestAskPrice"),v=this.safeString(e,"bestAskQty");return this.safeTicker({symbol:s,timestamp:u,datetime:f,high:a,low:o,bid:p,bidVolume:m,ask:g,askVolume:v,vwap:void 0,open:r,close:n,last:void 0,previousClose:void 0,change:l,percentage:c,average:void 0,baseVolume:h,quoteVolume:d,markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);void 0===s&&(s=1e3),s=Math.min(1e3,s);const o={symbol:a.id,interval:this.safeString(this.timeframes,t,t),limit:s},n=this.safeInteger2(r,"until","till");if(r=this.omit(r,["until","till"]),o.endTime=void 0===n?this.milliseconds():n,void 0===i)o.startTime=0;else if(o.startTime=i,void 0===n){const e=s*(1e3*this.parseTimeframe(t));o.endTime=this.sum(i,e)}const d=await this.v1PublicGetSymbolsSymbolOhlc(this.extend(o,r));return this.parseOHLCVs(d,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"start"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);void 0===i&&(i=50),i=Math.min(50,i);const a={symbol:r.id,limit:i},o=await this.v1PublicGetSymbolsSymbolTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==e){const t=this.market(e);r.symbols=t.id}if(void 0!==i){const e=100;i=Math.min(e,i),r.pageSize=i}const a=await this.v1PrivateGetApiTrades(this.extend(r,s)),o=this.safeList(a,"data",[]);return this.parseTrades(o,void 0,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"time"),s=this.safeInteger(e,"timestamp",this.parse8601(i)),r=this.safeString(e,"symbol"),a=(t=this.safeMarket(r,t)).symbol,o=this.safeString(e,"price"),n=this.safeString(e,"qty"),d=this.safeString(e,"id"),h=this.safeString(e,"orderId"),c=this.safeStringLower(e,"role"),l=this.safeBool(e,"buyerMaker");let u=this.safeStringLower(e,"side");return void 0!==l&&(u=l?"sell":"buy"),this.safeTrade({id:d,timestamp:s,datetime:this.iso8601(s),symbol:a,side:u,price:o,amount:n,cost:void 0,order:h,takerOrMaker:c,type:void 0,fee:{cost:this.safeString(e,"fee"),currency:"USDC"},info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);void 0===t&&(t=10);const r=this.safeDict(s,"info",{}),a=this.safeList(r,"depthSlabs",[]),o={symbol:s.id,level:t,slab:this.safeString(a,0)},n=await this.v1PublicGetSymbolsSymbolDepthLevelSlab(this.extend(o,i)),d=this.safeInteger(n,"timestamp");return this.parseOrderBook(n,e,d,"bids","asks","price","qty")}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetSymbolsSymbolPrices(this.extend(s,t));return this.parseTicker(r,i)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetSymbolsSymbolPrices(this.extend(s,t));return this.parseFundingRate(r,i)}parseFundingRate(e,t=void 0){const i=this.safeNumber(e,"markPrice"),s=this.safeNumber(e,"indexPrice"),r=this.safeNumber(e,"payoutFundingRate"),a=this.safeInteger(e,"nextFundingPayout");return{info:e,symbol:t.symbol,markPrice:i,indexPrice:s,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:r,fundingTimestamp:a,fundingDatetime:this.iso8601(a),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v1PrivateGetApiWalletBalance(e),i=this.safeList(t,"assets");return this.parseBalance(i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeCurrencyCode(this.safeString(s,"asset")),a=this.account();a.total=this.safeString(s,"balance"),t[r]=a}return this.safeBalance(t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool2(a,"reduceOnly","reduce_only");a=this.omit(a,["reduceOnly","reduce_only"]);const d=t.toUpperCase(),h=i.toUpperCase(),c={symbol:o.id,side:h,type:d},l=this.safeString(a,"takeProfitPrice"),u=this.safeString2(a,"stopPrice","triggerPrice"),f="MARKET"===d,p="LIMIT"===d,m=this.safeStringUpper(a,"timeInForce");void 0!==m?c.timeInForce=m:p&&(c.timeInForce="GTC"),n&&(c.reduceOnly=n);const g=this.safeString(a,"clientOrderId");void 0!==g&&(c.newClientOrderId=g),void 0===u&&void 0===l||(c.workingType="MARK_PRICE",void 0!==l?(c.stopPrice=this.priceToPrecision(e,l),c.type=f?"TAKE_PROFIT_MARKET":"TAKE_PROFIT_LIMIT"):(c.stopPrice=this.priceToPrecision(e,u),c.type=f?"STOP_MARKET":"STOP_LIMIT")),p&&void 0!==r&&(c.price=this.priceToPrecision(e,r)),c.quantity=this.amountToPrecision(e,s),a=this.omit(a,["clOrdID","clientOrderId","client_order_id","postOnly","timeInForce","stopPrice","triggerPrice","takeProfitPrice"]);const v=await this.v1PrivatePostApiOrder(this.extend(c,a)),y=this.safeDict(v,"data");return this.parseOrder(y,o)}parseOrderStatus(e){if(void 0!==e){const t={NEW:"open",OPEN:"open",CANCELLED:"canceled",REJECTED:"rejected",FILLED:"closed"};return this.safeString(t,e,e)}return e}parseOrder(e,t=void 0){const i=this.safeString(e,"orderId"),s=this.safeString(e,"clientOrderId"),r=this.safeString(e,"symbol"),a=(t=this.safeMarket(r,t)).symbol,o=this.safeString(e,"price"),n=this.safeString(e,"origQty"),d=this.safeStringLower(e,"type"),h=this.safeString(e,"status"),c=this.safeStringLower(e,"side"),l=this.omitZero(this.safeString(e,"executedQty")),u=this.omitZero(this.safeString(e,"avgPrice")),f=this.safeStringLower(e,"timeInForce");let p,m;void 0!==d&&(d.indexOf("take_profit")>=0?p=this.safeString(e,"stopPrice"):m=this.safeString(e,"stopPrice"));const g=this.parse8601(this.safeString(e,"createdAt")),v=this.parse8601(this.safeString(e,"updatedAt"));return this.safeOrder({id:i,clientOrderId:s,timestamp:g,datetime:this.iso8601(g),lastTradeTimestamp:v,lastUpdateTimestamp:v,status:this.parseOrderStatus(h),symbol:a,type:d,timeInForce:f,postOnly:this.safeBool(e,"postOnly"),reduceOnly:this.safeBool(e,"reduceOnly"),side:c,price:o,triggerPrice:m,takeProfitPrice:p,stopLossPrice:void 0,average:u,amount:n,filled:l,remaining:void 0,cost:void 0,trades:void 0,fee:{cost:this.safeString(e,"totalFee"),currency:"USDC"},info:e},t)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e,idType:"orderId"},r=this.safeStringN(i,["clOrdID","clientOrderId","client_order_id"]),a=void 0!==r;if(a){if(void 0===t)throw new n.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const e=this.market(t);s.orderId=r,s.idType="clientOrderId",s.symbol=e.id}i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]);const o=await this.v1PrivateDeleteApiOrderOrderId(this.extend(s,i)),d={symbol:t};return a?d.clientOrderId=r:d.id=e,this.extend(this.parseOrder(o),d)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={symbols:[this.market(e).id]};return await this.v1PrivateDeleteApiOrdersAllOpen(this.extend(i,t))}async fetchPosition(e,t={}){if(void 0===e)throw new n.ArgumentsRequired(this.id+" fetchPosition() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PrivateGetApiPositionActive(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parsePosition(o,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.v1PrivateGetApiPositionActive(t),s=this.safeList(i,"data",[]);return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=r.Y.stringAbs(this.safeString(e,"quantity")),a=this.safeStringLower(e,"positionSide"),o=this.omitZero(this.safeString(e,"pnl")),n=this.omitZero(this.safeString(e,"entryPrice")),d=this.safeString(e,"marginAmount");return this.safePosition({info:e,id:this.safeString(e,"positionId"),symbol:t.symbol,timestamp:void 0,datetime:void 0,lastUpdateTimestamp:void 0,initialMargin:this.parseNumber(d),initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,entryPrice:this.parseNumber(n),notional:void 0,leverage:void 0,unrealizedPnl:this.parseNumber(o),realizedPnl:void 0,contracts:this.parseNumber(s),contractSize:this.safeNumber(t,"contractSize"),marginRatio:void 0,liquidationPrice:void 0,markPrice:void 0,lastPrice:void 0,collateral:void 0,marginMode:void 0,side:a,percentage:void 0,stopLossPrice:void 0,takeProfitPrice:void 0,hedged:void 0})}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e,idType:"orderId"},r=this.safeStringN(i,["clOrdID","clientOrderId","client_order_id"]);if(i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]),void 0!==r){if(void 0===t)throw new n.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");const e=this.market(t);s.orderId=r,s.idType="clientOrderId",s.symbol=e.id}const a=await this.v1PrivateGetApiOrderOrderId(this.extend(s,i)),o=this.safeDict(a,"data");return this.parseOrder(o)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==e){const t=this.market(e);r.symbols=t.id}const a=this.safeInteger(s,"until");if(void 0!==a&&(s=this.omit(s,"until"),r.end=this.iso8601(a)),void 0!==t&&(r.start=this.iso8601(t)),void 0!==i){const e=100;i=Math.min(e,i),r.pageSize=i}const o=await this.v1PrivateGetApiOrders(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseOrders(n,void 0,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({statuses:"OPEN"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({statuses:"FILLED"},s))}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({statuses:"CANCELED"},s))}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeString(i,"positionId");if(void 0===s)throw new n.ArgumentsRequired(this.id+" closePosition() requires a positionId");const r=this.safeStringUpper(i,"type");if(void 0===r)throw new n.ArgumentsRequired(this.id+" closePosition() requires a type");const a=this.safeString(i,"quantity");if(void 0===a)throw new n.ArgumentsRequired(this.id+" closePosition() requires a quantity");const o={positionId:s,type:r,quantity:a};if("MARKET"!==r){const e=this.safeString(i,"price");if(void 0===e)throw new n.ArgumentsRequired(this.id+" closePosition() requires a price");o.price=e}i=this.omit(i,["positionId","type","quantity","price"]);return await this.v1PrivateDeleteApiPositionPositionId(this.extend(o,i))}async closeAllPositions(e={}){await this.loadMarkets();const t=await this.v1PrivateDeleteApiPositionAll(e),i=this.safeList(t,"data",[]);return this.parsePositions(i,void 0,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s);const a={};a.start=void 0!==t?t:0;const o=this.safeInteger(s,"until");void 0!==o?(s=this.omit(s,"until"),a.end=o):a.end=this.milliseconds();const n=await this.v1PrivateGetApiWalletTransactions(this.extend(a,s)),d=this.safeList(n,"transactions",[]);return this.parseLedger(d,void 0,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"amount"),s=this.safeString(e,"asset"),r=this.safeCurrencyCode(s,t);t=this.safeCurrency(s,t);const a=this.safeInteger(e,"timestamp"),o=this.safeString(e,"type");return this.safeLedgerEntry({info:e,id:this.safeString(e,"id"),direction:void 0,account:void 0,referenceAccount:void 0,referenceId:void 0,type:this.parseLedgerEntryType(o),currency:r,amount:this.parseNumber(i),timestamp:a,datetime:this.iso8601(a),before:void 0,after:void 0,status:void 0,fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({FundingFee:"fee",FeeRebate:"fee",FeeKickback:"fee",RealizedPnl:"trade",LiquidationClearance:"trade",Transfer:"transfer",ReferralPayout:"referral",Commission:"commission"},e,e)}async withdraw(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(e),o={amount:this.currencyToPrecision(e,t),asset:a.id},n=await this.v1PrivatePostApiTransfersBridgeWithdrawal(this.extend(o,r));return this.parseTransaction(n,a)}parseTransaction(e,t=void 0){return{info:e,id:void 0,txid:this.safeString(e,"transactionId"),timestamp:void 0,datetime:void 0,network:void 0,address:void 0,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:void 0,amount:void 0,currency:this.safeCurrencyCode(void 0,t),status:void 0,updated:void 0,internal:void 0,comment:void 0,fee:void 0}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new n.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s={leverage:this.numberToString(e)},r=this.market(t);s.symbol=r.id;const a=await this.v1PrivatePostApiUsersMetadataLeverage(this.extend(s,i)),o=this.safeDict(a,"data",{});return this.parseLeverage(o,r)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:void 0,longLeverage:s,shortLeverage:s}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const n=t[0],d=t[1],h=this.implodeParams(e,s);let c=this.implodeHostname(this.urls.api[d]);if(c+="/"+n+"/",s=this.omit(s,this.extractParams(e)),s=this.keysort(s),"public"===d)c+="open/"+h,Object.keys(s).length&&(c+="?"+this.rawencode(s));else{this.checkRequiredCredentials(),r={"X-DEFX-SOURCE":"ccxt"},c+="auth/"+h;const t=this.milliseconds().toString();let n=t;"GET"===i||"api/order/{orderId}"===e?(n+=this.rawencode(s),Object.keys(s).length&&(c+="?"+this.rawencode(s))):(void 0!==s&&(n+=a=this.json(s)),r["Content-Type"]="application/json");const d=this.hmac(this.encode(n),this.encode(this.secret),o.s);r["X-DEFX-APIKEY"]=this.apiKey,r["X-DEFX-TIMESTAMP"]=t,r["X-DEFX-SIGNATURE"]=d}return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(!o)return;const h=this.safeBool(o,"success"),c=this.safeDict(o,"err",o),l=this.safeString2(c,"errorCode","code");if(!h){const e=this.id+" "+this.json(o);this.throwBroadlyMatchedException(this.exceptions.broad,a,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e)}}defaultNetworkCodeForCurrency(e){const t=this.currency(e).networks,i=Object.keys(t);for(let e=0;e<i.length;e++){const t=i[e];if("ETH"===t)return t}return this.safeValue(i,0)}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"delta",name:"Delta Exchange",countries:["VC"],rateLimit:300,version:"v2",has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!0,addMargin:!0,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!0,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!0,editOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDeposit:void 0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:void 0,fetchFundingHistory:!1,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!0,fetchGreeks:!0,fetchIndexOHLCV:!0,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!1,fetchMarginMode:!0,fetchMarginModes:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!1,fetchOrderBook:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!0,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTransfer:void 0,fetchTransfers:void 0,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawal:void 0,fetchWithdrawals:void 0,reduceMargin:!0,setLeverage:!0,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","1d":"1d","7d":"7d","1w":"1w","2w":"2w","1M":"30d"},urls:{logo:"https://user-images.githubusercontent.com/1294454/99450025-3be60a00-2931-11eb-9302-f4fd8d8589aa.jpg",test:{public:"https://testnet-api.delta.exchange",private:"https://testnet-api.delta.exchange"},api:{public:"https://api.delta.exchange",private:"https://api.delta.exchange"},www:"https://www.delta.exchange",doc:["https://docs.delta.exchange"],fees:"https://www.delta.exchange/fees",referral:"https://www.delta.exchange/app/signup/?code=IULYNB"},api:{public:{get:["assets","indices","products","products/{symbol}","tickers","tickers/{symbol}","l2orderbook/{symbol}","trades/{symbol}","stats","history/candles","history/sparklines","settings"]},private:{get:["orders","products/{product_id}/orders/leverage","positions/margined","positions","orders/history","fills","fills/history/download/csv","wallet/balances","wallet/transactions","wallet/transactions/download","wallets/sub_accounts_transfer_history","users/trading_preferences","sub_accounts","profile","deposits/address","orders/leverage"],post:["orders","orders/bracket","orders/batch","products/{product_id}/orders/leverage","positions/change_margin","positions/close_all","wallets/sub_account_balance_transfer","orders/cancel_after","orders/leverage"],put:["orders","orders/bracket","orders/batch","positions/auto_topup","users/update_mmp","users/reset_mmp"],delete:["orders","orders/all","orders/batch"]}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0015"),maker:this.parseNumber("0.0010"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0015")],[this.parseNumber("100"),this.parseNumber("0.0013")],[this.parseNumber("250"),this.parseNumber("0.0013")],[this.parseNumber("1000"),this.parseNumber("0.001")],[this.parseNumber("5000"),this.parseNumber("0.0009")],[this.parseNumber("10000"),this.parseNumber("0.00075")],[this.parseNumber("20000"),this.parseNumber("0.00065")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("100"),this.parseNumber("0.001")],[this.parseNumber("250"),this.parseNumber("0.0009")],[this.parseNumber("1000"),this.parseNumber("0.00075")],[this.parseNumber("5000"),this.parseNumber("0.0006")],[this.parseNumber("10000"),this.parseNumber("0.0005")],[this.parseNumber("20000"),this.parseNumber("0.0005")]]}}},options:{networks:{TRC20:"TRC20(TRON)",BEP20:"BEP20(BSC)"}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:500,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:2e3}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},precisionMode:a.kb,requiredCredentials:{apiKey:!0,secret:!0},exceptions:{exact:{insufficient_margin:r.InsufficientFunds,order_size_exceed_available:r.InvalidOrder,risk_limits_breached:r.BadRequest,invalid_contract:r.BadSymbol,immediate_liquidation:r.InvalidOrder,out_of_bankruptcy:r.InvalidOrder,self_matching_disrupted_post_only:r.InvalidOrder,immediate_execution_post_only:r.InvalidOrder,bad_schema:r.BadRequest,invalid_api_key:r.AuthenticationError,invalid_signature:r.AuthenticationError,open_order_not_found:r.OrderNotFound,unavailable:r.ExchangeNotAvailable},broad:{}}})}createExpiredOptionMarket(e){const t="USDT",i=e.split("-"),s=e.split("/");let r,a,o;e.indexOf("/")>-1?(r=this.safeString(s,0),a=this.safeString(i,1),o=this.safeString(i,3)):(r=this.safeString(i,1),a=this.safeString(i,3),o=this.safeString(i,0));const n=t,d=this.safeString(i,2),h=this.convertExpireDate(a),c=this.parse8601(h);return{id:o+"-"+r+"-"+d+"-"+a,symbol:r+"/"+t+":"+n+"-"+a+"-"+d+"-"+o,base:r,quote:t,settle:n,baseId:r,quoteId:t,settleId:n,active:!1,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:this.parseNumber("1"),expiry:c,expiryDatetime:h,optionType:"C"===o?"call":"put",strike:this.parseNumber(d),precision:{amount:void 0,price:void 0},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.endsWith("-C")||e.endsWith("-P")||e.startsWith("C-")||e.startsWith("P-"))&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}async fetchTime(e={}){const t=await this.publicGetSettings(e),i=this.safeDict(t,"result",{});return this.safeIntegerProduct(i,"server_time",.001)}async fetchStatus(e={}){const t=await this.publicGetSettings(e),i=this.safeDict(t,"result",{});return{status:"true"===this.safeString(i,"under_maintenance")?"maintenance":"ok",updated:this.safeIntegerProduct(i,"server_time",.001,this.milliseconds()),eta:void 0,url:void 0,info:t}}async fetchCurrencies(e={}){const t=await this.publicGetAssets(e),i=this.safeList(t,"result",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeInteger(t,"id"),o=this.safeCurrencyCode(r),n="enabled"===this.safeString(t,"deposit_status"),d="enabled"===this.safeString(t,"withdrawal_status"),h=n&&d;s[o]={id:r,numericId:a,code:o,name:this.safeString(t,"name"),info:t,active:h,deposit:n,withdraw:d,fee:this.safeNumber(t,"base_withdrawal_fee"),precision:this.parseNumber(this.parsePrecision(this.safeString(t,"precision"))),limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.safeNumber(t,"min_withdrawal_amount"),max:void 0}},networks:{}}}return s}async loadMarkets(e=!1,t={}){const i=await super.loadMarkets(e,t);(void 0===this.safeDict(this.options,"currenciesByNumericId")||e)&&(this.options.currenciesByNumericId=this.indexByStringifiedNumericId(this.currencies));return(void 0===this.safeDict(this.options,"marketsByNumericId")||e)&&(this.options.marketsByNumericId=this.indexByStringifiedNumericId(this.markets)),i}indexByStringifiedNumericId(e){const t={};if(void 0===e)return;const i=Object.keys(e);for(let s=0;s<i.length;s++){const r=e[i[s]],a=this.safeString(r,"numericId");void 0!==a&&(t[a]=r)}return t}async fetchMarkets(e={}){const t=await this.publicGetProducts(e),i=this.safeList(t,"result",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e];let r=this.safeString(t,"contract_type");if("options_combos"===r)continue;const a=this.safeDict(t,"quoting_asset",{}),o=this.safeDict(t,"underlying_asset",{}),n=this.safeDict(t,"settling_asset"),d=this.safeDict(t,"product_specs",{}),h=this.safeString(o,"symbol"),c=this.safeString(a,"symbol"),l=this.safeString(n,"symbol"),u=this.safeString(t,"symbol"),f=this.safeInteger(t,"id"),p=this.safeCurrencyCode(h),m=this.safeCurrencyCode(c),g=this.safeCurrencyCode(l),v="put_options"===r,y="move_options"===r,w="spot"===r,b="perpetual_futures"===r,k="futures"===r,S="call_options"===r||v||y,O=this.safeString(t,"strike_price"),T=this.safeString(t,"settlement_time"),P=this.parse8601(T),I=this.safeNumber(t,"contract_value");let M;M=w?this.parseNumber(this.parsePrecision(this.safeString(d,"underlying_precision"))):this.parseNumber("1");const x=g===m;let A,C=p+"/"+m;if(b||k||S)if(C=C+":"+g,k||S)if(C=C+"-"+this.yymmdd(P),S){r="option";let e="C";A="call",v?(e="P",A="put"):y&&(e="M",A="move"),C=C+"-"+O+"-"+e}else r="future";else r="swap";const B=this.safeString(t,"state");s.push({id:u,numericId:f,symbol:C,base:p,quote:m,settle:g,baseId:h,quoteId:c,settleId:l,type:r,spot:w,margin:!!w&&void 0,swap:b,future:k,option:S,active:"live"===B,contract:!w,linear:w?void 0:x,inverse:w?void 0:!x,taker:this.safeNumber(t,"taker_commission_rate"),maker:this.safeNumber(t,"maker_commission_rate"),contractSize:I,expiry:P,expiryDatetime:T,strike:this.parseNumber(O),optionType:A,precision:{amount:M,price:this.safeNumber(t,"tick_size")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber("1"),max:this.safeNumber(t,"position_size_limit")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"min_size"),max:void 0}},created:this.parse8601(this.safeString(t,"launch_time")),info:t})}return s}parseTicker(e,t=void 0){const i=this.safeIntegerProduct(e,"timestamp",.001),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeString(e,"close"),o=this.safeDict(e,"quotes",{});return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeNumber(e,"high"),low:this.safeNumber(e,"low"),bid:this.safeNumber(o,"best_bid"),bidVolume:this.safeNumber(o,"bid_size"),ask:this.safeNumber(o,"best_ask"),askVolume:this.safeNumber(o,"ask_size"),vwap:void 0,open:this.safeString(e,"open"),close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeNumber(e,"volume"),quoteVolume:this.safeNumber(e,"turnover"),markPrice:this.safeNumber(e,"mark_price"),indexPrice:this.safeNumber(e,"spot_price"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTickersSymbol(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickers(t),s=this.safeList(i,"result",[]),r={};for(let e=0;e<s.length;e++){const t=this.parseTicker(s[e]);r[t.symbol]=t}return this.filterByArrayTickers(r,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetL2orderbookSymbol(this.extend(r,i)),o=this.safeDict(a,"result",{});return this.parseOrderBook(o,s.symbol,void 0,"buy","sell","price","size")}parseTrade(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"order_id");let r=this.parse8601(this.safeString(e,"created_at"));r=this.safeIntegerProduct(e,"timestamp",.001,r);const a=this.safeString(e,"price"),o=this.safeString(e,"size"),n=this.safeDict(e,"product",{}),d=this.safeString(n,"symbol"),h=this.safeSymbol(d,t),c=this.safeString(e,"seller_role");let l=this.safeString(e,"side");void 0===l&&("taker"===c?l="sell":"maker"===c&&(l="buy"));const u=this.safeString(e,"role"),f=this.safeDict(e,"meta_data",{});let p=this.safeString(f,"order_type");void 0!==p&&(p=p.replace("_order",""));const m=this.safeString(e,"commission");let g;if(void 0!==m){const e=this.safeDict(n,"settling_asset",{}),t=this.safeString(e,"symbol");g={cost:m,currency:this.safeCurrencyCode(t)}}return this.safeTrade({id:i,order:s,timestamp:r,datetime:this.iso8601(r),symbol:h,type:p,side:l,price:a,amount:o,cost:void 0,takerOrMaker:u,fee:g,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.publicGetTradesSymbol(this.extend(a,s)),n=this.safeList(o,"result",[]);return this.parseTrades(n,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"time"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={resolution:this.safeString(this.timeframes,t,t)},n=this.parseTimeframe(t);s=s||2e3;let d=this.safeIntegerProduct(r,"until",.001);const h=void 0!==d;if(h&&(d=this.parseToInt(d)),void 0===i){const e=h?d:this.seconds();o.end=e,o.start=e-s*n}else{const e=this.parseToInt(i/1e3);o.start=e,o.end=h?d:this.sum(e,s*n)}const c=this.safeString(r,"price");o.symbol="mark"===c?"MARK:"+a.id:"index"===c?a.info.spot_index.symbol:a.id,r=this.omit(r,["price","until"]);const l=await this.publicGetHistoryCandles(this.extend(o,r)),u=this.safeList(l,"result",[]);return this.parseOHLCVs(u,a,t,i,s)}parseBalance(e){const t=this.safeList(e,"result",[]),i={info:e},s=this.safeDict(this.options,"currenciesByNumericId",{});for(let e=0;e<t.length;e++){const r=t[e],a=this.safeString(r,"asset_id"),o=this.safeDict(s,a),n=void 0===o?a:o.code,d=this.account();d.total=this.safeString(r,"balance"),d.free=this.safeString(r,"available_balance"),i[n]=d}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetWalletBalances(e);return this.parseBalance(t)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_id:i.numericId},r=await this.privateGetPositions(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parsePosition(a,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetPositionsMargined(t),s=this.safeList(i,"result",[]);return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"product_symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeIntegerProduct(e,"timestamp",.001),a=this.safeString(e,"size");let n;return void 0!==a&&(o.Y.stringGt(a,"0")?n="buy":o.Y.stringLt(a,"0")&&(n="sell")),this.safePosition({info:e,id:void 0,symbol:s,notional:void 0,marginMode:void 0,liquidationPrice:this.safeNumber(e,"liquidation_price"),entryPrice:this.safeNumber(e,"entry_price"),unrealizedPnl:void 0,percentage:void 0,contracts:this.parseNumber(a),contractSize:this.safeNumber(t,"contractSize"),markPrice:void 0,side:n,hedged:void 0,timestamp:r,datetime:this.iso8601(r),maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:void 0,initialMargin:void 0,initialMarginPercentage:void 0,leverage:void 0,marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}parseOrderStatus(e){return this.safeString({open:"open",pending:"open",closed:"closed",cancelled:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"client_order_id"),r=this.parse8601(this.safeString(e,"created_at")),a=this.safeString(e,"product_id"),o=this.safeDict(this.options,"marketsByNumericId",{}),n=void 0===(t=this.safeValue(o,a,t))?a:t.symbol,d=this.parseOrderStatus(this.safeString(e,"state")),h=this.safeString(e,"side");let c=this.safeString(e,"order_type");c=c.replace("_order","");const l=this.safeString(e,"limit_price"),u=this.safeString(e,"size"),f=this.safeString(e,"unfilled_size"),p=this.safeString(e,"average_fill_price");let m;const g=this.safeString(e,"paid_commission");if(void 0!==g){let e;if(void 0!==t){const i=this.safeDict(t.info,"settling_asset",{}),s=this.safeString(i,"symbol");e=this.safeCurrencyCode(s)}m={cost:g,currency:e}}return this.safeOrder({info:e,id:i,clientOrderId:s,timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,symbol:n,type:c,side:h,price:l,amount:u,cost:void 0,average:p,filled:void 0,remaining:f,status:d,fee:m,trades:void 0},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=t+"_order",n=this.market(e),d={product_id:n.numericId,size:this.amountToPrecision(n.symbol,s),side:i,order_type:o};"limit"===t&&(d.limit_price=this.priceToPrecision(n.symbol,r));const h=this.safeString2(a,"clientOrderId","client_order_id");a=this.omit(a,["clientOrderId","client_order_id"]),void 0!==h&&(d.client_order_id=h);const c=this.safeBool(a,"reduceOnly");c&&(d.reduce_only=c,a=this.omit(a,"reduceOnly"));const l=await this.privatePostOrders(this.extend(d,a)),u=this.safeDict(l,"result",{});return this.parseOrder(u,n)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={id:parseInt(e),product_id:n.numericId};void 0!==r&&(d.size=parseInt(this.amountToPrecision(t,r))),void 0!==a&&(d.limit_price=this.priceToPrecision(t,a));const h=await this.privatePutOrders(this.extend(d,o)),c=this.safeDict(h,"result");return this.parseOrder(c,n)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={id:parseInt(e),product_id:s.numericId},o=await this.privateDeleteOrders(this.extend(a,i)),n=this.safeDict(o,"result");return this.parseOrder(n,s)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i={product_id:this.market(e).numericId},s=this.privateDeleteOrdersAll(this.extend(i,t));return[this.safeOrder({info:s})]}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersWithMethod("privateGetOrders",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersWithMethod("privateGetOrdersHistory",e,t,i,s)}async fetchOrdersWithMethod(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o,n;void 0!==t&&(o=this.market(t),a.product_ids=o.numericId),void 0!==i&&(a.start_time=i.toString()+"000"),void 0!==s&&(a.page_size=s),"privateGetOrders"===e?n=await this.privateGetOrders(this.extend(a,r)):"privateGetOrdersHistory"===e&&(n=await this.privateGetOrdersHistory(this.extend(a,r)));const d=this.safeList(n,"result",[]);return this.parseOrders(d,o,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.product_ids=a.numericId),void 0!==t&&(r.start_time=t.toString()+"000"),void 0!==i&&(r.page_size=i);const o=await this.privateGetFills(this.extend(r,s)),n=this.safeList(o,"result",[]);return this.parseTrades(n,a,t,i)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset_id=a.numericId),void 0!==i&&(r.page_size=i);const o=await this.privateGetWalletTransactions(this.extend(r,s)),n=this.safeList(o,"result",[]);return this.parseLedger(n,a,t,i)}parseLedgerEntryType(e){return this.safeString({pnl:"pnl",deposit:"transaction",withdrawal:"transaction",commission:"fee",conversion:"trade",referral_bonus:"referral",commission_rebate:"rebate"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"uuid");let s;const r=this.safeDict(e,"meta_data",{}),a=this.safeString(r,"transaction_id");let n=this.safeString(e,"transaction_type");"deposit"===n||"commission_rebate"===n||"referral_bonus"===n||"pnl"===n||"withdrawal_cancellation"===n||"promo_credit"===n?s="in":"withdrawal"!==n&&"commission"!==n&&"conversion"!==n&&"perpetual_futures_funding"!==n||(s="out"),n=this.parseLedgerEntryType(n);const d=this.safeString(e,"asset_id"),h=this.safeDict(this.options,"currenciesByNumericId"),c=void 0===(t=this.safeValue(h,d,t))?void 0:t.code,l=this.safeString(e,"amount"),u=this.parse8601(this.safeString(e,"created_at")),f=this.safeString(e,"balance"),p=o.Y.stringMax("0",o.Y.stringSub(f,l));return this.safeLedgerEntry({info:e,id:i,direction:s,account:undefined,referenceId:a,referenceAccount:undefined,type:n,currency:c,amount:this.parseNumber(l),before:this.parseNumber(p),after:this.parseNumber(f),status:"ok",timestamp:u,datetime:this.iso8601(u),fee:void 0},t)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={asset_symbol:i.id},r=this.safeStringUpper(t,"network");void 0!==r&&(s.network=this.networkCodeToId(r,e),t=this.omit(t,"network"));const a=await this.privateGetDepositsAddress(this.extend(s,t)),o=this.safeDict(a,"result",{});return this.parseDepositAddress(o,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"asset_symbol"),r=this.safeString(e,"network");return this.checkAddress(i),{info:e,currency:this.safeCurrencyCode(s,t),network:this.networkIdToCode(r),address:i,tag:this.safeString(e,"memo")}}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={symbol:i.id},a=await this.publicGetTickersSymbol(this.extend(s,t)),o=this.safeDict(a,"result",{});return this.parseFundingRate(o,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickers(this.extend({contract_types:"perpetual_futures"},t)),s=this.safeList(i,"result",[]);return this.parseFundingRates(s,e)}parseFundingRate(e,t=void 0){const i=this.safeIntegerProduct(e,"timestamp",.001),s=this.safeString(e,"symbol"),r=this.safeString(e,"funding_rate"),a=o.Y.stringDiv(r,"100");return{info:e,symbol:this.safeSymbol(s,t),markPrice:this.safeNumber(e,"mark_price"),indexPrice:this.safeNumber(e,"spot_price"),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:i,datetime:this.iso8601(i),fundingRate:this.parseNumber(a),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"reduce",i)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e);t=t.toString(),"reduce"===i&&(t=o.Y.stringMul(t,"-1"));const a={product_id:r.numericId,delta_margin:t},n=await this.privatePostPositionsChangeMargin(this.extend(a,s)),d=this.safeDict(n,"result",{});return this.parseMarginModification(d,r)}parseMarginModification(e,t=void 0){const i=this.safeString(e,"product_symbol");return{info:e,symbol:(t=this.safeMarket(i,t)).symbol,type:void 0,marginMode:"isolated",amount:void 0,total:this.safeNumber(e,"margin"),code:void 0,status:void 0,timestamp:void 0,datetime:void 0}}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s={symbol:i.id},a=await this.publicGetTickersSymbol(this.extend(s,t)),o=this.safeDict(a,"result",{});return this.parseOpenInterest(o,i)}parseOpenInterest(e,t=void 0){const i=this.safeIntegerProduct(e,"timestamp",.001),s=this.safeString(e,"symbol");return this.safeOpenInterest({symbol:this.safeSymbol(s,t),baseVolume:this.safeNumber(e,"oi_value"),quoteVolume:this.safeNumber(e,"oi_value_usd"),openInterestAmount:this.safeNumber(e,"oi_contracts"),openInterestValue:this.safeNumber(e,"oi"),timestamp:i,datetime:this.iso8601(i),info:e},t)}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s={product_id:i.numericId},r=await this.privateGetProductsProductIdOrdersLeverage(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"index_symbol"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"margin_mode"),longLeverage:s,shortLeverage:s}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s={product_id:this.market(t).numericId,leverage:e};return await this.privatePostProductsProductIdOrdersLeverage(this.extend(s,i))}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={states:"expired"};void 0!==i&&(a.page_size=i);const o=await this.publicGetProducts(this.extend(a,s)),n=this.safeList(o,"result",[]),d=this.parseSettlements(n,r),h=this.sortBy(d,"timestamp");return this.filterBySymbolSinceLimit(h,r.symbol,t,i)}parseSettlement(e,t){const i=this.safeString(e,"settlement_time"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber(e,"settlement_price"),timestamp:this.parse8601(i),datetime:i}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++)i.push(this.parseSettlement(e[s],t));return i}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTickersSymbol(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseGreeks(a,i)}parseGreeks(e,t=void 0){const i=this.safeIntegerProduct(e,"timestamp",.001),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeDict(e,"greeks",{}),o=this.safeDict(e,"quotes",{});return{symbol:r,timestamp:i,datetime:this.iso8601(i),delta:this.safeNumber(a,"delta"),gamma:this.safeNumber(a,"gamma"),theta:this.safeNumber(a,"theta"),vega:this.safeNumber(a,"vega"),rho:this.safeNumber(a,"rho"),bidSize:this.safeNumber(o,"bid_size"),askSize:this.safeNumber(o,"ask_size"),bidImpliedVolatility:this.safeNumber(o,"bid_iv"),askImpliedVolatility:this.safeNumber(o,"ask_iv"),markImpliedVolatility:this.safeNumber(o,"mark_iv"),bidPrice:this.safeNumber(o,"best_bid"),askPrice:this.safeNumber(o,"best_ask"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:void 0,underlyingPrice:this.safeNumber(e,"spot_price"),info:e}}async closeAllPositions(e={}){await this.loadMarkets();const t=await this.privatePostPositionsCloseAll(this.extend({close_all_portfolio:!0,close_all_isolated:!0},e));return[this.parsePosition(this.safeDict(t,"result",{}))]}async fetchMarginMode(e,t={}){let i;await this.loadMarkets(),void 0!==e&&(i=this.market(e));const s=await this.privateGetProfile(t),r=this.safeDict(s,"result",{});return this.parseMarginMode(r,i)}parseMarginMode(e,t=void 0){let i;return void 0!==t&&(i=t.symbol),{info:e,symbol:i,marginMode:this.safeString(e,"margin_mode")}}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTickersSymbol(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseOption(a,void 0,i)}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"symbol");i=this.safeMarket(s,i);const r=this.safeDict(e,"quotes",{}),a=this.safeIntegerProduct(e,"timestamp",.001);return{info:e,currency:void 0,symbol:i.symbol,timestamp:a,datetime:this.iso8601(a),impliedVolatility:this.safeNumber(r,"mark_iv"),openInterest:this.safeNumber(e,"oi"),bidPrice:this.safeNumber(r,"best_bid"),askPrice:this.safeNumber(r,"best_ask"),midPrice:this.safeNumber(r,"impact_mid_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:void 0,underlyingPrice:this.safeNumber(e,"spot_price"),change:void 0,percentage:void 0,baseVolume:this.safeNumber(e,"volume"),quoteVolume:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o="/"+this.version+"/"+this.implodeParams(e,s);let d=this.urls.api[t]+o;const h=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(h).length&&(d+="?"+this.urlencode(h));else if("private"===t){this.checkRequiredCredentials();const e=this.seconds().toString();r={"api-key":this.apiKey,timestamp:e};let t=i+e+o;if("GET"===i){if(Object.keys(h).length){const e="?"+this.urlencode(h);t+=e,d+=e}}else t+=a=this.json(h),r["Content-Type"]="application/json";const s=this.hmac(this.encode(t),this.encode(this.secret),n.s);r.signature=s}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeDict(n,"error",{}),l=this.safeString(c,"code");if(void 0!==l){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,l,e),new r.ExchangeError(e)}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"deribit",name:"Deribit",countries:["NL"],version:"v2",userAgent:void 0,rateLimit:50,pro:!0,has:{CORS:!0,spot:!1,margin:!1,swap:!0,future:!0,option:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,createDepositAddress:!0,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTrailingAmountOrder:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFees:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchGreeks:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverageTiers:!1,fetchLiquidations:!0,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!0,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!0,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!0,fetchWithdrawal:!1,fetchWithdrawals:!0,sandbox:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"1","3m":"3","5m":"5","10m":"10","15m":"15","30m":"30","1h":"60","2h":"120","3h":"180","6h":"360","12h":"720","1d":"1D"},urls:{test:{rest:"https://test.deribit.com"},logo:"https://user-images.githubusercontent.com/1294454/41933112-9e2dd65a-798b-11e8-8440-5bab2959fcb8.jpg",api:{rest:"https://www.deribit.com"},www:"https://www.deribit.com",doc:["https://docs.deribit.com/v2","https://github.com/deribit"],fees:"https://www.deribit.com/pages/information/fees",referral:{url:"https://www.deribit.com/reg-1189.4038",discount:.1}},api:{public:{get:{auth:1,exchange_token:1,fork_token:1,set_heartbeat:1,disable_heartbeat:1,get_time:1,hello:1,status:1,test:1,subscribe:1,unsubscribe:1,unsubscribe_all:1,get_announcements:1,get_book_summary_by_currency:1,get_book_summary_by_instrument:1,get_contract_size:1,get_currencies:1,get_delivery_prices:1,get_funding_chart_data:1,get_funding_rate_history:1,get_funding_rate_value:1,get_historical_volatility:1,get_index:1,get_index_price:1,get_index_price_names:1,get_instrument:1,get_instruments:1,get_last_settlements_by_currency:1,get_last_settlements_by_instrument:1,get_last_trades_by_currency:1,get_last_trades_by_currency_and_time:1,get_last_trades_by_instrument:1,get_last_trades_by_instrument_and_time:1,get_mark_price_history:1,get_order_book:1,get_trade_volumes:1,get_tradingview_chart_data:1,get_volatility_index_data:1,ticker:1}},private:{get:{logout:1,enable_cancel_on_disconnect:1,disable_cancel_on_disconnect:1,get_cancel_on_disconnect:1,subscribe:1,unsubscribe:1,unsubscribe_all:1,change_api_key_name:1,change_scope_in_api_key:1,change_subaccount_name:1,create_api_key:1,create_subaccount:1,disable_api_key:1,disable_tfa_for_subaccount:1,enable_affiliate_program:1,enable_api_key:1,get_access_log:1,get_account_summary:1,get_account_summaries:1,get_affiliate_program_info:1,get_email_language:1,get_new_announcements:1,get_portfolio_margins:1,get_position:1,get_positions:1,get_subaccounts:1,get_subaccounts_details:1,get_transaction_log:1,list_api_keys:1,remove_api_key:1,remove_subaccount:1,reset_api_key:1,set_announcement_as_read:1,set_api_key_as_default:1,set_email_for_subaccount:1,set_email_language:1,set_password_for_subaccount:1,toggle_notifications_from_subaccount:1,toggle_subaccount_login:1,execute_block_trade:4,get_block_trade:1,get_last_block_trades_by_currency:1,invalidate_block_trade_signature:1,verify_block_trade:4,buy:4,sell:4,edit:4,edit_by_label:4,cancel:4,cancel_all:4,cancel_all_by_currency:4,cancel_all_by_instrument:4,cancel_by_label:4,close_position:4,get_margins:1,get_mmp_config:1,get_open_orders_by_currency:1,get_open_orders_by_instrument:1,get_order_history_by_currency:1,get_order_history_by_instrument:1,get_order_margin_by_ids:1,get_order_state:1,get_stop_order_history:1,get_trigger_order_history:1,get_user_trades_by_currency:1,get_user_trades_by_currency_and_time:1,get_user_trades_by_instrument:1,get_user_trades_by_instrument_and_time:1,get_user_trades_by_order:1,reset_mmp:1,set_mmp_config:1,get_settlement_history_by_instrument:1,get_settlement_history_by_currency:1,cancel_transfer_by_id:1,cancel_withdrawal:1,create_deposit_address:1,get_current_deposit_address:1,get_deposits:1,get_transfers:1,get_withdrawals:1,submit_transfer_to_subaccount:1,submit_transfer_to_user:1,withdraw:1}}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,selfTradePrevention:!1,trailing:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},exceptions:{9999:a.PermissionDenied,1e4:a.AuthenticationError,10001:a.ExchangeError,10002:a.InvalidOrder,10003:a.InvalidOrder,10004:a.OrderNotFound,10005:a.InvalidOrder,10006:a.InvalidOrder,10007:a.InvalidOrder,10008:a.InvalidOrder,10009:a.InsufficientFunds,10010:a.OrderNotFound,10011:a.InvalidOrder,10012:a.InvalidOrder,10013:a.PermissionDenied,10014:a.PermissionDenied,10015:a.PermissionDenied,10016:a.PermissionDenied,10017:a.PermissionDenied,10018:a.PermissionDenied,10019:a.PermissionDenied,10020:a.ExchangeError,10021:a.InvalidOrder,10022:a.InvalidOrder,10023:a.InvalidOrder,10024:a.InvalidOrder,10025:a.InvalidOrder,10026:a.InvalidOrder,10027:a.InvalidOrder,10028:a.DDoSProtection,10029:a.OrderNotFound,10030:a.ExchangeError,10031:a.ExchangeError,10032:a.InvalidOrder,10033:a.NotSupported,10034:a.InvalidOrder,10035:a.InvalidOrder,10036:a.InvalidOrder,10040:a.ExchangeNotAvailable,10041:a.OnMaintenance,10043:a.InvalidOrder,10044:a.InvalidOrder,10045:a.InvalidOrder,10046:a.InvalidOrder,10047:a.DDoSProtection,10048:a.ExchangeError,11008:a.InvalidOrder,11029:a.BadRequest,11030:a.ExchangeError,11031:a.ExchangeError,11035:a.DDoSProtection,11036:a.InvalidOrder,11037:a.BadRequest,11038:a.InvalidOrder,11039:a.InvalidOrder,11041:a.InvalidOrder,11042:a.PermissionDenied,11043:a.BadRequest,11044:a.InvalidOrder,11045:a.BadRequest,11046:a.BadRequest,11047:a.BadRequest,11048:a.ExchangeError,11049:a.BadRequest,11050:a.BadRequest,11051:a.OnMaintenance,11052:a.ExchangeError,11053:a.ExchangeError,11090:a.InvalidAddress,11091:a.InvalidAddress,11092:a.InvalidAddress,11093:a.DDoSProtection,11094:a.ExchangeError,11095:a.ExchangeError,11096:a.ExchangeError,12e3:a.AuthenticationError,12001:a.DDoSProtection,12002:a.ExchangeError,12998:a.AuthenticationError,12003:a.AuthenticationError,12004:a.AuthenticationError,12005:a.AuthenticationError,12100:a.ExchangeError,12999:a.AuthenticationError,13e3:a.AuthenticationError,13001:a.AuthenticationError,13002:a.PermissionDenied,13003:a.AuthenticationError,13004:a.AuthenticationError,13005:a.AuthenticationError,13006:a.AuthenticationError,13007:a.AuthenticationError,13008:a.ExchangeError,13009:a.AuthenticationError,13010:a.BadRequest,13011:a.BadRequest,13012:a.PermissionDenied,13013:a.BadRequest,13014:a.BadRequest,13015:a.BadRequest,13016:a.BadRequest,13017:a.ExchangeError,13018:a.ExchangeError,13019:a.ExchangeError,13020:a.ExchangeError,13021:a.PermissionDenied,13025:a.ExchangeError,"-32602":a.BadRequest,"-32601":a.BadRequest,"-32700":a.BadRequest,"-32000":a.BadRequest,11054:a.InvalidOrder},precisionMode:r.kb,options:{code:"BTC",fetchBalance:{code:"BTC"},transfer:{method:"privateGetSubmitTransferToSubaccount"}}})}createExpiredOptionMarket(e){let t,i="USD";const s=e.split("-"),r=e.split("/");let a,o;e.indexOf("/")>-1?(a=this.safeString(r,0),o=this.safeString(s,1),e.indexOf("USDC")>-1&&(a+="_USDC")):(a=this.safeString(s,0),o=this.convertMarketIdExpireDate(this.safeString(s,1))),e.indexOf("USDC")>-1?(i="USDC",t="USDC"):t=a;let n=a;if(a.indexOf("_")>-1){const e=a.split("_");n=this.safeString(e,0)}const d=this.safeString(s,2),h=this.safeString(s,3),c=this.convertExpireDate(o),l=this.parse8601(c);return{id:a+"-"+this.convertExpireDateToMarketIdDate(o)+"-"+d+"-"+h,symbol:n+"/"+i+":"+t+"-"+o+"-"+d+"-"+h,base:a,quote:i,settle:t,baseId:a,quoteId:i,settleId:t,active:!1,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:void 0,expiry:l,expiryDatetime:c,optionType:"C"===h?"call":"put",strike:this.parseNumber(d),precision:{amount:void 0,price:void 0},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.endsWith("-C")||e.endsWith("-P"))&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}async fetchTime(e={}){const t=await this.publicGetGetTime(e);return this.safeInteger(t,"result")}async fetchCurrencies(e={}){const t=await this.publicGetGetCurrencies(e),i=this.safeValue(t,"result",{}),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeCurrencyCode(r),o=this.safeString(t,"currency_long");s[a]={info:t,code:a,id:r,name:o,active:void 0,deposit:void 0,withdraw:void 0,fee:this.safeNumber(t,"withdrawal_fee"),precision:this.parseNumber(this.parsePrecision(this.safeString(t,"fee_precision"))),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},networks:void 0}}return s}codeFromOptions(e,t={}){const i=this.safeValue(this.options,"code","BTC"),s=this.safeValue(this.options,e,{}),r=this.safeValue(s,"code",i);return this.safeValue(t,"code",r)}async fetchStatus(e={}){const t=await this.publicGetStatus(e),i=this.safeValue(t,"result");return{status:"false"===this.safeString(i,"locked")?"ok":"maintenance",updated:this.safeIntegerProduct(t,"usIn",.001,this.milliseconds()),eta:void 0,url:void 0,info:t}}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privateGetGetSubaccounts(e),i=this.safeValue(t,"result",[]);return this.parseAccounts(i)}parseAccount(e){return{info:e,id:this.safeString(e,"id"),type:this.safeString(e,"type"),code:void 0}}async fetchMarkets(e={}){const t=[],i=[],s={};let r;if([r,e]=this.handleOptionAndParams(e,"fetchMarkets","fetchAllMarkets",!0),r){const i=await this.publicGetGetInstruments(e);t.push(i)}else{const i=await this.publicGetGetCurrencies(e),s=this.safeValue(i,"result",[]);for(let i=0;i<s.length;i++){const r={currency:this.safeString(s[i],"currency")},a=await this.publicGetGetInstruments(this.extend(r,e));t.push(a)}}for(let e=0;e<t.length;e++){const r=this.safeValue(t[e],"result",[]);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeString(t,"kind"),o="spot"===a,n=this.safeString(t,"instrument_name"),d=this.safeString(t,"base_currency"),h=this.safeString(t,"counter_currency"),c=this.safeString(t,"settlement_currency"),l=this.safeCurrencyCode(d),u=this.safeCurrencyCode(h),f=this.safeCurrencyCode(c),p="perpetual"===this.safeValue(t,"settlement_period"),m=!p&&a.indexOf("future")>=0,g=a.indexOf("option")>=0,v=a.indexOf("combo")>=0,y=this.safeInteger(t,"expiration_timestamp");let w,b,k,S,O=n,T="swap";if(m?T="future":g?T="option":o&&(T="spot"),o)O=l+"/"+u;else if(!v){if(O=l+"/"+u+":"+f,(g||m)&&(O=O+"-"+this.yymmdd(y,""),g)){w=this.safeNumber(t,"strike"),b=this.safeString(t,"option_type");const e="call"===b?"C":"P";O=O+"-"+this.numberToString(w)+"-"+e}k=u!==f,S=f===u}if(this.safeValue(s,O))continue;s[O]=!0;const P=this.safeNumber(t,"min_trade_amount"),I=this.safeNumber(t,"tick_size");i.push({id:n,symbol:O,base:l,quote:u,settle:f,baseId:d,quoteId:h,settleId:c,type:T,spot:o,margin:!1,swap:p,future:m,option:g,active:this.safeValue(t,"is_active"),contract:!o,linear:S,inverse:k,taker:this.safeNumber(t,"taker_commission"),maker:this.safeNumber(t,"maker_commission"),contractSize:this.safeNumber(t,"contract_size"),expiry:y,expiryDatetime:this.iso8601(y),strike:w,optionType:b,precision:{amount:P,price:I},limits:{leverage:{min:void 0,max:void 0},amount:{min:P,max:void 0},price:{min:I,max:void 0},cost:{min:void 0,max:void 0}},created:this.safeInteger(t,"creation_timestamp"),info:t})}}return i}parseBalance(e){const t={info:e};let i=[];i="summaries"in e?this.safeList(e,"summaries"):[e];for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available_funds"),o.used=this.safeString(s,"maintenance_margin"),o.total=this.safeString(s,"equity"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(e,"code");e=this.omit(e,"code");const i={};let s;void 0!==t&&(i.currency=this.currencyId(t)),s=void 0===t?await this.privateGetGetAccountSummaries(e):await this.privateGetGetAccountSummary(this.extend(i,e));const r=this.safeDict(s,"result",{});return this.parseBalance(r)}async createDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.privateGetCreateDepositAddress(this.extend(i,t)),r=this.safeValue(s,"result",{}),a=this.safeString(r,"address");return this.checkAddress(a),{currency:e,address:a,tag:void 0,info:s}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.privateGetGetCurrentDepositAddress(this.extend(i,t)),r=this.safeValue(s,"result",{}),a=this.safeString(r,"address");return this.checkAddress(a),{info:s,currency:e,network:void 0,address:a,tag:void 0}}parseTicker(e,t=void 0){const i=this.safeInteger2(e,"timestamp","creation_timestamp"),s=this.safeString(e,"instrument_name"),r=this.safeSymbol(s,t),a=this.safeString2(e,"last_price","last"),o=this.safeValue(e,"stats",e);return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString2(o,"high","max_price"),low:this.safeString2(o,"low","min_price"),bid:this.safeString2(e,"best_bid_price","bid_price"),bidVolume:this.safeString(e,"best_bid_amount"),ask:this.safeString2(e,"best_ask_price","ask_price"),askVolume:this.safeString(e,"best_ask_amount"),vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:void 0,quoteVolume:this.safeString(o,"volume"),markPrice:this.safeString(e,"mark_price"),indexPrice:this.safeString(e,"index_price"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.publicGetTicker(this.extend(s,t)),a=this.safeDict(r,"result");return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString2(t,"code","currency");if(t=this.omit(t,["code"]),void 0===i)throw new a.ArgumentsRequired(this.id+" fetchTickers requires a currency/code (eg: BTC/ETH/USDT) parameter to fetch tickers for");const s={currency:this.currency(i).id},r=await this.publicGetGetBookSummaryByCurrency(this.extend(s,t)),o=this.safeList(r,"result",[]),n={};for(let e=0;e<o.length;e++){const t=this.parseTicker(o[e]);n[t.symbol]=t}return this.filterByArrayTickers(n,"symbol",e)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,5e3);const o=this.market(e),n={instrument_name:o.id,resolution:this.safeString(this.timeframes,t,t)},d=this.parseTimeframe(t),h=this.milliseconds();void 0===i?(void 0===s&&(s=1e3),n.start_timestamp=h-(s-1)*d*1e3,n.end_timestamp=h):(i=Math.max(i-1,0),n.start_timestamp=i,n.end_timestamp=void 0===s?h:this.sum(i,s*d*1e3));const c=this.safeInteger(r,"until");void 0!==c&&(r=this.omit(r,"until"),n.end_timestamp=c);const l=await this.publicGetGetTradingviewChartData(this.extend(n,r)),u=this.safeValue(l,"result",{}),f=this.convertTradingViewToOHLCV(u,"ticks","open","high","low","close","volume",!0);return this.parseOHLCVs(f,o,t,i,s)}parseTrade(e,t=void 0){const i=this.safeString(e,"trade_id"),s=this.safeString(e,"instrument_name"),r=this.safeSymbol(s,t),a=this.safeInteger(e,"timestamp"),n=this.safeString(e,"direction"),d=this.safeString(e,"price");t=this.safeMarket(s,t);const h=this.safeString(e,"amount");let c=o.Y.stringMul(h,d);t.inverse&&(c=o.Y.stringDiv(h,d));const l=this.safeString(e,"liquidity");let u;void 0!==l&&(u="M"===l?"maker":"taker");const f=this.safeString(e,"fee");let p;if(void 0!==f){const t=this.safeString(e,"fee_currency");p={cost:f,currency:this.safeCurrencyCode(t)}}return this.safeTrade({id:i,info:e,timestamp:a,datetime:this.iso8601(a),symbol:r,order:this.safeString(e,"order_id"),type:this.safeString(e,"order_type"),side:n,takerOrMaker:u,price:d,amount:h,cost:c,fee:p},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={instrument_name:r.id,include_old:!0};void 0!==t&&(a.start_timestamp=t),void 0!==i&&(a.count=Math.min(i,1e3));const o=this.safeInteger2(s,"until","end_timestamp");let n;void 0!==o&&(s=this.omit(s,["until"]),a.end_timestamp=o),n=void 0!==t||"end_timestamp"in a?await this.publicGetGetLastTradesByInstrumentAndTime(this.extend(a,s)):await this.publicGetGetLastTradesByInstrument(this.extend(a,s));const d=this.safeValue(n,"result",{}),h=this.safeList(d,"trades",[]);return this.parseTrades(h,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=this.codeFromOptions("fetchTradingFees",e),i={currency:this.currency(t).id,extended:!0},s=await this.privateGetGetAccountSummary(this.extend(i,e)),r=this.safeValue(s,"result",{}),a=this.safeValue(r,"fees",[]);let o={},n={},d={};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"instrument_type");"future"===i?n={info:t,maker:this.safeNumber(t,"maker_fee"),taker:this.safeNumber(t,"taker_fee")}:"perpetual"===i?o={info:t,maker:this.safeNumber(t,"maker_fee"),taker:this.safeNumber(t,"taker_fee")}:"option"===i&&(d={info:t,maker:this.safeNumber(t,"maker_fee"),taker:this.safeNumber(t,"taker_fee")})}const h={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e],i=this.market(t);let s={info:i,symbol:t,percentage:!0,tierBased:!0,maker:i.maker,taker:i.taker};i.swap?s=this.extend(s,o):i.future?s=this.extend(s,n):i.option&&(s=this.extend(s,d)),h[t]=s}return h}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={instrument_name:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetGetOrderBook(this.extend(r,i)),o=this.safeValue(a,"result",{}),n=this.safeInteger(o,"timestamp"),d=this.safeInteger(o,"change_id"),h=this.parseOrderBook(o,s.symbol,n);return h.nonce=d,h}parseOrderStatus(e){return this.safeString({open:"open",cancelled:"canceled",filled:"closed",rejected:"rejected",untriggered:"open"},e,e)}parseTimeInForce(e){return this.safeString({good_til_cancelled:"GTC",fill_or_kill:"FOK",immediate_or_cancel:"IOC"},e,e)}parseOrderType(e){return this.safeString({stop_limit:"limit",take_limit:"limit",stop_market:"market",take_market:"market"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"instrument_name");t=this.safeMarket(i,t);const s=this.safeInteger(e,"creation_timestamp"),r=this.safeInteger(e,"last_update_timestamp"),a=this.safeString(e,"order_id");let n=this.safeString(e,"price");"market_price"===n&&(n=void 0);const d=this.safeString(e,"average_price"),h=this.safeString(e,"filled_amount"),c=this.safeString(e,"amount");let l,u=o.Y.stringMul(h,d);if(this.safeBool(t,"inverse")&&"0"!==d&&(u=o.Y.stringDiv(c,d)),void 0!==h){o.Y.stringGt(h,"0")&&(l=r)}const f=this.parseOrderStatus(this.safeString(e,"order_state")),p=this.safeStringLower(e,"direction");let m,g=this.safeString(e,"commission");void 0!==g&&(g=o.Y.stringAbs(g),m={cost:g,currency:t.base});const v=this.safeString(e,"order_type"),y=this.parseOrderType(v),w=this.safeValue(e,"trades"),b=this.parseTimeInForce(this.safeString(e,"time_in_force")),k=this.safeValue(e,"post_only");return this.safeOrder({info:e,id:a,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:l,symbol:t.symbol,type:y,timeInForce:b,postOnly:k,side:p,price:n,triggerPrice:this.safeValue(e,"stop_price"),amount:c,cost:u,average:d,filled:h,remaining:void 0,status:f,fee:m,trades:w},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e};let r;void 0!==t&&(r=this.market(t));const a=await this.privateGetGetOrderState(this.extend(s,i)),o=this.safeDict(a,"result");return this.parseOrder(o,r)}async createOrder(e,t,i,s,r=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={instrument_name:n.id,amount:this.amountToPrecision(e,s),type:t},h=this.safeString(o,"trigger","last_price"),c=this.safeStringUpper(o,"timeInForce"),l=this.safeValue2(o,"reduceOnly","reduce_only"),u=this.safeValue(o,"stopLossPrice"),f=this.safeValue(o,"takeProfitPrice"),p=this.safeString2(o,"trailingAmount","trigger_offset"),m=void 0!==p,g="stop_limit"===t,v="stop_market"===t,y="take_limit"===t,w="take_market"===t,b=g||v||void 0!==u,k=y||w||void 0!==f;if(b&&k)throw new a.InvalidOrder(this.id+" createOrder () only allows one of stopLossPrice or takeProfitPrice to be specified");const S=b||k,O="limit"===t||g||y,T="market"===t||v||w,P=this.safeValue(o,"post_only"),I=this.isPostOnly(T,P,o);if(O?(d.type="limit",d.price=this.priceToPrecision(e,r)):d.type="market",m)d.trigger=h,d.type="trailing_stop",d.trigger_offset=this.parseToNumeric(p);else if(S){const t=void 0!==u?u:f;d.trigger_price=this.priceToPrecision(e,t),d.trigger=h,d.type=b?T?"stop_market":"stop_limit":T?"take_market":"take_limit"}let M;l&&(d.reduce_only=!0),I&&(d.post_only=!0,d.reject_post_only=!0),void 0!==c&&("GTC"===c&&(d.time_in_force="good_til_cancelled"),"IOC"===c&&(d.time_in_force="immediate_or_cancel"),"FOK"===c&&(d.time_in_force="fill_or_kill")),o=this.omit(o,["timeInForce","stopLossPrice","takeProfitPrice","postOnly","reduceOnly","trailingAmount"]),M="Buy"===this.capitalize(i)?await this.privateGetBuy(this.extend(d,o)):await this.privateGetSell(this.extend(d,o));const x=this.safeValue(M,"result",{}),A=this.safeValue(x,"order"),C=this.safeValue(x,"trades",[]);return A.trades=C,this.parseOrder(A,n)}async editOrder(e,t,i,s,r=void 0,o=void 0,n={}){if(void 0===r)throw new a.ArgumentsRequired(this.id+" editOrder() requires an amount argument");await this.loadMarkets();const d={order_id:e,amount:this.amountToPrecision(t,r)};void 0!==o&&(d.price=this.priceToPrecision(t,o));const h=this.safeString2(n,"trailingAmount","trigger_offset");void 0!==h&&(d.trigger_offset=this.parseToNumeric(h),n=this.omit(n,"trigger_offset"));const c=await this.privateGetEdit(this.extend(d,n)),l=this.safeValue(c,"result",{}),u=this.safeValue(l,"order"),f=this.safeValue(l,"trades",[]);return u.trades=f,this.parseOrder(u)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateGetCancel(this.extend(s,i)),a=this.safeDict(r,"result",{});return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;if(void 0===e)s=await this.privateGetCancelAll(this.extend(i,t));else{const r=this.market(e);i.instrument_name=r.id,s=await this.privateGetCancelAllByInstrument(this.extend(i,t))}return[this.safeOrder({info:s})]}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;if(void 0===e){const e=this.codeFromOptions("fetchOpenOrders",s),t=this.currency(e);r.currency=t.id,o=await this.privateGetGetOpenOrdersByCurrency(this.extend(r,s))}else a=this.market(e),r.instrument_name=a.id,o=await this.privateGetGetOpenOrdersByInstrument(this.extend(r,s));const n=this.safeList(o,"result",[]);return this.parseOrders(n,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;if(void 0===e){const e=this.codeFromOptions("fetchClosedOrders",s),t=this.currency(e);r.currency=t.id,o=await this.privateGetGetOrderHistoryByCurrency(this.extend(r,s))}else a=this.market(e),r.instrument_name=a.id,o=await this.privateGetGetOrderHistoryByInstrument(this.extend(r,s));const n=this.safeList(o,"result",[]);return this.parseOrders(n,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={order_id:e},o=await this.privateGetGetUserTradesByOrder(this.extend(a,r)),n=this.safeList(o,"result",[]);return this.parseTrades(n,void 0,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={include_old:!0};let a,o;if(void 0!==i&&(r.count=i),void 0===e){const e=this.codeFromOptions("fetchMyTrades",s),i=this.currency(e);r.currency=i.id,void 0===t?o=await this.privateGetGetUserTradesByCurrency(this.extend(r,s)):(r.start_timestamp=t,o=await this.privateGetGetUserTradesByCurrencyAndTime(this.extend(r,s)))}else a=this.market(e),r.instrument_name=a.id,void 0===t?o=await this.privateGetGetUserTradesByInstrument(this.extend(r,s)):(r.start_timestamp=t,o=await this.privateGetGetUserTradesByInstrumentAndTime(this.extend(r,s)));const n=this.safeValue(o,"result",{}),d=this.safeList(n,"trades",[]);return this.parseTrades(d,a,t,i)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchDeposits() requires a currency code argument");await this.loadMarkets();const r=this.currency(e),o={currency:r.id};void 0!==i&&(o.count=i);const n=await this.privateGetGetDeposits(this.extend(o,s)),d=this.safeValue(n,"result",{}),h=this.safeList(d,"data",[]);return this.parseTransactions(h,r,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchWithdrawals() requires a currency code argument");await this.loadMarkets();const r=this.currency(e),o={currency:r.id};void 0!==i&&(o.count=i);const n=await this.privateGetGetWithdrawals(this.extend(o,s)),d=this.safeValue(n,"result",{}),h=this.safeList(d,"data",[]);return this.parseTransactions(h,r,t,i,s)}parseTransactionStatus(e){return this.safeString({completed:"ok",unconfirmed:"pending"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeCurrencyCode(i,t),r=this.safeInteger2(e,"created_timestamp","received_timestamp"),a=this.safeInteger(e,"updated_timestamp"),o=this.parseTransactionStatus(this.safeString(e,"state")),n=this.safeString(e,"address"),d=this.safeNumber(e,"fee");let h,c="deposit";return void 0!==d&&(c="withdrawal",h={cost:d,currency:s}),{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"transaction_id"),timestamp:r,datetime:this.iso8601(r),address:n,addressTo:n,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:c,amount:this.safeNumber(e,"amount"),currency:s,status:o,updated:a,network:void 0,internal:void 0,comment:void 0,fee:h}}parsePosition(e,t=void 0){const i=this.safeString(e,"instrument_name");t=this.safeMarket(i,t);let s=this.safeString(e,"direction");s="buy"===s?"long":"short";const r=this.safeString(e,"floating_profit_loss"),a=this.safeString(e,"initial_margin"),n=this.safeString(e,"size_currency"),d=this.safeString(e,"maintenance_margin"),h=this.milliseconds();return this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:h,datetime:this.iso8601(h),lastUpdateTimestamp:void 0,initialMargin:this.parseNumber(a),initialMarginPercentage:this.parseNumber(o.Y.stringMul(o.Y.stringDiv(a,n),"100")),maintenanceMargin:this.parseNumber(d),maintenanceMarginPercentage:this.parseNumber(o.Y.stringMul(o.Y.stringDiv(d,n),"100")),entryPrice:this.safeNumber(e,"average_price"),notional:this.parseNumber(n),leverage:this.safeInteger(e,"leverage"),unrealizedPnl:this.parseNumber(r),contracts:void 0,contractSize:this.safeNumber(t,"contractSize"),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"estimated_liquidation_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:void 0,collateral:void 0,marginMode:void 0,side:s,percentage:void 0,hedged:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchPosition(e,t={}){await this.loadMarkets();const i={instrument_name:this.market(e).id},s=await this.privateGetGetPosition(this.extend(i,t)),r=this.safeDict(s,"result");return this.parsePosition(r)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=this.safeString(t,"currency"),s={};if(void 0!==i){t=this.omit(t,"currency");const e=this.currency(i);s.currency=e.id}const r=await this.privateGetGetPositions(this.extend(s,t)),a=this.safeList(r,"result");return this.parsePositions(a,e)}async fetchVolatilityHistory(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.publicGetGetHistoricalVolatility(this.extend(i,t));return this.parseVolatilityHistory(s)}parseVolatilityHistory(e){const t=this.safeValue(e,"result",[]),i=[];for(let e=0;e<t.length;e++){const s=this.safeInteger(t[e],0),r=this.safeNumber(t[e],1);i.push({info:r,timestamp:s,datetime:this.iso8601(s),volatility:r})}return i}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchTransfers() requires a currency code argument");await this.loadMarkets();const r=this.currency(e),o={currency:r.id};void 0!==i&&(o.count=i);const n=await this.privateGetGetTransfers(this.extend(o,s)),d=this.safeValue(n,"result",{}),h=this.safeList(d,"data",[]);return this.parseTransfers(h,r,t,i,s)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={amount:t,currency:a.id,destination:s};let n,d=this.safeString(r,"method");if(r=this.omit(r,"method"),void 0===d){const e=this.safeValue(this.options,"transfer",{});d=this.safeString(e,"method","privateGetSubmitTransferToSubaccount")}n="privateGetSubmitTransferToUser"===d?await this.privateGetSubmitTransferToUser(this.extend(o,r)):await this.privateGetSubmitTransferToSubaccount(this.extend(o,r));const h=this.safeDict(n,"result",{});return this.parseTransfer(h,a)}parseTransfer(e,t=void 0){const i=this.safeTimestamp(e,"created_timestamp"),s=this.safeString(e,"state"),r=this.safeString(e,"other_side"),a=this.safeString(e,"direction"),o=this.safeString(e,"currency");return{info:e,id:this.safeString(e,"id"),status:this.parseTransferStatus(s),amount:this.safeNumber(e,"amount"),currency:this.safeCurrencyCode(o,t),fromAccount:"payment"!==a?r:void 0,toAccount:"payment"===a?r:void 0,timestamp:i,datetime:this.iso8601(i)}}parseTransferStatus(e){return this.safeString({prepared:"pending",confirmed:"ok",cancelled:"cancelled",waiting_for_admin:"pending"},e,e)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={currency:a.id,address:i,amount:t};void 0!==this.twofa&&(o.tfa=(0,d.O)(this.twofa));const n=await this.privateGetWithdraw(this.extend(o,r));return this.parseTransaction(n,a)}parseDepositWithdrawFee(e,t=void 0){return{info:e,withdraw:{fee:this.safeNumber(e,"withdrawal_fee"),percentage:!1},deposit:{fee:void 0,percentage:void 0},networks:{}}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetGetCurrencies(t),s=this.safeList(i,"result",[]);return this.parseDepositWithdrawFees(s,e,"currency")}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s=this.milliseconds(),r={instrument_name:i.id,start_timestamp:s-288e5,end_timestamp:s},a=await this.publicGetGetFundingRateValue(this.extend(r,t));return this.parseFundingRate(a,i)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);let a=!1;[a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate");if(a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"1h",this.extend(s,{isDeribitPaginationCall:!0}),744);const o=1e3*this.parseTimeframe("1h");let n=this.milliseconds();const d=2592e6;void 0===t?t=n-d:n=t+d;const h={instrument_name:r.id,start_timestamp:t-1},c=this.safeInteger2(s,"until","end_timestamp");if(void 0!==c?(s=this.omit(s,["until"]),h.end_timestamp=c):h.end_timestamp=n,"isDeribitPaginationCall"in s){s=this.omit(s,"isDeribitPaginationCall");const e=this.sum(t,i*o);h.end_timestamp=Math.min(h.end_timestamp,e)}const l=await this.publicGetGetFundingRateHistory(this.extend(h,s)),u=[],f=this.safeValue(l,"result",[]);for(let e=0;e<f.length;e++){const t=f[e],i=this.parseFundingRate(t,r);u.push(i)}return this.filterBySymbolSinceLimit(u,e,t,i)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.iso8601(i),r=this.safeNumber2(e,"result","interest_8h");return{info:e,symbol:this.safeSymbol(void 0,t),markPrice:void 0,indexPrice:this.safeNumber(e,"index_price"),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:i,datetime:s,fundingRate:r,fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:"8h"}}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLiquidations","paginate"),r)return await this.fetchPaginatedCallCursor("fetchLiquidations",e,t,i,s,"continuation","continuation",void 0);const o=this.market(e);if(o.spot)throw new a.NotSupported(this.id+" fetchLiquidations() does not support "+o.type+" markets");const n={instrument_name:o.id,type:"bankruptcy"};void 0!==t&&(n.search_start_timestamp=t),void 0!==i&&(n.count=i);const d=await this.publicGetGetLastSettlementsByInstrument(this.extend(n,s)),h=this.safeValue(d,"result",{}),c=this.safeString(h,"continuation"),l=this.safeValue(h,"settlements",[]),u=this.addPaginationCursorToResult(c,l);return this.parseLiquidations(u,o,t,i)}addPaginationCursorToResult(e,t){if(void 0!==e){const i=t.length;if(i>0){const s=t[0],r=t[i-1];s.continuation=e,r.continuation=e,t[0]=s,t[i-1]=r}}return t}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchMyLiquidations() requires a symbol argument");await this.loadMarkets();const r=this.market(e);if(r.spot)throw new a.NotSupported(this.id+" fetchMyLiquidations() does not support "+r.type+" markets");const o={instrument_name:r.id,type:"bankruptcy"};void 0!==t&&(o.search_start_timestamp=t),void 0!==i&&(o.count=i);const n=await this.privateGetGetSettlementHistoryByInstrument(this.extend(o,s)),d=this.safeValue(n,"result",{}),h=this.safeList(d,"settlements",[]);return this.parseLiquidations(h,r,t,i)}parseLiquidation(e,t=void 0){const i=this.safeInteger(e,"timestamp");return this.safeLiquidation({info:e,symbol:this.safeSymbol(void 0,t),contracts:void 0,contractSize:this.safeNumber(t,"contractSize"),price:void 0,baseValue:this.safeNumber(e,"session_bankrupcy"),quoteValue:void 0,timestamp:i,datetime:this.iso8601(i)})}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.publicGetTicker(this.extend(s,t)),a=this.safeValue(r,"result",{});return this.parseGreeks(a,i)}parseGreeks(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"instrument_name"),r=this.safeSymbol(s,t),a=this.safeValue(e,"greeks",{});return{symbol:r,timestamp:i,datetime:this.iso8601(i),delta:this.safeNumber(a,"delta"),gamma:this.safeNumber(a,"gamma"),theta:this.safeNumber(a,"theta"),vega:this.safeNumber(a,"vega"),rho:this.safeNumber(a,"rho"),bidSize:this.safeNumber(e,"best_bid_amount"),askSize:this.safeNumber(e,"best_ask_amount"),bidImpliedVolatility:this.safeNumber(e,"bid_iv"),askImpliedVolatility:this.safeNumber(e,"ask_iv"),markImpliedVolatility:this.safeNumber(e,"mark_iv"),bidPrice:this.safeNumber(e,"best_bid_price"),askPrice:this.safeNumber(e,"best_ask_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:this.safeNumber(e,"last_price"),underlyingPrice:this.safeNumber(e,"underlying_price"),info:e}}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.publicGetGetBookSummaryByInstrument(this.extend(s,t)),a=this.safeList(r,"result",[]),o=this.safeDict(a,0,{});return this.parseOption(o,void 0,i)}async fetchOptionChain(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id,kind:"option"},s=await this.publicGetGetBookSummaryByCurrency(this.extend(i,t)),r=this.safeList(s,"result",[]);return this.parseOptionChain(r,"base_currency","instrument_name")}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"instrument_name");i=this.safeMarket(s,i);const r=this.safeString(e,"base_currency"),a=this.safeCurrencyCode(r,t),o=this.safeInteger(e,"timestamp");return{info:e,currency:a,symbol:i.symbol,timestamp:o,datetime:this.iso8601(o),impliedVolatility:void 0,openInterest:this.safeNumber(e,"open_interest"),bidPrice:this.safeNumber(e,"bid_price"),askPrice:this.safeNumber(e,"ask_price"),midPrice:this.safeNumber(e,"mid_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:this.safeNumber(e,"last"),underlyingPrice:this.safeNumber(e,"underlying_price"),change:void 0,percentage:this.safeNumber(e,"price_change"),baseVolume:this.safeNumber(e,"volume"),quoteVolume:this.safeNumber(e,"volume_usd")}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/api/"+this.version+"/"+t+"/"+e;if("public"===t&&Object.keys(s).length&&(o+="?"+this.urlencode(s)),"private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.milliseconds().toString(),a="";Object.keys(s).length&&(o+="?"+this.urlencode(s));const d=t+"\n"+e+"\n"+(i+"\n"+o+"\n"+a+"\n"),h=this.hmac(this.encode(d),this.encode(this.secret),n.s);r={Authorization:"deri-hmac-sha256 id="+this.apiKey+",ts="+t+",sig="+h+",nonce="+e}}return{url:this.urls.api.rest+o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){if(!n)return;const c=this.safeValue(n,"error");if(void 0!==c){const e=this.safeString(c,"code"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions,e,t),new a.ExchangeError(t)}}}
class c extends a.A{describe(){return this.deepExtend(super.describe(),{id:"derive",name:"derive",countries:[],version:"v1",rateLimit:50,certified:!1,pro:!0,dex:!0,has:{CORS:void 0,spot:!1,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,borrowCrossMargin:!1,borrowIsolatedMargin:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!1,cancelOrdersForSymbols:!1,closeAllPositions:!1,closePosition:!1,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!1,createReduceOnlyOrder:!1,createStopOrder:!1,createTriggerOrder:!1,editOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledAndClosedOrders:!1,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginMode:void 0,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!1,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenInterests:!1,fetchOpenOrders:!0,fetchOrder:!1,fetchOrderBook:!1,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!1,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},hostname:"derive.xyz",urls:{logo:"https://github.com/user-attachments/assets/f835b95f-033a-43dd-b6bb-24e698fc498c",api:{public:"https://api.lyra.finance/public",private:"https://api.lyra.finance/private"},test:{public:"https://api-demo.lyra.finance/public",private:"https://api-demo.lyra.finance/private"},www:"https://www.derive.xyz/",doc:"https://docs.derive.xyz/docs/",fees:"https://docs.derive.xyz/reference/fees-1/",referral:"https://www.derive.xyz/invite/3VB0B"},api:{public:{get:["get_all_currencies"],post:["build_register_session_key_tx","register_session_key","deregister_session_key","login","statistics","get_all_currencies","get_currency","get_instrument","get_all_instruments","get_instruments","get_ticker","get_latest_signed_feeds","get_option_settlement_prices","get_spot_feed_history","get_spot_feed_history_candles","get_funding_rate_history","get_trade_history","get_option_settlement_history","get_liquidation_history","get_interest_rate_history","get_transaction","get_margin","margin_watch","validate_invite_code","get_points","get_all_points","get_points_leaderboard","get_descendant_tree","get_tree_roots","get_swell_percent_points","get_vault_assets","get_etherfi_effective_balances","get_kelp_effective_balances","get_bridge_balances","get_ethena_participants","get_vault_share","get_vault_statistics","get_vault_balances","estimate_integrator_points","create_subaccount_debug","deposit_debug","withdraw_debug","send_quote_debug","execute_quote_debug","get_invite_code","register_invite","get_time","get_live_incidents","get_maker_programs","get_maker_program_scores"]},private:{post:["get_account","create_subaccount","get_subaccount","get_subaccounts","get_all_portfolios","change_subaccount_label","get_notificationsv","update_notifications","deposit","withdraw","transfer_erc20","transfer_position","transfer_positions","order","replace","order_debug","get_order","get_orders","get_open_orders","cancel","cancel_by_label","cancel_by_nonce","cancel_by_instrument","cancel_all","cancel_trigger_order","get_order_history","get_trade_history","get_deposit_history","get_withdrawal_history","send_rfq","cancel_rfq","cancel_batch_rfqs","get_rfqs","poll_rfqs","send_quote","cancel_quote","cancel_batch_quotes","get_quotes","poll_quotes","execute_quote","rfq_get_best_quote","get_margin","get_collaterals","get_positions","get_option_settlement_history","get_subaccount_value_history","expired_and_cancelled_history","get_funding_history","get_interest_history","get_erc20_transfer_history","get_liquidation_history","liquidate","get_liquidator_history","session_keys","edit_session_key","register_scoped_session_key","get_mmp_config","set_mmp_config","reset_mmp","set_cancel_on_disconnect","get_invite_code","register_invite"]}},fees:{},requiredCredentials:{apiKey:!1,secret:!1,walletAddress:!0,privateKey:!0},exceptions:{exact:{"-32000":s.RateLimitExceeded,"-32100":s.RateLimitExceeded,"-32700":s.BadRequest,"-32600":s.BadRequest,"-32601":s.BadRequest,"-32602":s.InvalidOrder,"-32603":s.InvalidOrder,9e3:s.InvalidOrder,1e4:s.BadRequest,10001:s.BadRequest,10002:s.BadRequest,10003:s.BadRequest,10004:s.InvalidOrder,10005:s.BadRequest,10006:s.BadRequest,10007:s.BadRequest,10008:s.BadRequest,10009:s.BadRequest,10010:s.InvalidOrder,10011:s.InsufficientFunds,10012:s.InsufficientFunds,10013:s.ExchangeError,10014:s.ExchangeError,11e3:s.InsufficientFunds,11002:s.InvalidOrder,11003:s.InvalidOrder,11004:s.InvalidOrder,11005:s.InvalidOrder,11006:s.OrderNotFound,11007:s.InvalidOrder,11008:s.InvalidOrder,11009:s.InvalidOrder,11010:s.InvalidOrder,11011:s.InvalidOrder,11012:s.InvalidOrder,11013:s.InvalidOrder,11014:s.InvalidOrder,11015:s.InvalidOrder,11016:s.InvalidOrder,11017:s.InvalidOrder,11018:s.InvalidOrder,11019:s.InvalidOrder,11020:s.InsufficientFunds,11021:s.InvalidOrder,11022:s.InvalidOrder,11023:s.InvalidOrder,11024:s.InvalidOrder,11025:s.InvalidOrder,11026:s.BadRequest,11027:s.InvalidOrder,11028:s.InvalidOrder,11050:s.InvalidOrder,11051:s.InvalidOrder,11052:s.InvalidOrder,11053:s.InvalidOrder,11054:s.InvalidOrder,11055:s.InvalidOrder,11100:s.InvalidOrder,11101:s.InvalidOrder,11102:s.InvalidOrder,11103:s.InvalidOrder,11104:s.InvalidOrder,11105:s.InvalidOrder,11106:s.InvalidOrder,11107:s.InvalidOrder,11200:s.InvalidOrder,11201:s.InvalidOrder,11202:s.InvalidOrder,11203:s.InvalidOrder,12e3:s.InvalidOrder,12001:s.InvalidOrder,12002:s.BadRequest,12003:s.BadRequest,13e3:s.BadRequest,14e3:s.BadRequest,14001:s.InvalidOrder,14002:s.BadRequest,14008:s.BadRequest,14009:s.BadRequest,14010:s.BadRequest,14011:s.BadRequest,14012:s.BadRequest,14013:s.BadRequest,14014:s.InvalidOrder,14015:s.BadRequest,14016:s.BadRequest,14017:s.BadRequest,14018:s.BadRequest,14019:s.BadRequest,14020:s.BadRequest,14021:s.BadRequest,14022:s.AuthenticationError,14023:s.InvalidOrder,14024:s.BadRequest,14025:s.BadRequest,14026:s.BadRequest,14027:s.AuthenticationError,14028:s.BadRequest,14029:s.AuthenticationError,14030:s.BadRequest,14031:s.AuthenticationError,14032:s.BadRequest,16e3:s.AuthenticationError,16001:s.AuthenticationError,16100:s.AuthenticationError,17e3:s.BadRequest,17001:s.BadRequest,17002:s.BadRequest,17003:s.BadRequest,17004:s.BadRequest,17005:s.BadRequest,17006:s.BadRequest,17007:s.BadRequest,18e3:s.BadRequest,18001:s.BadRequest,18002:s.BadRequest,18003:s.BadRequest,18004:s.BadRequest,18005:s.BadRequest,18006:s.BadRequest,18007:s.BadRequest,19e3:s.BadRequest},broad:{}},precisionMode:o.kb,commonCurrencies:{},options:{deriveWalletAddress:"",id:"0x0ad42b8e602c2d3d475ae52d678cf63d84ab2749"}})}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}async fetchTime(e={}){const t=await this.publicPostGetTime(e);return this.safeInteger(t,"result")}async fetchCurrencies(e={}){const t={},i=await this.publicGetGetAllCurrencies(e),s=this.safeList(i,"result",[]);for(let e=0;e<s.length;e++){const i=s[e],r=this.safeString(i,"currency"),a=this.safeCurrencyCode(r);t[a]={id:r,name:void 0,code:a,precision:void 0,active:void 0,fee:void 0,networks:void 0,deposit:void 0,withdraw:void 0,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},info:i}}return t}async fetchMarkets(e={}){const t=this.fetchSpotMarkets(e),i=this.fetchSwapMarkets(e),s=this.fetchOptionMarkets(e),[r,a,o]=await Promise.all([t,i,s]);let n=this.arrayConcat(r,a);return n=this.arrayConcat(n,o),n}async fetchSpotMarkets(e={}){const t=await this.publicPostGetAllInstruments(this.extend({expired:!1,instrument_type:"erc20"},e)),i=this.safeDict(t,"result",{}),s=this.safeList(i,"instruments",[]);return this.parseMarkets(s)}async fetchSwapMarkets(e={}){const t=await this.publicPostGetAllInstruments(this.extend({expired:!1,instrument_type:"perp"},e)),i=this.safeDict(t,"result",{}),s=this.safeList(i,"instruments",[]);return this.parseMarkets(s)}async fetchOptionMarkets(e={}){const t=await this.publicPostGetAllInstruments(this.extend({expired:!1,instrument_type:"option"},e)),i=this.safeDict(t,"result",{}),s=this.safeList(i,"instruments",[]);return this.parseMarkets(s)}parseMarket(e){const t=this.safeString(e,"instrument_type");let i,s,r=!1,a=!0,o=!1,n=!1;const d=this.safeString(e,"base_currency"),h=this.safeString(e,"quote_currency"),c=this.safeCurrencyCode(d),l=this.safeCurrencyCode(h),u=this.safeString(e,"instrument_name");let f,p,m,g,v,y,w=c+"/"+l;if("erc20"===t)r=!0,i="spot";else if("perp"===t)a=!1,f="USDC",p=this.safeCurrencyCode(f),w=c+"/"+l+":"+p,o=!0,s=!0,i="swap";else if("option"===t){f="USDC",p=this.safeCurrencyCode(f),a=!1,n=!0,i="option";const t=this.safeDict(e,"option_details");m=this.safeTimestamp(t,"expiry"),g=this.safeInteger(t,"strike"),y=this.safeString(t,"option_type"),w=c+"/"+l+":"+p+"-"+this.yymmdd(m)+"-"+this.numberToString(g)+"-"+y,v="P"===y?"put":"call"}return this.safeMarketStructure({id:u,symbol:w,base:c,quote:l,settle:p,baseId:d,quoteId:h,settleId:f,type:i,spot:r,margin:a,swap:o,future:!1,option:n,active:this.safeBool(e,"is_active"),contract:o||n,linear:s,inverse:void 0,contractSize:r?void 0:1,expiry:m,expiryDatetime:this.iso8601(m),taker:this.safeNumber(e,"taker_fee_rate"),maker:this.safeNumber(e,"maker_fee_rate"),strike:g,optionType:v,precision:{amount:this.safeNumber(e,"amount_step"),price:this.safeNumber(e,"tick_size")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"minimum_amount"),max:this.safeNumber(e,"maximum_amount")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e})}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_name:i.id},r=await this.publicPostGetTicker(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseTicker(a,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"instrument_name"),s=this.safeIntegerOmitZero(e,"timestamp"),a=this.safeSymbol(i,t),o=this.safeDict(e,"stats"),n=this.safeString(o,"percent_change");return this.safeTicker({symbol:a,timestamp:s,datetime:this.iso8601(s),high:this.safeString(o,"high"),low:this.safeString(o,"low"),bid:this.safeString(e,"best_bid_price"),bidVolume:this.safeString(e,"best_bid_amount"),ask:this.safeString(e,"best_ask_price"),askVolume:this.safeString(e,"best_ask_amount"),vwap:void 0,open:void 0,close:void 0,last:void 0,previousClose:void 0,change:n,percentage:r.Y.stringMul(n,"100"),average:void 0,baseVolume:void 0,quoteVolume:void 0,indexPrice:this.safeString(e,"index_price"),markPrice:this.safeString(e,"mark_price"),info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.instrument_name=a.id),void 0!==i&&(i>1e3&&(i=1e3),r.page_size=i),void 0!==t&&(r.from_timestamp=t);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(r.to_timestamp=o);const n=await this.publicPostGetTradeHistory(this.extend(r,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"trades",[]);return this.parseTrades(h,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"instrument_name"),s=this.safeSymbol(i,t),r=this.safeInteger(e,"timestamp"),a={currency:"USDC",cost:this.safeString(e,"trade_fee")};return this.safeTrade({info:e,id:this.safeString(e,"trade_id"),order:this.safeString(e,"order_id"),symbol:s,side:this.safeStringLower(e,"direction"),type:void 0,takerOrMaker:this.safeString(e,"liquidity_role"),price:this.safeString(e,"trade_price"),amount:this.safeString(e,"trade_amount"),cost:void 0,timestamp:r,datetime:this.iso8601(r),fee:a},t)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={instrument_name:r.id};void 0!==t&&(a.start_timestamp=t);const o=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==o&&(a.to_timestamp=o);const n=await this.publicPostGetFundingRateHistory(this.extend(a,s)),d=this.safeDict(n,"result",{}),h=this.safeList(d,"funding_rate_history",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeInteger(t,"timestamp");c.push({info:t,symbol:r.symbol,fundingRate:this.safeNumber(t,"funding_rate"),timestamp:i,datetime:this.iso8601(i)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,r.symbol,t,i)}async fetchFundingRate(e,t={}){const i=await this.fetchFundingRateHistory(e,void 0,1,t),s=this.safeDict(i,0);return this.parseFundingRate(s)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"timestamp");return{info:e,symbol:i,markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}hashOrderMessage(e){const t=this.hash(this.ethAbiEncode(["bytes32","uint256","uint256","address","bytes32","uint256","address","address"],e),n.lY,"binary"),i=this.safeBool(this.options,"sandboxMode",!1)?"9bcf4dc06df5d8bf23af818d5716491b995020f377d3b7b64c29ed14e3dd1105":"d96e5f90797da7ec8dc4e276260c7f3f87fedf68775fbe1ef116e996fc60441b",s=this.base16ToBinary(i),r=this.base16ToBinary("1901");return this.hash(this.binaryConcat(r,s,t),n.lY,"hex")}signOrder(e,t){const i=this.hashOrderMessage(e);return this.signHash(i.slice(-64),t.slice(-64))}hashMessage(e){const t=this.encode(e),i=this.binaryLength(t),s=this.base16ToBinary("19"),r=this.base16ToBinary("0a"),a=this.binaryConcat(s,this.encode("Ethereum Signed Message:"),r,this.encode(this.numberToString(i)));return"0x"+this.hash(this.binaryConcat(a,t),n.lY,"hex")}signHash(e,t){this.checkRequiredCredentials();const i=(0,h.h1)(e.slice(-64),t.slice(-64),d.bI,void 0),s=i.r,r=i.s,a=this.intToBase16(this.sum(27,i.v));return"0x"+s.padStart(64,"0")+r.padStart(64,"0")+a}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}parseUnits(e,t="1000000000000000000"){return r.Y.stringMul(e,t)}async createOrder(e,t,i,r,a=void 0,o={}){await this.loadMarkets();const d=this.market(e);if(void 0===a)throw new s.ArgumentsRequired(this.id+" createOrder() requires a price argument");let h;[h,o]=this.handleDeriveSubaccountId("createOrder",o);const c=this.safeBool(o,"test",!1),l=this.safeBool2(o,"reduceOnly","reduce_only"),u=this.safeStringLower2(o,"timeInForce","time_in_force"),f=this.safeBool(o,"postOnly"),p=t.toLowerCase(),m=i.toLowerCase(),g=this.milliseconds(),v=this.safeInteger(o,"signature_expiry_sec",this.seconds()+7776e3),y=this.base16ToBinary("4d7a9f27c403ff9c0f19bce61d76d82f9aa29f8d6d4b0c5474607d9770d1af17"),w=this.safeBool(this.options,"sandboxMode",!1)?"0x87F2863866D85E3192a35A73b388BD625D83f2be":"0xB8D20c2B7a1Ad2EE33Bc50eF10876eD3035b5e7b",b=this.numberToString(a);let k;if([k,o]=this.handleOptionAndParams(o,"createOrder","max_fee"),void 0===k)throw new s.ArgumentsRequired(this.id+" createOrder() requires a max_fee argument in params");const S=this.numberToString(k),O=this.numberToString(r),T=this.hash(this.ethAbiEncode(["address","uint","int","int","uint","uint","bool"],[d.info.base_asset_address,this.parseToNumeric(d.info.base_asset_sub_id),this.convertToBigInt(this.parseUnits(b)),this.convertToBigInt(this.parseUnits(this.amountToPrecision(e,O))),this.convertToBigInt(this.parseUnits(S)),h,"buy"===m]),n.lY,"binary");let P;[P,o]=this.handleDeriveWalletAddress("createOrder",o);const I=this.signOrder([y,h,g,w,T,v,P,this.walletAddress],this.privateKey),M={instrument_name:d.id,direction:m,order_type:p,nonce:g,amount:O,limit_price:b,max_fee:S,subaccount_id:h,signature_expiry_sec:v,referral_code:this.safeString(this.options,"id","0x0ad42b8e602c2d3d475ae52d678cf63d84ab2749"),signer:this.walletAddress};if(void 0!==l&&(M.reduce_only=l,l&&f))throw new s.InvalidOrder(this.id+" cannot use reduce only with post only time in force");void 0!==f?M.time_in_force="post_only":void 0!==u&&(M.time_in_force=u);const x=this.safeValue(o,"stopLoss"),A=this.safeValue(o,"takeProfit"),C=this.safeString(o,"trigger_price_type","mark");if(void 0!==x){const e=this.safeString(x,"triggerPrice",x);M.trigger_price=e,M.trigger_type="stoploss",M.trigger_price_type=C}else if(void 0!==A){const e=this.safeString(A,"triggerPrice",A);M.trigger_price=e,M.trigger_type="takeprofit",M.trigger_price_type=C}const B=this.safeString(o,"clientOrderId");let _;void 0!==B&&(M.label=B),M.signature=I,o=this.omit(o,["reduceOnly","reduce_only","timeInForce","time_in_force","postOnly","test","clientOrderId","stopPrice","triggerPrice","trigger_price","stopLoss","takeProfit","trigger_price_type"]),_=c?await this.privatePostOrderDebug(this.extend(M,o)):await this.privatePostOrder(this.extend(M,o));const E=this.safeDict(_,"result");let N=this.safeDict(E,"raw_data");void 0===N&&(N=this.safeDict(E,"order"));const R=this.parseOrder(N,d);return R.type=t,R}async editOrder(e,t,i,r,a=void 0,o=void 0,d={}){await this.loadMarkets();const h=this.market(t);let c;[c,d]=this.handleDeriveSubaccountId("editOrder",d);const l=this.safeBool2(d,"reduceOnly","reduce_only"),u=this.safeStringLower2(d,"timeInForce","time_in_force"),f=this.safeBool(d,"postOnly"),p=i.toLowerCase(),m=r.toLowerCase(),g=this.milliseconds(),v=this.safeNumber(d,"signature_expiry_sec",this.seconds()+7776e3),y=this.base16ToBinary("4d7a9f27c403ff9c0f19bce61d76d82f9aa29f8d6d4b0c5474607d9770d1af17"),w=this.safeBool(this.options,"sandboxMode",!1)?"0x87F2863866D85E3192a35A73b388BD625D83f2be":"0xB8D20c2B7a1Ad2EE33Bc50eF10876eD3035b5e7b",b=this.numberToString(o),k=this.safeString(d,"max_fee","0"),S=this.numberToString(a),O=this.hash(this.ethAbiEncode(["address","uint","int","int","uint","uint","bool"],[h.info.base_asset_address,this.parseToNumeric(h.info.base_asset_sub_id),this.convertToBigInt(this.parseUnits(b)),this.convertToBigInt(this.parseUnits(this.amountToPrecision(t,S))),this.convertToBigInt(this.parseUnits(k)),c,"buy"===m]),n.lY,"binary");let T;[T,d]=this.handleDeriveWalletAddress("editOrder",d);const P=this.signOrder([y,c,g,w,O,v,T,this.walletAddress],this.privateKey),I={instrument_name:h.id,order_id_to_cancel:e,direction:m,order_type:p,nonce:g,amount:S,limit_price:b,max_fee:k,subaccount_id:c,signature_expiry_sec:v,signer:this.walletAddress};if(void 0!==l&&(I.reduce_only=l,l&&f))throw new s.InvalidOrder(this.id+" cannot use reduce only with post only time in force");void 0!==f?I.time_in_force="post_only":void 0!==u&&(I.time_in_force=u);const M=this.safeString(d,"clientOrderId");void 0!==M&&(I.label=M),I.signature=P,d=this.omit(d,["reduceOnly","reduce_only","timeInForce","time_in_force","postOnly","clientOrderId"]);const x=await this.privatePostReplace(this.extend(I,d)),A=this.safeDict(x,"result"),C=this.safeDict(A,"order");return this.parseOrder(C,h)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new s.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const r=this.market(t),a=this.safeBool2(i,"trigger","stop",!1);let o;[o,i]=this.handleDeriveSubaccountId("cancelOrder",i),i=this.omit(i,["trigger","stop"]);const n={instrument_name:r.id,subaccount_id:o},d=this.safeString(i,"clientOrderId"),h=this.safeString(i,"label",d),c=void 0!==h;let l;c?(n.label=h,i=this.omit(i,["clientOrderId","label"]),l=await this.privatePostCancelByLabel(this.extend(n,i))):(n.order_id=e,l=a?await this.privatePostCancelTriggerOrder(this.extend(n,i)):await this.privatePostCancel(this.extend(n,i)));const u={symbol:t},f=this.safeDict(l,"result");return c&&(u.client_order_id=h),this.extend(this.parseOrder(f,r),u)}async cancelAllOrders(e=void 0,t={}){let i,s;await this.loadMarkets(),void 0!==e&&(i=this.market(e)),[s,t]=this.handleDeriveSubaccountId("cancelAllOrders",t);const r={subaccount_id:s};let a;return void 0!==i?(r.instrument_name=i.id,a=await this.privatePostCancelByInstrument(this.extend(r,t))):a=await this.privatePostCancelAll(this.extend(r,t)),a}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchOrders",e,t,i,s,"page",500);const a=this.safeBool2(s,"trigger","stop",!1);let o;s=this.omit(s,["trigger","stop"]),[o,s]=this.handleDeriveSubaccountId("fetchOrders",s);const n={subaccount_id:o};let d;void 0!==e&&(d=this.market(e),n.instrument_name=d.id),n.page_size=void 0!==i?i:500,a&&(n.status="untriggered");const h=await this.privatePostGetOrders(this.extend(n,s)),c=this.safeValue(h,"result"),l=this.safeInteger(s,"page");if(void 0!==l){const e=this.safeDict(c,"pagination");if(l>this.safeInteger(e,"num_pages"))return[]}const u=this.safeList(c,"orders");return this.parseOrders(u,d,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"open"});return await this.fetchOrders(e,t,i,r)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"filled"});return await this.fetchOrders(e,t,i,r)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"cancelled"});return await this.fetchOrders(e,t,i,r)}parseTimeInForce(e){return this.safeString({ioc:"IOC",fok:"FOK",gtc:"GTC",post_only:"PO"},e,void 0)}parseOrderStatus(e){if(void 0!==e){const t={open:"open",untriggered:"open",filled:"closed",cancelled:"canceled",expired:"rejected"};return this.safeString(t,e,e)}return e}parseOrder(e,t=void 0){let i=this.safeDict(e,"data");void 0===i&&(i=e);const s=this.safeInteger(e,"nonce"),r=this.safeString(i,"order_id"),a=this.safeString(i,"instrument_name");void 0!==a&&(t=this.safeMarket(a,t));const o=t.symbol,n=this.safeString(i,"limit_price"),d=this.safeString(i,"average_price"),h=this.safeString(i,"desired_amount"),c=this.safeString(i,"filled_amount"),l=this.safeString(i,"order_fee"),u=this.safeStringLower(i,"order_type"),f=this.safeBool(i,"is_bid");let p=this.safeString(i,"direction");void 0===p&&(p=f?"buy":"sell");const m=this.safeString(i,"trigger_type");let g,v,y;void 0!==m&&(y=this.safeString(i,"trigger_price"),"stoploss"===m?g=y:v=y);const w=this.safeInteger(e,"last_update_timestamp"),b=this.safeString(i,"order_status"),k=this.safeString(i,"time_in_force");return this.safeOrder({id:r,clientOrderId:this.safeString(i,"label"),timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,lastUpdateTimestamp:w,status:this.parseOrderStatus(b),symbol:o,type:u,timeInForce:this.parseTimeInForce(k),postOnly:void 0,reduceOnly:this.safeBool(i,"reduce_only"),side:p,price:n,triggerPrice:y,takeProfitPrice:v,stopLossPrice:g,average:d,amount:h,filled:c,remaining:void 0,cost:void 0,trades:void 0,fee:{cost:l,currency:"USDC"},info:i},t)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),[a,r]=this.handleDeriveSubaccountId("fetchOrderTrades",r);const o={order_id:e,subaccount_id:a};let n;void 0!==t&&(n=this.market(t),o.instrument_name=n.id),void 0!==s&&(o.page_size=s),void 0!==i&&(o.from_timestamp=i);const d=await this.privatePostGetTradeHistory(this.extend(o,r)),h=this.safeDict(d,"result",{}),c=this.safeList(h,"trades",[]);return this.parseTrades(c,n,i,s,r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallIncremental("fetchMyTrades",e,t,i,s,"page",500);[r,s]=this.handleDeriveSubaccountId("fetchMyTrades",s);const o={subaccount_id:r};let n;void 0!==e&&(n=this.market(e),o.instrument_name=n.id),void 0!==i&&(o.page_size=i),void 0!==t&&(o.from_timestamp=t);const d=await this.privatePostGetTradeHistory(this.extend(o,s)),h=this.safeDict(d,"result",{}),c=this.safeInteger(s,"page");if(void 0!==c){const e=this.safeDict(h,"pagination");if(c>this.safeInteger(e,"num_pages"))return[]}const l=this.safeList(h,"trades",[]);return this.parseTrades(l,n,t,i,s)}async fetchPositions(e=void 0,t={}){let i;await this.loadMarkets(),[i,t]=this.handleDeriveSubaccountId("fetchPositions",t);const s={subaccount_id:i};t=this.omit(t,["subaccount_id"]);const r=await this.privatePostGetPositions(this.extend(s,t)),a=this.safeDict(r,"result",{}),o=this.safeList(a,"positions",[]);return this.parsePositions(o,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"instrument_name");t=this.safeMarket(i,t);let s,a=this.safeString(e,"amount");s=r.Y.stringGt(a,"0")?"long":"short";const o=this.safeString(t,"contractSize"),n=this.safeString(e,"mark_price"),d=this.safeInteger(e,"creation_timestamp"),h=this.safeString(e,"unrealized_pnl");a=r.Y.stringAbs(a);const c=r.Y.stringMul(a,n);return this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:d,datetime:this.iso8601(d),lastUpdateTimestamp:void 0,initialMargin:this.safeString(e,"initial_margin"),initialMarginPercentage:void 0,maintenanceMargin:this.safeString(e,"maintenance_margin"),maintenanceMarginPercentage:void 0,entryPrice:void 0,notional:this.parseNumber(c),leverage:this.safeNumber(e,"leverage"),unrealizedPnl:this.parseNumber(h),contracts:this.parseNumber(a),contractSize:this.parseNumber(o),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"liquidation_price"),markPrice:this.parseNumber(n),lastPrice:void 0,collateral:void 0,marginMode:void 0,side:s,percentage:void 0,hedged:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingHistory","paginate"),a)return await this.fetchPaginatedCallIncremental("fetchFundingHistory",e,t,i,s,"page",500);[r,s]=this.handleDeriveSubaccountId("fetchFundingHistory",s);const o={subaccount_id:r};let n;void 0!==e&&(n=this.market(e),o.instrument_name=n.id),void 0!==t&&(o.start_timestamp=t),void 0!==i&&(o.page_size=i);const d=await this.privatePostGetFundingHistory(this.extend(o,s)),h=this.safeDict(d,"result",{}),c=this.safeInteger(s,"page");if(void 0!==c){const e=this.safeDict(h,"pagination");if(c>this.safeInteger(e,"num_pages"))return[]}const l=this.safeList(h,"events",[]);return this.parseIncomes(l,n,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"instrument_name"),s=this.safeSymbol(i,t),r=this.safeString(e,"funding"),a=this.safeCurrencyCode("USDC"),o=this.safeInteger(e,"timestamp");return{info:e,symbol:s,code:a,timestamp:o,datetime:this.iso8601(o),id:void 0,amount:void 0,rate:r}}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleDeriveWalletAddress("fetchBalance",e);const i={wallet:t},s=await this.privatePostGetAllPortfolios(this.extend(i,e)),r=this.safeList(s,"result");return this.parseBalance(r)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeList(s,"collaterals",[]);for(let e=0;e<r.length;e++){const i=r[e],s=this.safeCurrencyCode(this.safeString(i,"currency")),a=this.account();a.total=this.safeString(i,"amount"),t[s]=a}}return this.safeBalance(t)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handleDeriveSubaccountId("fetchDeposits",s);const a={subaccount_id:r};void 0!==t&&(a.start_timestamp=t);const o=await this.privatePostGetDepositHistory(this.extend(a,s)),n=this.safeCurrency(e),d=this.safeDict(o,"result",{}),h=this.safeList(d,"events");return this.parseTransactions(h,n,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handleDeriveSubaccountId("fetchWithdrawals",s);const a={subaccount_id:r};void 0!==t&&(a.start_timestamp=t);const o=await this.privatePostGetWithdrawalHistory(this.extend(a,s)),n=this.safeCurrency(e),d=this.safeDict(o,"result",{}),h=this.safeList(d,"events");return this.parseTransactions(h,n,t,i,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"asset"),s=this.safeInteger(e,"timestamp");let r=this.safeString(e,"tx_hash");return"0x0"===r&&(r=void 0),{info:e,id:void 0,txid:r,timestamp:s,datetime:this.iso8601(s),address:void 0,addressFrom:void 0,addressTo:void 0,tag:void 0,tagFrom:void 0,tagTo:void 0,type:void 0,amount:this.safeNumber(e,"amount"),currency:i,status:this.parseTransactionStatus(this.safeString(e,"tx_status")),updated:void 0,comment:void 0,internal:void 0,fee:void 0,network:void 0}}parseTransactionStatus(e){return this.safeString({settled:"ok",reverted:"failed"},e,e)}handleDeriveSubaccountId(e,t){let i;if([i,t]=this.handleOptionAndParams(t,e,"subaccount_id"),void 0!==i&&""!==i)return this.options.subaccount_id=i,[i,t];const r=this.safeString(this.options,"subaccount_id");if(void 0!==r)return[r,t];throw new s.ArgumentsRequired(this.id+" "+e+"() requires a subaccount_id parameter inside 'params' or exchange.options['subaccount_id']=ID.")}handleDeriveWalletAddress(e,t){let i;if([i,t]=this.handleOptionAndParams(t,e,"deriveWalletAddress"),void 0!==i&&""!==i)return this.options.deriveWalletAddress=i,[i,t];const r=this.safeString(this.options,"deriveWalletAddress");if(void 0!==r)return[r,t];throw new s.ArgumentsRequired(this.id+" "+e+"() requires a deriveWalletAddress parameter inside 'params' or exchange.options['deriveWalletAddress'] = ADDRESS, the address can find in HOME => Developers tab.")}handleErrors(e,t,i,r,a,o,n,d,h){if(!n)return;const c=this.safeDict(n,"error");if(void 0!==c){const e=this.safeString(c,"code"),t=this.id+" "+this.json(n);throw this.throwBroadlyMatchedException(this.exceptions.broad,o,t),this.throwExactlyMatchedException(this.exceptions.exact,e,t),new s.ExchangeError(t)}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.urls.api[t]+"/"+e;if("POST"===i){if(r={"Content-Type":"application/json"},"private"===t){const e=this.milliseconds().toString(),t=this.signMessage(e,this.privateKey);r["X-LyraWallet"]=this.safeString(this.options,"deriveWalletAddress"),r["X-LyraTimestamp"]=e,r["X-LyraSignature"]=t}a=this.json(s)}return{url:o,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"digifinex",name:"DigiFinex",countries:["SG"],version:"v3",rateLimit:900,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!0,cancelOrder:!0,cancelOrders:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!0,fetchCrossBorrowRates:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!0,fetchMarginMode:!1,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransfers:!0,fetchWithdrawals:!0,reduceMargin:!0,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D","1w":"1W"},urls:{logo:"https://user-images.githubusercontent.com/51840849/87443315-01283a00-c5fe-11ea-8628-c2a0feaf07ac.jpg",api:{rest:"https://openapi.digifinex.com"},www:"https://www.digifinex.com",doc:["https://docs.digifinex.com"],fees:"https://digifinex.zendesk.com/hc/en-us/articles/360000328422-Fee-Structure-on-DigiFinex",referral:"https://www.digifinex.com/en-ww/from/DhOzBg?channelCode=ljaUPp"},api:{public:{spot:{get:["{market}/symbols","kline","margin/currencies","margin/symbols","markets","order_book","ping","spot/symbols","time","trades","trades/symbols","ticker","currencies"]},swap:{get:["public/api_weight","public/candles","public/candles_history","public/depth","public/funding_rate","public/funding_rate_history","public/instrument","public/instruments","public/ticker","public/tickers","public/time","public/trades"]}},private:{spot:{get:["{market}/financelog","{market}/mytrades","{market}/order","{market}/order/detail","{market}/order/current","{market}/order/history","margin/assets","margin/financelog","margin/mytrades","margin/order","margin/order/current","margin/order/history","margin/positions","otc/financelog","spot/assets","spot/financelog","spot/mytrades","spot/order","spot/order/current","spot/order/history","deposit/address","deposit/history","withdraw/history"],post:["{market}/order/cancel","{market}/order/new","{market}/order/batch_new","margin/order/cancel","margin/order/new","margin/position/close","spot/order/cancel","spot/order/new","transfer","withdraw/new","withdraw/cancel"]},swap:{get:["account/balance","account/positions","account/finance_record","account/trading_fee_rate","account/transfer_record","account/funding_fee","trade/history_orders","trade/history_trades","trade/open_orders","trade/order_info"],post:["account/transfer","account/leverage","account/position_mode","account/position_margin","trade/batch_cancel_order","trade/batch_order","trade/cancel_order","trade/order_place","follow/sponsor_order","follow/close_order","follow/cancel_order","follow/user_center_current","follow/user_center_history","follow/expert_current_open_order","follow/add_algo","follow/cancel_algo","follow/account_available","follow/plan_task","follow/instrument_list"]}}},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:{max:10},fetchMyTrades:{marginMode:!0,limit:500,daysBack:1e5,untilDays:30,symbolRequired:!1},fetchOrder:{marginMode:!0,trigger:!1,trailing:!1,marketType:!0,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!0,limit:100,daysBack:1e5,untilDays:30,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:void 0,fetchOHLCV:{limit:500}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrders:{max:20,marginMode:!1},fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5},fetchOrder:{marginMode:!1},fetchOpenOrders:{marginMode:!1,limit:100},fetchOrders:{marginMode:!1,daysBack:1e5},fetchOHLCV:{limit:100}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},precisionMode:a.kb,exceptions:{exact:{10001:[r.BadRequest,"Wrong request method, please check it's a GET ot POST request"],10002:[r.AuthenticationError,"Invalid ApiKey"],10003:[r.AuthenticationError,"Sign doesn't match"],10004:[r.BadRequest,"Illegal request parameters"],10005:[r.DDoSProtection,"Request frequency exceeds the limit"],10006:[r.PermissionDenied,"Unauthorized to execute this request"],10007:[r.PermissionDenied,"IP address Unauthorized"],10008:[r.InvalidNonce,"Timestamp for this request is invalid, timestamp must within 1 minute"],10009:[r.NetworkError,"Unexist endpoint, please check endpoint URL"],10011:[r.AccountSuspended,"ApiKey expired. Please go to client side to re-create an ApiKey"],20001:[r.PermissionDenied,"Trade is not open for this trading pair"],20002:[r.PermissionDenied,"Trade of this trading pair is suspended"],20003:[r.InvalidOrder,"Invalid price or amount"],20007:[r.InvalidOrder,"Price precision error"],20008:[r.InvalidOrder,"Amount precision error"],20009:[r.InvalidOrder,"Amount is less than the minimum requirement"],20010:[r.InvalidOrder,"Cash Amount is less than the minimum requirement"],20011:[r.InsufficientFunds,"Insufficient balance"],20012:[r.BadRequest,"Invalid trade type, valid value: buy/sell)"],20013:[r.InvalidOrder,"No order info found"],20014:[r.BadRequest,"Invalid date, Valid format: 2018-07-25)"],20015:[r.BadRequest,"Date exceeds the limit"],20018:[r.PermissionDenied,"Your trading rights have been banned by the system"],20019:[r.BadSymbol,'Wrong trading pair symbol. Correct format:"usdt_btc". Quote asset is in the front'],20020:[r.DDoSProtection,"You have violated the API operation trading rules and temporarily forbid trading. At present, we have certain restrictions on the user's transaction rate and withdrawal rate."],5e4:[r.ExchangeError,"Exception error"],20021:[r.BadRequest,"Invalid currency"],20022:[r.BadRequest,"The ending timestamp must be larger than the starting timestamp"],20023:[r.BadRequest,"Invalid transfer type"],20024:[r.BadRequest,"Invalid amount"],20025:[r.BadRequest,"This currency is not transferable at the moment"],20026:[r.InsufficientFunds,"Transfer amount exceed your balance"],20027:[r.PermissionDenied,"Abnormal account status"],20028:[r.PermissionDenied,"Blacklist for transfer"],20029:[r.PermissionDenied,"Transfer amount exceed your daily limit"],20030:[r.BadRequest,"You have no position on this trading pair"],20032:[r.PermissionDenied,"Withdrawal limited"],20033:[r.BadRequest,"Wrong Withdrawal ID"],20034:[r.PermissionDenied,"Withdrawal service of this crypto has been closed"],20035:[r.PermissionDenied,"Withdrawal limit"],20036:[r.ExchangeError,"Withdrawal cancellation failed"],20037:[r.InvalidAddress,"The withdrawal address, Tag or chain type is not included in the withdrawal management list"],20038:[r.InvalidAddress,"The withdrawal address is not on the white list"],20039:[r.ExchangeError,"Can't be canceled in current status"],20040:[r.RateLimitExceeded,"Withdraw too frequently; limitation: 3 times a minute, 100 times a day"],20041:[r.PermissionDenied,"Beyond the daily withdrawal limit"],20042:[r.BadSymbol,"Current trading pair does not support API trading"],400002:[r.BadRequest,"Invalid Parameter"]},broad:{}},options:{defaultType:"spot",types:["spot","margin","otc"],createMarketBuyOrderRequiresPrice:!0,accountsByType:{spot:"1",margin:"2",OTC:"3"},networks:{ARBITRUM:"Arbitrum",AVALANCEC:"AVAX-CCHAIN",AVALANCEX:"AVAX-XCHAIN",BEP20:"BEP20",BSC:"BEP20",CARDANO:"Cardano",CELO:"Celo",CHILIZ:"Chiliz",COSMOS:"COSMOS",CRC20:"Crypto.com",CRONOS:"Crypto.com",DOGECOIN:"DogeChain",ERC20:"ERC20",ETH:"ERC20",ETHW:"ETHW",IOTA:"MIOTA",KLAYTN:"KLAY",MATIC:"Polygon",METIS:"MetisDAO",MOONBEAM:"GLMR",MOONRIVER:"Moonriver",OPTIMISM:"OPETH",POLYGON:"Polygon",RIPPLE:"XRP",SOLANA:"SOL",STELLAR:"Stella",TERRACLASSIC:"TerraClassic",TERRA:"Terra",TON:"Ton",TRC20:"TRC20",TRON:"TRC20",TRX:"TRC20",VECHAIN:"Vechain"}},commonCurrencies:{BHT:"Black House Test",EPS:"Epanus",FREE:"FreeRossDAO",MBN:"Mobilian Coin",TEL:"TEL666"}})}async fetchCurrencies(e={}){const t=await this.publicSpotGetCurrencies(e),i=this.safeValue(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeCurrencyCode(r),n=this.safeInteger(t,"deposit_status",1)>0,d=this.safeInteger(t,"withdraw_status",1)>0,h=n&&d,c=this.safeString(t,"min_withdraw_fee"),l=this.safeString(t,"min_withdraw_amount"),u=this.safeString(t,"min_deposit_amount"),f=this.parseNumber(u),p=this.parseNumber(l),m=this.parseNumber(c),g=o.Y.stringMin(c,o.Y.stringMin(u,l)),v=this.parseNumber(g),y=this.safeString(t,"chain");let w;void 0!==y&&(w=this.networkIdToCode(y));const b={info:t,id:y,network:w,active:h,fee:m,precision:v,deposit:n,withdraw:d,limits:{amount:{min:void 0,max:void 0},withdraw:{min:p,max:void 0},deposit:{min:f,max:void 0}}};if(a in s){let e=s[a].info;Array.isArray(e)?e.push(t):e=[e,t],d&&(s[a].withdraw=!0,s[a].limits.withdraw.min=Math.min(s[a].limits.withdraw.min,p)),n&&(s[a].deposit=!0,s[a].limits.deposit.min=Math.min(s[a].limits.deposit.min,f)),h&&(s[a].active=!0)}else s[a]={id:r,code:a,info:t,type:void 0,name:void 0,active:h,deposit:n,withdraw:d,fee:this.parseNumber(c),precision:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:p,max:void 0},deposit:{min:f,max:void 0}},networks:{}};void 0!==y?s[a].networks[y]=b:(s[a].active=h,s[a].fee=this.parseNumber(c),s[a].deposit=n,s[a].withdraw=d,s[a].limits={amount:{min:void 0,max:void 0},withdraw:{min:p,max:void 0},deposit:{min:f,max:void 0}}),s[a].precision=void 0===s[a].precision?v:Math.max(s[a].precision,v)}return s}async fetchMarkets(e={}){const t=this.safeValue(this.options,"fetchMarkets",{});return"fetch_markets_v2"===this.safeString(t,"method","fetch_markets_v2")?await this.fetchMarketsV2(e):await this.fetchMarketsV1(e)}async fetchMarketsV2(e={}){const t=this.safeString(this.options,"defaultType"),[i,s]=this.handleMarginModeAndParams("fetchMarketsV2",e),r=[];void 0!==i?r.push(this.publicSpotGetMarginSymbols(s)):r.push(this.publicSpotGetTradesSymbols(s)),r.push(this.publicSwapGetPublicInstruments(e));const a=await Promise.all(r),o=a[0],n=a[1],d=this.safeValue(o,"symbol_list",[]),h=this.safeValue(n,"data",[]),c=this.arrayConcat(d,h),l=[];for(let e=0;e<c.length;e++){const s=c[e],r=this.safeString2(s,"symbol","instrument_id"),a=this.safeString2(s,"base_asset","base_currency"),o=this.safeString2(s,"quote_asset","quote_currency"),n=this.safeString(s,"clear_currency"),d=this.safeCurrencyCode(a),h=this.safeCurrencyCode(o),u=this.safeCurrencyCode(n);let f=this.safeInteger(s,"is_allow",1),p="margin"===t?"margin":"spot";const m=void 0===u,g=!m,v=void 0!==i||void 0;let y,w,b=d+"/"+h;if(g){p="swap",b=d+"/"+h+":"+u,y=this.safeValue(s,"is_inverse"),w=!y;this.safeValue(s,"isTrading")&&(f=1)}l.push({id:r,symbol:b,base:d,quote:h,settle:u,baseId:a,quoteId:o,settleId:n,type:p,spot:m,margin:v,swap:g,future:!1,option:!1,active:!!f,contract:g,linear:w,inverse:y,contractSize:this.safeNumber(s,"contract_value"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(s,"amount_precision"))),price:this.parseNumber(this.parsePrecision(this.safeString(s,"price_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber2(s,"minimum_amount","min_order_amount"),max:void 0},price:{min:this.safeNumber(s,"tick_size"),max:void 0},cost:{min:this.safeNumber(s,"minimum_value"),max:void 0}},created:void 0,info:s})}return l}async fetchMarketsV1(e={}){const t=await this.publicSpotGetMarkets(e),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"market"),[a,o]=r.split("_"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o);s.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:void 0,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{price:this.parseNumber(this.parsePrecision(this.safeString(t,"price_precision"))),amount:this.parseNumber(this.parsePrecision(this.safeString(t,"volume_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"min_volume"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"min_amount"),max:void 0}},info:t})}return s}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),n=this.account(),d=this.safeString2(s,"free","avail_balance"),h=this.safeString2(s,"total","equity");n.free=d,n.used=o.Y.stringSub(h,d),n.total=h,t[a]=n}return this.safeBalance(t)}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const[i,s]=this.handleMarginModeAndParams("fetchBalance",e);let a;if(void 0!==i||"margin"===t)t="margin",a=await this.privateSpotGetMarginAssets(s);else if("spot"===t)a=await this.privateSpotGetSpotAssets(s);else{if("swap"!==t)throw new r.NotSupported(this.id+" fetchBalance() not support this market type");a=await this.privateSwapGetAccountBalance(s)}const o="swap"===t?"data":"list",n=this.safeValue(a,o,[]);return this.parseBalance(n)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),[r,a]=this.handleMarketTypeAndParams("fetchOrderBook",s,i),o={};let n,d,h;return void 0!==t&&(o.limit=t),"swap"===r?(o.instrument_id=s.id,n=await this.publicSwapGetPublicDepth(this.extend(o,a))):(o.symbol=s.id,n=await this.publicSpotGetOrderBook(this.extend(o,a))),"swap"===r?(h=this.safeValue(n,"data",{}),d=this.safeInteger(h,"timestamp")):(h=n,d=this.safeTimestamp(n,"date")),this.parseOrderBook(h,s.symbol,d)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString(e,0);let s,r;void 0!==i&&(s=this.market(i)),[r,t]=this.handleMarketTypeAndParams("fetchTickers",s,t);const a={};let o;o="swap"===r?await this.publicSwapGetPublicTickers(this.extend(a,t)):await this.publicSpotGetTicker(this.extend(a,t));const n={},d=this.safeValue2(o,"ticker","data",[]),h=this.safeInteger(o,"date");for(let e=0;e<d.length;e++){const t=this.extend({date:h},d[e]),i=this.parseTicker(t);n[i.symbol]=i}return this.filterByArrayTickers(n,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={};let r;i.swap?(s.instrument_id=i.id,r=await this.publicSwapGetPublicTicker(this.extend(s,t))):(s.symbol=i.id,r=await this.publicSpotGetTicker(this.extend(s,t)));const a=this.safeInteger(r,"date"),o=this.safeValue(r,"ticker",[]),n=this.safeValue(r,"data",{}),d=this.safeValue(o,0,{});let h;return h=i.swap?n:this.extend({date:a},d),this.parseTicker(h,i)}parseTicker(e,t=void 0){const i=this.safeNumber(e,"index_price"),s=void 0!==i?"contract":"spot",r=this.safeStringUpper2(e,"symbol","instrument_id"),a=this.safeSymbol(r,t,void 0,s);t=this.safeMarket(r,t,void 0,s);let o=this.safeTimestamp(e,"date");t.swap&&(o=this.safeInteger(e,"timestamp"));const n=this.safeString(e,"last");return this.safeTicker({symbol:a,timestamp:o,datetime:this.iso8601(o),high:this.safeString2(e,"high","high_24h"),low:this.safeString2(e,"low","low_24h"),bid:this.safeString2(e,"buy","best_bid"),bidVolume:this.safeString(e,"best_bid_size"),ask:this.safeString2(e,"sell","best_ask"),askVolume:this.safeString(e,"best_ask_size"),vwap:void 0,open:this.safeString(e,"open_24h"),close:n,last:n,previousClose:void 0,change:void 0,percentage:this.safeString2(e,"change","price_change_percent"),average:void 0,baseVolume:this.safeString2(e,"vol","volume_24h"),quoteVolume:this.safeString(e,"base_vol"),markPrice:this.safeString(e,"mark_price"),indexPrice:i,info:e},t)}parseTrade(e,t=void 0){const i=this.safeString2(e,"id","trade_id"),s=this.safeString(e,"order_id"),r=this.safeString(e,"price"),a=this.safeStringN(e,["amount","volume","size"]),o=this.safeStringUpper2(e,"symbol","instrument_id"),n=this.safeSymbol(o,t);void 0===t&&(t=this.safeMarket(o));let d,h,c,l=this.safeTimestamp2(e,"date","timestamp"),u=this.safeString2(e,"type","side");if("swap"===t.type){l=this.safeInteger(e,"trade_time");const t=this.safeString(e,"order_type"),i=this.safeString(e,"match_role"),s=this.safeString(e,"direction");void 0!==t&&(d="0"===t?"limit":void 0),h="1"===i?"taker":"2"===i?"maker":void 0,"1"===u||"1"===s?u="buy":"2"===u||"2"===s||"3"===u||"3"===s?u="sell":"4"!==u&&"4"!==s||(u="buy")}else{const t=u.split("_");u=this.safeString(t,0),d=this.safeString(t,1),void 0===d&&(d="limit");h=this.safeValue(e,"is_maker")?"maker":"taker"}const f=this.safeString(e,"fee");if(void 0!==f){const t=this.safeString(e,"fee_currency");let i;void 0!==t&&(i=this.safeCurrencyCode(t)),c={cost:f,currency:i}}return this.safeTrade({id:i,info:e,timestamp:l,datetime:this.iso8601(l),symbol:n,type:d,order:s,side:u,price:r,amount:a,cost:void 0,takerOrMaker:h,fee:c},t)}async fetchTime(e={}){const t=await this.publicSpotGetTime(e);return this.safeTimestamp(t,"server_time")}async fetchStatus(e={}){const t=await this.publicSpotGetPing(e);return{status:0===this.safeInteger(t,"code")?"ok":"maintenance",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={};let o;void 0!==i&&(a.limit=r.swap?Math.min(i,100):i),r.swap?(a.instrument_id=r.id,o=await this.publicSwapGetPublicTrades(this.extend(a,s))):(a.symbol=r.id,o=await this.publicSpotGetTrades(this.extend(a,s)));const n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}parseOHLCV(e,t=void 0){return t.swap?[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]:[this.safeTimestamp(e,0),this.safeNumber(e,5),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,1)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={};let n,d;if(a.swap)o.instrument_id=a.id,o.granularity=t,void 0!==s&&(o.limit=Math.min(s,100)),n=await this.publicSwapGetPublicCandles(this.extend(o,r));else{const e=this.safeInteger(r,"until");o.symbol=a.id,o.period=this.safeString(this.timeframes,t,t);let d=i;const h=this.parseTimeframe(t);if(void 0===d&&(void 0!==s||void 0!==e)){d=(void 0!==e?e:this.milliseconds())-(void 0!==s?s:200)*h*1e3}if(void 0!==d&&(d=this.parseToInt(d/1e3),o.start_time=d,void 0!==s||void 0!==e))if(void 0!==e){const t=this.parseToInt(e/1e3);if(void 0!==s){const e=this.sum(d,s*h);o.end_time=Math.min(e,t)}else o.end_time=t}else o.end_time=this.sum(d,s*h);r=this.omit(r,"until"),n=await this.publicSpotGetKline(this.extend(o,r))}if(a.swap){const e=this.safeValue(n,"data",{});d=this.safeValue(e,"candles",[])}else d=this.safeValue(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.handleMarginModeAndParams("createOrder",a)[0],d=this.createOrderRequest(e,t,i,s,r,a);let h;h=o.swap?await this.privateSwapPostTradeOrderPlace(d):void 0!==n?await this.privateSpotPostMarginOrderNew(d):await this.privateSpotPostSpotOrderNew(d);const c=this.parseOrder(h,o);return c.symbol=o.symbol,c.type=t,c.side=i,c.amount=s,c.price=r,c}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s,a;for(let t=0;t<e.length;t++){const o=e[t],n=this.safeString(o,"symbol");if(void 0===s)s=n;else if(s!==n)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const d=this.safeString(o,"type"),h=this.safeString(o,"side"),c=this.safeValue(o,"amount"),l=this.safeValue(o,"price"),u=this.safeValue(o,"params",{}),f=this.handleMarginModeAndParams("createOrders",u)[0];if(void 0!==f)if(void 0===a)a=f;else if(a!==f)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same margin mode (isolated or cross)");const p=this.createOrderRequest(n,d,h,c,l,u);i.push(p)}const o=this.market(s),n={};let d;o.swap?d=await this.privateSwapPostTradeBatchOrder(i):(n.market=void 0!==a?"margin":"spot",n.symbol=o.id,n.list=this.json(i),d=await this.privateSpotPostMarketOrderBatchNew(n));let h=[];h=o.swap?this.safeValue(d,"data",[]):this.safeValue(d,"order_ids",[]);const c=[];for(let t=0;t<e.length;t++){const i=e[t],s={};s.order_id=h[t],s.instrument_id=o.id,s.amount=this.safeNumber(i,"amount"),s.price=this.safeNumber(i,"price"),c.push(s)}return this.parseOrders(c,o)}createOrderRequest(e,t,i,s,a=void 0,n={}){const d=this.market(e);let h,c;[h,n]=this.handleMarketTypeAndParams("createOrderRequest",d,n),[c,n]=this.handleMarginModeAndParams("createOrderRequest",n),void 0!==c&&(h="margin");const l={},u="swap"===h,f="market"===t,p="limit"===t;l[u?"instrument_id":"symbol"]=d.id;let m,g=this.isPostOnly(f,!1,n);if(u){const t=this.safeBool(n,"reduceOnly",!1),r=this.safeString(n,"timeInForce");let o;if("buy"===i){const e=t?4:1;l.type=e}else{const e=t?3:2;l.type=e}p&&(o=0),"FOK"===r?o=f?15:9:"IOC"===r?o=f?13:4:"GTC"===r||f?o=14:"PO"===r&&(g=!0),void 0!==a&&(l.price=this.priceToPrecision(e,a)),l.order_type=o,l.size=s,n=this.omit(n,["reduceOnly","timeInForce"])}else{m=!0===g?1:2,l.market=h;let d,c="";"market"===t?c="_market":l.price=this.priceToPrecision(e,a),l.type=i+c;let u=!0;if([u,n]=this.handleOptionAndParams(n,"createOrderRequest","createMarketBuyOrderRequiresPrice",!0),f&&"buy"===i){const t=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==t)d=this.costToPrecision(e,t);else if(u){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const t=this.numberToString(s),i=this.numberToString(a),r=this.parseNumber(o.Y.stringMul(t,i));d=this.costToPrecision(e,r)}}else d=this.costToPrecision(e,s)}else d=this.amountToPrecision(e,s);l.amount=d}return g&&(l.post_only=m||g),n=this.omit(n,["postOnly"]),this.extend(l,n)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async cancelOrder(e,t=void 0,i={}){let s,a;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),e=e.toString(),[a,i]=this.handleMarketTypeAndParams("cancelOrder",s,i);const o={order_id:e};if("swap"===a){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");o.instrument_id=s.id}else o.market=a;const[n,d]=this.handleMarginModeAndParams("cancelOrder",i);let h;if(void 0!==n||"margin"===a)a="margin",h=await this.privateSpotPostMarginOrderCancel(this.extend(o,d));else if("spot"===a)h=await this.privateSpotPostSpotOrderCancel(this.extend(o,d));else{if("swap"!==a)throw new r.NotSupported(this.id+" cancelOrder() not support this market type");h=await this.privateSwapPostTradeCancelOrder(this.extend(o,d))}if("spot"===a||"margin"===a){if(1!==this.safeValue(h,"success",[]).length)throw new r.OrderNotFound(this.id+" cancelOrder() "+e+" not found");const t=this.parseCancelOrders(h);return this.safeDict(t,0)}return this.safeOrder({info:h,orderId:this.safeString(h,"data")})}parseCancelOrders(e){const t=this.safeList(e,"success"),i=this.safeList(e,"error"),s=[];for(let e=0;e<t.length;e++){const i=t[e];s.push(this.safeOrder({info:i,id:i,status:"canceled"}))}for(let e=0;e<i.length;e++){const t=i[e];s.push(this.safeOrder({info:t,id:this.safeString2(t,"order-id","order_id"),status:"failed",clientOrderId:this.safeString(t,"client-order-id")}))}return s}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeString(this.options,"defaultType","spot"),r=this.safeString(i,"type",s);i=this.omit(i,"type");const a={market:r,order_id:e.join(",")},o=await this.privateSpotPostSpotOrderCancel(this.extend(a,i));return this.parseCancelOrders(o)}parseOrderStatus(e){return this.safeString({0:"open",1:"open",2:"closed",3:"canceled",4:"canceled"},e,e)}parseOrder(e,t=void 0){let i,s,r,a,o=this.safeString(e,"type");const n=this.safeString2(e,"symbol","instrument_id"),d=this.safeSymbol(n,t);if("swap"===(t=this.market(d)).type){const t=this.safeInteger(e,"order_type");void 0!==t&&(9===t||10===t||11===t||12===t||15===t?r="FOK":1===t||2===t||3===t||4===t||13===t?r="IOC":6!==t&&7!==t&&8!==t&&14!==t||(r="GTC"),a=0===t||1===t||4===t||5===t||9===t||10===t?"limit":"market"),"1"===o?o="open long":"2"===o?o="open short":"3"===o?o="close long":"4"===o&&(o="close short"),i=this.safeInteger(e,"insert_time"),s=this.safeInteger(e,"time_stamp")}else if(i=this.safeTimestamp(e,"created_date"),s=this.safeTimestamp(e,"finished_date"),void 0!==o){const e=o.split("_");e.length>1?(o=e[0],a=e[1]):a="limit"}return this.safeOrder({info:e,id:this.safeString2(e,"order_id","data"),clientOrderId:void 0,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:s,symbol:d,type:a,timeInForce:r,postOnly:void 0,side:o,price:this.safeNumber(e,"price"),triggerPrice:void 0,amount:this.safeNumber2(e,"amount","size"),filled:this.safeNumber2(e,"executed_amount","filled_qty"),remaining:void 0,cost:void 0,average:this.safeNumber2(e,"avg_price","price_avg"),status:this.parseOrderStatus(this.safeString2(e,"status","state")),fee:{cost:this.safeNumber(e,"fee")},trades:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a,o;await this.loadMarkets(),void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchOpenOrders",a,s);const[n,d]=this.handleMarginModeAndParams("fetchOpenOrders",s),h={},c="swap"===o;if(c?(void 0!==t&&(h.start_timestamp=t),void 0!==i&&(h.limit=i)):h.market=o,void 0!==a){h[c?"instrument_id":"symbol"]=a.id}let l;if(void 0!==n||"margin"===o)o="margin",l=await this.privateSpotGetMarginOrderCurrent(this.extend(h,d));else if("spot"===o)l=await this.privateSpotGetSpotOrderCurrent(this.extend(h,d));else{if("swap"!==o)throw new r.NotSupported(this.id+" fetchOpenOrders() not support this market type");l=await this.privateSwapGetTradeOpenOrders(this.extend(h,d))}const u=this.safeList(l,"data",[]);return this.parseOrders(u,a,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){let a,o;await this.loadMarkets(),void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchOrders",a,s);const[n,d]=this.handleMarginModeAndParams("fetchOrders",s),h={};if("swap"===o?void 0!==t&&(h.start_timestamp=t):(h.market=o,void 0!==t&&(h.start_time=this.parseToInt(t/1e3))),void 0!==a){h["swap"===o?"instrument_id":"symbol"]=a.id}let c;if(void 0!==i&&(h.limit=i),void 0!==n||"margin"===o)o="margin",c=await this.privateSpotGetMarginOrderHistory(this.extend(h,d));else if("spot"===o)c=await this.privateSpotGetSpotOrderHistory(this.extend(h,d));else{if("swap"!==o)throw new r.NotSupported(this.id+" fetchOrders() not support this market type");c=await this.privateSwapGetTradeHistoryOrders(this.extend(h,d))}const l=this.safeList(c,"data",[]);return this.parseOrders(l,a,t,i)}async fetchOrder(e,t=void 0,i={}){let s,a;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),[a,i]=this.handleMarketTypeAndParams("fetchOrder",s,i);const[o,n]=this.handleMarginModeAndParams("fetchOrder",i),d={order_id:e};let h;if("swap"===a?void 0!==s&&(d.instrument_id=s.id):d.market=a,void 0!==o||"margin"===a)a="margin",h=await this.privateSpotGetMarginOrder(this.extend(d,n));else if("spot"===a)h=await this.privateSpotGetSpotOrder(this.extend(d,n));else{if("swap"!==a)throw new r.NotSupported(this.id+" fetchOrder() not support this market type");h=await this.privateSwapGetTradeOrderInfo(this.extend(d,n))}const c=this.safeValue(h,"data"),l="swap"===a?c:this.safeValue(c,0);if(void 0===l)throw new r.OrderNotFound(this.id+" fetchOrder() order "+e.toString()+" not found");return this.parseOrder(l,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets();const o={};let n;void 0!==e&&(a=this.market(e)),[n,s]=this.handleMarketTypeAndParams("fetchMyTrades",a,s);const[d,h]=this.handleMarginModeAndParams("fetchMyTrades",s);"swap"===n?void 0!==t&&(o.start_timestamp=t):(o.market=n,void 0!==t&&(o.start_time=this.parseToInt(t/1e3)));let c;if(void 0!==e&&(o["swap"===n?"instrument_id":"symbol"]=a.id),void 0!==i&&(o.limit=i),void 0!==d||"margin"===n)n="margin",c=await this.privateSpotGetMarginMytrades(this.extend(o,h));else if("spot"===n)c=await this.privateSpotGetSpotMytrades(this.extend(o,h));else{if("swap"!==n)throw new r.NotSupported(this.id+" fetchMyTrades() not support this market type");c=await this.privateSwapGetTradeHistoryTrades(this.extend(o,h))}const l="swap"===n?"data":"list",u=this.safeList(c,l,[]);return this.parseTrades(u,a,t,i)}parseLedgerEntryType(e){return this.safeString({},e,e)}parseLedgerEntry(e,t=void 0){const i=this.parseLedgerEntryType(this.safeString2(e,"type","finance_type")),s=this.safeString2(e,"currency_mark","currency"),r=this.safeCurrencyCode(s,t);t=this.safeCurrency(s,t);const a=this.safeNumber2(e,"num","change"),o=this.safeNumber(e,"balance");let n=this.safeTimestamp(e,"time");return void 0===n&&(n=this.safeInteger(e,"timestamp")),this.safeLedgerEntry({info:e,id:void 0,direction:void 0,account:void 0,referenceId:void 0,referenceAccount:void 0,type:i,currency:r,amount:a,before:void 0,after:o,status:void 0,timestamp:n,datetime:this.iso8601(n),fee:void 0},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;[o,s]=this.handleMarketTypeAndParams("fetchLedger",void 0,s);const[n,d]=this.handleMarginModeAndParams("fetchLedger",s);"swap"===o?void 0!==t&&(a.start_timestamp=t):(a.market=o,void 0!==t&&(a.start_time=this.parseToInt(t/1e3)));const h="swap"===o?"currency":"currency_mark";let c,l,u;if(void 0!==e&&(c=this.currency(e),a[h]=c.id),void 0!==i&&(a.limit=i),void 0!==n||"margin"===o)o="margin",l=await this.privateSpotGetMarginFinancelog(this.extend(a,d));else if("spot"===o)l=await this.privateSpotGetSpotFinancelog(this.extend(a,d));else{if("swap"!==o)throw new r.NotSupported(this.id+" fetchLedger() not support this market type");l=await this.privateSwapGetAccountFinanceRecord(this.extend(a,d))}if("swap"===o)u=this.safeValue(l,"data",[]);else{const e=this.safeValue(l,"data",{});u=this.safeValue(e,"finance",[])}return this.parseLedger(u,c,t,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"addressTag"),r=this.safeStringUpper(e,"currency");return{info:e,currency:this.safeCurrencyCode(r),network:void 0,address:i,tag:s}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},a=await this.privateSpotGetDepositAddress(this.extend(s,t)),o=this.safeValue(a,"data",[]),n=this.parseDepositAddresses(o,[i.code]),d=this.safeValue(n,e);if(void 0===d)throw new r.InvalidAddress(this.id+" fetchDepositAddress() did not return an address for "+e+" - create the deposit address in the user settings on the exchange website first.");return d}async fetchTransactionsByType(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets();const o={};let n;void 0!==t&&(a=this.currency(t),o.currency=a.id),void 0!==s&&(o.size=Math.min(500,s)),n="deposit"===e?await this.privateSpotGetDepositHistory(this.extend(o,r)):await this.privateSpotGetWithdrawHistory(this.extend(o,r));const d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,i,s,{type:e})}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsByType("deposit",e,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsByType("withdrawal",e,t,i,s)}parseTransactionStatus(e){return this.safeString({1:"pending",2:"pending",3:"ok",4:"failed"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","withdraw_id"),s=this.safeString(e,"address"),r=this.safeString(e,"memo"),a=this.safeString(e,"hash"),o=this.safeStringUpper(e,"currency"),n=this.safeCurrencyCode(o,t),d=this.parse8601(this.safeString(e,"created_date")),h=this.parse8601(this.safeString(e,"finished_date")),c=this.parseTransactionStatus(this.safeString(e,"state")),l=this.safeNumber(e,"amount"),u=this.safeNumber(e,"fee");let f;void 0!==u&&(f={currency:n,cost:u});const p=this.safeString(e,"chain");return{info:e,id:i,txid:a,timestamp:d,datetime:this.iso8601(d),network:p,address:s,addressTo:s,addressFrom:void 0,tag:r,tagTo:r,tagFrom:void 0,type:void 0,amount:l,currency:n,status:c,updated:h,internal:void 0,comment:void 0,fee:f}}parseTransferStatus(e){return this.safeString({0:"ok"},e,e)}parseTransfer(e,t=void 0){let i,s;const r=this.safeDict(e,"data",e),a=this.safeInteger(r,"type");1===a?(i="spot",s="swap"):2===a&&(i="swap",s="spot");const o=this.safeInteger(e,"timestamp");return{info:e,id:this.safeString(e,"transfer_id"),timestamp:o,datetime:this.iso8601(o),currency:this.safeCurrencyCode(this.safeString(r,"currency"),t),amount:this.safeNumber2(r,"amount","transfer_amount"),fromAccount:i,toAccount:s,status:this.parseTransferStatus(this.safeString(e,"code"))}}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n=o.id,d=this.safeValue(this.options,"accountsByType",{}),h=this.safeString(d,i,i),c=this.safeString(d,s,s),l={},u="swap"===i,f="swap"===s;let p;const m=this.currencyToPrecision(e,t);if(u||f){if("1"!==h&&"1"!==c)throw new r.ExchangeError(this.id+" transfer() supports transferring between spot and swap, spot and margin, spot and OTC only");l.type=f?1:2,l.currency=n,l.transfer_amount=m,p=await this.privateSwapPostAccountTransfer(this.extend(l,a))}else l.currency_mark=n,l.num=m,l.from=h,l.to=c,p=await this.privateSpotPostTransfer(this.extend(l,a));return this.parseTransfer(p,o)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={address:i,amount:this.currencyToPrecision(e,t),currency:a.id};void 0!==s&&(o.memo=s);const n=await this.privateSpotPostWithdrawNew(this.extend(o,r));return this.parseTransaction(n,a)}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==t&&(o=this.market(t),a.symbol=o.id);const n=await this.privateSpotGetMarginPositions(this.extend(a,r)),d=this.safeValue(n,"positions"),h=this.parseBorrowInterests(d,o);return this.filterByCurrencySinceLimit(h,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"amount"),r=this.safeString(e,"leverage_ratio"),a=o.Y.stringDiv(s,r),n=o.Y.stringSub(s,a),d=void 0===t?void 0:t.base;return{info:e,symbol:this.safeSymbol(i,t),currency:d,interest:void 0,interestRate:.001,amountBorrowed:this.parseNumber(n),marginMode:void 0,timestamp:void 0,datetime:void 0}}async fetchCrossBorrowRate(e,t={}){await this.loadMarkets();const i=await this.privateSpotGetMarginAssets(this.extend({},t)),s=this.safeValue(i,"list",[]);let r=[];for(let t=0;t<s.length;t++){const i=s[t];this.safeString(i,"currency")===e&&(r=i)}const a=this.currency(e);return this.parseBorrowRate(r,a)}async fetchCrossBorrowRates(e={}){await this.loadMarkets();const t=await this.privateSpotGetMarginAssets(e),i=this.safeValue(t,"list",[]);return this.parseBorrowRates(i,"currency")}parseBorrowRate(e,t=void 0){const i=this.milliseconds(),s=this.safeString(e,"currency");return{currency:this.safeCurrencyCode(s,t),rate:.001,period:864e5,timestamp:i,datetime:this.iso8601(i),info:e}}parseBorrowRates(e,t){const i={};for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,t),o=this.safeCurrencyCode(a),n=this.parseBorrowRate(r);i[o]=n}return i}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={instrument_id:i.id},a=await this.publicSwapGetPublicFundingRate(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseFundingRate(o,i)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"instrument_id"),s=this.safeInteger(e,"funding_time"),r=this.safeInteger(e,"next_funding_time"),a=this.safeString(e,"funding_time"),n=this.safeString(e,"next_funding_time"),d=o.Y.stringSub(n,a);return{info:e,symbol:this.safeSymbol(i,t),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"funding_rate"),fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:this.safeNumber(e,"next_funding_rate"),nextFundingTimestamp:r,nextFundingDatetime:this.iso8601(r),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(d)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e);if(!a.swap)throw new r.BadSymbol(this.id+" fetchFundingRateHistory() supports swap contracts only");const o={instrument_id:a.id};void 0!==t&&(o.start_timestamp=t),void 0!==i&&(o.limit=i);const n=await this.publicSwapGetPublicFundingRateHistory(this.extend(o,s)),d=this.safeValue(n,"data",{}),h=this.safeValue(d,"funding_rates",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(d,"instrument_id"),s=this.safeSymbol(i),r=this.safeInteger(t,"time");c.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"rate"),timestamp:r,datetime:this.iso8601(r)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,e,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadRequest(this.id+" fetchTradingFee() supports swap markets only");const s={instrument_id:i.id},a=await this.privateSwapGetAccountTradingFeeRate(this.extend(s,t)),o=this.safeValue(a,"data",{});return this.parseTradingFee(o,i)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"instrument_id");return{info:e,symbol:this.safeSymbol(i,t),maker:this.safeNumber(e,"maker_fee_rate"),taker:this.safeNumber(e,"taker_fee_rate"),percentage:void 0,tierBased:void 0}}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i={};let s,a;if(void 0!==(e=this.marketSymbols(e))){let t;if(Array.isArray(e)){if(e.length>1)throw new r.BadRequest(this.id+" fetchPositions() symbols argument cannot contain more than 1 symbol");t=e[0]}else t=e;s=this.market(t)}[a,t]=this.handleMarketTypeAndParams("fetchPositions",s,t);const[o,n]=this.handleMarginModeAndParams("fetchPositions",t);if(void 0!==o&&(a="margin"),void 0!==s){i["swap"===a?"instrument_id":"symbol"]=s.id}let d;if("spot"===a||"margin"===a)d=await this.privateSpotGetMarginPositions(this.extend(i,n));else{if("swap"!==a)throw new r.NotSupported(this.id+" fetchPositions() not support this market type");d=await this.privateSwapGetAccountPositions(this.extend(i,n))}const h="swap"===a?"data":"positions",c=this.safeValue(d,h,[]),l=[];for(let e=0;e<c.length;e++)l.push(this.parsePosition(c[e],s));return this.filterByArrayPositions(l,"symbol",e,!1)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={};let a;[a,t]=this.handleMarketTypeAndParams("fetchPosition",i,t);const[o,n]=this.handleMarginModeAndParams("fetchPosition",t);void 0!==o&&(a="margin");let d;if(s["swap"===a?"instrument_id":"symbol"]=i.id,"spot"===a||"margin"===a)d=await this.privateSpotGetMarginPositions(this.extend(s,n));else{if("swap"!==a)throw new r.NotSupported(this.id+" fetchPosition() not support this market type");d=await this.privateSwapGetAccountPositions(this.extend(s,n))}const h="swap"===a?"data":"positions",c=this.safeValue(d,h,[]),l=this.parsePosition(c[0],i);return"swap"===a||(l.collateral=this.safeNumber(d,"margin"),l.marginRatio=this.safeNumber(d,"margin_rate")),l}parsePosition(e,t=void 0){const i=this.safeString2(e,"instrument_id","symbol"),s=(t=this.safeMarket(i,t)).symbol;let r=this.safeString(e,"margin_mode");r=void 0!==r?"crossed"===r?"cross":"isolated":"crossed";const a=this.safeInteger(e,"timestamp");let o=this.safeString(e,"side");return"go_long"===o?o="long":"go_short"===o&&(o="short"),this.safePosition({info:e,id:void 0,symbol:s,notional:this.safeNumber(e,"amount"),marginMode:r,liquidationPrice:this.safeNumber(e,"liquidation_price"),entryPrice:this.safeNumber2(e,"avg_cost","entry_price"),unrealizedPnl:this.safeNumber(e,"unrealized_pnl"),contracts:this.safeNumber(e,"avail_position"),contractSize:this.safeNumber(t,"contractSize"),markPrice:this.safeNumber(e,"last"),side:o,hedged:void 0,timestamp:a,datetime:this.iso8601(a),maintenanceMargin:this.safeNumber(e,"margin"),maintenanceMarginPercentage:this.safeNumber(e,"maint_margin_ratio"),collateral:void 0,initialMargin:void 0,initialMarginPercentage:void 0,leverage:this.safeNumber2(e,"leverage","leverage_ratio"),marginRatio:this.safeNumber(e,"margin_ratio"),percentage:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if("swap"!==s.type)throw new r.BadSymbol(this.id+" setLeverage() supports swap contracts only");if(e<1||e>100)throw new r.BadRequest(this.id+" leverage should be between 1 and 100");const a={instrument_id:s.id,leverage:e},o=this.safeString2(this.options,"marginMode","defaultMarginMode");let n=this.safeStringLower2(i,"marginMode","defaultMarginMode",o);if(void 0!==n&&(n="cross"===n?"crossed":"isolated",a.margin_mode=n,i=this.omit(i,["marginMode","defaultMarginMode"])),"isolated"===n){const e=this.safeString(i,"side");void 0!==e?(a.side=e,i=this.omit(i,"side")):this.checkRequiredArgument("setLeverage",e,"side",["long","short"])}return await this.privateSwapPostAccountLeverage(this.extend(a,i))}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.safeCurrencyCode(e),a.currency=r.id),void 0!==t&&(a.start_timestamp=t),void 0!==i&&(a.limit=i);const o=await this.privateSwapGetAccountTransferRecord(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTransfers(n,r,t,i)}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicSwapGetPublicInstruments(t),s=this.safeValue(i,"data",[]);return e=this.marketSymbols(e),this.parseLeverageTiers(s,e,"instrument_id")}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadRequest(this.id+" fetchMarketLeverageTiers() supports swap markets only");const s={instrument_id:i.id},a=await this.publicSwapGetPublicInstrument(this.extend(s,t)),o=this.safeValue(a,"data",{});return this.parseMarketLeverageTiers(o,i)}parseMarketLeverageTiers(e,t=void 0){const i=[],s=this.safeValue(e,"open_max_limits",{});for(let r=0;r<s.length;r++){const a=s[r],o=this.safeString(e,"instrument_id");t=this.safeMarket(o,t),i.push({tier:this.sum(r,1),symbol:this.safeSymbol(o,t,void 0,"swap"),currency:t.settle,minNotional:void 0,maxNotional:this.safeNumber(a,"max_limit"),maintenanceMarginRate:void 0,maxLeverage:this.safeNumber(a,"leverage"),info:a})}return i}handleMarginModeAndParams(e,t={},i=void 0){const s=this.safeString(this.options,"defaultType"),a=this.safeBool(t,"margin",!1);let o;if([o,t]=super.handleMarginModeAndParams(e,t,i),void 0!==o){if("cross"!==o)throw new r.NotSupported(this.id+" only cross margin is supported")}else"margin"!==s&&!0!==a||(o="cross");return[o,t]}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicSpotGetCurrencies(t),s=this.safeList(i,"data");return this.parseDepositWithdrawFees(s,e)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={};t=this.marketCodes(t);for(let i=0;i<e.length;i++){const r=e[i],a=this.safeString(r,"currency"),o=this.safeCurrencyCode(a);if(void 0===t||this.inArray(o,t)){void 0===this.safeValue(s,o)&&(s[o]=this.depositWithdrawFee({}),s[o].info=[]);s[o].info.push(r);const e=this.safeString(r,"chain"),t=this.safeValue(r,"min_withdraw_fee"),i={fee:t,percentage:void 0===t&&void 0},a={fee:void 0,percentage:void 0};if(void 0!==e){const t=this.networkIdToCode(e);s[o].networks[t]={withdraw:i,deposit:a}}else s[o].withdraw=i,s[o].deposit=a}}const r=Object.keys(s);for(let e=0;e<r.length;e++){const t=r[e],i=this.currency(t);s[t]=this.assignDefaultDepositWithdrawFees(s[t],i)}return s}async addMargin(e,t,i={}){const s=this.safeString(i,"side");return this.checkRequiredArgument("addMargin",s,"side",["long","short"]),await this.modifyMarginHelper(e,t,1,i)}async reduceMargin(e,t,i={}){const s=this.safeString(i,"side");return this.checkRequiredArgument("reduceMargin",s,"side",["long","short"]),await this.modifyMarginHelper(e,t,2,i)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.safeString(s,"side"),a=this.market(e),o={instrument_id:a.id,amount:this.numberToString(t),type:i,side:r},n=await this.privateSwapPostAccountPositionMargin(this.extend(o,s)),d=0===this.safeInteger(n,"code")?"ok":"failed",h=this.safeValue(n,"data",{});return this.extend(this.parseMarginModification(h,a),{status:d})}parseMarginModification(e,t=void 0){const i=this.safeString(e,"instrument_id"),s=this.safeInteger(e,"type");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),type:1===s?"add":"reduce",marginMode:"isolated",amount:this.safeNumber(e,"amount"),total:void 0,code:t.settle,status:void 0,timestamp:void 0,datetime:void 0}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a={};[a,s]=this.handleUntilOption("end_timestamp",a,s),void 0!==e&&(r=this.market(e),a.instrument_id=r.id),void 0!==i&&(a.limit=i),void 0!==t&&(a.start_timestamp=t);const o=await this.privateSwapGetAccountFundingFee(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseIncomes(n,r,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"instrument_id"),s=this.safeString(e,"currency"),r=this.safeInteger(e,"timestamp");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),code:this.safeCurrencyCode(s),timestamp:r,datetime:this.iso8601(r),id:void 0,amount:this.safeNumber(e,"amount")}}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");await this.loadMarkets();const s=this.market(t);"cross"===(e=e.toLowerCase())&&(e="crossed");const a={instrument_id:s.id,margin_mode:e};return await this.privateSwapPostAccountPositionMode(this.extend(a,i))}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){const o="private"===t[0],d="spot"===t[1]?"/v3":"/swap/v2",h=d+("/"+this.implodeParams(e,s));let c=this.urls.api.rest+h;const l=this.omit(s,this.extractParams(e));let u;if(u=o&&"/swap/v2"===d&&"POST"===i?JSON.stringify(s):this.urlencode(this.keysort(l)),o){let e,t;"/swap/v2"===d?(t=this.milliseconds().toString(),e=t+i+h,"GET"===i?u&&(e+="?"+u):"POST"===i&&(e+=u)):(t=this.nonce().toString(),e=u);const s=this.hmac(this.encode(e),this.encode(this.secret),n.s);"GET"===i?u&&(c+="?"+u):"POST"===i&&(r={"Content-Type":"application/x-www-form-urlencoded"},u&&(a=u)),r={"ACCESS-KEY":this.apiKey,"ACCESS-SIGN":s,"ACCESS-TIMESTAMP":t}}else u&&(c+="?"+u);return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeString(n,"code");if("0"===c||"200"===c)return;const l=this.id+" "+o;if(void 0===c)throw new r.BadResponse(l);const u=[r.ExchangeError,l],[f,p]=this.safeValue(this.exceptions.exact,c,u);throw new f(p)}}
class c extends s.A{describe(){return this.deepExtend(super.describe(),{id:"ellipx",name:"Ellipx",countries:["PL"],rateLimit:200,version:"v1",certified:!1,pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!1,cancelWithdraw:!1,closePosition:!1,createConvertTrade:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!1,createMarketOrder:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopLossOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!1,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchCanceledAndClosedOrders:!1,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchConvertTrade:!1,fetchConvertTradeHistory:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!1,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!1,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!1,reduceMargin:!1,sandbox:!1,setLeverage:!1,setMargin:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","10m":"10m","1h":"1h","6h":"6h","12h":"12h","1d":"1d"},urls:{logo:"https://github.com/user-attachments/assets/e07c3f40-281c-4cdf-bacf-fa1c58218a2c",api:{public:"https://data.ellipx.com",private:"https://app.ellipx.com/_rest",_rest:"https://app.ellipx.com/_rest"},www:"https://www.ellipx.com",doc:"https://docs.google.com/document/d/1ZXzTQYffKE_EglTaKptxGQERRnunuLHEMmar7VC9syM",fees:"https://www.ellipx.com/pages/pricing",referral:""},api:{_rest:{get:{Market:1,"Market/{currencyPair}":1,"Crypto/Token/Info":1}},public:{get:{"Market/{currencyPair}:getDepth":1,"Market/{currencyPair}:ticker":1,"Market/{currencyPair}:getTrades":1,"Market/{currencyPair}:getGraph":1,"CMC:summary":1,"CMC/{currencyPair}:ticker":1}},private:{get:{"User/Wallet":1,"Market/{currencyPair}/Order":1,"Market/Order/{orderUuid}":1,"Market/{currencyPair}/Trade":1,"Market/TradeFee:query":1,"Unit/{currency}":1,"Crypto/Token/{currency}":1,"Crypto/Token/{currency}:chains":1},post:{"Market/{currencyPair}/Order":1,"Crypto/Address:fetch":1,"Crypto/Disbursement:withdraw":1},delete:{"Market/Order/{orderUuid}":1}}},fees:{trading:{tierBased:!0,feeSide:"get",percentage:!0,maker:this.parseNumber("0.0025"),taker:this.parseNumber("0.0030"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.0025")],[this.parseNumber("10000"),this.parseNumber("0.0020")],[this.parseNumber("50000"),this.parseNumber("0.0015")],[this.parseNumber("100000"),this.parseNumber("0.0010")],[this.parseNumber("1000000"),this.parseNumber("0.0008")],[this.parseNumber("5000000"),this.parseNumber("0.0003")],[this.parseNumber("15000000"),this.parseNumber("0.0000")],[this.parseNumber("75000000"),this.parseNumber("0.0000")],[this.parseNumber("100000000"),this.parseNumber("0.0000")]],taker:[[this.parseNumber("0"),this.parseNumber("0.0030")],[this.parseNumber("10000"),this.parseNumber("0.0025")],[this.parseNumber("50000"),this.parseNumber("0.0020")],[this.parseNumber("100000"),this.parseNumber("0.0015")],[this.parseNumber("1000000"),this.parseNumber("0.0012")],[this.parseNumber("5000000"),this.parseNumber("0.0010")],[this.parseNumber("15000000"),this.parseNumber("0.0008")],[this.parseNumber("75000000"),this.parseNumber("0.0005")],[this.parseNumber("100000000"),this.parseNumber("0.0003")]]}},stablecoin:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.0000"),taker:this.parseNumber("0.000015")}},options:{defaultType:"spot",recvWindow:5e3,broker:"CCXT",networks:{Bitcoin:"Bitcoin",Ethereum:"ERC20"},defaultNetwork:"defaultNetwork",defaultNetworkCodeReplacements:{BTC:"Bitcoin",ETH:"Ethereum"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:{limit:100}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{400:r.BadRequest,401:r.AuthenticationError,403:r.PermissionDenied,404:r.BadRequest,429:r.DDoSProtection,418:r.PermissionDenied,500:r.ExchangeError,504:r.ExchangeError},broad:{}},precisionMode:a.kb})}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){e=this.implodeParams(e,s);let o=this.urls.api[t]+"/"+e;if("private"===t){this.checkRequiredCredentials();const t=this.uuid(),r=this.seconds().toString();a="GET"===i?"":this.json(s),s=this.extend({_key:this.apiKey,_time:r,_nonce:t},s);const o=this.urlencode(s),c=this.hash(this.encode(a),n.s),l=this.base16ToBinary(c),u=this.numberToBE(0,1),f=[this.encode(i),u,this.encode(e),u,this.encode(o),u,l],p=this.binaryConcatArray(f),m=this.secret,g=this.calculateMod(m.length,4),v=g?4-g:0;let y=this.secret.replaceAll("-","+");y=y.replaceAll("_","/"),y=y.padEnd(this.secret.length+v,"=");const w=this.base64ToBinary(y),b=this.arraySlice(w,0,32),k=(0,h.q4)(p,b,d.ev);s._sign=k}return Object.keys(s).length&&(o+="?"+this.urlencode(s)),"GET"===i?a=void 0:r={"Content-Type":"application/json"},{url:o,method:i,body:a,headers:r}}calculateMod(e,t){return e%t}async fetchMarkets(e={}){const t=await this._restGetMarket(e),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"Key"),i=this.safeString(e.Primary,"Key"),s=this.safeString(e.Secondary,"Key"),r=this.safeString(e.Primary,"Crypto_Token__"),a=this.safeString(e.Secondary,"Crypto_Token__"),o="active"===this.safeString(e,"Status"),n=this.safeTimestamp(e.Created,"unix"),d=this.parseNumber(this.parsePrecision(this.safeString(e.Primary,"Decimals"))),h=this.parseNumber(this.parsePrecision(this.safeString(e.Secondary,"Decimals"))),c=this.fees;return this.safeMarketStructure({id:t,symbol:i+"/"+s,base:i,quote:s,settle:void 0,baseId:r,quoteId:a,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:o,contract:!1,linear:void 0,inverse:void 0,taker:c.trading.taker,maker:c.trading.maker,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:d,price:h},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:e,created:n})}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={currencyPair:i.id},r=await this.publicGetMarketCurrencyPairTicker(this.extend(s,t)),a=this.safeValue(r.data,"ticker",{});return this.parseTicker(a,i)}parseTicker(e,t=void 0){const i=this.safeIntegerProduct(e,"time",1e3),s=this.parseAmount(this.safeValue(e,"open")),r=this.parseAmount(this.safeValue(e,"high")),a=this.parseAmount(this.safeValue(e,"low")),o=this.parseAmount(this.safeValue(e,"close")),n=this.parseAmount(this.safeValue(e,"avg")),d=this.parseAmount(this.safeValue(e,"vwap")),h=this.parseAmount(this.safeValue(e,"vol")),c=this.parseAmount(this.safeValue(e,"secvol"));return this.safeTicker({symbol:this.safeSymbol(void 0,t),timestamp:i,datetime:this.iso8601(i),high:r,low:a,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:d,open:s,close:o,last:o,previousClose:void 0,change:void 0,percentage:void 0,average:n,baseVolume:h,quoteVolume:c,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={currencyPair:this.market(e).id},r=await this.publicGetMarketCurrencyPairGetDepth(this.extend(s,i)),a=this.safeValue(r,"data",{}),o=this.milliseconds(),n=a.bids.length,d=a.asks.length;for(let e=0;e<n;e++)a.bids[e].price=this.parseAmount(a.bids[e].price),a.bids[e].amount=this.parseAmount(a.bids[e].amount);for(let e=0;e<d;e++)a.asks[e].price=this.parseAmount(a.asks[e].price),a.asks[e].amount=this.parseAmount(a.asks[e].amount);return this.parseOrderBook(a,e,o,"bids","asks","price","amount")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a="fetchOHLCV";let o=!1;if([o,r]=this.handleOptionAndParams(r,a,"paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const n=this.market(e),d={currencyPair:n.id,interval:this.safeString(this.timeframes,t,void 0)};let h;void 0!==i&&(d.start=Math.floor(i/1e3)),[h,r]=this.handleOptionAndParams(r,a,"until"),void 0!==h&&(d.end=h);const c=await this.publicGetMarketCurrencyPairGetGraph(this.extend(d,r)),l=this.safeDict(c,"data",{}),u=this.safeList(l,"stats",[]);return this.parseOHLCVs(u,n,t,i,s)}parseOHLCV(e,t=void 0){return[1e3*this.safeInteger(e,"time"),this.parseNumber(this.parseAmount(this.safeDict(e,"open"))),this.parseNumber(this.parseAmount(this.safeDict(e,"high"))),this.parseNumber(this.parseAmount(this.safeDict(e,"low"))),this.parseNumber(this.parseAmount(this.safeDict(e,"close"))),this.parseNumber(this.parseAmount(this.safeDict(e,"vol")))]}async fetchCurrencies(e={}){const t=await this._restGetCryptoTokenInfo(this.extend({Can_Deposit:"Y",results_per_page:100,_expand:"/Crypto_Token,/Crypto_Chain"},e)),i={},s=this.safeValue(t,"data",[]);for(let e=0;e<s.length;e++){const t=this.parseCurrency(s[e]),r=this.safeString(t,"code");void 0!==r&&(i[r]=t)}return i}parseCurrency(e){const t=this.safeString(e,"Crypto_Token__"),i=this.safeValue(e,"Crypto_Token",{}),s=this.safeCurrencyCode(this.safeString(i,"Symbol")),r=this.safeString(i,"Name"),a="valid"===this.safeString(e,"Status"),o="Y"===this.safeString(e,"Can_Deposit"),n="valid"===this.safeString(e,"Status");let d;void 0!==e.Withdraw_Fee&&(d=this.parseNumber(this.parseAmount(e.Withdraw_Fee)));const h=this.parseNumber(this.parsePrecision(this.safeString(i,"Decimals")));let c,l;void 0!==e.Minimum_Deposit&&(c=this.parseAmount(e.Minimum_Deposit)),void 0!==e.Minimum_Withdraw&&(l=this.parseAmount(e.Minimum_Withdraw));const u=this.safeString(e,"Crypto_Chain__"),f=this.safeValue(e,"Crypto_Chain",{}),p=this.safeString(f,"Type","default");return{info:e,id:t,code:s,name:r,active:a,deposit:o,withdraw:n,fee:d,precision:h,type:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:l,max:void 0}},networks:{string:void 0,info:"default"===p?{}:f,id:u||t||"",network:p,active:a,deposit:o,withdraw:n,fee:d,precision:h,limits:{deposit:{min:c,max:void 0},withdraw:{min:l,max:void 0}}}}}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={currencyPair:r.id},o=await this.publicGetMarketCurrencyPairGetTrades(this.extend(a,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"trades",[]);return this.parseTrades(d,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeDict(e,"date");let r;r=void 0===s?this.parse8601(this.safeString(e,"date")):this.safeInteger(s,"unixms");const a="bid"===this.safeString(e,"type")?"buy":"sell",o=this.safeDict(e,"amount"),n=this.safeDict(e,"price"),d=this.parseAmount(o),h=this.parseAmount(n),c=this.safeList(e,"pair");let l;if(void 0===c){const t=this.safeString(e,"pair"),[i,s]=t.split("_");l=i+"/"+s}else l=this.safeString(c,0)+"/"+this.safeString(c,1);const u=this.safeDict(e,"bid"),f=this.safeDict(e,"ask"),p="buy"===a?this.safeString(u,"id"):this.safeString(f,"id");return this.safeTrade({id:i,info:e,timestamp:r,datetime:this.iso8601(r),symbol:l,type:void 0,side:a,order:p,takerOrMaker:void 0,price:h,amount:d,cost:void 0,fee:void 0})}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUserWallet(e),i={info:t,timestamp:void 0,datetime:void 0},s=this.safeList(t,"data",[]);if(s.length>0){const e=s[0],t=this.safeDict(e,"Balance_Date",{});i.timestamp=this.safeInteger(t,"unixms"),i.datetime=this.iso8601(i.timestamp)}for(let e=0;e<s.length;e++){const t=s[e],r=this.safeDict(t,"Balance",{}),a=this.safeString(r,"currency");if(void 0!==a){const e={free:this.parseAmount(t.Unencumbered_Balance.value_xint),used:this.parseAmount(t.Liabilities.value_xint),total:this.parseAmount(r.value_xint)};i[a]=e}}return this.safeBalance(i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e);let n="bid";n="buy"===i?"bid":"ask";const d={currencyPair:o.id,Type:n};void 0!==s&&(d.Amount=this.amountToPrecision(e,s)),void 0!==r&&(d.Price=this.priceToPrecision(e,r));const h=this.safeString(a,"cost");void 0!==h&&(a=this.omit(a,"cost"),d.Spend_Limit=this.priceToPrecision(e,h));const c=await this.privatePostMarketCurrencyPairOrder(this.extend(d,a)),l=this.safeDict(c,"data",{});return this.parseOrder(l,o)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderUuid:e},r=await this.privateGetMarketOrderOrderUuid(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a,void 0)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets();const o={};if(void 0!==t){a=this.market(t);const e=a.id;o.currencyPair=e}void 0!==e&&(o.Status=e);const n=await this.privateGetMarketCurrencyPairOrder(this.extend(o,r)),d=this.safeValue(n,"data",[]);return this.parseOrders(d,a,i,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders requires a symbol parameter");return await this.fetchOrdersByStatus(void 0,e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders requires a symbol parameter");return await this.fetchOrdersByStatus("open",e,t,i,s)}parseOrder(e,t=void 0){const i=this.safeString(e,"Market_Order__"),s=this.safeInteger(this.safeDict(e,"Created"),"unixms");let r="sell";"bid"===this.safeString(e,"Type")&&(r="buy");const a=this.parseOrderStatus(this.safeString(e,"Status")),o=this.parseNumber(this.parseAmount(this.safeDict(e,"Amount"))),n=this.parseNumber(this.parseAmount(this.safeDict(e,"Price"))),d=void 0===n?"market":"limit",h=this.parseNumber(this.parseAmount(this.safeDict(e,"Executed"))),c=this.parseNumber(this.parseAmount(this.safeDict(e,"Secured"))),l=this.parseNumber(this.parseAmount(this.safeDict(e,"Total_Spent"))),u=t?t.symbol:void 0,f=this.safeDict(e,"Updated",{}),p=this.safeInteger(f,"unixms",void 0);return this.safeOrder({id:i,clientOrderId:undefined,info:e,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:p,status:this.parseOrderStatus(a),symbol:u,type:d,timeInForce:"GTC",postOnly:!1,side:r,price:n,triggerPrice:void 0,average:void 0,cost:l,amount:o,filled:h,remaining:c,fee:void 0,trades:void 0},t)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderUuid:e},r=await this.privateDeleteMarketOrderOrderUuid(this.extend(s,i)),a=this.safeValue(r,"warning",void 0);let o="canceled";return!0===this.safeBool(r,"data")&&void 0===a||(o="closed"),this.safeOrder({id:e,clientOrderId:void 0,info:this.json(r),timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,status:o,symbol:void 0,type:void 0,timeInForce:void 0,postOnly:void 0,side:void 0,price:void 0,triggerPrice:void 0,average:void 0,cost:void 0,amount:void 0,filled:void 0,remaining:void 0,fee:void 0,trades:void 0},void 0)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){if(void 0===t)throw new r.ArgumentsRequired("fetchMyTrades requires a symbol parameter");await this.loadMarkets();const o=this.market(t),n={Market_Order__:e,currencyPair:o.id},d=await this.privateGetMarketCurrencyPairTrade(this.extend(n,a)),h=this.safeList(d,"data");return this.parseTrades(h,o,i,s)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s=this.safeValue(i.info,"Crypto_Chain",void 0),r={Crypto_Token__:this.safeString(s,"Crypto_Token__"),Crypto_Chain__:this.safeString(s,"Crypto_Chain__")},a=await this.privatePostCryptoAddressFetch(this.extend(r,t)),o=this.safeValue(a,"data",{}),n=this.safeString(o,"Address"),d=this.safeString(o,"memo");return this.checkAddress(n),{currency:e,address:n,tag:d,network:s,info:a}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=await this.privateGetMarketTradeFeeQuery(t),s=this.safeValue(i,"data",{}),r=this.safeNumber(s,"maker"),a=this.safeNumber(s,"taker");return{info:i,symbol:void 0,maker:void 0!==r?r/1e4:void 0,taker:void 0!==a?a/1e4:void 0,percentage:!0,tierBased:!0}}async withdraw(e,t,i,s=void 0,a={}){this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n=this.safeValue(o,"networks");if(void 0===n)throw new r.NotSupported(this.id+" withdraw() for "+e+" is not supported");const d=await this.privateGetUnitCurrency({currency:o.code}),h=this.safeValue(d,"data",[]),c=this.safeString(h,"Unit__");this.omit(a,"Unit__"),this.omit(a,"Crypto_Chain__");const l={Unit__:c,amount:t.toString(),address:i,Crypto_Chain__:n.id};void 0!==s&&(l.memo=s);const u=await this.privatePostCryptoDisbursementWithdraw(this.extend(l,a)),f=this.safeDict(u,"data"),p=this.safeDict(f,"Amount"),m=this.safeDict(f,"Requested"),g=this.safeDict(f,"Processed"),v=this.safeString(f,"Crypto_Disbursement__"),y=this.safeInteger(m,"unixms");return{info:u,id:v,txid:void 0,timestamp:y,datetime:this.iso8601(y),network:this.safeString(f,"Crypto_Chain__"),address:this.safeString(f,"Address"),addressTo:this.safeString(f,"Address"),addressFrom:void 0,tag:s,tagTo:s,tagFrom:void 0,type:"withdrawal",amount:this.safeNumber(p,"value"),currency:e,status:this.parseTransactionStatus(this.safeString(f,"Status")),updated:this.safeTimestamp(g,"unix"),internal:!1,comment:void 0,fee:{currency:e,cost:void 0,rate:void 0}}}parseTransactionStatus(e){return this.safeString({pending:"pending",completed:"ok",failed:"failed",cancelled:"canceled"},e,e)}parseOrderStatus(e){return this.safeString({pending:"open",running:"open","post-pending":"open",open:"open",stop:"open",invalid:"rejected",done:"closed",cancel:"canceled",canceled:"canceled"},e,e)}parseAmount(e){const t=this.safeString(e,"v",void 0),i=this.safeInteger(e,"e",void 0);if(void 0===t||void 0===i)return;const s=new o.Y(t);s.decimals=i,s.reduce();return s.toString()}toAmount(e,t){return{v:e.toString(),e:t}}handleErrors(e,t,i,s,a,o,n,d,h){const c=this.safeString(n,"code"),l=this.safeString(n,"message");if(void 0!==c)throw this.throwExactlyMatchedException(this.exceptions.exact,c,l),new r.ExchangeError(this.id+" "+l)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"exmo",name:"EXMO",countries:["LT"],rateLimit:100,version:"v1.1",has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,addMargin:!0,cancelOrder:!0,cancelOrders:!1,createDepositAddress:!1,createMarketBuyOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchCanceledOrders:!0,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:"emulated",fetchOrderBook:!0,fetchOrderBooks:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:!0,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,reduceMargin:!0,setMargin:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1","5m":"5","15m":"15","30m":"30","45m":"45","1h":"60","2h":"120","3h":"180","4h":"240","1d":"D","1w":"W","1M":"M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766491-1b0ea956-5eda-11e7-9225-40d67b481b8d.jpg",api:{public:"https://api.exmo.com",private:"https://api.exmo.com",web:"https://exmo.me"},www:"https://exmo.me",referral:"https://exmo.me/?ref=131685",doc:["https://exmo.me/en/api_doc?ref=131685"],fees:"https://exmo.com/en/docs/fees"},api:{web:{get:["ctrl/feesAndLimits","en/docs/fees"]},public:{get:["currency","currency/list/extended","order_book","pair_settings","ticker","trades","candles_history","required_amount","payments/providers/crypto/list"]},private:{post:["user_info","order_create","order_cancel","stop_market_order_create","stop_market_order_cancel","user_open_orders","user_trades","user_cancelled_orders","order_trades","deposit_address","withdraw_crypt","withdraw_get_txid","excode_create","excode_load","code_check","wallet_history","wallet_operations","margin/user/order/create","margin/user/order/update","margin/user/order/cancel","margin/user/position/close","margin/user/position/margin_add","margin/user/position/margin_remove","margin/currency/list","margin/pair/list","margin/settings","margin/funding/list","margin/user/info","margin/user/order/list","margin/user/order/history","margin/user/order/trades","margin/user/order/max_quantity","margin/user/position/list","margin/user/position/margin_remove_info","margin/user/position/margin_add_info","margin/user/wallet/list","margin/user/wallet/history","margin/user/trade/list","margin/trades","margin/liquidation/feed"]}},fees:{trading:{feeSide:"get",tierBased:!0,percentage:!0,maker:this.parseNumber("0.004"),taker:this.parseNumber("0.004")},transaction:{tierBased:!1,percentage:!1}},options:{networks:{ETH:"ERC20",TRX:"TRC20"},fetchTradingFees:{method:"fetchPrivateTradingFees"},margin:{fillResponseFromRequest:!0}},features:{spot:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!0,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{GMT:"GMT Token"},precisionMode:o.kb,exceptions:{exact:{140333:r.InvalidOrder,140434:r.BadRequest,40005:r.AuthenticationError,40009:r.InvalidNonce,40015:r.ExchangeError,40016:r.OnMaintenance,40017:r.AuthenticationError,40032:r.PermissionDenied,40033:r.PermissionDenied,40034:r.RateLimitExceeded,50052:r.InsufficientFunds,50054:r.InsufficientFunds,50304:r.OrderNotFound,50173:r.OrderNotFound,50277:r.InvalidOrder,50319:r.InvalidOrder,50321:r.InvalidOrder,50381:r.InvalidOrder},broad:{"range period is too long":r.BadRequest,"invalid syntax":r.BadRequest,"API rate limit exceeded":r.RateLimitExceeded}}})}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a={position_id:r.id,quantity:t};let o;"add"===i?o=await this.privatePostMarginUserPositionMarginAdd(this.extend(a,s)):"reduce"===i&&(o=await this.privatePostMarginUserPositionMarginRemove(this.extend(a,s)));const n=this.parseMarginModification(o,r),d=this.safeValue(this.options,"margin",{});return this.safeBool(d,"fillResponseFromRequest",!0)&&(n.type=i,n.amount=t),n}parseMarginModification(e,t=void 0){return{info:e,symbol:this.safeSymbol(void 0,t),type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:this.safeValue(t,"quote"),status:"ok",timestamp:void 0,datetime:void 0}}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"reduce",i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async fetchTradingFees(e={}){const t=this.safeValue(this.options,"fetchTradingFees",{}),i=this.safeString(t,"method","fetchPrivateTradingFees"),s=this.safeString(e,"method",i);return e=this.omit(e,"method"),"fetchPrivateTradingFees"===s?await this.fetchPrivateTradingFees(e):await this.fetchPublicTradingFees(e)}async fetchPrivateTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostMarginPairList(e),i=this.safeValue(t,"pairs",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"name"),o=this.safeSymbol(r,void 0,"_"),n=this.safeString(t,"trade_maker_fee"),d=this.safeString(t,"trade_taker_fee"),h=this.parseNumber(a.Y.stringDiv(n,"100")),c=this.parseNumber(a.Y.stringDiv(d,"100"));s[o]={info:t,symbol:o,maker:h,taker:c,percentage:!0,tierBased:!0}}return s}async fetchPublicTradingFees(e={}){await this.loadMarkets();const t=await this.publicGetPairSettings(e),i={};for(let e=0;e<this.symbols.length;e++){const s=this.symbols[e],r=this.market(s),o=this.safeValue(t,r.id,{}),n=this.safeString(o,"commission_maker_percent"),d=this.safeString(o,"commission_taker_percent"),h=this.parseNumber(a.Y.stringDiv(n,"100")),c=this.parseNumber(a.Y.stringDiv(d,"100"));i[s]={info:o,symbol:s,maker:h,taker:c,percentage:!0,tierBased:!0}}return i}parseFixedFloatValue(e){if(void 0===e||"-"===e)return;if(""===e)return 0;const t=e.indexOf("%")>=0,i=e.split(" ")[0].replace("%",""),s=parseFloat(i);if(s>0&&t)throw new r.ExchangeError(this.id+" parseFixedFloatValue() detected an unsupported non-zero percentage-based fee "+e);return s}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetPaymentsProvidersCryptoList(t),s={},r=Object.keys(i);for(let t=0;t<r.length;t++){const a=r[t];if(void 0!==e&&!this.inArray(a,e))continue;s[a]={deposit:void 0,withdraw:void 0};const o=this.currency(a),n=this.safeString(o,"id"),d=this.safeValue(i,n,[]);for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"type"),r=this.safeString(t,"commission_desc"),o=this.parseFixedFloatValue(r);s[a][i]=o}s[a].info=d}return this.options.transactionFees=s,s}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetPaymentsProvidersCryptoList(t),s=this.parseDepositWithdrawFees(i,e);return this.options.transactionFees=s,s}parseDepositWithdrawFee(e,t=void 0){const i=this.depositWithdrawFee(e);for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"type"),o=this.safeString(r,"name"),n=this.networkIdToCode(o,this.safeString(t,"code")),d=this.safeString(r,"commission_desc");let h,c=[];if(void 0!==d){c=d.split("%");h=c.length>=2}void 0===this.safeValue(i.networks,n)&&(i.networks[n]={withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0}}),i.networks[n][a]={fee:this.parseFixedFloatValue(this.safeString(c,0)),percentage:h}}return this.assignDefaultDepositWithdrawFees(i)}async fetchCurrencies(e={}){const t=await this.publicGetCurrencyListExtended(e),i=await this.publicGetPaymentsProvidersCryptoList(e),s={};for(let e=0;e<t.length;e++){const r=t[e],o=this.safeString(r,"name"),n=this.safeString(r,"description"),d=this.safeValue(i,o);let h=!1,c="crypto";const l={deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}};let u,f,p;if(void 0===d)h=!0,c="fiat";else for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"type"),s=this.safeString(t,"min");let r=this.safeString(t,"max");a.Y.stringEq(r,"0.0")&&(r=void 0);const o=this.safeValue(t,"enabled");if("deposit"===i?o&&!f?f=!0:o||(f=!1):"withdraw"===i&&(o&&!p?p=!0:o||(p=!1)),o){h=!0;const e=this.numberToString(l[i].min);if((void 0===l[i].min||a.Y.stringLt(s,e))&&(l[i].min=s,l[i].max=r,"withdraw"===i)){const e=this.safeString(t,"commission_desc");u=this.parseFixedFloatValue(e)}}}const m=this.safeCurrencyCode(o);s[m]={id:o,code:m,name:n,type:c,active:h,deposit:f,withdraw:p,fee:u,precision:this.parseNumber("1e-8"),limits:l,info:d,networks:{}}}return s}async fetchMarkets(e={}){const t=await this.publicGetPairSettings(e);let i={};if(this.checkRequiredCredentials(!1)){const t=await this.privatePostMarginPairList(e),s=this.safeValue(t,"pairs");i=this.indexBy(s,"name")}const s=Object.keys(t),r=[];for(let e=0;e<s.length;e++){const o=s[e],n=t[o],d=this.safeValue(i,o),h=o.replace("_","/"),[c,l]=h.split("/"),u=this.safeCurrencyCode(c),f=this.safeCurrencyCode(l),p=this.safeString(n,"commission_taker_percent"),m=this.safeString(n,"commission_maker_percent"),g=this.safeString(n,"max_quantity"),v=this.safeString(d,"max_order_quantity");r.push({id:o,symbol:h,base:u,quote:f,settle:void 0,baseId:c,quoteId:l,settleId:void 0,type:"spot",spot:!0,margin:void 0!==d,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,taker:this.parseNumber(a.Y.stringDiv(p,"100")),maker:this.parseNumber(a.Y.stringDiv(m,"100")),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber("1e-8"),price:this.parseNumber(this.parsePrecision(this.safeString(n,"price_precision")))},limits:{leverage:{min:void 0,max:this.safeNumber(n,"leverage")},amount:{min:this.safeNumber(n,"min_quantity"),max:this.parseNumber(a.Y.stringMax(g,v))},price:{min:this.safeNumber(n,"min_price"),max:this.safeNumber(n,"max_price")},cost:{min:this.safeNumber(n,"min_amount"),max:this.safeNumber(n,"max_amount")}},created:void 0,info:n})}return r}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeIntegerProduct(r,"until",.001),n=void 0!==o,d={symbol:a.id,resolution:this.safeString(this.timeframes,t,t)},h=3e3,c=this.parseTimeframe(t),l=this.parseToInt(this.milliseconds()/1e3);if(void 0===i){const e=n?Math.min(o,l):l;s=void 0===s?1e3:Math.min(s,h),d.from=e-s*c-1,d.to=e}else if(d.from=this.parseToInt(i/1e3)-1,n)d.to=Math.min(o,l);else{s=void 0===s?h:Math.min(s,h);const e=this.sum(i,s*c);d.to=Math.min(e,l)}r=this.omit(r,"until");const u=await this.publicGetCandlesHistory(this.extend(d,r)),f=this.safeList(u,"candles",[]);return this.parseOHLCVs(f,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}parseBalance(e){const t={info:e},i=this.safeValue(e,"wallets");if(void 0!==i){const e=Object.keys(i);for(let s=0;s<e.length;s++){const r=e[s],a=i[r],o=this.safeCurrencyCode(r),n=this.account();n.used=this.safeString(a,"used"),n.free=this.safeString(a,"free"),n.total=this.safeString(a,"balance"),t[o]=n}}else{const i=this.safeValue(e,"balances",{}),s=this.safeValue(e,"reserved",{}),r=Object.keys(i);for(let e=0;e<r.length;e++){const a=r[e],o=this.safeCurrencyCode(a),n=this.account();a in i&&(n.free=this.safeString(i,a)),a in s&&(n.used=this.safeString(s,a)),t[o]=n}}return this.safeBalance(t)}async fetchBalance(e={}){let t,i;if(await this.loadMarkets(),[t,e]=this.handleMarginModeAndParams("fetchBalance",e),"cross"===t)throw new r.BadRequest(this.id+" does not support cross margin");return i="isolated"===t?await this.privatePostMarginUserWalletList(e):await this.privatePostUserInfo(e),this.parseBalance(i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id};void 0!==t&&(r.limit=t);const a=await this.publicGetOrderBook(this.extend(r,i)),o=this.safeDict(a,s.id);return this.parseOrderBook(o,s.symbol,void 0,"bid","ask")}async fetchOrderBooks(e=void 0,t=void 0,i={}){let s;if(await this.loadMarkets(),void 0===e){if(s=this.ids.join(","),s.length>2048){const e=this.ids.length;throw new r.ExchangeError(this.id+" fetchOrderBooks() has "+e.toString()+" symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchOrderBooks")}}else s=this.marketIds(e),s=s.join(",");const a={pair:s};void 0!==t&&(a.limit=t);const o=await this.publicGetOrderBook(this.extend(a,i)),n={},d=Object.keys(o);for(let e=0;e<d.length;e++){const t=d[e],i=this.safeSymbol(t);n[i]=this.parseOrderBook(o[t],i,void 0,"bid","ask")}return n}parseTicker(e,t=void 0){const i=this.safeTimestamp(e,"updated");t=this.safeMarket(void 0,t);const s=this.safeString(e,"last_trade");return this.safeTicker({symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy_price"),bidVolume:void 0,ask:this.safeString(e,"sell_price"),askVolume:void 0,vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:this.safeString(e,"avg"),baseVolume:this.safeString(e,"vol"),quoteVolume:this.safeString(e,"vol_curr"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTicker(t),s={},r=Object.keys(i);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeMarket(t,void 0,"_"),o=a.symbol,n=this.safeValue(i,t);s[o]=this.parseTicker(n,a)}return this.filterByArrayTickers(s,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=await this.publicGetTicker(t),s=this.market(e);return this.parseTicker(i[s.id],s)}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"date"),s=this.safeString(e,"trade_id"),r=this.safeString(e,"order_id"),o=this.safeString(e,"price"),n=this.safeString(e,"quantity"),d=this.safeString(e,"amount"),h=this.safeString2(e,"type","trade_type"),c=this.safeString(e,"pair"),l=(t=this.safeMarket(c,t,"_")).symbol,u=this.safeValue(e,"is_maker");let f;void 0!==u&&(f=u?"maker":"taker");const p=this.safeString(e,"exec_type",f);let m;const g=this.safeString(e,"commission_amount");if(void 0!==g){const t=this.safeString(e,"commission_currency"),i=this.safeCurrencyCode(t);let s=this.safeString(e,"commission_percent");void 0!==s&&(s=a.Y.stringDiv(s,"1000",18)),m={cost:g,currency:i,rate:s}}return this.safeTrade({id:s,info:e,timestamp:i,datetime:this.iso8601(i),symbol:l,order:r,type:undefined,side:h,takerOrMaker:p,price:o,amount:n,cost:d,fee:m},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id},o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,r.id,[]);return this.parseTrades(n,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");let a;if([a,s]=this.handleMarginModeAndParams("fetchMyTrades",s),"cross"===a)throw new r.BadRequest(this.id+" only isolated margin is supported");await this.loadMarkets();const o=this.market(e).id,n="isolated"!==a;void 0===i&&(i=100);const d={};n?d.pair=o:d.pair_name=o,void 0!==i&&(d.limit=i);const h=this.safeInteger(s,"offset",0);let c;if(d.offset=h,n)c=await this.privatePostUserTrades(this.extend(d,s));else{const e=await this.privatePostMarginTrades(this.extend(d,s));c=this.safeValue(e,"trades")}let l=[];const u=Object.keys(c);for(let e=0;e<u.length;e++){const s=u[e],r=this.safeMarket(s,void 0,"_"),a=c[s],o=this.parseTrades(a,r,t,i);l=this.arrayConcat(l,o)}return this.filterBySinceLimit(l,t,i)}async createMarketOrderWithCost(e,t,i,s={}){return await this.loadMarkets(),s=this.extend(s,{cost:i}),await this.createOrder(e,"market",t,i,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){return await this.loadMarkets(),i=this.extend(i,{cost:t}),await this.createOrder(e,"market","buy",t,void 0,i)}async createMarketSellOrderWithCost(e,t,i={}){return await this.loadMarkets(),i=this.extend(i,{cost:t}),await this.createOrder(e,"market","sell",t,void 0,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d="market"===t&&void 0===a;let h;if([h,o]=this.handleMarginModeAndParams("createOrder",o),"cross"===h)throw new r.BadRequest(this.id+" only supports isolated margin");const c="isolated"!==h,l=this.safeStringN(o,["triggerPrice","stopPrice","stop_price"]),u=this.safeString(o,"cost"),f={pair:n.id};f.quantity=void 0===u?this.amountToPrecision(n.symbol,s):this.costToPrecision(n.symbol,u);let p=this.safeValue2(o,"client_id","clientOrderId");if(void 0!==p){if(p=this.safeInteger2(o,"client_id","clientOrderId"),void 0===p)throw new r.BadRequest(this.id+" createOrder() client order id must be an integer / numeric literal");f.client_id=p}const m=this.safeNumber(o,"leverage");if(!c&&void 0===m)throw new r.ArgumentsRequired(this.id+' createOrder requires an extra param params["leverage"] for margin orders');let g;if(o=this.omit(o,["stopPrice","stop_price","triggerPrice","timeInForce","client_id","clientOrderId","cost"]),void 0!==a&&(f.price=this.priceToPrecision(n.symbol,a)),c)if(void 0!==l){if("limit"===t)throw new r.BadRequest(this.id+" createOrder () cannot create stop limit orders for spot, only stop market");f.type=i,f.trigger_price=this.priceToPrecision(e,l),g=await this.privatePostStopMarketOrderCreate(this.extend(f,o))}else{const e=this.safeString(o,"exec_type");let s;[s,o]=this.handlePostOnly("market"===t,"post_only"===e,o);const r=this.safeString(o,"timeInForce");if(f.price=d?0:this.priceToPrecision(n.symbol,a),"limit"===t)f.type=i;else if("market"===t){const e=void 0!==u?"_total":"";f.type="market_"+i+e}s?f.exec_type="post_only":void 0!==r&&(f.exec_type=r),g=await this.privatePostOrderCreate(this.extend(f,o))}else void 0!==l?(f.stop_price=this.priceToPrecision(e,l),f.type="limit"===t?"stop_limit_"+i:"market"===t?"stop_"+i:t):f.type="limit"===t||"market"===t?t+"_"+i:t,g=await this.privatePostMarginUserOrderCreate(this.extend(f,o));return this.parseOrder(g,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},a=this.safeValue2(i,"trigger","stop");let o,n;if(i=this.omit(i,["trigger","stop"]),[o,i]=this.handleMarginModeAndParams("cancelOrder",i),"cross"===o)throw new r.BadRequest(this.id+" only supports isolated margin");return"isolated"===o?(s.order_id=e,n=await this.privatePostMarginUserOrderCancel(this.extend(s,i))):a?(s.parent_order_id=e,n=await this.privatePostStopMarketOrderCancel(this.extend(s,i))):(s.order_id=e,n=await this.privatePostOrderCancel(this.extend(s,i))),this.parseOrder(n)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e.toString()},r=await this.privatePostOrderTrades(this.extend(s,i)),a=this.parseOrder(r);return a.id=e.toString(),a}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){let o,n;if([o,a]=this.handleMarginModeAndParams("fetchOrderTrades",a),"cross"===o)throw new r.BadRequest(this.id+" only supports isolated margin");void 0!==t&&(n=this.market(t));const d={order_id:e.toString()};let h;h="isolated"===o?await this.privatePostMarginUserOrderTrades(this.extend(d,a)):await this.privatePostOrderTrades(this.extend(d,a));const c=this.safeList(h,"trades");return this.parseTrades(c,n,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets(),void 0!==e&&(r=this.market(e),e=r.symbol),[a,s]=this.handleMarginModeAndParams("fetchOpenOrders",s);let o,n=[];if("cross"===a||"isolated"===a){o=await this.privatePostMarginUserOrderList(s),s=this.extend(s,{status:"open"});const e=this.safeValue(o,"orders");n=this.parseOrders(e,r,t,i,s)}else{o=await this.privatePostUserOpenOrders(s);const e=Object.keys(o);for(let r=0;r<e.length;r++){const a=e[r],d=this.safeMarket(a);s=this.extend(s,{status:"open"});const h=this.parseOrders(o[a],d,t,i,s);n=this.arrayConcat(n,h)}}return n}parseStatus(e){if(void 0===e)return;return e.indexOf("cancel")>=0&&(e="canceled"),this.safeString({cancel_started:"canceled"},e,e)}parseSide(e){return this.safeString({limit_buy:"buy",limit_sell:"sell",market_buy:"buy",market_sell:"sell",stop_buy:"buy",stop_sell:"sell",stop_limit_buy:"buy",stop_limit_sell:"sell",trailing_stop_buy:"buy",trailing_stop_sell:"sell",stop_market_sell:"sell",stop_market_buy:"buy",buy:"buy",sell:"sell"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"order_id","parent_order_id"),s=this.safeIntegerProduct2(e,"event_time","created",1e-6),r=this.safeTimestamp(e,"created",s),a=this.safeString2(e,"type","order_type"),o=this.parseSide(a);let n;"pair"in e?n=e.pair:"in_currency"in e&&"out_currency"in e&&(n="buy"===o?e.in_currency+"_"+e.out_currency:e.out_currency+"_"+e.in_currency);const d=(t=this.safeMarket(n,t)).symbol;let h=this.safeString(e,"quantity");if(void 0===h){const t="buy"===o?"in_amount":"out_amount";h=this.safeString(e,t)}const c=this.safeString(e,"price"),l=this.safeString(e,"amount"),u=this.safeValue(e,"trades",[]),f=this.safeInteger(e,"client_id");let p,m=this.safeString(e,"stop_price");return"0"===m&&(m=void 0),"buy"!==a&&"sell"!==a&&(p=a),this.safeOrder({id:i,clientOrderId:f,datetime:this.iso8601(r),timestamp:r,lastTradeTimestamp:this.safeIntegerProduct(e,"updated",1e-6),status:this.parseStatus(this.safeString(e,"order_status")),symbol:d,type:p,timeInForce:void 0,postOnly:void 0,side:o,price:c,triggerPrice:m,cost:l,amount:h,filled:void 0,remaining:void 0,average:void 0,trades:u,fee:void 0,info:e},t)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){let a;if(await this.loadMarkets(),[a,s]=this.handleMarginModeAndParams("fetchOrders",s),"cross"===a)throw new r.BadRequest(this.id+" only supports isolated margin");void 0===i&&(i=100);const o="isolated"!==a;if(void 0!==e){e=this.market(e).symbol}const n={limit:i};let d,h;if(n.offset=void 0!==t?i:0,n.limit=i,void 0!==e&&(d=this.market(e)),o)return h=await this.privatePostUserCancelledOrders(this.extend(n,s)),s=this.extend(s,{status:"canceled"}),this.parseOrders(h,d,t,i,s);{const e=await this.privatePostMarginUserOrderHistory(this.extend(n,s)),r=this.safeValue(e,"items"),a=this.parseOrders(r,d,t,i,s),o=[];for(let e=0;e<a.length;e++){const t=a[e];"canceled"===t.status&&o.push(t)}return o}}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);let h;if([h,n]=this.handleMarginModeAndParams("editOrder",n),"isolated"!==h)throw new r.BadRequest(this.id+" editOrder() can only be used for isolated margin orders");const c=this.safeNumberN(n,["triggerPrice","stopPrice","stop_price"]);n=this.omit(n,["triggerPrice","stopPrice"]);const l={order_id:e};void 0!==a&&(l.quantity=a),void 0!==o&&(l.price=this.priceToPrecision(d.symbol,o)),void 0!==c&&(l.stop_price=this.priceToPrecision(d.symbol,c));const u=await this.privatePostMarginUserOrderUpdate(this.extend(l,n));return this.parseOrder(u)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=await this.privatePostDepositAddress(t),s=this.safeString(i,e);let r,a;if(s){const e=s.split(",");r=e[0];e.length>1&&(a=e[1])}return this.checkAddress(r),{info:i,currency:e,network:void 0,address:r,tag:a}}getMarketFromTrades(e){const t=this.indexBy(e,"pair"),i=Object.keys(t);if(1===i.length)return this.markets[i[0]]}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={amount:t,currency:a.id,address:i};void 0!==s&&(o.invoice=s);const n=this.safeValue(this.options,"networks",{});let d=this.safeStringUpper(r,"network");d=this.safeString(n,d,d),void 0!==d&&(o.transport=d,r=this.omit(r,"network"));const h=await this.privatePostWithdrawCrypt(this.extend(o,r));return this.parseTransaction(h,a)}parseTransactionStatus(e){return this.safeString({transferred:"ok",paid:"ok",pending:"pending",processing:"pending",verifying:"pending"},e,e)}parseTransaction(e,t=void 0){const i=this.safeTimestamp2(e,"dt","created");let s=this.safeString(e,"amount");void 0!==s&&(s=a.Y.stringAbs(s));let r=this.safeString(e,"txid");if(void 0===r){const t=this.safeValue(e,"extra",{}),i=this.safeString(t,"txid");""!==i&&(r=i)}const o=this.safeString(e,"type"),n=this.safeString2(e,"curr","currency"),d=this.safeCurrencyCode(n,t);let h,c;const l=this.safeString(e,"account");if("deposit"===o)c=l;else if("withdrawal"===o&&(h=l,void 0!==h)){const e=h.split(":");2===e.length&&(h=this.safeString(e,1),h=h.replace(" ",""))}const u={currency:void 0,cost:void 0,rate:void 0};if(!this.fees.transaction.percentage){const t="withdrawal"===o?"withdraw":"deposit";let i=this.safeString(e,"commission");if(void 0===i){const e=this.safeValue(this.options,"transactionFees",{}),s=this.safeValue(e,d,{});i=this.safeString(s,t)}"cashback"===this.safeString(e,"provider")&&(i="0"),void 0!==i&&("withdrawal"===o&&(s=a.Y.stringSub(s,i)),u.cost=this.parseNumber(i),u.currency=d)}return{info:e,id:this.safeString2(e,"order_id","task_id"),txid:r,type:o,currency:d,network:this.safeString(e,"provider"),amount:this.parseNumber(s),status:this.parseTransactionStatus(this.safeStringLower(e,"status")),timestamp:i,datetime:this.iso8601(i),address:h,addressFrom:void 0,addressTo:h,tag:void 0,tagFrom:void 0,tagTo:void 0,updated:this.safeTimestamp(e,"updated"),comment:c,internal:void 0,fee:u}}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==t&&(r.date=this.parseToInt(t/1e3)),void 0!==e&&(a=this.currency(e));const o=await this.privatePostWalletHistory(this.extend(r,s));return this.parseTransactions(o.history,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={type:"withdraw"};void 0!==i&&(a.limit=i),void 0!==e&&(r=this.currency(e),a.currency=r.id);const o=await this.privatePostWalletOperations(this.extend(a,s)),n=this.safeList(o,"items",[]);return this.parseTransactions(n,r,t,i)}async fetchWithdrawal(e,t=void 0,i={}){let s;await this.loadMarkets();const r={order_id:e,type:"withdraw"};void 0!==t&&(s=this.currency(t),r.currency=s.id);const a=await this.privatePostWalletOperations(this.extend(r,i)),o=this.safeValue(a,"items",[]),n=this.safeDict(o,0,{});return this.parseTransaction(n,s)}async fetchDeposit(e,t=void 0,i={}){let s;await this.loadMarkets();const r={order_id:e,type:"deposit"};void 0!==t&&(s=this.currency(t),r.currency=s.id);const a=await this.privatePostWalletOperations(this.extend(r,i)),o=this.safeValue(a,"items",[]),n=this.safeDict(o,0,{});return this.parseTransaction(n,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={type:"deposit"};void 0!==i&&(a.limit=i),void 0!==e&&(r=this.currency(e),a.currency=r.id);const o=await this.privatePostWalletOperations(this.extend(a,s)),n=this.safeList(o,"items",[]);return this.parseTransactions(n,r,t,i)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/";if("web"!==t&&(o+=this.version+"/"),o+=e,"public"===t||"web"===t)Object.keys(s).length&&(o+="?"+this.urlencode(s));else if("private"===t){this.checkRequiredCredentials();const e=this.nonce();a=this.urlencode(this.extend({nonce:e},s)),r={"Content-Type":"application/x-www-form-urlencoded",Key:this.apiKey,Sign:this.hmac(this.encode(a),this.encode(this.secret),n.Zf)}}return{url:o,method:i,body:a,headers:r}}nonce(){return this.milliseconds()}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n){if("error"in n&&!("result"in n)){const e=this.safeValue(n,"error",{}),t=this.safeString(e,"msg"),i=this.safeString(e,"code"),s=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,i,s),this.throwBroadlyMatchedException(this.exceptions.broad,t,s),new r.ExchangeError(s)}if("result"in n||"errmsg"in n){let e=this.safeBool(n,"result",!1);if("string"==typeof e&&(e="true"===e||"1"===e),!e){let e;const t=this.safeString2(n,"error","errmsg"),i=t.split(":");if(i.length>1){const t=i[0].split(" ");e=t.length>1?t[1]:t[0]}const s=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,s),this.throwBroadlyMatchedException(this.exceptions.broad,t,s),new r.ExchangeError(s)}}}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"fmfwio",name:"FMFW.io",countries:["KN"],urls:{logo:"https://user-images.githubusercontent.com/1294454/159177712-b685b40c-5269-4cea-ac83-f7894c49525d.jpg",api:{public:"https://api.fmfw.io/api/3",private:"https://api.fmfw.io/api/3"},www:"https://fmfw.io",doc:"https://api.fmfw.io/",fees:"https://fmfw.io/fees-and-limits",referral:"https://fmfw.io/referral/da948b21d6c92d69"},fees:{trading:{maker:this.parseNumber("0.005"),taker:this.parseNumber("0.005")}}})}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"gate",name:"Gate.io",countries:["KR"],rateLimit:50,version:"v4",certified:!0,pro:!0,urls:{logo:"https://github.com/user-attachments/assets/64f988c5-07b6-4652-b5c1-679a6bf67c85",doc:"https://www.gate.io/docs/developers/apiv4/en/",www:"https://gate.io/",api:{public:{wallet:"https://api.gateio.ws/api/v4",futures:"https://api.gateio.ws/api/v4",margin:"https://api.gateio.ws/api/v4",delivery:"https://api.gateio.ws/api/v4",spot:"https://api.gateio.ws/api/v4",options:"https://api.gateio.ws/api/v4",sub_accounts:"https://api.gateio.ws/api/v4",earn:"https://api.gateio.ws/api/v4"},private:{withdrawals:"https://api.gateio.ws/api/v4",wallet:"https://api.gateio.ws/api/v4",futures:"https://api.gateio.ws/api/v4",margin:"https://api.gateio.ws/api/v4",delivery:"https://api.gateio.ws/api/v4",spot:"https://api.gateio.ws/api/v4",options:"https://api.gateio.ws/api/v4",subAccounts:"https://api.gateio.ws/api/v4",unified:"https://api.gateio.ws/api/v4",rebate:"https://api.gateio.ws/api/v4",earn:"https://api.gateio.ws/api/v4",account:"https://api.gateio.ws/api/v4",loan:"https://api.gateio.ws/api/v4"}},test:{public:{futures:"https://fx-api-testnet.gateio.ws/api/v4",delivery:"https://fx-api-testnet.gateio.ws/api/v4",options:"https://fx-api-testnet.gateio.ws/api/v4"},private:{futures:"https://fx-api-testnet.gateio.ws/api/v4",delivery:"https://fx-api-testnet.gateio.ws/api/v4",options:"https://fx-api-testnet.gateio.ws/api/v4"}},referral:{url:"https://www.gate.io/signup/2436035",discount:.2}},has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!0,option:!0,addMargin:!0,borrowCrossMargin:!0,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!0,createMarketBuyOrderWithCost:!0,createMarketOrder:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,createTakeProfitOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchGreeks:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!0,fetchLeverages:!0,fetchLeverageTiers:!0,fetchLiquidations:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyLiquidations:!0,fetchMySettlementHistory:!0,fetchMyTrades:!0,fetchNetworkDepositAddress:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!0,fetchPositionHistory:"emulated",fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!0,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactionFees:!0,fetchUnderlyingAssets:!0,fetchVolatilityHistory:!1,fetchWithdrawals:!0,reduceMargin:!0,repayCrossMargin:!0,repayIsolatedMargin:!0,sandbox:!0,setLeverage:!0,setMarginMode:!1,setPositionMode:!0,signIn:!1,transfer:!0,withdraw:!0},api:{public:{wallet:{get:{currency_chains:1}},spot:{get:{currencies:1,"currencies/{currency}":1,currency_pairs:1,"currency_pairs/{currency_pair}":1,tickers:1,order_book:1,trades:1,candlesticks:1,time:1}},margin:{get:{currency_pairs:1,"currency_pairs/{currency_pair}":1,funding_book:1,"cross/currencies":1,"cross/currencies/{currency}":1,"uni/currency_pairs":1,"uni/currency_pairs/{currency_pair}":1}},flash_swap:{get:{currencies:1}},futures:{get:{"{settle}/contracts":1,"{settle}/contracts/{contract}":1,"{settle}/order_book":1,"{settle}/trades":1,"{settle}/candlesticks":1,"{settle}/premium_index":1,"{settle}/tickers":1,"{settle}/funding_rate":1,"{settle}/insurance":1,"{settle}/contract_stats":1,"{settle}/index_constituents/{index}":1,"{settle}/liq_orders":1,"{settle}/risk_limit_tiers":1}},delivery:{get:{"{settle}/contracts":1,"{settle}/contracts/{contract}":1,"{settle}/order_book":1,"{settle}/trades":1,"{settle}/candlesticks":1,"{settle}/tickers":1,"{settle}/insurance":1}},options:{get:{underlyings:1,expirations:1,contracts:1,"contracts/{contract}":1,settlements:1,"settlements/{contract}":1,order_book:1,tickers:1,"underlying/tickers/{underlying}":1,candlesticks:1,"underlying/candlesticks":1,trades:1}},earn:{get:{"uni/currencies":1,"uni/currencies/{currency}":1}}},private:{withdrawals:{post:{withdrawals:20,push:1},delete:{"withdrawals/{withdrawal_id}":1}},wallet:{get:{deposit_address:1,withdrawals:1,deposits:1,sub_account_transfers:1,order_status:1,withdraw_status:1,sub_account_balances:2.5,sub_account_margin_balances:2.5,sub_account_futures_balances:2.5,sub_account_cross_margin_balances:2.5,saved_address:1,fee:1,total_balance:2.5,small_balance:1,small_balance_history:1,push:1},post:{transfers:2.5,sub_account_transfers:2.5,sub_account_to_sub_account:2.5,small_balance:1}},subAccounts:{get:{sub_accounts:2.5,"sub_accounts/{user_id}":2.5,"sub_accounts/{user_id}/keys":2.5,"sub_accounts/{user_id}/keys/{key}":2.5},post:{sub_accounts:2.5,"sub_accounts/{user_id}/keys":2.5,"sub_accounts/{user_id}/lock":2.5,"sub_accounts/{user_id}/unlock":2.5},put:{"sub_accounts/{user_id}/keys/{key}":2.5},delete:{"sub_accounts/{user_id}/keys/{key}":2.5}},unified:{get:{accounts:20/15,account_mode:20/15,borrowable:20/15,transferable:20/15,loans:20/15,loan_records:20/15,interest_records:20/15,estimate_rate:20/15,currency_discount_tiers:20/15,risk_units:20/15,unified_mode:20/15,loan_margin_tiers:20/15,"leverage/user_currency_config":20/15,"leverage/user_currency_setting":20/15},post:{account_mode:20/15,loans:200/15,portfolio_calculator:20/15,"leverage/user_currency_setting":20/15},put:{unified_mode:20/15}},spot:{get:{fee:1,batch_fee:1,accounts:1,account_book:1,open_orders:1,orders:1,"orders/{order_id}":1,my_trades:1,price_orders:1,"price_orders/{order_id}":1},post:{batch_orders:.4,cross_liquidate_orders:1,orders:.4,cancel_batch_orders:20/75,countdown_cancel_all:20/75,amend_batch_orders:.4,price_orders:.4},delete:{orders:20/75,"orders/{order_id}":20/75,price_orders:20/75,"price_orders/{order_id}":20/75},patch:{"orders/{order_id}":.4}},margin:{get:{accounts:20/15,account_book:20/15,funding_accounts:20/15,auto_repay:20/15,transferable:20/15,loans:20/15,"loans/{loan_id}":20/15,"loans/{loan_id}/repayment":20/15,loan_records:20/15,"loan_records/{loan_record_id}":20/15,borrowable:20/15,"cross/accounts":20/15,"cross/account_book":20/15,"cross/loans":20/15,"cross/loans/{loan_id}":20/15,"cross/repayments":20/15,"cross/interest_records":20/15,"cross/transferable":20/15,"cross/estimate_rate":20/15,"cross/borrowable":20/15,"uni/estimate_rate":20/15,"uni/loans":20/15,"uni/loan_records":20/15,"uni/interest_records":20/15,"uni/borrowable":20/15},post:{auto_repay:20/15,loans:20/15,merged_loans:20/15,"loans/{loan_id}/repayment":20/15,"cross/loans":20/15,"cross/repayments":20/15,"uni/loans":20/15},patch:{"loans/{loan_id}":20/15,"loan_records/{loan_record_id}":20/15},delete:{"loans/{loan_id}":20/15}},flash_swap:{get:{currencies:1,currency_pairs:1,orders:1,"orders/{order_id}":1},post:{orders:1,"orders/preview":1}},futures:{get:{"{settle}/accounts":1,"{settle}/account_book":1,"{settle}/positions":1,"{settle}/positions/{contract}":1,"{settle}/dual_comp/positions/{contract}":1,"{settle}/orders":1,"{settle}/orders_timerange":1,"{settle}/orders/{order_id}":1,"{settle}/my_trades":1,"{settle}/my_trades_timerange":1,"{settle}/position_close":1,"{settle}/liquidates":1,"{settle}/auto_deleverages":1,"{settle}/fee":1,"{settle}/risk_limit_tiers":1,"{settle}/price_orders":1,"{settle}/price_orders/{order_id}":1},post:{"{settle}/positions/{contract}/margin":1,"{settle}/positions/{contract}/leverage":1,"{settle}/positions/{contract}/risk_limit":1,"{settle}/dual_mode":1,"{settle}/dual_comp/positions/{contract}/margin":1,"{settle}/dual_comp/positions/{contract}/leverage":1,"{settle}/dual_comp/positions/{contract}/risk_limit":1,"{settle}/orders":.4,"{settle}/batch_orders":.4,"{settle}/countdown_cancel_all":.4,"{settle}/batch_cancel_orders":.4,"{settle}/price_orders":.4},put:{"{settle}/orders/{order_id}":1},delete:{"{settle}/orders":20/75,"{settle}/orders/{order_id}":20/75,"{settle}/price_orders":20/75,"{settle}/price_orders/{order_id}":20/75}},delivery:{get:{"{settle}/accounts":20/15,"{settle}/account_book":20/15,"{settle}/positions":20/15,"{settle}/positions/{contract}":20/15,"{settle}/orders":20/15,"{settle}/orders/{order_id}":20/15,"{settle}/my_trades":20/15,"{settle}/position_close":20/15,"{settle}/liquidates":20/15,"{settle}/settlements":20/15,"{settle}/price_orders":20/15,"{settle}/price_orders/{order_id}":20/15},post:{"{settle}/positions/{contract}/margin":20/15,"{settle}/positions/{contract}/leverage":20/15,"{settle}/positions/{contract}/risk_limit":20/15,"{settle}/orders":20/15,"{settle}/price_orders":20/15},delete:{"{settle}/orders":20/15,"{settle}/orders/{order_id}":20/15,"{settle}/price_orders":20/15,"{settle}/price_orders/{order_id}":20/15}},options:{get:{my_settlements:20/15,accounts:20/15,account_book:20/15,positions:20/15,"positions/{contract}":20/15,position_close:20/15,orders:20/15,"orders/{order_id}":20/15,my_trades:20/15,mmp:20/15},post:{orders:20/15,countdown_cancel_all:20/15,mmp:20/15,"mmp/reset":20/15},delete:{orders:20/15,"orders/{order_id}":20/15}},earn:{get:{"uni/currencies":20/15,"uni/currencies/{currency}":20/15,"uni/lends":20/15,"uni/lend_records":20/15,"uni/interests/{currency}":20/15,"uni/interest_records":20/15,"uni/interest_status/{currency}":20/15},post:{"uni/lends":20/15},put:{"uni/interest_reinvest":20/15},patch:{"uni/lends":20/15}},loan:{get:{"collateral/orders":20/15,"collateral/orders/{order_id}":20/15,"collateral/repay_records":20/15,"collateral/collaterals":20/15,"collateral/total_amount":20/15,"collateral/ltv":20/15,"collateral/currencies":20/15,"multi_collateral/orders":20/15,"multi_collateral/orders/{order_id}":20/15,"multi_collateral/repay":20/15,"multi_collateral/mortgage":20/15,"multi_collateral/currency_quota":20/15,"multi_collateral/currencies":20/15,"multi_collateral/ltv":20/15,"multi_collateral/fixed_rate":20/15,"multi_collateral/current_rate":20/15},post:{"collateral/orders":20/15,"collateral/repay":20/15,"collateral/collaterals":20/15,"multi_collateral/orders":20/15,"multi_collateral/repay":20/15,"multi_collateral/mortgage":20/15}},account:{get:{detail:20/15,rate_limit:20/15,stp_groups:20/15,"stp_groups/{stp_id}/users":20/15,"stp_groups/debit_fee":20/15},post:{stp_groups:20/15,"stp_groups/{stp_id}/users":20/15},delete:{"stp_groups/{stp_id}/users":20/15}},rebate:{get:{"agency/transaction_history":20/15,"agency/commission_history":20/15}}}},timeframes:{"10s":"10s","1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","8h":"8h","1d":"1d","7d":"7d","1w":"7d"},commonCurrencies:{ORT:"XREATORS",ASS:"ASSF","88MPH":"MPH",AXIS:"AXISDEFI",BIFI:"BITCOINFILE",BOX:"DEFIBOX",BYN:"BEYONDFI",EGG:"GOOSEFINANCE",GTC:"GAMECOM",GTC_HT:"GAMECOM_HT",GTC_BSC:"GAMECOM_BSC",HIT:"HITCHAIN",MM:"MILLION",MPH:"MORPHER",POINT:"GATEPOINT",RAI:"RAIREFLEXINDEX",RED:"RedLang",SBTC:"SUPERBITCOIN",TNC:"TRINITYNETWORKCREDIT",VAI:"VAIOT",TRAC:"TRACO"},requiredCredentials:{apiKey:!0,secret:!0},headers:{"X-Gate-Channel-Id":"ccxt"},options:{timeDifference:0,adjustForTimeDifference:!1,sandboxMode:!1,unifiedAccount:void 0,createOrder:{expiration:86400},createMarketBuyOrderRequiresPrice:!0,networks:{BTC:"BTC",BRC20:"BTCBRC",ETH:"ETH",ERC20:"ETH",TRX:"TRX",TRC20:"TRX",HECO:"HT",HRC20:"HT",BSC:"BSC",BEP20:"BSC",SOL:"SOL",POLYGON:"POL",MATIC:"POL",OP:"OPETH",OPTIMISM:"OPETH",ADA:"ADA",AVAXC:"AVAX_C",NEAR:"NEAR",ARBONE:"ARBEVM",BASE:"BASEEVM",SUI:"SUI",CRONOS:"CRO",CRO:"CRO",APT:"APT",SCROLL:"SCROLLETH",TAIKO:"TAIKOETH",HYPE:"HYPE",ALGO:"ALGO",LINEA:"LINEAETH",BLAST:"BLASTETH",XLM:"XLM",RSK:"RBTC",TON:"TON",MNT:"MNT",CELO:"CELO",HBAR:"HBAR",ZKSERA:"ZKSERA",KLAY:"KLAY",EOS:"EOS",ACA:"ACA",XTZ:"XTZ",EGLD:"EGLD",GLMR:"GLMR",AURORA:"AURORAEVM",KON:"KONET",GATECHAIN:"GTEVM",KUSAMA:"KSMSM",OKC:"OKT",POLKADOT:"DOTSM",LUNA:"LUNC"},networksById:{OPETH:"OP"},timeInForce:{GTC:"gtc",IOC:"ioc",PO:"poc",POC:"poc",FOK:"fok"},accountsByType:{funding:"spot",spot:"spot",margin:"margin",cross_margin:"cross_margin",cross:"cross_margin",isolated:"margin",swap:"futures",future:"delivery",futures:"futures",delivery:"delivery",option:"options",options:"options"},swap:{fetchMarkets:{settlementCurrencies:["usdt","btc"]}},future:{fetchMarkets:{settlementCurrencies:["usdt"]}}},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerDirection:!0,triggerPriceType:void 0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,iceberg:!0,selfTradePrevention:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0},createOrders:{max:40},fetchMyTrades:{marginMode:!0,limit:1e3,daysBack:void 0,untilDays:30,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,trigger:!0,trailing:!1,limit:100,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,trigger:!0,trailing:!1,limit:100,untilDays:30,daysBack:void 0,daysBackCanceled:void 0,symbolRequired:!1},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"spot",createOrder:{marginMode:!1,triggerPriceType:{last:!0,mark:!0,index:!0}},createOrders:{max:10},fetchMyTrades:{marginMode:!1,untilDays:void 0},fetchOpenOrders:{marginMode:!1},fetchClosedOrders:{marginMode:!1,untilDays:void 0,limit:1e3},fetchOHLCV:{limit:1999}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}}},precisionMode:a.kb,fees:{trading:{tierBased:!0,feeSide:"get",percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("1.5"),this.parseNumber("0.00185")],[this.parseNumber("3"),this.parseNumber("0.00175")],[this.parseNumber("6"),this.parseNumber("0.00165")],[this.parseNumber("12.5"),this.parseNumber("0.00155")],[this.parseNumber("25"),this.parseNumber("0.00145")],[this.parseNumber("75"),this.parseNumber("0.00135")],[this.parseNumber("200"),this.parseNumber("0.00125")],[this.parseNumber("500"),this.parseNumber("0.00115")],[this.parseNumber("1250"),this.parseNumber("0.00105")],[this.parseNumber("2500"),this.parseNumber("0.00095")],[this.parseNumber("3000"),this.parseNumber("0.00085")],[this.parseNumber("6000"),this.parseNumber("0.00075")],[this.parseNumber("11000"),this.parseNumber("0.00065")],[this.parseNumber("20000"),this.parseNumber("0.00055")],[this.parseNumber("40000"),this.parseNumber("0.00055")],[this.parseNumber("75000"),this.parseNumber("0.00055")]],taker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("1.5"),this.parseNumber("0.00195")],[this.parseNumber("3"),this.parseNumber("0.00185")],[this.parseNumber("6"),this.parseNumber("0.00175")],[this.parseNumber("12.5"),this.parseNumber("0.00165")],[this.parseNumber("25"),this.parseNumber("0.00155")],[this.parseNumber("75"),this.parseNumber("0.00145")],[this.parseNumber("200"),this.parseNumber("0.00135")],[this.parseNumber("500"),this.parseNumber("0.00125")],[this.parseNumber("1250"),this.parseNumber("0.00115")],[this.parseNumber("2500"),this.parseNumber("0.00105")],[this.parseNumber("3000"),this.parseNumber("0.00095")],[this.parseNumber("6000"),this.parseNumber("0.00085")],[this.parseNumber("11000"),this.parseNumber("0.00075")],[this.parseNumber("20000"),this.parseNumber("0.00065")],[this.parseNumber("40000"),this.parseNumber("0.00065")],[this.parseNumber("75000"),this.parseNumber("0.00065")]]}},swap:{tierBased:!0,feeSide:"base",percentage:!0,maker:this.parseNumber("0.0"),taker:this.parseNumber("0.0005"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.0000")],[this.parseNumber("1.5"),this.parseNumber("-0.00005")],[this.parseNumber("3"),this.parseNumber("-0.00005")],[this.parseNumber("6"),this.parseNumber("-0.00005")],[this.parseNumber("12.5"),this.parseNumber("-0.00005")],[this.parseNumber("25"),this.parseNumber("-0.00005")],[this.parseNumber("75"),this.parseNumber("-0.00005")],[this.parseNumber("200"),this.parseNumber("-0.00005")],[this.parseNumber("500"),this.parseNumber("-0.00005")],[this.parseNumber("1250"),this.parseNumber("-0.00005")],[this.parseNumber("2500"),this.parseNumber("-0.00005")],[this.parseNumber("3000"),this.parseNumber("-0.00008")],[this.parseNumber("6000"),this.parseNumber("-0.01000")],[this.parseNumber("11000"),this.parseNumber("-0.01002")],[this.parseNumber("20000"),this.parseNumber("-0.01005")],[this.parseNumber("40000"),this.parseNumber("-0.02000")],[this.parseNumber("75000"),this.parseNumber("-0.02005")]],taker:[[this.parseNumber("0"),this.parseNumber("0.00050")],[this.parseNumber("1.5"),this.parseNumber("0.00048")],[this.parseNumber("3"),this.parseNumber("0.00046")],[this.parseNumber("6"),this.parseNumber("0.00044")],[this.parseNumber("12.5"),this.parseNumber("0.00042")],[this.parseNumber("25"),this.parseNumber("0.00040")],[this.parseNumber("75"),this.parseNumber("0.00038")],[this.parseNumber("200"),this.parseNumber("0.00036")],[this.parseNumber("500"),this.parseNumber("0.00034")],[this.parseNumber("1250"),this.parseNumber("0.00032")],[this.parseNumber("2500"),this.parseNumber("0.00030")],[this.parseNumber("3000"),this.parseNumber("0.00030")],[this.parseNumber("6000"),this.parseNumber("0.00030")],[this.parseNumber("11000"),this.parseNumber("0.00030")],[this.parseNumber("20000"),this.parseNumber("0.00030")],[this.parseNumber("40000"),this.parseNumber("0.00030")],[this.parseNumber("75000"),this.parseNumber("0.00030")]]}}},exceptions:{exact:{INVALID_PARAM_VALUE:o.BadRequest,INVALID_PROTOCOL:o.BadRequest,INVALID_ARGUMENT:o.BadRequest,INVALID_REQUEST_BODY:o.BadRequest,MISSING_REQUIRED_PARAM:o.ArgumentsRequired,BAD_REQUEST:o.BadRequest,INVALID_CONTENT_TYPE:o.BadRequest,NOT_ACCEPTABLE:o.BadRequest,METHOD_NOT_ALLOWED:o.BadRequest,NOT_FOUND:o.ExchangeError,AUTHENTICATION_FAILED:o.AuthenticationError,INVALID_CREDENTIALS:o.AuthenticationError,INVALID_KEY:o.AuthenticationError,IP_FORBIDDEN:o.AuthenticationError,READ_ONLY:o.PermissionDenied,INVALID_SIGNATURE:o.AuthenticationError,MISSING_REQUIRED_HEADER:o.AuthenticationError,REQUEST_EXPIRED:o.AuthenticationError,ACCOUNT_LOCKED:o.AccountSuspended,FORBIDDEN:o.PermissionDenied,SUB_ACCOUNT_NOT_FOUND:o.ExchangeError,SUB_ACCOUNT_LOCKED:o.AccountSuspended,MARGIN_BALANCE_EXCEPTION:o.ExchangeError,MARGIN_TRANSFER_FAILED:o.ExchangeError,TOO_MUCH_FUTURES_AVAILABLE:o.ExchangeError,FUTURES_BALANCE_NOT_ENOUGH:o.InsufficientFunds,ACCOUNT_EXCEPTION:o.ExchangeError,SUB_ACCOUNT_TRANSFER_FAILED:o.ExchangeError,ADDRESS_NOT_USED:o.ExchangeError,TOO_FAST:o.RateLimitExceeded,WITHDRAWAL_OVER_LIMIT:o.ExchangeError,API_WITHDRAW_DISABLED:o.ExchangeNotAvailable,INVALID_WITHDRAW_ID:o.ExchangeError,INVALID_WITHDRAW_CANCEL_STATUS:o.ExchangeError,INVALID_PRECISION:o.InvalidOrder,INVALID_CURRENCY:o.BadSymbol,INVALID_CURRENCY_PAIR:o.BadSymbol,POC_FILL_IMMEDIATELY:o.OrderImmediatelyFillable,ORDER_NOT_FOUND:o.OrderNotFound,CLIENT_ID_NOT_FOUND:o.OrderNotFound,ORDER_CLOSED:o.InvalidOrder,ORDER_CANCELLED:o.InvalidOrder,QUANTITY_NOT_ENOUGH:o.InvalidOrder,BALANCE_NOT_ENOUGH:o.InsufficientFunds,MARGIN_NOT_SUPPORTED:o.InvalidOrder,MARGIN_BALANCE_NOT_ENOUGH:o.InsufficientFunds,AMOUNT_TOO_LITTLE:o.InvalidOrder,AMOUNT_TOO_MUCH:o.InvalidOrder,REPEATED_CREATION:o.InvalidOrder,LOAN_NOT_FOUND:o.OrderNotFound,LOAN_RECORD_NOT_FOUND:o.OrderNotFound,NO_MATCHED_LOAN:o.ExchangeError,NOT_MERGEABLE:o.ExchangeError,NO_CHANGE:o.ExchangeError,REPAY_TOO_MUCH:o.ExchangeError,TOO_MANY_CURRENCY_PAIRS:o.InvalidOrder,TOO_MANY_ORDERS:o.InvalidOrder,TOO_MANY_REQUESTS:o.RateLimitExceeded,MIXED_ACCOUNT_TYPE:o.InvalidOrder,AUTO_BORROW_TOO_MUCH:o.ExchangeError,TRADE_RESTRICTED:o.InsufficientFunds,USER_NOT_FOUND:o.AccountNotEnabled,CONTRACT_NO_COUNTER:o.ExchangeError,CONTRACT_NOT_FOUND:o.BadSymbol,RISK_LIMIT_EXCEEDED:o.ExchangeError,INSUFFICIENT_AVAILABLE:o.InsufficientFunds,LIQUIDATE_IMMEDIATELY:o.InvalidOrder,LEVERAGE_TOO_HIGH:o.InvalidOrder,LEVERAGE_TOO_LOW:o.InvalidOrder,ORDER_NOT_OWNED:o.ExchangeError,ORDER_FINISHED:o.ExchangeError,POSITION_CROSS_MARGIN:o.ExchangeError,POSITION_IN_LIQUIDATION:o.ExchangeError,POSITION_IN_CLOSE:o.ExchangeError,POSITION_EMPTY:o.InvalidOrder,REMOVE_TOO_MUCH:o.ExchangeError,RISK_LIMIT_NOT_MULTIPLE:o.ExchangeError,RISK_LIMIT_TOO_HIGH:o.ExchangeError,RISK_LIMIT_TOO_lOW:o.ExchangeError,PRICE_TOO_DEVIATED:o.InvalidOrder,SIZE_TOO_LARGE:o.InvalidOrder,SIZE_TOO_SMALL:o.InvalidOrder,PRICE_OVER_LIQUIDATION:o.InvalidOrder,PRICE_OVER_BANKRUPT:o.InvalidOrder,ORDER_POC_IMMEDIATE:o.OrderImmediatelyFillable,INCREASE_POSITION:o.InvalidOrder,CONTRACT_IN_DELISTING:o.ExchangeError,INTERNAL:o.ExchangeNotAvailable,SERVER_ERROR:o.ExchangeNotAvailable,TOO_BUSY:o.ExchangeNotAvailable,CROSS_ACCOUNT_NOT_FOUND:o.ExchangeError,RISK_LIMIT_TOO_LOW:o.BadRequest,AUTO_TRIGGER_PRICE_LESS_LAST:o.InvalidOrder,AUTO_TRIGGER_PRICE_GREATE_LAST:o.InvalidOrder,POSITION_HOLDING:o.BadRequest,USER_LOAN_EXCEEDED:o.BadRequest},broad:{}}})}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}async loadUnifiedStatus(e={}){if(void 0===this.safeBool(this.options,"unifiedAccount"))try{const t=await this.privateAccountGetDetail(e),i=this.safeDict(t,"key",{});this.options.unifiedAccount=2===this.safeInteger(i,"mode")}catch(e){this.options.unifiedAccount=!1}return this.options.unifiedAccount}async upgradeUnifiedTradeAccount(e={}){return await this.privateUnifiedPutUnifiedMode(e)}async fetchTime(e={}){const t=await this.publicSpotGetTime(e);return this.safeInteger(t,"server_time")}createExpiredOptionMarket(e){const t="USDT",i=t,s=e.split("-"),r=e.split("/"),a=e.split("_");let o,n=this.safeString(s,1);e.indexOf("/")>-1?o=this.safeString(r,0):(o=this.safeString(a,0),n=n.slice(2,8));const d=this.safeString(s,2),h=this.safeString(s,3),c=this.convertExpireDate(n),l=this.parse8601(c);return{id:o+"_"+t+"-20"+n+"-"+d+"-"+h,symbol:o+"/"+t+":"+i+"-"+n+"-"+d+"-"+h,base:o,quote:t,settle:i,baseId:o,quoteId:t,settleId:i,active:!1,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:this.parseNumber("1"),expiry:l,expiryDatetime:c,optionType:"C"===h?"call":"put",strike:this.parseNumber(d),precision:{amount:this.parseNumber("1"),price:void 0},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.indexOf("-C")>-1||e.indexOf("-P")>-1)&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=this.safeBool(this.options,"sandboxMode",!1);let i=[this.fetchContractMarkets(e),this.fetchOptionMarkets(e)];if(!t){const t=[this.fetchSpotMarkets(e)];i=this.arrayConcat(i,t)}const s=await Promise.all(i),r=this.safeValue(s,0,[]),a=this.safeValue(s,1,[]),o=this.safeValue(s,2,[]),n=this.arrayConcat(r,a);return this.arrayConcat(n,o)}async fetchSpotMarkets(e={}){const t=this.publicMarginGetCurrencyPairs(e),i=this.publicSpotGetCurrencyPairs(e),[s,a]=await Promise.all([t,i]),o=this.indexBy(s,"id"),n=[];for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"id"),s=this.safeValue(o,i),d=this.deepExtend(s,t),[h,c]=i.split("_"),l=this.safeCurrencyCode(h),u=this.safeCurrencyCode(c),f=this.safeString(d,"fee"),p=this.safeString(d,"maker_fee_rate",f),m=this.parseNumber(this.parsePrecision(this.safeString(d,"amount_precision"))),g=this.safeString(d,"trade_status"),v=void 0!==this.safeNumber(d,"leverage");n.push({id:i,symbol:l+"/"+u,base:l,quote:u,settle:void 0,baseId:h,quoteId:c,settleId:void 0,type:"spot",spot:!0,margin:v,swap:!1,future:!1,option:!1,active:"tradable"===g,contract:!1,linear:void 0,inverse:void 0,taker:this.parseNumber(r.Y.stringDiv(f,"100")),maker:this.parseNumber(r.Y.stringDiv(p,"100")),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:m,price:this.parseNumber(this.parsePrecision(this.safeString(d,"precision")))},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(d,"leverage",1)},amount:{min:this.safeNumber(t,"min_base_amount",m),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(d,"min_quote_amount"),max:v?this.safeNumber(d,"max_quote_amount"):void 0}},created:void 0,info:d})}return n}async fetchContractMarkets(e={}){const t=[],i=this.getSettlementCurrencies("swap","fetchMarkets"),s=this.getSettlementCurrencies("future","fetchMarkets");for(let s=0;s<i.length;s++){const r=i[s],a={settle:r},o=await this.publicFuturesGetSettleContracts(this.extend(a,e));for(let e=0;e<o.length;e++){const i=this.parseContractMarket(o[e],r);t.push(i)}}for(let i=0;i<s.length;i++){const r=s[i],a={settle:r},o=await this.publicDeliveryGetSettleContracts(this.extend(a,e));for(let e=0;e<o.length;e++){const i=this.parseContractMarket(o[e],r);t.push(i)}}return t}parseContractMarket(e,t){const i=this.safeString(e,"name"),s=i.split("_"),a=this.safeString(s,0),o=this.safeString(s,1),n=this.safeString(s,2),d=this.safeCurrencyCode(a),h=this.safeCurrencyCode(o),c=this.safeCurrencyCode(t),l=this.safeTimestamp(e,"expire_time");let u="",f="swap";void 0!==n?(u=d+"/"+h+":"+c+"-"+this.yymmdd(l,""),f="future"):u=d+"/"+h+":"+c;const p=this.safeString(e,"order_price_deviate"),m=this.safeString(e,"mark_price"),g=r.Y.stringSub("1",p),v=r.Y.stringAdd("1",p),y=r.Y.stringMul(g,m),w=r.Y.stringMul(v,m),b=this.safeString(e,"taker_fee_rate"),k=this.safeString(e,"maker_fee_rate",b),S=h===c;return{id:i,symbol:u,base:d,quote:h,settle:c,baseId:a,quoteId:o,settleId:t,type:f,spot:!1,margin:!1,swap:"swap"===f,future:"future"===f,option:"option"===f,active:!0,contract:!0,linear:S,inverse:!S,taker:this.parseNumber(r.Y.stringDiv(b,"100")),maker:this.parseNumber(r.Y.stringDiv(k,"100")),contractSize:this.safeNumber(e,"quanto_multiplier"),expiry:l,expiryDatetime:this.iso8601(l),strike:void 0,optionType:void 0,precision:{amount:this.parseNumber("1"),price:this.safeNumber(e,"order_price_round")},limits:{leverage:{min:this.safeNumber(e,"leverage_min"),max:this.safeNumber(e,"leverage_max")},amount:{min:this.safeNumber(e,"order_size_min"),max:this.safeNumber(e,"order_size_max")},price:{min:this.parseNumber(y),max:this.parseNumber(w)},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchOptionMarkets(e={}){const t=[],i=await this.fetchOptionUnderlyings();for(let s=0;s<i.length;s++){const a=i[s],o=this.extend({},e);o.underlying=a;const n=await this.publicOptionsGetContracts(o);for(let e=0;e<n.length;e++){const i=n[e],s=this.safeString(i,"name"),o=a.split("_"),d=this.safeString(o,0),h=this.safeString(o,1),c=this.safeCurrencyCode(d),l=this.safeCurrencyCode(h);let u=c+"/"+l;const f=this.safeTimestamp(i,"expiration_time"),p=this.safeString(i,"strike_price"),m=this.safeValue(i,"is_call"),g=m?"C":"P",v=m?"call":"put";u=u+":"+l+"-"+this.yymmdd(f)+"-"+p+"-"+g;const y=this.safeString(i,"order_price_deviate"),w=this.safeString(i,"mark_price"),b=r.Y.stringSub("1",y),k=r.Y.stringAdd("1",y),S=r.Y.stringMul(b,w),O=r.Y.stringMul(k,w),T=this.safeString(i,"taker_fee_rate"),P=this.safeString(i,"maker_fee_rate",T);t.push({id:s,symbol:u,base:c,quote:l,settle:l,baseId:d,quoteId:h,settleId:h,type:"option",spot:!1,margin:!1,swap:!1,future:!1,option:!0,active:!0,contract:!0,linear:!0,inverse:!1,taker:this.parseNumber(r.Y.stringDiv(T,"100")),maker:this.parseNumber(r.Y.stringDiv(P,"100")),contractSize:this.parseNumber("1"),expiry:f,expiryDatetime:this.iso8601(f),strike:p,optionType:v,precision:{amount:this.parseNumber("1"),price:this.safeNumber(i,"order_price_round")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(i,"order_size_min"),max:this.safeNumber(i,"order_size_max")},price:{min:this.parseNumber(S),max:this.parseNumber(O)},cost:{min:void 0,max:void 0}},created:this.safeTimestamp(i,"create_time"),info:i})}}return t}async fetchOptionUnderlyings(){const e=await this.publicOptionsGetUnderlyings(),t=[];for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"name");void 0!==r&&t.push(r)}return t}prepareRequest(e=void 0,t=void 0,i={}){const s={};if(void 0!==e)e.contract?(s.contract=e.id,e.option||(s.settle=e.settleId)):s.currency_pair=e.id;else{const e="swap"===t;if(e||"future"===t){const t=e?"usdt":"btc",r=this.safeStringLower(i,"settle",t);i=this.omit(i,"settle"),s.settle=r}}return[s,i]}spotOrderPrepareRequest(e=void 0,t=!1,i={}){const[s,r]=this.getMarginMode(t,i),a={};if(!t){if(void 0===e)throw new o.ArgumentsRequired(this.id+" spotOrderPrepareRequest() requires a market argument for non-trigger orders");a.account=s,a.currency_pair=e.id}return[a,r]}multiOrderSpotPrepareRequest(e=void 0,t=!1,i={}){const[s,r]=this.getMarginMode(t,i),a={account:s};return void 0!==e&&(t?a.market=e.id:a.currency_pair=e.id),[a,r]}getMarginMode(e,t){const i=this.safeStringLower2(this.options,"defaultMarginMode","marginMode","spot");let s=this.safeStringLower2(t,"marginMode","account",i);if(t=this.omit(t,["marginMode","account"]),"cross"===s?s="cross_margin":"isolated"===s?s="margin":""===s&&(s="spot"),e&&("spot"===s&&(s="normal"),"cross_margin"===s))throw new o.BadRequest(this.id+" getMarginMode() does not support trigger orders for cross margin");let r=!1;return[r,t]=this.handleOptionAndParams(t,"getMarginMode","unifiedAccount"),r&&(s="unified"),[s,t]}getSettlementCurrencies(e,t){const i=this.safeValue(this.options,e,{}),s=this.safeValue(i,t,{}),r="swap"===e?["usdt"]:["btc"];return this.safeValue(s,"settlementCurrencies",r)}async fetchCurrencies(e={}){if(void 0!==this.safeValue(this.urls,"apiBackup"))return;this.checkRequiredCredentials(!1)&&await this.loadUnifiedStatus();const t=await this.publicSpotGetCurrencies(e),i=this.indexBy(t,"currency"),s={};for(let e=0;e<t.length;e++){const r=t[e],a=this.safeString(r,"currency"),o=a.split("_"),n=this.safeString(o,0),d=a.endsWith("_OLD")?a:n,h=!this.safeBool(r,"withdraw_disabled"),c=!this.safeBool(r,"deposit_disabled"),l=!this.safeBool(r,"trade_disabled"),u=this.parseNumber("0.0001"),f=this.safeCurrencyCode(d);let p=!1;if(a.endsWith("3S")||a.endsWith("3L")||a.endsWith("5S")||a.endsWith("5L")){a.slice(0,-2)in i&&(p=!0)}const m=p?"leveraged":"crypto",g=this.safeString(r,"chain",a),v=this.networkIdToCode(g,f),y={info:r,id:g,network:v,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},active:!l,deposit:c,withdraw:h,fee:void 0,precision:u};f in s||(s[f]={id:d,lowerCaseId:d.toLowerCase(),code:f,type:m,precision:u,limits:this.limits,networks:{},info:[]}),s[f].networks[v]=y;const w=this.safeList(s[f],"info",[]);w.push(r),s[f].info=w,s[f]=this.safeCurrencyStructure(s[f])}return s}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new o.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const[s,r]=this.prepareRequest(i,void 0,t),a=await this.publicFuturesGetSettleContractsContract(this.extend(s,r));return this.parseFundingRate(a)}async fetchFundingRates(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))){const t=this.safeString(e,0);i=this.market(t)}const[s,r]=this.prepareRequest(i,"swap",t),a=await this.publicFuturesGetSettleContracts(this.extend(s,r));return this.parseFundingRates(a,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"name"),s=this.safeSymbol(i,t,"_","swap"),a=this.safeNumber(e,"mark_price"),o=this.safeNumber(e,"index_price"),n=this.safeNumber(e,"interest_rate"),d=this.safeNumber(e,"funding_rate"),h=this.safeTimestamp(e,"funding_next_apply"),c=this.safeNumber(e,"funding_rate_indicative"),l=r.Y.stringMul("1000",this.safeString(e,"funding_interval"));return{info:e,symbol:s,markPrice:a,indexPrice:o,interestRate:n,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:d,fundingTimestamp:h,fundingDatetime:this.iso8601(h),nextFundingRate:c,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(l)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchNetworkDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.privateWalletGetDepositAddress(this.extend(i,t)),r=this.safeValue(s,"multichain_addresses"),a=this.safeString(s,"currency");e=this.safeCurrencyCode(a);const o={};for(let t=0;t<r.length;t++){const i=r[t];if(this.safeInteger(i,"obtain_failed"))continue;const s=this.safeString(i,"chain"),a=this.safeString(i,"address"),n=this.safeString(i,"payment_id");o[s]={info:i,code:e,currency:e,address:a,tag:n}}return o}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();let i=this.currency(e);const s={currency:i.id},r=await this.privateWalletGetDepositAddress(this.extend(s,t)),a=this.safeValue(r,"multichain_addresses",[]),o=this.safeString(r,"currency");i=this.safeCurrency(o,i);const n=this.parseDepositAddresses(a,[i.code],!1,{currency:i.id});return this.indexBy(n,"network")}async fetchDepositAddress(e,t={}){let i;await this.loadMarkets(),[i,t]=this.handleNetworkCodeAndParams(t);const s=await this.fetchDepositAddressesByNetwork(e,t);return s[this.selectNetworkCodeFromUnifiedNetworks(e,i,s)]}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");return this.checkAddress(i),{info:e,currency:this.safeString(t,"code"),address:i,tag:this.safeString(e,"payment_id"),network:this.networkIdToCode(this.safeString(e,"chain"))}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={currency_pair:i.id},r=await this.privateWalletGetFee(this.extend(s,t));return this.parseTradingFee(r,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateWalletGetFee(e);return this.parseTradingFees(t)}parseTradingFees(e){const t={};for(let i=0;i<this.symbols.length;i++){const s=this.symbols[i],r=this.market(s);t[s]=this.parseTradingFee(e,r)}return t}parseTradingFee(e,t=void 0){const i=this.safeValue(e,"gt_discount"),s=i?"gt_taker_fee":"taker_fee",r=i?"gt_maker_fee":"maker_fee",a=this.safeValue(t,"contract"),o=a?"futures_taker_fee":s,n=a?"futures_maker_fee":r;return{info:e,symbol:this.safeString(t,"symbol"),maker:this.safeNumber(e,n),taker:this.safeNumber(e,o),percentage:void 0,tierBased:void 0}}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privateWalletGetWithdrawStatus(t),s={};let r={};for(let t=0;t<i.length;t++){r={};const a=i[t],o=this.safeString(a,"currency"),n=this.safeCurrencyCode(o);if(void 0!==e&&!this.inArray(n,e))continue;const d=this.safeValue(a,"withdraw_fix_on_chains");if(void 0===d)r=this.safeNumber(a,"withdraw_fix");else{const e=Object.keys(d);for(let t=0;t<e.length;t++){const i=e[t];r[i]=this.parseNumber(d[i])}}s[n]={withdraw:r,deposit:void 0,info:a}}return s}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.privateWalletGetWithdrawStatus(t);return this.parseDepositWithdrawFees(i,e,"currency")}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"withdraw_fix_on_chains"),s={info:e,withdraw:{fee:this.safeNumber(e,"withdraw_fix"),percentage:!1},deposit:{fee:this.safeNumber(e,"deposit"),percentage:!1},networks:{}};if(void 0!==i){const t=Object.keys(i);for(let r=0;r<t.length;r++){const a=t[r],o=this.networkIdToCode(a,this.safeString(e,"currency"));s.networks[o]={withdraw:{fee:this.parseNumber(i[a]),percentage:!1},deposit:{fee:void 0,percentage:void 0}}}}return s}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e),e=r.symbol);const[a,n]=this.handleMarketTypeAndParams("fetchFundingHistory",r,s),[d,h]=this.prepareRequest(r,a,n);let c;if(d.type="fund",void 0!==t&&(d.from=this.parseToInt(t/1e3)),void 0!==i&&(d.limit=i),"swap"===a)c=await this.privateFuturesGetSettleAccountBook(this.extend(d,h));else{if("future"!==a)throw new o.NotSupported(this.id+" fetchFundingHistory() only support swap & future market type");c=await this.privateDeliveryGetSettleAccountBook(this.extend(d,h))}return this.parseFundingHistories(c,e,t,i)}parseFundingHistories(e,t,i,s){const r=[];for(let t=0;t<e.length;t++){const i=e[t],s=this.parseFundingHistory(i);r.push(s)}const a=this.sortBy(r,"timestamp");return this.filterBySymbolSinceLimit(a,t,i,s)}parseFundingHistory(e,t=void 0){const i=this.safeTimestamp(e,"time"),s=this.safeString(e,"text");return t=this.safeMarket(s,t,"_","swap"),{info:e,symbol:this.safeString(t,"symbol"),code:this.safeString(t,"settle"),timestamp:i,datetime:this.iso8601(i),id:void 0,amount:this.safeNumber(e,"change")}}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),[r,a]=this.prepareRequest(s,s.type,i);let n;if(void 0!==t&&(r.limit=t),r.with_id=!0,s.spot||s.margin)n=await this.publicSpotGetOrderBook(this.extend(r,a));else if(s.swap)n=await this.publicFuturesGetSettleOrderBook(this.extend(r,a));else if(s.future)n=await this.publicDeliveryGetSettleOrderBook(this.extend(r,a));else{if(!s.option)throw new o.NotSupported(this.id+" fetchOrderBook() not support this market type");n=await this.publicOptionsGetOrderBook(this.extend(r,a))}let d=this.safeInteger(n,"current");s.spot||(d*=1e3);const h=s.spot?0:"p",c=s.spot?1:"s",l=this.safeInteger(n,"id"),u=this.parseOrderBook(n,e,d,"bids","asks",h,c);return u.nonce=l,u}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),[s,r]=this.prepareRequest(i,void 0,t);let a,n;if(i.spot||i.margin)a=await this.publicSpotGetTickers(this.extend(s,r));else if(i.swap)a=await this.publicFuturesGetSettleTickers(this.extend(s,r));else if(i.future)a=await this.publicDeliveryGetSettleTickers(this.extend(s,r));else{if(!i.option)throw new o.NotSupported(this.id+" fetchTicker() not support this market type");{const e=i.id.split("-");s.underlying=this.safeString(e,0),a=await this.publicOptionsGetTickers(this.extend(s,r))}}if(i.option)for(let e=0;e<a.length;e++){const t=a[e];if(t.name===i.id){n=t;break}}else n=this.safeValue(a,0);return this.parseTicker(n,i)}parseTicker(e,t=void 0){const i=this.safeStringN(e,["currency_pair","contract","name"]),s="mark_price"in e?"contract":"spot",r=this.safeSymbol(i,t,"_",s),a=this.safeString2(e,"last","last_price"),o=this.safeStringN(e,["lowest_ask","a","ask1_price"]),n=this.safeStringN(e,["highest_bid","b","bid1_price"]),d=this.safeString(e,"high_24h"),h=this.safeString(e,"low_24h"),c=this.safeString2(e,"B","bid1_size"),l=this.safeString2(e,"A","ask1_size"),u=this.safeInteger(e,"t");let f=this.safeString2(e,"base_volume","volume_24h_base");"nan"===f&&(f="0");let p=this.safeString2(e,"quote_volume","volume_24h_quote");"nan"===p&&(p="0");const m=this.safeString(e,"change_percentage");return this.safeTicker({symbol:r,timestamp:u,datetime:this.iso8601(u),high:d,low:h,bid:n,bidVolume:c,ask:o,askVolume:l,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:m,average:void 0,baseVolume:f,quoteVolume:p,markPrice:this.safeString(e,"mark_price"),indexPrice:this.safeString(e,"index_price"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString(e,0);let s;void 0!==i&&(s=this.market(i));const[r,a]=this.handleMarketTypeAndParams("fetchTickers",s,t),[n,d]=this.prepareRequest(void 0,r,a);let h;if(n.timezone="utc0","spot"===r||"margin"===r)h=await this.publicSpotGetTickers(this.extend(n,d));else if("swap"===r)h=await this.publicFuturesGetSettleTickers(this.extend(n,d));else if("future"===r)h=await this.publicDeliveryGetSettleTickers(this.extend(n,d));else{if("option"!==r)throw new o.NotSupported(this.id+' fetchTickers() not support this market type, provide symbols or set params["defaultType"] to one from spot/margin/swap/future/option');{this.checkRequiredArgument("fetchTickers",e,"symbols");const t=s.id.split("-");n.underlying=this.safeString(t,0),h=await this.publicOptionsGetTickers(this.extend(n,d))}}return this.parseTickers(h,e)}parseBalanceHelper(e){const t=this.account();return t.used=this.safeString2(e,"freeze","locked"),t.free=this.safeString(e,"available"),t.total=this.safeString(e,"total"),"borrowed"in e&&(t.debt=this.safeString(e,"borrowed")),t}async fetchBalance(e={}){await this.loadMarkets(),await this.loadUnifiedStatus();const t=this.safeString(e,"symbol");e=this.omit(e,"symbol");let i=!1;[i,e]=this.handleOptionAndParams(e,"fetchBalance","unifiedAccount");const[s,r]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[a,n]=this.prepareRequest(void 0,s,r),[d,h]=this.getMarginMode(!1,n);if(void 0!==t){const e=this.market(t);a.currency_pair=e.id}let c;if(i)c=await this.privateUnifiedGetAccounts(this.extend(a,e));else if("spot"===s)if("spot"===d)c=await this.privateSpotGetAccounts(this.extend(a,h));else if("margin"===d)c=await this.privateMarginGetAccounts(this.extend(a,h));else{if("cross_margin"!==d)throw new o.NotSupported(this.id+" fetchBalance() not support this marginMode");c=await this.privateMarginGetCrossAccounts(this.extend(a,h))}else if("funding"===s)c=await this.privateMarginGetFundingAccounts(this.extend(a,h));else if("swap"===s)c=await this.privateFuturesGetSettleAccounts(this.extend(a,h));else if("future"===s)c=await this.privateDeliveryGetSettleAccounts(this.extend(a,h));else{if("option"!==s)throw new o.NotSupported(this.id+" fetchBalance() not support this market type");c=await this.privateOptionsGetAccounts(this.extend(a,h))}("swap"===s||"future"===s||"option"===s)&&(c=[c]);const l={info:c},u="margin"===d;let f=c;if("balances"in f){const e=[],t=this.safeValue(f,"balances",[]),i=Object.keys(t);for(let s=0;s<i.length;s++){const r=i[s],a=t[r];a.currency=r,e.push(a)}f=e}for(let e=0;e<f.length;e++){const t=f[e];if(u){const e=this.safeString(t,"currency_pair"),i=this.safeSymbol(e,void 0,"_","margin"),s=this.safeValue(t,"base",{}),r=this.safeValue(t,"quote",{}),a=this.safeCurrencyCode(this.safeString(s,"currency")),o=this.safeCurrencyCode(this.safeString(r,"currency")),n={};n[a]=this.parseBalanceHelper(s),n[o]=this.parseBalanceHelper(r),l[i]=this.safeBalance(n)}else{l[this.safeCurrencyCode(this.safeString(t,"currency"))]=this.parseBalanceHelper(t)}}return u?l:this.safeBalance(l)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);if(a.option)return await this.fetchOptionOHLCV(e,t,i,s,r);const n=this.safeString(r,"price");let d={};[d,r]=this.prepareRequest(a,void 0,r),d.interval=this.safeString(this.timeframes,t,t);const h=a.contract?1999:1e3;s=void 0===s?h:Math.min(s,h);let c,l=this.safeInteger(r,"until");if(void 0!==l&&(l=this.parseToInt(l/1e3),r=this.omit(r,"until")),void 0!==i){const e=this.parseTimeframe(t);d.from=this.parseToInt(i/1e3);const r=(s-1)*e,a=this.sum(d.from,r),o=this.seconds(),n=Math.min(a,o);d.to=void 0!==l?Math.min(n,l):n}else void 0!==l&&(d.to=l),d.limit=s;if(a.contract){("mark"===n||"index"===n)&&(d.contract=n+"_"+a.id,r=this.omit(r,"price")),a.future?c=await this.publicDeliveryGetSettleCandlesticks(this.extend(d,r)):a.swap&&(c=await this.publicFuturesGetSettleCandlesticks(this.extend(d,r)))}else c=await this.publicSpotGetCandlesticks(this.extend(d,r));return this.parseOHLCVs(c,a,t,i,s)}async fetchOptionOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o={};[o,r]=this.prepareRequest(a,void 0,r),o.interval=this.safeString(this.timeframes,t,t);const n=await this.publicOptionsGetCandlesticks(this.extend(o,r));return this.parseOHLCVs(n,a,t,i,s)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),r)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s);const a=this.market(e);if(!a.swap)throw new o.BadSymbol(this.id+" fetchFundingRateHistory() supports swap contracts only");let n={};[n,s]=this.prepareRequest(a,void 0,s),void 0!==i&&(n.limit=i),void 0!==t&&(n.from=this.parseToInt(t/1e3));const d=this.safeInteger(s,"until");void 0!==d&&(s=this.omit(s,"until"),n.to=this.parseToInt(d/1e3));const h=await this.publicFuturesGetSettleFundingRate(this.extend(n,s)),c=[];for(let t=0;t<h.length;t++){const i=h[t],s=this.safeTimestamp(i,"t");c.push({info:i,symbol:e,fundingRate:this.safeNumber(i,"r"),timestamp:s,datetime:this.iso8601(s)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,a.symbol,t,i)}parseOHLCV(e,t=void 0){return Array.isArray(e)?[this.safeTimestamp(e,0),this.safeNumber(e,5),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,6)]:[this.safeTimestamp(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);const a=this.market(e),[n,d]=this.prepareRequest(a,void 0,s),h=this.safeInteger2(s,"to","until");let c;if(void 0!==h&&(s=this.omit(s,["until"]),n.to=this.parseToInt(h/1e3)),void 0!==i&&(n.limit=Math.min(i,1e3)),void 0!==t&&a.contract&&(n.from=this.parseToInt(t/1e3)),"spot"===a.type||"margin"===a.type)c=await this.publicSpotGetTrades(this.extend(n,d));else if(a.swap)c=await this.publicFuturesGetSettleTrades(this.extend(n,d));else if(a.future)c=await this.publicDeliveryGetSettleTrades(this.extend(n,d));else{if("option"!==a.type)throw new o.NotSupported(this.id+" fetchTrades() not support this market type.");c=await this.publicOptionsGetTrades(this.extend(n,d))}return this.parseTrades(c,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" fetchOrderTrades() requires a symbol argument");await this.loadMarkets();return await this.fetchMyTrades(t,i,s,{order_id:e})}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),await this.loadUnifiedStatus();let r,a,n=!1;if([n,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),n)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);let d={};const h=void 0!==e?this.market(e):void 0,c=this.safeInteger(s,"until");s=this.omit(s,["until"]),[r,s]=this.handleMarketTypeAndParams("fetchMyTrades",h,s);let l;if("swap"===r||"future"===r||"option"===r?([d,s]=this.prepareRequest(h,r,s),"option"===r&&(s=this.omit(s,"order_id"))):(void 0!==h&&(d.currency_pair=h.id),[a,s]=this.getMarginMode(!1,s),d.account=a),void 0!==i&&(d.limit=i),void 0!==t&&(d.from=this.parseToInt(t/1e3)),void 0!==c&&(d.to=this.parseToInt(c/1e3)),"spot"===r||"margin"===r)l=await this.privateSpotGetMyTrades(this.extend(d,s));else if("swap"===r)l=await this.privateFuturesGetSettleMyTradesTimerange(this.extend(d,s));else if("future"===r)l=await this.privateDeliveryGetSettleMyTrades(this.extend(d,s));else{if("option"!==r)throw new o.NotSupported(this.id+" fetchMyTrades() not support this market type.");l=await this.privateOptionsGetMyTrades(this.extend(d,s))}return this.parseTrades(l,h,t,i)}parseTrade(e,t=void 0){const i=this.safeString2(e,"id","trade_id");let s,a=this.safeString(e,"create_time_ms");void 0!==a?(a=r.Y.stringMul(a,"1000"),a=a.slice(0,13),s=this.parseToInt(a)):s=this.safeTimestamp2(e,"time","create_time");const o=this.safeString2(e,"currency_pair","contract"),n="contract"in e?"contract":"spot";t=this.safeMarket(o,t,"_",n);let d=this.safeString2(e,"amount","size");const h=this.safeString(e,"price"),c=r.Y.stringLt(d,"0")?"sell":"buy";d=r.Y.stringAbs(d);const l=this.safeString2(e,"side","type",c),u=this.safeString(e,"order_id"),f=this.safeString(e,"fee"),p=this.omitZero(this.safeString(e,"gt_fee")),m=this.omitZero(this.safeString(e,"point_fee")),g=[];if(void 0!==f){const i=this.safeString(e,"fee_currency");let s=this.safeCurrencyCode(i);void 0===s&&(s=this.safeString(t,"settle")),g.push({cost:f,currency:s})}void 0!==p&&g.push({cost:p,currency:"GT"}),void 0!==m&&g.push({cost:m,currency:"GatePoint"});const v=this.safeString(e,"role");return this.safeTrade({info:e,id:i,timestamp:s,datetime:this.iso8601(s),symbol:t.symbol,order:u,type:void 0,side:l,takerOrMaker:v,price:h,amount:d,cost:void 0,fee:void 0,fees:g},t)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchDeposits",e,t,i,s);let a,o={};if(void 0!==e&&(a=this.currency(e),o.currency=a.id),void 0!==i&&(o.limit=i),void 0!==t){const e=this.parseToInt(t/1e3);o.from=e,o.to=this.sum(e,2592e3)}[o,s]=this.handleUntilOption("to",o,s);const n=await this.privateWalletGetDeposits(this.extend(o,s));return this.parseTransactions(n,a)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchWithdrawals",e,t,i,s);let a,o={};if(void 0!==e&&(a=this.currency(e),o.currency=a.id),void 0!==i&&(o.limit=i),void 0!==t){const e=this.parseToInt(t/1e3);o.from=e,o.to=this.sum(e,2592e3)}[o,s]=this.handleUntilOption("to",o,s);const n=await this.privateWalletGetWithdrawals(this.extend(o,s));return this.parseTransactions(n,a)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={currency:a.id,address:i,amount:this.currencyToPrecision(e,t)};let n;void 0!==s&&(o.memo=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chain=this.networkCodeToId(n));const d=await this.privateWithdrawalsPostWithdrawals(this.extend(o,r));return this.parseTransaction(d,a)}parseTransactionStatus(e){return this.safeString({PEND:"pending",REQUEST:"pending",DMOVE:"pending",MANUAL:"pending",VERIFY:"pending",PROCES:"pending",EXTPEND:"pending",SPLITPEND:"pending",CANCEL:"canceled",FAIL:"failed",INVALID:"failed",DONE:"ok",BCODE:"ok"},e,e)}parseTransactionType(e){return this.safeString({d:"deposit",w:"withdrawal"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id");let s,a=this.safeString(e,"amount");void 0!==i&&("b"===i[0]?(s=r.Y.stringGt(a,"0")?"deposit":"withdrawal",a=r.Y.stringAbs(a)):s=this.parseTransactionType(i[0]));const o=this.safeString2(e,"fee","fee_amount");"withdrawal"===s&&(a=r.Y.stringSub(a,o));const n=this.safeStringUpper(e,"chain"),d=this.safeString(e,"currency"),h=this.safeCurrencyCode(d),c=this.safeString(e,"txid"),l=this.safeString(e,"status"),u=this.parseTransactionStatus(l),f=this.safeString(e,"address"),p=this.safeString(e,"memo"),m=this.safeTimestamp(e,"timestamp");return{info:e,id:i,txid:c,currency:h,amount:this.parseNumber(a),network:this.networkIdToCode(n),address:f,addressTo:void 0,addressFrom:void 0,tag:p,tagTo:void 0,tagFrom:void 0,status:u,type:s,timestamp:m,datetime:this.iso8601(m),updated:void 0,internal:void 0,comment:void 0,fee:{currency:h,cost:this.parseNumber(o)}}}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets(),await this.loadUnifiedStatus();const o=this.market(e),n=this.safeValue(a,"trigger"),d=this.safeValue2(a,"triggerPrice","stopPrice"),h=this.safeValue(a,"stopLossPrice",d),c=this.safeValue(a,"takeProfitPrice"),l=!(void 0!==h||void 0!==c)&&void 0===n,u=this.createOrderRequest(e,t,i,s,r,a);let f;return f=o.spot||o.margin?l?await this.privateSpotPostOrders(u):await this.privateSpotPostPriceOrders(u):o.swap?l?await this.privateFuturesPostSettleOrders(u):await this.privateFuturesPostSettlePriceOrders(u):o.future?l?await this.privateDeliveryPostSettleOrders(u):await this.privateDeliveryPostSettlePriceOrders(u):await this.privateOptionsPostOrders(u),this.parseOrder(f,o)}createOrdersRequest(e,t={}){const i=[],s=[],r=e.length;if(0===r)throw new o.BadRequest(this.id+" createOrders() requires at least one order");if(r>10)throw new o.BadRequest(this.id+" createOrders() accepts a maximum of 10 orders at a time");for(let r=0;r<e.length;r++){const a=e[r],n=this.safeString(a,"symbol");s.push(n);const d=this.safeString(a,"type"),h=this.safeString(a,"side"),c=this.safeValue(a,"amount"),l=this.safeValue(a,"price"),u=this.safeValue(a,"params",{}),f=this.extend(u,t);if(void 0!==this.safeValueN(u,["triggerPrice","stopPrice","takeProfitPrice","stopLossPrice"]))throw new o.NotSupported(this.id+" createOrders() does not support advanced order properties (stopPrice, takeProfitPrice, stopLossPrice)");f.textIsRequired=!0;const p=this.createOrderRequest(n,d,h,c,l,f);i.push(p)}const a=this.marketSymbols(s,void 0,!1,!0,!0),n=this.market(a[0]);if(n.future||n.option)throw new o.NotSupported(this.id+" createOrders() does not support futures or options markets");return i}async createOrders(e,t={}){await this.loadMarkets(),await this.loadUnifiedStatus();const i=this.createOrdersRequest(e,t),s=e[0],r=this.market(s.symbol);let a;return r.spot?a=await this.privateSpotPostBatchOrders(i):r.swap&&(a=await this.privateFuturesPostSettleBatchOrders(i)),this.parseOrders(a)}createOrderRequest(e,t,i,s,a=void 0,n={}){const d=this.market(e),h=d.contract,c=this.safeValue(n,"trigger"),l=this.safeValue2(n,"triggerPrice","stopPrice"),u=this.safeValue(n,"stopLossPrice",l),f=this.safeValue(n,"takeProfitPrice"),p=void 0!==u,m=void 0!==f,g=p||m;if(p&&m)throw new o.ExchangeError(this.id+" createOrder() stopLossPrice and takeProfitPrice cannot both be defined");const v=this.safeValue(n,"reduceOnly"),y=this.safeStringLowerN(n,["timeInForce","tif","time_in_force"]);let w;[w,n]=this.handlePostOnly("market"===t,"poc"===y,n);let b=this.handleTimeInForce(n);w&&(b="poc"),n=this.omit(n,["stopPrice","triggerPrice","stopLossPrice","takeProfitPrice","reduceOnly","timeInForce","postOnly"]);const k="limit"===t,S="market"===t;if(k&&void 0===a)throw new o.ArgumentsRequired(this.id+" createOrder () requires a price argument for "+t+" orders");if(S){if("poc"===b||"gtc"===b)throw new o.ExchangeError(this.id+' createOrder () timeInForce for market order can only be "FOK" or "IOC"');if(void 0===b){const e=this.safeString(this.options,"defaultTimeInForce","IOC");b=this.safeString(this.options.timeInForce,e,"ioc")}h&&(a=0)}if(h){if(this.safeValue(n,"close"))s=0;else{const t=this.amountToPrecision(e,s),a="sell"===i?r.Y.stringNeg(t):t;s=parseInt(a)}}let O;if(!g&&void 0===c){if(h)O={contract:d.id,size:s},d.option||(O.settle=d.settleId),O.price=S||0===a?"0":this.priceToPrecision(e,a),void 0!==v&&(O.reduce_only=v),void 0!==b&&(O.tif=b);else{let h;if([h,n]=this.getMarginMode(!1,n),O={currency_pair:d.id,type:t,account:h,side:i},S&&"buy"===i){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===a)throw new o.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),o=this.numberToString(a),n=r.Y.stringMul(i,o);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);O.amount=t}else O.amount=this.amountToPrecision(e,s);k&&(O.price=this.priceToPrecision(e,a)),void 0!==b&&(O.time_in_force=b)}let c=this.safeString2(n,"text","clientOrderId");const l=this.safeBool(n,"textIsRequired",!1);if(void 0!==c){if(c.length>28)throw new o.BadRequest(this.id+" createOrder () clientOrderId or text param must be up to 28 characters");n=this.omit(n,["text","clientOrderId","textIsRequired"]),"t"!==c[0]&&(c="t-"+c),O.text=c}else l&&(O.text="t-"+this.uuid16())}else{if(d.option)throw new o.NotSupported(this.id+" createOrder() conditional option orders are not supported");if(h){if(O={initial:{contract:d.id,size:s},settle:d.settleId},O.initial.price="market"===t||0===a?"0":this.priceToPrecision(e,a),void 0===c){let t,s;p?(t="buy"===i?1:2,s=this.priceToPrecision(e,u)):m&&(t="buy"===i?2:1,s=this.priceToPrecision(e,f));const r=this.safeInteger(n,"price_type",0);if(r<0||r>2)throw new o.BadRequest(this.id+" createOrder () price_type should be 0 latest deal price, 1 mark price, 2 index price");n=this.omit(n,["price_type"]),O.trigger={price_type:r,price:this.priceToPrecision(e,s),rule:t}}void 0!==v&&(O.initial.reduce_only=v),void 0!==b&&(O.initial.tif=b)}else{const r=this.safeValue(this.options,"createOrder",{});let o;if([o,n]=this.getMarginMode(!0,n),void 0===b&&(b="gtc"),O={put:{type:t,side:i,price:this.priceToPrecision(e,a),amount:this.amountToPrecision(e,s),account:o,time_in_force:b},market:d.id},void 0===c){const t=this.safeInteger(r,"expiration"),s=this.safeInteger(n,"expiration",t);let a,o;p?(a="buy"===i?">=":"<=",o=this.priceToPrecision(e,u)):m&&(a="buy"===i?"<=":">=",o=this.priceToPrecision(e,f)),O.trigger={price:this.priceToPrecision(e,o),rule:a,expiration:s}}}}return this.extend(O,n)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets(),await this.loadUnifiedStatus();if(!this.market(e).spot)throw new o.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}editOrderRequest(e,t,i,s,a=void 0,n=void 0,d={}){const h=this.market(t);let c;[c,d]=this.handleMarketTypeAndParams("editOrder",h,d);let l=this.convertTypeToAccount(c),u=!1;[u,d]=this.handleOptionAndParams(d,"editOrder","unifiedAccount"),u&&(l="unified");if("spot"===l&&!("limit"===i))throw new o.InvalidOrder(this.id+" editOrder() does not support "+i+" orders for "+c+" markets");const f={order_id:e.toString(),currency_pair:h.id,account:l};return void 0!==a&&(h.spot?f.amount=this.amountToPrecision(t,a):f.size="sell"===s?this.parseToNumeric(r.Y.stringNeg(this.amountToPrecision(t,a))):this.parseToNumeric(this.amountToPrecision(t,a))),void 0!==n&&(f.price=this.priceToPrecision(t,n)),h.spot||(f.settle=h.settleId),this.extend(f,d)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets(),await this.loadUnifiedStatus();const n=this.market(t),d=this.editOrderRequest(e,t,i,s,r,a,o);let h;return h=n.spot?await this.privateSpotPatchOrdersOrderId(d):await this.privateFuturesPutSettleOrdersOrderId(d),this.parseOrder(h,n)}parseOrderStatus(e){return this.safeString({open:"open",_new:"open",filled:"closed",cancelled:"canceled",liquidated:"closed",ioc:"canceled",failed:"canceled",expired:"canceled",finished:"closed",finish:"closed",succeeded:"closed"},e,e)}parseOrder(e,t=void 0){if(!this.safeBool(e,"succeeded",!0))return this.safeOrder({clientOrderId:this.safeString(e,"text"),info:e,status:"rejected",id:this.safeString(e,"id")});const i=this.safeValue2(e,"put","initial",{}),s=this.safeValue(e,"trigger",{});let a=this.safeString(i,"contract"),o=this.safeString(i,"type"),n=this.safeStringUpper2(i,"time_in_force","tif"),d=this.safeString2(i,"amount","size"),h=this.safeString(i,"side"),c=this.safeString(i,"price");a=this.safeString(e,"contract",a),o=this.safeString(e,"type",o),n=this.safeStringUpper2(e,"time_in_force","tif",n),"POC"===n&&(n="PO");const l="PO"===n;d=this.safeString2(e,"amount","size",d),h=this.safeString(e,"side",h),c=this.safeString(e,"price",c);let u=this.safeString(e,"left"),f=this.safeString(e,"filled_total");const p=this.safeNumber(s,"price");let m=this.safeNumber2(e,"avg_deal_price","fill_price");if(p&&(u=d,f="0"),a){o=r.Y.stringEquals(c,"0")&&"IOC"===n?"market":"limit",h=r.Y.stringGt(d,"0")?"buy":"sell"}const g=this.safeStringN(e,["finish_as","status","open"]);let v=this.safeInteger(e,"create_time_ms");void 0===v&&(v=this.safeTimestamp2(e,"create_time","ctime"));let y=this.safeInteger(e,"update_time_ms");void 0===y&&(y=this.safeTimestamp2(e,"update_time","finish_time"));let w="contract";("currency_pair"in e||"market"in e)&&(w="spot");const b=this.safeString2(e,"currency_pair","market",a),k=this.safeSymbol(b,t,"_",w),S=[],O=this.safeString(e,"gt_fee");void 0!==O&&S.push({currency:"GT",cost:O});const T=this.safeString(e,"fee");void 0!==T&&S.push({currency:this.safeCurrencyCode(this.safeString(e,"fee_currency")),cost:T});const P=this.safeString(e,"rebated_fee");void 0!==P&&S.push({currency:this.safeCurrencyCode(this.safeString(e,"rebated_fee_currency")),cost:r.Y.stringNeg(P)});const I=S.length>1,M=this.parseOrderStatus(g);let x=r.Y.stringAbs(u);if("spot"===this.safeString(e,"account")){const t=this.safeString(e,"avg_deal_price");m=this.parseNumber(t),"market"===o&&"buy"===h&&(x=r.Y.stringDiv(u,t),c=void 0,f=d,d=r.Y.stringDiv(d,t))}return this.safeOrder({id:this.safeString(e,"id"),clientOrderId:this.safeString(e,"text"),timestamp:v,datetime:this.iso8601(v),lastTradeTimestamp:y,status:M,symbol:k,type:o,timeInForce:n,postOnly:l,reduceOnly:this.safeValue(e,"is_reduce_only"),side:h,price:c,triggerPrice:p,average:m,amount:r.Y.stringAbs(d),cost:r.Y.stringAbs(f),filled:void 0,remaining:x,fee:I?void 0:this.safeValue(S,0),fees:I?S:[],trades:void 0,info:e},t)}fetchOrderRequest(e,t=void 0,i={}){const s=void 0===t?void 0:this.market(t),r=this.safeBoolN(i,["trigger","is_stop_order","stop"],!1);i=this.omit(i,["is_stop_order","stop","trigger"]);let a=this.safeString2(i,"text","clientOrderId"),o=e;void 0!==a&&(i=this.omit(i,["text","clientOrderId"]),"t"!==a[0]&&(a="t-"+a),o=a);const[n,d]=this.handleMarketTypeAndParams("fetchOrder",s,i),h="swap"===n||"future"===n||"option"===n,[c,l]=h?this.prepareRequest(s,n,d):this.spotOrderPrepareRequest(s,r,d);return c.order_id=o.toString(),[c,l]}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets(),await this.loadUnifiedStatus();const s=void 0===t?void 0:this.market(t),r=this.handleMarketTypeAndParams("fetchOrder",s,i),a=this.safeString(r,0),n=this.safeBoolN(i,["trigger","is_stop_order","stop"],!1),[d,h]=this.fetchOrderRequest(e,t,i);let c;if("spot"===a||"margin"===a)c=n?await this.privateSpotGetPriceOrdersOrderId(this.extend(d,h)):await this.privateSpotGetOrdersOrderId(this.extend(d,h));else if("swap"===a)c=n?await this.privateFuturesGetSettlePriceOrdersOrderId(this.extend(d,h)):await this.privateFuturesGetSettleOrdersOrderId(this.extend(d,h));else if("future"===a)c=n?await this.privateDeliveryGetSettlePriceOrdersOrderId(this.extend(d,h)):await this.privateDeliveryGetSettleOrdersOrderId(this.extend(d,h));else{if("option"!==a)throw new o.NotSupported(this.id+" fetchOrder() not support this market type");c=await this.privateOptionsGetOrdersOrderId(this.extend(d,h))}return this.parseOrder(c,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("open",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),await this.loadUnifiedStatus();const r=this.safeInteger(s,"until");let a;void 0!==e&&(a=this.market(e),e=a.symbol);const o=this.handleMarketTypeAndParams("fetchClosedOrders",a,s),n=this.safeString(o,0);let d=!1;if([d,s]=this.handleOptionAndParams(s,"fetchClosedOrders","historical",!1),!d&&(void 0===t&&void 0===r||"swap"!==n))return await this.fetchOrdersByStatus("finished",e,t,i,s);s=this.omit(s,"type");let h={};[h,s]=this.prepareRequest(a,n,s),void 0!==t&&(h.from=this.parseToInt(t/1e3)),void 0!==r&&(s=this.omit(s,"until"),h.to=this.parseToInt(r/1e3)),void 0!==i&&(h.limit=i);const c=await this.privateFuturesGetSettleOrdersTimerange(this.extend(h,s));return this.parseOrders(c,a,t,i)}prepareOrdersByStatusRequest(e,t=void 0,i=void 0,s=void 0,r={}){let a,o,n;void 0!==t&&(a=this.market(t),t=a.symbol),[o,r]=this.handleParamBool2(r,"trigger","stop"),[n,r]=this.handleMarketTypeAndParams("fetchOrdersByStatus",a,r);const d="spot"===n||"margin"===n;let h={};if([h,r]=d?this.multiOrderSpotPrepareRequest(a,o,r):this.prepareRequest(a,n,r),d&&o&&(h=this.omit(h,"account")),"closed"===e&&(e="finished"),h.status=e,void 0!==s&&(h.limit=s),d){void 0!==i&&(h.from=this.parseToInt(i/1e3));const e=this.safeInteger(r,"until");void 0!==e&&(r=this.omit(r,"until"),h.to=this.parseToInt(e/1e3))}const[c,l]=this.handleParamString2(r,"lastId","last_id");return void 0!==c&&(h.last_id=c),[h,l]}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),await this.loadUnifiedStatus(),void 0!==t&&(a=this.market(t),t=a.symbol);const n=this.safeBool2(r,"trigger","stop"),d=this.handleMarketTypeAndParams("fetchOrdersByStatus",a,r),h=this.safeString(d,0),[c,l]=this.prepareOrdersByStatusRequest(e,t,i,s,r),u="spot"===h||"margin"===h,f="open"===e,p=u&&f&&!n;let m;if(u)m=n?await this.privateSpotGetPriceOrders(this.extend(c,l)):f?await this.privateSpotGetOpenOrders(this.extend(c,l)):await this.privateSpotGetOrders(this.extend(c,l));else if("swap"===h)m=n?await this.privateFuturesGetSettlePriceOrders(this.extend(c,l)):await this.privateFuturesGetSettleOrders(this.extend(c,l));else if("future"===h)m=n?await this.privateDeliveryGetSettlePriceOrders(this.extend(c,l)):await this.privateDeliveryGetSettleOrders(this.extend(c,l));else{if("option"!==h)throw new o.NotSupported(this.id+" fetchOrders() not support this market type");m=await this.privateOptionsGetOrders(this.extend(c,l))}let g=m;if(p){g=[];for(let e=0;e<m.length;e++){const t=this.safeValue(m[e],"orders");g=this.arrayConcat(g,t)}}const v=this.parseOrders(g,a,i,s);return this.filterBySymbolSinceLimit(v,t,i,s)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets(),await this.loadUnifiedStatus();const s=void 0===t?void 0:this.market(t),r=this.safeBoolN(i,["is_stop_order","stop","trigger"],!1);i=this.omit(i,["is_stop_order","stop","trigger"]);const[a,n]=this.handleMarketTypeAndParams("cancelOrder",s,i),[d,h]="spot"===a||"margin"===a?this.spotOrderPrepareRequest(s,r,n):this.prepareRequest(s,a,n);let c;if(d.order_id=e,"spot"===a||"margin"===a)c=r?await this.privateSpotDeletePriceOrdersOrderId(this.extend(d,h)):await this.privateSpotDeleteOrdersOrderId(this.extend(d,h));else if("swap"===a)c=r?await this.privateFuturesDeleteSettlePriceOrdersOrderId(this.extend(d,h)):await this.privateFuturesDeleteSettleOrdersOrderId(this.extend(d,h));else if("future"===a)c=r?await this.privateDeliveryDeleteSettlePriceOrdersOrderId(this.extend(d,h)):await this.privateDeliveryDeleteSettleOrdersOrderId(this.extend(d,h));else{if("option"!==a)throw new o.NotSupported(this.id+" cancelOrder() not support this market type");c=await this.privateOptionsDeleteOrdersOrderId(this.extend(d,h))}return this.parseOrder(c,s)}async cancelOrders(e,t=void 0,i={}){let s,r;await this.loadMarkets(),await this.loadUnifiedStatus(),void 0!==t&&(s=this.market(t));const a=void 0===s?"usdt":s.settle,n=this.safeStringLower(i,"settle",a);[r,i]=this.handleMarketTypeAndParams("cancelOrders",s,i);const d="spot"===r;if(d&&void 0===t)throw new o.ArgumentsRequired(this.id+" cancelOrders requires a symbol argument for spot markets");if(d){const s=[];for(let i=0;i<e.length;i++){const r={id:e[i],symbol:t};s.push(r)}return await this.cancelOrdersForSymbols(s,i)}const h=[{settle:n}];for(let t=0;t<e.length;t++)h.push(e[t]);const c=await this.privateFuturesPostSettleBatchCancelOrders(h);return this.parseOrders(c)}async cancelOrdersForSymbols(e,t={}){await this.loadMarkets(),await this.loadUnifiedStatus();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.market(r);if(!a.spot)throw new o.NotSupported(this.id+" cancelOrdersForSymbols() supports only spot markets");const n={id:this.safeString(s,"id"),currency_pair:a.id};i.push(n)}const s=await this.privateSpotPostCancelBatchOrders(i);return this.parseOrders(s)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets(),await this.loadUnifiedStatus();const i=void 0===e?void 0:this.market(e),s=this.safeBool2(t,"stop","trigger");t=this.omit(t,["stop","trigger"]);const[r,a]=this.handleMarketTypeAndParams("cancelAllOrders",i,t),[n,d]="spot"===r?this.multiOrderSpotPrepareRequest(i,s,a):this.prepareRequest(i,r,a);let h;if("spot"===r||"margin"===r)h=s?await this.privateSpotDeletePriceOrders(this.extend(n,d)):await this.privateSpotDeleteOrders(this.extend(n,d));else if("swap"===r)h=s?await this.privateFuturesDeleteSettlePriceOrders(this.extend(n,d)):await this.privateFuturesDeleteSettleOrders(this.extend(n,d));else if("future"===r)h=s?await this.privateDeliveryDeleteSettlePriceOrders(this.extend(n,d)):await this.privateDeliveryDeleteSettleOrders(this.extend(n,d));else{if("option"!==r)throw new o.NotSupported(this.id+" cancelAllOrders() not support this market type");h=await this.privateOptionsDeleteOrders(this.extend(n,d))}return this.parseOrders(h,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),n=this.convertTypeToAccount(i),d=this.convertTypeToAccount(s),h=this.currencyToPrecision(e,t),c={currency:a.id,amount:h};if(n in this.options.accountsByType?c.from=n:(c.from="margin",c.currency_pair=n),d in this.options.accountsByType?c.to=d:(c.to="margin",c.currency_pair=d),"margin"===n||"margin"===d){const e=this.safeString2(r,"symbol","currency_pair");if(void 0===e)throw new o.ArgumentsRequired(this.id+' transfer requires params["symbol"] for isolated margin transfers');const t=this.market(e);c.currency_pair=t.id,r=this.omit(r,"symbol")}"futures"!==d&&"delivery"!==d&&"futures"!==n&&"delivery"!==n||(c.settle=a.id);const l=await this.privateWalletPostTransfers(this.extend(c,r));return this.parseTransfer(l,a)}parseTransfer(e,t=void 0){return{id:this.safeString(e,"tx_id"),timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0,info:e}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<0||e>100)throw new o.BadRequest(this.id+" setLeverage() leverage should be between 1 and 100");await this.loadMarkets();const s=this.market(t),[r,a]=this.prepareRequest(s,void 0,i),n=this.safeString2(this.options,"marginMode","defaultMarginMode"),d=this.safeString(a,"cross_leverage_limit");let h,c=this.safeString(a,"marginMode",n),l=this.numberToString(e);if(void 0!==d&&(c="cross",l=d),"cross"===c||"cross_margin"===c?(r.cross_leverage_limit=l,r.leverage="0"):r.leverage=l,s.swap)h=await this.privateFuturesPostSettlePositionsContractLeverage(this.extend(r,a));else{if(!s.future)throw new o.NotSupported(this.id+" setLeverage() not support this market type");h=await this.privateDeliveryPostSettlePositionsContractLeverage(this.extend(r,a))}return h}parsePosition(e,t=void 0){const i=this.safeString(e,"contract");t=this.safeMarket(i,t,"_","contract");const s=this.safeString2(e,"size","accum_size");let a=this.safeString(e,"side");void 0===a&&(r.Y.stringGt(s,"0")?a="long":r.Y.stringLt(s,"0")&&(a="short"));const o=this.safeString(e,"maintenance_rate"),n=this.safeString(e,"value"),d=this.safeString(e,"leverage");let h;void 0!==d&&(h="0"===d?"cross":"isolated");let c,l=this.safeString(e,"pnl_fee");if(void 0===l){const e="0.00075";l=r.Y.stringMul(e,n),c=r.Y.stringAdd(r.Y.stringDiv(n,d),l)}let u=this.safeTimestamp2(e,"open_time","first_open_time");return 0===u&&(u=void 0),this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:u,datetime:this.iso8601(u),lastUpdateTimestamp:this.safeTimestamp2(e,"update_time","time"),initialMargin:this.parseNumber(c),initialMarginPercentage:this.parseNumber(r.Y.stringDiv(c,n)),maintenanceMargin:this.parseNumber(r.Y.stringMul(o,n)),maintenanceMarginPercentage:this.parseNumber(o),entryPrice:this.safeNumber(e,"entry_price"),notional:this.parseNumber(n),leverage:this.safeNumber(e,"leverage"),unrealizedPnl:this.safeNumber(e,"unrealised_pnl"),realizedPnl:this.safeNumber2(e,"realised_pnl","pnl"),contracts:this.parseNumber(r.Y.stringAbs(s)),contractSize:this.safeNumber(t,"contractSize"),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"liq_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:void 0,collateral:this.safeNumber(e,"margin"),marginMode:h,side:a,percentage:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new o.BadRequest(this.id+" fetchPosition() supports contract markets only");let s={};[s,t]=this.prepareRequest(i,i.type,t);const r=this.extend(s,t);let a;return i.swap?a=await this.privateFuturesGetSettlePositionsContract(r):i.future?a=await this.privateDeliveryGetSettlePositionsContract(r):"option"===i.type&&(a=await this.privateOptionsGetPositionsContract(r)),this.parsePosition(a,i)}async fetchPositions(e=void 0,t={}){let i,s;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e,void 0,!0,!0,!0))){e.length>0&&(i=this.market(e[0]))}let r,a={};if([s,t]=this.handleMarketTypeAndParams("fetchPositions",i,t),void 0!==s&&"spot"!==s||(s="swap"),"option"===s){if(void 0!==e){const e=i.id.split("-");a.underlying=this.safeString(e,0)}}else[a,t]=this.prepareRequest(void 0,s,t);return"swap"===s?r=await this.privateFuturesGetSettlePositions(this.extend(a,t)):"future"===s?r=await this.privateDeliveryGetSettlePositions(this.extend(a,t)):"option"===s&&(r=await this.privateOptionsGetPositions(this.extend(a,t))),this.parsePositions(r,e)}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const[i,s]=this.handleMarketTypeAndParams("fetchLeverageTiers",void 0,t),[r,a]=this.prepareRequest(void 0,i,s);if("future"!==i&&"swap"!==i)throw new o.BadRequest(this.id+" fetchLeverageTiers only supports swap and future");let n;if("swap"===i)n=await this.publicFuturesGetSettleContracts(this.extend(r,a));else{if("future"!==i)throw new o.NotSupported(this.id+" fetchLeverageTiers() not support this market type");n=await this.publicDeliveryGetSettleContracts(this.extend(r,a))}return this.parseLeverageTiers(n,e,"name")}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e),[s,r]=this.handleMarketTypeAndParams("fetchMarketLeverageTiers",i,t),[a,n]=this.prepareRequest(i,s,r);if("future"!==s&&"swap"!==s)throw new o.BadRequest(this.id+" fetchMarketLeverageTiers only supports swap and future");const d=await this.privateFuturesGetSettleRiskLimitTiers(this.extend(a,n));return this.parseMarketLeverageTiers(d,i)}parseEmulatedLeverageTiers(e,t=void 0){const i=this.safeString(e,"name"),s=this.safeString(e,"maintenance_rate"),a=this.safeString(e,"leverage_max"),o=this.safeString(e,"risk_limit_step"),n=this.safeString(e,"risk_limit_max"),d=r.Y.stringDiv("1",a);let h=s,c=d,l="0";const u=[];for(;r.Y.stringLt(l,n);){const a=r.Y.stringAdd(l,o);u.push({tier:this.parseNumber(r.Y.stringDiv(a,o)),symbol:this.safeSymbol(i,t,void 0,"contract"),currency:this.safeString(t,"settle"),minNotional:this.parseNumber(l),maxNotional:this.parseNumber(a),maintenanceMarginRate:this.parseNumber(h),maxLeverage:this.parseNumber(r.Y.stringDiv("1",c)),info:e}),h=r.Y.stringAdd(h,s),c=r.Y.stringAdd(c,d),l=a}return u}parseMarketLeverageTiers(e,t=void 0){if(!Array.isArray(e))return this.parseEmulatedLeverageTiers(e,t);let i=0;const s=[];for(let r=0;r<e.length;r++){const a=e[r],o=this.safeNumber(a,"risk_limit");s.push({tier:this.sum(r,1),symbol:t.symbol,currency:t.base,minNotional:i,maxNotional:o,maintenanceMarginRate:this.safeNumber(a,"maintenance_rate"),maxLeverage:this.safeNumber(a,"leverage_max"),info:a}),i=o}return s}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a={currency:r.id.toUpperCase(),amount:this.currencyToPrecision(t,i)},o=this.market(e);a.currency_pair=o.id,a.type="repay";const n=await this.privateMarginPostUniLoans(this.extend(a,s));return this.parseMarginLoan(n,r)}async repayCrossMargin(e,t,i={}){await this.loadMarkets(),await this.loadUnifiedStatus();const s=this.currency(e),r={currency:s.id.toUpperCase(),amount:this.currencyToPrecision(e,t)};let a,o=!1;return[o,i]=this.handleOptionAndParams(i,"repayCrossMargin","unifiedAccount"),o?(r.type="repay",a=await this.privateUnifiedPostLoans(this.extend(r,i))):(a=await this.privateMarginPostCrossRepayments(this.extend(r,i)),a=this.safeDict(a,0)),this.parseMarginLoan(a,s)}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a={currency:r.id.toUpperCase(),amount:this.currencyToPrecision(t,i)};let o;const n=this.market(e);return a.currency_pair=n.id,a.type="borrow",o=await this.privateMarginPostUniLoans(this.extend(a,s)),this.parseMarginLoan(o,r)}async borrowCrossMargin(e,t,i={}){await this.loadMarkets(),await this.loadUnifiedStatus();const s=this.currency(e),r={currency:s.id.toUpperCase(),amount:this.currencyToPrecision(e,t)};let a,o=!1;return[o,i]=this.handleOptionAndParams(i,"borrowCrossMargin","unifiedAccount"),o?(r.type="borrow",a=await this.privateUnifiedPostLoans(this.extend(r,i))):a=await this.privateMarginPostCrossLoans(this.extend(r,i)),this.parseMarginLoan(a,s)}parseMarginLoan(e,t=void 0){const i=this.safeString2(this.options,"defaultMarginMode","marginMode","cross");let s=this.safeInteger(e,"create_time");"isolated"===i&&(s=this.safeTimestamp(e,"create_time"));const r=this.safeString(e,"currency"),a=this.safeString(e,"currency_pair");return{id:this.safeInteger(e,"id"),currency:this.safeCurrencyCode(r,t),amount:this.safeNumber(e,"amount"),symbol:this.safeSymbol(a,void 0,"_","margin"),timestamp:s,datetime:this.iso8601(s),info:e}}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets(),await this.loadUnifiedStatus();let a=!1;[a,r]=this.handleOptionAndParams(r,"fetchBorrowInterest","unifiedAccount");let o,n,d,h,c={};[c,r]=this.handleUntilOption("to",c,r),void 0!==e&&(o=this.currency(e),c.currency=o.id),void 0!==t&&(n=this.market(t)),void 0!==i&&(c.from=i),void 0!==s&&(c.limit=s),[h,r]=this.handleMarginModeAndParams("fetchBorrowInterest",r,"cross"),a?d=await this.privateUnifiedGetInterestRecords(this.extend(c,r)):"isolated"===h?(void 0!==n&&(c.currency_pair=n.id),d=await this.privateMarginGetUniInterestRecords(this.extend(c,r))):"cross"===h&&(d=await this.privateMarginGetCrossInterestRecords(this.extend(c,r)));const l=this.parseBorrowInterests(d,n);return this.filterByCurrencySinceLimit(l,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"currency_pair");t=this.safeMarket(i,t);const s=void 0!==i?"isolated":"cross",r=this.safeInteger(e,"create_time");return{info:e,symbol:this.safeString(t,"symbol"),currency:this.safeCurrencyCode(this.safeString(e,"currency")),interest:this.safeNumber(e,"interest"),interestRate:this.safeNumber(e,"actual_rate"),amountBorrowed:void 0,marginMode:s,timestamp:r,datetime:this.iso8601(r)}}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){const d=t[0],h=t[1];let c=this.omit(s,this.extractParams(e));if(e.indexOf("settle")>-1&&e.endsWith("batch_cancel_orders")){const t=this.safeDict(s,0);e=this.implodeParams(e,t);const i=[],r=s;for(let e=1;e<r.length;e++)i.push(s[e]);s=i,c=i}else if(Array.isArray(s)){const t=this.safeValue(s,0,{});e=this.implodeParams(e,t)}else e=this.implodeParams(e,s);const l=""===e?"":"/"+e;let u="/"+h+l;"subAccounts"!==h&&"withdrawals"!==h||(u=l);let f=this.urls.api[d][h];if(void 0===f)throw new o.NotSupported(this.id+" does not have a testnet for the "+h+" market type.");if(f+=u,"public"===d)Object.keys(c).length&&(f+="?"+this.urlencode(c));else{this.checkRequiredCredentials();let t="",s=!1;if(("futures"===h||"delivery"===h)&&"POST"===i){const t=e.split("/"),i=this.safeString(t,1,"");s=i.indexOf("dual")>=0||i.indexOf("positions")>=0}if("GET"===i||"DELETE"===i||s||"PATCH"===i)Object.keys(c).length&&(t=this.urlencode(c),f+="?"+t),"PATCH"===i&&(a=this.json(c));else{const e=this.safeValue(c,"query",{});Object.keys(e).length&&(t=this.urlencode(e),f+="?"+t),c=this.omit(c,"query"),a=this.json(c)}const o=void 0===a?"":a,d=this.hash(this.encode(o),n.Zf),l=this.nonce(),p=this.parseToInt(l/1e3).toString(),m="/api/"+this.version+u,g=[i.toUpperCase(),m,t,d,p].join("\n"),v=this.hmac(this.encode(g),this.encode(this.secret),n.Zf);r={KEY:this.apiKey,Timestamp:p,SIGN:v,"Content-Type":"application/json"}}return{url:f,method:i,body:a,headers:r}}async modifyMarginHelper(e,t,i={}){await this.loadMarkets();const s=this.market(e),[r,a]=this.prepareRequest(s,void 0,i);let n;if(r.change=this.numberToString(t),s.swap)n=await this.privateFuturesPostSettlePositionsContractMargin(this.extend(r,a));else{if(!s.future)throw new o.NotSupported(this.id+" modifyMarginHelper() not support this market type");n=await this.privateDeliveryPostSettlePositionsContractMargin(this.extend(r,a))}return this.parseMarginModification(n,s)}parseMarginModification(e,t=void 0){const i=this.safeString(e,"contract");t=this.safeMarket(i,t,"_","contract");const s=this.safeNumber(e,"margin");return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:s,code:this.safeValue(t,"quote"),status:"ok",timestamp:void 0,datetime:void 0}}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,-t,i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,i)}async fetchOpenInterestHistory(e,t="5m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOpenInterestHistory","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOpenInterestHistory",e,i,s,t,r,100);const n=this.market(e);if(!n.swap)throw new o.BadRequest(this.id+" fetchOpenInterest() supports swap markets only");const d={contract:n.id,settle:n.settleId,interval:this.safeString(this.timeframes,t,t)};void 0!==s&&(d.limit=s),void 0!==i&&(d.from=i);const h=await this.publicFuturesGetSettleContractStats(this.extend(d,r));return this.parseOpenInterestsHistory(h,n,i,s)}parseOpenInterest(e,t=void 0){const i=this.safeTimestamp(e,"time");return{symbol:this.safeString(t,"symbol"),openInterestAmount:this.safeNumber(e,"open_interest"),openInterestValue:this.safeNumber(e,"open_interest_usd"),timestamp:i,datetime:this.iso8601(i),info:e}}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchSettlementHistory() requires a symbol argument");await this.loadMarkets();const r=this.market(e);let a;if([a,s]=this.handleMarketTypeAndParams("fetchSettlementHistory",r,s),"option"!==a)throw new o.NotSupported(this.id+" fetchSettlementHistory() supports option markets only");const n=r.id.split("-"),d={underlying:this.safeString(n,0)};void 0!==t&&(d.from=t),void 0!==i&&(d.limit=i);const h=await this.publicOptionsGetSettlements(this.extend(d,s)),c=this.parseSettlements(h,r),l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,e,t,i)}async fetchMySettlementHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchMySettlementHistory() requires a symbol argument");await this.loadMarkets();const r=this.market(e);let a;if([a,s]=this.handleMarketTypeAndParams("fetchMySettlementHistory",r,s),"option"!==a)throw new o.NotSupported(this.id+" fetchMySettlementHistory() supports option markets only");const n=r.id,d=n.split("-"),h={underlying:this.safeString(d,0),contract:n};void 0!==t&&(h.from=t),void 0!==i&&(h.limit=i);const c=await this.privateOptionsGetMySettlements(this.extend(h,s)),l=this.safeValue(c,"result",{}),u=this.safeValue(l,"list",[]),f=this.parseSettlements(u,r),p=this.sortBy(f,"timestamp");return this.filterBySymbolSinceLimit(p,r.symbol,t,i)}parseSettlement(e,t){const i=this.safeTimestamp(e,"time"),s=this.safeString(e,"contract");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber(e,"settle_price"),timestamp:i,datetime:this.iso8601(i)}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++)i.push(this.parseSettlement(e[s],t));return i}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a,o,n=!1;if([n,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),n)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s);let d={};if([r,s]=this.handleMarketTypeAndParams("fetchLedger",void 0,s),"spot"!==r&&"margin"!==r||void 0!==e&&(a=this.currency(e),d.currency=a.id),"swap"===r||"future"===r){const e="swap"===r?"usdt":"btc",t=this.safeStringLower(s,"settle",e);s=this.omit(s,"settle"),d.settle=t}return void 0!==t&&(d.from=t),void 0!==i&&(d.limit=i),[d,s]=this.handleUntilOption("to",d,s),"spot"===r?o=await this.privateSpotGetAccountBook(this.extend(d,s)):"margin"===r?o=await this.privateMarginGetAccountBook(this.extend(d,s)):"swap"===r?o=await this.privateFuturesGetSettleAccountBook(this.extend(d,s)):"future"===r?o=await this.privateDeliveryGetSettleAccountBook(this.extend(d,s)):"option"===r&&(o=await this.privateOptionsGetAccountBook(this.extend(d,s))),this.parseLedger(o,a,t,i)}parseLedgerEntry(e,t=void 0){let i,s=this.safeString(e,"change");r.Y.stringLt(s,"0")?(i="out",s=r.Y.stringAbs(s)):i="in";const a=this.safeString(e,"currency");t=this.safeCurrency(a,t);const o=this.safeString(e,"type"),n=this.safeString(e,"time");let d;d=n.length>10?parseInt(n):1e3*parseInt(n);const h=this.safeString(e,"balance"),c=this.safeString(e,"change"),l=this.parseNumber(r.Y.stringSub(h,c));return this.safeLedgerEntry({info:e,id:this.safeString(e,"id"),direction:i,account:void 0,referenceAccount:void 0,referenceId:void 0,type:this.parseLedgerEntryType(o),currency:this.safeCurrencyCode(a,t),amount:this.parseNumber(s),timestamp:d,datetime:this.iso8601(d),before:l,after:this.safeNumber(e,"balance"),status:void 0,fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({deposit:"deposit",withdraw:"withdrawal",sub_account_transfer:"transfer",margin_in:"transfer",margin_out:"transfer",margin_funding_in:"transfer",margin_funding_out:"transfer",cross_margin_in:"transfer",cross_margin_out:"transfer",copy_trading_in:"transfer",copy_trading_out:"transfer",quant_in:"transfer",quant_out:"transfer",futures_in:"transfer",futures_out:"transfer",delivery_in:"transfer",delivery_out:"transfer",new_order:"trade",order_fill:"trade",referral_fee:"rebate",order_fee:"fee",interest:"interest",lend:"loan",redeem:"loan",profit:"interest",flash_swap_buy:"trade",flash_swap_sell:"trade",unknown:"unknown",set:"settlement",prem:"trade",point_refr:"rebate",point_fee:"fee",point_dnw:"deposit/withdraw",fund:"fee",refr:"rebate",fee:"fee",pnl:"trade",dnw:"deposit/withdraw"},e,e)}async setPositionMode(e,t=void 0,i={}){const s=void 0!==t?this.market(t):void 0,[r,a]=this.prepareRequest(s,"swap",i);return r.dual_mode=e,await this.privateFuturesPostSettleDualMode(this.extend(r,a))}async fetchUnderlyingAssets(e={}){let t;if(await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchUnderlyingAssets",void 0,e),void 0!==t&&"spot"!==t||(t="option"),"option"!==t)throw new o.NotSupported(this.id+" fetchUnderlyingAssets() supports option markets only");const i=await this.publicOptionsGetUnderlyings(e),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"name");void 0!==r&&s.push(r)}return s}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);if(!r.swap)throw new o.NotSupported(this.id+" fetchLiquidations() supports swap markets only");let a={settle:r.settleId,contract:r.id};void 0!==t&&(a.from=t),void 0!==i&&(a.limit=i),[a,s]=this.handleUntilOption("to",a,s);const n=await this.publicFuturesGetSettleLiqOrders(this.extend(a,s));return this.parseLiquidations(n,r,t,i)}async fetchMyLiquidations(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchMyLiquidations() requires a symbol argument");await this.loadMarkets();const r=this.market(e),a={contract:r.id};let n;if(r.swap||r.future)void 0!==i&&(a.limit=i),a.settle=r.settleId;else if(r.option){const e=r.id.split("-");a.underlying=this.safeString(e,0)}if(r.swap)n=await this.privateFuturesGetSettleLiquidates(this.extend(a,s));else if(r.future)n=await this.privateDeliveryGetSettleLiquidates(this.extend(a,s));else{if(!r.option)throw new o.NotSupported(this.id+" fetchMyLiquidations() does not support "+r.type+" orders");n=await this.privateOptionsGetPositionClose(this.extend(a,s))}return this.parseLiquidations(n,r,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"contract"),s=this.safeTimestamp(e,"time"),a=this.safeString2(e,"size","settle_size"),o=this.safeString(e,"left","0"),n=r.Y.stringAbs(r.Y.stringSub(a,o)),d=this.safeString(t,"contractSize"),h=this.safeString2(e,"liq_price","fill_price"),c=r.Y.stringMul(n,d);let l=this.safeString(e,"pnl");return void 0===l&&(l=r.Y.stringMul(c,h)),this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:this.parseNumber(n),contractSize:this.parseNumber(d),price:this.parseNumber(h),baseValue:this.parseNumber(c),quoteValue:this.parseNumber(r.Y.stringAbs(l)),timestamp:s,datetime:this.iso8601(s)})}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s={underlying:i.info.underlying},r=await this.publicOptionsGetTickers(this.extend(s,t)),a=i.id;for(let e=0;e<r.length;e++){const t=r[e];if(this.safeString(t,"name")===a)return this.parseGreeks(t,i)}}parseGreeks(e,t=void 0){const i=this.safeString(e,"name");return{symbol:this.safeSymbol(i,t),timestamp:void 0,datetime:void 0,delta:this.safeNumber(e,"delta"),gamma:this.safeNumber(e,"gamma"),theta:this.safeNumber(e,"theta"),vega:this.safeNumber(e,"vega"),rho:void 0,bidSize:this.safeNumber(e,"bid1_size"),askSize:this.safeNumber(e,"ask1_size"),bidImpliedVolatility:this.safeNumber(e,"bid_iv"),askImpliedVolatility:this.safeNumber(e,"ask_iv"),markImpliedVolatility:this.safeNumber(e,"mark_iv"),bidPrice:this.safeNumber(e,"bid1_price"),askPrice:this.safeNumber(e,"ask1_price"),markPrice:this.safeNumber(e,"mark_price"),lastPrice:this.safeNumber(e,"last_price"),underlyingPrice:this.parseNumber(t.info.underlying_price),info:e}}async closePosition(e,t=void 0,i={}){return i=this.extend({close:!0},i),void 0===t&&(t=""),await this.createOrder(e,"market",t,0,void 0,i)}async fetchLeverage(e,t={}){let i;await this.loadMarkets(),void 0!==e&&(i=this.market(e));const s={};let r;const a=this.safeBool(t,"unified");if(t=this.omit(t,"unified"),i.spot)s.currency_pair=i.id,r=a?await this.publicMarginGetUniCurrencyPairsCurrencyPair(this.extend(s,t)):await this.publicMarginGetCurrencyPairsCurrencyPair(this.extend(s,t));else{if(!a)throw new o.NotSupported(this.id+" fetchLeverage() does not support "+i.type+" markets");r=await this.privateUnifiedGetAccounts(this.extend(s,t))}return this.parseLeverage(r,i)}async fetchLeverages(e=void 0,t={}){let i;await this.loadMarkets(),e=this.marketSymbols(e);const s=this.safeBool(t,"unified");t=this.omit(t,"unified");let r="id";return s?(r="currency_pair",i=await this.publicMarginGetUniCurrencyPairs(t)):i=await this.publicMarginGetCurrencyPairs(t),this.parseLeverages(i,e,r,"spot")}parseLeverage(e,t=void 0){const i=this.safeString2(e,"currency_pair","id"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t,"_","spot"),marginMode:void 0,longLeverage:s,shortLeverage:s}}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={contract:i.id},r=await this.publicOptionsGetContractsContract(this.extend(s,t));return this.parseOption(r,void 0,i)}async fetchOptionChain(e,t={}){await this.loadMarkets();const i={underlying:this.currency(e).code+"_USDT"},s=await this.publicOptionsGetContracts(this.extend(i,t));return this.parseOptionChain(s,void 0,"name")}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"name");i=this.safeMarket(s,i);const r=this.safeTimestamp(e,"create_time");return{info:e,currency:void 0,symbol:i.symbol,timestamp:r,datetime:this.iso8601(r),impliedVolatility:void 0,openInterest:void 0,bidPrice:this.safeNumber(e,"bid1_price"),askPrice:this.safeNumber(e,"ask1_price"),midPrice:void 0,markPrice:this.safeNumber(e,"mark_price"),lastPrice:this.safeNumber(e,"last_price"),underlyingPrice:this.safeNumber(e,"underlying_price"),change:void 0,percentage:void 0,baseVolume:void 0,quoteVolume:void 0}}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){let r,a;if(await this.loadMarkets(),void 0!==e){1===e.length&&(r=this.market(e[0]))}[a,s]=this.handleMarketTypeAndParams("fetchPositionsHistory",r,s,"swap");const n=this.safeInteger(s,"until");s=this.omit(s,"until");let d,h={};if([h,s]=this.prepareRequest(r,a,s),void 0!==i&&(h.limit=i),void 0!==t&&(h.from=this.parseToInt(t/1e3)),void 0!==n&&(h.to=this.parseToInt(n/1e3)),"swap"===a)d=await this.privateFuturesGetSettlePositionClose(this.extend(h,s));else{if("future"!==a)throw new o.NotSupported(this.id+" fetchPositionsHistory() does not support markets of type "+a);d=await this.privateDeliveryGetSettlePositionClose(this.extend(h,s))}return this.parsePositions(d,e,s)}handleErrors(e,t,i,s,r,a,n,d,h){if(void 0===n)return;const c=this.safeString(n,"label");if(void 0!==c){const e=this.id+" "+a;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),new o.ExchangeError(e)}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"gateio",alias:!0})}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"gemini",name:"Gemini",countries:["US"],rateLimit:100,version:"v1",pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createMarketOrder:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:"emulated",postOnly:!0,reduceMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/27816857-ce7be644-6096-11e7-82d6-3c257263229c.jpg",api:{public:"https://api.gemini.com",private:"https://api.gemini.com",web:"https://docs.gemini.com",webExchange:"https://exchange.gemini.com"},www:"https://gemini.com/",doc:["https://docs.gemini.com/rest-api","https://docs.sandbox.gemini.com"],test:{public:"https://api.sandbox.gemini.com",private:"https://api.sandbox.gemini.com",web:"https://docs.gemini.com",webExchange:"https://exchange.gemini.com"},fees:["https://gemini.com/api-fee-schedule","https://gemini.com/trading-fees","https://gemini.com/transfer-fees"]},api:{webExchange:{get:[""]},web:{get:["rest-api"]},public:{get:{"v1/symbols":5,"v1/symbols/details/{symbol}":5,"v1/staking/rates":5,"v1/pubticker/{symbol}":5,"v2/ticker/{symbol}":5,"v2/candles/{symbol}/{timeframe}":5,"v1/trades/{symbol}":5,"v1/auction/{symbol}":5,"v1/auction/{symbol}/history":5,"v1/pricefeed":5,"v1/book/{symbol}":5,"v1/earn/rates":5}},private:{post:{"v1/staking/unstake":1,"v1/staking/stake":1,"v1/staking/rewards":1,"v1/staking/history":1,"v1/order/new":1,"v1/order/cancel":1,"v1/wrap/{symbol}":1,"v1/order/cancel/session":1,"v1/order/cancel/all":1,"v1/order/status":1,"v1/orders":1,"v1/mytrades":1,"v1/notionalvolume":1,"v1/tradevolume":1,"v1/clearing/new":1,"v1/clearing/status":1,"v1/clearing/cancel":1,"v1/clearing/confirm":1,"v1/balances":1,"v1/balances/staking":1,"v1/notionalbalances/{currency}":1,"v1/transfers":1,"v1/addresses/{network}":1,"v1/deposit/{network}/newAddress":1,"v1/deposit/{currency}/newAddress":1,"v1/withdraw/{currency}":1,"v1/account/transfer/{currency}":1,"v1/payments/addbank":1,"v1/payments/methods":1,"v1/payments/sen/withdraw":1,"v1/balances/earn":1,"v1/earn/interest":1,"v1/earn/history":1,"v1/approvedAddresses/{network}/request":1,"v1/approvedAddresses/account/{network}":1,"v1/approvedAddresses/{network}/remove":1,"v1/account":1,"v1/account/create":1,"v1/account/list":1,"v1/heartbeat":1,"v1/roles":1}}},precisionMode:o.kb,fees:{trading:{taker:.004,maker:.002}},httpExceptions:{400:r.BadRequest,403:r.PermissionDenied,404:r.OrderNotFound,406:r.InsufficientFunds,429:r.RateLimitExceeded,500:r.ExchangeError,502:r.ExchangeNotAvailable,503:r.OnMaintenance},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1hr","6h":"6hr","1d":"1day"},exceptions:{exact:{AuctionNotOpen:r.BadRequest,ClientOrderIdTooLong:r.BadRequest,ClientOrderIdMustBeString:r.BadRequest,ConflictingOptions:r.BadRequest,EndpointMismatch:r.BadRequest,EndpointNotFound:r.BadRequest,IneligibleTiming:r.BadRequest,InsufficientFunds:r.InsufficientFunds,InvalidJson:r.BadRequest,InvalidNonce:r.InvalidNonce,InvalidApiKey:r.AuthenticationError,InvalidOrderType:r.InvalidOrder,InvalidPrice:r.InvalidOrder,InvalidQuantity:r.InvalidOrder,InvalidSide:r.InvalidOrder,InvalidSignature:r.AuthenticationError,InvalidSymbol:r.BadRequest,InvalidTimestampInPayload:r.BadRequest,Maintenance:r.OnMaintenance,MarketNotOpen:r.InvalidOrder,MissingApikeyHeader:r.AuthenticationError,MissingOrderField:r.InvalidOrder,MissingRole:r.AuthenticationError,MissingPayloadHeader:r.AuthenticationError,MissingSignatureHeader:r.AuthenticationError,NoSSL:r.AuthenticationError,OptionsMustBeArray:r.BadRequest,OrderNotFound:r.OrderNotFound,RateLimit:r.RateLimitExceeded,System:r.ExchangeError,UnsupportedOption:r.BadRequest},broad:{"The Gemini Exchange is currently undergoing maintenance.":r.OnMaintenance,"We are investigating technical issues with the Gemini Exchange.":r.ExchangeNotAvailable,"Internal Server Error":r.ExchangeNotAvailable}},options:{fetchMarketsMethod:"fetch_markets_from_api",fetchMarketFromWebRetries:10,fetchMarketsFromAPI:{fetchDetailsForAllSymbols:!1,quoteCurrencies:["USDT","GUSD","USD","DAI","EUR","GBP","SGD","BTC","ETH","LTC","BCH"]},fetchMarkets:{webApiEnable:!0,webApiRetries:10},fetchUsdtMarkets:["btcusdt","ethusdt"],fetchCurrencies:{webApiEnable:!0,webApiRetries:5,webApiMuteFailure:!0},fetchTickerMethod:"fetchTickerV1",networks:{BTC:"bitcoin",ERC20:"ethereum",BCH:"bitcoincash",LTC:"litecoin",ZEC:"zcash",FIL:"filecoin",DOGE:"dogecoin",XTZ:"tezos",AVAXX:"avalanche",SOL:"solana",ATOM:"cosmos",DOT:"polkadot"},nonce:"milliseconds",conflictingMarkets:{paxgusd:{base:"PAXG",quote:"USD"}}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:void 0}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchCurrencies(e={}){return await this.fetchCurrenciesFromWeb(e)}async fetchCurrenciesFromWeb(e={}){const t=await this.fetchWebEndpoint("fetchCurrencies","webExchangeGet",!0,'="currencyData">',"<\/script>");if(void 0===t)return;const i={};this.options.tradingPairs=this.safeList(t,"tradingPairs");const s=this.safeValue(t,"currencies",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,0),a=this.safeCurrencyCode(r),o=this.safeString(t,7)?"fiat":"crypto",n=this.parseNumber(this.parsePrecision(this.safeString(t,5))),d={},h=this.safeString(t,9);let c;void 0!==h&&(c=this.networkIdToCode(h)),void 0!==c&&(d[c]={info:t,id:h,network:c,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:n,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}}}),i[a]={info:t,id:r,code:a,name:this.safeString(t,1),active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,type:o,precision:n,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:d}}return i}async fetchMarkets(e={}){if("fetch_markets_from_web"===this.safeValue(this.options,"fetchMarketsMethod","fetch_markets_from_api")){const t=[];t.push(this.fetchMarketsFromWeb(e)),t.push(this.fetchUSDTMarkets(e));const i=await Promise.all(t);return this.arrayConcat(i[0],i[1])}return await this.fetchMarketsFromAPI(e)}async fetchMarketsFromWeb(e={}){const t=await this.fetchWebEndpoint("fetchMarkets","webGetRestApi",!1,'<h1 id="symbols-and-minimums">Symbols and minimums</h1>'),i=this.id+" fetchMarketsFromWeb() the API doc HTML markup has changed, breaking the parser of order limits and precision info for markets.",s=t.split("tbody>");if(s.length<2)throw new r.NotSupported(i);const a=s[1].split("\n<tr>\n"),o=a.length;if(o<2)throw new r.NotSupported(i);const n=[];for(let e=1;e<o;e++){const t=a[e],s=t.split("</td>\n");if(s.length<5)throw new r.NotSupported(i);let o=s[0].replace("<td>","");o=o.replace("*","");const d=s[1].replace("<td>","").split(" "),h=this.safeNumber(d,0),c=s[2].replace("<td>","").split(" "),l=o.length-0,u=l-3,f=s[3].replace("<td>","").split(" "),p=this.safeStringLower(f,1,o.slice(u,l)),m=this.safeStringLower(c,1,o.replace(p,"")),g=this.safeCurrencyCode(m),v=this.safeCurrencyCode(p);n.push({id:o,symbol:g+"/"+v,base:g,quote:v,settle:void 0,baseId:m,quoteId:p,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(c,0),price:this.safeNumber(f,0)},limits:{leverage:{min:void 0,max:void 0},amount:{min:h,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return n}parseMarketActive(e){return void 0===e||this.safeBool({open:!0,closed:!1,cancel_only:!0,post_only:!0,limit_only:!0},e,!0)}async fetchUSDTMarkets(e={}){if("test"in this.urls)return[];const t=this.safeValue(this.options,"fetchUsdtMarkets",[]),i=[];for(let s=0;s<t.length;s++){const r={symbol:t[s]},a=await this.publicGetV1SymbolsDetailsSymbol(this.extend(r,e));i.push(this.parseMarket(a))}return i}async fetchMarketsFromAPI(e={}){const t=await this.publicGetV1Symbols(e),i=[],s=this.safeDict(this.options,"fetchMarketsFromAPI",{}),r=[];for(let e=0;e<t.length;e++)"efilfil"!==t[e]&&r.push(t[e]);if(this.safeBool(s,"fetchDetailsForAllSymbols",!1)){const t=[];for(let i=0;i<r.length;i++){const s={symbol:r[i]};t.push(this.publicGetV1SymbolsDetailsSymbol(this.extend(s,e)))}const s=await Promise.all(t);for(let e=0;e<s.length;e++)i.push(this.parseMarket(s[e]))}else{const e=this.safeList(this.options,"tradingPairs");if(void 0!==e){const t=this.indexBy(e,0);for(let e=0;e<r.length;e++){const s=r[e],a=this.safeList(t,s.toUpperCase());void 0!==a&&i.push(this.parseMarket(a))}}else for(let e=0;e<r.length;e++)i.push(this.parseMarket(r[e]))}return i}parseMarket(e){let t,i,s,r,a,o,n,d,h,c,l,u=!1;const f="string"==typeof e,p=Array.isArray(e);if(f||p){f?t=e:(t=this.safeStringLower(e,0),a=this.parseNumber(this.parsePrecision(this.safeString(e,1))),o=this.parseNumber(this.parsePrecision(this.safeString(e,2))),n=this.safeNumber(e,3));const d=t.toUpperCase(),h=d.indexOf("PERP")>=0,c=d.replace("PERP",""),l=this.safeDict(this.options,"conflictingMarkets",{}),u=c.toLowerCase();if(u in l){const e=l[u];i=e.base,s=e.quote,h&&(r=e.quote)}else{const e=this.handleOption("fetchMarketsFromAPI","quoteCurrencies",[]);for(let t=0;t<e.length;t++){const a=e[t];if(c.endsWith(a)){const e=this.parseToInt(-1*a.length);i=c.slice(0,e),s=a,h&&(r=a);break}}}}else t=this.safeStringLower(e,"symbol"),o=this.safeNumber(e,"tick_size"),a=this.safeNumber(e,"quote_increment"),n=this.safeNumber(e,"min_order_size"),d=this.parseMarketActive(this.safeString(e,"status")),i=this.safeString(e,"base_currency"),s=this.safeString(e,"quote_currency"),r=this.safeString(e,"contract_price_currency");const m=this.safeCurrencyCode(i),g=this.safeCurrencyCode(s),v=this.safeCurrencyCode(r);let y=m+"/"+g;void 0!==r&&(y=y+":"+v,u=!0,h=a,c=!0,l=!1);return{id:t,symbol:y,base:m,quote:g,settle:v,baseId:i,quoteId:s,settleId:r,type:u?"swap":"spot",spot:!u,margin:!1,swap:u,future:!1,option:!1,active:d,contract:u,linear:c,inverse:l,contractSize:h,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{price:a,amount:o},limits:{leverage:{min:void 0,max:void 0},amount:{min:n,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.limit_bids=t,r.limit_asks=t);const a=await this.publicGetV1BookSymbol(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","amount")}async fetchTickerV1(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetV1PubtickerSymbol(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickerV2(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetV2TickerSymbol(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickerV1AndV2(e,t={}){const i=this.fetchTickerV1(e,t),s=this.fetchTickerV2(e,t),[r,a]=await Promise.all([i,s]);return this.deepExtend(r,{open:a.open,high:a.high,low:a.low,change:a.change,percentage:a.percentage,average:a.average,info:a.info})}async fetchTicker(e,t={}){const i=this.safeValue(this.options,"fetchTickerMethod","fetchTickerV1");return"fetchTickerV1"===i?await this.fetchTickerV1(e,t):"fetchTickerV2"===i?await this.fetchTickerV2(e,t):await this.fetchTickerV1AndV2(e,t)}parseTicker(e,t=void 0){const i=this.safeValue(e,"volume",{}),s=this.safeInteger(i,"timestamp");let r;const a=this.safeStringLower(e,"pair");let o,n,d,h;if(t=this.safeMarket(a,t),void 0!==a&&void 0===t){7===a.length-0?(o=a.slice(0,4),n=a.slice(4,7)):(o=a.slice(0,3),n=a.slice(3,6)),d=this.safeCurrencyCode(o),h=this.safeCurrencyCode(n),r=d+"/"+h}void 0===r&&void 0!==t&&(r=t.symbol,o=this.safeStringUpper(t,"baseId"),n=this.safeStringUpper(t,"quoteId"));const c=this.safeString(e,"price"),l=this.safeString2(e,"last","close",c),u=this.safeString(e,"percentChange24h"),f=this.safeString(e,"open"),p=this.safeString(i,o),m=this.safeString(i,n);return this.safeTicker({symbol:r,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:f,close:l,last:l,previousClose:void 0,change:void 0,percentage:u,average:void 0,baseVolume:p,quoteVolume:m,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetV1Pricefeed(t);return this.parseTickers(i,e)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"timestampms"),s=this.safeString(e,"tid"),r=this.safeString(e,"order_id"),a=this.safeString(e,"fee_currency"),o=this.safeCurrencyCode(a),n={cost:this.safeString(e,"fee_amount"),currency:o},d=this.safeString(e,"price"),h=this.safeString(e,"amount"),c=this.safeStringLower(e,"type"),l=this.safeSymbol(void 0,t);return this.safeTrade({id:s,order:r,info:e,timestamp:i,datetime:this.iso8601(i),symbol:l,type:void 0,side:c,takerOrMaker:void 0,price:d,cost:void 0,amount:h,fee:n},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit_trades=Math.min(i,500)),void 0!==t&&(a.timestamp=t);const o=await this.publicGetV1TradesSymbol(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.total=this.safeString(s,"amount"),t[a]=o}return this.safeBalance(t)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostV1Notionalvolume(e),i=this.safeString(t,"api_maker_fee_bps"),s=this.safeString(t,"api_taker_fee_bps"),r=a.Y.stringDiv(i,"10000"),o=a.Y.stringDiv(s,"10000"),n=this.parseNumber(r),d=this.parseNumber(o),h={};for(let e=0;e<this.symbols.length;e++){const i=this.symbols[e];h[i]={info:t,symbol:i,maker:n,taker:d,percentage:!0,tierBased:!0}}return h}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostV1Balances(e);return this.parseBalance(t)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"timestampms"),s=this.safeString(e,"original_amount"),r=this.safeString(e,"remaining_amount"),a=this.safeString(e,"executed_amount");let o="closed";e.is_live&&(o="open"),e.is_cancelled&&(o="canceled");const n=this.safeString(e,"price"),d=this.safeString(e,"avg_execution_price");let h=this.safeString(e,"type");h="exchange limit"===h?"limit":"market buy"===h||"market sell"===h?"market":e.type;const c=this.safeString(e,"symbol"),l=this.safeSymbol(c,t),u=this.safeString(e,"order_id"),f=this.safeStringLower(e,"side"),p=this.safeString(e,"client_order_id"),m=this.safeValue(e,"options",[]),g=this.safeString(m,0);let v="GTC",y=!1;return void 0!==g&&("immediate-or-cancel"===g?v="IOC":"fill-or-kill"===g?v="FOK":"maker-or-cancel"===g&&(v="PO",y=!0)),this.safeOrder({id:u,clientOrderId:p,info:e,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,status:o,symbol:l,type:h,timeInForce:v,postOnly:y,side:f,price:n,triggerPrice:void 0,average:d,cost:void 0,amount:s,filled:a,remaining:r,fee:undefined,trades:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privatePostV1OrderStatus(this.extend(s,i));return this.parseOrder(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.privatePostV1Orders(s);let a;return void 0!==e&&(a=this.market(e)),this.parseOrders(r,a,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){if(await this.loadMarkets(),"limit"!==t)throw new r.ExchangeError(this.id+" createOrder() allows limit orders only");let n=this.safeString2(o,"clientOrderId","client_order_id");o=this.omit(o,["clientOrderId","client_order_id"]),void 0===n&&(n=this.milliseconds().toString());const d=this.market(e),h=this.amountToPrecision(e,s),c=this.priceToPrecision(e,a),l={client_order_id:n,symbol:d.id,amount:h,price:c,side:i,type:"exchange limit"};t=this.safeString(o,"type",t),o=this.omit(o,"type");const u=this.safeStringN(o,["triggerPrice","stop_price","stopPrice"]);if(o=this.omit(o,["triggerPrice","stop_price","stopPrice","type"]),"stopLimit"===t)throw new r.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice parameter or a stop_price parameter for "+t+" orders");if(void 0!==u)l.stop_price=this.priceToPrecision(e,u),l.type="exchange stop limit";else{const e=this.safeString(o,"timeInForce");o=this.omit(o,"timeInForce"),void 0!==e&&("IOC"===e||"immediate-or-cancel"===e?l.options=["immediate-or-cancel"]:"FOK"===e||"fill-or-kill"===e?l.options=["fill-or-kill"]:"PO"===e&&(l.options=["maker-or-cancel"]));const t=this.safeBool(o,"postOnly",!1);o=this.omit(o,"postOnly"),t&&(l.options=["maker-or-cancel"]);const i=this.safeString(o,"options");void 0!==i&&(l.options=[i])}const f=await this.privatePostV1OrderNew(this.extend(l,o));return this.parseOrder(f)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privatePostV1OrderCancel(this.extend(s,i));return this.parseOrder(r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==i&&(o.limit_trades=i),void 0!==t&&(o.timestamp=this.parseToInt(t/1e3));const n=await this.privatePostV1Mytrades(this.extend(o,s));return this.parseTrades(n,a,t,i)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n={currency:o.id,amount:t,address:i},d=await this.privatePostV1WithdrawCurrency(this.extend(n,a));if("error"===this.safeString(d,"result"))throw new r.ExchangeError(this.id+" withdraw() failed: "+this.json(d));return this.parseTransaction(d,o)}nonce(){return"milliseconds"===this.safeString(this.options,"nonce","milliseconds")?this.milliseconds():this.seconds()}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==i&&(r.limit_transfers=i),void 0!==t&&(r.timestamp=t);const a=await this.privatePostV1Transfers(this.extend(r,s));return this.parseTransactions(a)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"timestampms"),s=this.safeString(e,"currency"),r=this.safeCurrencyCode(s,t),a=this.safeString(e,"destination"),o=this.safeStringLower(e,"type"),n=this.safeString(e,"status");let d;const h=this.safeNumber(e,"feeAmount");return void 0!==h&&(d={cost:h,currency:r}),{info:e,id:this.safeString2(e,"eid","withdrawalId"),txid:this.safeString(e,"txHash"),timestamp:i,datetime:this.iso8601(i),network:void 0,address:a,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:o,amount:this.safeNumber(e,"amount"),currency:r,status:this.parseTransactionStatus(n),updated:void 0,internal:void 0,comment:this.safeString(e,"message"),fee:d}}parseTransactionStatus(e){return this.safeString({Advanced:"ok",Complete:"ok"},e,e)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");return{currency:this.safeCurrencyCode(void 0,t),network:void 0,address:i,tag:void 0,info:e}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=await this.fetchDepositAddressesByNetwork(e,t);let s;[s,t]=this.handleNetworkCodeAndParams(t);const r=this.indexBy(this.safeValue(i,s),"currency");return this.safeValue(r,e)}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();let i;if(e=this.currency(e).code,[i,t]=this.handleNetworkCodeAndParams(t),void 0===i)throw new r.ArgumentsRequired(this.id+" fetchDepositAddresses() requires a network parameter");const s={network:this.networkCodeToId(i)},a=await this.privatePostV1AddressesNetwork(this.extend(s,t)),o=this.parseDepositAddresses(a,[e],!1,{network:i,currency:e});return this.groupBy(o,"network")}sign(e,t="public",i="GET",s={},a=void 0,o=void 0){let d="/"+this.implodeParams(e,s);const h=this.omit(s,this.extractParams(e));if("private"===t){this.checkRequiredCredentials();if(this.apiKey.indexOf("account")<0)throw new r.AuthenticationError(this.id+" sign() requires an account-key, master-keys are not-supported");const e=this.nonce().toString(),t=this.extend({request:d,nonce:e},h);let i=this.json(t);i=this.stringToBase64(i);const s=this.hmac(this.encode(i),this.encode(this.secret),n.qt);a={"Content-Type":"text/plain","X-GEMINI-APIKEY":this.apiKey,"X-GEMINI-PAYLOAD":i,"X-GEMINI-SIGNATURE":s}}else Object.keys(h).length&&(d+="?"+this.urlencode(h));return d=this.urls.api[t]+d,"POST"!==i&&"DELETE"!==i||(o=this.json(h)),{url:d,method:i,body:o,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n){if("string"==typeof o){const e=this.id+" "+o;this.throwBroadlyMatchedException(this.exceptions.broad,o,e)}return}if("error"===this.safeString(n,"result")){const e=this.safeString(n,"reason"),t=this.safeString(n,"message"),i=this.id+" "+t;throw this.throwExactlyMatchedException(this.exceptions.exact,e,i),this.throwExactlyMatchedException(this.exceptions.exact,t,i),this.throwBroadlyMatchedException(this.exceptions.broad,t,i),new r.ExchangeError(i)}}async createDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.privatePostV1DepositCurrencyNewAddress(this.extend(i,t)),r=this.safeString(s,"address");return this.checkAddress(r),{currency:e,address:r,tag:void 0,info:s}}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={timeframe:this.safeString(this.timeframes,t,t),symbol:a.id},n=await this.publicGetV2CandlesSymbolTimeframe(this.extend(o,r));return this.parseOHLCVs(n,a,t,i,s)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"hashkey",name:"HashKey Global",countries:["BM"],rateLimit:100,version:"v1",certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!0,cancelWithdraw:!1,closePosition:!1,createConvertTrade:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrder:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!1,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!1,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!1,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!0,fetchClosedOrder:!0,fetchClosedOrders:!1,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchConvertTrade:!1,fetchConvertTradeHistory:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsForSymbol:!0,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!1,setLeverage:!0,setMargin:!1,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d","1w":"1w","1M":"1M"},urls:{logo:"https://github.com/user-attachments/assets/6dd6127b-cc19-4a13-9b29-a98d81f80e98",api:{public:"https://api-glb.hashkey.com",private:"https://api-glb.hashkey.com"},test:{public:"https://api-glb.sim.hashkeydev.com",private:"https://api-glb.sim.hashkeydev.com"},www:"https://global.hashkey.com/",doc:"https://hashkeyglobal-apidoc.readme.io/",fees:"https://support.global.hashkey.com/hc/en-us/articles/13199900083612-HashKey-Global-Fee-Structure",referral:"https://global.hashkey.com/en-US/register/invite?invite_code=82FQUN"},api:{public:{get:{"api/v1/exchangeInfo":5,"quote/v1/depth":1,"quote/v1/trades":1,"quote/v1/klines":1,"quote/v1/ticker/24hr":1,"quote/v1/ticker/price":1,"quote/v1/ticker/bookTicker":1,"quote/v1/depth/merged":1,"quote/v1/markPrice":1,"quote/v1/index":1,"api/v1/futures/fundingRate":1,"api/v1/futures/historyFundingRate":1,"api/v1/ping":1,"api/v1/time":1}},private:{get:{"api/v1/spot/order":1,"api/v1/spot/openOrders":1,"api/v1/spot/tradeOrders":5,"api/v1/futures/leverage":1,"api/v1/futures/order":1,"api/v1/futures/openOrders":1,"api/v1/futures/userTrades":1,"api/v1/futures/positions":1,"api/v1/futures/historyOrders":1,"api/v1/futures/balance":1,"api/v1/futures/liquidationAssignStatus":1,"api/v1/futures/riskLimit":1,"api/v1/futures/commissionRate":1,"api/v1/futures/getBestOrder":1,"api/v1/account/vipInfo":1,"api/v1/account":1,"api/v1/account/trades":5,"api/v1/account/type":5,"api/v1/account/checkApiKey":1,"api/v1/account/balanceFlow":5,"api/v1/spot/subAccount/openOrders":1,"api/v1/spot/subAccount/tradeOrders":1,"api/v1/subAccount/trades":1,"api/v1/futures/subAccount/openOrders":1,"api/v1/futures/subAccount/historyOrders":1,"api/v1/futures/subAccount/userTrades":1,"api/v1/account/deposit/address":1,"api/v1/account/depositOrders":1,"api/v1/account/withdrawOrders":1},post:{"api/v1/userDataStream":1,"api/v1/spot/orderTest":1,"api/v1/spot/order":1,"api/v1.1/spot/order":1,"api/v1/spot/batchOrders":5,"api/v1/futures/leverage":1,"api/v1/futures/order":1,"api/v1/futures/position/trading-stop":3,"api/v1/futures/batchOrders":5,"api/v1/account/assetTransfer":1,"api/v1/account/authAddress":1,"api/v1/account/withdraw":1},put:{"api/v1/userDataStream":1},delete:{"api/v1/spot/order":1,"api/v1/spot/openOrders":5,"api/v1/spot/cancelOrderByIds":5,"api/v1/futures/order":1,"api/v1/futures/batchOrders":1,"api/v1/futures/cancelOrderByIds":1,"api/v1/userDataStream":1}}},fees:{trading:{spot:{tierBased:!0,percentage:!0,feeSide:"get",maker:this.parseNumber("0.0012"),taker:this.parseNumber("0.0012"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.0012")],[this.parseNumber("1000000"),this.parseNumber("0.00080")],[this.parseNumber("5000000"),this.parseNumber("0.00070")],[this.parseNumber("10000000"),this.parseNumber("0.00060")],[this.parseNumber("50000000"),this.parseNumber("0.00040")],[this.parseNumber("200000000"),this.parseNumber("0.00030")],[this.parseNumber("400000000"),this.parseNumber("0.00010")],[this.parseNumber("800000000"),this.parseNumber("0.00")]],taker:[[this.parseNumber("0"),this.parseNumber("0.0012")],[this.parseNumber("1000000"),this.parseNumber("0.00090")],[this.parseNumber("5000000"),this.parseNumber("0.00085")],[this.parseNumber("10000000"),this.parseNumber("0.00075")],[this.parseNumber("50000000"),this.parseNumber("0.00065")],[this.parseNumber("200000000"),this.parseNumber("0.00045")],[this.parseNumber("400000000"),this.parseNumber("0.00040")],[this.parseNumber("800000000"),this.parseNumber("0.00035")]]}},swap:{tierBased:!0,percentage:!0,feeSide:"get",maker:this.parseNumber("0.00025"),taker:this.parseNumber("0.00060"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.00025")],[this.parseNumber("1000000"),this.parseNumber("0.00016")],[this.parseNumber("5000000"),this.parseNumber("0.00014")],[this.parseNumber("10000000"),this.parseNumber("0.00012")],[this.parseNumber("50000000"),this.parseNumber("0.000080")],[this.parseNumber("200000000"),this.parseNumber("0.000060")],[this.parseNumber("400000000"),this.parseNumber("0.000020")],[this.parseNumber("800000000"),this.parseNumber("0.00")]],taker:[[this.parseNumber("0"),this.parseNumber("0.00060")],[this.parseNumber("1000000"),this.parseNumber("0.00050")],[this.parseNumber("5000000"),this.parseNumber("0.00045")],[this.parseNumber("10000000"),this.parseNumber("0.00040")],[this.parseNumber("50000000"),this.parseNumber("0.00035")],[this.parseNumber("200000000"),this.parseNumber("0.00030")],[this.parseNumber("400000000"),this.parseNumber("0.00025")],[this.parseNumber("800000000"),this.parseNumber("0.00020")]]}}}},options:{broker:"10000700011",recvWindow:void 0,sandboxMode:!1,networks:{BTC:"BTC",ERC20:"ETH",AVAX:"AvalancheC",SOL:"Solana",MATIC:"Polygon",ATOM:"Cosmos",DOT:"Polkadot",LTC:"LTC",OPTIMISM:"Optimism",ARB:"Arbitrum",DOGE:"Dogecoin",TRC20:"Tron",ZKSYNC:"zkSync",TON:"TON",KLAYTN:"Klaytn",MERLINCHAIN:"Merlin Chain"},networksById:{BTC:"BTC",Bitcoin:"BTC",ETH:"ERC20",ERC20:"ERC20",AvalancheC:"AVAX","AVAX C-Chain":"AVAX",Solana:"SOL",Cosmos:"ATOM",Arbitrum:"ARB",Polygon:"MATIC",Optimism:"OPTIMISM",Polkadot:"DOT",LTC:"LTC",Litecoin:"LTC",Dogecoin:"DOGE","Merlin Chain":"MERLINCHAIN",zkSync:"ZKSYNC",TRC20:"TRC20",Tron:"TRC20",TON:"TON","BSC(BEP20)":"BSC",Klaytn:"KLAYTN"},defaultNetwork:"ERC20"},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!0,iceberg:!1},createOrders:{max:20},fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:30,untilDays:30,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{triggerPrice:!0,selfTradePrevention:!0},fetchOpenOrders:{trigger:!0,limit:500}},swap:{linear:{extends:"forDerivatives"},inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{"0001":r.BadRequest,"0002":r.AuthenticationError,"0003":r.RateLimitExceeded,"0102":r.AuthenticationError,"0103":r.AuthenticationError,"0104":r.PermissionDenied,"0201":r.ExchangeError,"0202":r.PermissionDenied,"0206":r.BadRequest,"0207":r.BadRequest,"0209":r.BadRequest,"0210":r.BadRequest,"0211":r.OrderNotFound,"0401":r.InsufficientFunds,"0402":r.BadRequest,"-1000":r.ExchangeError,"-1001":r.ExchangeError,"-100010":r.BadSymbol,"-100012":r.BadSymbol,"-1002":r.AuthenticationError,"-1004":r.BadRequest,"-1005":r.PermissionDenied,"-1006":r.ExchangeError,"-1007":r.RequestTimeout,"-1014":r.InvalidOrder,"-1015":r.InvalidOrder,"-1020":r.OperationRejected,"-1021":r.InvalidNonce,"-1024":r.BadRequest,"-1101":r.ExchangeNotAvailable,"-1115":r.InvalidOrder,"-1117":r.InvalidOrder,"-1123":r.InvalidOrder,"-1124":r.InvalidOrder,"-1126":r.InvalidOrder,"-1129":r.BadRequest,"-1130":r.BadRequest,"-1132":r.BadRequest,"-1133":r.BadRequest,"-1135":r.BadRequest,"-1136":r.BadRequest,"-1138":r.InvalidOrder,"-1137":r.InvalidOrder,"-1139":r.OrderImmediatelyFillable,"-1140":r.InvalidOrder,"-1141":r.DuplicateOrderId,"-1142":r.OrderNotFillable,"-1143":r.OrderNotFound,"-1144":r.OperationRejected,"-1145":r.NotSupported,"-1146":r.RequestTimeout,"-1147":r.RequestTimeout,"-1148":r.InvalidOrder,"-1149":r.OperationRejected,"-1150":r.OperationFailed,"-1151":r.OperationRejected,"-1152":r.AccountNotEnabled,"-1153":r.InvalidOrder,"-1154":r.InvalidOrder,"-1155":r.OperationRejected,"-1156":r.OperationFailed,"-1157":r.OperationFailed,"-1158":r.OperationFailed,"-1159":r.AccountNotEnabled,"-1160":r.AccountNotEnabled,"-1161":r.OperationFailed,"-1162":r.ContractUnavailable,"-1163":r.InvalidAddress,"-1164":r.OperationFailed,"-1165":r.ArgumentsRequired,"-1166":r.OperationRejected,"-1167":r.BadRequest,"-1168":r.BadRequest,"-1169":r.PermissionDenied,"-1170":r.PermissionDenied,"-1171":r.PermissionDenied,"-1172":r.BadRequest,"-1173":r.BadRequest,"-1174":r.PermissionDenied,"-1175":r.BadRequest,"-1176":r.BadRequest,"-1177":r.InvalidOrder,"-1178":r.AccountNotEnabled,"-1179":r.AccountSuspended,"-1181":r.ExchangeError,"-1193":r.OperationRejected,"-1194":r.OperationRejected,"-1195":r.BadRequest,"-1196":r.BadRequest,"-1200":r.BadRequest,"-1201":r.BadRequest,"-1202":r.BadRequest,"-1203":r.BadRequest,"-1204":r.BadRequest,"-1205":r.AccountNotEnabled,"-1206":r.BadRequest,"-1207":r.BadRequest,"-1208":r.BadRequest,"-1209":r.BadRequest,"-2001":r.ExchangeNotAvailable,"-2002":r.OperationFailed,"-2003":r.OperationFailed,"-2004":r.OperationFailed,"-2005":r.RequestTimeout,"-2010":r.OperationRejected,"-2011":r.OperationRejected,"-2016":r.OperationRejected,"-2017":r.OperationRejected,"-2018":r.OperationRejected,"-2019":r.PermissionDenied,"-2020":r.PermissionDenied,"-2021":r.PermissionDenied,"-2022":r.OperationRejected,"-2023":r.AuthenticationError,"-2024":r.AccountNotEnabled,"-2025":r.AccountNotEnabled,"-2026":r.BadRequest,"-2027":r.OperationRejected,"-2028":r.OperationRejected,"-2029":r.OperationRejected,"-2030":r.InsufficientFunds,"-2031":r.NotSupported,"-2032":r.OperationRejected,"-2033":r.OperationFailed,"-2034":r.InsufficientFunds,"-2035":r.OperationRejected,"-2036":r.NotSupported,"-2037":r.ExchangeError,"-2038":r.InsufficientFunds,"-2039":r.NotSupported,"-2040":r.ExchangeNotAvailable,"-2041":r.BadRequest,"-2042":r.OperationRejected,"-2043":r.OperationRejected,"-2044":r.BadRequest,"-2045":r.BadRequest,"-2046":r.BadRequest,"-2048":r.BadRequest,"-2049":r.BadRequest,"-2050":r.BadRequest,"-2051":r.OperationRejected,"-2052":r.OperationRejected,"-2053":r.OperationRejected,"-2054":r.BadRequest,"-2055":r.BadRequest,"-2056":r.BadRequest,"-2057":r.BadRequest,"-3117":r.PermissionDenied,"-3143":r.PermissionDenied,"-3144":r.PermissionDenied,"-3145":r.DDoSProtection,"-4001":r.BadRequest,"-4002":r.BadRequest,"-4003":r.InsufficientFunds,"-4004":r.BadRequest,"-4005":r.BadRequest,"-4006":r.AccountNotEnabled,"-4007":r.NotSupported,"-4008":r.AccountNotEnabled,"-4009":r.PermissionDenied,"-4010":r.PermissionDenied,"-4011":r.ExchangeError,"-4012":r.ExchangeError,"-4013":r.OperationFailed},broad:{}},precisionMode:o.kb})}async fetchTime(e={}){const t=await this.publicGetApiV1Time(e);return this.safeInteger(t,"serverTime")}async fetchStatus(e={}){return{status:"ok",updated:void 0,eta:void 0,url:void 0,info:await this.publicGetApiV1Ping(e)}}async fetchMarkets(e={}){const t=await this.publicGetApiV1ExchangeInfo(this.extend({},e)),i=this.safeList(t,"symbols",[]),s=this.safeList(t,"contracts",[]);let r=this.arrayConcat(i,s);return this.isEmpty(r)&&(r=[t]),this.parseMarkets(r)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"quoteAsset"),s=this.safeCurrencyCode(i),r=this.safeString(e,"marginToken"),o=this.safeCurrencyCode(r);let n=this.safeString(e,"baseAsset"),d="spot",h=!0,c=!1,l="";const u=t.split("-");"PERPETUAL"===this.safeString(u,1)&&(d="swap",h=!1,c=!0,n=this.safeString(e,"underlying"),l+=":"+r);const f=this.safeCurrencyCode(n),p=f+"/"+s+l,m="TRADING"===this.safeString(e,"status");let g,v;const y=this.safeBool(e,"inverse");void 0!==y&&(y?(g=!1,v="inverse"):(g=!0,v="linear"));const w=this.safeList(e,"filters",[]),b=this.indexBy(w,"filterType"),k=this.safeDict(b,"PRICE_FILTER",{}),S=this.safeDict(b,"LOT_SIZE",{}),O=this.safeDict(b,"MIN_NOTIONAL",{}),T=this.omitZero(this.safeString(O,"min_notional")),P=this.safeString(e,"contractMultiplier");let I,M,x=this.safeString(S,"stepSize"),A=this.safeString(S,"minQty"),C=this.safeString(S,"maxQty");if(c){x=a.Y.stringDiv(x,P),A=a.Y.stringDiv(A,P),C=a.Y.stringDiv(C,P);const t=this.safeList(e,"riskLimits");if(void 0!==t){const e=this.safeDict(t,0),i=t.length,s=this.safeDict(t,i-1);let r=this.safeString(e,"initialMargin"),o=this.safeString(s,"initialMargin");a.Y.stringGt(r,o)&&([r,o]=[o,r]),I=this.parseToInt(a.Y.stringDiv("1",o)),M=this.parseToInt(a.Y.stringDiv("1",r))}}const B=this.safeDict(this.fees,"trading"),_=h?this.safeDict(B,"spot"):this.safeDict(B,"swap");return this.safeMarketStructure({id:t,symbol:p,base:f,quote:s,baseId:n,quoteId:i,active:m,type:d,subType:v,spot:h,margin:this.safeBool(e,"allowMargin"),swap:c,future:!1,option:!1,contract:c,settle:o,settleId:r,contractSize:this.parseNumber(P),linear:g,inverse:y,taker:this.safeNumber(_,"taker"),maker:this.safeNumber(_,"maker"),percentage:this.safeBool(_,"percentage"),tierBased:this.safeBool(_,"tierBased"),feeSide:this.safeString(_,"feeSide"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(x),price:this.safeNumber(k,"tickSize")},limits:{amount:{min:this.parseNumber(A),max:this.parseNumber(C)},price:{min:this.safeNumber(k,"minPrice"),max:this.safeNumber(k,"maxPrice")},leverage:{min:I,max:M},cost:{min:this.parseNumber(T),max:void 0}},created:void 0,info:e})}async fetchCurrencies(e={}){const t=await this.publicGetApiV1ExchangeInfo(e),i=this.safeList(t,"coins"),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"coinId"),a=this.safeCurrencyCode(r),o=this.safeBool(t,"allowWithdraw"),n=this.safeBool(t,"allowDeposit"),d=this.safeList(t,"chainTypes"),h=this.safeDict(this.options,"networksById"),c={};for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"chainType"),s=this.safeString(h,i,i),r=this.omitZero(this.safeString(t,"maxWithdrawQuantity")),a=this.safeBool(t,"allowDeposit"),o=this.safeBool(t,"allowWithdraw");c[s]={id:i,network:s,limits:{withdraw:{min:this.safeNumber(t,"minWithdrawQuantity"),max:this.parseNumber(r)},deposit:{min:this.safeNumber(t,"minDepositQuantity"),max:void 0}},active:a&&o,deposit:a,withdraw:o,fee:this.safeNumber(t,"withdrawFee"),precision:void 0,info:t}}s[a]={id:r,code:a,precision:void 0,type:this.parseCurrencyType(this.safeString(t,"tokenType")),name:this.safeString(t,"coinFullName"),active:o&&n,deposit:n,withdraw:o,fee:void 0,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:c,info:t}}return s}parseCurrencyType(e){return this.safeString({CHAIN_TOKEN:"crypto",ERC20_TOKEN:"crypto",BSC_TOKEN:"crypto",REAL_MONEY:"fiat"},e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(s.limit=t);const r=await this.publicGetQuoteV1Depth(this.extend(s,i)),a=this.safeInteger(r,"t");return this.parseOrderBook(r,e,a,"b","a")}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetQuoteV1Trades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){const a="fetchMyTrades";await this.loadMarkets();const o={};let n;void 0!==e&&(n=this.market(e));let d,h,c,l="spot";if([l,s]=this.handleMarketTypeAndParams(a,n,s),void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[d,s]=this.handleOptionAndParams(s,a,"until"),void 0!==d&&(o.endTime=d),[h,s]=this.handleOptionAndParams(s,a,"accountId"),"spot"===l)void 0!==n&&(o.symbol=n.id),void 0!==h&&(o.accountId=h),c=await this.privateGetApiV1AccountTrades(this.extend(o,s));else{if("swap"!==l)throw new r.NotSupported(this.id+" "+a+"() is not supported for "+l+" type of markets");if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a symbol argument for swap markets");o.symbol=n.id,void 0!==h?(o.subAccountId=h,c=await this.privateGetApiV1FuturesSubAccountUserTrades(this.extend(o,s))):c=await this.privateGetApiV1FuturesUserTrades(this.extend(o,s))}return this.parseTrades(c,n,t,i)}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"t","time"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);let r=this.safeStringLower(e,"side");void 0!==r&&(r=this.safeString(r.split("_"),0));const a=this.safeBool(e,"isBuyer");let o;void 0!==a&&(r=a?"buy":"sell");const n=this.safeBoolN(e,["isMaker","isMarker"]);void 0!==n&&(o=n?"maker":"taker");const d=this.safeBool(e,"ibm");void 0!==d&&(o="taker",r=d?"sell":"buy");let h=this.safeString(e,"commission"),c=this.safeString(e,"commissionAsset");const l=this.safeDict(e,"fee");let u;return void 0!==l&&(h=this.safeString(l,"fee"),c=this.safeString(l,"feeCoinId")),void 0!==h&&(u={cost:this.parseNumber(h),currency:this.safeCurrencyCode(c)}),this.safeTrade({id:this.safeString2(e,"id","tradeId"),timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,side:r,price:this.safeString2(e,"p","price"),amount:this.safeStringN(e,["q","qty","quantity"]),cost:void 0,takerOrMaker:o,type:void 0,order:this.safeString(e,"orderId"),fee:u,info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){const a="fetchOHLCV";await this.loadMarkets();let o=!1;if([o,r]=this.handleOptionAndParams(r,a,"paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const n=this.market(e);t=this.safeString(this.timeframes,t,t);const d={symbol:n.id,interval:t};let h;void 0!==i&&(d.startTime=i),void 0!==s&&(d.limit=s),[h,r]=this.handleOptionAndParams(r,a,"until"),void 0!==h&&(d.endTime=h);const c=await this.publicGetQuoteV1Klines(this.extend(d,r));return this.parseOHLCVs(c,n,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetQuoteV1Ticker24hr(this.extend(s,t)),a=this.safeDict(r,0,{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetQuoteV1Ticker24hr(t);return this.parseTickers(i,e)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"t"),s=this.safeString(e,"s"),r=(t=this.safeMarket(s,t)).symbol,a=this.safeString(e,"c");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"h"),low:this.safeString(e,"l"),bid:this.safeString(e,"b"),bidVolume:void 0,ask:this.safeString(e,"a"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"o"),close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"v"),quoteVolume:this.safeString(e,"qv"),info:e},t)}async fetchLastPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetQuoteV1TickerPrice(this.extend({},t));return this.parseLastPrices(i,e)}parseLastPrice(e,t=void 0){const i=this.safeString(e,"s");return{symbol:(t=this.safeMarket(i,t)).symbol,timestamp:void 0,datetime:void 0,price:this.safeNumber(e,"p"),side:void 0,info:e}}async fetchBalance(e={}){await this.loadMarkets();const t={},i="fetchBalance";let s="spot";if([s,e]=this.handleMarketTypeAndParams(i,void 0,e,s),"swap"===s){const t=await this.privateGetApiV1FuturesBalance(e),i=this.safeDict(t,0,{});return this.parseSwapBalance(i)}if("spot"===s){const i=await this.privateGetApiV1Account(this.extend(t,e));return this.parseBalance(i)}throw new r.NotSupported(this.id+" "+i+"() is not supported for "+s+" type of markets")}parseBalance(e){const t={info:e},i=this.safeList(e,"balances",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"total"),o.free=this.safeString(s,"free"),o.used=this.safeString(s,"locked"),t[a]=o}return this.safeBalance(t)}parseSwapBalance(e){const t=this.safeString(e,"asset"),i=this.safeCurrencyCode(t),s=this.account();s.total=this.safeString(e,"balance");const r=this.safeString(e,"positionMargin"),o=this.safeString(e,"orderMargin");s.used=a.Y.stringAdd(r,o);const n={info:e};return n[i]=s,this.safeBalance(n)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id};let r;[r,t]=this.handleNetworkCodeAndParams(t),void 0===r&&(r=this.defaultNetworkCode(e)),s.chainType=this.networkCodeToId(r,e);const a=await this.privateGetApiV1AccountDepositAddress(this.extend(s,t)),o=this.parseDepositAddress(a,i);return o.network=r,o}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");this.checkAddress(i);let s=this.safeString(e,"addressExt");return""===s&&(s=void 0),{info:e,currency:t.code,network:void 0,address:i,tag:s}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[o,s]=this.handleOptionAndParams(s,"fetchDeposits","until"),void 0!==o&&(r.endTime=o);const n=await this.privateGetApiV1AccountDepositOrders(this.extend(r,s));return this.parseTransactions(n,a,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[o,s]=this.handleOptionAndParams(s,"fetchWithdrawals","until"),void 0!==o&&(r.endTime=o);const n=await this.privateGetApiV1AccountWithdrawOrders(this.extend(r,s));return this.parseTransactions(n,a,t,i,{type:"withdrawal"})}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={coin:a.id,address:i,quantity:t};let n;void 0!==s&&(o.addressExt=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chainType=this.networkCodeToId(n));const d=await this.privatePostApiV1AccountWithdraw(this.extend(o,r));return this.parseTransaction(d,a)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","orderId"),s=this.safeString(e,"address");let r=this.safeString(e,"status");if(void 0===r){if(this.safeBool(e,"success",!1))r="ok";else{void 0!==this.safeString(e,"addressUrl")&&(r="ok")}}const a=this.safeString(e,"txId"),o=this.safeString(e,"coin"),n=this.safeCurrencyCode(o,t),d=this.safeInteger(e,"time"),h=this.safeNumber(e,"quantity"),c=this.safeNumber(e,"fee");let l;return void 0!==c&&(l={cost:c,currency:n}),{info:e,id:i,txid:a,timestamp:d,datetime:this.iso8601(d),network:void 0,address:s,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:void 0,amount:h,currency:n,status:this.parseTransactionStatus(r),updated:void 0,internal:void 0,comment:void 0,fee:l}}parseTransactionStatus(e){return this.safeString({1:"pending",2:"pending",3:"failed",4:"ok",5:"pending",6:"ok",7:"failed",8:"cancelled",9:"failed",10:"failed",successful:"ok",success:"ok"},e,e)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={coin:a.id,quantity:this.currencyToPrecision(e,t),fromAccountId:i,toAccountId:s},n=await this.privatePostApiV1AccountAssetTransfer(this.extend(o,r));return this.parseTransfer(n,a)}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(t,"id");let r;return this.safeBool(e,"success",!1)&&(r="ok"),{id:this.safeString(e,"orderId"),timestamp:i,datetime:this.iso8601(i),currency:this.safeCurrencyCode(s,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:r,info:e}}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privateGetApiV1AccountType(e);return this.parseAccounts(t,e)}parseAccount(e){const t=this.safeString(e,"accountLabel");let i="";"Main Trading Account"===t||"Main Future Account"===t?i="main":"Sub Main Trading Account"!==t&&"Sub Main Future Account"!==t||(i="sub");const s=i+" "+this.parseAccountType(this.safeString(e,"accountType"));return{id:this.safeString(e,"accountId"),type:s,code:void 0,info:e}}parseAccountType(e){return this.safeString({1:"spot account",3:"swap account",5:"custody account",6:"fiat account"},e,e)}encodeAccountType(e){return this.safeInteger({spot:"1",swap:"3",custody:"5"},e,e)}encodeFlowType(e){return this.safeInteger({trade:"1",fee:"3",transfer:"51",deposit:"900",withdraw:"904"},e,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const a="fetchLedger";if(void 0===t)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a since argument");let o;if([o,s]=this.handleOptionAndParams(s,a,"until"),void 0===o)throw new r.ArgumentsRequired(this.id+" "+a+"() requires an until argument");await this.loadMarkets();const n=this.currency(e),d={};let h,c;d.startTime=t,void 0!==i&&(d.limit=i),d.endTime=o,[h,s]=this.handleOptionAndParams(s,a,"flowType"),void 0!==h&&(d.flowType=this.encodeFlowType(h)),[c,s]=this.handleOptionAndParams(s,a,"accountType"),void 0!==c&&(d.accountType=this.encodeAccountType(c));const l=await this.privateGetApiV1AccountBalanceFlow(this.extend(d,s));return this.parseLedger(l,n,t,i)}parseLedgerEntryType(e){return this.safeString({1:"trade",2:"fee",51:"transfer",900:"deposit",904:"withdraw"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"accountId"),r=this.safeInteger(e,"created"),a=this.parseLedgerEntryType(this.safeString(e,"flowTypeValue")),o=this.safeString(e,"coin"),n=this.safeCurrencyCode(o,t);t=this.safeCurrency(o,t);const d=this.safeString(e,"change"),h=this.parseNumber(d);let c="in";d.indexOf("-")>=0&&(c="out");const l=this.safeString(e,"total"),u=this.parseNumber(l);return this.safeLedgerEntry({info:e,id:i,timestamp:r,datetime:this.iso8601(r),account:s,direction:c,referenceId:void 0,referenceAccount:void 0,type:a,currency:n,symbol:void 0,amount:h,before:void 0,after:u,status:"ok",fee:void 0},t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);if(n.spot)return await this.createSpotOrder(e,t,i,s,a,o);if(n.swap)return await this.createSwapOrder(e,t,i,s,a,o);throw new r.NotSupported(this.id+" createOrder() is not supported for "+n.type+" type of markets")}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() is supported for spot markets only");return i.cost=t,await this.createOrder(e,"market","buy",t,void 0,i)}async createSpotOrder(e,t,i,s,a=void 0,o={}){if(void 0!==this.safeString2(o,"stopPrice","triggerPrice"))throw new r.NotSupported(this.id+" trigger orders are not supported for spot markets");await this.loadMarkets();const n=this.market(e),d="market"===t&&"buy"===i,h=this.safeString(o,"cost");if(!d&&void 0!==h)throw new r.NotSupported(this.id+" createOrder() supports cost parameter for spot market buy orders only");const c=this.createSpotOrderRequest(e,t,i,s,a,o);let l={};return this.safeBool(o,"test")?(o=this.omit(o,"test"),l=await this.privatePostApiV1SpotOrderTest(c)):l=d&&void 0===h?await this.privatePostApiV11SpotOrder(c):await this.privatePostApiV1SpotOrder(c),this.parseOrder(l,n)}createOrderRequest(e,t,i,s,a=void 0,o={}){const n=this.market(e);if(n.spot)return this.createSpotOrderRequest(e,t,i,s,a,o);if(n.swap)return this.createSwapOrderRequest(e,t,i,s,a,o);throw new r.NotSupported(this.id+" createOrderRequest() is not supported for "+n.type+" type of markets")}createSpotOrderRequest(e,t,i,s,r=void 0,a={}){const o=this.market(e);t=t.toUpperCase();const n={symbol:o.id,side:i.toUpperCase(),type:t};let d;void 0!==s&&(n.quantity=this.amountToPrecision(e,s)),[d,a]=this.handleParamString(a,"cost"),void 0!==d&&(n.quantity=this.costToPrecision(e,d)),void 0!==r&&(n.price=this.priceToPrecision(e,r));const h="MARKET"===t;let c,l=!1;return[l,a]=this.handlePostOnly(h,"LIMIT_MAKER"===t,a),l&&"LIMIT"===t&&(n.type="LIMIT_MAKER"),[c,a]=this.handleParamString(a,"clientOrderId"),void 0!==c&&(a.newClientOrderId=c),this.extend(n,a)}createSwapOrderRequest(e,t,i,s,r=void 0,a={}){const o={symbol:this.market(e).id,type:"LIMIT",quantity:this.amountToPrecision(e,s)},n="market"===t;n&&(o.priceType="MARKET"),void 0!==r&&(o.price=this.priceToPrecision(e,r),o.priceType="INPUT");let d=!1;[d,a]=this.handleParamBool(a,"reduceOnly",d);let h,c="_OPEN";d&&(c="_CLOSE"),o.side=i.toUpperCase()+c,[h,a]=this.handleParamString(a,"timeInForce");let l=!1;[l,a]=this.handlePostOnly(n,"LIMIT_MAKER"===h,a),l&&(h="LIMIT_MAKER"),void 0!==h&&(o.timeInForce=h);void 0===this.safeString(a,"clientOrderId")&&(o.clientOrderId=this.uuid());const u=this.safeString(a,"triggerPrice");return void 0!==u&&(o.stopPrice=this.priceToPrecision(e,u),o.type="STOP",a=this.omit(a,"triggerPrice")),this.extend(o,a)}async createSwapOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.createSwapOrderRequest(e,t,i,s,r,a),d=await this.privatePostApiV1FuturesOrder(this.extend(n,a));return this.parseOrder(d,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.safeString(s,"type"),o=this.safeString(s,"side"),n=this.safeNumber(s,"amount"),d=this.safeNumber(s,"price"),h=this.safeDict(s,"params",{}),c=this.createOrderRequest(r,a,o,n,d,h);void 0===this.safeString(c,"clientOrderId")&&(c.clientOrderId=this.uuid()),i.push(c)}const s=i[0],a=this.safeString(s,"symbol"),o=this.market(a),n={orders:i};let d;if(o.spot)d=await this.privatePostApiV1SpotBatchOrders(this.extend(n,t));else{if(!o.swap)throw new r.NotSupported(this.id+" createOrderRequest() is not supported for "+o.type+" type of markets");d=await this.privatePostApiV1FuturesBatchOrders(this.extend(n,t))}const h=this.safeList(d,"result",[]),c=[];for(let e=0;e<h.length;e++){const t=this.safeDict(h,e,{}),i=this.safeDict(t,"order",{});c.push(i)}return this.parseOrders(c)}async cancelOrder(e,t=void 0,i={}){const s="cancelOrder";this.checkTypeParam(s,i),await this.loadMarkets();const a={};let o;void 0===this.safeString(i,"clientOrderId")&&(a.orderId=e),void 0!==t&&(o=this.market(t));let n,d="spot";if([d,i]=this.handleMarketTypeAndParams(s,o,i,d),"spot"===d)n=await this.privateDeleteApiV1SpotOrder(this.extend(a,i));else{if("swap"!==d)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+d+" type of markets");{let e=!1;[e,i]=this.handleTriggerOptionAndParams(i,s,e),a.type=e?"STOP":"LIMIT",void 0!==o&&(a.symbol=o.id),n=await this.privateDeleteApiV1FuturesOrder(this.extend(a,i))}}return this.parseOrder(n)}async cancelAllOrders(e=void 0,t={}){const i="cancelAllOrders";if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+i+"() requires a symbol argument");await this.loadMarkets();const s=this.market(e),a={symbol:s.id},o=this.safeString(t,"side");let n;if(void 0!==o&&(a.side=o),s.spot)n=await this.privateDeleteApiV1SpotOpenOrders(this.extend(a,t));else{if(!s.swap)throw new r.NotSupported(this.id+" "+i+"() is not supported for "+s.type+" type of markets");n=await this.privateDeleteApiV1FuturesBatchOrders(this.extend(a,t))}const d=this.safeOrder(n);return d.info=n,[d]}async cancelOrders(e,t=void 0,i={}){const s="cancelOrders";await this.loadMarkets();const a={},o=e.join(",");let n;a.ids=o,void 0!==t&&(n=this.market(t));let d,h="spot";if([h,i]=this.handleMarketTypeAndParams(s,n,i,h),"spot"===h)d=await this.privateDeleteApiV1SpotCancelOrderByIds(this.extend(a));else{if("swap"!==h)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+h+" type of markets");d=this.privateDeleteApiV1FuturesCancelOrderByIds(this.extend(a))}const c=this.safeOrder(d);return c.info=d,[c]}async fetchOrder(e,t=void 0,i={}){const s="fetchOrder";this.checkTypeParam(s,i),await this.loadMarkets();const a={};let o,n;[o,i]=this.handleParamString(i,"clientOrderId"),void 0===o&&(a.orderId=e),void 0!==t&&(n=this.market(t));let d,h="spot";if([h,i]=this.handleMarketTypeAndParams(s,n,i,h),"spot"===h)void 0!==o&&(a.origClientOrderId=o),d=await this.privateGetApiV1SpotOrder(this.extend(a,i));else{if("swap"!==h)throw new r.NotSupported(this.id+" "+s+"() is not supported for "+h+" type of markets");{let e=!1;[e,i]=this.handleTriggerOptionAndParams(i,s,e),e&&(a.type="STOP"),d=await this.privateGetApiV1FuturesOrder(this.extend(a,i))}}return this.parseOrder(d)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const a="fetchOpenOrders";let o;this.checkTypeParam(a,s),await this.loadMarkets(),void 0!==e&&(o=this.market(e));let n="spot";if([n,s]=this.handleMarketTypeAndParams(a,o,s,n),s=this.extend({methodName:a},s),"spot"===n)return await this.fetchOpenSpotOrders(e,t,i,s);if("swap"===n)return await this.fetchOpenSwapOrders(e,t,i,s);throw new r.NotSupported(this.id+" "+a+"() is not supported for "+n+" type of markets")}async fetchOpenSpotOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a="fetchOpenSpotOrders";[a,s]=this.handleParamString(s,"methodName",a);const o={};let n,d;return[d,s]=this.handleOptionAndParams(s,a,"accountId"),void 0!==d?(o.subAccountId=d,n=await this.privateGetApiV1SpotSubAccountOpenOrders(this.extend(o,s))):(void 0!==e&&(r=this.market(e),o.symbol=r.id),void 0!==i&&(o.limit=i),n=await this.privateGetApiV1SpotOpenOrders(this.extend(o,s))),this.parseOrders(n,r,t,i)}async fetchOpenSwapOrders(e=void 0,t=void 0,i=void 0,s={}){let a="fetchOpenSwapOrders";if([a,s]=this.handleParamString(s,"methodName",a),void 0===e)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a symbol argument for swap market orders");const o=this.market(e),n={symbol:o.id};let d,h,c=!1;return[c,s]=this.handleTriggerOptionAndParams(s,a,c),n.type=c?"STOP":"LIMIT",void 0!==i&&(n.limit=i),[h,s]=this.handleOptionAndParams(s,a,"accountId"),void 0!==h?(n.subAccountId=h,d=await this.privateGetApiV1FuturesSubAccountOpenOrders(this.extend(n,s))):d=await this.privateGetApiV1FuturesOpenOrders(this.extend(n,s)),this.parseOrders(d,o,t,i)}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){const a="fetchCanceledAndClosedOrders";this.checkTypeParam(a,s),await this.loadMarkets();const o={};let n,d,h;void 0!==i&&(o.limit=i),void 0!==t&&(o.startTime=t),[n,s]=this.handleOptionAndParams(s,a,"until"),void 0!==n&&(o.endTime=n),[d,s]=this.handleOptionAndParams(s,a,"accountId"),void 0!==e&&(h=this.market(e));let c,l="spot";if([l,s]=this.handleMarketTypeAndParams(a,h,s,l),"spot"===l)void 0!==h&&(o.symbol=h.id),void 0!==d&&(o.accountId=d),c=await this.privateGetApiV1SpotTradeOrders(this.extend(o,s));else{if("swap"!==l)throw new r.NotSupported(this.id+" "+a+"() is not supported for "+l+" type of markets");{if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+a+"() requires a symbol argument for swap markets");o.symbol=h.id;let t=!1;[t,s]=this.handleTriggerOptionAndParams(s,a,t),o.type=t?"STOP":"LIMIT",void 0!==d?(o.subAccountId=d,c=await this.privateGetApiV1FuturesSubAccountHistoryOrders(this.extend(o,s))):c=await this.privateGetApiV1FuturesHistoryOrders(this.extend(o,s))}}return this.parseOrders(c,h,t,i)}checkTypeParam(e,t){const i=this.safeString(t,"type");if(void 0!==i&&"spot"!==i&&"swap"!==i)throw new r.BadRequest(this.id+" "+e+' () type parameter can not be "'+i+'". It should define the type of the market ("spot" or "swap"). To define the type of an order use the trigger parameter (true for trigger orders)')}handleTriggerOptionAndParams(e,t,i=void 0){let s=i;return[s,e]=this.handleOptionAndParams2(e,t,"stop","trigger",s),[s,e]}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeInteger2(e,"transactTime","time"),r=this.safeString(e,"status");let a=this.safeString(e,"type");"MARKET"===this.safeString(e,"priceType")&&(a="market");let o=this.omitZero(this.safeString(e,"price"));"STOP"===a&&(a=void 0===o?"market":"limit");let n,d=this.safeString(e,"timeInForce");[a,d,n]=this.parseOrderTypeTimeInForceAndPostOnly(a,d);const h=this.omitZero(this.safeString(e,"avgPrice"));void 0===o&&(o=h);let c,l=this.safeStringLower(e,"side");[l,c]=this.parseOrderSideAndReduceOnly(l);let u=this.safeString(e,"feeCoin");return""===u&&(u=void 0),this.safeOrder({id:this.safeString(e,"orderId"),clientOrderId:this.safeString(e,"clientOrderId"),datetime:this.iso8601(s),timestamp:s,lastTradeTimestamp:void 0,lastUpdateTimestamp:this.safeInteger(e,"updateTime"),status:this.parseOrderStatus(r),symbol:t.symbol,type:a,timeInForce:d,side:l,price:o,average:h,amount:this.omitZero(this.safeString(e,"origQty")),filled:this.safeString(e,"executedQty"),remaining:void 0,triggerPrice:this.omitZero(this.safeString(e,"stopPrice")),takeProfitPrice:void 0,stopLossPrice:void 0,cost:this.omitZero(this.safeString2(e,"cumulativeQuoteQty","cummulativeQuoteQty")),trades:void 0,fee:{currency:this.safeCurrencyCode(u),amount:this.omitZero(this.safeString(e,"feeAmount"))},reduceOnly:c,postOnly:n,info:e},t)}parseOrderSideAndReduceOnly(e){const t=e.split("_"),i=t[0];let s;const r=this.safeString(t,1);return void 0!==r&&("open"===r?s=!1:"close"===r&&(s=!0)),[i,s]}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIALLY_FILLED:"open",PARTIALLY_CANCELED:"canceled",FILLED:"closed",CANCELED:"canceled",ORDER_CANCELED:"canceled",PENDING_CANCEL:"canceled",REJECTED:"rejected",ORDER_NEW:"open"},e,e)}parseOrderTypeTimeInForceAndPostOnly(e,t){let i;return"LIMIT_MAKER"===e?i=!0:"LIMIT_MAKER"!==t&&"MAKER"!==t||(i=!0,t="PO"),[e=this.parseOrderType(e),t,i]}parseOrderType(e){return this.safeString({MARKET:"market",LIMIT:"limit",LIMIT_MAKER:"limit",MARKET_OF_BASE:"market"},e,e)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id,timestamp:this.milliseconds()},r=await this.publicGetApiV1FuturesFundingRate(this.extend(s,t)),a=this.safeDict(r,0,{});return this.parseFundingRate(a,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i={timestamp:this.milliseconds()},s=await this.publicGetApiV1FuturesFundingRate(this.extend(i,t));return this.parseFundingRates(s,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"swap");const s=this.safeNumber(e,"rate"),r=this.safeInteger(e,"nextSettleTime");return{info:e,symbol:t.symbol,markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:s,fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:r,nextFundingDatetime:this.iso8601(r),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");const a=this.market(e),o={symbol:a.id};void 0!==i&&(o.limit=i);const n=await this.publicGetApiV1FuturesHistoryFundingRate(this.extend(o,s)),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeInteger(t,"settleTime");d.push({info:t,symbol:this.safeSymbol(this.safeString(t,"symbol"),a,void 0,"swap"),fundingRate:this.safeNumber(t,"settleRate"),timestamp:i,datetime:this.iso8601(i)})}const h=this.sortBy(d,"timestamp");return this.filterBySinceLimit(h,t,i)}async fetchPositions(e=void 0,t={}){const i="fetchPositions";if(void 0===e)throw new r.ArgumentsRequired(this.id+" "+i+"() requires a symbol argument with one single market symbol");if(1!==e.length)throw new r.NotSupported(this.id+" "+i+"() is supported for a symbol argument with one single market symbol only");return await this.loadMarkets(),await this.fetchPositionsForSymbol(e[0],this.extend({methodName:"fetchPositions"},t))}async fetchPositionsForSymbol(e,t={}){await this.loadMarkets();const i=this.market(e);let s="fetchPosition";if([s,t]=this.handleParamString(t,"methodName",s),!i.swap)throw new r.NotSupported(this.id+" "+s+"() supports swap markets only");const a={symbol:i.id},o=await this.privateGetApiV1FuturesPositions(this.extend(a,t));return this.parsePositions(o,[e])}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol;return this.safePosition({symbol:s,id:void 0,timestamp:void 0,datetime:void 0,contracts:this.safeNumber(e,"position"),contractSize:void 0,side:this.safeStringLower(e,"side"),notional:this.safeNumber(e,"positionValue"),leverage:this.safeInteger(e,"leverage"),unrealizedPnl:this.safeNumber(e,"unrealizedPnL"),realizedPnl:this.safeNumber(e,"realizedPnL"),collateral:void 0,entryPrice:this.safeNumber(e,"avgPrice"),markPrice:void 0,liquidationPrice:this.safeNumber(e,"liquidationPrice"),marginMode:"cross",hedged:!0,maintenanceMargin:this.safeNumber(e,"minMargin"),maintenanceMarginPercentage:void 0,initialMargin:this.safeNumber(e,"margin"),initialMarginPercentage:void 0,marginRatio:void 0,lastUpdateTimestamp:void 0,lastPrice:this.safeNumber(e,"lastPrice"),stopLossPrice:void 0,takeProfitPrice:void 0,percentage:void 0,info:e})}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.privateGetApiV1FuturesLeverage(this.extend(s,t)),a=this.safeDict(r,0,{});return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){const i=this.safeStringLower(e,"marginType"),s=this.safeNumber(e,"leverage");return{info:e,symbol:t.symbol,marginMode:i,longLeverage:s,shortLeverage:s}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s={leverage:e},a=this.market(t);s.symbol=a.id;const o=await this.privatePostApiV1FuturesLeverage(this.extend(s,i));return this.parseLeverage(o,a)}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetApiV1ExchangeInfo(t),s=this.safeList(i,"contracts",[]);return e=this.marketSymbols(e),this.parseLeverageTiers(s,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeList(e,"riskLimits",[]),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=[];for(let e=0;e<i.length;e++){const o=i[e],n=this.safeString(o,"initialMargin");r.push({tier:this.sum(e,1),symbol:this.safeSymbol(s,t),currency:t.settle,minNotional:void 0,maxNotional:this.safeNumber(o,"quantity"),maintenanceMarginRate:this.safeNumber(o,"maintMargin"),maxLeverage:this.parseNumber(a.Y.stringDiv("1",n)),info:o})}return r}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e);let s;if(i.spot)return s=await this.fetchTradingFees(t),this.safeDict(s,e);if(i.swap)return s=await this.privateGetApiV1FuturesCommissionRate(this.extend({symbol:i.id},t)),this.parseTradingFee(s,i);throw new r.NotSupported(this.id+" fetchTradingFee() is not supported for "+i.type+" type of markets")}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetApiV1AccountVipInfo(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=this.safeDict(i,e,{}),r=this.parseTradingFee(t);s[r.symbol]=r}return s}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:(t=this.safeMarket(i,t)).symbol,maker:this.safeNumber2(e,"openMakerFee","actualMakerRate"),taker:this.safeNumber2(e,"openTakerFee","actualTakerRate"),percentage:!0,tierBased:!0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o,d=this.urls.api[t]+"/"+e;if("private"===t){this.checkRequiredCredentials();const t={timestamp:this.milliseconds()},h=this.safeInteger(this.options,"recvWindow");let c;if(void 0!==h&&(t.recvWindow=h),r={"X-HK-APIKEY":this.apiKey,"Content-Type":"application/x-www-form-urlencoded"},"POST"!==i||"api/v1/spot/batchOrders"!==e&&"api/v1/futures/batchOrders"!==e){const e=this.extend(t,s);c=this.hmac(this.encode(this.customUrlencode(e)),this.encode(this.secret),n.s),e.signature=c,o=this.customUrlencode(e),"GET"===i?d+="?"+o:a=o}else r["Content-Type"]="application/json",a=this.json(this.safeList(s,"orders")),c=this.hmac(this.encode(this.customUrlencode(t)),this.encode(this.secret),n.s),o=this.customUrlencode(this.extend(t,{signature:c})),d+="?"+o;r["INPUT-SOURCE"]=this.safeString(this.options,"broker","10000700011"),r.broker_sign=c}else o=this.urlencode(s),0!==o.length&&(d+="?"+o);return{url:d,method:i,body:a,headers:r}}customUrlencode(e={}){let t=this.urlencode(e);return t=t.replace("%2C",","),t}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;let c=!1,l=this.safeString(n,"code",void 0);if(0===this.safeInteger(n,"code",void 0)){const e=this.safeList(n,"result",[]);for(let t=0;t<e.length;t++){const i=this.safeDict(e,t);0!==this.safeInteger(i,"code")&&(c=!0,l=this.safeString(i,"code"))}}if(200!==e||c){const e=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,l,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"hitbtc",name:"HitBTC",countries:["HK"],rateLimit:3.333,version:"3",has:{CORS:!1,spot:!0,margin:!0,swap:!0,future:!1,option:void 0,addMargin:!0,cancelAllOrders:!0,cancelOrder:!0,closePosition:!1,createDepositAddress:!0,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchBorrowRateHistories:void 0,fetchBorrowRateHistory:void 0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:void 0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!0,fetchLeverageTiers:void 0,fetchLiquidations:!1,fetchMarginMode:"emulated",fetchMarginModes:!0,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenInterests:!0,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositions:!0,fetchPremiumIndexOHLCV:!0,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!0,fetchTransactions:"emulated",fetchWithdrawals:!0,reduceMargin:!0,sandbox:!0,setLeverage:!0,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!0,withdraw:!0},precisionMode:r.kb,urls:{logo:"https://user-images.githubusercontent.com/1294454/27766555-8eaec20e-5edc-11e7-9c5b-6dc69fc42f5e.jpg",test:{public:"https://api.demo.hitbtc.com/api/3",private:"https://api.demo.hitbtc.com/api/3"},api:{public:"https://api.hitbtc.com/api/3",private:"https://api.hitbtc.com/api/3"},www:"https://hitbtc.com",referral:"https://hitbtc.com/?ref_id=5a5d39a65d466",doc:["https://api.hitbtc.com","https://github.com/hitbtc-com/hitbtc-api/blob/master/APIv2.md"],fees:["https://hitbtc.com/fees-and-limits","https://support.hitbtc.com/hc/en-us/articles/115005148605-Fees-and-limits"]},api:{public:{get:{"public/currency":10,"public/currency/{currency}":10,"public/symbol":10,"public/symbol/{symbol}":10,"public/ticker":10,"public/ticker/{symbol}":10,"public/price/rate":10,"public/price/history":10,"public/price/ticker":10,"public/price/ticker/{symbol}":10,"public/trades":10,"public/trades/{symbol}":10,"public/orderbook":10,"public/orderbook/{symbol}":10,"public/candles":10,"public/candles/{symbol}":10,"public/converted/candles":10,"public/converted/candles/{symbol}":10,"public/futures/info":10,"public/futures/info/{symbol}":10,"public/futures/history/funding":10,"public/futures/history/funding/{symbol}":10,"public/futures/candles/index_price":10,"public/futures/candles/index_price/{symbol}":10,"public/futures/candles/mark_price":10,"public/futures/candles/mark_price/{symbol}":10,"public/futures/candles/premium_index":10,"public/futures/candles/premium_index/{symbol}":10,"public/futures/candles/open_interest":10,"public/futures/candles/open_interest/{symbol}":10}},private:{get:{"spot/balance":15,"spot/balance/{currency}":15,"spot/order":1,"spot/order/{client_order_id}":1,"spot/fee":15,"spot/fee/{symbol}":15,"spot/history/order":15,"spot/history/trade":15,"margin/account":1,"margin/account/isolated/{symbol}":1,"margin/account/cross/{currency}":1,"margin/order":1,"margin/order/{client_order_id}":1,"margin/config":15,"margin/history/order":15,"margin/history/trade":15,"margin/history/positions":15,"margin/history/clearing":15,"futures/balance":15,"futures/balance/{currency}":15,"futures/account":1,"futures/account/isolated/{symbol}":1,"futures/order":1,"futures/order/{client_order_id}":1,"futures/config":15,"futures/fee":15,"futures/fee/{symbol}":15,"futures/history/order":15,"futures/history/trade":15,"futures/history/positions":15,"futures/history/clearing":15,"wallet/balance":30,"wallet/balance/{currency}":30,"wallet/crypto/address":30,"wallet/crypto/address/recent-deposit":30,"wallet/crypto/address/recent-withdraw":30,"wallet/crypto/address/check-mine":30,"wallet/transactions":30,"wallet/transactions/{tx_id}":30,"wallet/crypto/fee/estimate":30,"wallet/airdrops":30,"wallet/amount-locks":30,"sub-account":15,"sub-account/acl":15,"sub-account/balance/{subAccID}":15,"sub-account/crypto/address/{subAccID}/{currency}":15},post:{"spot/order":1,"spot/order/list":1,"margin/order":1,"margin/order/list":1,"futures/order":1,"futures/order/list":1,"wallet/crypto/address":30,"wallet/crypto/withdraw":30,"wallet/convert":30,"wallet/transfer":30,"wallet/internal/withdraw":30,"wallet/crypto/check-offchain-available":30,"wallet/crypto/fees/estimate":30,"wallet/airdrops/{id}/claim":30,"sub-account/freeze":15,"sub-account/activate":15,"sub-account/transfer":15,"sub-account/acl":15},patch:{"spot/order/{client_order_id}":1,"margin/order/{client_order_id}":1,"futures/order/{client_order_id}":1},delete:{"spot/order":1,"spot/order/{client_order_id}":1,"margin/position":1,"margin/position/isolated/{symbol}":1,"margin/order":1,"margin/order/{client_order_id}":1,"futures/position":1,"futures/position/{margin_mode}/{symbol}":1,"futures/order":1,"futures/order/{client_order_id}":1,"wallet/crypto/withdraw/{id}":30},put:{"margin/account/isolated/{symbol}":1,"futures/account/isolated/{symbol}":1,"wallet/crypto/withdraw/{id}":30}}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0009"),maker:this.parseNumber("0.0009"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.0009")],[this.parseNumber("10"),this.parseNumber("0.0007")],[this.parseNumber("100"),this.parseNumber("0.0006")],[this.parseNumber("500"),this.parseNumber("0.0005")],[this.parseNumber("1000"),this.parseNumber("0.0003")],[this.parseNumber("5000"),this.parseNumber("0.0002")],[this.parseNumber("10000"),this.parseNumber("0.0001")],[this.parseNumber("20000"),this.parseNumber("0")],[this.parseNumber("50000"),this.parseNumber("-0.0001")],[this.parseNumber("100000"),this.parseNumber("-0.0001")]],taker:[[this.parseNumber("0"),this.parseNumber("0.0009")],[this.parseNumber("10"),this.parseNumber("0.0008")],[this.parseNumber("100"),this.parseNumber("0.0007")],[this.parseNumber("500"),this.parseNumber("0.0007")],[this.parseNumber("1000"),this.parseNumber("0.0006")],[this.parseNumber("5000"),this.parseNumber("0.0006")],[this.parseNumber("10000"),this.parseNumber("0.0005")],[this.parseNumber("20000"),this.parseNumber("0.0004")],[this.parseNumber("50000"),this.parseNumber("0.0003")],[this.parseNumber("100000"),this.parseNumber("0.0002")]]}}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!0,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1,marketType:!0},fetchOrder:{marginMode:!0,trigger:!1,trailing:!1,symbolRequired:!1,marketType:!0},fetchOpenOrders:{marginMode:!0,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1,marketType:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1,marketType:!0},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{marginMode:!0},fetchOrder:{marginMode:!1},fetchMyTrades:{marginMode:!1},fetchOpenOrders:{marginMode:!1},fetchClosedOrders:{marginMode:!1}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}}},timeframes:{"1m":"M1","3m":"M3","5m":"M5","15m":"M15","30m":"M30","1h":"H1","4h":"H4","1d":"D1","1w":"D7","1M":"1M"},exceptions:{exact:{429:o.RateLimitExceeded,500:o.ExchangeError,503:o.ExchangeNotAvailable,504:o.ExchangeNotAvailable,600:o.PermissionDenied,800:o.ExchangeError,1002:o.AuthenticationError,1003:o.PermissionDenied,1004:o.AuthenticationError,1005:o.AuthenticationError,2001:o.BadSymbol,2002:o.BadRequest,2003:o.BadRequest,2010:o.BadRequest,2011:o.BadRequest,2012:o.BadRequest,2020:o.BadRequest,2022:o.BadRequest,2024:o.InvalidOrder,10001:o.BadRequest,10021:o.AccountSuspended,10022:o.BadRequest,20001:o.InsufficientFunds,20002:o.OrderNotFound,20003:o.ExchangeError,20004:o.ExchangeError,20005:o.ExchangeError,20006:o.ExchangeError,20007:o.ExchangeError,20008:o.InvalidOrder,20009:o.InvalidOrder,20010:o.OnMaintenance,20011:o.ExchangeError,20012:o.ExchangeError,20014:o.ExchangeError,20016:o.ExchangeError,20018:o.ExchangeError,20031:o.ExchangeError,20032:o.ExchangeError,20033:o.ExchangeError,20034:o.ExchangeError,20040:o.ExchangeError,20041:o.ExchangeError,20042:o.ExchangeError,20043:o.ExchangeError,20044:o.PermissionDenied,20045:o.InvalidOrder,20047:o.InvalidOrder,20048:o.InvalidOrder,20049:o.InvalidOrder,20080:o.ExchangeError,21001:o.ExchangeError,21003:o.AccountSuspended,21004:o.AccountSuspended,22004:o.ExchangeError,22008:o.ExchangeError},broad:{}},options:{defaultNetwork:"ERC20",defaultNetworks:{ETH:"ETH",USDT:"TRC20"},networks:{BTC:"btc",OMNI:"BTC",ETH:"eth",ERC20:"ETH",ETC:"ETC",BEP20:"BSC",TRC20:"TRX",NEAR:"NEAR",DGB:"DGB",AE:"AE",AR:"AR",ADA:"ADA",CHZ:"CHZ",ABBC:"ABBC",ALGO:"ALGO",APT:"APT",ATOM:"ATOM",AVAXC:"AVAC",AVAXX:"AVAX",BSV:"BCHSV",BEP2:"BNB",CELO:"CELO",CKB:"CKB",CTXC:"CTXC",DASH:"DASH",DCR:"DCR",DOGE:"doge",EGLD:"EGLD",EOS:"EOS",ETHW:"ETHW",EVER:"EVER",FET:"FET",FIL:"FIL",FLOW:"FLOW",GLMR:"GLMR",GRIN:"GRIN",HBAR:"HBAR",HIVE:"HIVE",HYDRA:"HYDRA",ICP:"ICP",ICX:"ICX",IOST:"IOST",IOTA:"IOTA",IOTX:"IOTX",KAVA:"KAVA",KLAY:"KIM",KOMODO:"KMD",KSM:"KSM",LSK:"LSK",LTC:"ltc",MINA:"MINA",MOVR:"MOVR",NANO:"NANO",NEO:"NEO",ONE:"ONE",ONT:"ONT",OPTIMISM:"OP",PLCU:"PLCU",MATIC:"POLYGON",QTUM:"QTUM",REI:"REI",OASIS:"ROSE",RVN:"RVN",SC:"SC",SCRT:"SCRT",SOL:"SOL",STEEM:"STEEM",THETA:"Theta",TRUE:"TRUE",VET:"VET",VSYS:"VSYS",WAVES:"WAVES",WAX:"WAX",XCH:"XCH",XEC:"XEC",NEM:"XEM",XLM:"XLM",XMR:"xmr",XRD:"XRD",XRP:"XRP",XTZ:"XTZ",XVG:"XVG",XYM:"XYM",ZEC:"ZEC",ZEN:"ZEN",ZIL:"ZIL"},accountsByType:{spot:"spot",funding:"wallet",swap:"derivatives",future:"derivatives"},withdraw:{includeFee:!1}},commonCurrencies:{AUTO:"Cube",BCC:"BCC",BDP:"BidiPass",BET:"DAO.Casino",BIT:"BitRewards",BOX:"BOX Token",CPT:"Cryptaur",GET:"Themis",GMT:"GMT Token",HSR:"HC",IQ:"IQ.Cash",LNC:"LinkerCoin",PLA:"PlayChip",PNT:"Penta",SBTC:"Super Bitcoin",STEPN:"GMT",STX:"STOX",TV:"Tokenville",XMT:"MTL",XPNT:"PNT"}})}nonce(){return this.milliseconds()}async fetchMarkets(e={}){const t=await this.publicGetPublicSymbol(e),i=[],s=Object.keys(t);for(let e=0;e<s.length;e++){const r=s[e];if(r.endsWith("_BQX"))continue;const o=this.safeValue(t,r),n=this.safeString(o,"type"),d=this.safeInteger(o,"expiry"),h="futures"===n,c="spot"===n,l=this.safeBool(o,"margin_trading",!1),u=c&&l,f=void 0!==d,p=h&&!f,m=!1,g=this.safeString2(o,"base_currency","underlying"),v=this.safeString(o,"quote_currency"),y=this.safeString(o,"fee_currency"),w=this.safeCurrencyCode(g),b=this.safeCurrencyCode(v),k=this.safeCurrencyCode(y);let S,O,T,P,I,M=w+"/"+b,x="spot";h&&(T=this.parseNumber("1"),S=y,O=this.safeCurrencyCode(S),P=void 0!==b&&b===O,I=!P,M=M+":"+O,f?(M=M+"-"+d,x="future"):x="swap");const A=this.safeString(o,"quantity_increment"),C=this.safeString(o,"tick_size"),B=this.parseNumber(A),_=this.parseNumber(C);i.push({id:r,symbol:M,base:w,quote:b,settle:O,baseId:g,quoteId:v,settleId:S,type:x,spot:c,margin:u,swap:p,future:f,option:m,active:!0,contract:h,linear:P,inverse:I,taker:this.safeNumber(o,"take_rate"),maker:this.safeNumber(o,"make_rate"),contractSize:T,expiry:d,expiryDatetime:void 0,strike:void 0,optionType:void 0,feeCurrency:k,precision:{amount:B,price:_},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(o,"max_initial_leverage",1)},amount:{min:B,max:void 0},price:{min:_,max:void 0},cost:{min:this.parseNumber(a.Y.stringMul(A,C)),max:void 0}},created:void 0,info:o})}return i}async fetchCurrencies(e={}){const t=await this.publicGetPublicCurrency(e),i={},s=Object.keys(t);for(let e=0;e<s.length;e++){const r=s[e],a=this.safeCurrencyCode(r),o=t[r],n=this.safeString(o,"full_name"),d=this.safeNumber(o,"precision_transfer"),h=this.safeBool(o,"payin_enabled",!1),c=this.safeBool(o,"payout_enabled",!1),l=this.safeBool(o,"transfer_enabled",!1),u=h&&c&&l,f=this.safeValue(o,"networks",[]),p={};let m,g,v;for(let e=0;e<f.length;e++){const t=f[e],i=this.safeString2(t,"protocol","network");let s=this.networkIdToCode(i);s=void 0!==s?s.toUpperCase():void 0,m=this.safeNumber(t,"payout_fee");const r=this.safeNumber(t,"precision_payout"),a=this.safeBool(t,"payin_enabled",!1),o=this.safeBool(t,"payout_enabled",!1),n=a&&o;a&&!g?g=!0:a||(g=!1),o&&!v?v=!0:o||(v=!1),p[s]={info:t,id:i,network:s,fee:m,active:n,deposit:a,withdraw:o,precision:r,limits:{withdraw:{min:void 0,max:void 0}}}}const y=Object.keys(p).length;i[a]={info:o,code:a,id:r,precision:d,name:n,active:u,deposit:g,withdraw:v,networks:p,fee:y<=1?m:void 0,limits:{amount:{min:void 0,max:void 0}}}}return i}async createDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=this.safeStringUpper(t,"network");if(void 0!==s&&"USDT"===e){const e=this.safeValue(this.options,"networks"),r=this.safeString(e,s);void 0!==r&&(i.currency=r),t=this.omit(t,"network")}const r=await this.privatePostWalletCryptoAddress(this.extend(i,t)),a=this.safeString(r,"currency");return{currency:this.safeCurrencyCode(a),address:this.safeString(r,"address"),tag:this.safeString(r,"payment_id"),network:void 0,info:r}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=this.safeStringUpper(t,"network");if(void 0!==s&&"USDT"===e){const e=this.safeValue(this.options,"networks"),r=this.safeString(e,s);void 0!==r&&(i.currency=r),t=this.omit(t,"network")}const r=await this.privateGetWalletCryptoAddress(this.extend(i,t)),a=this.safeValue(r,0),o=this.safeString(a,"address"),n=this.safeString(a,"currency"),d=this.safeString(a,"payment_id");return{info:r,currency:this.safeCurrencyCode(n),network:void 0,address:o,tag:d}}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"reserved"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){const t=this.safeStringLower(e,"type","spot");e=this.omit(e,["type"]);const i=this.safeValue(this.options,"accountsByType",{}),s=this.safeString(i,t,t);let r;if("wallet"===s)r=await this.privateGetWalletBalance(e);else if("spot"===s)r=await this.privateGetSpotBalance(e);else{if("derivatives"!==s){const e=Object.keys(i);throw new o.BadRequest(this.id+" fetchBalance() type parameter must be one of "+e.join(", "))}r=await this.privateGetFuturesBalance(e)}return this.parseBalance(r)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetPublicTickerSymbol(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==(e=this.marketSymbols(e))){const t=this.marketIds(e).join(",");i.symbols=t}const s=await this.publicGetPublicTicker(this.extend(i,t)),r={},a=Object.keys(s);for(let e=0;e<a.length;e++){const t=a[e],i=this.safeMarket(t),o=i.symbol,n=s[t];r[o]=this.parseTicker(n,i)}return this.filterByArrayTickers(r,"symbol",e)}parseTicker(e,t=void 0){const i=this.parse8601(e.timestamp),s=this.safeSymbol(void 0,t),r=this.safeString(e,"volume"),a=this.safeString(e,"volume_quote"),o=this.safeString(e,"open"),n=this.safeString(e,"last");return this.safeTicker({symbol:s,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:o,close:n,last:n,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:r,quoteVolume:a,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let o;if(void 0!==i&&(a.limit=Math.min(i,1e3)),void 0!==t&&(a.from=t),void 0!==e?(r=this.market(e),a.symbol=r.id,o=await this.publicGetPublicTradesSymbol(this.extend(a,s))):o=await this.publicGetPublicTrades(this.extend(a,s)),void 0!==e)return this.parseTrades(o,r);let n=[];const d=Object.keys(o);for(let e=0;e<d.length;e++){const t=d[e],i=this.market(t),s=o[t],r=this.parseTrades(s,i);n=this.arrayConcat(n,r)}return n}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let n,d,h;if(void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==i&&(a.limit=i),void 0!==t&&(a.from=t),[n,s]=this.handleMarketTypeAndParams("fetchMyTrades",r,s),[d,s]=this.handleMarginModeAndParams("fetchMyTrades",s),s=this.omit(s,["marginMode","margin"]),void 0!==d)h=await this.privateGetMarginHistoryTrade(this.extend(a,s));else if("spot"===n)h=await this.privateGetSpotHistoryTrade(this.extend(a,s));else if("swap"===n)h=await this.privateGetFuturesHistoryTrade(this.extend(a,s));else{if("margin"!==n)throw new o.NotSupported(this.id+" fetchMyTrades() not support this market type");h=await this.privateGetMarginHistoryTrade(this.extend(a,s))}return this.parseTrades(h,r,t,i)}parseTrade(e,t=void 0){const i=this.parse8601(e.timestamp),s=this.safeString(e,"symbol"),r=(t=this.safeMarket(s,t)).symbol;let a;const o=this.safeString(e,"fee"),n=this.safeValue(e,"taker");let d;if(d=void 0!==n?n?"taker":"maker":"taker",void 0!==o){const e=this.safeValue(t,"info",{}),i=this.safeString(e,"fee_currency");a={cost:o,currency:this.safeCurrencyCode(i)}}const h=this.safeString2(e,"clientOrderId","client_order_id"),c=this.safeString(e,"price"),l=this.safeString2(e,"quantity","qty"),u=this.safeString(e,"side"),f=this.safeString(e,"id");return this.safeTrade({info:e,id:f,order:h,timestamp:i,datetime:this.iso8601(i),symbol:r,type:void 0,side:u,takerOrMaker:d,price:c,amount:l,cost:void 0,fee:a},t)}async fetchTransactionsHelper(e,t,i,s,r){await this.loadMarkets();const a={types:e};let o;void 0!==t&&(o=this.currency(t),a.currencies=o.id),void 0!==i&&(a.from=this.iso8601(i)),void 0!==s&&(a.limit=s);const n=await this.privateGetWalletTransactions(this.extend(a,r));return this.parseTransactions(n,o,i,s,r)}parseTransactionStatus(e){return this.safeString({CREATED:"pending",PENDING:"pending",FAILED:"failed",ROLLED_BACK:"failed",SUCCESS:"ok"},e,e)}parseTransactionType(e){return this.safeString({DEPOSIT:"deposit",WITHDRAW:"withdrawal"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"operation_id","id"),s=this.parse8601(this.safeString(e,"created_at")),r=this.parse8601(this.safeString(e,"updated_at")),a=this.parseTransactionType(this.safeString(e,"type")),o=this.parseTransactionStatus(this.safeString(e,"status")),n=this.safeValue(e,"native",{}),d=this.safeString(n,"currency"),h=this.safeCurrencyCode(d),c=this.safeString(n,"hash"),l=this.safeString(n,"address"),u=l,f=this.safeString(n,"payment_id"),p=f,m=this.safeValue(n,"senders"),g=this.safeString(m,0),v=this.safeNumber(n,"amount"),y="OFFCHAIN"===this.safeString(e,"subtype"),w={currency:void 0,cost:void 0,rate:void 0},b=this.safeNumber(n,"fee");return void 0!==b&&(w.currency=h,w.cost=b),{info:e,id:i,txid:c,type:a,currency:h,network:void 0,amount:v,status:o,timestamp:s,datetime:this.iso8601(s),address:l,addressFrom:g,addressTo:u,tag:f,tagFrom:void 0,tagTo:p,updated:r,comment:void 0,internal:y,fee:w}}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("DEPOSIT,WITHDRAW",e,t,i,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("DEPOSIT",e,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactionsHelper("WITHDRAW",e,t,i,s)}async fetchOrderBooks(e=void 0,t=void 0,i={}){await this.loadMarkets();const s={};if(void 0!==e){const t=this.marketIds(e);s.symbols=t.join(",")}void 0!==t&&(s.depth=t);const r=await this.publicGetPublicOrderbook(this.extend(s,i)),a={},o=Object.keys(r);for(let e=0;e<o.length;e++){const t=o[e],i=r[t],s=this.safeSymbol(t),n=this.parse8601(this.safeString(i,"timestamp"));a[s]=this.parseOrderBook(r[t],s,n,"bid","ask")}return a}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(s.depth=t);const r=await this.publicGetPublicOrderbookSymbol(this.extend(s,i)),a=this.parse8601(this.safeString(r,"timestamp"));return this.parseOrderBook(r,e,a,"bid","ask")}parseTradingFee(e,t=void 0){const i=this.safeNumber(e,"take_rate"),s=this.safeNumber(e,"make_rate"),r=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(r,t),taker:i,maker:s,percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;if("spot"===i.type)r=await this.privateGetSpotFeeSymbol(this.extend(s,t));else{if("swap"!==i.type)throw new o.NotSupported(this.id+" fetchTradingFee() not support this market type");r=await this.privateGetFuturesFeeSymbol(this.extend(s,t))}return this.parseTradingFee(r,i)}async fetchTradingFees(e={}){await this.loadMarkets();const[t,i]=this.handleMarketTypeAndParams("fetchTradingFees",void 0,e);let s;if("spot"===t)s=await this.privateGetSpotFee(i);else{if("swap"!==t)throw new o.NotSupported(this.id+" fetchTradingFees() not support this market type");s=await this.privateGetFuturesFee(i)}const r={};for(let e=0;e<s.length;e++){const t=this.parseTradingFee(s[e]);r[t.symbol]=t}return r}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const o=this.market(e);let n={symbol:o.id,period:this.safeString(this.timeframes,t,t)};void 0!==i&&(n.from=this.iso8601(i)),[n,r]=this.handleUntilOption("until",n,r),void 0!==s&&(n.limit=Math.min(s,1e3));const d=this.safeString(r,"price");let h;return r=this.omit(r,"price"),h="mark"===d?await this.publicGetPublicFuturesCandlesMarkPriceSymbol(this.extend(n,r)):"index"===d?await this.publicGetPublicFuturesCandlesIndexPriceSymbol(this.extend(n,r)):"premiumIndex"===d?await this.publicGetPublicFuturesCandlesPremiumIndexSymbol(this.extend(n,r)):await this.publicGetPublicCandlesSymbol(this.extend(n,r)),this.parseOHLCVs(h,o,t,i,s)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"timestamp")),this.safeNumber(e,"open"),this.safeNumber(e,"max"),this.safeNumber(e,"min"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let n,d,h;if(void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==t&&(a.from=this.iso8601(t)),void 0!==i&&(a.limit=i),[n,s]=this.handleMarketTypeAndParams("fetchClosedOrders",r,s),[d,s]=this.handleMarginModeAndParams("fetchClosedOrders",s),s=this.omit(s,["marginMode","margin"]),void 0!==d)h=await this.privateGetMarginHistoryOrder(this.extend(a,s));else if("spot"===n)h=await this.privateGetSpotHistoryOrder(this.extend(a,s));else if("swap"===n)h=await this.privateGetFuturesHistoryOrder(this.extend(a,s));else{if("margin"!==n)throw new o.NotSupported(this.id+" fetchClosedOrders() not support this market type");h=await this.privateGetMarginHistoryOrder(this.extend(a,s))}const c=this.parseOrders(h,r,t,i);return this.filterByArray(c,"status",["closed","canceled"],!1)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={client_order_id:e};let a,n,d;if([a,i]=this.handleMarketTypeAndParams("fetchOrder",s,i),[n,i]=this.handleMarginModeAndParams("fetchOrder",i),i=this.omit(i,["marginMode","margin"]),void 0!==n)d=await this.privateGetMarginHistoryOrder(this.extend(r,i));else if("spot"===a)d=await this.privateGetSpotHistoryOrder(this.extend(r,i));else if("swap"===a)d=await this.privateGetFuturesHistoryOrder(this.extend(r,i));else{if("margin"!==a)throw new o.NotSupported(this.id+" fetchOrder() not support this market type");d=await this.privateGetMarginHistoryOrder(this.extend(r,i))}const h=this.safeDict(d,0);return this.parseOrder(h,s)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const n={order_id:e};let d,h,c;if([d,r]=this.handleMarketTypeAndParams("fetchOrderTrades",a,r),[h,r]=this.handleMarginModeAndParams("fetchOrderTrades",r),r=this.omit(r,["marginMode","margin"]),void 0!==h)c=await this.privateGetMarginHistoryTrade(this.extend(n,r));else if("spot"===d)c=await this.privateGetSpotHistoryTrade(this.extend(n,r));else if("swap"===d)c=await this.privateGetFuturesHistoryTrade(this.extend(n,r));else{if("margin"!==d)throw new o.NotSupported(this.id+" fetchOrderTrades() not support this market type");c=await this.privateGetMarginHistoryTrade(this.extend(n,r))}return this.parseTrades(c,a,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};let n,d,h;if(void 0!==e&&(r=this.market(e),a.symbol=r.id),[n,s]=this.handleMarketTypeAndParams("fetchOpenOrders",r,s),[d,s]=this.handleMarginModeAndParams("fetchOpenOrders",s),s=this.omit(s,["marginMode","margin"]),void 0!==d)h=await this.privateGetMarginOrder(this.extend(a,s));else if("spot"===n)h=await this.privateGetSpotOrder(this.extend(a,s));else if("swap"===n)h=await this.privateGetFuturesOrder(this.extend(a,s));else{if("margin"!==n)throw new o.NotSupported(this.id+" fetchOpenOrders() not support this market type");h=await this.privateGetMarginOrder(this.extend(a,s))}return this.parseOrders(h,r,t,i)}async fetchOpenOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={client_order_id:e};let a,n,d;if([a,i]=this.handleMarketTypeAndParams("fetchOpenOrder",s,i),[n,i]=this.handleMarginModeAndParams("fetchOpenOrder",i),i=this.omit(i,["marginMode","margin"]),void 0!==n)d=await this.privateGetMarginOrderClientOrderId(this.extend(r,i));else if("spot"===a)d=await this.privateGetSpotOrderClientOrderId(this.extend(r,i));else if("swap"===a)d=await this.privateGetFuturesOrderClientOrderId(this.extend(r,i));else{if("margin"!==a)throw new o.NotSupported(this.id+" fetchOpenOrder() not support this market type");d=await this.privateGetMarginOrderClientOrderId(this.extend(r,i))}return this.parseOrder(d,s)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};let r,a,n;if(void 0!==e&&(i=this.market(e),s.symbol=i.id),[r,t]=this.handleMarketTypeAndParams("cancelAllOrders",i,t),[a,t]=this.handleMarginModeAndParams("cancelAllOrders",t),t=this.omit(t,["marginMode","margin"]),void 0!==a)n=await this.privateDeleteMarginOrder(this.extend(s,t));else if("spot"===r)n=await this.privateDeleteSpotOrder(this.extend(s,t));else if("swap"===r)n=await this.privateDeleteFuturesOrder(this.extend(s,t));else{if("margin"!==r)throw new o.NotSupported(this.id+" cancelAllOrders() not support this market type");n=await this.privateDeleteMarginOrder(this.extend(s,t))}return this.parseOrders(n,i)}async cancelOrder(e,t=void 0,i={}){let s;await this.loadMarkets();const r={client_order_id:e};let a,n,d;if(void 0!==t&&(s=this.market(t)),[a,i]=this.handleMarketTypeAndParams("cancelOrder",s,i),[n,i]=this.handleMarginModeAndParams("cancelOrder",i),i=this.omit(i,["marginMode","margin"]),void 0!==n)d=await this.privateDeleteMarginOrderClientOrderId(this.extend(r,i));else if("spot"===a)d=await this.privateDeleteSpotOrderClientOrderId(this.extend(r,i));else if("swap"===a)d=await this.privateDeleteFuturesOrderClientOrderId(this.extend(r,i));else{if("margin"!==a)throw new o.NotSupported(this.id+" cancelOrder() not support this market type");d=await this.privateDeleteMarginOrderClientOrderId(this.extend(r,i))}return this.parseOrder(d,s)}async editOrder(e,t,i,s,r=void 0,a=void 0,n={}){let d;await this.loadMarkets();const h={client_order_id:e,quantity:this.amountToPrecision(t,r)};if("limit"===i||"stopLimit"===i){if(void 0===a)throw new o.ExchangeError(this.id+" editOrder() limit order requires price");h.price=this.priceToPrecision(t,a)}let c,l,u;if(void 0!==t&&(d=this.market(t)),[c,n]=this.handleMarketTypeAndParams("editOrder",d,n),[l,n]=this.handleMarginModeAndParams("editOrder",n),n=this.omit(n,["marginMode","margin"]),void 0!==l)u=await this.privatePatchMarginOrderClientOrderId(this.extend(h,n));else if("spot"===c)u=await this.privatePatchSpotOrderClientOrderId(this.extend(h,n));else if("swap"===c)u=await this.privatePatchFuturesOrderClientOrderId(this.extend(h,n));else{if("margin"!==c)throw new o.NotSupported(this.id+" editOrder() not support this market type");u=await this.privatePatchMarginOrderClientOrderId(this.extend(h,n))}return this.parseOrder(u,d)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e);let n,d,h,c;return[d,a]=this.handleMarketTypeAndParams("createOrder",o,a),[h,a]=this.handleMarginModeAndParams("createOrder",a),[n,a]=this.createOrderRequest(o,d,t,i,s,r,h,a),c="swap"===d?await this.privatePostFuturesOrder(this.extend(n,a)):"margin"===d||void 0!==h?await this.privatePostMarginOrder(this.extend(n,a)):await this.privatePostSpotOrder(this.extend(n,a)),this.parseOrder(c,o)}createOrderRequest(e,t,i,s,r,a=void 0,n=void 0,d={}){const h="limit"===i,c=this.safeValue(d,"reduceOnly"),l=this.safeString(d,"timeInForce"),u=this.safeNumberN(d,["triggerPrice","stopPrice","stop_price"]),f=this.isPostOnly("market"===i,void 0,d),p={type:i,side:s,quantity:this.amountToPrecision(e.symbol,r),symbol:e.id};if(void 0!==c&&"swap"!==e.type&&"margin"!==e.type)throw new o.InvalidOrder(this.id+" createOrder() does not support reduce_only for "+e.type+" orders, reduce_only orders are supported for swap and margin markets only");if(!0===c&&(p.reduce_only=c),f&&(p.post_only=!0),void 0!==l&&(p.time_in_force=l),h||"stopLimit"===i||"takeProfitLimit"===i){if(void 0===a)throw new o.ExchangeError(this.id+" createOrder() requires a price argument for limit orders");p.price=this.priceToPrecision(e.symbol,a)}if("GTD"===l){if(void 0===this.safeString(d,"expire_time"))throw new o.ExchangeError(this.id+" createOrder() requires an expire_time parameter for a GTD order")}if(void 0!==u)p.stop_price=this.priceToPrecision(e.symbol,u),h?p.type="stopLimit":"market"===i&&(p.type="stopMarket");else if("stopLimit"===i||"stopMarket"===i||"takeProfitLimit"===i||"takeProfitMarket"===i)throw new o.ExchangeError(this.id+" createOrder() requires a triggerPrice parameter for stop-loss and take-profit orders");return d=this.omit(d,["triggerPrice","timeInForce","stopPrice","stop_price","reduceOnly","postOnly"]),"swap"===t&&(void 0===n&&(n="cross"),p.margin_mode=n),[p,d]}parseOrderStatus(e){return this.safeString({new:"open",suspended:"open",partiallyFilled:"open",filled:"closed",canceled:"canceled",expired:"failed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"client_order_id"),s=this.safeString(e,"side"),r=this.safeString(e,"type"),a=this.safeString(e,"quantity"),o=this.safeString(e,"price"),n=this.safeString(e,"price_average"),d=this.safeString(e,"created_at"),h=this.parse8601(d),c=this.safeString(e,"updated_at");let l;c!==d&&(l=this.parse8601(c));const u=this.safeString(e,"quantity_cumulative"),f=this.parseOrderStatus(this.safeString(e,"status")),p=this.safeString(e,"symbol"),m=(t=this.safeMarket(p,t)).symbol,g=this.safeValue(e,"post_only"),v=this.safeString(e,"time_in_force"),y=this.safeValue(e,"trades");return this.safeOrder({info:e,id:i,clientOrderId:i,timestamp:h,datetime:this.iso8601(h),lastTradeTimestamp:l,lastUpdateTimestamp:l,symbol:m,price:o,amount:a,type:r,side:s,timeInForce:v,postOnly:g,reduceOnly:this.safeValue(e,"reduce_only"),filled:u,remaining:void 0,cost:void 0,status:f,average:n,trades:y,fee:void 0,triggerPrice:this.safeString(e,"stop_price"),takeProfitPrice:void 0,stopLossPrice:void 0},t)}async fetchMarginModes(e=void 0,t={}){let i,s,r;if(await this.loadMarkets(),void 0!==e&&(e=this.marketSymbols(e),i=this.market(e[0])),[s,t]=this.handleMarketTypeAndParams("fetchMarginMode",i,t),"margin"===s)r=await this.privateGetMarginConfig(t);else{if("swap"!==s)throw new o.BadSymbol(this.id+" fetchMarginModes () supports swap contracts and margin only");r=await this.privateGetFuturesConfig(t)}const a=this.safeList(r,"config",[]);return this.parseMarginModes(a,e,"symbol")}parseMarginMode(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"margin_mode")}}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),n=this.currencyToPrecision(e,t),d=this.safeValue(this.options,"accountsByType",{});i=i.toLowerCase(),s=s.toLowerCase();const h=this.safeString(d,i,i),c=this.safeString(d,s,s);if(h===c)throw new o.BadRequest(this.id+" transfer() fromAccount and toAccount arguments cannot be the same account");const l={currency:a.id,amount:n,source:h,destination:c},u=await this.privatePostWalletTransfer(this.extend(l,r));return this.parseTransfer(u,a)}parseTransfer(e,t=void 0){return{id:this.safeString(e,0),timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0,info:e}}async convertCurrencyNetwork(e,t,i,s,r){if(await this.loadMarkets(),"USDT"!==e)throw new o.ExchangeError(this.id+" convertCurrencyNetwork() only supports USDT currently");const a=this.safeValue(this.options,"networks",{});if(i=i.toUpperCase(),s=s.toUpperCase(),(i=this.safeString(a,i))===(s=this.safeString(a,s)))throw new o.BadRequest(this.id+" convertCurrencyNetwork() fromNetwork cannot be the same as toNetwork");if(void 0===i||void 0===s){const e=Object.keys(a);throw new o.ArgumentsRequired(this.id+" convertCurrencyNetwork() requires a fromNetwork parameter and a toNetwork parameter, supported networks are "+e.join(", "))}const n={from_currency:i,to_currency:s,amount:this.currencyToPrecision(e,t)};return{info:await this.privatePostWalletConvert(this.extend(n,r))}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets(),this.checkAddress(i);const a=this.currency(e),o={currency:a.id,amount:t,address:i};void 0!==s&&(o.payment_id=s);const n=this.safeValue(this.options,"networks",{}),d=this.safeStringUpper(r,"network");if(void 0!==d&&"USDT"===e){const e=this.safeString(n,d);void 0!==e&&(o.network_code=e),r=this.omit(r,"network")}const h=this.safeValue(this.options,"withdraw",{});this.safeBool(h,"includeFee",!1)&&(o.include_fee=!0);const c=await this.privatePostWalletCryptoWithdraw(this.extend(o,r));return this.parseTransaction(c,a)}async fetchFundingRates(e=void 0,t={}){let i;await this.loadMarkets();const s={};if(void 0!==e){e=this.marketSymbols(e),i=this.market(e[0]);const t=this.marketIds(e);s.symbols=t.join(",")}let r;if([r,t]=this.handleMarketTypeAndParams("fetchFundingRates",i,t),"swap"!==r)throw new o.NotSupported(this.id+" fetchFundingRates() does not support "+r+" markets");const a=await this.publicGetPublicFuturesInfo(this.extend(s,t)),n=Object.keys(a),d={};for(let e=0;e<n.length;e++){const t=this.safeString(n,e),i=this.safeValue(a,t),s=this.market(t),r=s.symbol,o=this.parseFundingRate(i,s);d[r]=o}return this.filterByArray(d,"symbol",e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s,1e3);let o={};[o,s]=this.handleUntilOption("until",o,s),void 0!==e&&(r=this.market(e),e=r.symbol,o.symbols=r.id),void 0!==t&&(o.from=t),void 0!==i&&(o.limit=i);const n=await this.publicGetPublicFuturesHistoryFunding(this.extend(o,s)),d=Object.keys(n),h=[];for(let e=0;e<d.length;e++){const t=d[e],i=this.safeMarket(t),s=n[t];for(let e=0;e<s.length;e++){const t=s[e],r=this.safeSymbol(i.symbol),a=this.safeNumber(t,"funding_rate"),o=this.safeString(t,"timestamp");h.push({info:t,symbol:r,fundingRate:a,timestamp:this.parse8601(o),datetime:o})}}const c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i={};let s,r,a;if([s,t]=this.handleMarketTypeAndParams("fetchPositions",void 0,t),"spot"===s&&(s="swap"),[r,t]=this.handleMarginModeAndParams("fetchPositions",t),t=this.omit(t,["marginMode","margin"]),void 0!==r)a=await this.privateGetMarginAccount(this.extend(i,t));else if("swap"===s)a=await this.privateGetFuturesAccount(this.extend(i,t));else{if("margin"!==s)throw new o.NotSupported(this.id+" fetchPositions() not support this market type");a=await this.privateGetMarginAccount(this.extend(i,t))}const n=[];for(let e=0;e<a.length;e++)n.push(this.parsePosition(a[e]));return n}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a,n;if([r,t]=this.handleMarketTypeAndParams("fetchPosition",void 0,t),[a,t]=this.handleMarginModeAndParams("fetchPosition",t),t=this.omit(t,["marginMode","margin"]),void 0!==a)n=await this.privateGetMarginAccountIsolatedSymbol(this.extend(s,t));else if("swap"===r)n=await this.privateGetFuturesAccountIsolatedSymbol(this.extend(s,t));else{if("margin"!==r)throw new o.NotSupported(this.id+" fetchPosition() not support this market type");n=await this.privateGetMarginAccountIsolatedSymbol(this.extend(s,t))}return this.parsePosition(n,i)}parsePosition(e,t=void 0){const i=this.safeString(e,"type"),s=this.safeNumber(e,"leverage"),r=this.safeString(e,"updated_at"),a=this.safeValue(e,"positions",[]);let o,n,d;for(let e=0;e<a.length;e++){const t=a[e];o=this.safeNumber(t,"price_liquidation"),n=this.safeNumber(t,"price_entry"),d=this.safeNumber(t,"quantity")}const h=this.safeValue(e,"currencies",[]);let c;for(let e=0;e<h.length;e++){const t=h[e];c=this.safeNumber(t,"margin_balance")}const l=this.safeString(e,"symbol"),u=(t=this.safeMarket(l,t)).symbol;return this.safePosition({info:e,id:void 0,symbol:u,notional:void 0,marginMode:i,marginType:i,liquidationPrice:o,entryPrice:n,unrealizedPnl:void 0,percentage:void 0,contracts:d,contractSize:void 0,markPrice:void 0,lastPrice:void 0,side:void 0,hedged:void 0,timestamp:this.parse8601(r),datetime:r,lastUpdateTimestamp:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:c,initialMargin:void 0,initialMarginPercentage:void 0,leverage:s,marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}parseOpenInterest(e,t=void 0){const i=this.safeString(e,"timestamp"),s=this.safeNumber(e,"open_interest");return this.safeOpenInterest({symbol:this.safeSymbol(void 0,t),openInterestAmount:void 0,openInterestValue:s,timestamp:this.parse8601(i),datetime:i,info:e},t)}async fetchOpenInterests(e=void 0,t={}){await this.loadMarkets();const i={};let s;void 0!==(e=this.marketSymbols(e))&&(s=this.marketIds(e),i.symbols=s.join(","));const r=await this.publicGetPublicFuturesInfo(this.extend(i,t)),a=[],o=Object.keys(r);for(let e=0;e<o.length;e++){const t=o[e],i=this.safeMarket(t);a.push(this.parseOpenInterest(r[t],i))}return this.filterByArray(a,"symbol",e)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new o.BadSymbol(this.id+" fetchOpenInterest() supports swap contracts only");const s={symbol:i.id},r=await this.publicGetPublicFuturesInfoSymbol(this.extend(s,t));return this.parseOpenInterest(r,i)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new o.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={symbol:i.id},r=await this.publicGetPublicFuturesInfoSymbol(this.extend(s,t));return this.parseFundingRate(r,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"next_funding_time"),s=this.safeString(e,"timestamp");return{info:e,symbol:this.safeSymbol(void 0,t),markPrice:this.safeNumber(e,"mark_price"),indexPrice:this.safeNumber(e,"index_price"),interestRate:this.safeNumber(e,"interest_rate"),estimatedSettlePrice:void 0,timestamp:this.parse8601(s),datetime:s,fundingRate:this.safeNumber(e,"funding_rate"),fundingTimestamp:this.parse8601(i),fundingDatetime:i,nextFundingRate:this.safeNumber(e,"indicative_funding_rate"),nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.safeString(s,"leverage");if(r.swap&&void 0===a)throw new o.ArgumentsRequired(this.id+" modifyMarginHelper() requires a leverage parameter for swap markets");const n=this.numberToString(t);t="0"!==n?this.amountToPrecision(e,n):"0";const d={symbol:r.id,margin_balance:t};let h,c,l;if(void 0!==a&&(d.leverage=a),[h,s]=this.handleMarketTypeAndParams("modifyMarginHelper",r,s),[c,s]=this.handleMarginModeAndParams("modifyMarginHelper",s),"swap"===h)l=await this.privatePutFuturesAccountIsolatedSymbol(this.extend(d,s));else{if("margin"!==h&&"spot"!==h&&"isolated"!==c)throw new o.NotSupported(this.id+" modifyMarginHelper() not support this market type");l=await this.privatePutMarginAccountIsolatedSymbol(this.extend(d,s))}return this.extend(this.parseMarginModification(l,r),{amount:this.parseNumber(t),type:i})}parseMarginModification(e,t=void 0){const i=this.safeValue(e,"currencies",[]),s=this.safeValue(i,0),r=this.safeString(e,"updated_at");return{info:e,symbol:t.symbol,type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:this.safeString(s,"code"),status:void 0,timestamp:this.parse8601(r),datetime:r}}async reduceMargin(e,t,i={}){if("0"!==this.numberToString(t))throw new o.BadRequest(this.id+" reduceMargin() on hitbtc requires the amount to be 0 and that will remove the entire margin amount");return await this.modifyMarginHelper(e,t,"reduce",i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a;if([r,t]=this.handleMarginModeAndParams("fetchLeverage",t),t=this.omit(t,["marginMode","margin"]),void 0!==r)a=await this.privateGetMarginAccountIsolatedSymbol(this.extend(s,t));else if("spot"===i.type)a=await this.privateGetMarginAccountIsolatedSymbol(this.extend(s,t));else if("swap"===i.type)a=await this.privateGetFuturesAccountIsolatedSymbol(this.extend(s,t));else{if("margin"!==i.type)throw new o.NotSupported(this.id+" fetchLeverage() not support this market type");a=await this.privateGetMarginAccountIsolatedSymbol(this.extend(s,t))}return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"leverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:this.safeStringLower(e,"type"),longLeverage:s,shortLeverage:s}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(await this.loadMarkets(),void 0===i.margin_balance)throw new o.ArgumentsRequired(this.id+" setLeverage() requires a margin_balance parameter that will transfer margin to the specified trading pair");const s=this.market(t),r=this.safeNumber(i,"margin_balance"),a=this.safeInteger(s.limits.leverage,"max",50);if("swap"!==s.type)throw new o.BadSymbol(this.id+" setLeverage() supports swap contracts only");if(e<1||e>a)throw new o.BadRequest(this.id+" setLeverage() leverage should be between 1 and "+a.toString()+" for "+t);const n={symbol:s.id,leverage:e.toString(),margin_balance:this.amountToPrecision(t,r)};return await this.privatePutFuturesAccountIsolatedSymbol(this.extend(n,i))}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetPublicCurrency(t);return this.parseDepositWithdrawFees(i,e)}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"networks",[]),s=this.depositWithdrawFee(e);for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"network");let a=this.networkIdToCode(r);a=void 0!==a?a.toUpperCase():void 0;const o=this.safeNumber(t,"payout_fee"),n={fee:o,percentage:void 0===o&&void 0};!0===this.safeValue(t,"default")&&(s.withdraw=n),s.networks[a]={withdraw:n,deposit:{fee:void 0,percentage:void 0}}}return s}async closePosition(e,t=void 0,i={}){let s;await this.loadMarkets(),[s,i]=this.handleMarginModeAndParams("closePosition",i,"cross");const r=this.market(e),a={symbol:r.id,margin_mode:s},o=await this.privateDeleteFuturesPositionMarginModeSymbol(this.extend(a,i));return this.parseOrder(o,r)}handleMarginModeAndParams(e,t={},i=void 0){const s=this.safeString(this.options,"defaultType"),r=this.safeBool(t,"margin",!1);let a;return[a,t]=super.handleMarginModeAndParams(e,t,i),void 0===a&&("margin"!==s&&!0!==r||(a="isolated")),[a,t]}handleErrors(e,t,i,s,r,a,n,d,h){const c=this.safeValue(n,"error"),l=this.safeString(c,"code");if(void 0!==l){const e=this.id+" "+a,t=this.safeString2(c,"message","description");throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,t,e),new o.ExchangeError(e)}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),d=this.implodeParams(e,s);let h,c=this.urls.api[t]+"/"+d;const l=Object.keys(o).length;if(r={"Content-Type":"application/json"},"GET"===i?l&&(h="?"+this.urlencode(o),c+=h):a=this.json(s),"private"===t){this.checkRequiredCredentials();const e=this.nonce().toString(),t=[i,"/api/3/"+d];"GET"===i?void 0!==h&&t.push(h):t.push(a),t.push(e);const s=t.join(""),o=this.hmac(this.encode(s),this.encode(this.secret),n.s,"hex"),c=this.apiKey+":"+o+":"+e,l=this.stringToBase64(c);r.Authorization="HS256 "+l}return{url:c,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"hollaex",name:"HollaEx",countries:["KR"],rateLimit:250,version:"v2",pro:!0,has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,createLimitBuyOrder:!0,createLimitSellOrder:!0,createMarketBuyOrder:!0,createMarketSellOrder:!0,createOrder:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:"emulated",fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","1h":"1h","4h":"4h","1d":"1d","1w":"1w"},urls:{logo:"https://user-images.githubusercontent.com/1294454/75841031-ca375180-5ddd-11ea-8417-b975674c23cb.jpg",test:{rest:"https://api.sandbox.hollaex.com"},api:{rest:"https://api.hollaex.com"},www:"https://hollaex.com",doc:"https://apidocs.hollaex.com",referral:"https://pro.hollaex.com/signup?affiliation_code=QSWA6G"},precisionMode:o.kb,requiredCredentials:{apiKey:!0,secret:!0},api:{public:{get:{health:1,constants:1,kit:1,tiers:1,ticker:1,tickers:1,orderbook:1,orderbooks:1,trades:1,chart:1,charts:1,minicharts:1,"oracle/prices":1,"quick-trade":1,"udf/config":1,"udf/history":1,"udf/symbols":1}},private:{get:{user:1,"user/balance":1,"user/deposits":1,"user/withdrawals":1,"user/withdrawal/fee":1,"user/trades":1,orders:1,order:1},post:{"user/withdrawal":1,order:1},delete:{"order/all":1,order:1}}},features:{spot:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{tierBased:!0,percentage:!0,taker:.001,maker:.001}},exceptions:{broad:{"Invalid token":r.AuthenticationError,"Order not found":r.OrderNotFound,"Insufficient balance":r.InsufficientFunds,"Error 1001 - Order rejected. Order could not be submitted as this order was set to a post only order.":r.OrderImmediatelyFillable},exact:{400:r.BadRequest,403:r.AuthenticationError,404:r.BadRequest,405:r.BadRequest,410:r.BadRequest,429:r.BadRequest,500:r.NetworkError,503:r.NetworkError}},options:{"api-expires":this.parseToInt(this.timeout/1e3),networks:{BTC:"btc",ETH:"eth",ERC20:"eth",TRX:"trx",TRC20:"trx",XRP:"xrp",XLM:"xlm",BNB:"bnb",MATIC:"matic"}}})}async fetchMarkets(e={}){const t=await this.publicGetConstants(e),i=this.safeValue(t,"pairs",{}),s=Object.keys(i),r=[];for(let e=0;e<s.length;e++){const t=i[s[e]],a=this.safeString(t,"pair_base"),o=this.safeString(t,"pair_2"),n=this.commonCurrencyCode(a.toUpperCase()),d=this.commonCurrencyCode(o.toUpperCase());r.push({id:this.safeString(t,"name"),symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:this.safeValue(t,"active"),contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(t,"increment_size"),price:this.safeNumber(t,"increment_price")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"min_size"),max:this.safeNumber(t,"max_size")},price:{min:this.safeNumber(t,"min_price"),max:this.safeNumber(t,"max_price")},cost:{min:void 0,max:void 0}},created:this.parse8601(this.safeString(t,"created_at")),info:t})}return r}async fetchCurrencies(e={}){const t=await this.publicGetConstants(e),i=this.safeValue(t,"coins",{}),s=Object.keys(i),r={};for(let e=0;e<s.length;e++){const t=i[s[e]],a=this.safeString(t,"symbol"),o=this.safeInteger(t,"id"),n=this.safeCurrencyCode(a),d=this.safeString(t,"fullname"),h=this.safeValue(t,"allow_deposit"),c=this.safeValue(t,"allow_withdrawal"),l=this.safeValue(t,"active")&&h&&c,u=this.safeNumber(t,"withdrawal_fee"),f=this.safeValue(t,"withdrawal_limits",[]);r[n]={id:a,numericId:o,code:n,info:t,name:d,active:l,deposit:h,withdraw:c,fee:u,precision:this.safeNumber(t,"increment_unit"),limits:{amount:{min:this.safeNumber(t,"min"),max:this.safeNumber(t,"max")},withdraw:{min:void 0,max:this.safeValue(f,0)}},networks:{}}}return r}async fetchOrderBooks(e=void 0,t=void 0,i={}){await this.loadMarkets();const s=await this.publicGetOrderbooks(i),r={},a=Object.keys(s);for(let e=0;e<a.length;e++){const t=a[e],i=s[t],o=this.safeSymbol(t,void 0,"-"),n=this.parse8601(this.safeString(i,"timestamp"));r[o]=this.parseOrderBook(s[t],o,n)}return r}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id},a=await this.publicGetOrderbook(this.extend(r,i)),o=this.safeValue(a,s.id),n=this.parse8601(this.safeString(o,"timestamp"));return this.parseOrderBook(o,s.symbol,n)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickers(t);return this.parseTickers(i,e)}parseTickers(e,t=void 0,i={}){const s={},r=Object.keys(e);for(let t=0;t<r.length;t++){const a=r[t],o=e[a],n=this.safeString(o,"symbol",a),d=this.safeMarket(n,void 0,"-");s[d.symbol]=this.extend(this.parseTicker(o,d),i)}return this.filterByArrayTickers(s,"symbol",t)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t,"-")).symbol,r=this.parse8601(this.safeString2(e,"time","timestamp")),a=this.safeString(e,"close");return this.safeTicker({symbol:s,info:e,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:a,last:this.safeString(e,"last",a),previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,r.id,[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t,"-")).symbol,r=this.safeString(e,"timestamp"),a=this.parse8601(r),o=this.safeString(e,"side"),n=this.safeString(e,"order_id"),d=this.safeString(e,"price"),h=this.safeString(e,"size"),c=this.safeString(e,"fee");let l;return void 0!==c&&(l={cost:c,currency:t.quote}),this.safeTrade({info:e,id:void 0,timestamp:a,datetime:r,symbol:s,order:n,type:void 0,side:o,takerOrMaker:void 0,price:d,amount:h,cost:void 0,fee:l},t)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.publicGetTiers(e),i=this.safeValue(t,"1",{}),s=this.safeValue(i,"fees",{}),r=this.safeValue(s,"maker",{}),o=this.safeValue(s,"taker",{}),n={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e],i=this.market(t),d=this.safeString(r,i.id),h=this.safeString(o,i.id);n[t]={info:s,symbol:t,maker:this.parseNumber(a.Y.stringDiv(d,"100")),taker:this.parseNumber(a.Y.stringDiv(h,"100")),percentage:!0,tierBased:!0}}return n}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,resolution:this.safeString(this.timeframes,t,t)},n=this.safeInteger(r,"until");let d=this.seconds();void 0!==n&&(d=this.parseToInt(n/1e3));o.from=void 0!==i?this.parseToInt(i/1e3):d-2592e3,o.to=d,r=this.omit(r,"until");const h=await this.publicGetChart(this.extend(o,r));return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"time")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}parseBalance(e){const t=this.parse8601(this.safeString(e,"updated_at")),i={info:e,timestamp:t,datetime:this.iso8601(t)},s=Object.keys(this.currencies_by_id);for(let t=0;t<s.length;t++){const r=s[t],a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(e,r+"_available"),o.total=this.safeString(e,r+"_balance"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUserBalance(e);return this.parseBalance(t)}async fetchOpenOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateGetOrder(this.extend(s,i));return this.parseOrder(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({open:!0},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({open:!1},s))}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},a=await this.privateGetOrder(this.extend(s,i));if(void 0===a)throw new r.OrderNotFound(this.id+" fetchOrder() could not find order id "+e);return this.parseOrder(a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==t&&(a.start_date=this.iso8601(t)),void 0!==i&&(a.limit=i);const o=await this.privateGetOrders(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseOrders(n,r,t,i)}parseOrderStatus(e){return this.safeString({new:"open",pfilled:"open",filled:"closed",canceled:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,"-"),r=this.safeString(e,"id"),a=this.parse8601(this.safeString(e,"created_at")),o=this.safeString(e,"type"),n=this.safeString(e,"side"),d=this.safeString(e,"price"),h=this.safeString(e,"size"),c=this.safeString(e,"filled"),l=this.parseOrderStatus(this.safeString(e,"status")),u=this.safeValue(e,"meta",{}),f=this.safeBool(u,"post_only",!1);return this.safeOrder({id:r,clientOrderId:void 0,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:void 0,status:l,symbol:s,type:o,timeInForce:void 0,postOnly:f,side:n,price:d,triggerPrice:this.safeString(e,"stop"),amount:h,filled:c,remaining:void 0,cost:void 0,trades:void 0,fee:void 0,info:e,average:void 0},t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=parseFloat(this.amountToPrecision(e,s)),d={symbol:o.id,side:i,size:this.normalizeNumberIfNeeded(n),type:t},h=this.safeNumberN(a,["triggerPrice","stopPrice","stop"]),c=this.safeValue(a,"meta",{}),l=this.safeBool(c,"post_only",!1),u="market"===t,f=this.isPostOnly(u,l,a);if(!u){const t=parseFloat(this.priceToPrecision(e,r));d.price=this.normalizeNumberIfNeeded(t)}void 0!==h&&(d.stop=this.normalizeNumberIfNeeded(parseFloat(this.priceToPrecision(e,h)))),f&&(d.meta={post_only:!0}),a=this.omit(a,["postOnly","timeInForce","stopPrice","triggerPrice","stop"]);const p=await this.privatePostOrder(this.extend(d,a));return this.parseOrder(p,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateDeleteOrder(this.extend(s,i));return this.parseOrder(r)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i={};let s;s=this.market(e),i.symbol=s.id;const a=await this.privateDeleteOrderAll(this.extend(i,t));return this.parseOrders(a,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==i&&(r.limit=i),void 0!==t&&(r.start_date=this.iso8601(t));const o=await this.privateGetUserTrades(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,a,t,i)}parseDepositAddress(e,t=void 0){let i,s=this.safeString(e,"address");if(void 0!==s){const e=s.split(":");s=this.safeString(e,0),i=this.safeString(e,1)}this.checkAddress(s);const r=this.safeString(e,"currency");t=this.safeCurrency(r,t);const a=this.safeString(e,"network");return{info:e,currency:t.code,network:a,address:s,tag:i}}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=this.safeString(t,"network");t=this.omit(t,"network");const s=await this.privateGetUser(t),r=this.safeValue(s,"wallet",[]),a=void 0===i?r:this.filterBy(r,"network",i);return this.parseDepositAddresses(a,e)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.limit=i),void 0!==t&&(r.start_date=this.iso8601(t));const o=await this.privateGetUserDeposits(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={transaction_id:e};let r;void 0!==t&&(r=this.currency(t),s.currency=r.id);const a=await this.privateGetUserWithdrawals(this.extend(s,i)),o=this.safeValue(a,"data",[]),n=this.safeDict(o,0,{});return this.parseTransaction(n,r)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.limit=i),void 0!==t&&(r.start_date=this.iso8601(t));const o=await this.privateGetUserWithdrawals(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"transaction_id"),r=this.parse8601(this.safeString(e,"created_at")),a=this.parse8601(this.safeString(e,"updated_at")),o=this.safeString(e,"type"),n=this.safeNumber(e,"amount");let d,h=this.safeString(e,"address");let c,l;if(void 0!==h){const e=h.split(":");h=this.safeString(e,0),c=this.safeString(e,1),d=h,l=c}const u=this.safeString(e,"currency");t=this.safeCurrency(u,t);let f=this.safeValue(e,"status");const p=this.safeValue(e,"dismissed"),m=this.safeValue(e,"rejected");f=f?"ok":p?"canceled":m?"failed":"pending";const g=this.safeString(e,"fee_coin"),v=this.safeCurrencyCode(g,t),y=this.safeNumber(e,"fee");let w;return void 0!==y&&(w={currency:v,cost:y}),{info:e,id:i,txid:s,timestamp:r,datetime:this.iso8601(r),network:void 0,addressFrom:undefined,address:h,addressTo:d,tagFrom:undefined,tag:c,tagTo:l,type:o,amount:n,currency:t.code,status:f,updated:a,comment:this.safeString(e,"message"),internal:void 0,fee:w}}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);void 0!==s&&(i+=":"+s);const n=this.safeString(a,"network");if(void 0===n)throw new r.ArgumentsRequired(this.id+" withdraw() requires a network parameter");a=this.omit(a,"network");const d={currency:o.id,amount:t,address:i,network:this.networkCodeToId(n,e)},h=await this.privatePostUserWithdrawal(this.extend(d,a));return this.parseTransaction(h,o)}parseDepositWithdrawFee(e,t=void 0){const i={info:e,withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}};this.safeValue(e,"allow_withdrawal")&&(i.withdraw={fee:this.safeNumber(e,"withdrawal_fee"),percentage:!1});const s=this.safeValue(e,"withdrawal_fees");if(void 0!==s){const e=Object.keys(s),t=e.length;for(let r=0;r<t;r++){const t=e[r],a=s[t],o=this.safeString(a,"symbol"),n=this.safeCurrencyCode(o),d=this.networkIdToCode(t,n).toUpperCase(),h=this.safeNumber(a,"value");i.networks[d]={deposit:void 0,withdraw:h}}}return i}async fetchDepositWithdrawFees(e=void 0,t={}){const i=await this.publicGetConstants(t),s=this.safeDict(i,"coins",{});return this.parseDepositWithdrawFees(s,e,"symbol")}normalizeNumberIfNeeded(e){return this.isRoundNumber(e)&&(e=parseInt(e)),e}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e));e="/"+this.version+"/"+this.implodeParams(e,s),"GET"!==i&&"DELETE"!==i||Object.keys(o).length&&(e+="?"+this.urlencode(o));const d=this.urls.api.rest+e;if("private"===t){this.checkRequiredCredentials();const t=this.safeInteger2(this.options,"api-expires","expires",this.parseToInt(this.timeout/1e3)),s=this.sum(this.seconds(),t).toString();let d=i+e+s;r={"api-key":this.apiKey,"api-expires":s},"POST"===i&&(r["Content-type"]="application/json",Object.keys(o).length&&(d+=a=this.json(o)));const h=this.hmac(this.encode(d),this.encode(this.secret),n.s);r["api-signature"]=h}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(void 0!==o&&e>=400&&e<=503){const t=this.id+" "+a,i=this.safeString(o,"message");this.throwBroadlyMatchedException(this.exceptions.broad,i,t);const s=e.toString();this.throwExactlyMatchedException(this.exceptions.exact,s,t)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"htx",name:"HTX",countries:["CN"],rateLimit:100,userAgent:this.userAgents.chrome100,certified:!0,version:"v1",hostname:"api.huobi.pro",pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!0,option:void 0,addMargin:void 0,borrowCrossMargin:!0,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,createDepositAddress:void 0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingPercentOrder:!0,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:void 0,fetchBorrowInterest:!0,fetchBorrowRateHistories:void 0,fetchBorrowRateHistory:void 0,fetchCanceledOrders:void 0,fetchClosedOrder:void 0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:void 0,fetchDepositAddress:!0,fetchDepositAddresses:void 0,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!0,fetchL3OrderBook:void 0,fetchLastPrices:!0,fetchLedger:!0,fetchLedgerEntry:void 0,fetchLeverage:!1,fetchLeverageTiers:!0,fetchLiquidations:!0,fetchMarginAdjustmentHistory:!1,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!0,fetchOpenInterests:!0,fetchOpenOrder:void 0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:void 0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:"emulated",fetchPositions:!0,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!0,fetchSettlementHistory:!0,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTradingLimits:!0,fetchTransactionFee:void 0,fetchTransactionFees:void 0,fetchTransactions:void 0,fetchTransfers:void 0,fetchWithdrawAddresses:!0,fetchWithdrawal:void 0,fetchWithdrawals:!0,fetchWithdrawalWhitelist:void 0,reduceMargin:void 0,repayCrossMargin:!0,repayIsolatedMargin:!0,setLeverage:!0,setMarginMode:!1,setPositionMode:!0,signIn:void 0,transfer:!0,withdraw:!0},timeframes:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","1h":"60min","4h":"4hour","1d":"1day","1w":"1week","1M":"1mon","1y":"1year"},urls:{logo:"https://user-images.githubusercontent.com/1294454/76137448-22748a80-604e-11ea-8069-6e389271911d.jpg",hostnames:{contract:"api.hbdm.com",spot:"api.huobi.pro",status:{spot:"status.huobigroup.com",future:{inverse:"status-dm.huobigroup.com",linear:"status-linear-swap.huobigroup.com"},swap:{inverse:"status-swap.huobigroup.com",linear:"status-linear-swap.huobigroup.com"}}},api:{status:"https://{hostname}",contract:"https://{hostname}",spot:"https://{hostname}",public:"https://{hostname}",private:"https://{hostname}",v2Public:"https://{hostname}",v2Private:"https://{hostname}"},www:"https://www.huobi.com",referral:{url:"https://www.htx.com.vc/invite/en-us/1h?invite_code=6rmm2223",discount:.15},doc:["https://huobiapi.github.io/docs/spot/v1/en/","https://huobiapi.github.io/docs/dm/v1/en/","https://huobiapi.github.io/docs/coin_margined_swap/v1/en/","https://huobiapi.github.io/docs/usdt_swap/v1/en/","https://www.huobi.com/en-us/opend/newApiPages/"],fees:"https://www.huobi.com/about/fee/"},api:{v2Public:{get:{"reference/currencies":1,"market-status":1}},v2Private:{get:{"account/ledger":1,"account/withdraw/quota":1,"account/withdraw/address":1,"account/deposit/address":1,"account/repayment":5,"reference/transact-fee-rate":1,"account/asset-valuation":.2,"point/account":5,"sub-user/user-list":1,"sub-user/user-state":1,"sub-user/account-list":1,"sub-user/deposit-address":1,"sub-user/query-deposit":1,"user/api-key":1,"user/uid":1,"algo-orders/opening":1,"algo-orders/history":1,"algo-orders/specific":1,"c2c/offers":1,"c2c/offer":1,"c2c/transactions":1,"c2c/repayment":1,"c2c/account":1,"etp/reference":1,"etp/transactions":5,"etp/transaction":5,"etp/rebalance":1,"etp/limit":1},post:{"account/transfer":1,"account/repayment":5,"point/transfer":5,"sub-user/management":1,"sub-user/creation":1,"sub-user/tradable-market":1,"sub-user/transferability":1,"sub-user/api-key-generation":1,"sub-user/api-key-modification":1,"sub-user/api-key-deletion":1,"sub-user/deduct-mode":1,"algo-orders":1,"algo-orders/cancel-all-after":1,"algo-orders/cancellation":1,"c2c/offer":1,"c2c/cancellation":1,"c2c/cancel-all":1,"c2c/repayment":1,"c2c/transfer":1,"etp/creation":5,"etp/redemption":5,"etp/{transactId}/cancel":10,"etp/batch-cancel":50}},public:{get:{"common/symbols":1,"common/currencys":1,"common/timestamp":1,"common/exchange":1,"settings/currencys":1}},private:{get:{"account/accounts":.2,"account/accounts/{id}/balance":.2,"account/accounts/{sub-uid}":1,"account/history":4,"cross-margin/loan-info":1,"margin/loan-info":1,"fee/fee-rate/get":1,"order/openOrders":.4,"order/orders":.4,"order/orders/{id}":.4,"order/orders/{id}/matchresults":.4,"order/orders/getClientOrder":.4,"order/history":1,"order/matchresults":1,"query/deposit-withdraw":1,"margin/loan-orders":.2,"margin/accounts/balance":.2,"cross-margin/loan-orders":1,"cross-margin/accounts/balance":1,"points/actions":1,"points/orders":1,"subuser/aggregate-balance":10,"stable-coin/exchange_rate":1,"stable-coin/quote":1},post:{"account/transfer":1,"futures/transfer":1,"order/batch-orders":.4,"order/orders/place":.2,"order/orders/submitCancelClientOrder":.2,"order/orders/batchCancelOpenOrders":.4,"order/orders/{id}/submitcancel":.2,"order/orders/batchcancel":.4,"dw/withdraw/api/create":1,"dw/withdraw-virtual/{id}/cancel":1,"dw/transfer-in/margin":10,"dw/transfer-out/margin":10,"margin/orders":10,"margin/orders/{id}/repay":10,"cross-margin/transfer-in":1,"cross-margin/transfer-out":1,"cross-margin/orders":1,"cross-margin/orders/{id}/repay":1,"stable-coin/exchange":1,"subuser/transfer":10}},status:{public:{spot:{get:{"api/v2/summary.json":1}},future:{inverse:{get:{"api/v2/summary.json":1}},linear:{get:{"api/v2/summary.json":1}}},swap:{inverse:{get:{"api/v2/summary.json":1}},linear:{get:{"api/v2/summary.json":1}}}}},spot:{public:{get:{"v2/market-status":1,"v1/common/symbols":1,"v1/common/currencys":1,"v2/settings/common/currencies":1,"v2/reference/currencies":1,"v1/common/timestamp":1,"v1/common/exchange":1,"v1/settings/common/chains":1,"v1/settings/common/currencys":1,"v1/settings/common/symbols":1,"v2/settings/common/symbols":1,"v1/settings/common/market-symbols":1,"market/history/candles":1,"market/history/kline":1,"market/detail/merged":1,"market/tickers":1,"market/detail":1,"market/depth":1,"market/trade":1,"market/history/trade":1,"market/etp":1,"v2/etp/reference":1,"v2/etp/rebalance":1}},private:{get:{"v1/account/accounts":.2,"v1/account/accounts/{account-id}/balance":.2,"v2/account/valuation":1,"v2/account/asset-valuation":.2,"v1/account/history":4,"v2/account/ledger":1,"v2/point/account":5,"v2/account/deposit/address":1,"v2/account/withdraw/quota":1,"v2/account/withdraw/address":1,"v2/reference/currencies":1,"v1/query/deposit-withdraw":1,"v1/query/withdraw/client-order-id":1,"v2/user/api-key":1,"v2/user/uid":1,"v2/sub-user/user-list":1,"v2/sub-user/user-state":1,"v2/sub-user/account-list":1,"v2/sub-user/deposit-address":1,"v2/sub-user/query-deposit":1,"v1/subuser/aggregate-balance":10,"v1/account/accounts/{sub-uid}":1,"v1/order/openOrders":.4,"v1/order/orders/{order-id}":.4,"v1/order/orders/getClientOrder":.4,"v1/order/orders/{order-id}/matchresult":.4,"v1/order/orders/{order-id}/matchresults":.4,"v1/order/orders":.4,"v1/order/history":1,"v1/order/matchresults":1,"v2/reference/transact-fee-rate":1,"v2/algo-orders/opening":1,"v2/algo-orders/history":1,"v2/algo-orders/specific":1,"v1/margin/loan-info":1,"v1/margin/loan-orders":.2,"v1/margin/accounts/balance":.2,"v1/cross-margin/loan-info":1,"v1/cross-margin/loan-orders":1,"v1/cross-margin/accounts/balance":1,"v2/account/repayment":5,"v1/stable-coin/quote":1,"v1/stable_coin/exchange_rate":1,"v2/etp/transactions":5,"v2/etp/transaction":5,"v2/etp/limit":1},post:{"v1/account/transfer":1,"v1/futures/transfer":1,"v2/point/transfer":5,"v2/account/transfer":1,"v1/dw/withdraw/api/create":1,"v1/dw/withdraw-virtual/{withdraw-id}/cancel":1,"v2/sub-user/deduct-mode":1,"v2/sub-user/creation":1,"v2/sub-user/management":1,"v2/sub-user/tradable-market":1,"v2/sub-user/transferability":1,"v2/sub-user/api-key-generation":1,"v2/sub-user/api-key-modification":1,"v2/sub-user/api-key-deletion":1,"v1/subuser/transfer":10,"v1/trust/user/active/credit":10,"v1/order/orders/place":.2,"v1/order/batch-orders":.4,"v1/order/auto/place":.2,"v1/order/orders/{order-id}/submitcancel":.2,"v1/order/orders/submitCancelClientOrder":.2,"v1/order/orders/batchCancelOpenOrders":.4,"v1/order/orders/batchcancel":.4,"v2/algo-orders/cancel-all-after":1,"v2/algo-orders":1,"v2/algo-orders/cancellation":1,"v2/account/repayment":5,"v1/dw/transfer-in/margin":10,"v1/dw/transfer-out/margin":10,"v1/margin/orders":10,"v1/margin/orders/{order-id}/repay":10,"v1/cross-margin/transfer-in":1,"v1/cross-margin/transfer-out":1,"v1/cross-margin/orders":1,"v1/cross-margin/orders/{order-id}/repay":1,"v1/stable-coin/exchange":1,"v2/etp/creation":5,"v2/etp/redemption":5,"v2/etp/{transactId}/cancel":10,"v2/etp/batch-cancel":50}}},contract:{public:{get:{"api/v1/timestamp":1,"heartbeat/":1,"api/v1/contract_contract_info":1,"api/v1/contract_index":1,"api/v1/contract_query_elements":1,"api/v1/contract_price_limit":1,"api/v1/contract_open_interest":1,"api/v1/contract_delivery_price":1,"market/depth":1,"market/bbo":1,"market/history/kline":1,"index/market/history/mark_price_kline":1,"market/detail/merged":1,"market/detail/batch_merged":1,"v2/market/detail/batch_merged":1,"market/trade":1,"market/history/trade":1,"api/v1/contract_risk_info":1,"api/v1/contract_insurance_fund":1,"api/v1/contract_adjustfactor":1,"api/v1/contract_his_open_interest":1,"api/v1/contract_ladder_margin":1,"api/v1/contract_api_state":1,"api/v1/contract_elite_account_ratio":1,"api/v1/contract_elite_position_ratio":1,"api/v1/contract_liquidation_orders":1,"api/v1/contract_settlement_records":1,"index/market/history/index":1,"index/market/history/basis":1,"api/v1/contract_estimated_settlement_price":1,"api/v3/contract_liquidation_orders":1,"swap-api/v1/swap_contract_info":1,"swap-api/v1/swap_index":1,"swap-api/v1/swap_query_elements":1,"swap-api/v1/swap_price_limit":1,"swap-api/v1/swap_open_interest":1,"swap-ex/market/depth":1,"swap-ex/market/bbo":1,"swap-ex/market/history/kline":1,"index/market/history/swap_mark_price_kline":1,"swap-ex/market/detail/merged":1,"v2/swap-ex/market/detail/batch_merged":1,"index/market/history/swap_premium_index_kline":1,"swap-ex/market/detail/batch_merged":1,"swap-ex/market/trade":1,"swap-ex/market/history/trade":1,"swap-api/v1/swap_risk_info":1,"swap-api/v1/swap_insurance_fund":1,"swap-api/v1/swap_adjustfactor":1,"swap-api/v1/swap_his_open_interest":1,"swap-api/v1/swap_ladder_margin":1,"swap-api/v1/swap_api_state":1,"swap-api/v1/swap_elite_account_ratio":1,"swap-api/v1/swap_elite_position_ratio":1,"swap-api/v1/swap_estimated_settlement_price":1,"swap-api/v1/swap_liquidation_orders":1,"swap-api/v1/swap_settlement_records":1,"swap-api/v1/swap_funding_rate":1,"swap-api/v1/swap_batch_funding_rate":1,"swap-api/v1/swap_historical_funding_rate":1,"swap-api/v3/swap_liquidation_orders":1,"index/market/history/swap_estimated_rate_kline":1,"index/market/history/swap_basis":1,"linear-swap-api/v1/swap_contract_info":1,"linear-swap-api/v1/swap_index":1,"linear-swap-api/v1/swap_query_elements":1,"linear-swap-api/v1/swap_price_limit":1,"linear-swap-api/v1/swap_open_interest":1,"linear-swap-ex/market/depth":1,"linear-swap-ex/market/bbo":1,"linear-swap-ex/market/history/kline":1,"index/market/history/linear_swap_mark_price_kline":1,"linear-swap-ex/market/detail/merged":1,"linear-swap-ex/market/detail/batch_merged":1,"v2/linear-swap-ex/market/detail/batch_merged":1,"linear-swap-ex/market/trade":1,"linear-swap-ex/market/history/trade":1,"linear-swap-api/v1/swap_risk_info":1,"swap-api/v1/linear-swap-api/v1/swap_insurance_fund":1,"linear-swap-api/v1/swap_adjustfactor":1,"linear-swap-api/v1/swap_cross_adjustfactor":1,"linear-swap-api/v1/swap_his_open_interest":1,"linear-swap-api/v1/swap_ladder_margin":1,"linear-swap-api/v1/swap_cross_ladder_margin":1,"linear-swap-api/v1/swap_api_state":1,"linear-swap-api/v1/swap_cross_transfer_state":1,"linear-swap-api/v1/swap_cross_trade_state":1,"linear-swap-api/v1/swap_elite_account_ratio":1,"linear-swap-api/v1/swap_elite_position_ratio":1,"linear-swap-api/v1/swap_liquidation_orders":1,"linear-swap-api/v1/swap_settlement_records":1,"linear-swap-api/v1/swap_funding_rate":1,"linear-swap-api/v1/swap_batch_funding_rate":1,"linear-swap-api/v1/swap_historical_funding_rate":1,"linear-swap-api/v3/swap_liquidation_orders":1,"index/market/history/linear_swap_premium_index_kline":1,"index/market/history/linear_swap_estimated_rate_kline":1,"index/market/history/linear_swap_basis":1,"linear-swap-api/v1/swap_estimated_settlement_price":1}},private:{get:{"api/v1/contract_sub_auth_list":1,"api/v1/contract_api_trading_status":1,"swap-api/v1/swap_sub_auth_list":1,"swap-api/v1/swap_api_trading_status":1,"linear-swap-api/v1/swap_sub_auth_list":1,"linear-swap-api/v1/swap_api_trading_status":1,"linear-swap-api/v1/swap_cross_position_side":1,"linear-swap-api/v1/swap_position_side":1,"linear-swap-api/v3/unified_account_info":1,"linear-swap-api/v3/fix_position_margin_change_record":1,"linear-swap-api/v3/swap_unified_account_type":1,"linear-swap-api/v3/linear_swap_overview_account_info":1},post:{"api/v1/contract_balance_valuation":1,"api/v1/contract_account_info":1,"api/v1/contract_position_info":1,"api/v1/contract_sub_auth":1,"api/v1/contract_sub_account_list":1,"api/v1/contract_sub_account_info_list":1,"api/v1/contract_sub_account_info":1,"api/v1/contract_sub_position_info":1,"api/v1/contract_financial_record":1,"api/v1/contract_financial_record_exact":1,"api/v1/contract_user_settlement_records":1,"api/v1/contract_order_limit":1,"api/v1/contract_fee":1,"api/v1/contract_transfer_limit":1,"api/v1/contract_position_limit":1,"api/v1/contract_account_position_info":1,"api/v1/contract_master_sub_transfer":1,"api/v1/contract_master_sub_transfer_record":1,"api/v1/contract_available_level_rate":1,"api/v3/contract_financial_record":1,"api/v3/contract_financial_record_exact":1,"api/v1/contract-cancel-after":1,"api/v1/contract_order":1,"api/v1/contract_batchorder":1,"api/v1/contract_cancel":1,"api/v1/contract_cancelall":1,"api/v1/contract_switch_lever_rate":1,"api/v1/lightning_close_position":1,"api/v1/contract_order_info":1,"api/v1/contract_order_detail":1,"api/v1/contract_openorders":1,"api/v1/contract_hisorders":1,"api/v1/contract_hisorders_exact":1,"api/v1/contract_matchresults":1,"api/v1/contract_matchresults_exact":1,"api/v3/contract_hisorders":1,"api/v3/contract_hisorders_exact":1,"api/v3/contract_matchresults":1,"api/v3/contract_matchresults_exact":1,"api/v1/contract_trigger_order":1,"api/v1/contract_trigger_cancel":1,"api/v1/contract_trigger_cancelall":1,"api/v1/contract_trigger_openorders":1,"api/v1/contract_trigger_hisorders":1,"api/v1/contract_tpsl_order":1,"api/v1/contract_tpsl_cancel":1,"api/v1/contract_tpsl_cancelall":1,"api/v1/contract_tpsl_openorders":1,"api/v1/contract_tpsl_hisorders":1,"api/v1/contract_relation_tpsl_order":1,"api/v1/contract_track_order":1,"api/v1/contract_track_cancel":1,"api/v1/contract_track_cancelall":1,"api/v1/contract_track_openorders":1,"api/v1/contract_track_hisorders":1,"swap-api/v1/swap_balance_valuation":1,"swap-api/v1/swap_account_info":1,"swap-api/v1/swap_position_info":1,"swap-api/v1/swap_account_position_info":1,"swap-api/v1/swap_sub_auth":1,"swap-api/v1/swap_sub_account_list":1,"swap-api/v1/swap_sub_account_info_list":1,"swap-api/v1/swap_sub_account_info":1,"swap-api/v1/swap_sub_position_info":1,"swap-api/v1/swap_financial_record":1,"swap-api/v1/swap_financial_record_exact":1,"swap-api/v1/swap_user_settlement_records":1,"swap-api/v1/swap_available_level_rate":1,"swap-api/v1/swap_order_limit":1,"swap-api/v1/swap_fee":1,"swap-api/v1/swap_transfer_limit":1,"swap-api/v1/swap_position_limit":1,"swap-api/v1/swap_master_sub_transfer":1,"swap-api/v1/swap_master_sub_transfer_record":1,"swap-api/v3/swap_financial_record":1,"swap-api/v3/swap_financial_record_exact":1,"swap-api/v1/swap-cancel-after":1,"swap-api/v1/swap_order":1,"swap-api/v1/swap_batchorder":1,"swap-api/v1/swap_cancel":1,"swap-api/v1/swap_cancelall":1,"swap-api/v1/swap_lightning_close_position":1,"swap-api/v1/swap_switch_lever_rate":1,"swap-api/v1/swap_order_info":1,"swap-api/v1/swap_order_detail":1,"swap-api/v1/swap_openorders":1,"swap-api/v1/swap_hisorders":1,"swap-api/v1/swap_hisorders_exact":1,"swap-api/v1/swap_matchresults":1,"swap-api/v1/swap_matchresults_exact":1,"swap-api/v3/swap_matchresults":1,"swap-api/v3/swap_matchresults_exact":1,"swap-api/v3/swap_hisorders":1,"swap-api/v3/swap_hisorders_exact":1,"swap-api/v1/swap_trigger_order":1,"swap-api/v1/swap_trigger_cancel":1,"swap-api/v1/swap_trigger_cancelall":1,"swap-api/v1/swap_trigger_openorders":1,"swap-api/v1/swap_trigger_hisorders":1,"swap-api/v1/swap_tpsl_order":1,"swap-api/v1/swap_tpsl_cancel":1,"swap-api/v1/swap_tpsl_cancelall":1,"swap-api/v1/swap_tpsl_openorders":1,"swap-api/v1/swap_tpsl_hisorders":1,"swap-api/v1/swap_relation_tpsl_order":1,"swap-api/v1/swap_track_order":1,"swap-api/v1/swap_track_cancel":1,"swap-api/v1/swap_track_cancelall":1,"swap-api/v1/swap_track_openorders":1,"swap-api/v1/swap_track_hisorders":1,"linear-swap-api/v1/swap_lever_position_limit":1,"linear-swap-api/v1/swap_cross_lever_position_limit":1,"linear-swap-api/v1/swap_balance_valuation":1,"linear-swap-api/v1/swap_account_info":1,"linear-swap-api/v1/swap_cross_account_info":1,"linear-swap-api/v1/swap_position_info":1,"linear-swap-api/v1/swap_cross_position_info":1,"linear-swap-api/v1/swap_account_position_info":1,"linear-swap-api/v1/swap_cross_account_position_info":1,"linear-swap-api/v1/swap_sub_auth":1,"linear-swap-api/v1/swap_sub_account_list":1,"linear-swap-api/v1/swap_cross_sub_account_list":1,"linear-swap-api/v1/swap_sub_account_info_list":1,"linear-swap-api/v1/swap_cross_sub_account_info_list":1,"linear-swap-api/v1/swap_sub_account_info":1,"linear-swap-api/v1/swap_cross_sub_account_info":1,"linear-swap-api/v1/swap_sub_position_info":1,"linear-swap-api/v1/swap_cross_sub_position_info":1,"linear-swap-api/v1/swap_financial_record":1,"linear-swap-api/v1/swap_financial_record_exact":1,"linear-swap-api/v1/swap_user_settlement_records":1,"linear-swap-api/v1/swap_cross_user_settlement_records":1,"linear-swap-api/v1/swap_available_level_rate":1,"linear-swap-api/v1/swap_cross_available_level_rate":1,"linear-swap-api/v1/swap_order_limit":1,"linear-swap-api/v1/swap_fee":1,"linear-swap-api/v1/swap_transfer_limit":1,"linear-swap-api/v1/swap_cross_transfer_limit":1,"linear-swap-api/v1/swap_position_limit":1,"linear-swap-api/v1/swap_cross_position_limit":1,"linear-swap-api/v1/swap_master_sub_transfer":1,"linear-swap-api/v1/swap_master_sub_transfer_record":1,"linear-swap-api/v1/swap_transfer_inner":1,"linear-swap-api/v3/swap_financial_record":1,"linear-swap-api/v3/swap_financial_record_exact":1,"linear-swap-api/v1/swap_order":1,"linear-swap-api/v1/swap_cross_order":1,"linear-swap-api/v1/swap_batchorder":1,"linear-swap-api/v1/swap_cross_batchorder":1,"linear-swap-api/v1/swap_cancel":1,"linear-swap-api/v1/swap_cross_cancel":1,"linear-swap-api/v1/swap_cancelall":1,"linear-swap-api/v1/swap_cross_cancelall":1,"linear-swap-api/v1/swap_switch_lever_rate":1,"linear-swap-api/v1/swap_cross_switch_lever_rate":1,"linear-swap-api/v1/swap_lightning_close_position":1,"linear-swap-api/v1/swap_cross_lightning_close_position":1,"linear-swap-api/v1/swap_order_info":1,"linear-swap-api/v1/swap_cross_order_info":1,"linear-swap-api/v1/swap_order_detail":1,"linear-swap-api/v1/swap_cross_order_detail":1,"linear-swap-api/v1/swap_openorders":1,"linear-swap-api/v1/swap_cross_openorders":1,"linear-swap-api/v1/swap_hisorders":1,"linear-swap-api/v1/swap_cross_hisorders":1,"linear-swap-api/v1/swap_hisorders_exact":1,"linear-swap-api/v1/swap_cross_hisorders_exact":1,"linear-swap-api/v1/swap_matchresults":1,"linear-swap-api/v1/swap_cross_matchresults":1,"linear-swap-api/v1/swap_matchresults_exact":1,"linear-swap-api/v1/swap_cross_matchresults_exact":1,"linear-swap-api/v1/linear-cancel-after":1,"linear-swap-api/v1/swap_switch_position_mode":1,"linear-swap-api/v1/swap_cross_switch_position_mode":1,"linear-swap-api/v3/swap_matchresults":1,"linear-swap-api/v3/swap_cross_matchresults":1,"linear-swap-api/v3/swap_matchresults_exact":1,"linear-swap-api/v3/swap_cross_matchresults_exact":1,"linear-swap-api/v3/swap_hisorders":1,"linear-swap-api/v3/swap_cross_hisorders":1,"linear-swap-api/v3/swap_hisorders_exact":1,"linear-swap-api/v3/swap_cross_hisorders_exact":1,"linear-swap-api/v3/fix_position_margin_change":1,"linear-swap-api/v3/swap_switch_account_type":1,"linear-swap-api/v3/linear_swap_fee_switch":1,"linear-swap-api/v1/swap_trigger_order":1,"linear-swap-api/v1/swap_cross_trigger_order":1,"linear-swap-api/v1/swap_trigger_cancel":1,"linear-swap-api/v1/swap_cross_trigger_cancel":1,"linear-swap-api/v1/swap_trigger_cancelall":1,"linear-swap-api/v1/swap_cross_trigger_cancelall":1,"linear-swap-api/v1/swap_trigger_openorders":1,"linear-swap-api/v1/swap_cross_trigger_openorders":1,"linear-swap-api/v1/swap_trigger_hisorders":1,"linear-swap-api/v1/swap_cross_trigger_hisorders":1,"linear-swap-api/v1/swap_tpsl_order":1,"linear-swap-api/v1/swap_cross_tpsl_order":1,"linear-swap-api/v1/swap_tpsl_cancel":1,"linear-swap-api/v1/swap_cross_tpsl_cancel":1,"linear-swap-api/v1/swap_tpsl_cancelall":1,"linear-swap-api/v1/swap_cross_tpsl_cancelall":1,"linear-swap-api/v1/swap_tpsl_openorders":1,"linear-swap-api/v1/swap_cross_tpsl_openorders":1,"linear-swap-api/v1/swap_tpsl_hisorders":1,"linear-swap-api/v1/swap_cross_tpsl_hisorders":1,"linear-swap-api/v1/swap_relation_tpsl_order":1,"linear-swap-api/v1/swap_cross_relation_tpsl_order":1,"linear-swap-api/v1/swap_track_order":1,"linear-swap-api/v1/swap_cross_track_order":1,"linear-swap-api/v1/swap_track_cancel":1,"linear-swap-api/v1/swap_cross_track_cancel":1,"linear-swap-api/v1/swap_track_cancelall":1,"linear-swap-api/v1/swap_cross_track_cancelall":1,"linear-swap-api/v1/swap_track_openorders":1,"linear-swap-api/v1/swap_cross_track_openorders":1,"linear-swap-api/v1/swap_track_hisorders":1,"linear-swap-api/v1/swap_cross_track_hisorders":1}}}},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},exceptions:{broad:{"contract is restricted of closing positions on API. Please contact customer service":r.OnMaintenance,maintain:r.OnMaintenance,"API key has no permission":r.PermissionDenied},exact:{403:r.AuthenticationError,1010:r.AccountNotEnabled,1003:r.AuthenticationError,1013:r.BadSymbol,1017:r.OrderNotFound,1034:r.InvalidOrder,1036:r.InvalidOrder,1039:r.InvalidOrder,1041:r.InvalidOrder,1047:r.InsufficientFunds,1048:r.InsufficientFunds,1061:r.OrderNotFound,1051:r.InvalidOrder,1066:r.BadSymbol,1067:r.InvalidOrder,1094:r.InvalidOrder,1220:r.AccountNotEnabled,1303:r.BadRequest,1461:r.InvalidOrder,4007:r.BadRequest,"bad-request":r.BadRequest,"validation-format-error":r.BadRequest,"validation-constraints-required":r.BadRequest,"base-date-limit-error":r.BadRequest,"api-not-support-temp-addr":r.PermissionDenied,timeout:r.RequestTimeout,"gateway-internal-error":r.ExchangeNotAvailable,"account-frozen-balance-insufficient-error":r.InsufficientFunds,"invalid-amount":r.InvalidOrder,"order-limitorder-amount-min-error":r.InvalidOrder,"order-limitorder-amount-max-error":r.InvalidOrder,"order-marketorder-amount-min-error":r.InvalidOrder,"order-limitorder-price-min-error":r.InvalidOrder,"order-limitorder-price-max-error":r.InvalidOrder,"order-stop-order-hit-trigger":r.InvalidOrder,"order-value-min-error":r.InvalidOrder,"order-invalid-price":r.InvalidOrder,"order-holding-limit-failed":r.InvalidOrder,"order-orderprice-precision-error":r.InvalidOrder,"order-etp-nav-price-max-error":r.InvalidOrder,"order-orderstate-error":r.OrderNotFound,"order-queryorder-invalid":r.OrderNotFound,"order-update-error":r.ExchangeNotAvailable,"api-signature-check-failed":r.AuthenticationError,"api-signature-not-valid":r.AuthenticationError,"base-record-invalid":r.OrderNotFound,"base-symbol-trade-disabled":r.BadSymbol,"base-symbol-error":r.BadSymbol,"system-maintenance":r.OnMaintenance,"base-request-exceed-frequency-limit":r.RateLimitExceeded,"invalid symbol":r.BadSymbol,"symbol trade not open now":r.BadSymbol,"require-symbol":r.BadSymbol,"invalid-address":r.BadRequest,"base-currency-chain-error":r.BadRequest,"dw-insufficient-balance":r.InsufficientFunds,"base-withdraw-fee-error":r.BadRequest,"dw-withdraw-min-limit":r.BadRequest,"request limit":r.RateLimitExceeded}},precisionMode:o.kb,options:{fetchMarkets:{types:{spot:!0,linear:!0,inverse:!0}},timeDifference:0,adjustForTimeDifference:!1,fetchOHLCV:{useHistoricalEndpointForSpot:!0},withdraw:{includeFee:!1},defaultType:"spot",defaultSubType:"linear",defaultNetwork:"ERC20",defaultNetworks:{ETH:"ERC20",BTC:"BTC",USDT:"TRC20"},networks:{TRC20:"TRX",BTC:"BTC",ERC20:"ETH",SOL:"SOLANA",HRC20:"HECO",BEP20:"BSC",XMR:"XMR",LTC:"LTC",XRP:"XRP",XLM:"XLM",CRONOS:"CRO",CRO:"CRO",GLMR:"GLMR",POLYGON:"MATIC",MATIC:"MATIC",BTT:"BTT",CUBE:"CUBE",IOST:"IOST",NEO:"NEO",KLAY:"KLAY",EOS:"EOS",THETA:"THETA",NAS:"NAS",NULS:"NULS",QTUM:"QTUM",FTM:"FTM",CELO:"CELO",DOGE:"DOGE",DOGECHAIN:"DOGECHAIN",NEAR:"NEAR",STEP:"STEP",BITCI:"BITCI",CARDANO:"ADA",ADA:"ADA",ETC:"ETC",LUK:"LUK",MINEPLEX:"MINEPLEX",DASH:"DASH",ZEC:"ZEC",IOTA:"IOTA",NEON3:"NEON3",XEM:"XEM",HC:"HC",LSK:"LSK",DCR:"DCR",BTG:"BTG",STEEM:"STEEM",BTS:"BTS",ICX:"ICX",WAVES:"WAVES",CMT:"CMT",BTM:"BTM",VET:"VET",XZC:"XZC",ACT:"ACT",SMT:"SMT",BCD:"BCD",WAX:"WAX1",WICC:"WICC",ELF:"ELF",ZIL:"ZIL",ELA:"ELA",BCX:"BCX",SBTC:"SBTC",BIFI:"BIFI",CTXC:"CTXC",WAN:"WAN",POLYX:"POLYX",PAI:"PAI",WTC:"WTC",DGB:"DGB",XVG:"XVG",AAC:"AAC",AE:"AE",SEELE:"SEELE",BCV:"BCV",GRS:"GRS",ARDR:"ARDR",NANO:"NANO",ZEN:"ZEN",RBTC:"RBTC",BSV:"BSV",GAS:"GAS",XTZ:"XTZ",LAMB:"LAMB",CVNT1:"CVNT1",DOCK:"DOCK",SC:"SC",KMD:"KMD",ETN:"ETN",TOP:"TOP",IRIS:"IRIS",UGAS:"UGAS",TT:"TT",NEWTON:"NEWTON",VSYS:"VSYS",FSN:"FSN",BHD:"BHD",ONE:"ONE",EM:"EM",CKB:"CKB",EOSS:"EOSS",HIVE:"HIVE",RVN:"RVN",DOT:"DOT",KSM:"KSM",BAND:"BAND",OEP4:"OEP4",NBS:"NBS",FIS:"FIS",AR:"AR",HBAR:"HBAR",FIL:"FIL",MASS:"MASS",KAVA:"KAVA",XYM:"XYM",ENJ:"ENJ",CRUST:"CRUST",ICP:"ICP",CSPR:"CSPR",FLOW:"FLOW",IOTX:"IOTX",LAT:"LAT",APT:"APT",XCH:"XCH",MINA:"MINA",XEC:"ECASH",XPRT:"XPRT",CCA:"ACA",AOTI:"COTI",AKT:"AKT",ARS:"ARS",ASTR:"ASTR",AZERO:"AZERO",BLD:"BLD",BRISE:"BRISE",CORE:"CORE",DESO:"DESO",DFI:"DFI",EGLD:"EGLD",ERG:"ERG",ETHF:"ETHFAIR",ETHW:"ETHW",EVMOS:"EVMOS",FIO:"FIO",FLR:"FLR",FINSCHIA:"FINSCHIA",KMA:"KMA",KYVE:"KYVE",MEV:"MEV",MOVR:"MOVR",NODL:"NODL",OAS:"OAS",OSMO:"OSMO",PAYCOIN:"PAYCOIN",POKT:"POKT",PYG:"PYG",REI:"REI",SCRT:"SCRT",SDN:"SDN",SEI:"SEI",SGB:"SGB",SUI:"SUI",SXP:"SOLAR",SYS:"SYS",TENET:"TENET",TON:"TON",UNQ:"UNQ",UYU:"UYU",WEMIX:"WEMIX",XDC:"XDC",XPLA:"XPLA"},fetchOrdersByStatesMethod:"spot_private_get_v1_order_orders",createMarketBuyOrderRequiresPrice:!0,language:"en-US",broker:{id:"AA03022abc"},accountsByType:{spot:"pro",funding:"pro",future:"futures"},accountsById:{spot:"spot",margin:"margin",otc:"otc",point:"point","super-margin":"super-margin",investment:"investment",borrow:"borrow","grid-trading":"grid-trading","deposit-earning":"deposit-earning","otc-options":"otc-options"},typesByAccount:{pro:"spot",futures:"future"},spot:{stopOrderTypes:{"stop-limit":!0,"buy-stop-limit":!0,"sell-stop-limit":!0,"stop-limit-fok":!0,"buy-stop-limit-fok":!0,"sell-stop-limit-fok":!0},limitOrderTypes:{limit:!0,"buy-limit":!0,"sell-limit":!0,ioc:!0,"buy-ioc":!0,"sell-ioc":!0,"limit-maker":!0,"buy-limit-maker":!0,"sell-limit-maker":!0,"stop-limit":!0,"buy-stop-limit":!0,"sell-stop-limit":!0,"limit-fok":!0,"buy-limit-fok":!0,"sell-limit-fok":!0,"stop-limit-fok":!0,"buy-stop-limit-fok":!0,"sell-stop-limit-fok":!0}}},commonCurrencies:{NGL:"GFNGL",GET:"THEMIS",GTC:"GAMECOM",HIT:"HITCHAIN",PNT:"PENTA",SBTC:"SUPERBITCOIN",SOUL:"SOULSAVER",BIFI:"BITCOINFILE",FUD:"FTX Users Debt"},features:{spot:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerDirection:!0,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,iceberg:!1,selfTradePrevention:!0,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!0},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:500,daysBack:120,untilDays:2,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,trigger:!0,trailing:!1,limit:500,symbolRequired:!1},fetchOrders:{marginMode:!1,trigger:!0,trailing:!1,limit:500,untilDays:2,daysBack:180,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,trigger:!0,trailing:!1,untilDays:2,limit:500,daysBack:180,daysBackCanceled:1/12,symbolRequired:!1},fetchOHLCV:{limit:1e3}},forDerivatives:{extends:"spot",createOrder:{stopLossPrice:!0,takeProfitPrice:!0,trailing:!0,hedged:!0},createOrders:{max:25},fetchOrder:{marginMode:!0},fetchOpenOrders:{marginMode:!0,trigger:!1,trailing:!1,limit:50},fetchOrders:{marginMode:!0,trigger:!1,trailing:!1,limit:50,daysBack:90},fetchClosedOrders:{marginMode:!0,trigger:!1,trailing:!1,untilDays:2,limit:50,daysBack:90,daysBackCanceled:1/12},fetchOHLCV:{limit:2e3}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}}}})}async fetchStatus(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchStatus",void 0,e);const i=this.handleOption("fetchStatus","enableForContracts",!1);let s,r,a,o;if("spot"!==t&&i){const i=this.safeString(e,"subType",this.options.defaultSubType);"swap"===t?"linear"===i?s=await this.statusPublicSwapLinearGetApiV2SummaryJson():"inverse"===i&&(s=await this.statusPublicSwapInverseGetApiV2SummaryJson()):"future"===t?"linear"===i?s=await this.statusPublicFutureLinearGetApiV2SummaryJson():"inverse"===i&&(s=await this.statusPublicFutureInverseGetApiV2SummaryJson()):"contract"===t&&(s=await this.contractPublicGetHeartbeat())}else"spot"===t&&(s=await this.statusPublicSpotGetApiV2SummaryJson());if("contract"===t){const e=this.safeString(s,"status");r=void 0===e?void 0:"ok"===e?"ok":"maintenance",a=this.safeString(s,"ts")}else{const e=this.safeValue(s,"status",{});r="none"===this.safeString(e,"indicator")?"ok":"maintenance";const t=this.safeValue(s,"page",{}),i=this.safeString(t,"updated_at");a=this.parse8601(i),o=this.safeString(t,"url")}return{status:r,updated:a,eta:void 0,url:o,info:s}}async fetchTime(e={}){const t=this.safeValue(this.options,"fetchTime",{}),i=this.safeString(this.options,"defaultType","spot");let s,r=this.safeString(t,"type",i);return r=this.safeString(e,"type",r),s="future"===r||"swap"===r?await this.contractPublicGetApiV1Timestamp(e):await this.spotPublicGetV1CommonTimestamp(e),this.safeInteger2(s,"data","ts")}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i,t),maker:this.safeNumber(e,"actualMakerRate"),taker:this.safeNumber(e,"actualTakerRate"),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbols:i.id},r=await this.spotPrivateGetV2ReferenceTransactFeeRate(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.safeValue(a,0,{});return this.parseTradingFee(o,i)}async fetchTradingLimits(e=void 0,t={}){await this.loadMarkets(),void 0===e&&(e=this.symbols);const i={};for(let s=0;s<e.length;s++){const r=e[s];i[r]=await this.fetchTradingLimitsById(this.marketId(r),t)}return i}async fetchTradingLimitsById(e,t={}){const i={symbol:e},s=await this.spotPublicGetV1CommonExchange(this.extend(i,t));return this.parseTradingLimits(this.safeValue(s,"data",{}))}parseTradingLimits(e,t=void 0,i={}){return{info:e,limits:{amount:{min:this.safeNumber(e,"limit-order-must-greater-than"),max:this.safeNumber(e,"limit-order-must-less-than")}}}}costToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.cost,this.precisionMode)}async fetchMarkets(e={}){let t;this.options.adjustForTimeDifference&&await this.loadTimeDifference(),[t,e]=this.handleOptionAndParams(e,"fetchMarkets","types",{});let i=[],s=[];const r=Object.keys(t);for(let i=0;i<r.length;i++){const a=r[i];this.safeBool(t,a)&&("spot"===a?s.push(this.fetchMarketsByTypeAndSubType("spot",void 0,e)):"linear"===a?s.push(this.fetchMarketsByTypeAndSubType(void 0,"linear",e)):"inverse"===a&&(s.push(this.fetchMarketsByTypeAndSubType("swap","inverse",e)),s.push(this.fetchMarketsByTypeAndSubType("future","inverse",e))))}s=await Promise.all(s);for(let e=0;e<s.length;e++)i=this.arrayConcat(i,s[e]);return i}async fetchMarketsByTypeAndSubType(e,t,i={}){const s={};let o;"spot"===e?o=await this.spotPublicGetV1CommonSymbols(this.extend(s,i)):"linear"===t?(s.business_type="all",o=await this.contractPublicGetLinearSwapApiV1SwapContractInfo(this.extend(s,i))):"inverse"===t&&("future"===e?o=await this.contractPublicGetApiV1ContractContractInfo(this.extend(s,i)):"swap"===e&&(o=await this.contractPublicGetSwapApiV1SwapContractInfo(this.extend(s,i))));const n=this.safeList(o,"data",[]);if(n.length<1)throw new r.OperationFailed(this.id+" fetchMarkets() returned an empty response: "+this.json(o));const d=[];for(let t=0;t<n.length;t++){const i=n[t];let s,r,o,h,c;const l="contract_code"in i,u=!l;let f,p,m=!1,g=!1;if(l){h=this.safeString(i,"contract_code"),c=h.toLowerCase();if(g=void 0!==this.safeString(i,"delivery_date"),m=!g,f=void 0!==this.safeString(i,"business_type"),p=!f,m){e="swap";const t=h.split("-");s=this.safeStringLower(i,"symbol"),r=this.safeStringLower(t,1),o=p?s:r}else if(g)if(e="future",s=this.safeStringLower(i,"symbol"),p)r="USD",o=s;else{const e=this.safeString(i,"pair").split("-");r=this.safeStringLower(e,1),o=r}}else e="spot",s=this.safeString(i,"base-currency"),r=this.safeString(i,"quote-currency"),h=s+r,c=h.toLowerCase();const v=this.safeCurrencyCode(s),y=this.safeCurrencyCode(r),w=this.safeCurrencyCode(o);let b,k=v+"/"+y;l&&(p?k+=":"+v:f&&(k+=":"+y),g&&(b=this.safeInteger(i,"delivery_time"),k+="-"+this.yymmdd(b)));const S=this.safeNumber(i,"contract_size");let O=this.safeNumber(i,"min-order-value");const T=this.safeNumber(i,"max-order-amt");let P,I,M,x,A,C,B=this.safeNumber(i,"min-order-amt");if(l&&(f?B=S:p&&(O=S)),u){P=this.parseNumber(this.parsePrecision(this.safeString(i,"price-precision"))),I=this.parseNumber(this.parsePrecision(this.safeString(i,"amount-precision"))),M=this.parseNumber(this.parsePrecision(this.safeString(i,"value-precision"))),x=this.parseNumber("0.002"),A=this.parseNumber("0.002");C="online"===this.safeString(i,"state")}else{P=this.safeNumber(i,"price_tick"),I=this.parseNumber("1"),x=this.parseNumber("0.0002"),A=this.parseNumber("0.0005");C=1===this.safeInteger(i,"contract_status")}const _=this.safeString(i,"leverage-ratio","1"),E=this.safeString(i,"super-margin-leverage-ratio","1"),N=a.Y.stringGt(_,"1")||a.Y.stringGt(E,"1");let R,L=this.safeString(i,"create_date");if(void 0!==L){const e=this.stringToCharsArray(L);L=e[0]+e[1]+e[2]+e[3]+"-"+e[4]+e[5]+"-"+e[6]+e[7]+" 00:00:00",R=this.parse8601(L)}d.push({id:h,lowercaseId:c,symbol:k,base:v,quote:y,settle:w,baseId:s,quoteId:r,settleId:o,type:e,spot:u,margin:u&&N,swap:m,future:g,option:!1,active:C,contract:l,linear:f,inverse:p,taker:A,maker:x,contractSize:S,expiry:b,expiryDatetime:this.iso8601(b),strike:void 0,optionType:void 0,precision:{amount:I,price:P,cost:M},limits:{leverage:{min:this.parseNumber("1"),max:this.parseNumber(_),superMax:this.parseNumber(E)},amount:{min:B,max:T},price:{min:void 0,max:void 0},cost:{min:O,max:void 0}},created:R,info:i})}return d}tryGetSymbolFromFutureMarkets(e){if(e in this.markets)return e;"futureMarketIdsForSymbols"in this.options||(this.options.futureMarketIdsForSymbols={});const t=this.safeDict(this.options,"futureMarketIdsForSymbols",{});if(e in t)return t[e];const i=this.filterBy(this.markets,"future",!0),s={this_week:"CW",next_week:"NW",quarter:"CQ",next_quarter:"NQ"};for(let t=0;t<i.length;t++){const r=i[t],a=this.safeValue(r,"info",{}),o=s[this.safeString(a,"contract_type")];if((r.linear?r.base+"-"+r.quote+"-"+o:r.base+"_"+o)===e){const t=r.symbol;return this.options.futureMarketIdsForSymbols[e]=t,t}}return this.options.futureMarketIdsForSymbols[e]=e,e}parseTicker(e,t=void 0){const i=this.safeString2(e,"symbol","contract_code");let s=this.safeSymbol(i,t);s=this.tryGetSymbolFromFutureMarkets(s);const r=this.safeInteger2(e,"ts","quoteTime");let a,o,n,d;"bid"in e&&(Array.isArray(e.bid)?(a=this.safeString(e.bid,0),o=this.safeString(e.bid,1)):(a=this.safeString(e,"bid"),o=this.safeString(e,"bidSize"))),"ask"in e&&(Array.isArray(e.ask)?(n=this.safeString(e.ask,0),d=this.safeString(e.ask,1)):(n=this.safeString(e,"ask"),d=this.safeString(e,"askSize")));const h=this.safeString(e,"open"),c=this.safeString(e,"close"),l=this.safeString(e,"amount"),u=this.safeString(e,"vol");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:a,bidVolume:o,ask:n,askVolume:d,vwap:void 0,open:h,close:c,last:c,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:l,quoteVolume:u,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={};let r;i.linear?(s.contract_code=i.id,r=await this.contractPublicGetLinearSwapExMarketDetailMerged(this.extend(s,t))):i.inverse?i.future?(s.symbol=i.id,r=await this.contractPublicGetMarketDetailMerged(this.extend(s,t))):i.swap&&(s.contract_code=i.id,r=await this.contractPublicGetSwapExMarketDetailMerged(this.extend(s,t))):(s.symbol=i.id,r=await this.spotPublicGetMarketDetailMerged(this.extend(s,t)));const a=this.safeValue(r,"tick",{}),o=this.parseTicker(a,i),n=this.safeInteger(r,"ts");return o.timestamp=n,o.datetime=this.iso8601(n),o}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString(e,0);let s;void 0!==i&&(s=this.market(i));const a="subType"in t||"business_type"in t;let o,n;[o,t]=this.handleMarketTypeAndParams("fetchTickers",s,t),[n,t]=this.handleSubTypeAndParams("fetchTickers",s,t);const d={},h="future"===o,c="swap"===o,l="inverse"===n;let u;if(!("spot"===o)||a)if("linear"===n)d.business_type=h?"futures":c?"swap":"all",u=await this.contractPublicGetLinearSwapExMarketDetailBatchMerged(this.extend(d,t));else{if(!l)throw new r.NotSupported(this.id+' fetchTickers() you have to set params["subType"] to either "linear" or "inverse" for contracts');if(h)u=await this.contractPublicGetMarketDetailBatchMerged(this.extend(d,t));else{if(!c)throw new r.NotSupported(this.id+' fetchTickers() you have to set params["type"] to either "swap" or "future" for inverse contracts');u=await this.contractPublicGetSwapExMarketDetailBatchMerged(this.extend(d,t))}}else u=await this.spotPublicGetMarketTickers(this.extend(d,t));const f=this.safeList2(u,"data","ticks",[]),p=this.parseTickers(f,e,t);return this.filterByArrayTickers(p,"symbol",e)}async fetchLastPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.getMarketFromSymbols(e);let s,a,o;if([a,t]=this.handleSubTypeAndParams("fetchLastPrices",i,t),[s,t]=this.handleMarketTypeAndParams("fetchLastPrices",i,t),"swap"!==s&&"future"!==s||"linear"!==a)if("swap"===s&&"inverse"===a)o=await this.contractPublicGetSwapExMarketTrade(t);else{if("future"!==s||"inverse"!==a)throw new r.NotSupported(this.id+" fetchLastPrices() does not support "+s+" markets yet");o=await this.contractPublicGetMarketTrade(t)}else o=await this.contractPublicGetLinearSwapExMarketTrade(t);const n=this.safeValue(o,"tick",{}),d=this.safeList(n,"data",[]);return this.parseLastPrices(d,e)}parseLastPrice(e,t=void 0){const i=this.safeString2(e,"symbol","contract_code");t=this.safeMarket(i,t);const s=this.safeNumber(e,"price"),r=this.safeString(e,"direction");return{symbol:t.symbol,timestamp:void 0,datetime:void 0,price:s,side:r,info:e}}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),a={type:"step0"};let o;if(s.linear)a.contract_code=s.id,o=await this.contractPublicGetLinearSwapExMarketDepth(this.extend(a,i));else if(s.inverse)s.future?(a.symbol=s.id,o=await this.contractPublicGetMarketDepth(this.extend(a,i))):s.swap&&(a.contract_code=s.id,o=await this.contractPublicGetSwapExMarketDepth(this.extend(a,i)));else{if(void 0!==t){if(5!==t&&10!==t&&20!==t&&150!==t)throw new r.BadRequest(this.id+" fetchOrderBook() limit argument must be undefined, 5, 10, 20, or 150, default is 150");150!==t&&(a.depth=t)}a.symbol=s.id,o=await this.spotPublicGetMarketDepth(this.extend(a,i))}if("tick"in o){if(!o.tick)throw new r.BadSymbol(this.id+" fetchOrderBook() returned empty response: "+this.json(o));const t=this.safeValue(o,"tick"),i=this.safeInteger(t,"ts",this.safeInteger(o,"ts")),s=this.parseOrderBook(t,e,i);return s.nonce=this.safeInteger(t,"version"),s}throw new r.ExchangeError(this.id+" fetchOrderBook() returned unrecognized response: "+this.json(o))}parseTrade(e,t=void 0){const i=this.safeString2(e,"contract_code","symbol"),s=(t=this.safeMarket(i,t)).symbol;let r=this.safeInteger2(e,"ts","created-at");r=this.safeInteger2(e,"created_at","create_date",r);const o=this.safeString2(e,"order-id","order_id");let n=this.safeString(e,"direction"),d=this.safeString(e,"type");if(void 0!==d){const e=d.split("-");n=e[0],d=e[1]}const h=this.safeStringLower(e,"role"),c=this.safeString2(e,"price","trade_price");let l=this.safeString2(e,"filled-amount","amount");l=this.safeString(e,"trade_volume",l);const u=this.safeString(e,"trade_turnover");let f,p=this.safeString(e,"filled-fees");void 0===p&&(p=a.Y.stringNeg(this.safeString(e,"trade_fee")));const m=this.safeString2(e,"fee-currency","fee_asset");let g=this.safeCurrencyCode(m);const v=this.safeString(e,"filled-points");if(void 0!==v&&(void 0===p||a.Y.stringEquals(p,"0"))){const t=this.safeString(e,"fee-deduct-currency");void 0!==t&&(p=v,g=this.safeCurrencyCode(t))}void 0!==p&&(f={cost:p,currency:g});const y=this.safeStringN(e,["trade_id","trade-id","id"]);return this.safeTrade({id:y,info:e,order:o,timestamp:r,datetime:this.iso8601(r),symbol:s,type:d,side:n,takerOrMaker:h,price:c,amount:l,cost:u,fee:f},t)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){let o,n;if(void 0!==t&&(o=this.market(t)),[n,a]=this.handleMarketTypeAndParams("fetchOrderTrades",o,a),"spot"!==n)throw new r.NotSupported(this.id+" fetchOrderTrades() is only supported for spot markets");return await this.fetchSpotOrderTrades(e,t,i,s,a)}async fetchSpotOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={"order-id":e},o=await this.spotPrivateGetV1OrderOrdersOrderIdMatchresults(this.extend(a,r));return this.parseTrades(o.data,void 0,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o,n=!1;if([n,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),n)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchMyTrades",a,s);let d,h={};if("spot"===o)void 0!==e&&(a=this.market(e),h.symbol=a.id),void 0!==i&&(h.size=i),void 0!==t&&(h["start-time"]=t),[h,s]=this.handleUntilOption("end-time",h,s),d=await this.spotPrivateGetV1OrderMatchresults(this.extend(h,s));else{if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");if(h.contract=a.id,h.trade_type=0,void 0!==t&&(h.start_time=t),[h,s]=this.handleUntilOption("end_time",h,s),void 0!==i&&(h.page_size=i),a.linear){let e;[e,s]=this.handleMarginModeAndParams("fetchMyTrades",s),e=void 0===e?"cross":e,"isolated"===e?d=await this.contractPrivatePostLinearSwapApiV3SwapMatchresultsExact(this.extend(h,s)):"cross"===e&&(d=await this.contractPrivatePostLinearSwapApiV3SwapCrossMatchresultsExact(this.extend(h,s)))}else if(a.inverse)if("future"===o)h.symbol=a.settleId,d=await this.contractPrivatePostApiV3ContractMatchresultsExact(this.extend(h,s));else{if("swap"!==o)throw new r.NotSupported(this.id+" fetchMyTrades() does not support "+o+" markets");d=await this.contractPrivatePostSwapApiV3SwapMatchresultsExact(this.extend(h,s))}}let c=this.safeValue(d,"data");return Array.isArray(c)||(c=this.safeValue(c,"trades")),this.parseTrades(c,a,t,i)}async fetchTrades(e,t=void 0,i=1e3,s={}){await this.loadMarkets();const r=this.market(e),a={};let o;void 0!==i&&(a.size=Math.min(i,2e3)),r.future?r.inverse?(a.symbol=r.id,o=await this.contractPublicGetMarketHistoryTrade(this.extend(a,s))):r.linear&&(a.contract_code=r.id,o=await this.contractPublicGetLinearSwapExMarketHistoryTrade(this.extend(a,s))):r.swap?(a.contract_code=r.id,r.inverse?o=await this.contractPublicGetSwapExMarketHistoryTrade(this.extend(a,s)):r.linear&&(o=await this.contractPublicGetLinearSwapExMarketHistoryTrade(this.extend(a,s)))):(a.symbol=r.id,o=await this.spotPublicGetMarketHistoryTrade(this.extend(a,s)));const n=this.safeValue(o,"data",[]);let d=[];for(let e=0;e<n.length;e++){const t=this.safeValue(n[e],"data",[]);for(let e=0;e<t.length;e++){const i=this.parseTrade(t[e],r);d.push(i)}}return d=this.sortBy(d,"timestamp"),this.filterBySymbolSinceLimit(d,r.symbol,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"id"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"amount")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();let o=!1;if([o,a]=this.handleOptionAndParams(a,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,a,1e3);const n=this.market(e),d={period:this.safeString(this.timeframes,t,t)},h=this.safeStringN(a,["priceType","price"]);let c;a=this.omit(a,["priceType","price"]),[c,a]=this.handleParamInteger(a,"until");const l=void 0!==c?this.parseToInt(c/1e3):void 0;if(n.contract&&(void 0!==s?d.size=Math.min(s,2e3):s=2e3,void 0===h)){const e=this.parseTimeframe(t);let r;if(void 0===i){const t=this.seconds();d.from=t-e*(s-1),r=t}else{const t=this.parseToInt(i/1e3);d.from=t,r=this.sum(t,e*(s-1))}d.to=void 0!==l?l:r}let u;if(n.future){if(n.inverse)if(d.symbol=n.id,"mark"===h)u=await this.contractPublicGetIndexMarketHistoryMarkPriceKline(this.extend(d,a));else if("index"===h)u=await this.contractPublicGetIndexMarketHistoryIndex(this.extend(d,a));else{if("premiumIndex"===h)throw new r.BadRequest(this.id+" "+n.type+" has no api endpoint for "+h+" kline data");u=await this.contractPublicGetMarketHistoryKline(this.extend(d,a))}else if(n.linear)if(d.contract_code=n.id,"mark"===h)u=await this.contractPublicGetIndexMarketHistoryLinearSwapMarkPriceKline(this.extend(d,a));else{if("index"===h)throw new r.BadRequest(this.id+" "+n.type+" has no api endpoint for "+h+" kline data");u="premiumIndex"===h?await this.contractPublicGetIndexMarketHistoryLinearSwapPremiumIndexKline(this.extend(d,a)):await this.contractPublicGetLinearSwapExMarketHistoryKline(this.extend(d,a))}}else if(n.swap){if(d.contract_code=n.id,n.inverse)if("mark"===h)u=await this.contractPublicGetIndexMarketHistorySwapMarkPriceKline(this.extend(d,a));else{if("index"===h)throw new r.BadRequest(this.id+" "+n.type+" has no api endpoint for "+h+" kline data");u="premiumIndex"===h?await this.contractPublicGetIndexMarketHistorySwapPremiumIndexKline(this.extend(d,a)):await this.contractPublicGetSwapExMarketHistoryKline(this.extend(d,a))}else if(n.linear)if("mark"===h)u=await this.contractPublicGetIndexMarketHistoryLinearSwapMarkPriceKline(this.extend(d,a));else{if("index"===h)throw new r.BadRequest(this.id+" "+n.type+" has no api endpoint for "+h+" kline data");u="premiumIndex"===h?await this.contractPublicGetIndexMarketHistoryLinearSwapPremiumIndexKline(this.extend(d,a)):await this.contractPublicGetLinearSwapExMarketHistoryKline(this.extend(d,a))}}else{let e;d.symbol=n.id,[e,a]=this.handleOptionAndParams(a,"fetchOHLCV","useHistoricalEndpointForSpot",!0),e?(void 0!==i&&(d.from=this.parseToInt(i/1e3)),void 0!==l&&(d.to=l),void 0!==s&&(d.size=Math.min(1e3,s)),u=await this.spotPublicGetMarketHistoryCandles(this.extend(d,a))):(void 0!==s&&(d.size=Math.min(s,2e3)),u=await this.spotPublicGetMarketHistoryKline(this.extend(d,a)))}const f=this.safeList(u,"data",[]);return this.parseOHLCVs(f,n,t,i,s)}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.spotPrivateGetV1AccountAccounts(e),i=this.safeValue(t,"data");return this.parseAccounts(i)}parseAccount(e){const t=this.safeString(e,"type"),i=this.safeValue(this.options,"accountsById",{}),s=this.safeValue(i,t,t);return{info:e,id:this.safeString(e,"id"),type:s,code:void 0}}async fetchAccountIdByType(e,t=void 0,i=void 0,s={}){const r=await this.loadAccounts(),a=this.safeValue2(s,"accountId","account-id");if(void 0!==a)return a;let o;"spot"===e&&("cross"===t?e="super-margin":"isolated"===t&&(e="margin")),void 0!==i&&(o=this.marketId(i));for(let t=0;t<r.length;t++){const i=r[t],s=this.safeValue(i,"info"),a=this.safeString(s,"subtype",void 0),n=this.safeString(i,"type");if("margin"===e){if(a===o)return this.safeString(i,"id")}else if(e===n)return this.safeString(i,"id")}const n=this.safeValue(r,0,{});return this.safeString(n,"id")}async fetchCurrencies(e={}){const t=await this.spotPublicGetV2ReferenceCurrencies(e),i=this.safeValue(t,"data",[]),s={};this.options.networkChainIdsByNames={},this.options.networkNamesByChainIds={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),o=this.safeCurrencyCode(r);this.options.networkChainIdsByNames[o]={};const n=this.safeValue(t,"chains",[]),d={},h="normal"===this.safeString(t,"instStatus");let c,l,u,f,p=!1,m=!1;for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"chain"),s=this.safeString2(t,"baseChain","displayName");this.options.networkChainIdsByNames[o][s]=i,this.options.networkNamesByChainIds[i]=s;const r=this.networkIdToCode(i);l=this.safeNumber(t,"minDepositAmt"),u=this.safeNumber(t,"minWithdrawAmt"),f=this.safeNumber(t,"maxWithdrawAmt");const h="allowed"===this.safeString(t,"withdrawStatus"),g="allowed"===this.safeString(t,"depositStatus");m=h||m,p=g||p;const v=h&&g,y=this.parsePrecision(this.safeString(t,"withdrawPrecision"));void 0!==y&&(c=void 0===c?y:a.Y.stringMin(y,c));const w=this.safeNumber(t,"transactFeeWithdraw");d[r]={info:t,id:i,network:r,limits:{deposit:{min:l,max:void 0},withdraw:{min:u,max:f}},active:v,deposit:g,withdraw:h,fee:w,precision:this.parseNumber(y)}}s[o]={info:t,code:o,id:r,active:h,deposit:p,withdraw:m,fee:void 0,name:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:u,max:f},deposit:{min:void 0,max:void 0}},precision:this.parseNumber(c),networks:d}}return s}networkIdToCode(e=void 0,t=void 0){if(0===Object.keys(this.options.networkNamesByChainIds).length)throw new r.ExchangeError(this.id+" networkIdToCode() - markets need to be loaded at first");const i=this.safeValue(this.options.networkNamesByChainIds,e,e);return super.networkIdToCode(i)}networkCodeToId(e,t=void 0){if(void 0===t)throw new r.ArgumentsRequired(this.id+" networkCodeToId() requires a currencyCode argument");if(0===Object.keys(this.options.networkChainIdsByNames).length)throw new r.ExchangeError(this.id+" networkCodeToId() - markets need to be loaded at first");const i=this.safeValue(this.options.networkChainIdsByNames,t,{});if(e in i)return i[e];{const t=super.networkCodeToId(e);return this.safeValue(i,t,t)}}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const i=this.safeValue(this.options,"fetchBalance",{}),s=this.safeValue2(e,"isUnifiedAccount","unified",!1);e=this.omit(e,["isUnifiedAccount","unified"]);const r={},a="spot"===t,o="future"===t,n=this.safeString2(this.options,"defaultSubType","subType","linear");let d=this.safeString2(i,"defaultSubType","subType",n);d=this.safeString2(e,"defaultSubType","subType",d);const h="inverse"===d,c="linear"===d;let l;[l,e]=this.handleMarginModeAndParams("fetchBalance",e),e=this.omit(e,["defaultSubType","subType"]);const u="isolated"===l,f="margin"===t||a&&("cross"===l||u);let p;if(a||f)if(f)p=u?await this.spotPrivateGetV1MarginAccountsBalance(this.extend(r,e)):await this.spotPrivateGetV1CrossMarginAccountsBalance(this.extend(r,e));else{await this.loadAccounts();const i=await this.fetchAccountIdByType(t,void 0,void 0,e);r["account-id"]=i,p=await this.spotPrivateGetV1AccountAccountsAccountIdBalance(this.extend(r,e))}else s?p=await this.contractPrivateGetLinearSwapApiV3UnifiedAccountInfo(this.extend(r,e)):c?p=u?await this.contractPrivatePostLinearSwapApiV1SwapAccountInfo(this.extend(r,e)):await this.contractPrivatePostLinearSwapApiV1SwapCrossAccountInfo(this.extend(r,e)):h&&(p=o?await this.contractPrivatePostApiV1ContractAccountInfo(this.extend(r,e)):await this.contractPrivatePostSwapApiV1SwapAccountInfo(this.extend(r,e)));let m={info:p};const g=this.safeValue(p,"data");if(a||f)if(u)for(let e=0;e<g.length;e++){const t=g[e],i=this.safeSymbol(this.safeString(t,"symbol")),s=this.safeValue(t,"list"),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"currency"),a=this.safeCurrencyCode(i);r[a]=this.parseMarginBalanceHelper(t,a,r)}m[i]=this.safeBalance(r)}else{const e=this.safeValue(g,"list",[]);for(let t=0;t<e.length;t++){const i=e[t],s=this.safeString(i,"currency"),r=this.safeCurrencyCode(s);m[r]=this.parseMarginBalanceHelper(i,r,m)}m=this.safeBalance(m)}else if(s)for(let e=0;e<g.length;e++){const t=g[e],i=this.safeString(t,"margin_asset"),s=this.safeCurrencyCode(i);if(u){const e=this.safeValue(t,"isolated_swap",{});for(let t=0;t<e.length;t++){const i=e[t],r=this.safeString(i,"contract_code"),a={code:s,free:this.safeNumber(i,"margin_available")};m[this.safeSymbol(r)]=a,m=this.safeBalance(m)}}else{const e=this.account();e.free=this.safeString(t,"margin_static"),e.used=this.safeString(t,"margin_frozen"),m[s]=e,m=this.safeBalance(m)}}else if(c){const e=this.safeValue(g,0,{});if(u)for(let e=0;e<g.length;e++){const t=g[e],i=this.safeString2(t,"contract_code","margin_account"),s=this.safeMarket(i),r=this.safeString(t,"margin_asset"),a=this.safeCurrency(r),o=this.safeString(s,"settle",a.code);if(void 0!==o){const e=this.account();e.free=this.safeString(t,"margin_balance"),e.used=this.safeString(t,"margin_frozen");const i={};i[o]=e;m[s.symbol]=this.safeBalance(i)}}else{const t=this.account();t.free=this.safeString(e,"withdraw_available"),t.total=this.safeString(e,"margin_balance");const i=this.safeString2(e,"margin_asset","symbol");m[this.safeCurrencyCode(i)]=t,m=this.safeBalance(m)}}else if(h){for(let e=0;e<g.length;e++){const t=g[e],i=this.safeString(t,"symbol"),s=this.safeCurrencyCode(i),r=this.account();r.free=this.safeString(t,"margin_available"),r.used=this.safeString(t,"margin_frozen"),m[s]=r}m=this.safeBalance(m)}return m}async fetchOrder(e,t=void 0,i={}){let s,a;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),[a,i]=this.handleMarketTypeAndParams("fetchOrder",s,i);const o={};let n;if("spot"===a){void 0!==this.safeString(i,"clientOrderId")?n=await this.spotPrivateGetV1OrderOrdersGetClientOrder(this.extend(o,i)):(o["order-id"]=e,n=await this.spotPrivateGetV1OrderOrdersOrderId(this.extend(o,i)))}else{if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");const d=this.safeString2(i,"client_order_id","clientOrderId");if(void 0===d?o.order_id=e:(o.client_order_id=d,i=this.omit(i,["client_order_id","clientOrderId"])),o.contract_code=s.id,s.linear){let e;[e,i]=this.handleMarginModeAndParams("fetchOrder",i),e=void 0===e?"cross":e,"isolated"===e?n=await this.contractPrivatePostLinearSwapApiV1SwapOrderInfo(this.extend(o,i)):"cross"===e&&(n=await this.contractPrivatePostLinearSwapApiV1SwapCrossOrderInfo(this.extend(o,i)))}else if(s.inverse)if("future"===a)o.symbol=s.settleId,n=await this.contractPrivatePostApiV1ContractOrderInfo(this.extend(o,i));else{if("swap"!==a)throw new r.NotSupported(this.id+" fetchOrder() does not support "+a+" markets");n=await this.contractPrivatePostSwapApiV1SwapOrderInfo(this.extend(o,i))}}let d=this.safeValue(n,"data");return Array.isArray(d)&&(d=this.safeValue(d,0)),this.parseOrder(d)}parseMarginBalanceHelper(e,t,i){let s;return s=t in i?i[t]:this.account(),"trade"===e.type&&(s.free=this.safeString(e,"balance")),"frozen"===e.type&&(s.used=this.safeString(e,"balance")),s}async fetchSpotOrdersByStates(e,t=void 0,i=void 0,s=void 0,a={}){const o=this.safeString(this.options,"fetchOrdersByStatesMethod","spot_private_get_v1_order_orders");if("spot_private_get_v1_order_orders"===o&&void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");let n;await this.loadMarkets();let d,h={states:e};void 0!==t&&(n=this.market(t),h.symbol=n.id),void 0!==i&&(h["start-time"]=i,h["end-time"]=this.sum(i,1728e5)),[h,a]=this.handleUntilOption("end-time",h,a),void 0!==s&&(h.size=s),d="spot_private_get_v1_order_orders"===o?await this.spotPrivateGetV1OrderOrders(this.extend(h,a)):await this.spotPrivateGetV1OrderHistory(this.extend(h,a));const c=this.safeList(d,"data",[]);return this.parseOrders(c,n,i,s)}async fetchSpotOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchSpotOrdersByStates("pre-submitted,submitted,partial-filled,filled,partial-canceled,canceled",e,t,i,s)}async fetchClosedSpotOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchSpotOrdersByStates("filled,partial-canceled,canceled",e,t,i,s)}async fetchContractOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchContractOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);let o,n={trade_type:0,status:"0"};const d=this.safeBool2(s,"stop","trigger"),h=this.safeValue(s,"stopLossTakeProfit"),c=this.safeBool(s,"trailing",!1);if(s=this.omit(s,["stop","stopLossTakeProfit","trailing","trigger"]),d||h||c?(void 0!==i&&(n.page_size=i),n.contract_code=a.id,n.create_date=90):(void 0!==t&&(n.start_time=t),n.contract=a.id,n.type=1),[n,s]=this.handleUntilOption("end_time",n,s),a.linear){let e;[e,s]=this.handleMarginModeAndParams("fetchContractOrders",s),e=void 0===e?"cross":e,"isolated"===e?o=d?await this.contractPrivatePostLinearSwapApiV1SwapTriggerHisorders(this.extend(n,s)):h?await this.contractPrivatePostLinearSwapApiV1SwapTpslHisorders(this.extend(n,s)):c?await this.contractPrivatePostLinearSwapApiV1SwapTrackHisorders(this.extend(n,s)):await this.contractPrivatePostLinearSwapApiV3SwapHisorders(this.extend(n,s)):"cross"===e&&(o=d?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerHisorders(this.extend(n,s)):h?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslHisorders(this.extend(n,s)):c?await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackHisorders(this.extend(n,s)):await this.contractPrivatePostLinearSwapApiV3SwapCrossHisorders(this.extend(n,s)))}else a.inverse&&(a.swap?o=d?await this.contractPrivatePostSwapApiV1SwapTriggerHisorders(this.extend(n,s)):h?await this.contractPrivatePostSwapApiV1SwapTpslHisorders(this.extend(n,s)):c?await this.contractPrivatePostSwapApiV1SwapTrackHisorders(this.extend(n,s)):await this.contractPrivatePostSwapApiV3SwapHisorders(this.extend(n,s)):a.future&&(n.symbol=a.settleId,o=d?await this.contractPrivatePostApiV1ContractTriggerHisorders(this.extend(n,s)):h?await this.contractPrivatePostApiV1ContractTpslHisorders(this.extend(n,s)):c?await this.contractPrivatePostApiV1ContractTrackHisorders(this.extend(n,s)):await this.contractPrivatePostApiV3ContractHisorders(this.extend(n,s))));let l=this.safeValue(o,"data");return Array.isArray(l)||(l=this.safeValue(l,"orders",[])),this.parseOrders(l,a,t,i)}async fetchClosedContractOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchContractOrders(e,t,i,this.extend({status:"5,6,7"},s))}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){let a,o;await this.loadMarkets(),void 0!==e&&(a=this.market(e)),[o,s]=this.handleMarketTypeAndParams("fetchOrders",a,s);const n="swap"===o||"future"===o;if(n&&void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument for "+o+" orders");return n?await this.fetchContractOrders(e,t,i,s):await this.fetchSpotOrders(e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a,o=!1;return[o,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),o?await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s,100):(void 0!==e&&(r=this.market(e)),[a,s]=this.handleMarketTypeAndParams("fetchClosedOrders",r,s),"spot"===a?await this.fetchClosedSpotOrders(e,t,i,s):await this.fetchClosedContractOrders(e,t,i,s))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),void 0!==e&&(a=this.market(e));const o={};let n,d;if([n,s]=this.handleMarketTypeAndParams("fetchOpenOrders",a,s),"spot"===n){void 0!==e&&(o.symbol=a.id);let t=this.safeString(s,"account-id");if(void 0===t){await this.loadAccounts();for(let e=0;e<this.accounts.length;e++){const i=this.accounts[e];if("spot"===this.safeString(i,"type")&&(t=this.safeString(i,"id"),void 0!==t))break}}o["account-id"]=t,void 0!==i&&(o.size=i),s=this.omit(s,"account-id"),d=await this.spotPrivateGetV1OrderOpenOrders(this.extend(o,s))}else{if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");void 0!==i&&(o.page_size=i),o.contract_code=a.id;const t=this.safeBool2(s,"stop","trigger"),n=this.safeValue(s,"stopLossTakeProfit"),h=this.safeBool(s,"trailing",!1);if(s=this.omit(s,["stop","stopLossTakeProfit","trailing","trigger"]),a.linear){let e;[e,s]=this.handleMarginModeAndParams("fetchOpenOrders",s),e=void 0===e?"cross":e,"isolated"===e?d=t?await this.contractPrivatePostLinearSwapApiV1SwapTriggerOpenorders(this.extend(o,s)):n?await this.contractPrivatePostLinearSwapApiV1SwapTpslOpenorders(this.extend(o,s)):h?await this.contractPrivatePostLinearSwapApiV1SwapTrackOpenorders(this.extend(o,s)):await this.contractPrivatePostLinearSwapApiV1SwapOpenorders(this.extend(o,s)):"cross"===e&&(d=t?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerOpenorders(this.extend(o,s)):n?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslOpenorders(this.extend(o,s)):h?await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackOpenorders(this.extend(o,s)):await this.contractPrivatePostLinearSwapApiV1SwapCrossOpenorders(this.extend(o,s)))}else a.inverse&&(a.swap?d=t?await this.contractPrivatePostSwapApiV1SwapTriggerOpenorders(this.extend(o,s)):n?await this.contractPrivatePostSwapApiV1SwapTpslOpenorders(this.extend(o,s)):h?await this.contractPrivatePostSwapApiV1SwapTrackOpenorders(this.extend(o,s)):await this.contractPrivatePostSwapApiV1SwapOpenorders(this.extend(o,s)):a.future&&(o.symbol=a.settleId,d=t?await this.contractPrivatePostApiV1ContractTriggerOpenorders(this.extend(o,s)):n?await this.contractPrivatePostApiV1ContractTpslOpenorders(this.extend(o,s)):h?await this.contractPrivatePostApiV1ContractTrackOpenorders(this.extend(o,s)):await this.contractPrivatePostApiV1ContractOpenorders(this.extend(o,s))))}let h=this.safeValue(d,"data");return Array.isArray(h)||(h=this.safeValue(h,"orders",[])),this.parseOrders(h,a,t,i)}parseOrderStatus(e){return this.safeString({"partial-filled":"open","partial-canceled":"canceled",filled:"closed",canceled:"canceled",submitted:"open",created:"open",1:"open",2:"open",3:"open",4:"open",5:"canceled",6:"closed",7:"canceled",11:"canceling"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"err_code","err-code");let s=this.parseOrderStatus(this.safeString2(e,"state","status"));void 0!==i&&(s="rejected");const r=this.safeStringN(e,["id","order_id_str","order-id"]);let a=this.safeString(e,"direction"),o=this.safeString(e,"order_price_type");if("type"in e){const t=e.type.split("-");a=t[0],o=t[1]}const n=this.safeString2(e,"contract_code","symbol");t=this.safeMarket(n,t);const d=this.safeIntegerN(e,["created_at","created-at","create_date"]),h=this.safeString2(e,"client_order_id","client-order-id");let c,l;void 0!==o&&o.indexOf("market")>=0?c=this.safeString(e,"field-cash-amount"):(l=this.safeString2(e,"volume","amount"),c=this.safeStringN(e,["filled-cash-amount","field-cash-amount","trade_turnover"]));const u=this.safeStringN(e,["filled-amount","field-amount","trade_volume"]),f=this.safeString2(e,"price","order_price");let p,m=this.safeString2(e,"filled-fees","field-fees");if(m=this.safeString(e,"fee",m),void 0!==m){let i;const s=this.safeString(e,"fee_asset");i=void 0!==s?this.safeCurrencyCode(s):"sell"===a?t.quote:t.base,p={cost:m,currency:i}}const g=this.safeString(e,"trade_avg_price"),v=this.safeValue(e,"trades"),y=this.safeInteger(e,"reduce_only");let w;return void 0!==y&&(w=0!==y),this.safeOrder({info:e,id:r,clientOrderId:h,timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:void 0,symbol:t.symbol,type:o,timeInForce:void 0,postOnly:void 0,side:a,price:f,triggerPrice:this.safeString2(e,"stop-price","trigger_price"),average:g,cost:c,amount:l,filled:u,remaining:void 0,status:s,reduceOnly:w,fee:p,trades:v},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createTrailingPercentOrder(e,t,i,s,a=void 0,o=void 0,n=void 0,d={}){if(void 0===o)throw new r.ArgumentsRequired(this.id+" createTrailingPercentOrder() requires a trailingPercent argument");if(void 0===n)throw new r.ArgumentsRequired(this.id+" createTrailingPercentOrder() requires a trailingTriggerPrice argument");return d.trailingPercent=o,d.trailingTriggerPrice=n,await this.createOrder(e,t,i,s,a,d)}async createSpotOrderRequest(e,t,i,s,o=void 0,n={}){await this.loadMarkets(),await this.loadAccounts();const d=this.market(e);let h;[h,n]=this.handleMarginModeAndParams("createOrder",n);const c={"account-id":await this.fetchAccountIdByType(d.type,h,e),symbol:d.id};let l=t.replace("buy-","");l=l.replace("sell-","");const u=this.safeValue(this.options,d.type,{}),f=this.safeStringN(n,["triggerPrice","stopPrice","stop-price"]);if(void 0===f){if(l in this.safeValue(u,"stopOrderTypes",{}))throw new r.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice for a trigger order")}else{const s="sell"===i?"lte":"gte",a=this.safeString(n,"operator",s);if(c["stop-price"]=this.priceToPrecision(e,f),c.operator=a,"limit"===l||"limit-fok"===l)l="stop-"+l;else if("stop-limit"!==l&&"stop-limit-fok"!==l)throw new r.NotSupported(this.id+" createOrder() does not support "+t+" orders")}let p;[p,n]=this.handlePostOnly("market"===l,"limit-maker"===l,n),p&&(l="limit-maker");const m=this.safeString(n,"timeInForce","GTC");"FOK"===m?l+="-fok":"IOC"===m&&(l="ioc"),c.type=i+"-"+l;const g=this.safeString2(n,"clientOrderId","client-order-id");if(void 0===g){const e=this.safeValue(this.options,"broker",{}),t=this.safeString(e,"id");c["client-order-id"]=t+this.uuid()}else c["client-order-id"]=g;if("cross"===h?c.source="super-margin-api":"isolated"===h?c.source="margin-api":"c2c"===h&&(c.source="c2c-margin-api"),"market"===l&&"buy"===i){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==d)t=this.amountToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o);t=this.amountToPrecision(e,a.Y.stringMul(i,r))}}else t=this.amountToPrecision(e,s);c.amount=t}else c.amount=this.amountToPrecision(e,s);return l in this.safeValue(u,"limitOrderTypes",{})&&(c.price=this.priceToPrecision(e,o)),n=this.omit(n,["triggerPrice","stopPrice","stop-price","clientOrderId","client-order-id","operator","timeInForce"]),this.extend(c,n)}createContractOrderRequest(e,t,i,s,r=void 0,o={}){const n={contract_code:this.market(e).id,volume:this.amountToPrecision(e,s),direction:i};let d;[d,o]=this.handlePostOnly("market"===t,"post_only"===t,o),d&&(t="post_only");const h=this.safeString(o,"timeInForce","GTC");"FOK"===h?t="fok":"IOC"===h&&(t="ioc");const c=this.safeNumberN(o,["triggerPrice","stopPrice","trigger_price"]),l=this.safeNumber2(o,"stopLossPrice","sl_trigger_price"),u=this.safeNumber2(o,"takeProfitPrice","tp_trigger_price"),f=this.safeString2(o,"trailingPercent","callback_rate"),p=this.safeNumber(o,"trailingTriggerPrice",r),m=void 0!==f,g=void 0!==l,v=void 0!==u;if(void 0!==c){const t=this.safeString2(o,"triggerType","trigger_type","le");n.trigger_type=t,n.trigger_price=this.priceToPrecision(e,c),void 0!==r&&(n.order_price=this.priceToPrecision(e,r))}else if(g||v)g?(n.sl_order_price_type=t,n.sl_trigger_price=this.priceToPrecision(e,l),void 0!==r&&(n.sl_order_price=this.priceToPrecision(e,r))):(n.tp_order_price_type=t,n.tp_trigger_price=this.priceToPrecision(e,u),void 0!==r&&(n.tp_order_price=this.priceToPrecision(e,r)));else if(m){const e=a.Y.stringDiv(f,"100");n.callback_rate=this.parseToNumeric(e),n.active_price=p,n.order_price_type=this.safeString(o,"order_price_type","formula_price")}else{const i=this.safeInteger2(o,"client_order_id","clientOrderId");void 0!==i&&(n.client_order_id=i,o=this.omit(o,["clientOrderId"])),"limit"!==t&&"ioc"!==t&&"fok"!==t&&"post_only"!==t||(n.price=this.priceToPrecision(e,r))}const y=this.safeBool2(o,"reduceOnly","reduce_only",!1);g||v||(y&&(n.reduce_only=1),n.lever_rate=this.safeIntegerN(o,["leverRate","lever_rate","leverage"],1),m||(n.order_price_type=t));this.safeBool(o,"hedged",!1)&&(n.offset=y?"close":"open");const w=this.safeValue(this.options,"broker",{}),b=this.safeString(w,"id");return n.channel_code=b,o=this.omit(o,["reduceOnly","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice","triggerType","leverRate","timeInForce","leverage","trailingPercent","trailingTriggerPrice","hedged"]),this.extend(n,o)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=this.safeNumberN(o,["triggerPrice","stopPrice","trigger_price"]),h=this.safeNumber2(o,"stopLossPrice","sl_trigger_price"),c=this.safeNumber2(o,"takeProfitPrice","tp_trigger_price"),l=void 0!==this.safeNumber(o,"trailingPercent"),u=void 0!==d,f=void 0!==h,p=void 0!==c;let m,g,v;if(n.spot){if(l)throw new r.NotSupported(this.id+" createOrder() does not support trailing orders for spot markets");const n=await this.createSpotOrderRequest(e,t,i,s,a,o);m=await this.spotPrivatePostV1OrderOrdersPlace(n)}else{let d=this.createContractOrderRequest(e,t,i,s,a,o);if(n.linear){let e;[e,d]=this.handleMarginModeAndParams("createOrder",d),e=void 0===e?"cross":e,"isolated"===e?m=u?await this.contractPrivatePostLinearSwapApiV1SwapTriggerOrder(d):f||p?await this.contractPrivatePostLinearSwapApiV1SwapTpslOrder(d):l?await this.contractPrivatePostLinearSwapApiV1SwapTrackOrder(d):await this.contractPrivatePostLinearSwapApiV1SwapOrder(d):"cross"===e&&(m=u?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerOrder(d):f||p?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslOrder(d):l?await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackOrder(d):await this.contractPrivatePostLinearSwapApiV1SwapCrossOrder(d))}else if(n.inverse){if(void 0===this.safeString(o,"offset"))throw new r.ArgumentsRequired(this.id+' createOrder () requires an extra parameter params["offset"] to be set to "open" or "close" when placing orders in inverse markets');n.swap?m=u?await this.contractPrivatePostSwapApiV1SwapTriggerOrder(d):f||p?await this.contractPrivatePostSwapApiV1SwapTpslOrder(d):l?await this.contractPrivatePostSwapApiV1SwapTrackOrder(d):await this.contractPrivatePostSwapApiV1SwapOrder(d):n.future&&(m=u?await this.contractPrivatePostApiV1ContractTriggerOrder(d):f||p?await this.contractPrivatePostApiV1ContractTpslOrder(d):l?await this.contractPrivatePostApiV1ContractTrackOrder(d):await this.contractPrivatePostApiV1ContractOrder(d))}}return n.spot?this.safeOrder({info:m,id:this.safeString(m,"data"),timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,status:void 0,symbol:void 0,type:t,side:i,price:a,amount:s,filled:void 0,remaining:void 0,cost:void 0,trades:void 0,fee:void 0,clientOrderId:void 0,average:void 0},n):(f?(g=this.safeValue(m,"data",{}),v=this.safeValue(g,"sl_order",{})):p?(g=this.safeValue(m,"data",{}),v=this.safeValue(g,"tp_order",{})):v=this.safeValue(m,"data",{}),this.parseOrder(v,n))}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s,a,o;for(let t=0;t<e.length;t++){const n=e[t],d=this.safeString(n,"symbol");if(void 0===s)s=d;else if(s!==d)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const h=this.safeString(n,"type"),c=this.safeString(n,"side"),l=this.safeValue(n,"amount"),u=this.safeValue(n,"price"),f=this.safeValue(n,"params",{}),p=this.handleMarginModeAndParams("createOrders",f)[0];if(void 0!==p)if(void 0===o)o=p;else if(o!==p)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same margin mode (isolated or cross)");let m;a=this.market(s),m=a.spot?await this.createSpotOrderRequest(d,h,c,l,u,f):this.createContractOrderRequest(d,h,c,l,u,f),m=this.omit(m,"marginMode"),i.push(m)}const n={};let d,h;if(a.spot?d=await this.privatePostOrderBatchOrders(i):(n.orders_data=i,a.linear?(o=void 0===o?"cross":o,"isolated"===o?d=await this.contractPrivatePostLinearSwapApiV1SwapBatchorder(n):"cross"===o&&(d=await this.contractPrivatePostLinearSwapApiV1SwapCrossBatchorder(n))):a.inverse&&(a.swap?d=await this.contractPrivatePostSwapApiV1SwapBatchorder(n):a.future&&(d=await this.contractPrivatePostApiV1ContractBatchorder(n)))),a.spot)h=this.safeValue(d,"data",[]);else{const e=this.safeValue(d,"data",{}),t=this.safeValue(e,"success",[]),i=this.safeValue(e,"errors",[]);h=this.arrayConcat(t,i)}return this.parseOrders(h,a)}async cancelOrder(e,t=void 0,i={}){let s,a;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),[a,i]=this.handleMarketTypeAndParams("cancelOrder",s,i);const o={};let n;if("spot"===a){const t=this.safeString2(i,"client-order-id","clientOrderId");void 0===t?(o["order-id"]=e,n=await this.spotPrivatePostV1OrderOrdersOrderIdSubmitcancel(this.extend(o,i))):(o["client-order-id"]=t,i=this.omit(i,["client-order-id","clientOrderId"]),n=await this.spotPrivatePostV1OrderOrdersSubmitCancelClientOrder(this.extend(o,i)))}else{if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const d=this.safeString2(i,"client_order_id","clientOrderId");void 0===d?o.order_id=e:(o.client_order_id=d,i=this.omit(i,["client_order_id","clientOrderId"])),s.future?o.symbol=s.settleId:o.contract_code=s.id;const h=this.safeBool2(i,"stop","trigger"),c=this.safeValue(i,"stopLossTakeProfit"),l=this.safeBool(i,"trailing",!1);if(i=this.omit(i,["stop","stopLossTakeProfit","trailing","trigger"]),s.linear){let e;[e,i]=this.handleMarginModeAndParams("cancelOrder",i),e=void 0===e?"cross":e,"isolated"===e?n=h?await this.contractPrivatePostLinearSwapApiV1SwapTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostLinearSwapApiV1SwapTpslCancel(this.extend(o,i)):l?await this.contractPrivatePostLinearSwapApiV1SwapTrackCancel(this.extend(o,i)):await this.contractPrivatePostLinearSwapApiV1SwapCancel(this.extend(o,i)):"cross"===e&&(n=h?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslCancel(this.extend(o,i)):l?await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackCancel(this.extend(o,i)):await this.contractPrivatePostLinearSwapApiV1SwapCrossCancel(this.extend(o,i)))}else{if(!s.inverse)throw new r.NotSupported(this.id+" cancelOrder() does not support "+a+" markets");s.swap?n=h?await this.contractPrivatePostSwapApiV1SwapTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostSwapApiV1SwapTpslCancel(this.extend(o,i)):l?await this.contractPrivatePostSwapApiV1SwapTrackCancel(this.extend(o,i)):await this.contractPrivatePostSwapApiV1SwapCancel(this.extend(o,i)):s.future&&(n=h?await this.contractPrivatePostApiV1ContractTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostApiV1ContractTpslCancel(this.extend(o,i)):l?await this.contractPrivatePostApiV1ContractTrackCancel(this.extend(o,i)):await this.contractPrivatePostApiV1ContractCancel(this.extend(o,i)))}}return this.extend(this.parseOrder(n,s),{id:e,status:"canceled"})}async cancelOrders(e,t=void 0,i={}){let s,a;await this.loadMarkets(),void 0!==t&&(s=this.market(t)),[a,i]=this.handleMarketTypeAndParams("cancelOrders",s,i);const o={};let n;if("spot"===a){let t=this.safeValue2(i,"client-order-id","clientOrderId");t=this.safeValue2(i,"client-order-ids","clientOrderIds",t),void 0===t?o["order-ids"]="string"==typeof t?[e]:e:(o["client-order-ids"]="string"==typeof t?[t]:t,i=this.omit(i,["client-order-id","client-order-ids","clientOrderId","clientOrderIds"])),n=await this.spotPrivatePostV1OrderOrdersBatchcancel(this.extend(o,i))}else{if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");let d=this.safeString2(i,"client_order_id","clientOrderId");d=this.safeString2(i,"client_order_ids","clientOrderIds",d),void 0===d?o.order_id=e.join(","):(o.client_order_id=d,i=this.omit(i,["client_order_id","client_order_ids","clientOrderId","clientOrderIds"])),s.future?o.symbol=s.settleId:o.contract_code=s.id;const h=this.safeBool2(i,"stop","trigger"),c=this.safeValue(i,"stopLossTakeProfit");if(i=this.omit(i,["stop","stopLossTakeProfit","trigger"]),s.linear){let e;[e,i]=this.handleMarginModeAndParams("cancelOrders",i),e=void 0===e?"cross":e,"isolated"===e?n=h?await this.contractPrivatePostLinearSwapApiV1SwapTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostLinearSwapApiV1SwapTpslCancel(this.extend(o,i)):await this.contractPrivatePostLinearSwapApiV1SwapCancel(this.extend(o,i)):"cross"===e&&(n=h?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslCancel(this.extend(o,i)):await this.contractPrivatePostLinearSwapApiV1SwapCrossCancel(this.extend(o,i)))}else{if(!s.inverse)throw new r.NotSupported(this.id+" cancelOrders() does not support "+a+" markets");s.swap?n=h?await this.contractPrivatePostSwapApiV1SwapTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostSwapApiV1SwapTpslCancel(this.extend(o,i)):await this.contractPrivatePostSwapApiV1SwapCancel(this.extend(o,i)):s.future&&(n=h?await this.contractPrivatePostApiV1ContractTriggerCancel(this.extend(o,i)):c?await this.contractPrivatePostApiV1ContractTpslCancel(this.extend(o,i)):await this.contractPrivatePostApiV1ContractCancel(this.extend(o,i)))}}const d=this.safeDict(n,"data");return this.parseCancelOrders(d)}parseCancelOrders(e){const t=this.safeString(e,"successes");let i;i=void 0!==t?t.split(","):this.safeList(e,"success",[]);const s=this.safeList2(e,"errors","failed",[]),r=[];for(let e=0;e<i.length;e++){const t=i[e];r.push(this.safeOrder({info:t,id:t,status:"canceled"}))}for(let e=0;e<s.length;e++){const t=s[e];r.push(this.safeOrder({info:t,id:this.safeString2(t,"order-id","order_id"),status:"failed",clientOrderId:this.safeString(t,"client-order-id")}))}return r}async cancelAllOrders(e=void 0,t={}){let i,s;await this.loadMarkets(),void 0!==e&&(i=this.market(e)),[s,t]=this.handleMarketTypeAndParams("cancelAllOrders",i,t);const a={};let o;if("spot"===s){void 0!==e&&(a.symbol=i.id),o=await this.spotPrivatePostV1OrderOrdersBatchCancelOpenOrders(this.extend(a,t));const s=this.safeDict(o,"data");return[this.safeOrder({info:s})]}{if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");i.future&&(a.symbol=i.settleId),a.contract_code=i.id;const n=this.safeBool2(t,"stop","trigger"),d=this.safeValue(t,"stopLossTakeProfit"),h=this.safeBool(t,"trailing",!1);if(t=this.omit(t,["stop","stopLossTakeProfit","trailing","trigger"]),i.linear){let e;[e,t]=this.handleMarginModeAndParams("cancelAllOrders",t),e=void 0===e?"cross":e,"isolated"===e?o=n?await this.contractPrivatePostLinearSwapApiV1SwapTriggerCancelall(this.extend(a,t)):d?await this.contractPrivatePostLinearSwapApiV1SwapTpslCancelall(this.extend(a,t)):h?await this.contractPrivatePostLinearSwapApiV1SwapTrackCancelall(this.extend(a,t)):await this.contractPrivatePostLinearSwapApiV1SwapCancelall(this.extend(a,t)):"cross"===e&&(o=n?await this.contractPrivatePostLinearSwapApiV1SwapCrossTriggerCancelall(this.extend(a,t)):d?await this.contractPrivatePostLinearSwapApiV1SwapCrossTpslCancelall(this.extend(a,t)):h?await this.contractPrivatePostLinearSwapApiV1SwapCrossTrackCancelall(this.extend(a,t)):await this.contractPrivatePostLinearSwapApiV1SwapCrossCancelall(this.extend(a,t)))}else{if(!i.inverse)throw new r.NotSupported(this.id+" cancelAllOrders() does not support "+s+" markets");i.swap?o=n?await this.contractPrivatePostSwapApiV1SwapTriggerCancelall(this.extend(a,t)):d?await this.contractPrivatePostSwapApiV1SwapTpslCancelall(this.extend(a,t)):h?await this.contractPrivatePostSwapApiV1SwapTrackCancelall(this.extend(a,t)):await this.contractPrivatePostSwapApiV1SwapCancelall(this.extend(a,t)):i.future&&(o=n?await this.contractPrivatePostApiV1ContractTriggerCancelall(this.extend(a,t)):d?await this.contractPrivatePostApiV1ContractTpslCancelall(this.extend(a,t)):h?await this.contractPrivatePostApiV1ContractTrackCancelall(this.extend(a,t)):await this.contractPrivatePostApiV1ContractCancelall(this.extend(a,t)))}const c=this.safeDict(o,"data");return this.parseCancelOrders(c)}}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={timeout:e>0?this.parseToInt(e/1e3):0};return await this.v2PrivatePostAlgoOrdersCancelAllAfter(this.extend(i,t))}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"addressTag"),r=this.safeString(e,"currency");t=this.safeCurrency(r,t);const a=this.safeCurrencyCode(r,t),o=this.safeString(e,"note"),n=this.safeString(e,"chain");return this.checkAddress(i),{currency:a,address:i,tag:s,network:this.networkIdToCode(n),note:o,info:e}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.spotPrivateGetV2AccountDepositAddress(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.parseDepositAddresses(a,[i.code],!1);return this.indexBy(o,"network")}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),[s,r]=this.handleNetworkCodeAndParams(t),a=await this.fetchDepositAddressesByNetwork(e,r);return a[this.selectNetworkCodeFromUnifiedNetworks(i.code,s,a)]}async fetchWithdrawAddresses(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.currency(e),a={currency:r.id},o=await this.spotPrivateGetV2AccountWithdrawAddress(this.extend(a,s)),n=this.safeValue(o,"data",[]),d=this.parseDepositAddresses(n,[r.code],!1),h=[];for(let e=0;e<d.length;e++){const s=d[e],r=void 0===t||s.note===t,a=void 0===i||s.network===i;r&&a&&h.push(s)}return h}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;(void 0===i||i>100)&&(i=100),await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={type:"deposit",direct:"next",from:0};void 0!==r&&(a.currency=r.id),void 0!==i&&(a.size=i);const o=await this.spotPrivateGetV1QueryDepositWithdraw(this.extend(a,s));return this.parseTransactions(o.data,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;(void 0===i||i>100)&&(i=100),await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={type:"withdraw",direct:"next",from:0};void 0!==r&&(a.currency=r.id),void 0!==i&&(a.size=i);const o=await this.spotPrivateGetV1QueryDepositWithdraw(this.extend(a,s));return this.parseTransactions(o.data,r,t,i)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"created-at"),s=this.safeCurrencyCode(this.safeString(e,"currency"));let r=this.safeString(e,"type");"withdraw"===r&&(r="withdrawal");let o=this.safeString(e,"fee");void 0!==o&&(o=a.Y.stringAbs(o));const n=this.safeString(e,"chain");let d=this.safeString(e,"tx-hash");"ETH"===n&&d.indexOf("0x")<0&&(d="0x"+d);const h="FAST"===this.safeString(e,"sub-type");return{info:e,id:this.safeString2(e,"id","data"),txid:d,timestamp:i,datetime:this.iso8601(i),network:this.networkIdToCode(n),address:this.safeString(e,"address"),addressTo:void 0,addressFrom:void 0,tag:this.safeString(e,"address-tag"),tagTo:void 0,tagFrom:void 0,type:r,amount:this.safeNumber(e,"amount"),currency:s,status:this.parseTransactionStatus(this.safeString(e,"state")),updated:this.safeInteger(e,"updated-at"),comment:void 0,internal:h,fee:{currency:s,cost:this.parseNumber(o),rate:void 0}}}parseTransactionStatus(e){return this.safeString({unknown:"failed",confirming:"pending",confirmed:"ok",safe:"ok",orphan:"failed",submitted:"pending",canceled:"canceled",reexamine:"pending",reject:"failed",pass:"pending","wallet-reject":"failed","confirm-error":"failed",repealed:"failed","wallet-transfer":"pending","pre-transfer":"pending"},e,e)}async withdraw(e,t,i,s=void 0,o={}){[s,o]=this.handleWithdrawTagAndParams(s,o),await this.loadMarkets(),this.checkAddress(i);const n=this.currency(e),d={address:i,currency:n.id.toLowerCase()};let h;void 0!==s&&(d["addr-tag"]=s),[h,o]=this.handleNetworkCodeAndParams(o),void 0!==h&&(d.chain=this.networkCodeToId(h,e)),t=parseFloat(this.currencyToPrecision(e,t,h));const c=this.safeValue(this.options,"withdraw",{});if(this.safeBool(c,"includeFee",!1)){let i=this.safeNumber(o,"fee");if(void 0===i){const e=await this.fetchCurrencies();this.currencies=this.deepExtend(this.currencies,e);const t=this.safeValue(n.networks,h,{});if(i=this.safeNumber(t,"fee"),void 0===i)throw new r.ArgumentsRequired(this.id+' withdraw() function can not find withdraw fee for chosen network. You need to re-load markets with "exchange.loadMarkets(true)", or provide the "fee" parameter')}const s=this.currencyToPrecision(e,i,h);o=this.omit(o,"fee");const c=this.numberToString(t),l=a.Y.stringSub(c,s),u=parseFloat(l);d.fee=parseFloat(s),t=parseFloat(this.currencyToPrecision(e,u,h))}d.amount=t;const l=await this.spotPrivatePostV1DwWithdrawApiCreate(this.extend(d,o));return this.parseTransaction(l,n)}parseTransfer(e,t=void 0){return{info:e,id:this.safeString(e,"data"),timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0}}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n={currency:o.id,amount:parseFloat(this.currencyToPrecision(e,t))};let d;[d,a]=this.handleSubTypeAndParams("transfer",void 0,a);let h=this.convertTypeToAccount(i),c=this.convertTypeToAccount(s);const l="cross"===c,u="cross"===h,f=this.inArray(c,this.ids),p=this.inArray(h,this.ids),m="pro"===h,g="pro"===c;if(m&&g)throw new r.BadRequest(this.id+" transfer () cannot make a transfer between "+i+" and "+s);let v;if("futures"===h||"futures"===c){let e=h+"-to-"+c;e=this.safeString(a,"type",e),n.type=e,v=await this.spotPrivatePostV1FuturesTransfer(this.extend(n,a))}else if(m&&l)v=await this.privatePostCrossMarginTransferIn(this.extend(n,a));else if(u&&g)v=await this.privatePostCrossMarginTransferOut(this.extend(n,a));else if(m&&f)n.symbol=c,v=await this.privatePostDwTransferInMargin(this.extend(n,a));else if(p&&g)n.symbol=h,v=await this.privatePostDwTransferOutMargin(this.extend(n,a));else{if("linear"===d){"swap"===h||"linear-swap"===i?h="linear-swap":c="linear-swap";let e=this.safeString(a,"symbol");a=this.omit(a,"symbol"),void 0!==e?(e=this.marketId(e),n["margin-account"]=e):n["margin-account"]="USDT"}n.from=m?"spot":h,n.to=g?"spot":c,v=await this.v2PrivatePostAccountTransfer(this.extend(n,a))}return this.parseTransfer(v,o)}async fetchIsolatedBorrowRates(e={}){await this.loadMarkets();const t=await this.spotPrivateGetV1MarginLoanInfo(e),i=this.safeValue(t,"data",[]);return this.parseIsolatedBorrowRates(i)}parseIsolatedBorrowRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeValue(e,"currencies",[]),a=this.safeValue(r,0),o=this.safeValue(r,1),n=this.safeString(a,"currency"),d=this.safeString(o,"currency");return{symbol:s,base:this.safeCurrencyCode(n),baseRate:this.safeNumber(a,"actual-rate"),quote:this.safeCurrencyCode(d),quoteRate:this.safeNumber(o,"actual-rate"),period:864e5,timestamp:void 0,datetime:void 0,info:e}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallCursor("fetchFundingRateHistory",e,t,i,s,"page_index","current_page",1,50);await this.loadMarkets();const o=this.market(e),n={contract_code:o.id};let d;if(o.inverse)d=await this.contractPublicGetSwapApiV1SwapHistoricalFundingRate(this.extend(n,s));else{if(!o.linear)throw new r.NotSupported(this.id+" fetchFundingRateHistory() supports inverse and linear swaps only");d=await this.contractPublicGetLinearSwapApiV1SwapHistoricalFundingRate(this.extend(n,s))}const h=this.safeValue(d,"data"),c=this.safeValue(h,"current_page"),l=this.safeValue(h,"data",[]),u=[];for(let e=0;e<l.length;e++){const t=l[e];t.current_page=c;const i=this.safeString(t,"contract_code"),s=this.safeSymbol(i),r=this.safeInteger(t,"funding_time");u.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"funding_rate"),timestamp:r,datetime:this.iso8601(r)})}const f=this.sortBy(u,"timestamp");return this.filterBySymbolSinceLimit(f,o.symbol,t,i)}parseFundingRate(e,t=void 0){const i=this.safeNumber(e,"estimated_rate"),s=this.safeInteger(e,"funding_time"),r=this.safeInteger(e,"next_funding_time"),o=this.safeString(e,"funding_time"),n=this.safeString(e,"next_funding_time"),d=a.Y.stringSub(n,o),h=this.safeString(e,"contract_code");return{info:e,symbol:this.safeSymbol(h,t),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"funding_rate"),fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:i,nextFundingTimestamp:r,nextFundingDatetime:this.iso8601(r),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(d)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={contract_code:i.id};let a;if(i.inverse)a=await this.contractPublicGetSwapApiV1SwapFundingRate(this.extend(s,t));else{if(!i.linear)throw new r.NotSupported(this.id+" fetchFundingRate() supports inverse and linear swaps only");a=await this.contractPublicGetLinearSwapApiV1SwapFundingRate(this.extend(s,t))}const o=this.safeValue(a,"data",{});return this.parseFundingRate(o,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.safeString(this.options,"defaultSubType","linear");let s;if([s,t]=this.handleOptionAndParams(t,"fetchFundingRates","subType",i),void 0!==e){const t=this.safeString(e,0);s=this.market(t).linear?"linear":"inverse"}const a={};let o;if("linear"===s)o=await this.contractPublicGetLinearSwapApiV1SwapBatchFundingRate(this.extend(a,t));else{if("inverse"!==s)throw new r.NotSupported(this.id+" fetchFundingRates() not support this market type");o=await this.contractPublicGetSwapApiV1SwapBatchFundingRate(this.extend(a,t))}const n=this.safeValue(o,"data",[]);return this.parseFundingRates(n,e)}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),[a,r]=this.handleMarginModeAndParams("fetchBorrowInterest",r),a=void 0===a?"cross":a;const o={};let n,d;if(void 0!==i&&(o["start-date"]=this.yyyymmdd(i)),void 0!==s&&(o.size=s),"isolated"===a)void 0!==t&&(n=this.market(t),o.symbol=n.id),d=await this.privateGetMarginLoanOrders(this.extend(o,r));else{if(void 0!==e){const t=this.currency(e);o.currency=t.id}d=await this.privateGetCrossMarginLoanOrders(this.extend(o,r))}const h=this.safeValue(d,"data"),c=this.parseBorrowInterests(h,n);return this.filterByCurrencySinceLimit(c,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"symbol"),s=void 0===i?"cross":"isolated";t=this.safeMarket(i);const r=this.safeString(t,"symbol"),a=this.safeInteger(e,"accrued-at");return{info:e,symbol:r,currency:this.safeCurrencyCode(this.safeString(e,"currency")),interest:this.safeNumber(e,"interest-amount"),interestRate:this.safeNumber(e,"interest-rate"),amountBorrowed:this.safeNumber(e,"loan-amount"),marginMode:s,timestamp:a,datetime:this.iso8601(a)}}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/";const d=this.omit(s,this.extractParams(e));if("string"==typeof t){if("public"===t||"private"===t?o+=this.version:"v2Public"!==t&&"v2Private"!==t||(o+="v2"),o+="/"+this.implodeParams(e,s),"private"===t||"v2Private"===t){this.checkRequiredCredentials();const e=this.ymdhms(this.nonce(),"T");let t={SignatureMethod:"HmacSHA256",SignatureVersion:"2",AccessKeyId:this.apiKey,Timestamp:e};"POST"!==i&&(t=this.extend(t,d));const s=this.keysort(t);let h=this.urlencode(s);const c=[i,this.hostname,o,h].join("\n"),l=this.hmac(this.encode(c),this.encode(this.secret),n.s,"base64");h+="&"+this.urlencode({Signature:l}),o+="?"+h,"POST"===i?(a=this.json(d),r={"Content-Type":"application/json"}):r={"Content-Type":"application/x-www-form-urlencoded"}}else Object.keys(d).length&&(o+="?"+this.urlencode(d));o=this.implodeParams(this.urls.api[t],{hostname:this.hostname})+o}else{const h=this.safeString(t,0),c=this.safeString(t,1),l=this.safeString(t,2),u=this.safeString(t,3);let f,p=this.safeValue(this.urls.hostnames,h);if("string"!=typeof p&&(p=this.safeValue(p,l),"string"!=typeof p&&void 0!==u&&(p=this.safeValue(p,u))),f=p,o+=this.implodeParams(e,s),"public"===c)Object.keys(d).length&&(o+="?"+this.urlencode(d));else if("private"===c){if(this.checkRequiredCredentials(),"POST"===i){const t=this.safeValue(this.options,"broker",{}),i=this.safeString(t,"id","AA03022abc");if(-1===e.indexOf("cancel")&&e.endsWith("order")){void 0===this.safeString(s,"channel_code")&&(s.channel_code=i)}else if(e.endsWith("orders/place")){void 0===this.safeString(s,"client-order-id")&&(s["client-order-id"]=i+this.uuid())}}const t=this.ymdhms(this.nonce(),"T");let h={SignatureMethod:"HmacSHA256",SignatureVersion:"2",AccessKeyId:this.apiKey,Timestamp:t};if(h=this.keysort(h),"POST"!==i){const e=this.keysort(d);h=this.extend(h,e)}let c=this.urlencode(h).replace("%2c","%2C");const l=[i,f,o,c].join("\n"),u=this.hmac(this.encode(l),this.encode(this.secret),n.s,"base64");c+="&"+this.urlencode({Signature:u}),o+="?"+c,"POST"===i?(2===(a=this.json(d)).length&&(a="{}"),r={"Content-Type":"application/json"}):r={"Content-Type":"application/x-www-form-urlencoded"}}o=this.implodeParams(this.urls.api[h],{hostname:f})+o}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if("status"in n){if("error"===this.safeString(n,"status")){const e=this.safeString2(n,"err-code","err_code"),t=this.id+" "+o;this.throwBroadlyMatchedException(this.exceptions.broad,o,t),this.throwExactlyMatchedException(this.exceptions.exact,e,t);const i=this.safeString2(n,"err-msg","err_msg");throw this.throwExactlyMatchedException(this.exceptions.exact,i,t),new r.ExchangeError(t)}}if("code"in n){const e=this.id+" "+o,t=this.safeString(n,"code");this.throwExactlyMatchedException(this.exceptions.exact,t,e)}const c=this.safeDict(n,"data"),l=this.safeList(c,"errors");if(void 0!==l){const e=this.safeDict(l,0),t=this.safeString(e,"err_code"),i=this.safeString(e,"err_msg"),s=this.id+" "+o;this.throwExactlyMatchedException(this.exceptions.exact,t,s),this.throwExactlyMatchedException(this.exceptions.exact,i,s)}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),[a,o]=this.handleMarketTypeAndParams("fetchFundingHistory",r,s),n={type:"30,31"};let d;if(void 0!==t&&(n.start_date=t),"swap"===a)if(n.contract=r.id,r.linear){let e;[e,s]=this.handleMarginModeAndParams("fetchFundingHistory",s),e=void 0===e?"cross":e,n.mar_acct="isolated"===e?r.id:r.quoteId,d=await this.contractPrivatePostLinearSwapApiV3SwapFinancialRecordExact(this.extend(n,o))}else d=await this.contractPrivatePostSwapApiV3SwapFinancialRecordExact(this.extend(n,o));else n.symbol=r.id,d=await this.contractPrivatePostApiV3ContractFinancialRecordExact(this.extend(n,o));const h=this.safeList(d,"data",[]);return this.parseIncomes(h,r,t,i)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s=this.market(t),[a,o]=this.handleMarketTypeAndParams("setLeverage",s,i),n={lever_rate:e};let d;if("future"===a&&s.inverse?n.symbol=s.settleId:n.contract_code=s.id,s.linear){let e;if([e,i]=this.handleMarginModeAndParams("setLeverage",i),e=void 0===e?"cross":e,"isolated"===e)d=await this.contractPrivatePostLinearSwapApiV1SwapSwitchLeverRate(this.extend(n,o));else{if("cross"!==e)throw new r.NotSupported(this.id+" setLeverage() not support this market type");d=await this.contractPrivatePostLinearSwapApiV1SwapCrossSwitchLeverRate(this.extend(n,o))}}else if("future"===a)d=await this.contractPrivatePostApiV1ContractSwitchLeverRate(this.extend(n,o));else{if("swap"!==a)throw new r.NotSupported(this.id+" setLeverage() not support this market type");d=await this.contractPrivatePostSwapApiV1SwapSwitchLeverRate(this.extend(n,o))}return d}parseIncome(e,t=void 0){const i=this.safeString(e,"contract_code"),s=this.safeSymbol(i,t),r=this.safeNumber(e,"amount"),a=this.safeInteger(e,"ts"),o=this.safeString(e,"id"),n=this.safeString2(e,"symbol","asset");return{info:e,symbol:s,code:this.safeCurrencyCode(n),timestamp:a,datetime:this.iso8601(a),id:o,amount:r}}parsePosition(e,t=void 0){const i=(t=this.safeMarket(this.safeString(e,"contract_code"))).symbol,s=this.safeString(e,"volume"),r=this.safeValue(t,"contractSize"),o=this.numberToString(r),n=this.safeNumber(e,"cost_open"),d=this.safeString(e,"position_margin"),h="buy"===this.safeString(e,"direction")?"long":"short",c=this.safeNumber(e,"profit_unreal");let l=this.safeString(e,"margin_mode");const u=this.safeString(e,"lever_rate"),f=a.Y.stringMul(this.safeString(e,"profit_rate"),"100"),p=this.safeString(e,"last_price"),m=a.Y.stringMul(s,o);let g;t.linear?g=a.Y.stringMul(m,p):(g=a.Y.stringDiv(m,p),l="cross");const v=a.Y.stringDiv(d,g),y=this.safeString(e,"margin_balance"),w=this.safeNumber(e,"liquidation_price"),b=this.safeString(e,"adjust_factor"),k=a.Y.stringDiv(b,u),S=a.Y.stringMul(k,g),O=a.Y.stringDiv(S,y);return this.safePosition({info:e,id:void 0,symbol:i,contracts:this.parseNumber(s),contractSize:r,entryPrice:n,collateral:this.parseNumber(y),side:h,unrealizedPnl:c,leverage:this.parseNumber(u),percentage:this.parseNumber(f),marginMode:l,notional:this.parseNumber(g),markPrice:void 0,lastPrice:void 0,liquidationPrice:w,initialMargin:this.parseNumber(d),initialMarginPercentage:this.parseNumber(v),maintenanceMargin:this.parseNumber(S),maintenanceMarginPercentage:this.parseNumber(k),marginRatio:this.parseNumber(O),timestamp:void 0,datetime:void 0,hedged:void 0,lastUpdateTimestamp:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchPositions(e=void 0,t={}){let i,s,a,o,n;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))){if(e.length>0){const t=this.safeString(e,0);i=this.market(t)}}if([s,t]=this.handleMarginModeAndParams("fetchPositions",t,"cross"),[a,t]=this.handleSubTypeAndParams("fetchPositions",i,t,"linear"),[o,t]=this.handleMarketTypeAndParams("fetchPositions",i,t),"spot"===o&&(o="future"),"linear"===a)if("isolated"===s)n=await this.contractPrivatePostLinearSwapApiV1SwapPositionInfo(t);else{if("cross"!==s)throw new r.NotSupported(this.id+" fetchPositions() not support this market type");n=await this.contractPrivatePostLinearSwapApiV1SwapCrossPositionInfo(t)}else if("future"===o)n=await this.contractPrivatePostApiV1ContractPositionInfo(t);else{if("swap"!==o)throw new r.NotSupported(this.id+" fetchPositions() not support this market type");n=await this.contractPrivatePostSwapApiV1SwapPositionInfo(t)}const d=this.safeValue(n,"data",[]),h=this.safeInteger(n,"ts"),c=[];for(let e=0;e<d.length;e++){const t=d[e],i=this.parsePosition(t);c.push(this.extend(i,{timestamp:h,datetime:this.iso8601(h)}))}return this.filterByArrayPositions(c,"symbol",e,!1)}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e);let s;[s,t]=this.handleMarginModeAndParams("fetchPosition",t),s=void 0===s?"cross":s;const[a,o]=this.handleMarketTypeAndParams("fetchPosition",i,t),n={};let d;if(i.future&&i.inverse?n.symbol=i.settleId:("cross"===s&&(n.margin_account="USDT"),n.contract_code=i.id),i.linear)if("isolated"===s)d=await this.contractPrivatePostLinearSwapApiV1SwapAccountPositionInfo(this.extend(n,o));else{if("cross"!==s)throw new r.NotSupported(this.id+" fetchPosition() not support this market type");d=await this.contractPrivatePostLinearSwapApiV1SwapCrossAccountPositionInfo(this.extend(n,o))}else if("future"===a)d=await this.contractPrivatePostApiV1ContractAccountPositionInfo(this.extend(n,o));else{if("swap"!==a)throw new r.NotSupported(this.id+" setLeverage() not support this market type");d=await this.contractPrivatePostSwapApiV1SwapAccountPositionInfo(this.extend(n,o))}const h=this.safeValue(d,"data");let c;c="cross"===s?h:this.safeValue(h,0);const l=this.omit(c,["positions"]),u=this.safeValue(c,"positions");let f;if(i.future&&i.inverse)for(let e=0;e<u.length;e++){const t=u[e];if(t.contract_code===i.id){f=t;break}}else f=this.safeValue(u,0);const p=this.safeInteger(d,"ts"),m=this.parsePosition(this.extend(f,l));return m.timestamp=p,m.datetime=this.iso8601(p),m}parseLedgerEntryType(e){return this.safeString({trade:"trade",etf:"trade","transact-fee":"fee","fee-deduction":"fee",transfer:"transfer",credit:"credit",liquidation:"trade",interest:"credit",deposit:"deposit",withdraw:"withdrawal","withdraw-fee":"fee",exchange:"exchange","other-types":"transfer",rebate:"rebate"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeString(e,"transactId"),a=this.safeString(e,"transferType"),o=this.safeInteger(e,"transactTime"),n=this.safeString(e,"accountId");return this.safeLedgerEntry({info:e,id:r,direction:this.safeString(e,"direction"),account:n,referenceId:r,referenceAccount:n,type:this.parseLedgerEntryType(a),currency:s,amount:this.safeNumber(e,"transactAmt"),timestamp:o,datetime:this.iso8601(o),before:void 0,after:void 0,status:void 0,fee:void 0},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s,500);let a,o={accountId:await this.fetchAccountIdByType("spot",void 0,void 0,s)};void 0!==e&&(a=this.currency(e),o.currency=a.id),void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.spotPrivateGetV2AccountLedger(this.extend(o,s)),d=this.safeValue(n,"data",[]);return this.parseLedger(d,a,t,i)}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.contractPublicGetLinearSwapApiV1SwapAdjustfactor(t),s=this.safeList(i,"data",[]);return this.parseLeverageTiers(s,e,"contract_code")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeString(e,"trade_partition"),s=this.safeString(e,"contract_code"),r=[],o=this.safeList(e,"list",[]);for(let e=0;e<o.length;e++){const n=o[e],d=this.safeString(n,"lever_rate"),h=this.safeList(n,"ladders",[]);for(let e=0;e<h.length;e++){const o=h[e],n=this.safeString(o,"adjust_factor");r.push({tier:this.safeInteger(o,"ladder"),symbol:this.safeSymbol(s,t,void 0,"swap"),currency:this.safeCurrencyCode(i),minNotional:this.safeNumber(o,"min_size"),maxNotional:this.safeNumber(o,"max_size"),maintenanceMarginRate:this.parseNumber(a.Y.stringDiv(n,d)),maxLeverage:this.parseNumber(d),info:o})}}return r}async fetchOpenInterestHistory(e,t="1h",i=void 0,s=void 0,a={}){if("1h"!==t&&"4h"!==t&&"12h"!==t&&"1d"!==t)throw new r.BadRequest(this.id+" fetchOpenInterestHistory cannot only use the 1h, 4h, 12h and 1d timeframe");await this.loadMarkets();const o=this.market(e),n=this.safeInteger2(a,"amount_type","amountType",2),d={period:{"1h":"60min","4h":"4hour","12h":"12hour","1d":"1day"}[t],amount_type:n};let h;void 0!==s&&(d.size=s),o.future?(d.contract_type=this.safeString(o.info,"contract_type"),d.symbol=o.baseId,h=await this.contractPublicGetApiV1ContractHisOpenInterest(this.extend(d,a))):o.linear?(d.contract_type="swap",d.contract_code=o.id,d.contract_code=o.id,h=await this.contractPublicGetLinearSwapApiV1SwapHisOpenInterest(this.extend(d,a))):(d.contract_code=o.id,h=await this.contractPublicGetSwapApiV1SwapHisOpenInterest(this.extend(d,a)));const c=this.safeValue(h,"data"),l=this.safeList(c,"tick");return this.parseOpenInterestsHistory(l,o,i,s)}async fetchOpenInterests(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==(e=this.marketSymbols(e))){if(e.length>0){const t=this.safeString(e,0);i=this.market(t)}}const s={};let r,a,o;[r,t]=this.handleSubTypeAndParams("fetchPositions",i,t,"linear"),[a,t]=this.handleMarketTypeAndParams("fetchPositions",i,t),"future"===a?o=await this.contractPublicGetApiV1ContractOpenInterest(this.extend(s,t)):"inverse"===r?o=await this.contractPublicGetSwapApiV1SwapOpenInterest(this.extend(s,t)):(s.contract_type="swap",o=await this.contractPublicGetLinearSwapApiV1SwapOpenInterest(this.extend(s,t)));const n=this.safeList(o,"data",[]);return this.parseOpenInterests(n,e)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");if(i.option)throw new r.NotSupported(this.id+" fetchOpenInterest() does not currently support option markets");const s={contract_code:i.id};let a;i.future?(s.contract_type=this.safeString(i.info,"contract_type"),s.symbol=i.baseId,a=await this.contractPublicGetApiV1ContractOpenInterest(this.extend(s,t))):i.linear?(s.contract_type="swap",a=await this.contractPublicGetLinearSwapApiV1SwapOpenInterest(this.extend(s,t))):a=await this.contractPublicGetSwapApiV1SwapOpenInterest(this.extend(s,t));const o=this.safeValue(a,"data",[]),n=this.parseOpenInterest(o[0],i),d=this.safeInteger(a,"ts");return n.timestamp=d,n.datetime=this.iso8601(d),n}parseOpenInterest(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeNumber(e,"volume"),r=this.safeNumber(e,"value"),a=this.safeString(e,"contract_code");return this.safeOpenInterest({symbol:this.safeSymbol(a,t),baseVolume:s,quoteVolume:r,openInterestAmount:s,openInterestValue:r,timestamp:i,datetime:this.iso8601(i),info:e},t)}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=this.market(e),o={currency:r.id,amount:this.currencyToPrecision(t,i),symbol:a.id},n=await this.privatePostMarginOrders(this.extend(o,s)),d=this.parseMarginLoan(n,r);return this.extend(d,{amount:i,symbol:e})}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={currency:s.id,amount:this.currencyToPrecision(e,t)},a=await this.privatePostCrossMarginOrders(this.extend(r,i)),o=this.parseMarginLoan(a,s);return this.extend(o,{amount:t})}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.currency(t),a=await this.fetchAccountIdByType("spot","isolated",e,s),o={currency:r.id,amount:this.currencyToPrecision(t,i),accountId:a},n=await this.v2PrivatePostAccountRepayment(this.extend(o,s)),d=this.safeValue(n,"Data",[]),h=this.safeValue(d,0),c=this.parseMarginLoan(h,r);return this.extend(c,{amount:i,symbol:e})}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r=await this.fetchAccountIdByType("spot","cross",void 0,i),a={currency:s.id,amount:this.currencyToPrecision(e,t),accountId:r},o=await this.v2PrivatePostAccountRepayment(this.extend(a,i)),n=this.safeValue(o,"Data",[]),d=this.safeValue(n,0),h=this.parseMarginLoan(d,s);return this.extend(h,{amount:t})}parseMarginLoan(e,t=void 0){const i=this.safeInteger(e,"repayTime");return{id:this.safeString2(e,"repayId","data"),currency:this.safeCurrencyCode(void 0,t),amount:void 0,symbol:void 0,timestamp:i,datetime:this.iso8601(i),info:e}}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchSettlementHistory() requires a symbol argument");const a=this.safeInteger(s,"until");s=this.omit(s,["until"]);const o=this.market(e),n={};let d;o.future?n.symbol=o.baseId:n.contract_code=o.id,void 0!==t&&(n.start_at=t),void 0!==i&&(n.page_size=i),void 0!==a&&(n.end_at=a),d=o.swap?o.linear?await this.contractPublicGetLinearSwapApiV1SwapSettlementRecords(this.extend(n,s)):await this.contractPublicGetSwapApiV1SwapSettlementRecords(this.extend(n,s)):await this.contractPublicGetApiV1ContractSettlementRecords(this.extend(n,s));const h=this.safeValue(d,"data"),c=this.safeValue(h,"settlement_record"),l=this.parseSettlements(c,o);return this.sortBy(l,"timestamp")}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotPublicGetV2ReferenceCurrencies(t),s=this.safeList(i,"data");return this.parseDepositWithdrawFees(s,e,"currency")}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"chains",[]);let s=this.depositWithdrawFee(e);for(let e=0;e<i.length;e++){const r=i[e],a=this.safeString(r,"chain"),o=this.safeString(r,"withdrawFeeType"),n=this.networkIdToCode(a);let d,h;"fixed"===o?(d=this.safeNumber(r,"transactFeeWithdraw"),h={fee:d,percentage:!1}):(d=this.safeNumber(r,"transactFeeRateWithdraw"),h={fee:d,percentage:!0}),s.networks[n]={withdraw:h,deposit:{fee:void 0,percentage:void 0}},s=this.assignDefaultDepositWithdrawFees(s,t)}return s}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeValue(r,"list");if(void 0!==a){const e=this.safeInteger(r,"settlement_time"),s={timestamp:e,datetime:this.iso8601(e)};for(let e=0;e<a.length;e++){const r=a[e],o=this.parseSettlement(r,t);i.push(this.extend(o,s))}}else i.push(this.parseSettlement(e[s],t))}return i}parseSettlement(e,t){const i=this.safeInteger(e,"settlement_time"),s=this.safeString(e,"contract_code");return{info:e,symbol:this.safeSymbol(s,t),price:this.safeNumber(e,"settlement_price"),timestamp:i,datetime:this.iso8601(i)}}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e);let o,n={trade_type:this.safeInteger(s,"trade_type",0)};if(void 0!==t&&(n.start_time=t),[n,s]=this.handleUntilOption("end_time",n,s),a.swap)n.contract=a.id,o=a.linear?await this.contractPublicGetLinearSwapApiV3SwapLiquidationOrders(this.extend(n,s)):await this.contractPublicGetSwapApiV3SwapLiquidationOrders(this.extend(n,s));else{if(!a.future)throw new r.NotSupported(this.id+" fetchLiquidations() does not support "+a.type+" orders");n.symbol=a.id,o=await this.contractPublicGetApiV3ContractLiquidationOrders(this.extend(n,s))}const d=this.safeList(o,"data",[]);return this.parseLiquidations(d,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeString(e,"contract_code"),s=this.safeInteger(e,"created_at");return this.safeLiquidation({info:e,symbol:this.safeSymbol(i,t),contracts:this.safeNumber(e,"volume"),contractSize:this.safeNumber(t,"contractSize"),price:this.safeNumber(e,"price"),baseValue:this.safeNumber(e,"amount"),quoteValue:this.safeNumber(e,"trade_turnover"),timestamp:s,datetime:this.iso8601(s)})}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),a=this.safeString(i,"clientOrderId");if(!s.contract)throw new r.BadRequest(this.id+" closePosition() symbol supports contract markets only");this.checkRequiredArgument("closePosition",t,"side");const o={contract_code:s.id,direction:t};if(void 0!==a&&(o.client_order_id=a),s.inverse){const t=this.safeString2(i,"volume","amount");if(void 0===t)throw new r.ArgumentsRequired(this.id+' closePosition () requires an extra argument params["amount"] for inverse markets');o.volume=this.amountToPrecision(e,t)}let n;if(i=this.omit(i,["clientOrderId","volume","amount"]),s.inverse)n=s.swap?await this.contractPrivatePostSwapApiV1SwapLightningClosePosition(this.extend(o,i)):await this.contractPrivatePostApiV1LightningClosePosition(this.extend(o,i));else{let e;[e,i]=this.handleMarginModeAndParams("closePosition",i,"cross"),n="cross"===e?await this.contractPrivatePostLinearSwapApiV1SwapCrossLightningClosePosition(this.extend(o,i)):await this.contractPrivatePostLinearSwapApiV1SwapLightningClosePosition(this.extend(o,i))}return this.parseOrder(n,s)}async setPositionMode(e,t=void 0,i={}){await this.loadMarkets();const s=e?"dual_side":"single_side";let a,o;void 0!==t&&(a=this.market(t)),[o,i]=this.handleMarginModeAndParams("setPositionMode",i,"cross");const n={position_mode:s};let d;if(void 0!==a&&a.inverse)throw new r.BadRequest(this.id+" setPositionMode can only be used for linear markets");if("isolated"===o){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setPositionMode requires a symbol argument for isolated margin mode");n.margin_account=a.id,d=await this.contractPrivatePostLinearSwapApiV1SwapSwitchPositionMode(this.extend(n,i))}else n.margin_account="USDT",d=await this.contractPrivatePostLinearSwapApiV1SwapCrossSwitchPositionMode(this.extend(n,i));return d}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"huobi",alias:!0})}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"huobijp",name:"Huobi Japan",countries:["JP"],rateLimit:100,userAgent:this.userAgents.chrome39,certified:!1,version:"v1",hostname:"api-cloud.bittrade.co.jp",pro:!0,has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchAccounts:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingLimits:!0,fetchWithdrawals:!0,withdraw:!0},timeframes:{"1m":"1min","5m":"5min","15m":"15min","30m":"30min","1h":"60min","4h":"4hour","1d":"1day","1w":"1week","1M":"1mon","1y":"1year"},urls:{logo:"https://user-images.githubusercontent.com/1294454/85734211-85755480-b705-11ea-8b35-0b7f1db33a2f.jpg",api:{market:"https://{hostname}",public:"https://{hostname}",private:"https://{hostname}",v2Public:"https://{hostname}",v2Private:"https://{hostname}"},www:"https://www.huobi.co.jp",referral:"https://www.huobi.co.jp/register/?invite_code=znnq3",doc:"https://api-doc.huobi.co.jp",fees:"https://www.huobi.co.jp/support/fee"},api:{v2Public:{get:{"reference/currencies":1,"market-status":1}},v2Private:{get:{"account/ledger":1,"account/withdraw/quota":1,"account/withdraw/address":1,"account/deposit/address":1,"account/repayment":5,"reference/transact-fee-rate":1,"account/asset-valuation":.2,"point/account":5,"sub-user/user-list":1,"sub-user/user-state":1,"sub-user/account-list":1,"sub-user/deposit-address":1,"sub-user/query-deposit":1,"user/api-key":1,"user/uid":1,"algo-orders/opening":1,"algo-orders/history":1,"algo-orders/specific":1,"c2c/offers":1,"c2c/offer":1,"c2c/transactions":1,"c2c/repayment":1,"c2c/account":1,"etp/reference":1,"etp/transactions":5,"etp/transaction":5,"etp/rebalance":1,"etp/limit":1},post:{"account/transfer":1,"account/repayment":5,"point/transfer":5,"sub-user/management":1,"sub-user/creation":1,"sub-user/tradable-market":1,"sub-user/transferability":1,"sub-user/api-key-generation":1,"sub-user/api-key-modification":1,"sub-user/api-key-deletion":1,"sub-user/deduct-mode":1,"algo-orders":1,"algo-orders/cancel-all-after":1,"algo-orders/cancellation":1,"c2c/offer":1,"c2c/cancellation":1,"c2c/cancel-all":1,"c2c/repayment":1,"c2c/transfer":1,"etp/creation":5,"etp/redemption":5,"etp/{transactId}/cancel":10,"etp/batch-cancel":50}},market:{get:{"history/kline":1,"detail/merged":1,depth:1,trade:1,"history/trade":1,detail:1,tickers:1,etp:1}},public:{get:{"common/symbols":1,"common/currencys":1,"common/timestamp":1,"common/exchange":1,"settings/currencys":1}},private:{get:{"account/accounts":.2,"account/accounts/{id}/balance":.2,"account/accounts/{sub-uid}":1,"account/history":4,"cross-margin/loan-info":1,"margin/loan-info":1,"fee/fee-rate/get":1,"order/openOrders":.4,"order/orders":.4,"order/orders/{id}":.4,"order/orders/{id}/matchresults":.4,"order/orders/getClientOrder":.4,"order/history":1,"order/matchresults":1,"query/deposit-withdraw":1,"margin/loan-orders":.2,"margin/accounts/balance":.2,"cross-margin/loan-orders":1,"cross-margin/accounts/balance":1,"points/actions":1,"points/orders":1,"subuser/aggregate-balance":10,"stable-coin/exchange_rate":1,"stable-coin/quote":1},post:{"account/transfer":1,"futures/transfer":1,"order/batch-orders":.4,"order/orders/place":.2,"order/orders/submitCancelClientOrder":.2,"order/orders/batchCancelOpenOrders":.4,"order/orders/{id}/submitcancel":.2,"order/orders/batchcancel":.4,"dw/withdraw/api/create":1,"dw/withdraw-virtual/{id}/cancel":1,"dw/transfer-in/margin":10,"dw/transfer-out/margin":10,"margin/orders":10,"margin/orders/{id}/repay":10,"cross-margin/transfer-in":1,"cross-margin/transfer-out":1,"cross-margin/orders":1,"cross-margin/orders/{id}/repay":1,"stable-coin/exchange":1,"subuser/transfer":10}}},fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:120,untilDays:2,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:void 0,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:2e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{broad:{"contract is restricted of closing positions on API. Please contact customer service":r.OnMaintenance,maintain:r.OnMaintenance},exact:{"bad-request":r.BadRequest,"base-date-limit-error":r.BadRequest,"api-not-support-temp-addr":r.PermissionDenied,timeout:r.RequestTimeout,"gateway-internal-error":r.ExchangeNotAvailable,"account-frozen-balance-insufficient-error":r.InsufficientFunds,"invalid-amount":r.InvalidOrder,"order-limitorder-amount-min-error":r.InvalidOrder,"order-limitorder-amount-max-error":r.InvalidOrder,"order-marketorder-amount-min-error":r.InvalidOrder,"order-limitorder-price-min-error":r.InvalidOrder,"order-limitorder-price-max-error":r.InvalidOrder,"order-holding-limit-failed":r.InvalidOrder,"order-orderprice-precision-error":r.InvalidOrder,"order-etp-nav-price-max-error":r.InvalidOrder,"order-orderstate-error":r.OrderNotFound,"order-queryorder-invalid":r.OrderNotFound,"order-update-error":r.ExchangeNotAvailable,"api-signature-check-failed":r.AuthenticationError,"api-signature-not-valid":r.AuthenticationError,"base-record-invalid":r.OrderNotFound,"base-symbol-trade-disabled":r.BadSymbol,"base-symbol-error":r.BadSymbol,"system-maintenance":r.OnMaintenance,"invalid symbol":r.BadSymbol,"symbol trade not open now":r.BadSymbol,"invalid-address":r.BadRequest,"base-currency-chain-error":r.BadRequest,"dw-insufficient-balance":r.InsufficientFunds}},options:{defaultNetwork:"ERC20",networks:{ETH:"erc20",TRX:"trc20",HRC20:"hrc20",HECO:"hrc20",HT:"hrc20",ALGO:"algo",OMNI:""},fetchOrdersByStatesMethod:"private_get_order_orders",fetchOpenOrdersMethod:"fetch_open_orders_v1",createMarketBuyOrderRequiresPrice:!0,fetchMarketsMethod:"publicGetCommonSymbols",fetchBalanceMethod:"privateGetAccountAccountsIdBalance",createOrderMethod:"privatePostOrderOrdersPlace",currencyToPrecisionRoundingMode:o.R3,language:"en-US",broker:{id:"AA03022abc"}},commonCurrencies:{GET:"Themis",GTC:"Game.com",HIT:"HitChain",PNT:"Penta",SBTC:"Super Bitcoin",BIFI:"Bitcoin File"}})}async fetchTime(e={}){const t=await this.publicGetCommonTimestamp(e);return this.safeInteger(t,"data")}async fetchTradingLimits(e=void 0,t={}){await this.loadMarkets(),void 0===e&&(e=this.symbols);const i={};for(let s=0;s<e.length;s++){const r=e[s];i[r]=await this.fetchTradingLimitsById(this.marketId(r),t)}return i}async fetchTradingLimitsById(e,t={}){const i={symbol:e},s=await this.publicGetCommonExchange(this.extend(i,t));return this.parseTradingLimits(this.safeValue(s,"data",{}))}parseTradingLimits(e,t=void 0,i={}){return{info:e,limits:{amount:{min:this.safeNumber(e,"limit-order-must-greater-than"),max:this.safeNumber(e,"limit-order-must-less-than")}}}}costToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.cost,this.precisionMode)}async fetchMarkets(e={}){const t=this.options.fetchMarketsMethod,i=await this[t](e),s=this.safeValue(i,"data",[]);if(s.length<1)throw new r.NetworkError(this.id+" fetchMarkets() returned empty response: "+this.json(s));const o=[];for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"base-currency"),r=this.safeString(t,"quote-currency"),n=this.safeCurrencyCode(i),d=this.safeCurrencyCode(r),h=this.safeString(t,"state"),c=this.safeString(t,"leverage-ratio","1"),l=this.safeString(t,"super-margin-leverage-ratio","1"),u=a.Y.stringGt(c,"1")||a.Y.stringGt(l,"1"),f="OMG"===n?this.parseNumber("0"):this.parseNumber("0.002");o.push({id:i+r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:i,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:u,swap:!1,future:!1,option:!1,active:"online"===h,contract:!1,linear:void 0,inverse:void 0,taker:f,maker:f,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{price:this.parseNumber(this.parsePrecision(this.safeString(t,"price-precision"))),amount:this.parseNumber(this.parsePrecision(this.safeString(t,"amount-precision"))),cost:this.parseNumber(this.parsePrecision(this.safeString(t,"value-precision")))},limits:{leverage:{min:this.parseNumber("1"),max:this.parseNumber(c),superMax:this.parseNumber(l)},amount:{min:this.safeNumber(t,"min-order-amt"),max:this.safeNumber(t,"max-order-amt")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"min-order-value"),max:void 0}},created:void 0,info:t})}return o}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeInteger(e,"ts");let r,a,o,n;"bid"in e&&(Array.isArray(e.bid)?(r=this.safeString(e.bid,0),a=this.safeString(e.bid,1)):(r=this.safeString(e,"bid"),a=this.safeString(e,"bidSize"))),"ask"in e&&(Array.isArray(e.ask)?(o=this.safeString(e.ask,0),n=this.safeString(e.ask,1)):(o=this.safeString(e,"ask"),n=this.safeString(e,"askSize")));const d=this.safeString(e,"open"),h=this.safeString(e,"close"),c=this.safeString(e,"amount"),l=this.safeString(e,"vol");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:r,bidVolume:a,ask:o,askVolume:n,vwap:void 0,open:d,close:h,last:h,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:c,quoteVolume:l,info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id,type:"step0"},a=await this.marketGetDepth(this.extend(s,i));if("tick"in a){if(!a.tick)throw new r.BadSymbol(this.id+" fetchOrderBook() returned empty response: "+this.json(a));const t=this.safeValue(a,"tick"),i=this.safeInteger(t,"ts",this.safeInteger(a,"ts")),s=this.parseOrderBook(t,e,i);return s.nonce=this.safeInteger(t,"version"),s}throw new r.ExchangeError(this.id+" fetchOrderBook() returned unrecognized response: "+this.json(a))}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.marketGetDetailMerged(this.extend(s,t)),a=this.parseTicker(r.tick,i),o=this.safeInteger(r,"ts");return a.timestamp=o,a.datetime=this.iso8601(o),a}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.marketGetTickers(t),s=this.safeValue(i,"data",[]),r=this.safeInteger(i,"ts"),a={};for(let e=0;e<s.length;e++){const t=this.safeString(s[e],"symbol"),i=this.safeMarket(t),o=i.symbol,n=this.parseTicker(s[e],i);n.timestamp=r,n.datetime=this.iso8601(r),a[o]=n}return this.filterByArrayTickers(a,"symbol",e)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeInteger2(e,"ts","created-at"),o=this.safeString(e,"order-id");let n=this.safeString(e,"direction"),d=this.safeString(e,"type");if(void 0!==d){const e=d.split("-");n=e[0],d=e[1]}const h=this.safeString(e,"role"),c=this.safeString(e,"price"),l=this.safeString2(e,"filled-amount","amount"),u=a.Y.stringMul(c,l);let f,p=this.safeString(e,"filled-fees"),m=this.safeCurrencyCode(this.safeString(e,"fee-currency"));const g=this.safeString(e,"filled-points");void 0!==g&&(void 0===p||a.Y.stringEq(p,"0.0"))&&(p=g,m=this.safeCurrencyCode(this.safeString(e,"fee-deduct-currency"))),void 0!==p&&(f={cost:p,currency:m});const v=this.safeString2(e,"trade-id","tradeId"),y=this.safeString(e,"id",v);return this.safeTrade({info:e,id:y,symbol:s,order:o,timestamp:r,datetime:this.iso8601(r),type:d,side:n,takerOrMaker:h,price:c,amount:l,cost:u,fee:f})}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={id:e},o=await this.privateGetOrderOrdersIdMatchresults(this.extend(a,r));return this.parseTrades(o.data,void 0,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==i&&(a.size=i),void 0!==t&&(a["start-time"]=t);const o=await this.privateGetOrderMatchresults(this.extend(a,s));return this.parseTrades(o.data,r,t,i)}async fetchTrades(e,t=void 0,i=1e3,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.size=Math.min(i,2e3));const o=await this.marketGetHistoryTrade(this.extend(a,s)),n=this.safeValue(o,"data",[]);let d=[];for(let e=0;e<n.length;e++){const t=this.safeValue(n[e],"data",[]);for(let e=0;e<t.length;e++){const i=this.parseTrade(t[e],r);d.push(i)}}return d=this.sortBy(d,"timestamp"),this.filterBySymbolSinceLimit(d,r.symbol,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"id"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"amount")]}async fetchOHLCV(e,t="1m",i=void 0,s=1e3,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,period:this.safeString(this.timeframes,t,t)};void 0!==s&&(o.size=Math.min(s,2e3));const n=await this.marketGetHistoryKline(this.extend(o,r)),d=this.safeList(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}async fetchAccounts(e={}){await this.loadMarkets();return(await this.privateGetAccountAccounts(e)).data}async fetchCurrencies(e={}){const t={language:this.options.language},i=await this.publicGetSettingsCurrencys(this.extend(t,e)),s=this.safeValue(i,"data",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeValue(t,"name"),a=this.safeCurrencyCode(i),o=this.safeValue(t,"deposit-enabled"),n=this.safeValue(t,"withdraw-enabled"),d=this.safeValue(t,"country-disabled"),h=this.safeBool(t,"visible",!1),c=this.safeString(t,"state"),l=h&&o&&n&&"online"===c&&!d,u=this.safeString(t,"display-name"),f=this.parseNumber(this.parsePrecision(this.safeString(t,"withdraw-precision")));r[a]={id:i,code:a,type:"crypto",name:u,active:l,deposit:o,withdraw:n,fee:void 0,precision:f,limits:{amount:{min:f,max:void 0},deposit:{min:this.safeNumber(t,"deposit-min-amount"),max:void 0},withdraw:{min:this.safeNumber(t,"withdraw-min-amount"),max:void 0}},info:t}}return r}parseBalance(e){const t=this.safeValue(e.data,"list",[]),i={info:e};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r);let o;o=a in i?i[a]:this.account(),"trade"===s.type&&(o.free=this.safeString(s,"balance")),"frozen"===s.type&&(o.used=this.safeString(s,"balance")),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets(),await this.loadAccounts();const t=this.options.fetchBalanceMethod,i={id:this.accounts[0].id},s=await this[t](this.extend(i,e));return this.parseBalance(s)}async fetchOrdersByStates(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={states:e};let o;void 0!==t&&(o=this.market(t),a.symbol=o.id);const n=this.safeString(this.options,"fetchOrdersByStatesMethod","private_get_order_orders"),d=await this[n](this.extend(a,r));return this.parseOrders(d.data,o,i,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrderOrdersId(this.extend(s,i)),a=this.safeDict(r,"data");return this.parseOrder(a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStates("pre-submitted,submitted,partial-filled,filled,partial-canceled,canceled",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeString(this.options,"fetchOpenOrdersMethod","fetch_open_orders_v1");return await this[r](e,t,i,s)}async fetchOpenOrdersV1(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrdersV1() requires a symbol argument");return await this.fetchOrdersByStates("pre-submitted,submitted,partial-filled",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStates("filled,partial-canceled,canceled",e,t,i,s)}async fetchOpenOrdersV2(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id);let o=this.safeString(s,"account-id");if(void 0===o){await this.loadAccounts();for(let e=0;e<this.accounts.length;e++){const t=this.accounts[e];if("spot"===t.type&&(o=this.safeString(t,"id"),void 0!==o))break}}r["account-id"]=o,void 0!==i&&(r.size=i);const n=this.omit(s,"account-id"),d=await this.privateGetOrderOpenOrders(this.extend(r,n)),h=this.safeList(d,"data",[]);return this.parseOrders(h,a,t,i)}parseOrderStatus(e){return this.safeString({"partial-filled":"open","partial-canceled":"canceled",filled:"closed",canceled:"canceled",submitted:"open"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id");let s,r,a;if("type"in e){const t=e.type.split("-");s=t[0],r=t[1],a=this.parseOrderStatus(this.safeString(e,"state"))}const o=this.safeString(e,"symbol");t=this.safeMarket(o,t);const n=this.safeInteger(e,"created-at"),d=this.safeString(e,"client-order-id"),h=this.safeString(e,"amount"),c=this.safeString2(e,"filled-amount","field-amount"),l=this.safeString(e,"price"),u=this.safeString2(e,"filled-cash-amount","field-cash-amount"),f=this.safeString2(e,"filled-fees","field-fees");let p;if(void 0!==f){p={cost:f,currency:"sell"===s?t.quote:t.base}}return this.safeOrder({info:e,id:i,clientOrderId:d,timestamp:n,datetime:this.iso8601(n),lastTradeTimestamp:void 0,symbol:t.symbol,type:r,timeInForce:void 0,postOnly:void 0,side:s,price:l,triggerPrice:void 0,average:void 0,cost:u,amount:h,filled:c,remaining:void 0,status:a,fee:p,trades:void 0},t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets(),await this.loadAccounts();const d=this.market(e),h={"account-id":this.accounts[0].id,symbol:d.id,type:i+"-"+t},c=this.safeString2(n,"clientOrderId","client-order-id");if(void 0===c){const e=this.safeValue(this.options,"broker",{}),t=this.safeString(e,"id");h["client-order-id"]=t+this.uuid()}else h["client-order-id"]=c;if(n=this.omit(n,["clientOrderId","client-order-id"]),"market"===t&&"buy"===i){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==d)t=this.amountToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o);t=this.amountToPrecision(e,a.Y.stringMul(i,r))}}else t=this.amountToPrecision(e,s);h.amount=t}else h.amount=this.amountToPrecision(e,s);"limit"!==t&&"ioc"!==t&&"limit-maker"!==t&&"stop-limit"!==t&&"stop-limit-fok"!==t||(h.price=this.priceToPrecision(e,o));const l=this.options.createOrderMethod,u=await this[l](this.extend(h,n)),f=this.safeString(u,"data");return this.safeOrder({info:u,id:f,timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,status:void 0,symbol:e,type:t,side:i,price:o,amount:s,filled:void 0,remaining:void 0,cost:void 0,trades:void 0,fee:void 0,clientOrderId:void 0,average:void 0},d)}async cancelOrder(e,t=void 0,i={}){const s=await this.privatePostOrderOrdersIdSubmitcancel({id:e});return this.extend(this.parseOrder(s),{id:e,status:"canceled"})}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue2(i,"clientOrderIds","client-order-ids");i=this.omit(i,["clientOrderIds","client-order-ids"]);const r={};void 0===s?r["order-ids"]=e:r["client-order-ids"]=s;const a=await this.privatePostOrderOrdersBatchcancel(this.extend(r,i));return this.parseCancelOrders(a)}parseCancelOrders(e){const t=this.safeString(e,"successes");let i;i=void 0!==t?t.split(","):this.safeList(e,"success",[]);const s=this.safeList2(e,"errors","failed",[]),r=[];for(let e=0;e<i.length;e++){const t=i[e];r.push(this.safeOrder({info:t,id:t,status:"canceled"}))}for(let e=0;e<s.length;e++){const t=s[e];r.push(this.safeOrder({info:t,id:this.safeString2(t,"order-id","order_id"),status:"failed",clientOrderId:this.safeString(t,"client-order-id")}))}return r}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;void 0!==e&&(s=this.market(e),i.symbol=s.id);const r=await this.privatePostOrderOrdersBatchCancelOpenOrders(this.extend(i,t)),a=this.safeDict(r,"data",{});return[this.safeOrder({info:a})]}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"addressTag"),r=this.safeString(e,"currency");t=this.safeCurrency(r,t);const a=this.safeCurrencyCode(r,t),o=this.safeString(e,"chain"),n=this.safeValue(t,"networks",{}),d=this.indexBy(n,"id"),h=this.safeValue(d,o,o),c=this.safeString(h,"network");return this.checkAddress(i),{currency:a,address:i,tag:s,network:c,info:e}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;(void 0===i||i>100)&&(i=100),await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={type:"deposit",from:0};void 0!==r&&(a.currency=r.id),void 0!==i&&(a.size=i);const o=await this.privateGetQueryDepositWithdraw(this.extend(a,s));return this.parseTransactions(o.data,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;(void 0===i||i>100)&&(i=100),await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a={type:"withdraw",from:0};void 0!==r&&(a.currency=r.id),void 0!==i&&(a.size=i);const o=await this.privateGetQueryDepositWithdraw(this.extend(a,s));return this.parseTransactions(o.data,r,t,i)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"created-at"),s=this.safeCurrencyCode(this.safeString(e,"currency"));let r=this.safeString(e,"type");"withdraw"===r&&(r="withdrawal");let o=this.safeString(e,"fee");return void 0!==o&&(o=a.Y.stringAbs(o)),{info:e,id:this.safeString2(e,"id","data"),txid:this.safeString(e,"tx-hash"),timestamp:i,datetime:this.iso8601(i),network:this.safeStringUpper(e,"chain"),address:this.safeString(e,"address"),addressTo:void 0,addressFrom:void 0,tag:this.safeString(e,"address-tag"),tagTo:void 0,tagFrom:void 0,type:r,amount:this.safeNumber(e,"amount"),currency:s,status:this.parseTransactionStatus(this.safeString(e,"state")),updated:this.safeInteger(e,"updated-at"),comment:void 0,internal:void 0,fee:{currency:s,cost:this.parseNumber(o),rate:void 0}}}parseTransactionStatus(e){return this.safeString({unknown:"failed",confirming:"pending",confirmed:"ok",safe:"ok",orphan:"failed",submitted:"pending",canceled:"canceled",reexamine:"pending",reject:"failed",pass:"pending","wallet-reject":"failed","confirm-error":"failed",repealed:"failed","wallet-transfer":"pending","pre-transfer":"pending"},e,e)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets(),this.checkAddress(i);const a=this.currency(e),o={address:i,amount:t,currency:a.id.toLowerCase()};void 0!==s&&(o["addr-tag"]=s);const n=this.safeValue(this.options,"networks",{});let d=this.safeStringUpper(r,"network");d=this.safeStringLower(n,d,d),void 0!==d&&(o.chain="erc20"===d?a.id+d:d+a.id,r=this.omit(r,"network"));const h=await this.privatePostDwWithdrawApiCreate(this.extend(o,r));return this.parseTransaction(h,a)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/";"market"===t?o+=t:"public"===t||"private"===t?o+=this.version:"v2Public"!==t&&"v2Private"!==t||(o+="v2"),o+="/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if("private"===t||"v2Private"===t){this.checkRequiredCredentials();const e=this.ymdhms(this.milliseconds(),"T");let t={SignatureMethod:"HmacSHA256",SignatureVersion:"2",AccessKeyId:this.apiKey,Timestamp:e};"POST"!==i&&(t=this.extend(t,d));const s=this.keysort(t);let h=this.urlencode(s);const c=[i,this.hostname,o,h].join("\n"),l=this.hmac(this.encode(c),this.encode(this.secret),n.s,"base64");h+="&"+this.urlencode({Signature:l}),o+="?"+h,"POST"===i?(a=this.json(d),r={"Content-Type":"application/json"}):r={"Content-Type":"application/x-www-form-urlencoded"}}else Object.keys(s).length&&(o+="?"+this.urlencode(s));return o=this.implodeParams(this.urls.api[t],{hostname:this.hostname})+o,{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&"status"in n){if("error"===this.safeString(n,"status")){const e=this.safeString(n,"err-code"),t=this.id+" "+o;this.throwBroadlyMatchedException(this.exceptions.broad,o,t),this.throwExactlyMatchedException(this.exceptions.exact,e,t);const i=this.safeString(n,"err-msg");throw this.throwExactlyMatchedException(this.exceptions.exact,i,t),new r.ExchangeError(t)}}}}
class c extends s.A{describe(){return this.deepExtend(super.describe(),{id:"hyperliquid",name:"Hyperliquid",countries:[],version:"v1",rateLimit:50,certified:!0,pro:!0,dex:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!0,option:!1,addMargin:!0,borrowCrossMargin:!1,borrowIsolatedMargin:!1,cancelAllOrders:!1,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!0,closeAllPositions:!1,closePosition:!1,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createReduceOnlyOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!0,editOrders:!0,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledAndClosedOrders:!0,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingRate:!1,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginMode:void 0,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenInterests:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:"emulated",fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!0,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!0,setMarginMode:!0,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},hostname:"hyperliquid.xyz",urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/b371bc6c-4a8c-489f-87f4-20a913dd8d4b",api:{public:"https://api.{hostname}",private:"https://api.{hostname}"},test:{public:"https://api.hyperliquid-testnet.xyz",private:"https://api.hyperliquid-testnet.xyz"},www:"https://hyperliquid.xyz",doc:"https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api",fees:"https://hyperliquid.gitbook.io/hyperliquid-docs/trading/fees",referral:"https://app.hyperliquid.xyz/"},api:{public:{post:{info:{cost:20,byType:{l2Book:2,allMids:2,clearinghouseState:2,orderStatus:2,spotClearinghouseState:2,exchangeStatus:2}}}},private:{post:{exchange:1}}},fees:{swap:{taker:this.parseNumber("0.00035"),maker:this.parseNumber("0.0001")},spot:{taker:this.parseNumber("0.00035"),maker:this.parseNumber("0.0001")}},requiredCredentials:{apiKey:!1,secret:!1,walletAddress:!0,privateKey:!0},exceptions:{exact:{},broad:{"Price must be divisible by tick size.":r.InvalidOrder,"Order must have minimum value of $10":r.InvalidOrder,"Insufficient margin to place order.":r.InsufficientFunds,"Reduce only order would increase position.":r.InvalidOrder,"Post only order would have immediately matched,":r.InvalidOrder,"Order could not immediately match against any resting orders.":r.InvalidOrder,"Invalid TP/SL price.":r.InvalidOrder,"No liquidity available for market order.":r.InvalidOrder,"Order was never placed, already canceled, or filled.":r.OrderNotFound,"User or API Wallet ":r.InvalidOrder,"Order has invalid size":r.InvalidOrder,"Order price cannot be more than 80% away from the reference price":r.InvalidOrder,"Order has zero size.":r.InvalidOrder,"Insufficient spot balance asset":r.InsufficientFunds,"Insufficient balance for withdrawal":r.InsufficientFunds,"Insufficient balance for token transfer":r.InsufficientFunds}},precisionMode:o.kb,commonCurrencies:{},options:{defaultType:"swap",sandboxMode:!1,defaultSlippage:.05,zeroAddress:"0x0000000000000000000000000000000000000000"},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:{max:1e3},fetchMyTrades:{marginMode:!1,limit:2e3,daysBack:void 0,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:2e3,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:2e3,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:2e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:5e3}},spot:{extends:"default"},forPerps:{extends:"default",createOrder:{stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0}},swap:{linear:{extends:"forPerps"},inverse:{extends:"forPerps"}},future:{linear:{extends:"forPerps"},inverse:{extends:"forPerps"}}}})}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}async fetchCurrencies(e={}){const t=await this.publicPostInfo(this.extend({type:"meta"},e)),i=this.safeList(t,"universe",[]),s={};for(let e=0;e<i.length;e++){const t=this.safeDict(i,e,{}),r=e,a=this.safeString(t,"name"),o=this.safeCurrencyCode(a);s[o]={id:r,name:a,code:o,precision:void 0,info:t,active:void 0,deposit:void 0,withdraw:void 0,networks:void 0,fee:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}}}}return s}async fetchMarkets(e={}){const t=[this.fetchSwapMarkets(e),this.fetchSpotMarkets(e)],i=await Promise.all(t),s=i[0],r=i[1];return this.arrayConcat(s,r)}async fetchSwapMarkets(e={}){const t=await this.publicPostInfo(this.extend({type:"metaAndAssetCtxs"},e)),i=this.safeDict(t,0,{}),s=this.safeList(i,"universe",[]),r=this.safeList(t,1,[]),a=[];for(let e=0;e<s.length;e++){const t=this.extend(this.safeDict(s,e,{}),this.safeDict(r,e,{}));t.baseId=e,a.push(t)}return this.parseMarkets(a)}calculatePricePrecision(e,t,i){let s=0;const r=this.numberToString(e);if(void 0===r)return 0;const o=r.split(".");if(a.Y.stringEq(r,"0")){const e=5,r=0;s=Math.min(i-t,e-r)}else if(a.Y.stringGt(r,"0")&&a.Y.stringLt(r,"1")){const e=5,r=this.safeString(o,1,"");let a=0;for(;a<=r.length&&"0"===r[a];)a+=1;s=a+e,s=Math.min(i-t,s)}else{const e=this.safeString(o,0,""),r=Math.max(5,e.length);s=Math.min(i-t,r-e.length)}return this.parseToInt(s)}async fetchSpotMarkets(e={}){const t=await this.publicPostInfo(this.extend({type:"spotMetaAndAssetCtxs"},e)),i=this.safeDict(t,0,{}),s=this.safeList(t,1,[]),r=this.safeList(i,"universe",[]),a=this.safeList(i,"tokens",[]),o=[];for(let e=0;e<r.length;e++){const t=this.safeDict(r,e,{}),i=this.safeInteger(t,"index"),n=this.safeDict(s,i,{}),d=this.safeString(t,"name"),h=this.safeDict(this.fees,"spot",{}),c=this.safeNumber(h,"taker"),l=this.safeNumber(h,"maker"),u=this.safeList(t,"tokens",[]),f=this.safeInteger(u,0),p=this.safeInteger(u,1),m=this.safeDict(a,f,{}),g=this.safeDict(a,p,{}),v=this.safeString(m,"name"),y=this.safeString(g,"name"),w=this.safeCurrencyCode(v),b=this.safeCurrencyCode(y),k=w+"/"+b,S=this.safeDict(m,"spec",m),O=this.safeString(S,"szDecimals"),T=parseInt(O),P=this.safeNumber(n,"midPx");let I=0;void 0!==P&&(I=this.calculatePricePrecision(P,T,8));const M=this.numberToString(I),x=this.numberToString(i+1e4);o.push(this.safeMarketStructure({id:d,symbol:k,base:w,quote:b,settle:void 0,baseId:x,quoteId:y,settleId:void 0,type:"spot",spot:!0,subType:void 0,margin:void 0,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,taker:c,maker:l,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(O)),price:this.parseNumber(this.parsePrecision(M))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.parseNumber("10"),max:void 0}},created:void 0,info:this.extend(n,t)}))}return o}parseMarket(e){const t="USDC",i=this.safeString(e,"name"),s=this.safeCurrencyCode(t),r=this.safeString(e,"baseId"),a="USDC",o=this.safeCurrencyCode(a);let n=i+"/"+s;const d=!0,h=!0;n=n+":"+o;const c=this.safeDict(this.fees,"swap",{}),l=this.safeNumber(c,"taker"),u=this.safeNumber(c,"maker"),f=this.safeString(e,"szDecimals"),p=parseInt(f),m=this.safeNumber(e,"markPx",0);let g=0;void 0!==m&&(g=this.calculatePricePrecision(m,p,6));const v=this.numberToString(g),y=this.safeBool(e,"isDelisted");let w=!0;return void 0!==y&&(w=!y),this.safeMarketStructure({id:r,symbol:n,base:i,quote:s,settle:o,baseId:r,quoteId:t,settleId:a,type:"swap",spot:!1,margin:void 0,swap:h,future:!1,option:!1,active:w,contract:d,linear:!0,inverse:!1,taker:l,maker:u,contractSize:this.parseNumber("1"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(f)),price:this.parseNumber(this.parsePrecision(v))},limits:{leverage:{min:void 0,max:this.safeInteger(e,"maxLeverage")},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.parseNumber("10"),max:void 0}},created:void 0,info:e})}async fetchBalance(e={}){let t,i;[t,e]=this.handlePublicAddress("fetchBalance",e),[i,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const s={type:"spot"===i?"spotClearinghouseState":"clearinghouseState",user:t},r=await this.publicPostInfo(this.extend(s,e)),a=this.safeList(r,"balances");if(void 0!==a){const e={info:r};for(let t=0;t<a.length;t++){const i=a[t],s=this.safeCurrencyCode(this.safeString(i,"coin")),r=this.account(),o=this.safeString(i,"total"),n=this.safeString(i,"hold");r.total=o,r.used=n,e[s]=r}return this.safeBalance(e)}const o=this.safeDict(r,"marginSummary",{}),n={info:r,USDC:{total:this.safeNumber(o,"accountValue"),free:this.safeNumber(r,"withdrawable")}},d=this.safeInteger(r,"time");return n.timestamp=d,n.datetime=this.iso8601(d),this.safeBalance(n)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={type:"l2Book",coin:s.swap?s.base:s.id},a=await this.publicPostInfo(this.extend(r,i)),o=this.safeList(a,"levels",[]),n={bids:this.safeList(o,0,[]),asks:this.safeList(o,1,[])},d=this.safeInteger(a,"time");return this.parseOrderBook(n,s.symbol,d,"bids","asks","px","sz")}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);let i=[];const s=this.safeString(t,"type");t=this.omit(t,"type"),i="spot"===s?await this.fetchSpotMarkets(t):"swap"===s?await this.fetchSwapMarkets(t):await this.fetchMarkets(t);const r={};for(let e=0;e<i.length;e++){const t=i[e],s=t.info,a=this.parseTicker(s,t);r[this.safeString(a,"symbol")]=a}return this.filterByArrayTickers(r,"symbol",e)}async fetchFundingRates(e=void 0,t={}){const i=await this.publicPostInfo(this.extend({type:"metaAndAssetCtxs"},t)),s=this.safeDict(i,0,{}),r=this.safeList(s,"universe",[]),a=this.safeList(i,1,[]),o=[];for(let e=0;e<r.length;e++){const t=this.extend(this.safeDict(r,e,{}),this.safeDict(a,e,{}));o.push(t)}return this.parseFundingRates(o,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"name"),s=this.coinToMarketId(i),r=this.safeSymbol(s,t),a=this.safeNumber(e,"funding"),o=this.safeNumber(e,"markPx"),n=this.safeNumber(e,"oraclePx"),d=60*(Math.floor(this.milliseconds()/60/60/1e3)+1)*60*1e3;return{info:e,symbol:r,markPrice:o,indexPrice:n,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:a,fundingTimestamp:d,fundingDatetime:this.iso8601(d),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:"1h"}}parseTicker(e,t=void 0){const i=this.safeList(e,"impactPxs");return this.safeTicker({symbol:t.symbol,timestamp:void 0,datetime:void 0,previousClose:this.safeNumber(e,"prevDayPx"),close:this.safeNumber(e,"midPx"),bid:this.safeNumber(i,0),ask:this.safeNumber(i,1),quoteVolume:this.safeNumber(e,"dayNtlVlm"),info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeInteger(r,"until",this.milliseconds());let n=void 0===i;const d=i;if(void 0===i)if(void 0!==s){const e=1e3*this.parseTimeframe(t);i=this.sum(o,e*s*-1),n=!1}else i=0;r=this.omit(r,["until"]);const h={type:"candleSnapshot",req:{coin:a.swap?a.base:a.id,interval:this.safeString(this.timeframes,t,t),startTime:i,endTime:o}},c=await this.publicPostInfo(this.extend(h,r));return this.parseOHLCVs(c,a,t,d,s,n)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber(e,"v")]}async fetchTrades(e,t=void 0,i=void 0,s={}){let r;[r,s]=this.handlePublicAddress("fetchTrades",s),await this.loadMarkets();const a=this.safeMarket(e),o={user:r};void 0!==t?(o.type="userFillsByTime",o.startTime=t):o.type="userFills";const n=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==n&&(o.endTime=n);const d=await this.publicPostInfo(this.extend(o,s));return this.parseTrades(d,a,t,i)}amountToPrecision(e,t){const i=this.market(e);return this.decimalToPrecision(t,o.D_,i.precision.amount,this.precisionMode,this.paddingMode)}priceToPrecision(e,t){const i=this.market(e),s=this.numberToString(t).split(".")[0],r=Math.max(5,s.length),a=this.decimalToPrecision(t,o.D_,r,o.v,this.paddingMode),n=(i.spot?8:6)-this.precisionFromString(this.safeString(i.precision,"amount"));return this.decimalToPrecision(a,o.D_,n,o.fv,this.paddingMode)}hashMessage(e){return"0x"+this.hash(e,n.lY,"hex")}signHash(e,t){const i=(0,h.h1)(e.slice(-64),t.slice(-64),d.bI,void 0);return{r:"0x"+i.r,s:"0x"+i.s,v:this.sum(27,i.v)}}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}constructPhantomAgent(e,t=!0){return{source:t?"b":"a",connectionId:e}}actionHash(e,t,i){const s=this.packb(e);let r=this.binaryToBase16(s);return r+="00000"+this.intToBase16(i),void 0===t?r+="00":(r+="01",r+=t),this.hash(this.base16ToBinary(r),n.lY,"binary")}signL1Action(e,t,i=void 0){const s=this.actionHash(e,i,t),r=this.safeBool(this.options,"sandboxMode",!1),a=this.constructPhantomAgent(s,r),o={chainId:1337,name:"Exchange",verifyingContract:this.safeString(this.options,"zeroAddress"),version:"1"},n=this.ethEncodeStructuredData(o,{Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]},a);return this.signMessage(n,this.privateKey)}signUserSignedAction(e,t){const i={chainId:421614,name:"HyperliquidSignTransaction",verifyingContract:this.safeString(this.options,"zeroAddress"),version:"1"},s=this.ethEncodeStructuredData(i,e,t);return this.signMessage(s,this.privateKey)}buildUsdSendSig(e){return this.signUserSignedAction({"HyperliquidTransaction:UsdSend":[{name:"hyperliquidChain",type:"string"},{name:"destination",type:"string"},{name:"amount",type:"string"},{name:"time",type:"uint64"}]},e)}buildUsdClassSendSig(e){return this.signUserSignedAction({"HyperliquidTransaction:UsdClassTransfer":[{name:"hyperliquidChain",type:"string"},{name:"amount",type:"string"},{name:"toPerp",type:"bool"},{name:"nonce",type:"uint64"}]},e)}buildWithdrawSig(e){return this.signUserSignedAction({"HyperliquidTransaction:Withdraw":[{name:"hyperliquidChain",type:"string"},{name:"destination",type:"string"},{name:"amount",type:"string"},{name:"time",type:"uint64"}]},e)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const[o,n]=this.parseCreateEditOrderArgs(void 0,e,t,i,s,r,a);return(await this.createOrders([o],n))[0]}async createOrders(e,t={}){await this.loadMarkets();const i=this.createOrdersRequest(e,t),s=await this.privatePostExchange(i),r=this.safeDict(s,"response",{}),a=this.safeDict(r,"data",{}),o=this.safeList(a,"statuses",[]);return this.parseOrders(o,void 0)}createOrdersRequest(e,t={}){this.checkRequiredCredentials();let i=this.safeString(this.options,"defaultSlippage");i=this.safeString(t,"slippage",i);let s=!1;for(let t=0;t<e.length;t++){const i=e[t],r=this.safeDict(i,"params",{});void 0!==this.safeString2(r,"clientOrderId","client_id")&&(s=!0)}if(s)for(let t=0;t<e.length;t++){const i=e[t],s=this.safeDict(i,"params",{});if(void 0===this.safeString2(s,"clientOrderId","client_id"))throw new r.ArgumentsRequired(this.id+" createOrders() all orders must have clientOrderId if at least one has a clientOrderId")}t=this.omit(t,["slippage","clientOrderId","client_id","slippage","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice","timeInForce"]);const o=this.milliseconds(),n=[];for(let t=0;t<e.length;t++){const s=e[t],o=this.safeString(s,"symbol"),d=this.market(o),h=d.symbol,c="MARKET"===this.safeStringUpper(s,"type"),l="BUY"===this.safeStringUpper(s,"side"),u=this.safeString(s,"amount"),f=this.safeString(s,"price");let p=this.safeDict(s,"params",{});const m=this.safeString2(p,"clientOrderId","client_id"),g=this.safeString(p,"slippage",i);let v=c?"ioc":"gtc";this.safeBool(p,"postOnly",!1)&&(v="alo");let y=this.safeStringLower(p,"timeInForce",v);y=this.capitalize(y);let w=this.safeString2(p,"triggerPrice","stopPrice");const b=this.safeString(p,"stopLossPrice",w),k=this.safeString(p,"takeProfitPrice"),S=b||k;let O;if(c){if(void 0===f)throw new r.ArgumentsRequired(this.id+" market orders require price to calculate the max slippage price. Default slippage can be set in options (default is 5%).");O=l?a.Y.stringMul(f,a.Y.stringAdd("1",g)):a.Y.stringMul(f,a.Y.stringSub("1",g)),O=this.priceToPrecision(h,O)}else O=this.priceToPrecision(h,f);const T=this.amountToPrecision(h,u),P=this.safeBool(p,"reduceOnly",!1),I={};if(S){let e=!1;void 0!==k?(w=this.priceToPrecision(h,k),e=!0):w=this.priceToPrecision(h,b),I.trigger={isMarket:c,triggerPx:w,tpsl:e?"tp":"sl"}}else I.limit={tif:y};p=this.omit(p,["clientOrderId","slippage","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice","timeInForce","client_id","reduceOnly","postOnly"]);const M={a:this.parseToInt(d.baseId),b:l,p:O,s:T,r:P,t:I};void 0!==m&&(M.c=m),n.push(M)}const d=this.formatVaultAddress(this.safeString(t,"vaultAddress")),h={type:"order",orders:n,grouping:"na"};void 0===d&&(h.brokerCode=1);const c={action:h,nonce:o,signature:this.signL1Action(h,o,d)};return void 0!==d&&(t=this.omit(t,"vaultAddress"),c.vaultAddress=d),c}async cancelOrder(e,t=void 0,i={}){const s=await this.cancelOrders([e],t,i);return this.safeDict(s,0)}async cancelOrders(e,t=void 0,i={}){if(this.checkRequiredCredentials(),void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t);let a=this.safeValue2(i,"clientOrderId","client_id");i=this.omit(i,["clientOrderId","client_id"]);const o=this.milliseconds(),n={nonce:o},d=[],h={type:"",cancels:[]},c=this.parseToNumeric(s.baseId);if(void 0!==a){Array.isArray(a)||(a=[a]),h.type="cancelByCloid";for(let e=0;e<a.length;e++)d.push({asset:c,cloid:a[e]})}else{h.type="cancel";for(let t=0;t<e.length;t++)d.push({a:c,o:this.parseToNumeric(e[t])})}h.cancels=d;const l=this.formatVaultAddress(this.safeString(i,"vaultAddress")),u=this.signL1Action(h,o,l);n.action=h,n.signature=u,void 0!==l&&(i=this.omit(i,"vaultAddress"),n.vaultAddress=l);const f=await this.privatePostExchange(n),p=this.safeDict(f,"response"),m=this.safeDict(p,"data"),g=this.safeList(m,"statuses"),v=[];for(let e=0;e<g.length;e++){const t=g[e];v.push(this.safeOrder({info:t,status:t}))}return v}async cancelOrdersForSymbols(e,t={}){this.checkRequiredCredentials(),await this.loadMarkets();const i=this.milliseconds(),s={nonce:i},a=[],o={type:"",cancels:[]};let n=!1;for(let t=0;t<e.length;t++){const i=e[t],s=this.safeString(i,"clientOrderId");void 0!==s&&(n=!0);const o=this.safeString(i,"id"),d=this.safeString(i,"symbol");if(void 0===d)throw new r.ArgumentsRequired(this.id+" cancelOrdersForSymbols() requires a symbol argument in each order");if(void 0!==o&&n)throw new r.BadRequest(this.id+" cancelOrdersForSymbols() all orders must have either id or clientOrderId");const h=n?"asset":"a",c=n?"cloid":"o",l=this.market(d),u={};u[h]=this.parseToNumeric(l.baseId),u[c]=n?s:this.parseToNumeric(o),a.push(u)}o.type=n?"cancelByCloid":"cancel",o.cancels=a;const d=this.formatVaultAddress(this.safeString(t,"vaultAddress")),h=this.signL1Action(o,i,d);s.action=o,s.signature=h,void 0!==d&&(t=this.omit(t,"vaultAddress"),s.vaultAddress=d);return await this.privatePostExchange(s)}async cancelAllOrdersAfter(e,t={}){this.checkRequiredCredentials(),await this.loadMarkets(),t=this.omit(t,["clientOrderId","client_id"]);const i=this.milliseconds(),s={nonce:i},r={type:"scheduleCancel",time:i+e},a=this.formatVaultAddress(this.safeString(t,"vaultAddress")),o=this.signL1Action(r,i,a);s.action=r,s.signature=o,void 0!==a&&(t=this.omit(t,"vaultAddress"),s.vaultAddress=a);return await this.privatePostExchange(s)}editOrdersRequest(e,t={}){this.checkRequiredCredentials();let i=!1;for(let t=0;t<e.length;t++){const s=e[t],r=this.safeDict(s,"params",{});void 0!==this.safeString2(r,"clientOrderId","client_id")&&(i=!0)}if(i)for(let t=0;t<e.length;t++){const i=e[t],s=this.safeDict(i,"params",{});if(void 0===this.safeString2(s,"clientOrderId","client_id"))throw new r.ArgumentsRequired(this.id+" editOrders() all orders must have clientOrderId if at least one has a clientOrderId")}t=this.omit(t,["slippage","clientOrderId","client_id","slippage","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice","timeInForce"]);const s=[];for(let t=0;t<e.length;t++){const i=e[t],r=this.safeString(i,"id"),o=this.safeString(i,"symbol"),n=this.market(o),d=n.symbol,h="MARKET"===this.safeStringUpper(i,"type"),c="BUY"===this.safeStringUpper(i,"side"),l=this.safeString(i,"amount"),u=this.safeString(i,"price");let f=this.safeDict(i,"params",{});const p=this.safeString(this.options,"defaultSlippage"),m=this.safeString(f,"slippage",p);let g=h?"ioc":"gtc";this.safeBool(f,"postOnly",!1)&&(g="alo");let v=this.safeStringLower(f,"timeInForce",g);v=this.capitalize(v);const y=this.safeString2(f,"clientOrderId","client_id");let w=this.safeString2(f,"triggerPrice","stopPrice");const b=this.safeString(f,"stopLossPrice",w),k=this.safeString(f,"takeProfitPrice"),S=b||k,O=this.safeBool(f,"reduceOnly",!1);f=this.omit(f,["slippage","timeInForce","triggerPrice","stopLossPrice","takeProfitPrice","clientOrderId","client_id","postOnly","reduceOnly"]);let T=u.toString();T=h?c?a.Y.stringMul(u.toString(),a.Y.stringAdd("1",m)):a.Y.stringMul(u.toString(),a.Y.stringSub("1",m)):this.priceToPrecision(d,u.toString());const P=this.amountToPrecision(d,l),I={};if(S){let e=!1;void 0!==k?(w=this.priceToPrecision(d,k),e=!0):w=this.priceToPrecision(d,b),I.trigger={isMarket:h,triggerPx:w,tpsl:e?"tp":"sl"}}else I.limit={tif:v};void 0===w&&(w="0");const M={a:this.parseToInt(n.baseId),b:c,p:T,s:P,r:O,t:I};void 0!==y&&(M.c=y);const x={oid:this.parseToInt(r),order:M};s.push(x)}const o=this.milliseconds(),n={type:"batchModify",modifies:s},d=this.formatVaultAddress(this.safeString(t,"vaultAddress")),h={action:n,nonce:o,signature:this.signL1Action(n,o,d)};return void 0!==d&&(t=this.omit(t,"vaultAddress"),h.vaultAddress=d),h}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" editOrder() requires an id argument");const[d,h]=this.parseCreateEditOrderArgs(e,t,i,s,a,o,n);return(await this.editOrders([d],h))[0]}async editOrders(e,t={}){await this.loadMarkets();const i=this.editOrdersRequest(e,t),s=await this.privatePostExchange(i),r=this.safeDict(s,"response",{}),a=this.safeDict(r,"data",{}),o=this.safeList(a,"statuses",[]);return this.parseOrders(o)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");const a=this.market(e),o={type:"fundingHistory",coin:a.base};if(void 0!==t)o.startTime=t;else{const e=void 0===i?500:i;o.startTime=this.milliseconds()-60*e*60*1e3}const n=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==n&&(o.endTime=n);const d=await this.publicPostInfo(this.extend(o,s)),h=[];for(let e=0;e<d.length;e++){const t=d[e],i=this.safeInteger(t,"time");h.push({info:t,symbol:this.safeSymbol(void 0,a),fundingRate:this.safeNumber(t,"fundingRate"),timestamp:i,datetime:this.iso8601(i)})}const c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r,a;[r,s]=this.handlePublicAddress("fetchOpenOrders",s),[a,s]=this.handleOptionAndParams(s,"fetchOpenOrders","method","frontendOpenOrders"),await this.loadMarkets();const o=this.safeMarket(e),n={type:a,user:r},d=await this.publicPostInfo(this.extend(n,s)),h=[];for(let e=0;e<d.length;e++){const t=d[e],i={};void 0===this.safeString(t,"status")&&(i.ccxtStatus="open"),h.push(this.extend(t,i))}return this.parseOrders(h,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchOrders(e,void 0,void 0,s),a=this.filterByArray(r,"status",["closed"],!1);return this.filterBySymbolSinceLimit(a,e,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchOrders(e,void 0,void 0,s),a=this.filterByArray(r,"status",["canceled"],!1);return this.filterBySymbolSinceLimit(a,e,t,i)}async fetchCanceledAndClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchOrders(e,void 0,void 0,s),a=this.filterByArray(r,"status",["canceled","closed","rejected"],!1);return this.filterBySymbolSinceLimit(a,e,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){let r;[r,s]=this.handlePublicAddress("fetchOrders",s),await this.loadMarkets();const a=this.safeMarket(e),o={type:"historicalOrders",user:r},n=await this.publicPostInfo(this.extend(o,s));return this.parseOrders(n,a,t,i)}async fetchOrder(e,t=void 0,i={}){let s;[s,i]=this.handlePublicAddress("fetchOrder",i),await this.loadMarkets();const r=this.safeMarket(t),a={type:"orderStatus",oid:e.length>=34?e:this.parseToNumeric(e),user:s},o=await this.publicPostInfo(this.extend(a,i)),n=this.safeDict(o,"order");return this.parseOrder(n,r)}parseOrder(e,t=void 0){let i=this.safeDictN(e,["order","resting","filled"]);void 0===i&&(i=e);const s=this.safeString(i,"coin");let r;void 0!==s&&(r=this.coinToMarketId(s));const o=(t=void 0===this.safeString(i,"id")?this.safeMarket(r,void 0):this.safeMarket(r,t)).symbol,n=this.safeInteger(i,"timestamp"),d=this.safeString2(e,"status","ccxtStatus");e=this.omit(e,["ccxtStatus"]);let h=this.safeString(i,"side");void 0!==h&&(h="A"===h?"sell":"buy");const c=this.safeString2(i,"origSz","totalSz"),l=this.safeString(i,"sz");return this.safeOrder({info:e,id:this.safeString(i,"oid"),clientOrderId:this.safeString(i,"cloid"),timestamp:n,datetime:this.iso8601(n),lastTradeTimestamp:void 0,lastUpdateTimestamp:this.safeInteger(e,"statusTimestamp"),symbol:o,type:this.parseOrderType(this.safeStringLower(i,"orderType")),timeInForce:this.safeStringUpper(i,"tif"),postOnly:void 0,reduceOnly:this.safeBool(i,"reduceOnly"),side:h,price:this.safeString(i,"limitPx"),triggerPrice:this.safeBool(i,"isTrigger")?this.safeNumber(i,"triggerPx"):void 0,amount:c,cost:void 0,average:this.safeString(i,"avgPx"),filled:a.Y.stringSub(c,l),remaining:l,status:this.parseOrderStatus(d),fee:void 0,trades:void 0},t)}parseOrderStatus(e){return this.safeString({triggered:"open",filled:"closed",open:"open",canceled:"canceled",rejected:"rejected",marginCanceled:"canceled"},e,e)}parseOrderType(e){return this.safeString({"stop limit":"limit","stop market":"market"},e,e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;[r,s]=this.handlePublicAddress("fetchMyTrades",s),await this.loadMarkets();const a=this.safeMarket(e),o={user:r};void 0!==t?(o.type="userFillsByTime",o.startTime=t):o.type="userFills";const n=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==n&&(o.endTime=n);const d=await this.publicPostInfo(this.extend(o,s));return this.parseTrades(d,a,t,i)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeString(e,"px"),r=this.safeString(e,"sz"),a=this.safeString(e,"coin"),o=this.coinToMarketId(a),n=(t=this.safeMarket(o,void 0)).symbol,d=this.safeString(e,"tid");let h=this.safeString(e,"side");void 0!==h&&(h="A"===h?"sell":"buy");const c=this.safeString(e,"fee");return this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:n,id:d,order:this.safeString(e,"oid"),type:void 0,side:h,takerOrMaker:void 0,price:s,amount:r,cost:void 0,fee:{cost:c,currency:this.safeString(e,"feeToken"),rate:void 0}},t)}async fetchPosition(e,t={}){const i=await this.fetchPositions([e],t);return this.safeDict(i,0,{})}async fetchPositions(e=void 0,t={}){let i;await this.loadMarkets(),[i,t]=this.handlePublicAddress("fetchPositions",t),e=this.marketSymbols(e);const s={type:"clearinghouseState",user:i},r=await this.publicPostInfo(this.extend(s,t)),a=this.safeList(r,"assetPositions",[]),o=[];for(let e=0;e<a.length;e++)o.push(this.parsePosition(a[e],void 0));return this.filterByArrayPositions(o,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeDict(e,"position",{}),s=this.safeString(i,"coin"),r=this.coinToMarketId(s),o=this.safeMarket(r,void 0).symbol,n=this.safeDict(i,"leverage",{}),d=this.safeString(n,"type"),h="isolated"===d,c=this.safeString(i,"szi");let l,u=c;void 0!==u&&(l=a.Y.stringGt(c,"0")?"long":"short",u=a.Y.stringAbs(u));const f=this.safeString(i,"unrealizedPnl"),p=a.Y.stringAbs(f),m=this.safeString(i,"marginUsed"),g=a.Y.stringMul(a.Y.stringDiv(p,m),"100");return this.safePosition({info:e,id:void 0,symbol:o,timestamp:void 0,datetime:void 0,isolated:h,hedged:void 0,side:l,contracts:this.parseNumber(u),contractSize:void 0,entryPrice:this.safeNumber(i,"entryPx"),markPrice:void 0,notional:this.safeNumber(i,"positionValue"),leverage:this.safeNumber(n,"value"),collateral:this.safeNumber(i,"marginUsed"),initialMargin:this.parseNumber(m),maintenanceMargin:void 0,initialMarginPercentage:void 0,maintenanceMarginPercentage:void 0,unrealizedPnl:this.parseNumber(f),liquidationPrice:this.safeNumber(i,"liquidationPx"),marginMode:d,percentage:this.parseNumber(g)})}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=this.safeInteger(i,"leverage");if(void 0===a)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a leverage parameter");const o=this.parseToInt(s.baseId),n="cross"===e,d=this.milliseconds();i=this.omit(i,["leverage"]);const h={type:"updateLeverage",asset:o,isCross:n,leverage:a};let c=this.safeString(i,"vaultAddress");void 0!==c&&(i=this.omit(i,"vaultAddress"),c.startsWith("0x")&&(c=c.replace("0x","")));const l={action:h,nonce:d,signature:this.signL1Action(h,d,c)};void 0!==c&&(l.vaultAddress=c);return await this.privatePostExchange(l)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a="cross"===this.safeString(i,"marginMode","cross"),o=this.parseToInt(s.baseId),n=this.milliseconds();i=this.omit(i,"marginMode");const d={type:"updateLeverage",asset:o,isCross:a,leverage:e},h=this.formatVaultAddress(this.safeString(i,"vaultAddress")),c={action:d,nonce:n,signature:this.signL1Action(d,n,h)};void 0!==h&&(i=this.omit(i,"vaultAddress"),c.vaultAddress=h);return await this.privatePostExchange(c)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"reduce",i)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),o=this.parseToInt(r.baseId);let n=this.parseToInt(a.Y.stringMul(this.amountToPrecision(e,t),"1000000"));"reduce"===i&&(n=-n);const d=this.milliseconds(),h={type:"updateIsolatedMargin",asset:o,isBuy:!0,ntli:n},c=this.formatVaultAddress(this.safeString(s,"vaultAddress")),l={action:h,nonce:d,signature:this.signL1Action(h,d,c)};void 0!==c&&(s=this.omit(s,"vaultAddress"),l.vaultAddress=c);const u=await this.privatePostExchange(l);return this.extend(this.parseMarginModification(u,r),{code:this.safeString(u,"status")})}parseMarginModification(e,t=void 0){return{info:e,symbol:this.safeSymbol(void 0,t),type:void 0,marginMode:"isolated",amount:void 0,total:void 0,code:this.safeString(t,"settle"),status:void 0,timestamp:void 0,datetime:void 0}}async transfer(e,t,i,s,a={}){this.checkRequiredCredentials(),await this.loadMarkets();const o=this.safeBool(this.options,"sandboxMode"),n=this.milliseconds();if(this.inArray(i,["spot","swap","perp"])){if(!this.inArray(s,["spot","swap","perp"]))throw new r.NotSupported(this.id+" transfer() only support spot <> swap transfer");let e=this.numberToString(t);const i=this.formatVaultAddress(this.safeString(a,"vaultAddress"));a=this.omit(a,"vaultAddress"),void 0!==i&&(e=e+" subaccount:"+i);const d="perp"===s||"swap"===s,h={hyperliquidChain:o?"Testnet":"Mainnet",amount:e,toPerp:d,nonce:n},c=this.buildUsdClassSendSig(h),l={action:{hyperliquidChain:h.hyperliquidChain,signatureChainId:"0x66eee",type:"usdClassTransfer",amount:e,toPerp:d,nonce:n},nonce:n,signature:c};void 0!==i&&(l.vaultAddress=i);return await this.privatePostExchange(l)}if(this.checkAddress(s),void 0!==e&&"USDC"!==(e=e.toUpperCase()))throw new r.NotSupported(this.id+" transfer() only support USDC");const d={hyperliquidChain:o?"Testnet":"Mainnet",destination:s,amount:this.numberToString(t),time:n},h=this.buildUsdSendSig(d),c={action:{hyperliquidChain:d.hyperliquidChain,signatureChainId:"0x66eee",destination:s,amount:t.toString(),time:n,type:"usdSend"},nonce:n,signature:h},l=await this.privatePostExchange(c);return this.parseTransfer(l)}parseTransfer(e,t=void 0){return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:void 0,amount:void 0,fromAccount:void 0,toAccount:void 0,status:"ok"}}async withdraw(e,t,i,s=void 0,a={}){if(this.checkRequiredCredentials(),await this.loadMarkets(),this.checkAddress(i),void 0!==e&&"USDC"!==(e=e.toUpperCase()))throw new r.NotSupported(this.id+" withdraw() only support USDC");const o=this.formatVaultAddress(this.safeString(a,"vaultAddress"));a=this.omit(a,"vaultAddress");const n=this.milliseconds();let d,h={};if(void 0!==o)h={type:"vaultTransfer",vaultAddress:"0x"+o,isDeposit:!1,usd:t},d=this.signL1Action(h,n);else{const e={hyperliquidChain:this.safeBool(this.options,"sandboxMode",!1)?"Testnet":"Mainnet",destination:i,amount:t.toString(),time:n};d=this.buildWithdrawSig(e),h={hyperliquidChain:e.hyperliquidChain,signatureChainId:"0x66eee",destination:i,amount:t.toString(),time:n,type:"withdraw3"}}const c={action:h,nonce:n,signature:d},l=await this.privatePostExchange(c);return this.parseTransaction(l)}parseTransaction(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeDict(e,"delta",{});let r;const a=this.safeInteger(s,"fee");let o;void 0!==a&&(r={currency:"USDC",cost:a});const n=this.safeString(s,"type");return void 0!==n&&(o="internalTransfer"===n),{info:e,id:void 0,txid:this.safeString(e,"hash"),timestamp:i,datetime:this.iso8601(i),network:void 0,address:void 0,addressTo:this.safeString(s,"destination"),addressFrom:this.safeString(s,"user"),tag:void 0,tagTo:void 0,tagFrom:void 0,type:void 0,amount:this.safeInteger(s,"usdc"),currency:void 0,status:this.safeString(e,"status"),updated:void 0,comment:void 0,internal:o,fee:r}}async fetchTradingFee(e,t={}){let i;await this.loadMarkets(),[i,t]=this.handlePublicAddress("fetchTradingFee",t);const s=this.market(e),r={type:"userFees",user:i},a=await this.publicPostInfo(this.extend(r,t)),o={userCrossRate:this.safeString(a,"userCrossRate"),userAddRate:this.safeString(a,"userAddRate")};return this.parseTradingFee(o,s)}parseTradingFee(e,t=void 0){return{info:e,symbol:this.safeSymbol(void 0,t),maker:this.safeNumber(e,"userAddRate"),taker:this.safeNumber(e,"userCrossRate"),percentage:void 0,tierBased:void 0}}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handlePublicAddress("fetchLedger",s);const a={type:"userNonFundingLedgerUpdates",user:r};void 0!==t&&(a.startTime=t);const o=this.safeInteger(s,"until");void 0!==o&&(a.endTime=o,s=this.omit(s,["until"]));const n=await this.publicPostInfo(this.extend(a,s));return this.parseLedger(n,void 0,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeDict(e,"delta",{});let r;const a=this.safeInteger(s,"fee");void 0!==a&&(r={currency:"USDC",cost:a});const o=this.safeString(s,"type"),n=this.safeString(s,"usdc");return this.safeLedgerEntry({info:e,id:this.safeString(e,"hash"),direction:void 0,account:void 0,referenceAccount:this.safeString(s,"user"),referenceId:this.safeString(e,"hash"),type:this.parseLedgerEntryType(o),currency:void 0,amount:this.parseNumber(n),timestamp:i,datetime:this.iso8601(i),before:void 0,after:void 0,status:void 0,fee:r},t)}parseLedgerEntryType(e){return this.safeString({internalTransfer:"transfer",accountClassTransfer:"transfer"},e,e)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handlePublicAddress("fetchDepositsWithdrawals",s);const a={type:"userNonFundingLedgerUpdates",user:r};void 0!==t&&(a.startTime=t);const o=this.safeInteger(s,"until");void 0!==o&&(a.endTime=o,s=this.omit(s,["until"]));const n=await this.publicPostInfo(this.extend(a,s)),d=this.extractTypeFromDelta(n),h=this.filterByArray(d,"type",["deposit"],!1);return this.parseTransactions(h,void 0,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handlePublicAddress("fetchDepositsWithdrawals",s);const a={type:"userNonFundingLedgerUpdates",user:r};void 0!==t&&(a.startTime=t);const o=this.safeInteger(s,"until");void 0!==o&&(a.endTime=o,s=this.omit(s,["until"]));const n=await this.publicPostInfo(this.extend(a,s)),d=this.extractTypeFromDelta(n),h=this.filterByArray(d,"type",["withdraw"],!1);return this.parseTransactions(h,void 0,t,i)}async fetchOpenInterests(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.fetchSwapMarkets();return this.parseOpenInterests(i,e)}async fetchOpenInterest(e,t={}){e=this.symbol(e),await this.loadMarkets();return(await this.fetchOpenInterests([e],t))[e]}parseOpenInterest(e,t=void 0){e=this.safeDict(e,"info",{});const i=this.safeString(e,"name");let s;return void 0!==i&&(s=this.coinToMarketId(i)),this.safeOpenInterest({symbol:this.safeSymbol(s),openInterestAmount:this.safeNumber(e,"openInterest"),openInterestValue:void 0,timestamp:void 0,datetime:void 0,info:e},t)}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets(),void 0!==e&&(r=this.market(e)),[a,s]=this.handlePublicAddress("fetchFundingHistory",s);const o={user:a,type:"userFunding"};void 0!==t&&(o.startTime=t);const n=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==n&&(o.endTime=n);const d=await this.publicPostInfo(this.extend(o,s));return this.parseIncomes(d,r,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"hash"),s=this.safeInteger(e,"time"),r=this.safeDict(e,"delta"),a=this.safeString(r,"coin")+"/USDC:USDC",o=this.safeMarket(a).symbol,n=this.safeString(r,"usdc"),d=this.safeCurrencyCode("USDC"),h=this.safeNumber(r,"fundingRate");return{info:e,symbol:o,code:d,timestamp:s,datetime:this.iso8601(s),id:i,amount:this.parseNumber(n),rate:h}}extractTypeFromDelta(e=[]){const t=[];for(let i=0;i<e.length;i++){const s=e[i];s.type=s.delta.type,t.push(s)}return t}formatVaultAddress(e=void 0){if(void 0!==e)return e.startsWith("0x")?e.replace("0x",""):e}handlePublicAddress(e,t){let i;[i,t]=this.handleOptionAndParams(t,e,"user");let s=i;if([s,t]=this.handleOptionAndParams(t,e,"address",i),void 0!==s&&""!==s)return[s,t];if(void 0!==this.walletAddress&&""!==this.walletAddress)return[this.walletAddress,t];throw new r.ArgumentsRequired(this.id+" "+e+"() requires a user parameter inside 'params' or the wallet address set")}coinToMarketId(e){return e.indexOf("/")>-1||e.indexOf("@")>-1?e:e+"/USDC:USDC"}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;let c;if("err"===this.safeString(n,"status",""))c=this.safeString(n,"response");else{const e=this.safeDict(n,"response",{}),t=this.safeDict(e,"data",{}),i=this.safeList(t,"statuses",[]),s=this.safeDict(i,0);c=this.safeString(s,"error")}const l=this.id+" "+o,u=void 0!==c&&""!==c;if(u&&(this.throwExactlyMatchedException(this.exceptions.exact,c,l),this.throwBroadlyMatchedException(this.exceptions.broad,c,l)),u)throw new r.ExchangeError(l)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.implodeHostname(this.urls.api[t])+"/"+e;return"POST"===i&&(r={"Content-Type":"application/json"},a=this.json(s)),{url:o,method:i,body:a,headers:r}}calculateRateLimiterCost(e,t,i,s,r={}){if("byType"in r&&"type"in s){const e=s.type,t=r.byType;if(e in t)return t[e]}return this.safeValue(r,"cost",1)}parseCreateEditOrderArgs(e,t,i,s,r,a=void 0,o={}){const n=this.market(t),d=this.safeString(o,"vaultAddress");o=this.omit(o,"vaultAddress");const h={symbol:t=n.symbol,type:i,side:s,amount:r,price:a,params:o},c={};return void 0!==d&&(c.vaultAddress=d),void 0!==e&&(h.id=e),[h,c]}}
class l extends s.A{describe(){return this.deepExtend(super.describe(),{id:"idex",name:"IDEX",countries:["US"],rateLimit:1e3,version:"v3",pro:!0,dex:!0,certified:!1,requiresWeb3:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","6h":"6h","1d":"1d"},urls:{test:{MATIC:"https://api-sandbox-matic.idex.io"},logo:"https://user-images.githubusercontent.com/51840849/94481303-2f222100-01e0-11eb-97dd-bc14c5943a86.jpg",api:{MATIC:"https://api-matic.idex.io"},www:"https://idex.io",doc:["https://api-docs-v3.idex.io/"]},api:{public:{get:{ping:1,time:1,exchange:1,assets:1,markets:1,tickers:1,candles:1,trades:1,orderbook:1}},private:{get:{user:1,wallets:1,balances:1,orders:.1,fills:.1,deposits:1,withdrawals:1,wsToken:1},post:{wallets:1,orders:.1,"orders/test":.1,withdrawals:1},delete:{orders:.1}}},options:{defaultTimeInForce:"gtc",defaultSelfTradePrevention:"cn",network:"MATIC"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,selfTradePrevention:!0,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e6,daysBackCanceled:1,untilDays:1e6,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{INVALID_ORDER_QUANTITY:a.InvalidOrder,INSUFFICIENT_FUNDS:a.InsufficientFunds,SERVICE_UNAVAILABLE:a.ExchangeNotAvailable,EXCEEDED_RATE_LIMIT:a.DDoSProtection,INVALID_PARAMETER:a.BadRequest,WALLET_NOT_ASSOCIATED:a.InvalidAddress,INVALID_WALLET_SIGNATURE:a.AuthenticationError}},requiredCredentials:{walletAddress:!0,privateKey:!0,apiKey:!0,secret:!0},precisionMode:r.kb,paddingMode:r.ex,commonCurrencies:{}})}priceToPrecision(e,t){const i=this.market(e);return t=this.decimalToPrecision(t,r.D_,i.precision.price,this.precisionMode),this.decimalToPrecision(t,r.R3,i.precision.quote,r.kb,r.ex)}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e),i=await this.publicGetExchange(),s=this.safeNumber(i,"makerFeeRate"),r=this.safeNumber(i,"takerFeeRate"),a=this.safeString(i,"makerTradeMinimum"),n=this.safeString(i,"takerTradeMinimum"),d=this.parseNumber(o.Y.stringMin(a,n)),h=[];for(let e=0;e<t.length;e++){const i=t[e],a=this.safeString(i,"market"),o=this.safeString(i,"baseAsset"),n=this.safeString(i,"quoteAsset"),c=this.safeCurrencyCode(o),l=this.safeCurrencyCode(n),u=this.parseNumber(this.parsePrecision(this.safeString(i,"baseAssetPrecision"))),f=this.parseNumber(this.parsePrecision(this.safeString(i,"quoteAssetPrecision"))),p=this.safeString(i,"status");let m;"ETH"===l&&(m=d),h.push({id:a,symbol:c+"/"+l,base:c,quote:l,settle:void 0,baseId:o,quoteId:n,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"inactive"!==p,contract:!1,linear:void 0,inverse:void 0,taker:r,maker:s,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:u,price:this.safeNumber(i,"tickSize"),base:u,quote:f},limits:{leverage:{min:void 0,max:void 0},amount:{min:u,max:void 0},price:{min:f,max:void 0},cost:{min:m,max:void 0}},created:void 0,info:i})}return h}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.publicGetTickers(this.extend(s,t)),a=this.safeDict(r,0);return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t);return this.parseTickers(i,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"market"),s=(t=this.safeMarket(i,t,"-")).symbol,r=this.safeInteger(e,"time"),a=this.safeString(e,"close");return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:a,last:a,previousClose:void 0,change:void 0,percentage:this.safeString(e,"percentChange"),average:void 0,baseVolume:this.safeString(e,"baseVolume"),quoteVolume:this.safeString(e,"quoteVolume"),info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,interval:t};void 0!==i&&(o.start=i),void 0!==s&&(o.limit=Math.min(s,1e3));const n=await this.publicGetCandles(this.extend(o,r));return Array.isArray(n)?this.parseOHLCVs(n,a,t,i,s):[]}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"start"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market:r.id};void 0!==t&&(a.start=t),void 0!==i&&(a.limit=Math.min(i,1e3));const o=await this.publicGetTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"fillId"),s=this.safeString(e,"price"),r=this.safeString(e,"quantity"),a=this.safeString(e,"quoteQuantity"),o=this.safeInteger(e,"time"),n=this.safeString(e,"market"),d=this.safeSymbol(n,t,"-"),h="buy"===this.safeString(e,"makerSide")?"sell":"buy",c=this.safeString(e,"side",h),l=this.safeString(e,"liquidity","taker"),u=this.safeString(e,"fee");let f;if(void 0!==u){const t=this.safeString(e,"feeAsset");f={cost:u,currency:this.safeCurrencyCode(t)}}const p=this.safeString(e,"orderId");return this.safeTrade({info:e,timestamp:o,datetime:this.iso8601(o),symbol:d,id:i,order:p,type:"limit",side:c,takerOrMaker:l,price:s,amount:r,cost:a,fee:f},t)}async fetchTradingFees(e={}){this.checkRequiredCredentials(),await this.loadMarkets();const t={nonce:this.uuidv1()};let i;i=await this.privateGetUser(this.extend(t,e));const s=this.safeNumber(i,"makerFeeRate"),r=this.safeNumber(i,"takerFeeRate"),a={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e];a[t]={info:i,symbol:t,maker:s,taker:r,percentage:!0,tierBased:!1}}return a}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={market:this.market(e).id,level:2};void 0!==t&&(s.limit=t);const r=await this.publicGetOrderbook(this.extend(s,i));return{symbol:e,timestamp:void 0,datetime:void 0,nonce:this.safeInteger(r,"sequence"),bids:this.parseSide(r,"bids"),asks:this.parseSide(r,"asks")}}parseSide(e,t){const i=this.safeValue(e,t,[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeNumber(t,0),a=this.safeNumber(t,1),o=this.safeInteger(t,2);s.push([r,a,o])}const r="bids"===t;return this.sortBy(s,0,r)}async fetchCurrencies(e={}){const t=await this.publicGetAssets(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"name"),a=this.safeString(s,"symbol"),o=this.safeCurrencyCode(a),n=this.parseNumber(this.parsePrecision(this.safeString(s,"exchangeDecimals")));i[o]={id:a,code:o,info:s,type:void 0,name:r,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:n,limits:{amount:{min:n,max:void 0},withdraw:{min:n,max:void 0}}}}return i}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"quantity"),o.free=this.safeString(s,"availableForTrade"),o.used=this.safeString(s,"locked"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){this.checkRequiredCredentials(),await this.loadMarkets();const t={nonce:this.uuidv1(),wallet:this.walletAddress},i=this.extend(t,e);if(void 0===i.wallet)throw new a.BadRequest(this.id+' fetchBalance() wallet is undefined, set this.walletAddress or "address" in params');let s;try{s=await this.privateGetBalances(i)}catch(e){if(!(e instanceof a.InvalidAddress))throw e;{const e=i.wallet;await this.associateWallet(e),s=await this.privateGetBalances(i)}}return this.parseBalance(s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;this.checkRequiredCredentials(),await this.loadMarkets();const o={nonce:this.uuidv1(),wallet:this.walletAddress};void 0!==e&&(r=this.market(e),o.market=r.id),void 0!==t&&(o.start=t),void 0!==i&&(o.limit=i);const n=this.extend(o,s);if(void 0===n.wallet)throw new a.BadRequest(this.id+' fetchMyTrades() walletAddress is undefined, set this.walletAddress or "address" in params');let d;try{d=await this.privateGetFills(n)}catch(e){if(!(e instanceof a.InvalidAddress))throw e;{const e=n.wallet;await this.associateWallet(e),d=await this.privateGetFills(n)}}return this.parseTrades(d,r,t,i)}async fetchOrder(e,t=void 0,i={}){const s={orderId:e};return await this.fetchOrdersHelper(t,void 0,void 0,this.extend(s,i))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersHelper(e,t,i,this.extend({closed:!1},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersHelper(e,t,i,this.extend({closed:!0},s))}async fetchOrdersHelper(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={nonce:this.uuidv1(),wallet:this.walletAddress};let a;void 0!==e&&(a=this.market(e),r.market=a.id),void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i);const o=await this.privateGetOrders(this.extend(r,s));return Array.isArray(o)?this.parseOrders(o,a,t,i):this.parseOrder(o,a)}parseOrderStatus(e){return this.safeString({active:"open",partiallyFilled:"open",rejected:"canceled",filled:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeValue(e,"fills",[]),r=this.safeString(e,"orderId"),a=this.safeString(e,"clientOrderId"),o=this.safeString(e,"market"),n=this.safeString(e,"side"),d=this.safeSymbol(o,t,"-"),h=this.safeString(e,"type"),c=this.safeString(e,"originalQuantity"),l=this.safeString(e,"executedQuantity"),u=this.safeString(e,"avgExecutionPrice"),f=this.safeString(e,"price"),p=this.safeString(e,"status"),m=this.safeStringUpper(e,"timeInForce"),g=this.parseOrderStatus(p);return this.safeOrder({info:e,id:r,clientOrderId:a,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:d,type:h,timeInForce:m,postOnly:void 0,side:n,price:f,triggerPrice:void 0,amount:c,cost:void 0,average:u,filled:l,remaining:void 0,status:g,fee:void 0,trades:s},t)}async associateWallet(e,t={}){const i=this.uuidv1(),s=this.remove0xPrefix(e),r=[this.base16ToBinary(i),this.base16ToBinary(s)],a=this.binaryConcatArray(r),o=this.hash(a,d.lY,"hex"),n={parameters:{nonce:i,wallet:e},signature:this.signMessageString(o,this.privateKey)};return await this.privatePostWallets(n)}async createOrder(e,t,i,s,r=void 0,o={}){this.checkRequiredCredentials(),await this.loadMarkets();const n=this.safeBool(o,"test",!1);o=this.omit(o,"test");const h=this.market(e),c=this.uuidv1();let l;const u={stopLoss:3,stopLossLimit:4,takeProfit:5,takeProfitLimit:6},f=this.safeString(o,"triggerPrice","stopPrice");let p;if("stopLossLimit"===t||"takeProfitLimit"===t){if(void 0===f)throw new a.BadRequest(this.id+" createOrder() triggerPrice is a required parameter for "+t+"orders");p=this.priceToPrecision(e,f)}const m={limit:1,limitMaker:2};let g;const v=t.toLowerCase().indexOf("limit")>=0;if(t in m)l=m[t],g=this.priceToPrecision(e,r);else if(t in u)l=u[t],g=this.priceToPrecision(e,r);else{if("market"!==t)throw new a.BadRequest(this.id+" "+t+" is not a valid order type");l=0}let y=0;if("quoteOrderQuantity"in o){if("market"!==t)throw new a.NotSupported(this.id+" createOrder() quoteOrderQuantity is not supported for "+t+" orders, only supported for market orders");y=1,s=this.safeNumber(o,"quoteOrderQuantity")}const w="buy"===i?0:1,b=this.remove0xPrefix(this.walletAddress),k=this.safeString(this.options,"network","ETH"),S=this.getSupportedMapping(k,{ETH:1,BSC:2,MATIC:4}),O=this.amountToPrecision(e,s),T={gtc:0,ioc:2,fok:3},P=this.safeString(this.options,"defaultTimeInForce","gtc"),I=this.safeString(o,"timeInForce",P);let M;if(!(I in T)){const e=Object.keys(T).join(", ");throw new a.BadRequest(this.id+" "+I+" is not a valid timeInForce, please choose one of "+e)}M=T[I];const x={dc:0,co:1,cn:2,cb:3},A=this.safeString(this.options,"defaultSelfTradePrevention","cn"),C=this.safeString(o,"selfTradePrevention",A);let B;if(!(C in x)){const e=Object.keys(x).join(", ");throw new a.BadRequest(this.id+" "+C+" is not a valid selfTradePrevention, please choose one of "+e)}B=x[C];const _=[this.numberToBE(S,1),this.base16ToBinary(c),this.base16ToBinary(b),this.encode(h.id),this.numberToBE(l,1),this.numberToBE(w,1),this.encode(O),this.numberToBE(y,1)];if(v){const e=this.encode(g);_.push(e)}if(t in u){const e=this.encode(p||g);_.push(e)}const E=this.safeString(o,"clientOrderId");void 0!==E&&_.push(this.encode(E));const N=[this.numberToBE(M,1),this.numberToBE(B,1),this.numberToBE(0,8)],R=this.arrayConcat(_,N),L=this.binaryConcatArray(R),D=this.hash(L,d.lY,"hex"),q=this.signMessageString(D,this.privateKey),V={parameters:{nonce:c,market:h.id,side:i,type:t,wallet:this.walletAddress,selfTradePrevention:C},signature:q};let F;return"market"!==t&&(V.parameters.timeInForce=I),v&&(V.parameters.price=g),t in u&&(V.parameters.stopPrice=p||g),0===y?V.parameters.quantity=O:V.parameters.quoteOrderQuantity=O,void 0!==E&&(V.parameters.clientOrderId=E),F=n?await this.privatePostOrdersTest(V):await this.privatePostOrders(V),this.parseOrder(F,h)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkRequiredCredentials(),await this.loadMarkets();const a=this.uuidv1(),o=this.currencyToPrecision(e,t),n=this.currency(e),h=this.remove0xPrefix(this.walletAddress),c=[this.base16ToBinary(a),this.base16ToBinary(h),this.encode(n.id),this.encode(o),this.numberToBE(1,1)],l=this.binaryConcatArray(c),u=this.hash(l,d.lY,"hex"),f=this.signMessageString(u,this.privateKey),p={parameters:{nonce:a,wallet:i,asset:n.id,quantity:o},signature:f},m=await this.privatePostWithdrawals(p);return this.parseTransaction(m,n)}async cancelAllOrders(e=void 0,t={}){let i;this.checkRequiredCredentials(),await this.loadMarkets(),void 0!==e&&(i=this.market(e));const s=this.uuidv1(),r={parameters:{nonce:s,wallet:this.walletAddress}},a=this.remove0xPrefix(this.walletAddress),o=[this.base16ToBinary(s),this.base16ToBinary(a)];void 0!==i&&(o.push(this.encode(i.id)),r.parameters.market=i.id);const n=this.binaryConcatArray(o),h=this.hash(n,d.lY,"hex"),c=this.signMessageString(h,this.privateKey);r.signature=c;const l=await this.privateDeleteOrders(this.extend(r,t));return this.parseOrders(l,i)}async cancelOrder(e,t=void 0,i={}){let s;this.checkRequiredCredentials(),await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r=this.uuidv1(),a=this.remove0xPrefix(this.walletAddress),o=[this.base16ToBinary(r),this.base16ToBinary(a),this.encode(e)],n=this.binaryConcatArray(o),h=this.hash(n,d.lY,"hex"),c=this.signMessageString(h,this.privateKey),l={parameters:{nonce:r,wallet:this.walletAddress,orderId:e},signature:c},u=await this.privateDeleteOrders(this.extend(l,i)),f=this.safeDict(u,0);return this.parseOrder(f,s)}handleErrors(e,t,i,s,r,o,n,d,h){const c=this.safeString(n,"code"),l=this.safeString(n,"message");if(void 0!==c)throw this.throwExactlyMatchedException(this.exceptions.exact,c,l),new a.ExchangeError(this.id+" "+l)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={nonce:this.uuidv1(),wallet:this.walletAddress,depositId:e},r=await this.privateGetDeposits(this.extend(s,i));return this.parseTransaction(r)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return s=this.extend({method:"privateGetDeposits"},s),await this.fetchTransactionsHelper(e,t,i,s)}async fetchStatus(e={}){return{status:"ok",updated:void 0,eta:void 0,url:void 0,info:await this.publicGetPing(e)}}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.safeInteger(t,"serverTime")}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={nonce:this.uuidv1(),wallet:this.walletAddress,withdrawalId:e},r=await this.privateGetWithdrawals(this.extend(s,i));return this.parseTransaction(r)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return s=this.extend({method:"privateGetWithdrawals"},s),await this.fetchTransactionsHelper(e,t,i,s)}async fetchTransactionsHelper(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={nonce:this.uuidv1(),wallet:this.walletAddress};let o;void 0!==e&&(o=this.currency(e),r.asset=o.id),void 0!==t&&(r.start=t),void 0!==i&&(r.limit=i);const n=s.method;let d;if(s=this.omit(s,"method"),"privateGetDeposits"===n)d=await this.privateGetDeposits(this.extend(r,s));else{if("privateGetWithdrawals"!==n)throw new a.NotSupported(this.id+" fetchTransactionsHelper() not support this method");d=await this.privateGetWithdrawals(this.extend(r,s))}return this.parseTransactions(d,o,t,i)}parseTransactionStatus(e){return this.safeString({mined:"ok"},e,e)}parseTransaction(e,t=void 0){let i;"depositId"in e?i="deposit":("withdrawId"in e||"withdrawalId"in e)&&(i="withdrawal");let s=this.safeString2(e,"depositId","withdrawId");s=this.safeString(e,"withdrawalId",s);const r=this.safeCurrencyCode(this.safeString(e,"asset"),t),a=this.safeNumber(e,"quantity"),o=this.safeString(e,"txId"),n=this.safeInteger2(e,"txTime","time");let d;"fee"in e&&(d={cost:this.safeNumber(e,"fee"),currency:"ETH"});const h=this.safeString(e,"txStatus"),c=this.parseTransactionStatus(h),l=this.safeInteger(e,"confirmationTime");return{info:e,id:s,txid:o,timestamp:n,datetime:this.iso8601(n),network:void 0,address:void 0,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:i,amount:a,currency:r,status:c,updated:l,comment:void 0,internal:void 0,fee:d}}calculateRateLimiterCost(e,t,i,s,r={}){const a=void 0!==this.apiKey,o=void 0!==this.secret,n=void 0!==this.walletAddress,d=void 0!==this.privateKey,h=this.safeValue(r,"cost",1);return a&&o&&n&&d?h/2:h}async fetchDepositAddress(e,t={}){const i={};i.nonce=this.uuidv1();const s=await this.privateGetWallets(this.extend(i,t));return this.parseDepositAddress(s)}parseDepositAddress(e,t=void 0){const i=e.length,s=this.safeDict(e,i-1),r=this.safeString(s,"address");return this.checkAddress(r),{info:e,currency:void 0,network:"MATIC",address:r,tag:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeString(this.options,"network","ETH"),d=this.safeString(this.options,"version","v1");let h=this.urls.api[o]+"/"+d+"/"+e;let c;if(Object.keys(s).length>0&&("GET"===i?(c=this.urlencode(s),h=h+"?"+c):a=this.json(s)),r={"Content-Type":"application/json"},void 0!==this.apiKey&&(r["IDEX-API-Key"]=this.apiKey),"private"===t){let e;e="GET"===i?c:a,r["IDEX-HMAC-Signature"]=this.hmac(this.encode(e),this.encode(this.secret),n.s,"hex")}return{url:h,method:i,body:a,headers:r}}remove0xPrefix(e){return"0x"===e.slice(0,2)?e.slice(2):e}hashMessage(e){const t=this.base16ToBinary(this.remove0xPrefix(e)),i=this.encode("Ethereum Signed Message:\n"+t.byteLength);return"0x"+this.hash(this.binaryConcat(i,t),d.lY,"hex")}signHash(e,t){const i=(0,c.h1)(e.slice(-64),t.slice(-64),h.bI,void 0);return{r:"0x"+i.r,s:"0x"+i.s,v:27+i.v}}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}signMessageString(e,t){const i=this.signMessage(e,t);return i.r+this.remove0xPrefix(i.s)+this.binaryToBase16(this.numberToBE(i.v,1))}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"independentreserve",name:"Independent Reserve",countries:["AU","NZ"],rateLimit:1e3,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/51840849/87182090-1e9e9080-c2ec-11ea-8e49-563db9a38f37.jpg",api:{public:"https://api.independentreserve.com/Public",private:"https://api.independentreserve.com/Private"},www:"https://www.independentreserve.com",doc:"https://www.independentreserve.com/API"},api:{public:{get:["GetValidPrimaryCurrencyCodes","GetValidSecondaryCurrencyCodes","GetValidLimitOrderTypes","GetValidMarketOrderTypes","GetValidOrderTypes","GetValidTransactionTypes","GetMarketSummary","GetOrderBook","GetAllOrders","GetTradeHistorySummary","GetRecentTrades","GetFxRates","GetOrderMinimumVolumes","GetCryptoWithdrawalFees","GetCryptoWithdrawalFees2","GetNetworks","GetPrimaryCurrencyConfig2"]},private:{post:["GetOpenOrders","GetClosedOrders","GetClosedFilledOrders","GetOrderDetails","GetAccounts","GetTransactions","GetFiatBankAccounts","GetDigitalCurrencyDepositAddress","GetDigitalCurrencyDepositAddress2","GetDigitalCurrencyDepositAddresses","GetDigitalCurrencyDepositAddresses2","GetTrades","GetBrokerageFees","GetDigitalCurrencyWithdrawal","PlaceLimitOrder","PlaceMarketOrder","CancelOrder","SynchDigitalCurrencyDepositAddressWithBlockchain","RequestFiatWithdrawal","WithdrawFiatCurrency","WithdrawDigitalCurrency","WithdrawCrypto"]}},fees:{trading:{taker:this.parseNumber("0.005"),maker:this.parseNumber("0.005"),percentage:!0,tierBased:!1}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{PLA:"PlayChip"},precisionMode:a.kb,options:{defaultNetworks:{USDT:"Ethereum",USDC:"Ethereum",BTC:"Bitcoin",BCH:"BitcoinCash",ETH:"Ethereum",LTC:"Litecoin",XRP:"XrpLedger",ZRX:"Ethereum",EOS:"EosIo",XLM:"Stellar",BAT:"Ethereum",ETC:"EthereumClassic",LINK:"Ethereum",MKR:"Ethereum",DAI:"Ethereum",COMP:"Ethereum",SNX:"Ethereum",YFI:"Ethereum",AAVE:"Ethereum",GRT:"Ethereum",DOT:"Polkadot",UNI:"Ethereum",ADA:"Cardano",MATIC:"Ethereum",DOGE:"Dogecoin",SOL:"Solana",MANA:"Ethereum",SAND:"Ethereum",SHIB:"Ethereum",TRX:"Tron",RENDER:"Solana",WIF:"Solana",RLUSD:"Ethereum",PEPE:"Ethereum"},networks:{BTC:"Bitcoin",ETH:"Ethereum",BCH:"BitcoinCash",LTC:"Litecoin",XRP:"XrpLedger",EOS:"EosIo",XLM:"Stellar",ETC:"EthereumClassic",BSV:"BitcoinSV",DOGE:"Dogecoin",DOT:"Polkadot",ADA:"Cardano",SOL:"Solana",TRX:"Tron"}}})}async fetchMarkets(e={}){const t=this.publicGetGetValidPrimaryCurrencyCodes(e),i=this.publicGetGetValidSecondaryCurrencyCodes(e),s=this.publicGetGetOrderMinimumVolumes(e),[r,a,o]=await Promise.all([t,i,s]),n=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeCurrencyCode(t),s=this.safeNumber(o,t);for(let e=0;e<a.length;e++){const r=a[e],o=this.safeCurrencyCode(r),d=t+"/"+r;n.push({id:d,symbol:i+"/"+o,base:i,quote:o,settle:void 0,baseId:t,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:void 0,price:void 0},limits:{leverage:{min:void 0,max:void 0},amount:{min:s,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:d})}}return n}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"CurrencyCode"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"AvailableBalance"),o.total=this.safeString(s,"TotalBalance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGetAccounts(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={primaryCurrencyCode:s.baseId,secondaryCurrencyCode:s.quoteId},a=await this.publicGetGetOrderBook(this.extend(r,i)),o=this.parse8601(this.safeString(a,"CreatedTimestampUtc"));return this.parseOrderBook(a,s.symbol,o,"BuyOrders","SellOrders","Price","Volume")}parseTicker(e,t=void 0){const i=this.parse8601(this.safeString(e,"CreatedTimestampUtc")),s=this.safeString(e,"PrimaryCurrencyCode"),r=this.safeString(e,"SecondaryCurrencyCode");let a;void 0!==s&&void 0!==r&&(a=s+"/"+r);const o=(t=this.safeMarket(a,t,"/")).symbol,n=this.safeString(e,"LastPrice");return this.safeTicker({symbol:o,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"DayHighestPrice"),low:this.safeString(e,"DayLowestPrice"),bid:this.safeString(e,"CurrentHighestBidPrice"),bidVolume:void 0,ask:this.safeString(e,"CurrentLowestOfferPrice"),askVolume:void 0,vwap:void 0,open:void 0,close:n,last:n,previousClose:void 0,change:void 0,percentage:void 0,average:this.safeString(e,"DayAvgPrice"),baseVolume:this.safeString(e,"DayVolumeXbtInSecondaryCurrrency"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={primaryCurrencyCode:i.baseId,secondaryCurrencyCode:i.quoteId},r=await this.publicGetGetMarketSummary(this.extend(s,t));return this.parseTicker(r,i)}parseOrder(e,t=void 0){let i;const s=this.safeString(e,"PrimaryCurrencyCode"),a=this.safeString(e,"SecondaryCurrencyCode");let o,n;void 0!==s&&void 0!==a?(o=this.safeCurrencyCode(s),n=this.safeCurrencyCode(a),i=o+"/"+n):void 0!==t&&(i=t.symbol,o=t.base,n=t.quote);let d,h=this.safeString2(e,"Type","OrderType");void 0!==h&&(h.indexOf("Bid")>=0?d="buy":h.indexOf("Offer")>=0&&(d="sell"),h.indexOf("Market")>=0?h="market":h.indexOf("Limit")>=0&&(h="limit"));const c=this.parse8601(this.safeString(e,"CreatedTimestampUtc")),l=this.safeString(e,"VolumeFilled"),u=this.safeString(e,"FeePercent");let f;return void 0!==u&&void 0!==l&&(f=r.Y.stringMul(u,l)),this.safeOrder({info:e,id:this.safeString(e,"OrderGuid"),clientOrderId:void 0,timestamp:c,datetime:this.iso8601(c),lastTradeTimestamp:void 0,symbol:i,type:h,timeInForce:void 0,postOnly:void 0,side:d,price:this.safeString(e,"Price"),triggerPrice:void 0,cost:this.safeString(e,"Value"),average:this.safeString(e,"AvgPrice"),amount:this.safeString2(e,"VolumeOrdered","Volume"),filled:l,remaining:this.safeString(e,"Outstanding"),status:this.parseOrderStatus(this.safeString(e,"Status")),fee:{rate:u,cost:f,currency:o},trades:void 0},t)}parseOrderStatus(e){return this.safeString({Open:"open",PartiallyFilled:"open",Filled:"closed",PartiallyFilledAndCancelled:"canceled",Cancelled:"canceled",PartiallyFilledAndExpired:"canceled",Expired:"canceled"},e,e)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privatePostGetOrderDetails(this.extend({orderGuid:e},i));let r;return void 0!==t&&(r=this.market(t)),this.parseOrder(s,r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.ordered({});let a;void 0!==e&&(a=this.market(e),r.primaryCurrencyCode=a.baseId,r.secondaryCurrencyCode=a.quoteId),void 0===i&&(i=50),r.pageIndex=1,r.pageSize=i;const o=await this.privatePostGetOpenOrders(this.extend(r,s)),n=this.safeList(o,"Data",[]);return this.parseOrders(n,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.ordered({});let a;void 0!==e&&(a=this.market(e),r.primaryCurrencyCode=a.baseId,r.secondaryCurrencyCode=a.quoteId),void 0===i&&(i=50),r.pageIndex=1,r.pageSize=i;const o=await this.privatePostGetClosedOrders(this.extend(r,s)),n=this.safeList(o,"Data",[]);return this.parseOrders(n,a,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=50,s={}){await this.loadMarkets();const r=this.safeInteger(s,"pageIndex",1);void 0===i&&(i=50);const a=this.ordered({pageIndex:r,pageSize:i}),o=await this.privatePostGetTrades(this.extend(a,s));let n;return void 0!==e&&(n=this.market(e)),this.parseTrades(o.Data,n,t,i)}parseTrade(e,t=void 0){const i=this.parse8601(e.TradeTimestampUtc),s=this.safeString(e,"TradeGuid"),a=this.safeString(e,"OrderGuid"),o=this.safeString2(e,"Price","SecondaryCurrencyTradePrice"),n=this.safeString2(e,"VolumeTraded","PrimaryCurrencyAmount"),d=this.parseNumber(o),h=this.parseNumber(n),c=this.parseNumber(r.Y.stringMul(o,n)),l=this.safeString(e,"PrimaryCurrencyCode"),u=this.safeString(e,"SecondaryCurrencyCode");let f;void 0!==l&&void 0!==u&&(f=l+"/"+u);const p=this.safeSymbol(f,t,"/");let m=this.safeString(e,"OrderType");return void 0!==m&&(m.indexOf("Bid")>=0?m="buy":m.indexOf("Offer")>=0&&(m="sell")),this.safeTrade({id:s,info:e,timestamp:i,datetime:this.iso8601(i),symbol:p,order:a,type:void 0,side:m,takerOrMaker:void 0,price:d,amount:h,cost:c,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={primaryCurrencyCode:r.baseId,secondaryCurrencyCode:r.quoteId,numberOfRecentTradesToRetrieve:50},o=await this.publicGetGetRecentTrades(this.extend(a,s));return this.parseTrades(o.Trades,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privatePostGetBrokerageFees(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"CurrencyCode"),a=this.safeCurrencyCode(r),o=this.safeNumber(s,"Fee");i[a]={info:s,fee:o}}const s={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e],r=this.market(t),a=this.safeValue(i,r.base,{});s[t]={info:this.safeValue(a,"info"),symbol:t,maker:this.safeNumber(a,"fee"),taker:this.safeNumber(a,"fee"),percentage:!0,tierBased:!0}}return s}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e);let n=this.capitalize(t);n+="sell"===i?"Offer":"Bid";const d=this.ordered({primaryCurrencyCode:o.baseId,secondaryCurrencyCode:o.quoteId,orderType:n});let h;return d.volume=s,"limit"===t?(d.price=r,h=await this.privatePostPlaceLimitOrder(this.extend(d,a))):h=await this.privatePostPlaceMarketOrder(this.extend(d,a)),this.safeOrder({info:h,id:h.OrderGuid},o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderGuid:e},r=await this.privatePostCancelOrder(this.extend(s,i));return this.parseOrder(r)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={primaryCurrencyCode:this.currency(e).id},s=await this.privatePostGetDigitalCurrencyDepositAddress(this.extend(i,t));return this.parseDepositAddress(s)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"DepositAddress");return this.checkAddress(i),{info:e,currency:this.safeString(t,"code"),network:void 0,address:i,tag:this.safeString(e,"Tag")}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={primaryCurrencyCode:a.id,withdrawalAddress:i,amount:this.currencyToPrecision(e,t)};let d;if(void 0!==s&&(o.destinationTag=s),[d,r]=this.handleNetworkCodeAndParams(r),void 0!==d)throw new n.BadRequest(this.id+' withdraw () does not accept params["networkCode"]');const h=await this.privatePostWithdrawDigitalCurrency(this.extend(o,r));return this.parseTransaction(h,a)}parseTransaction(e,t=void 0){const i=this.safeDict(e,"Amount"),s=this.safeDict(e,"Destination"),r=this.safeString(e,"PrimaryCurrencyCode"),a=this.safeString(e,"CreatedTimestampUtc"),o=this.safeString(s,"Address"),n=this.safeString(s,"Tag"),d=this.safeCurrencyCode(r,t);return{info:e,id:this.safeString(e,"TransactionGuid"),txid:void 0,type:"withdraw",currency:d,network:void 0,amount:this.safeNumber(i,"Total"),status:this.safeString(e,"Status"),timestamp:this.parse8601(a),datetime:a,address:o,addressFrom:void 0,addressTo:o,tag:n,tagFrom:void 0,tagTo:n,updated:void 0,comment:void 0,fee:{currency:d,cost:this.safeNumber(i,"Fee"),rate:void 0},internal:!1}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n=this.urls.api[t]+"/"+e;if("public"===t)Object.keys(s).length&&(n+="?"+this.urlencode(s));else{this.checkRequiredCredentials();const e=this.nonce(),t=[n,"apiKey="+this.apiKey,"nonce="+e.toString()],i=Object.keys(s);for(let e=0;e<i.length;e++){const r=i[e],a=s[r].toString();t.push(r+"="+a)}const d=t.join(","),h=this.hmac(this.encode(d),this.encode(this.secret),o.s),c=this.ordered({});c.apiKey=this.apiKey,c.nonce=e,c.signature=h.toUpperCase();for(let e=0;e<i.length;e++){const t=i[e];c[t]=s[t]}a=this.json(c),r={"Content-Type":"application/json"}}return{url:n,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"indodax",name:"INDODAX",countries:["ID"],rateLimit:50,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!1,fetchDepositAddress:"emulated",fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFee:!0,fetchTransactionFees:!1,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},version:"2.0",urls:{logo:"https://user-images.githubusercontent.com/51840849/87070508-9358c880-c221-11ea-8dc5-5391afbbb422.jpg",api:{public:"https://indodax.com",private:"https://indodax.com/tapi"},www:"https://www.indodax.com",doc:"https://github.com/btcid/indodax-official-api-docs",referral:"https://indodax.com/ref/testbitcoincoid/1"},api:{public:{get:{"api/server_time":5,"api/pairs":5,"api/price_increments":5,"api/summaries":5,"api/ticker/{pair}":5,"api/ticker_all":5,"api/trades/{pair}":5,"api/depth/{pair}":5,"tradingview/history_v2":5}},private:{post:{getInfo:4,transHistory:4,trade:1,tradeHistory:4,openOrders:4,orderHistory:4,getOrder:4,cancelOrder:4,withdrawFee:4,withdrawCoin:4,listDownline:4,checkDownline:4,createVoucher:4}}},fees:{trading:{tierBased:!1,percentage:!0,maker:0,taker:.003}},exceptions:{exact:{invalid_pair:r.BadSymbol,"Insufficient balance.":r.InsufficientFunds,"invalid order.":r.OrderNotFound,"Invalid credentials. API not found or session has expired.":r.AuthenticationError,"Invalid credentials. Bad sign.":r.AuthenticationError},broad:{"Minimum price":r.InvalidOrder,"Minimum order":r.InvalidOrder}},options:{recvWindow:5e3,timeDifference:0,adjustForTimeDifference:!1,networks:{XLM:"Stellar Token",BSC:"bep20",TRC20:"trc20",MATIC:"polygon"},timeframes:{"1m":"1","15m":"15","30m":"30","1h":"60","4h":"240","1d":"1D","3d":"3D","1w":"1W"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:2e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{STR:"XLM",BCHABC:"BCH",BCHSV:"BSV",DRK:"DASH",NEM:"XEM"},precisionMode:a.kb})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=await this.publicGetApiServerTime(e);return this.safeInteger(t,"server_time")}async fetchMarkets(e={}){const t=await this.publicGetApiPairs(e),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"ticker_id"),a=this.safeString(s,"traded_currency"),o=this.safeString(s,"base_currency"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.safeInteger(s,"is_maintenance");i.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!h,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(s,"trade_fee_percent"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,percentage:!0,precision:{amount:this.parseNumber("1e-8"),price:this.parseNumber(this.parsePrecision(this.safeString(s,"price_round"))),cost:this.parseNumber(this.parsePrecision(this.safeString(s,"volume_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(s,"trade_min_traded_currency"),max:void 0},price:{min:this.safeNumber(s,"trade_min_base_currency"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:s})}return i}parseBalance(e){const t=this.safeValue(e,"return",{}),i=this.safeValue(t,"balance",{}),s=this.safeValue(t,"balance_hold",{}),r=this.safeTimestamp(t,"server_time"),a={info:e,timestamp:r,datetime:this.iso8601(r)},o=Object.keys(i);for(let e=0;e<o.length;e++){const t=o[e],r=this.safeCurrencyCode(t),n=this.account();n.free=this.safeString(i,t),n.used=this.safeString(s,t),a[r]=n}return this.safeBalance(a)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGetInfo(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.base+s.quote},a=await this.publicGetApiDepthPair(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"buy","sell")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeTimestamp(e,"server_time"),r="vol_"+t.baseId.toLowerCase(),a="vol_"+t.quoteId.toLowerCase(),o=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:o,last:o,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,r),quoteVolume:this.safeString(e,a),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.base+i.quote},r=await this.publicGetApiTickerPair(this.extend(s,t)),a=this.safeDict(r,"ticker",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetApiTickerAll(t),s=this.safeDict(i,"tickers",{});return this.parseTickers(s,e)}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"date");return this.safeTrade({id:this.safeString(e,"tid"),info:e,timestamp:i,datetime:this.iso8601(i),symbol:this.safeSymbol(void 0,t),type:void 0,side:this.safeString(e,"type"),order:void 0,takerOrMaker:void 0,price:this.safeString(e,"price"),amount:this.safeString(e,"amount"),cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.base+r.quote},o=await this.publicGetApiTradesPair(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"Time"),this.safeNumber(e,"Open"),this.safeNumber(e,"High"),this.safeNumber(e,"Low"),this.safeNumber(e,"Close"),this.safeNumber(e,"Volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.options.timeframes,n=this.safeString(o,t,t),d=this.seconds(),h=this.safeInteger(r,"until",d);r=this.omit(r,["until"]);const c={to:h,tf:n,symbol:a.base+a.quote};if(void 0===s&&(s=1e3),void 0!==i)c.from=Math.floor(i/1e3);else{const e=this.parseTimeframe(t);c.from=d-s*e-1}const l=await this.publicGetTradingviewHistoryV2(this.extend(c,r));return this.parseOHLCVs(l,a,t,i,s)}parseOrderStatus(e){return this.safeString({open:"open",filled:"closed",cancelled:"canceled"},e,e)}parseOrder(e,t=void 0){let i;"type"in e&&(i=e.type);const s=this.parseOrderStatus(this.safeString(e,"status","open"));let r,a;const o=this.safeString(e,"price");let n,d;const h=this.safeString(e,"pair");if(void 0!==(t=this.safeMarket(h,t))){r=t.symbol;let i=t.quoteId,s=t.baseId;"idr"===t.quoteId&&"order_rp"in e&&(i="rp"),"idr"===t.baseId&&"remain_rp"in e&&(s="rp"),a=this.safeString(e,"order_"+i),a||(n=this.safeString(e,"order_"+s),d=this.safeString(e,"remain_"+s))}const c=this.safeInteger(e,"submit_time"),l=this.safeString(e,"order_id");return this.safeOrder({info:e,id:l,clientOrderId:this.safeString(e,"client_order_id"),timestamp:c,datetime:this.iso8601(c),lastTradeTimestamp:void 0,symbol:r,type:"limit",timeInForce:void 0,postOnly:void 0,side:i,price:o,triggerPrice:void 0,cost:a,average:void 0,amount:n,filled:void 0,remaining:d,status:s,fee:undefined,trades:void 0})}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={pair:s.id,order_id:e},o=await this.privatePostGetOrder(this.extend(a,i)),n=o.return,d=this.parseOrder(this.extend({id:e},n.order),s);return d.info=o,d}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.pair=r.id);const o=(await this.privatePostOpenOrders(this.extend(a,s))).return.orders;if(!o)return[];if(void 0!==e)return this.parseOrders(o,r,t,i);const n=Object.keys(o);let d=[];for(let e=0;e<n.length;e++){const s=n[e],a=o[s];r=this.safeMarket(s);const h=this.parseOrders(a,r,t,i);d=this.arrayConcat(d,h)}return d}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchClosedOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id},n=await this.privatePostOrderHistory(this.extend(o,s));let d=this.parseOrders(n.return.orders,a);return d=this.filterBy(d,"status","closed"),this.filterBySymbolSinceLimit(d,e,t,i)}async createOrder(e,t,i,s,a=void 0,n={}){await this.loadMarkets();const d=this.market(e),h={pair:d.id,type:i,price:a};let c=!1,l=!1;if("market"===t)if("buy"===i){let t;const i=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==i)t=this.costToPrecision(e,i);else{if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price).");const i=this.numberToString(s),n=this.numberToString(a),d=o.Y.stringMul(i,n);t=this.costToPrecision(e,d)}h[d.quoteId]=t}else l=!0;else"limit"===t&&(c=!0,l=!0,"buy"===i&&(h[d.quoteId]=this.parseToNumeric(o.Y.stringMul(this.numberToString(s),this.numberToString(a)))));if(c){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument for a "+t+" order");h.price=a}l&&(h[d.baseId]=this.amountToPrecision(e,s));const u=await this.privatePostTrade(this.extend(h,n)),f=this.safeValue(u,"return",{}),p=this.safeString(f,"order_id");return this.safeOrder({info:u,id:p},d)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const s=this.safeValue(i,"side");if(void 0===s)throw new r.ArgumentsRequired(this.id+' cancelOrder() requires an extra "side" param');await this.loadMarkets();const a={order_id:e,pair:this.market(t).id,type:s},o=await this.privatePostCancelOrder(this.extend(a,i)),n=this.safeDict(o,"return");return this.parseOrder(n)}async fetchTransactionFee(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.privatePostWithdrawFee(this.extend(s,t)),a=this.safeValue(r,"return",{}),o=this.safeString(a,"currency");return{info:r,rate:this.safeNumber(a,"withdraw_fee"),currency:this.safeCurrencyCode(o,i)}}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==t){const e=this.iso8601(t).slice(0,10);r.start=e,r.end=this.iso8601(this.milliseconds()).slice(0,10)}const a=await this.privatePostTransHistory(this.extend(r,s)),o=this.safeValue(a,"return",{}),n=this.safeValue(o,"withdraw",{}),d=this.safeValue(o,"deposit",{});let h,c=[];if(void 0===e){let e=Object.keys(n);for(let t=0;t<e.length;t++){const i=e[t];c=this.arrayConcat(c,n[i])}e=Object.keys(d);for(let t=0;t<e.length;t++){const i=e[t];c=this.arrayConcat(c,d[i])}}else{h=this.currency(e);const t=this.safeValue(n,h.id,[]),i=this.safeValue(d,h.id,[]);c=this.arrayConcat(t,i)}return this.parseTransactions(c,h,t,i)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o=this.milliseconds(),n={currency:a.id,withdraw_amount:t,withdraw_address:i,request_id:o.toString()};s&&(n.withdraw_memo=s);const d=await this.privatePostWithdrawCoin(this.extend(n,r));return this.parseTransaction(d,a)}parseTransaction(e,t=void 0){const i=this.safeString(e,"status"),s=this.safeTimestamp2(e,"success_time","submit_time"),r=this.safeString(e,"deposit_id"),a=this.safeNumber(e,"fee");let o;return void 0!==a&&(o={currency:this.safeCurrencyCode(void 0,t),cost:a,rate:void 0}),{id:this.safeString2(e,"withdraw_id","deposit_id"),txid:this.safeString2(e,"txid","tx"),timestamp:s,datetime:this.iso8601(s),network:void 0,addressFrom:void 0,address:this.safeString(e,"withdraw_address"),addressTo:void 0,amount:this.safeNumberN(e,["amount","withdraw_amount","deposit_amount"]),type:void 0===r?"withdraw":"deposit",currency:this.safeCurrencyCode(void 0,t),status:this.parseTransactionStatus(i),updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:this.safeString(e,"withdraw_memo"),internal:void 0,fee:o,info:e}}parseTransactionStatus(e){return this.safeString({success:"ok"},e,e)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostGetInfo(t),s=this.safeDict(i,"return"),r=this.safeDict(s,"address",{}),a=this.safeDict(s,"network",{}),o=Object.keys(r),n={info:s};for(let t=0;t<o.length;t++){const i=o[t],s=this.safeCurrencyCode(i),d=this.safeString(r,i);if(void 0!==d&&(void 0===e||this.inArray(s,e))){let e;if(this.checkAddress(d),i in a){const t=this.safeString(a,i);if(t.indexOf(",")>=0){e=[];const i=t.split(",");for(let t=0;t<i.length;t++)e.push(this.networkIdToCode(i[t]).toUpperCase())}else e=this.networkIdToCode(t).toUpperCase()}n[s]={info:{},currency:s,network:e,address:d,tag:void 0}}}return n}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t];if("public"===t){const t=this.omit(s,this.extractParams(e));o+="/"+this.implodeParams(e,s),Object.keys(t).length&&(o+="?"+this.urlencodeWithArrayRepeat(t))}else this.checkRequiredCredentials(),a=this.urlencode(this.extend({method:e,timestamp:this.nonce(),recvWindow:this.options.recvWindow},s)),r={"Content-Type":"application/x-www-form-urlencoded",Key:this.apiKey,Sign:this.hmac(this.encode(a),this.encode(this.secret),n.Zf)};return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(Array.isArray(n))return;const c=this.safeValue(n,"error","");if(!("success"in n)&&""===c)return;if("approved"===this.safeString(n,"success"))return;if(1===this.safeInteger(n,"success",0)){if("return"in n)return;throw new r.ExchangeError(this.id+": malformed response: "+this.json(n))}const l=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,l),this.throwBroadlyMatchedException(this.exceptions.broad,c,l),new r.ExchangeError(l)}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"kraken",name:"Kraken",countries:["US"],version:"0",rateLimit:1e3,certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTrailingAmountOrder:!0,createTrailingPercentOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLedgerEntry:!0,fetchLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderTrades:"emulated",fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchWithdrawals:!0,setLeverage:!1,setMarginMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"4h":240,"1d":1440,"1w":10080,"2w":21600},urls:{logo:"https://user-images.githubusercontent.com/51840849/76173629-fc67fb00-61b1-11ea-84fe-f2de582f58a3.jpg",api:{public:"https://api.kraken.com",private:"https://api.kraken.com",zendesk:"https://kraken.zendesk.com/api/v2/help_center/en-us/articles"},www:"https://www.kraken.com",doc:"https://docs.kraken.com/rest/",fees:"https://www.kraken.com/en-us/features/fee-schedule"},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0026"),maker:this.parseNumber("0.0016"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0026")],[this.parseNumber("50000"),this.parseNumber("0.0024")],[this.parseNumber("100000"),this.parseNumber("0.0022")],[this.parseNumber("250000"),this.parseNumber("0.0020")],[this.parseNumber("500000"),this.parseNumber("0.0018")],[this.parseNumber("1000000"),this.parseNumber("0.0016")],[this.parseNumber("2500000"),this.parseNumber("0.0014")],[this.parseNumber("5000000"),this.parseNumber("0.0012")],[this.parseNumber("10000000"),this.parseNumber("0.0001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0016")],[this.parseNumber("50000"),this.parseNumber("0.0014")],[this.parseNumber("100000"),this.parseNumber("0.0012")],[this.parseNumber("250000"),this.parseNumber("0.0010")],[this.parseNumber("500000"),this.parseNumber("0.0008")],[this.parseNumber("1000000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0004")],[this.parseNumber("5000000"),this.parseNumber("0.0002")],[this.parseNumber("10000000"),this.parseNumber("0.0")]]}}},handleContentTypeApplicationZip:!0,api:{zendesk:{get:["360000292886","201893608"]},public:{get:{Assets:1,AssetPairs:1,Depth:1.2,OHLC:1.2,Spread:1,SystemStatus:1,Ticker:1,Time:1,Trades:1.2}},private:{post:{AddOrder:0,AddOrderBatch:0,AddExport:3,AmendOrder:0,Balance:3,CancelAll:3,CancelAllOrdersAfter:3,CancelOrder:0,CancelOrderBatch:0,ClosedOrders:3,DepositAddresses:3,DepositMethods:3,DepositStatus:3,EditOrder:0,ExportStatus:3,GetWebSocketsToken:3,Ledgers:6,OpenOrders:3,OpenPositions:3,QueryLedgers:3,QueryOrders:3,QueryTrades:3,RetrieveExport:3,RemoveExport:3,BalanceEx:3,TradeBalance:3,TradesHistory:6,TradeVolume:3,Withdraw:3,WithdrawCancel:3,WithdrawInfo:3,WithdrawMethods:3,WithdrawAddresses:3,WithdrawStatus:3,WalletTransfer:3,CreateSubaccount:3,AccountTransfer:3,"Earn/Allocate":3,"Earn/Deallocate":3,"Earn/AllocateStatus":3,"Earn/DeallocateStatus":3,"Earn/Strategies":3,"Earn/Allocations":3}}},commonCurrencies:{LUNA:"LUNC",LUNA2:"LUNA",REPV2:"REP",REP:"REPV1",UST:"USTC",XBT:"BTC","XBT.M":"BTC.M",XDG:"DOGE"},options:{timeDifference:0,adjustForTimeDifference:!1,marketsByAltname:{},delistedMarketsById:{},inactiveCurrencies:["CAD","USD","JPY","GBP"],networks:{ETH:"ERC20",TRX:"TRC20"},depositMethods:{"1INCH":"1inch (1INCH)",AAVE:"Aave",ADA:"ADA",ALGO:"Algorand",ANKR:"ANKR (ANKR)",ANT:"Aragon (ANT)",ATOM:"Cosmos",AXS:"Axie Infinity Shards (AXS)",BADGER:"Bager DAO (BADGER)",BAL:"Balancer (BAL)",BAND:"Band Protocol (BAND)",BAT:"BAT",BCH:"Bitcoin Cash",BNC:"Bifrost (BNC)",BNT:"Bancor (BNT)",BTC:"Bitcoin",CHZ:"Chiliz (CHZ)",COMP:"Compound (COMP)",CQT:"\tCovalent Query Token (CQT)",CRV:"Curve DAO Token (CRV)",CTSI:"Cartesi (CTSI)",DAI:"Dai",DASH:"Dash",DOGE:"Dogecoin",DOT:"Polkadot",DYDX:"dYdX (DYDX)",ENJ:"Enjin Coin (ENJ)",EOS:"EOS",ETC:"Ether Classic (Hex)",ETH:"Ether (Hex)",EWT:"Energy Web Token",FEE:"Kraken Fee Credit",FIL:"Filecoin",FLOW:"Flow",GHST:"Aavegotchi (GHST)",GNO:"GNO",GRT:"GRT",ICX:"Icon",INJ:"Injective Protocol (INJ)",KAR:"Karura (KAR)",KAVA:"Kava",KEEP:"Keep Token (KEEP)",KNC:"Kyber Network (KNC)",KSM:"Kusama",LINK:"Link",LPT:"Livepeer Token (LPT)",LRC:"Loopring (LRC)",LSK:"Lisk",LTC:"Litecoin",MANA:"MANA",MATIC:"Polygon (MATIC)",MINA:"Mina",MIR:"Mirror Protocol (MIR)",MKR:"Maker (MKR)",MLN:"MLN",MOVR:"Moonriver (MOVR)",NANO:"NANO",OCEAN:"OCEAN",OGN:"Origin Protocol (OGN)",OMG:"OMG",OXT:"Orchid (OXT)",OXY:"Oxygen (OXY)",PAXG:"PAX (Gold)",PERP:"Perpetual Protocol (PERP)",PHA:"Phala (PHA)",QTUM:"QTUM",RARI:"Rarible (RARI)",RAY:"Raydium (RAY)",REN:"Ren Protocol (REN)",REP:"REPv2",REPV1:"REP",SAND:"The Sandbox (SAND)",SC:"Siacoin",SDN:"Shiden (SDN)",SOL:"Solana",SNX:"Synthetix Network (SNX)",SRM:"Serum",STORJ:"Storj (STORJ)",SUSHI:"Sushiswap (SUSHI)",TBTC:"tBTC",TRX:"Tron",UNI:"UNI",USDC:"USDC",USDT:"Tether USD (ERC20)","USDT-TRC20":"Tether USD (TRC20)",WAVES:"Waves",WBTC:"Wrapped Bitcoin (WBTC)",XLM:"Stellar XLM",XMR:"Monero",XRP:"Ripple XRP",XTZ:"XTZ",YFI:"YFI",ZEC:"Zcash (Transparent)",ZRX:"0x (ZRX)"},withdrawMethods:{Lightning:"Lightning",Bitcoin:"BTC",Ripple:"XRP",Litecoin:"LTC",Dogecoin:"DOGE",Stellar:"XLM",Ethereum:"ERC20","Arbitrum One":"Arbitrum",Polygon:"MATIC","Arbitrum Nova":"Arbitrum",Optimism:"Optimism","zkSync Era":"zkSync","Ethereum Classic":"ETC",Zcash:"ZEC",Monero:"XMR",Tron:"TRC20",Solana:"SOL",EOS:"EOS","Bitcoin Cash":"BCH",Cardano:"ADA",Qtum:"QTUM",Tezos:"XTZ",Cosmos:"ATOM",Nano:"NANO",Siacoin:"SC",Lisk:"LSK",Waves:"WAVES",ICON:"ICX",Algorand:"ALGO","Polygon - USDC.e":"MATIC","Arbitrum One - USDC.e":"Arbitrum",Polkadot:"DOT",Kava:"KAVA",Filecoin:"FIL",Kusama:"KSM",Flow:"FLOW","Energy Web":"EW",Mina:"MINA",Centrifuge:"CFG",Karura:"KAR",Moonriver:"MOVR",Shiden:"SDN",Khala:"PHA","Bifrost Kusama":"BNC",Songbird:"SGB","Terra classic":"LUNC",KILT:"KILT",Basilisk:"BSX",Flare:"FLR","Avalanche C-Chain":"AVAX",Kintsugi:"KINT",Altair:"AIR",Moonbeam:"GLMR",Acala:"ACA",Astar:"ASTR",Akash:"AKT",Robonomics:"XRT",Fantom:"FTM",Elrond:"EGLD",THORchain:"RUNE",Secret:"SCRT",Near:"NEAR","Internet Computer Protocol":"ICP",Picasso:"PICA","Crust Shadow":"CSM",Integritee:"TEER","Parallel Finance":"PARA",HydraDX:"HDX",Interlay:"INTR","Fetch.ai":"FET",NYM:"NYM","Terra 2.0":"LUNA2",Juno:"JUNO",Nodle:"NODL",Stacks:"STX","Ethereum PoW":"ETHW",Aptos:"APT",Sui:"SUI",Genshiro:"GENS",Aventus:"AVT",Sei:"SEI",OriginTrail:"OTP",Celestia:"TIA"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:void 0,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:720}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"EQuery:Invalid asset pair":r.BadSymbol,"EAPI:Invalid key":r.AuthenticationError,"EFunding:Unknown withdraw key":r.InvalidAddress,"EFunding:Invalid amount":r.InsufficientFunds,"EService:Unavailable":r.ExchangeNotAvailable,"EDatabase:Internal error":r.ExchangeNotAvailable,"EService:Busy":r.ExchangeNotAvailable,"EQuery:Unknown asset":r.BadSymbol,"EAPI:Rate limit exceeded":r.DDoSProtection,"EOrder:Rate limit exceeded":r.DDoSProtection,"EGeneral:Internal error":r.ExchangeNotAvailable,"EGeneral:Temporary lockout":r.DDoSProtection,"EGeneral:Permission denied":r.PermissionDenied,"EGeneral:Invalid arguments:price":r.InvalidOrder,"EOrder:Unknown order":r.InvalidOrder,"EOrder:Invalid price:Invalid price argument":r.InvalidOrder,"EOrder:Order minimum not met":r.InvalidOrder,"EOrder:Insufficient funds":r.InsufficientFunds,"EGeneral:Invalid arguments":r.BadRequest,"ESession:Invalid session":r.AuthenticationError,"EAPI:Invalid nonce":r.InvalidNonce,"EFunding:No funding method":r.BadRequest,"EFunding:Unknown asset":r.BadSymbol,"EService:Market in post_only mode":r.OnMaintenance,"EGeneral:Too many requests":r.DDoSProtection,"ETrade:User Locked":r.AccountSuspended},broad:{":Invalid order":r.InvalidOrder,":Invalid arguments:volume":r.InvalidOrder,":Invalid arguments:viqc":r.InvalidOrder,":Invalid nonce":r.InvalidNonce,":IInsufficient funds":r.InsufficientFunds,":Cancel pending":r.CancelPending,":Rate limit exceeded":r.RateLimitExceeded}}})}feeToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.amount,this.precisionMode)}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=await this.publicGetAssetPairs(e),i=this.safeValue(t,"result",{}),s=Object.keys(i);let r=[];for(let e=0;e<s.length;e++){const t=s[e],o=i[t],n=this.safeString(o,"base"),d=this.safeString(o,"quote"),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d),l=t.indexOf(".d")>=0,u=this.safeString(o,"altname"),f=this.safeValue(o,"fees_maker",[]),p=this.safeValue(f,0,[]),m=this.safeString(p,1);let g;void 0!==m&&(g=this.parseNumber(a.Y.stringDiv(m,"100")));const v=this.safeValue(o,"fees",[]),y=this.safeValue(v,0,[]),w=this.safeString(y,1);let b;void 0!==w&&(b=this.parseNumber(a.Y.stringDiv(w,"100")));const k=this.safeValue(o,"leverage_buy",[]),S=k.length,O=this.parseNumber(this.parsePrecision(this.safeString(o,"pair_decimals"))),T="online"===this.safeString(o,"status");r.push({id:t,wsId:this.safeString(o,"wsname"),symbol:l?u:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,darkpool:l,altname:o.altname,type:"spot",spot:!0,margin:S>0,swap:!1,future:!1,option:!1,active:T,contract:!1,linear:void 0,inverse:void 0,taker:b,maker:g,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(o,"lot_decimals"))),price:O},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(k,S-1,1)},amount:{min:this.safeNumber(o,"ordermin"),max:void 0},price:{min:O,max:void 0},cost:{min:this.safeNumber(o,"costmin"),max:void 0}},created:void 0,info:o})}return r=this.appendInactiveMarkets(r),this.options.marketsByAltname=this.indexBy(r,"altname"),r}safeCurrency(e,t=void 0){return void 0!==e&&e.length>3&&(0!==e.indexOf("X")&&0!==e.indexOf("Z")||e.indexOf(".")>0||"ZEUS"===e||(e=e.slice(1))),super.safeCurrency(e,t)}appendInactiveMarkets(e){const t={amount:this.parseNumber("1e-8"),price:this.parseNumber("1e-8")},i={darkpool:!1,info:void 0,maker:void 0,taker:void 0,active:!1,precision:t,limits:{amount:{min:t.amount,max:void 0},price:{min:t.price,max:void 0},cost:{min:void 0,max:void 0}}},s=[];for(let t=0;t<s.length;t++)e.push(this.extend(i,s[t]));return e}async fetchStatus(e={}){const t=await this.publicGetSystemStatus(e),i=this.safeDict(t,"result");return{status:"online"===this.safeString(i,"status")?"ok":"maintenance",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchCurrencies(e={}){const t=await this.publicGetAssets(e),i=this.safeValue(t,"result",{}),s=Object.keys(i),r={};for(let e=0;e<s.length;e++){const t=s[e],a=i[t],o=this.safeCurrencyCode(t),n=this.parseNumber(this.parsePrecision(this.safeString(a,"decimals"))),d="enabled"===this.safeString(a,"status");r[o]={id:t,code:o,info:a,name:this.safeString(a,"altname"),active:d,deposit:void 0,withdraw:void 0,fee:void 0,precision:n,limits:{amount:{min:n,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}}}return r}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id,"fee-info":!0},r=await this.privatePostTradeVolume(this.extend(s,t)),a=this.safeValue(r,"result",{});return this.parseTradingFee(a,i)}parseTradingFee(e,t){const i=this.safeValue(e,"fees_maker",{}),s=this.safeValue(e,"fees",{}),r=this.safeValue(i,t.id,{}),o=this.safeValue(s,t.id,{});return{info:e,symbol:t.symbol,maker:this.parseNumber(a.Y.stringDiv(this.safeString(r,"fee"),"100")),taker:this.parseNumber(a.Y.stringDiv(this.safeString(o,"fee"),"100")),percentage:!0,tierBased:!0}}parseBidAsk(e,t=0,i=1,s=2){return[this.safeNumber(e,t),this.safeNumber(e,i),this.safeInteger(e,2)]}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);if(s.darkpool)throw new r.ExchangeError(this.id+" fetchOrderBook() does not provide an order book for darkpool symbol "+e);const a={pair:s.id};void 0!==t&&(a.count=t);const o=await this.publicGetDepth(this.extend(a,i)),n=this.safeValue(o,"result",{});let d=this.safeValue(n,s.id);const h=this.safeValue(s,"info",{}),c=this.safeValue(h,"wsname");return void 0!==c&&(d=this.safeValue(n,c,d)),this.parseOrderBook(d,e)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeValue(e,"v",[]),r=this.safeString(s,1),o=this.safeValue(e,"p",[]),n=this.safeString(o,1),d=a.Y.stringMul(r,n),h=this.safeValue(e,"c",[]),c=this.safeString(h,0),l=this.safeValue(e,"h",[]),u=this.safeValue(e,"l",[]),f=this.safeValue(e,"b",[]),p=this.safeValue(e,"a",[]);return this.safeTicker({symbol:i,timestamp:void 0,datetime:void 0,high:this.safeString(l,1),low:this.safeString(u,1),bid:this.safeString(f,0),bidVolume:this.safeString(f,2),ask:this.safeString(p,0),askVolume:this.safeString(p,2),vwap:n,open:this.safeString(e,"o"),close:c,last:c,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:r,quoteVolume:d,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){e=this.marketSymbols(e);const t=[];for(let i=0;i<e.length;i++){const s=e[i],r=this.markets[s];r.active&&!r.darkpool&&t.push(r.id)}i.pair=t.join(",")}const s=(await this.publicGetTicker(this.extend(i,t))).result,r=Object.keys(s),a={};for(let e=0;e<r.length;e++){const t=r[e],i=this.safeMarket(t),o=i.symbol,n=s[t];a[o]=this.parseTicker(n,i)}return this.filterByArrayTickers(a,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();if(e.indexOf(".d")>=0)throw new r.ExchangeError(this.id+" fetchTicker() does not provide a ticker for darkpool symbol "+e);const i=this.market(e),s={pair:i.id},a=(await this.publicGetTicker(this.extend(s,t))).result[i.id];return this.parseTicker(a,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,6)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,720);const o=this.market(e),n=this.safeInteger(this.timeframes,t),d={pair:o.id};if(d.interval=void 0!==n?n:t,void 0!==i){const e=this.parseToInt(i/1e3),t=60*n;d.since=this.numberToString(e-t)}const h=await this.publicGetOHLC(this.extend(d,r)),c=this.safeValue(h,"result",{}),l=this.safeList(c,o.id,[]);return this.parseOHLCVs(l,o,t,i,s)}parseLedgerEntryType(e){return this.safeString({trade:"trade",withdrawal:"transaction",deposit:"transaction",transfer:"transfer",margin:"margin"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"id");let s;const r=this.safeString(e,"refid"),o=this.parseLedgerEntryType(this.safeString(e,"type")),n=this.safeString(e,"asset"),d=this.safeCurrencyCode(n,t);t=this.safeCurrency(n,t);let h=this.safeString(e,"amount");a.Y.stringLt(h,"0")?(s="out",h=a.Y.stringAbs(h)):s="in";const c=this.safeIntegerProduct(e,"time",1e3);return this.safeLedgerEntry({info:e,id:i,direction:s,account:undefined,referenceId:r,referenceAccount:undefined,type:o,currency:d,amount:this.parseNumber(h),before:void 0,after:this.safeNumber(e,"balance"),status:"ok",timestamp:c,datetime:this.iso8601(c),fee:{cost:this.safeNumber(e,"fee"),currency:d}},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let o;void 0!==e&&(o=this.currency(e),r.asset=o.id),void 0!==t&&(r.start=this.parseToInt(t/1e3));const n=this.safeStringN(s,["until","till"]);if(void 0!==n){s=this.omit(s,["until","till"]);const e=a.Y.stringDiv(n,"1000");r.end=this.parseToInt(a.Y.stringAdd(e,"1"))}const d=await this.privatePostLedgers(this.extend(r,s)),h=this.safeValue(d,"result",{}),c=this.safeValue(h,"ledger",{}),l=Object.keys(c),u=[];for(let e=0;e<l.length;e++){const t=l[e],i=c[t];i.id=t,u.push(i)}return this.parseLedger(u,o,t,i)}async fetchLedgerEntriesByIds(e,t=void 0,i={}){await this.loadMarkets(),e=e.join(",");const s=this.extend({id:e},i),r=(await this.privatePostQueryLedgers(s)).result,a=Object.keys(r),o=[];for(let e=0;e<a.length;e++){const t=a[e],i=r[t];i.id=t,o.push(i)}return this.parseLedger(o)}async fetchLedgerEntry(e,t=void 0,i={}){return(await this.fetchLedgerEntriesByIds([e],t,i))[0]}parseTrade(e,t=void 0){let i,s,r,a,o,n,d,h,c;if(Array.isArray(e)){i=this.safeTimestamp(e,2),s="s"===e[3]?"sell":"buy",r="l"===e[4]?"limit":"market",a=this.safeString(e,0),o=this.safeString(e,1);e.length>6&&(n=this.safeString(e,6))}else if("string"==typeof e)n=e;else if("ordertxid"in e){const c=this.safeString(e,"pair"),l=this.findMarketByAltnameOrId(c);if(void 0!==l?t=l:void 0!==c&&(t=this.getDelistedMarketById(c)),d=this.safeString(e,"ordertxid"),n=this.safeString2(e,"id","postxid"),i=this.safeTimestamp(e,"time"),s=this.safeString(e,"type"),r=this.safeString(e,"ordertype"),a=this.safeString(e,"price"),o=this.safeString(e,"vol"),"fee"in e){let i;void 0!==t&&(i=t.quote),h={cost:this.safeString(e,"fee"),currency:i}}}void 0!==t&&(c=t.symbol);const l=this.safeString(e,"cost"),u=this.safeBool(e,"maker");let f;return void 0!==u&&(f=u?"maker":"taker"),this.safeTrade({id:n,order:d,info:e,timestamp:i,datetime:this.iso8601(i),symbol:c,type:r,side:s,takerOrMaker:f,price:a,amount:o,cost:l,fee:h},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a=r.id,o={pair:a};void 0!==t&&(o.since=this.numberToString(this.parseToInt(t/1e3))),void 0!==i&&(o.count=i);const n=(await this.publicGetTrades(this.extend(o,s))).result,d=n[a],h=d.length;if(h<=0)return[];const c=d[h-1],l=this.safeString(n,"last");return c.push(l),d[h-1]=c,this.parseTrades(d,r,t,i)}parseBalance(e){const t=this.safeValue(e,"result",{}),i={info:e,timestamp:void 0,datetime:void 0},s=Object.keys(t);for(let e=0;e<s.length;e++){const r=s[e],a=this.safeCurrencyCode(r),o=this.safeValue(t,r,{}),n=this.account();n.used=this.safeString(o,"hold_trade"),n.total=this.safeString(o,"balance"),i[a]=n}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostBalanceEx(e);return this.parseBalance(t)}async createMarketOrderWithCost(e,t,i,s={}){return await this.loadMarkets(),s.cost=i,await this.createOrder(e,"market",t,i,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){return await this.loadMarkets(),await this.createMarketOrderWithCost(e,"buy",t,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o={pair:this.market(e).id,type:i,ordertype:t,volume:this.amountToPrecision(e,s)},n=this.orderRequest("createOrder",e,t,o,s,r,a),d=await this.privatePostAddOrder(this.extend(n[0],n[1])),h=this.safeDict(d,"result");return this.parseOrder(h)}findMarketByAltnameOrId(e){const t=this.safeValue(this.options,"marketsByAltname",{});return e in t?t[e]:this.safeMarket(e)}getDelistedMarketById(e){if(void 0===e)return e;let t=this.safeValue(this.options.delistedMarketsById,e);if(void 0!==t)return t;let i=3,s=3,r=6;8===e.length?(i=4,s=4,r=8):7===e.length&&(i=4,s=4,r=7);const a=e.slice(0,i),o=e.slice(s,r),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o);return t={symbol:n+"/"+d,base:n,quote:d,baseId:a,quoteId:o},this.options.delistedMarketsById[e]=t,t}parseOrderStatus(e){return this.safeString({pending:"open",open:"open",closed:"closed",canceled:"canceled",expired:"expired"},e,e)}parseOrderType(e){return this.safeString({"take-profit":"market","stop-loss":"market","stop-loss-limit":"limit","take-profit-limit":"limit","trailing-stop-limit":"limit"},e,e)}parseOrder(e,t=void 0){const i=this.safeDict(e,"descr",{}),s=this.safeDict(e,"descr");let r,o,n,d,h,c,l;if(r=void 0!==s?this.safeString(s,"order"):this.safeString(e,"descr"),void 0!==r){const e=r.split(" ");o=this.safeString(e,0),c=this.safeString(e,1),d=this.safeString(e,2);const t=this.safeString(e,4),i=this.safeString(e,5);n="limit"===t||"market"===t?t:t+" "+i,"stop loss"===n||"take profit"===n?(l=this.safeString(e,6),h=this.safeString(e,9)):"limit"===n&&(h=this.safeString(e,5))}o=this.safeString(i,"type",o),n=this.safeString(i,"ordertype",n),d=this.safeString(i,"pair",d);const u=this.findMarketByAltnameOrId(d);let f;void 0!==u?t=u:void 0!==d&&(t=this.getDelistedMarketById(d));const p=this.safeTimestamp(e,"opentm");c=this.safeString(e,"vol",c);const m=this.safeString(e,"vol_exec");let g;h=this.safeString(i,"price",h),void 0!==h&&h.endsWith("%")&&(h=void 0),(void 0===h||a.Y.stringEquals(h,"0"))&&(h=this.safeString(i,"price2")),(void 0===h||a.Y.stringEquals(h,"0"))&&(h=this.safeString(e,"price",h));const v=this.safeString(e,"oflags","");let y=v.indexOf("post")>-1;const w=this.safeNumber(e,"price");if(void 0!==t&&(f=t.symbol,"fee"in e)){g={cost:this.safeString(e,"fee"),rate:void 0},v.indexOf("fciq")>=0?g.currency=t.quote:v.indexOf("fcib")>=0&&(g.currency=t.base)}const b=this.parseOrderStatus(this.safeString(e,"status"));let k=this.safeStringN(e,["id","txid","amend_id"]);if(void 0===k||k.startsWith("[")){const t=this.safeList(e,"txid");k=this.safeString(t,0)}const S=this.safeString(e,"userref"),O=this.safeString(e,"cl_ord_id",S),T=this.safeValue(e,"trades",[]),P=[];for(let e=0;e<T.length;e++){const t=T[e];"string"==typeof t?P.push(this.safeTrade({id:t,orderId:k,symbol:f,info:{}})):P.push(t)}let I,M;void 0!==n&&(n.startsWith("take-profit")?(M=this.safeString(i,"price"),h=this.omitZero(this.safeString(i,"price2"))):n.startsWith("stop-loss")?(I=this.safeString(i,"price"),h=this.omitZero(this.safeString(i,"price2"))):"take profit"===n?M=l:"stop loss"===n&&(I=l));let x=this.parseOrderType(n);this.inArray(x,["stop loss","take profit"])&&(x=void 0===h?"market":"limit");return void 0!==this.safeString(e,"amend_id")&&(y=void 0),this.safeOrder({id:k,clientOrderId:O,info:e,timestamp:p,datetime:this.iso8601(p),lastTradeTimestamp:void 0,status:b,symbol:f,type:x,timeInForce:void 0,postOnly:y,side:o,price:h,triggerPrice:l,takeProfitPrice:M,stopLossPrice:I,cost:void 0,amount:c,filled:m,average:w,remaining:void 0,reduceOnly:this.safeBool2(e,"reduceOnly","reduce_only"),fee:g,trades:P},t)}orderRequest(e,t,i,s,r,a=void 0,o={}){const n=this.safeString(o,"clientOrderId");o=this.omit(o,["clientOrderId"]),void 0!==n&&(s.cl_ord_id=n);const d=this.safeString(o,"stopLossPrice"),h=this.safeString(o,"takeProfitPrice"),c=void 0!==d,l=void 0!==h,u=c||l,f=this.safeString(o,"trailingAmount"),p=this.safeString(o,"trailingPercent"),m=this.safeString(o,"trailingLimitAmount"),g=this.safeString(o,"trailingLimitPercent"),v=void 0!==f,y=void 0!==p,w=i.endsWith("limit"),b="market"===i,k=this.safeString(o,"cost"),S=this.safeString(o,"oflags");o=this.omit(o,["cost","oflags"]);const O=void 0!==S&&S.indexOf("viqc")>-1;if(b&&(void 0!==k||O)){s.volume=void 0===k&&void 0!==r?this.costToPrecision(t,this.numberToString(r)):this.costToPrecision(t,k);const e=void 0!==S?S+",viqc":"viqc";s.oflags=e}else!w||v||y||(s.price=this.priceToPrecision(t,a));const T=this.safeBool2(o,"reduceOnly","reduce_only");if(u)c?(s.price=this.priceToPrecision(t,d),s.ordertype=w?"stop-loss-limit":"stop-loss"):l&&(s.price=this.priceToPrecision(t,h),s.ordertype=w?"take-profit-limit":"take-profit"),w&&(s.price2=this.priceToPrecision(t,a));else if(v||y){let e;void 0!==p&&(e=p.endsWith("%")?"+"+p:"+"+p+"%");const t=void 0!==f?"+"+f:void 0,i=this.safeString(o,"offset","-"),r=void 0!==m?i+this.numberToString(m):void 0,a=this.safeString(o,"trigger","last");if(s.trigger=a,w||void 0!==m||void 0!==g)if(s.ordertype="trailing-stop-limit",void 0!==g){const t=g.endsWith("%")?i+g:i+g+"%";s.price=e,s.price2=t}else void 0!==m&&(s.price=t,s.price2=r);else s.ordertype="trailing-stop",s.price=void 0!==p?e:t}T&&(s.reduce_only="createOrderWs"===e||"true");let P=this.safeDict(o,"close");if(void 0!==P){P=this.extend({},P);const e=this.safeValue(P,"price");void 0!==e&&(P.price=this.priceToPrecision(t,e));const i=this.safeValue(P,"price2");void 0!==i&&(P.price2=this.priceToPrecision(t,i)),s.close=P}const I=this.safeString2(o,"timeInForce","timeinforce");void 0!==I&&(s.timeinforce=I);const M="market"===i;let x;if([x,o]=this.handlePostOnly(M,!1,o),x){const e=void 0!==S?S+",post":"post";s.oflags=e}return void 0===S||"oflags"in s||(s.oflags=S),[s,o=this.omit(o,["timeInForce","reduceOnly","stopLossPrice","takeProfitPrice","trailingAmount","trailingPercent","trailingLimitAmount","trailingLimitPercent","offset"])]}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);if(!d.spot)throw new r.NotSupported(this.id+" editOrder() does not support "+d.type+" orders, only spot orders are accepted");let h={txid:e};const c=this.safeString2(n,"clientOrderId","cl_ord_id");void 0!==c&&(h.cl_ord_id=c,n=this.omit(n,["clientOrderId","cl_ord_id"]),h=this.omit(h,"txid"));const l="market"===i;let u;[u,n]=this.handlePostOnly(l,!1,n),u&&(h.post_only="true"),void 0!==a&&(h.order_qty=this.amountToPrecision(t,a)),void 0!==o&&(h.limit_price=this.priceToPrecision(t,o));let f=this.safeStringN(n,["stopLossPrice","takeProfitPrice","trailingAmount","trailingPercent","trailingLimitAmount","trailingLimitPercent"]);if(void 0!==f){const e=this.safeString(n,"offset");n=this.omit(n,["stopLossPrice","takeProfitPrice","trailingAmount","trailingPercent","trailingLimitAmount","trailingLimitPercent","offset"]),void 0!==e?(f=e+f,h.trigger_price=f):h.trigger_price=this.priceToPrecision(t,f)}const p=await this.privatePostAmendOrder(this.extend(h,n)),m=this.safeDict(p,"result",{});return this.parseOrder(m,d)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeValue2(i,"userref","clientOrderId"),a={trades:!0,txid:e};let o=i;void 0!==s&&(a.userref=s,o=this.omit(i,["userref","clientOrderId"]));const n=await this.privatePostQueryOrders(this.extend(a,o)),d=this.safeValue(n,"result",[]);if(!(e in d))throw new r.OrderNotFound(this.id+" fetchOrder() could not find order id "+e);return this.parseOrder(this.extend({id:e},d[e]))}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){const o=this.safeValue(a,"trades"),n=[];if(void 0===o)throw new r.ArgumentsRequired(this.id+" fetchOrderTrades() requires a unified order structure in the params argument or a 'trades' param (an array of trade id strings)");for(let e=0;e<o.length;e++){const t=o[e];"string"==typeof t?n.push(t):n.push(t.id)}await this.loadMarkets(),void 0!==t&&(t=this.symbol(t));const d=this.safeValue(this.options,"fetchOrderTrades",{}),h=this.safeInteger(d,"batchSize",20),c=n.length;let l=this.parseToInt(c/h);l=this.sum(l,1);let u=[];for(let e=0;e<l;e++){const r=[];for(let t=0;t<h;t++){const i=this.sum(e*h,t);i<c&&r.push(n[i])}const a={txid:r.join(",")},o=await this.privatePostQueryTrades(a),d=this.safeValue(o,"result"),l=Object.keys(d);for(let e=0;e<l.length;e++)d[l[e]].id=l[e];const f=this.parseTrades(d,void 0,i,s),p=this.filterBySymbol(f,t);u=this.arrayConcat(u,p)}return u}async fetchOrdersByIds(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privatePostQueryOrders(this.extend({trades:!0,txid:e.join(",")},i)),r=this.safeValue(s,"result",{}),a=[],o=Object.keys(r);for(let e=0;e<o.length;e++){const t=o[e],i=r[t],s=this.parseOrder(this.extend({id:t},i));a.push(s)}return a}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==t&&(r.start=this.parseToInt(t/1e3));const o=this.safeStringN(s,["until","till"]);if(void 0!==o){s=this.omit(s,["until","till"]);const e=a.Y.stringDiv(o,"1000");r.end=this.parseToInt(a.Y.stringAdd(e,"1"))}const n=(await this.privatePostTradesHistory(this.extend(r,s))).result.trades,d=Object.keys(n);for(let e=0;e<d.length;e++)n[d[e]].id=d[e];let h;return void 0!==e&&(h=this.market(e)),this.parseTrades(n,h,t,i)}async cancelOrder(e,t=void 0,i={}){let s;await this.loadMarkets();const a=this.safeValue(i,"userref",e);i=this.omit(i,"userref");let o={txid:a};const n=this.safeString2(i,"clientOrderId","cl_ord_id");void 0!==n&&(o.cl_ord_id=n,i=this.omit(i,["clientOrderId","cl_ord_id"]),o=this.omit(o,"txid"));try{s=await this.privatePostCancelOrder(this.extend(o,i))}catch(e){if(this.last_http_response&&this.last_http_response.indexOf("EOrder:Unknown order")>=0)throw new r.OrderNotFound(this.id+" cancelOrder() error "+this.last_http_response);throw e}return this.safeOrder({info:s})}async cancelOrders(e,t=void 0,i={}){const s={orders:e},r=await this.privatePostCancelOrderBatch(this.extend(s,i));return[this.safeOrder({info:r})]}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostCancelAll(t);return[this.safeOrder({info:i})]}async cancelAllOrdersAfter(e,t={}){if(e>864e5)throw new r.BadRequest(this.id+" cancelAllOrdersAfter timeout should be less than 86400000 milliseconds");await this.loadMarkets();const i={timeout:e>0?this.parseToInt(e/1e3):0};return await this.privatePostCancelAllOrdersAfter(this.extend(i,t))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==t&&(r.start=this.parseToInt(t/1e3));const a=this.safeInteger(s,"userref");void 0!==a&&(r.userref=a,s=this.omit(s,"userref"));const o=this.safeString(s,"clientOrderId");void 0!==o&&(r.cl_ord_id=o,s=this.omit(s,"clientOrderId"));const n=await this.privatePostOpenOrders(this.extend(r,s));let d;void 0!==e&&(d=this.market(e));const h=this.safeDict(n,"result",{}),c=this.safeDict(h,"open",{}),l=[],u=Object.keys(c);for(let e=0;e<u.length;e++){const t=u[e],i=c[t];l.push(this.extend({id:t},i))}return this.parseOrders(l,d,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={};void 0!==t&&(r.start=this.parseToInt(t/1e3));const a=this.safeInteger(s,"userref");void 0!==a&&(r.userref=a,s=this.omit(s,"userref"));const o=this.safeString(s,"clientOrderId");void 0!==o&&(r.cl_ord_id=o,s=this.omit(s,"clientOrderId")),[r,s]=this.handleUntilOption("end",r,s);const n=await this.privatePostClosedOrders(this.extend(r,s));let d;void 0!==e&&(d=this.market(e));const h=this.safeDict(n,"result",{}),c=this.safeDict(h,"closed",{}),l=[],u=Object.keys(c);for(let e=0;e<u.length;e++){const t=u[e],i=c[t];l.push(this.extend({id:t},i))}return this.parseOrders(l,d,t,i)}parseTransactionStatus(e){return this.safeString({Initial:"pending",Pending:"pending",Success:"ok",Settled:"pending",Failure:"failed",Partial:"ok"},e,e)}parseNetwork(e){const t=this.safeValue(this.options,"withdrawMethods",{});return this.safeString(t,e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"refid"),s=this.safeString(e,"txid"),r=this.safeTimestamp(e,"time"),a=this.safeString(e,"asset"),o=this.safeCurrencyCode(a,t),n=this.safeString(e,"info"),d=this.safeNumber(e,"amount");let h=this.parseTransactionStatus(this.safeString(e,"status"));const c=this.safeString(e,"status-prop");("on-hold"===c||"cancel-pending"===c||"onhold"===c)&&(h="pending");const l=this.safeString(e,"type");let u=this.safeNumber(e,"fee");return void 0===u&&"deposit"===l&&(u=0),{info:e,id:i,currency:o,amount:d,network:this.parseNetwork(this.safeString(e,"network")),address:n,addressTo:void 0,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,status:h,type:l,updated:void 0,txid:s,timestamp:r,datetime:this.iso8601(r),comment:void 0,internal:void 0,fee:{currency:o,cost:u}}}parseTransactionsByType(e,t,i=void 0,s=void 0,r=void 0){const a=[];for(let i=0;i<t.length;i++){const s=this.parseTransaction(this.extend({type:e},t[i]));a.push(s)}return this.filterByCurrencySinceLimit(a,i,s,r)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==e){const t=this.currency(e);r.asset=t.id}if(void 0!==t){const e=this.numberToString(t);r.start=a.Y.stringDiv(e,"1000")}const o=this.safeStringN(s,["until","till"]);if(void 0!==o){s=this.omit(s,["until","till"]);const e=a.Y.stringDiv(o,"1000");r.end=a.Y.stringAdd(e,"1")}const n=await this.privatePostDepositStatus(this.extend(r,s));return this.parseTransactionsByType("deposit",n.result,e,t,i)}async fetchTime(e={}){const t=await this.publicGetTime(e),i=this.safeValue(t,"result",{});return this.safeTimestamp(i,"unixtime")}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return s.cursor=!0,await this.fetchPaginatedCallCursor("fetchWithdrawals",e,t,i,s,"next_cursor","cursor");const o={};if(void 0!==e){const t=this.currency(e);o.asset=t.id}if(void 0!==t){const e=this.numberToString(t);o.start=a.Y.stringDiv(e,"1000")}const n=this.safeStringN(s,["until","till"]);if(void 0!==n){s=this.omit(s,["until","till"]);const e=a.Y.stringDiv(n,"1000");o.end=a.Y.stringAdd(e,"1")}const d=await this.privatePostWithdrawStatus(this.extend(o,s));let h;const c=this.safeValue(d,"result");return h=Array.isArray(c)?c:this.addPaginationCursorToResult(c),this.parseTransactionsByType("withdrawal",h,e,t,i)}addPaginationCursorToResult(e){const t=this.safeString(e,"next_cursor"),i=this.safeValue(e,"withdrawals"),s=i.length;if(void 0!==t&&s>0){const e=i[s-1];e.next_cursor=t,i[s-1]=e}return i}async createDepositAddress(e,t={}){return await this.fetchDepositAddress(e,this.extend({new:"true"},t))}async fetchDepositMethods(e,t={}){await this.loadMarkets();const i={asset:this.currency(e).id},s=await this.privatePostDepositMethods(this.extend(i,t));return this.safeValue(s,"result")}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e);let s=this.safeStringUpper(t,"network");const a=this.safeValue(this.options,"networks",{});s=this.safeString(a,s,s),t=this.omit(t,"network"),"USDT"===e&&"TRC20"===s&&(e=e+"-"+s);const o=this.safeValue(this.options,"depositMethods",{}),n=this.safeString(o,e);let d=this.safeString(t,"method",n);if(void 0===d){const t=await this.fetchDepositMethods(e);if(void 0!==s)for(let e=0;e<t.length;e++){const i=this.safeString(t[e],"method");if(i.indexOf(s)>=0){d=i;break}}if(void 0===d){const e=this.safeValue(t,0,{});d=this.safeString(e,"method")}}const h={asset:i.id,method:d},c=await this.privatePostDepositAddresses(this.extend(h,t)),l=this.safeValue(c,"result",[]),u=this.safeValue(l,0,{});if(void 0===u)throw new r.InvalidAddress(this.id+" privatePostDepositAddresses() returned no addresses for "+e);return this.parseDepositAddress(u,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"tag"),r=(t=this.safeCurrency(void 0,t)).code;return this.checkAddress(i),{info:e,currency:r,network:void 0,address:i,tag:s}}async withdraw(e,t,i,s=void 0,a={}){if([s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),"key"in a){await this.loadMarkets();const s=this.currency(e),r={asset:s.id,amount:t,address:i},o=await this.privatePostWithdraw(this.extend(r,a)),n=this.safeDict(o,"result",{});return this.parseTransaction(n,s)}throw new r.ExchangeError(this.id+" withdraw() requires a 'key' parameter (withdrawal key name, as set up on your account)")}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostOpenPositions(this.extend({docalcs:"true",consolidation:"market"},t));e=this.marketSymbols(e);const s=this.safeList(i,"result"),r=this.parsePositions(s,e);return this.filterByArrayPositions(r,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"pair"),s="buy"===this.safeString(e,"type")?"long":"short";return this.safePosition({info:e,id:void 0,symbol:this.safeSymbol(i,t),notional:void 0,marginMode:void 0,liquidationPrice:void 0,entryPrice:void 0,unrealizedPnl:this.safeNumber(e,"net"),realizedPnl:void 0,percentage:void 0,contracts:this.safeNumber(e,"vol"),contractSize:void 0,markPrice:void 0,lastPrice:void 0,side:s,hedged:void 0,timestamp:void 0,datetime:void 0,lastUpdateTimestamp:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:void 0,initialMargin:this.safeNumber(e,"margin"),initialMarginPercentage:void 0,leverage:this.safeNumber(e,"leverage"),marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}parseAccountType(e){return this.safeString({spot:"Spot Wallet",swap:"Futures Wallet",future:"Futures Wallet"},e,e)}async transferOut(e,t,i={}){return await this.transfer(e,t,"spot","swap",i)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e);i=this.parseAccountType(i),s=this.parseAccountType(s);const n={amount:this.currencyToPrecision(e,t),from:i,to:s,asset:o.id};if("Spot Wallet"!==i)throw new r.BadRequest(this.id+" transfer cannot transfer from "+i+" to "+s+". Use krakenfutures instead to transfer from the futures account.");const d=await this.privatePostWalletTransfer(this.extend(n,a)),h=this.parseTransfer(d,o);return this.extend(h,{amount:t,fromAccount:i,toAccount:s})}parseTransfer(e,t=void 0){const i=this.safeValue(e,"result",{});return{info:e,id:this.safeString(i,"refid"),timestamp:void 0,datetime:void 0,currency:this.safeString(t,"code"),amount:void 0,fromAccount:void 0,toAccount:void 0,status:"sucess"}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o="/"+this.version+"/"+t+"/"+e;if("public"===t)Object.keys(s).length&&(o+="?"+this.urlencodeNested(s));else if("private"===t){const t=this.safeString(s,"price");let i=!1;void 0!==t&&(i=!!t.endsWith("%"));const h="CancelOrderBatch"===e;this.checkRequiredCredentials();const c=this.nonce().toString();a=h||i?this.json(this.extend({nonce:c},s)):this.urlencodeNested(this.extend({nonce:c},s));const l=this.encode(c+a),u=this.hash(l,n.s,"binary"),f=this.encode(o),p=this.binaryConcat(f,u),m=this.base64ToBinary(this.secret),g=this.hmac(p,m,d.Zf,"base64");(r={"API-Key":this.apiKey,"API-Sign":g})["Content-Type"]=h||i?"application/json":"application/x-www-form-urlencoded"}else o="/"+e;return o=this.urls.api[t]+o,{url:o,method:i,body:a,headers:r}}nonce(){return this.milliseconds()-this.options.timeDifference}handleErrors(e,t,i,s,a,o,n,d,h){if(520===e)throw new r.ExchangeNotAvailable(this.id+" "+e.toString()+" "+t);if(void 0!==n&&"{"===o[0]&&"string"!=typeof n&&"error"in n){if(n.error.length){const e=this.id+" "+o;for(let t=0;t<n.error.length;t++){const i=n.error[t];this.throwExactlyMatchedException(this.exceptions.exact,i,e),this.throwExactlyMatchedException(this.exceptions.broad,i,e)}throw new r.ExchangeError(e)}}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"krakenfutures",name:"Kraken Futures",countries:["US"],version:"v3",userAgent:void 0,rateLimit:600,pro:!0,has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!0,option:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,createMarketOrder:!1,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:void 0,fetchFundingRate:"emulated",fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchLeverage:!0,fetchLeverages:!0,fetchLeverageTiers:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!1,fetchOrderBook:!0,fetchOrders:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchTickers:!0,fetchTrades:!0,sandbox:!0,setLeverage:!0,setMarginMode:!1,transfer:!0},urls:{test:{public:"https://demo-futures.kraken.com/derivatives/api/",private:"https://demo-futures.kraken.com/derivatives/api/",charts:"https://demo-futures.kraken.com/api/charts/",history:"https://demo-futures.kraken.com/api/history/",www:"https://demo-futures.kraken.com"},logo:"https://user-images.githubusercontent.com/24300605/81436764-b22fd580-9172-11ea-9703-742783e6376d.jpg",api:{charts:"https://futures.kraken.com/api/charts/",history:"https://futures.kraken.com/api/history/",feeschedules:"https://futures.kraken.com/api/feeschedules/",public:"https://futures.kraken.com/derivatives/api/",private:"https://futures.kraken.com/derivatives/api/"},www:"https://futures.kraken.com/",doc:["https://docs.futures.kraken.com/#introduction"],fees:"https://support.kraken.com/hc/en-us/articles/360022835771-Transaction-fees-and-rebates-for-Kraken-Futures",referral:void 0},api:{public:{get:["feeschedules","instruments","orderbook","tickers","history","historicalfundingrates"]},private:{get:["feeschedules/volumes","openpositions","notifications","accounts","openorders","recentorders","fills","transfers","leveragepreferences","pnlpreferences","assignmentprogram/current","assignmentprogram/history"],post:["sendorder","editorder","cancelorder","transfer","batchorder","cancelallorders","cancelallordersafter","withdrawal","assignmentprogram/add","assignmentprogram/delete"],put:["leveragepreferences","pnlpreferences"]},charts:{get:["{price_type}/{symbol}/{interval}"]},history:{get:["orders","executions","triggers","accountlogcsv","account-log","market/{symbol}/orders","market/{symbol}/executions"]}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0005"),maker:this.parseNumber("0.0002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0005")],[this.parseNumber("100000"),this.parseNumber("0.0004")],[this.parseNumber("1000000"),this.parseNumber("0.0003")],[this.parseNumber("5000000"),this.parseNumber("0.00025")],[this.parseNumber("10000000"),this.parseNumber("0.0002")],[this.parseNumber("20000000"),this.parseNumber("0.00015")],[this.parseNumber("50000000"),this.parseNumber("0.000125")],[this.parseNumber("100000000"),this.parseNumber("0.0001")]],maker:[[this.parseNumber("0"),this.parseNumber("0.0002")],[this.parseNumber("100000"),this.parseNumber("0.0015")],[this.parseNumber("1000000"),this.parseNumber("0.000125")],[this.parseNumber("5000000"),this.parseNumber("0.0001")],[this.parseNumber("10000000"),this.parseNumber("0.000075")],[this.parseNumber("20000000"),this.parseNumber("0.00005")],[this.parseNumber("50000000"),this.parseNumber("0.000025")],[this.parseNumber("100000000"),this.parseNumber("0")]]}}},exceptions:{exact:{apiLimitExceeded:a.RateLimitExceeded,marketUnavailable:a.ContractUnavailable,requiredArgumentMissing:a.BadRequest,unavailable:a.ExchangeNotAvailable,authenticationError:a.AuthenticationError,accountInactive:a.ExchangeError,invalidAccount:a.BadRequest,invalidAmount:a.BadRequest,insufficientFunds:a.InsufficientFunds,"Bad Request":a.BadRequest,Unavailable:a.ExchangeNotAvailable,invalidUnit:a.BadRequest,"Json Parse Error":a.ExchangeError,nonceBelowThreshold:a.InvalidNonce,nonceDuplicate:a.InvalidNonce,notFound:a.BadRequest,"Server Error":a.ExchangeError,unknownError:a.ExchangeError},broad:{invalidArgument:a.BadRequest,nonceBelowThreshold:a.InvalidNonce,nonceDuplicate:a.InvalidNonce}},precisionMode:r.kb,options:{access:{history:{GET:{orders:"private",executions:"private",triggers:"private",accountlogcsv:"private"}}},settlementCurrencies:{flex:["USDT","BTC","USD","GBP","EUR","USDC"]},symbol:{quoteIds:["USD","XBT"],reversed:!1},versions:{public:{GET:{historicalfundingrates:"v4"}},charts:{GET:{"{price_type}/{symbol}/{interval}":"v1"}},history:{GET:{orders:"v2",executions:"v2",triggers:"v2",accountlogcsv:"v2"}}},fetchTrades:{method:"historyGetMarketSymbolExecutions"}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:{max:100},fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:1e5,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:void 0,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:5e3}},spot:void 0,swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","12h":"12h","1d":"1d","1w":"1w"}})}async fetchMarkets(e={}){const t=await this.publicGetInstruments(e),i=this.safeValue(t,"instruments",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeString(t,"type");let o;const n=a.indexOf(" index")>=0;let d,h,c;if(n)o="index";else{d=a.indexOf("_vanilla")>=0,h=!d;const e=this.safeString(t,"lastTradingTime");o=void 0===e?"swap":"future",c=this.parse8601(e)}const l="swap"===o,u="future"===o;let f=r;const p=r.split("_"),m=this.safeString(p,1),g=m.slice(0,m.length-3),v="usd",y=this.safeCurrencyCode(g),w=this.safeCurrencyCode(v);let b,k;const S=this.safeString(t,"contractValueTradePrecision"),O=this.parseNumber(this.integerPrecisionToAmount(S)),T=this.safeNumber(t,"tickSize"),P=l||u||n;if(l||u){"futures_inverse"===this.safeString(t,"type")?(b=y,k=g,h=!0):(b=w,k=v,h=!1),d=!h,f=y+"/"+w+":"+b,u&&(f=f+"-"+this.yymmdd(c))}s.push({id:r,symbol:f,base:y,quote:w,settle:b,baseId:g,quoteId:v,settleId:k,type:o,spot:!1,margin:!1,swap:l,future:u,option:!1,index:n,active:void 0,contract:P,linear:d,inverse:h,contractSize:this.safeNumber(t,"contractSize"),maintenanceMarginRate:void 0,expiry:c,expiryDatetime:this.iso8601(c),strike:void 0,optionType:void 0,precision:{amount:O,price:T},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:this.parse8601(this.safeString(t,"openingDate")),info:t})}const r=this.options.settlementCurrencies.flex,a=[];for(let e=0;e<r.length;e++){const t=r[e];a.push({id:t.toLowerCase(),numericId:void 0,code:t,precision:void 0})}return this.currencies=this.deepExtend(a,this.currencies),s}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id},r=await this.publicGetOrderbook(this.extend(s,i)),a=this.parse8601(r.serverTime);return this.parseOrderBook(r.orderBook,e,a)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t),s=this.safeList(i,"tickers");return this.parseTickers(s,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.parse8601(this.safeString(e,"lastTime")),a=this.safeString(e,"open24h"),n=this.safeString(e,"last"),d=o.Y.stringSub(n,a),h=o.Y.stringMul(o.Y.stringDiv(d,a),"100"),c=o.Y.stringDiv(o.Y.stringAdd(a,n),"2"),l=this.safeString(e,"vol24h");let u,f;return this.safeBool(t,"index",!1)||(t.linear?u=l:t.inverse&&(f=l)),this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:void 0,low:void 0,bid:this.safeString(e,"bid"),bidVolume:this.safeString(e,"bidSize"),ask:this.safeString(e,"ask"),askVolume:this.safeString(e,"askSize"),vwap:void 0,open:a,close:n,last:n,previousClose:void 0,change:d,percentage:h,average:c,baseVolume:u,quoteVolume:f,markPrice:this.safeString(e,"markPrice"),indexPrice:this.safeString(e,"indexPrice"),info:e})}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,5e3);const n={symbol:a.id,price_type:this.safeString(r,"price","trade"),interval:this.timeframes[t]};if(r=this.omit(r,"price"),void 0!==i){const e=this.parseTimeframe(t);n.from=this.parseToInt(i/1e3),void 0===s&&(s=5e3),s=Math.min(s,5e3);const r=this.sum(n.from,s*e-1),a=this.seconds();n.to=Math.min(r,a)}else if(void 0!==s){s=Math.min(s,5e3);const e=this.parseTimeframe(t);n.to=this.seconds(),n.from=this.parseToInt(n.to-e*s)}const d=await this.chartsGetPriceTypeSymbolInterval(this.extend(n,r)),h=this.safeList(d,"candles");return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"time"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchTrades",e,t,i,s);const a=this.market(e);let o,n,d={symbol:a.id};[o,s]=this.handleOptionAndParams(s,"fetchTrades","method","historyGetMarketSymbolExecutions");if("historyGetMarketSymbolExecutions"===o){[d,s]=this.handleUntilOption("before",d,s),void 0!==t&&(d.since=t,d.sort="asc"),void 0!==i&&(d.count=i);const e=await this.historyGetMarketSymbolExecutions(this.extend(d,s)),r=this.safeList(e,"elements",[]);n=[];const a=r.length;for(let e=0;e<a;e++){const t=r[a-1-e],i=this.safeDict(t,"event",{}),s=this.safeDict(i,"Execution",{}),o=this.safeDict(s,"execution",{});n.push(o)}}else{[d,s]=this.handleUntilOption("lastTime",d,s);const e=await this.publicGetHistory(this.extend(d,s));n=this.safeList(e,"history",[])}return this.parseTrades(n,a,t,i)}parseTrade(e,t=void 0){let i=this.parse8601(this.safeString2(e,"time","fillTime"));const s=this.safeString(e,"price"),r=this.safeStringN(e,["size","amount","quantity"],"0.0");let a=this.safeString2(e,"uid","fill_id");void 0===a&&(a=this.safeString(e,"executionId"));let n,d=this.safeString(e,"order_id"),h=this.safeString(e,"symbol"),c=this.safeString(e,"side");const l=this.safeValue(e,"orderPriorEdit"),u=this.safeValue(e,"orderPriorExecution");let f;void 0!==u?(d=this.safeString(u,"orderId"),h=this.safeString(u,"symbol"),c=this.safeString(u,"side"),n=this.safeString(u,"type")):void 0!==l&&(d=this.safeString(l,"orderId"),h=this.safeString(l,"symbol"),c=this.safeString(l,"type"),n=this.safeString(l,"type")),void 0!==n&&(n=this.parseOrderType(n)),t=this.safeMarket(h,t);const p=this.safeBool(t,"linear");if(void 0!==r&&void 0!==s&&void 0!==t){f=p?o.Y.stringMul(r,s):o.Y.stringDiv(r,s);const e=this.safeString(t,"contractSize");f=o.Y.stringMul(f,e)}let m;const g=this.safeString(e,"fillType");void 0!==g&&(g.indexOf("taker")>=0?m="taker":g.indexOf("maker")>=0&&(m="maker"));if("takerOrder"in e){i=this.safeInteger(e,"timestamp");const t=this.safeDict(e,"takerOrder",{});void 0!==t&&(c=this.safeStringLower(t,"direction"),m="taker")}return this.safeTrade({info:e,id:a,symbol:this.safeString(t,"symbol"),timestamp:i,datetime:this.iso8601(i),order:d,type:n,side:c,takerOrMaker:m,price:s,amount:p?r:void 0,cost:f,fee:void 0})}createOrderRequest(e,t,i,s,r=void 0,a={}){const o=this.market(e);e=o.symbol,t=this.safeString(a,"orderType",t);const n=this.safeString(a,"timeInForce");let d=!1;[d,a]=this.handlePostOnly("market"===t,"post"===t,a),d?t="post":"ioc"===n?t="ioc":"limit"===t?t="lmt":"market"===t&&(t="mkt");const h={symbol:o.id,side:i,size:this.amountToPrecision(e,s)},c=this.safeString2(a,"clientOrderId","cliOrdId");void 0!==c&&(h.cliOrdId=c);const l=this.safeString2(a,"triggerPrice","stopPrice"),u=void 0!==l,f=this.safeString(a,"stopLossPrice"),p=this.safeString(a,"takeProfitPrice"),m=void 0!==f,g=void 0!==p,v=m||g,y=this.safeString(a,"triggerSignal","last");let w=this.safeValue(a,"reduceOnly");return(v||u)&&(h.triggerSignal=y),u?(t="stp",h.stopPrice=this.priceToPrecision(e,l)):v&&(w=!0,m?(t="stp",h.stopPrice=this.priceToPrecision(e,f)):g&&(t="take_profit",h.stopPrice=this.priceToPrecision(e,p))),w&&(h.reduceOnly=!0),h.orderType=t,void 0!==r&&(h.limitPrice=this.priceToPrecision(e,r)),a=this.omit(a,["clientOrderId","timeInForce","triggerPrice","stopLossPrice","takeProfitPrice"]),this.extend(h,a)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.createOrderRequest(e,t,i,s,r,a),d=await this.privatePostSendorder(n),h=this.safeValue(d,"sendStatus"),c=this.safeString(h,"status");return this.verifyOrderActionSuccess(c,"createOrder",["filled"]),this.parseOrder(h,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"symbol"),o=this.safeString(r,"type"),n=this.safeString(r,"side"),d=this.safeValue(r,"amount"),h=this.safeValue(r,"price"),c=this.safeValue(r,"params",{}),l=this.extend(c,t);"order_tag"in l||(l.order_tag=this.sum(s,1).toString()),l.order="send";const u=this.createOrderRequest(a,o,n,d,h,l);i.push(u)}const s={batchOrder:i},r=await this.privatePostBatchorder(this.extend(s,t)),a=this.safeList(r,"batchStatus",[]);return this.parseOrders(a)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n={orderId:e};void 0!==r&&(n.size=r),void 0!==a&&(n.limitPrice=a);const d=await this.privatePostEditorder(this.extend(n,o)),h=this.safeString(d.editStatus,"status");this.verifyOrderActionSuccess(h,"editOrder",["filled"]);const c=this.parseOrder(d.editStatus);return c.info=d,c}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privatePostCancelorder(this.extend({order_id:e},i)),r=this.safeString(this.safeValue(s,"cancelStatus",{}),"status");this.verifyOrderActionSuccess(r,"cancelOrder");let a={};return"cancelStatus"in s&&(a=this.parseOrder(s.cancelStatus)),this.extend({info:s},a)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=[],r=this.safeValue(i,"clientOrderIds",[]);if(r.length>0)for(let e=0;e<r.length;e++)s.push({order:"cancel",cliOrdId:r[e]});else for(let t=0;t<e.length;t++)s.push({order:"cancel",order_id:e[t]});const a={batchOrder:s},o=await this.privatePostBatchorder(this.extend(a,i)),n=this.safeList(o,"batchStatus",[]);return this.parseOrders(n)}async cancelAllOrders(e=void 0,t={}){const i={};void 0!==e&&(i.symbol=this.marketId(e));const s=await this.privatePostCancelallorders(this.extend(i,t)),r=this.safeDict(s,"cancelStatus"),a=this.safeList(r,"orderEvents",[]),o=[];for(let e=0;e<a.length;e++){const e=this.safeDict(a,0),t=this.safeDict(e,"order",{});o.push(t)}return this.parseOrders(o)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={timeout:e>0?this.parseToInt(e/1e3):0};return await this.privatePostCancelallordersafter(this.extend(i,t))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privateGetOpenorders(s),o=this.safeList(a,"openOrders",[]);return this.parseOrders(o,r,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==i&&(a.count=i),void 0!==t&&(a.from=t);const o=await this.historyGetOrders(this.extend(a,s)),n=this.safeList(o,"elements",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeDict(t,"event",{}),s=this.safeDict(i,"OrderPlaced");if(void 0!==s){const e=this.safeDict(s,"order",{});"0"!==this.safeString(e,"filled")&&(e.status="closed",d.push(e))}}return this.parseOrders(d,r,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==i&&(a.count=i),void 0!==t&&(a.from=t);const o=await this.historyGetOrders(this.extend(a,s)),n=this.safeList(o,"elements",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeDict(t,"event",{}),s=this.safeDict(i,"OrderPlaced");if(void 0!==s){const e=this.safeDict(s,"order",{});"0"===this.safeString(e,"filled")&&(e.status="canceled",d.push(e))}const r=this.safeDict(i,"OrderCancelled");if(void 0!==r){const e=this.safeDict(r,"order",{});e.status="canceled",d.push(e)}const a=this.safeDict(i,"OrderRejected");if(void 0!==a){const e=this.safeDict(a,"order",{});e.status="rejected",d.push(e)}}return this.parseOrders(d,r,t,i)}parseOrderType(e){return this.safeString({lmt:"limit",mkt:"market",post:"limit",ioc:"market"},e,e)}verifyOrderActionSuccess(e,t,i=[]){const s={invalidOrderType:a.InvalidOrder,invalidSide:a.InvalidOrder,invalidSize:a.InvalidOrder,invalidPrice:a.InvalidOrder,insufficientAvailableFunds:a.InsufficientFunds,selfFill:a.ExchangeError,tooManySmallOrders:a.ExchangeError,maxPositionViolation:a.BadRequest,marketSuspended:a.ExchangeNotAvailable,marketInactive:a.ExchangeNotAvailable,clientOrderIdAlreadyExist:a.DuplicateOrderId,clientOrderIdTooLong:a.BadRequest,outsidePriceCollar:a.InvalidOrder,postWouldExecute:a.OrderImmediatelyFillable,iocWouldNotExecute:a.OrderNotFillable,wouldNotReducePosition:a.ExchangeError,orderForEditNotFound:a.OrderNotFound,orderForEditNotAStop:a.InvalidOrder,filled:a.OrderNotFound,notFound:a.OrderNotFound};if(e in s&&!this.inArray(e,i))throw new s[e](this.id+": "+t+" failed due to "+e)}parseOrderStatus(e){return this.safeString({placed:"open",cancelled:"canceled",invalidOrderType:"rejected",invalidSide:"rejected",invalidSize:"rejected",invalidPrice:"rejected",insufficientAvailableFunds:"rejected",selfFill:"rejected",tooManySmallOrders:"rejected",maxPositionViolation:"rejected",marketSuspended:"rejected",marketInactive:"rejected",clientOrderIdAlreadyExist:"rejected",clientOrderIdTooLong:"rejected",outsidePriceCollar:"rejected",postWouldExecute:"rejected",iocWouldNotExecute:"rejected",wouldNotReducePosition:"rejected",edited:"open",orderForEditNotFound:"rejected",orderForEditNotAStop:"rejected",filled:"closed",notFound:"rejected",untouched:"open",partiallyFilled:"open"},e,e)}parseOrder(e,t=void 0){const i=this.safeValue(e,"orderEvents",[]),s=this.safeString(e,"status"),r=i.length;if("orderEvents"in e&&void 0!==s&&0===r)return this.safeOrder({info:e,status:"rejected"});let a,n,d,h=!1,c=!1,l=[];if(r){const t=[];for(let e=0;e<i.length;e++){const s=i[e];"EXECUTION"===this.safeString(s,"type")&&t.push(s);const r=this.safeValue(s,"orderTrigger");if(void 0===a)if(a=this.safeValue2(s,"new","order",r),void 0!==a)h=!1,c=!0;else if(!c){const e=this.safeValue(s,"orderPriorExecution");a=this.safeValue2(s,"orderPriorExecution","orderPriorEdit"),d=this.safeString(e,"limitPrice"),void 0!==a&&(h=!0)}}l=this.parseTrades(t),n=this.safeString(e,"status")}void 0===a&&(a=e),void 0===n&&(n=this.safeString(a,"status"));let u=this.parseOrderStatus(n),f=this.inArray(u,["canceled","rejected","closed"]);const p=this.safeString(a,"symbol");t=this.safeMarket(p,t);const m=this.parse8601(this.safeString2(a,"timestamp","receivedTime")),g=this.parse8601(this.safeString(a,"lastUpdateTime"));void 0===d&&(d=this.safeString(a,"limitPrice"));let v,y=this.safeString(a,"quantity"),w=this.safeString2(a,"filledSize","filled","0.0"),b=this.safeString(a,"unfilledSize"),k="0.0";if(l.length>0){let e="0.0";for(let t=0;t<l.length;t++){const i=l[t],s=this.safeString(i,"amount"),r=this.safeString(i,"price");k=o.Y.stringAdd(k,s),e=o.Y.stringAdd(e,o.Y.stringMul(s,r))}v=o.Y.stringDiv(e,k),void 0!==y&&!f&&h&&o.Y.stringGe(k,y)&&(u="closed",f=!0),w=h?o.Y.stringAdd(w,k):o.Y.stringMax(w,k)}let S;if(void 0===b&&(h?void 0!==y&&(b=o.Y.stringSub(y,k)):b=y),void 0!==y||h||void 0===b||(y=o.Y.stringAdd(w,b)),void 0!==w&&void 0!==t){const e=void 0!==v?v:d;void 0!==e&&(S=t.linear?o.Y.stringMul(w,e):o.Y.stringDiv(w,e))}let O=this.safeString2(e,"order_id","orderId");void 0===O&&(O=this.safeString2(a,"orderId","uid"));const T=this.safeStringLower2(a,"type","orderType");let P="gtc";return"ioc"!==T&&"market"!==this.parseOrderType(T)||(P="ioc"),this.safeOrder({info:e,id:O,clientOrderId:this.safeStringN(a,["clientOrderId","clientId","cliOrdId"]),timestamp:m,datetime:this.iso8601(m),lastTradeTimestamp:void 0,lastUpdateTimestamp:g,symbol:this.safeString(t,"symbol"),type:this.parseOrderType(T),timeInForce:P,postOnly:"post"===T,reduceOnly:this.safeBool2(a,"reduceOnly","reduce_only"),side:this.safeString(a,"side"),price:d,triggerPrice:this.safeString(a,"triggerPrice"),amount:y,cost:S,average:v,filled:w,remaining:b,status:u,fee:void 0,fees:void 0,trades:l})}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a=await this.privateGetFills(s);return this.parseTrades(a.fills,r,t,i)}async fetchBalance(e={}){await this.loadMarkets();let t=this.safeString2(e,"type","account"),i=this.safeString(e,"symbol");e=this.omit(e,["type","account","symbol"]);const s=await this.privateGetAccounts(e),r=this.safeString(s,"serverTime");if("marginAccount"===t||"margin"===t){if(void 0===i)throw new a.ArgumentsRequired(this.id+" fetchBalance requires symbol argument for margin accounts");t=i}void 0===t&&(t=void 0===i?"flex":i);const o=this.parseAccount(t),n=this.safeValue(s,"accounts"),d=this.safeValue(n,o);if(void 0===d)throw t=void 0===t?"":t,i=void 0===i?"":i,new a.BadRequest(this.id+" fetchBalance has no account for "+t);const h=this.parseBalance(d);return h.info=s,h.timestamp=this.parse8601(r),h.datetime=r,h}parseBalance(e){const t=this.safeString2(e,"accountType","type"),i="multiCollateralMarginAccount"===t,s="cashAccount"===t,r=this.safeValue2(e,"balances","currencies",{}),a={},o=Object.keys(r);for(let t=0;t<o.length;t++){const n=o[t],d=r[n],h=this.safeCurrencyCode(n);if(h.split("_").length>1)continue;const c=this.account();if(i)c.total=this.safeString(d,"quantity"),c.free=this.safeString(d,"available");else if(s)c.used="0.0",c.total=d;else{const t=this.safeValue(e,"auxiliary");c.free=this.safeString(t,"af"),c.total=this.safeString(t,"pv")}a[h]=c}return this.safeBalance(a)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets();const i=this.marketIds(e),s=await this.publicGetTickers(t),r=this.safeList(s,"tickers",[]),a=[];for(let e=0;e<r.length;e++){const t=r[e],s=this.safeValue(t,"symbol");if(void 0!==i&&!this.inArray(s,i))continue;const o=this.safeMarket(s),n=this.parseFundingRate(t,o);a.push(n)}return this.indexBy(a,"symbol")}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.symbol(i),r=this.parse8601(this.safeString(e,"lastTime")),a=this.safeNumber(e,"indexPrice"),n=this.safeString(e,"markPrice"),d=this.parseNumber(n),h=this.safeString(e,"fundingRate"),c=o.Y.stringDiv(o.Y.stringMul(h,"8"),n),l=this.parseNumber(c),u=this.safeString(e,"fundingRatePrediction"),f=o.Y.stringDiv(o.Y.stringMul(u,"8"),n),p=this.parseNumber(f);return{info:e,symbol:s,markPrice:d,indexPrice:a,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:r,datetime:this.iso8601(r),fundingRate:l,fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:p,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const r=this.market(e);if(!r.swap)throw new a.BadRequest(this.id+" fetchFundingRateHistory() supports swap contracts only");const o={symbol:r.id.toUpperCase()},n=await this.publicGetHistoricalfundingrates(this.extend(o,s)),d=this.safeValue(n,"rates"),h=[];for(let t=0;t<d.length;t++){const i=d[t],s=this.safeString(i,"timestamp");h.push({info:i,symbol:e,fundingRate:this.safeNumber(i,"relativeFundingRate"),timestamp:this.parse8601(s),datetime:s})}const c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetOpenpositions({}),s=this.parsePositions(i);return this.filterByArrayPositions(s,"symbol",e,!1)}parsePositions(e,t=void 0,i={}){const s=[],r=this.safeValue(e,"openPositions");for(let e=0;e<r.length;e++){const t=this.parsePosition(r[e]);s.push(t)}return s}parsePosition(e,t=void 0){const i=this.safeNumber(e,"maxFixedLeverage");let s="cross";void 0!==i&&(s="isolated");const r=this.safeString(e,"fillTime"),a=this.safeString(e,"symbol");return{info:e,symbol:(t=this.safeMarket(a,t)).symbol,timestamp:this.parse8601(r),datetime:r,initialMargin:void 0,initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,entryPrice:this.safeNumber(e,"price"),notional:void 0,leverage:i,unrealizedPnl:void 0,contracts:this.safeNumber(e,"size"),contractSize:this.safeNumber(t,"contractSize"),marginRatio:void 0,liquidationPrice:void 0,markPrice:void 0,collateral:void 0,marginType:s,side:this.safeString(e,"side"),percentage:void 0}}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetInstruments(t),s=this.safeList(i,"instruments");return this.parseLeverageTiers(s,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeValue(e,"marginLevels"),s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=[];if(void 0===i)return r;for(let e=0;e<i.length;e++){const a=i[e],n=this.safeString(a,"initialMargin"),d=this.safeNumber(a,"numNonContractUnits");if(0!==e){r[r.length-1].maxNotional=d}r.push({tier:this.sum(e,1),symbol:this.safeSymbol(s,t),currency:t.quote,minNotional:d,maxNotional:void 0,maintenanceMarginRate:this.safeNumber(a,"maintenanceMargin"),maxLeverage:this.parseNumber(o.Y.stringDiv("1",n)),info:a})}return r}parseTransfer(e,t=void 0){const i=this.safeString(e,"serverTime");return{info:e,id:void 0,timestamp:this.parse8601(i),datetime:i,currency:this.safeString(t,"code"),amount:void 0,fromAccount:void 0,toAccount:void 0,status:this.safeString(e,"result")}}parseAccount(e){const t={main:"cash",funding:"cash",future:"cash",futures:"cash",cashAccount:"cash",multiCollateralMarginAccount:"flex",multiCollateral:"flex",multiCollateralMargin:"flex"};if(e in t)return t[e];if(e in this.markets){const t=this.market(e),i=t.id.split("_");return t.inverse?"fi_"+this.safeString(i,1):"fv_"+this.safeString(i,1)}return e}async transferOut(e,t,i={}){return await this.transfer(e,t,"future","spot",i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const o=this.currency(e);if("spot"===i)throw new a.BadRequest(this.id+" transfer does not yet support transfers from spot");const n={amount:t};let d;if("spot"===s){if("cash"!==this.parseAccount(i))throw new a.BadRequest(this.id+" transfer cannot transfer from "+i+" to "+s);n.currency=o.id,d=await this.privatePostWithdrawal(this.extend(n,r))}else n.fromAccount=this.parseAccount(i),n.toAccount=this.parseAccount(s),n.unit=o.id,d=await this.privatePostTransfer(this.extend(n,r));const h=this.parseTransfer(d,o);return this.extend(h,{amount:t,fromAccount:i,toAccount:s})}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");await this.loadMarkets();const s={maxLeverage:e,symbol:this.marketId(t).toUpperCase()};return await this.privatePutLeveragepreferences(this.extend(s,i))}async fetchLeverages(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetLeveragepreferences(t),s=this.safeList(i,"leveragePreferences",[]);return this.parseLeverages(s,e,"symbol")}async fetchLeverage(e,t={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchLeverage() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s={symbol:this.marketId(e).toUpperCase()},r=await this.privateGetLeveragepreferences(this.extend(s,t)),o=this.safeList(r,"leveragePreferences",[]),n=this.safeDict(o,0,{});return this.parseLeverage(n,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"maxLeverage");return{info:e,symbol:this.safeSymbol(i,t),marginMode:void 0,longLeverage:s,shortLeverage:s}}handleErrors(e,t,i,s,r,o,n,d,h){if(void 0===n)return;if(429===e)throw new a.DDoSProtection(this.id+" "+o);const c=this.safeValue(n,"errors"),l=this.safeValue(c,0),u=this.safeString(l,"message"),f=this.safeString(n,"error",u);if(void 0===f)return;const p=this.id+" "+o;if(this.throwExactlyMatchedException(this.exceptions.exact,f,p),this.throwBroadlyMatchedException(this.exceptions.broad,f,p),400===e)throw new a.BadRequest(p);throw new a.ExchangeError(p)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeValue(this.options.versions,t,{}),h=this.safeValue(o,i,{}),c=this.safeString(h,e,this.version),l=this.safeString(s,"version",c);s=this.omit(s,"version");const u=this.safeValue(this.options.access,t,{}),f=this.safeValue(u,i,{}),p=this.safeString(f,e,"public"),m=l+"/"+this.implodeParams(e,s);s=this.omit(s,this.extractParams(e));let g=m,v="";"batchorder"===e?(v="json="+this.json(s),a=v):Object.keys(s).length&&(v=this.urlencode(s),g+="?"+v);const y=this.urls.api[t]+g;if("private"===t||"private"===p){this.checkRequiredCredentials();let e=v+"/api/";"private"!==t&&(e+=t+"/"),e+=m;const i=this.hash(this.encode(e),n.s,"binary"),s=this.base64ToBinary(this.secret),a=this.hmac(i,s,d.Zf,"base64");r={"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json",APIKey:this.apiKey,Authent:a}}return{url:y,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"kucoin",name:"KuCoin",countries:["SC"],rateLimit:10,version:"v2",certified:!0,pro:!0,comment:"Platform 2.0",quoteJsonNumbers:!1,has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,borrowCrossMargin:!0,borrowIsolatedMargin:!0,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!0,fetchBorrowRateHistory:!0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositWithdrawFee:!0,fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!0,fetchLedger:!0,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrice:!0,fetchMarkPrices:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrdersByStatus:!0,fetchOrderTrades:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactionFee:!0,fetchTransfers:!1,fetchWithdrawals:!0,repayCrossMargin:!0,repayIsolatedMargin:!0,setLeverage:!0,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/51840849/87295558-132aaf80-c50e-11ea-9801-a2fb0c57c799.jpg",referral:"https://www.kucoin.com/ucenter/signup?rcode=E5wkqe",api:{public:"https://api.kucoin.com",private:"https://api.kucoin.com",futuresPrivate:"https://api-futures.kucoin.com",futuresPublic:"https://api-futures.kucoin.com",webExchange:"https://kucoin.com/_api",broker:"https://api-broker.kucoin.com",earn:"https://api.kucoin.com"},www:"https://www.kucoin.com",doc:["https://docs.kucoin.com"]},requiredCredentials:{apiKey:!0,secret:!0,password:!0},api:{public:{get:{currencies:4.5,"currencies/{currency}":4.5,symbols:6,"market/orderbook/level1":3,"market/allTickers":22.5,"market/stats":22.5,markets:4.5,"market/orderbook/level{level}_{limit}":6,"market/orderbook/level2_20":3,"market/orderbook/level2_100":6,"market/histories":4.5,"market/candles":4.5,prices:4.5,timestamp:4.5,status:4.5,"mark-price/{symbol}/current":3,"mark-price/all-symbols":3,"margin/config":25,announcements:20},post:{"bullet-public":15}},private:{get:{"user-info":30,accounts:7.5,"accounts/{accountId}":7.5,"accounts/ledgers":3,"hf/accounts/ledgers":2,"hf/margin/account/ledgers":2,"transaction-history":3,"sub/user":30,"sub-accounts/{subUserId}":22.5,"sub-accounts":30,"sub/api-key":30,"margin/account":40,"margin/accounts":15,"isolated/accounts":15,"deposit-addresses":7.5,deposits:7.5,"hist-deposits":7.5,withdrawals:30,"hist-withdrawals":30,"withdrawals/quotas":30,"accounts/transferable":30,"transfer-list":30,"base-fee":3,"trade-fees":3,"market/orderbook/level{level}":3,"market/orderbook/level2":3,"market/orderbook/level3":3,"hf/accounts/opened":2,"hf/orders/active":2,"hf/orders/active/symbols":2,"hf/margin/order/active/symbols":2,"hf/orders/done":2,"hf/orders/{orderId}":2,"hf/orders/client-order/{clientOid}":2,"hf/orders/dead-cancel-all/query":2,"hf/fills":2,orders:2,"limit/orders":3,"orders/{orderId}":2,"order/client-order/{clientOid}":3,fills:10,"limit/fills":20,"stop-order":8,"stop-order/{orderId}":3,"stop-order/queryOrderByClientOid":3,"oco/order/{orderId}":2,"oco/order/details/{orderId}":2,"oco/client-order/{clientOid}":2,"oco/orders":2,"hf/margin/orders/active":4,"hf/margin/orders/done":10,"hf/margin/orders/{orderId}":4,"hf/margin/orders/client-order/{clientOid}":5,"hf/margin/fills":5,"etf/info":25,"margin/currencies":20,"risk/limit/strategy":20,"isolated/symbols":20,"margin/symbols":5,"isolated/account/{symbol}":50,"margin/borrow":15,"margin/repay":15,"margin/interest":20,"project/list":10,"project/marketInterestRate":7.5,"redeem/orders":10,"purchase/orders":10,"broker/api/rebase/download":3,"migrate/user/account/status":3,"affiliate/inviter/statistics":30},post:{"sub/user/created":22.5,"sub/api-key":30,"sub/api-key/update":45,"deposit-addresses":30,withdrawals:7.5,"accounts/universal-transfer":6,"accounts/sub-transfer":45,"accounts/inner-transfer":15,"transfer-out":30,"transfer-in":30,"hf/orders":1,"hf/orders/test":1,"hf/orders/sync":1,"hf/orders/multi":1,"hf/orders/multi/sync":1,"hf/orders/alter":3,"hf/orders/dead-cancel-all":2,orders:2,"orders/test":2,"orders/multi":3,"stop-order":2,"oco/order":2,"hf/margin/order":5,"hf/margin/order/test":5,"margin/order":5,"margin/order/test":5,"margin/borrow":15,"margin/repay":10,purchase:15,redeem:15,"lend/purchase/update":10,"bullet-private":10,"position/update-user-leverage":5,"deposit-address/create":20},delete:{"sub/api-key":45,"withdrawals/{withdrawalId}":30,"hf/orders/{orderId}":1,"hf/orders/sync/{orderId}":1,"hf/orders/client-order/{clientOid}":1,"hf/orders/sync/client-order/{clientOid}":1,"hf/orders/cancel/{orderId}":2,"hf/orders":2,"hf/orders/cancelAll":30,"orders/{orderId}":3,"order/client-order/{clientOid}":5,orders:20,"stop-order/{orderId}":3,"stop-order/cancelOrderByClientOid":5,"stop-order/cancel":3,"oco/order/{orderId}":3,"oco/client-order/{clientOid}":3,"oco/orders":3,"hf/margin/orders/{orderId}":5,"hf/margin/orders/client-order/{clientOid}":5,"hf/margin/orders":10}},futuresPublic:{get:{"contracts/active":4.5,"contracts/{symbol}":4.5,ticker:3,"level2/snapshot":4.5,"level2/depth20":7.5,"level2/depth100":15,"trade/history":7.5,"kline/query":4.5,"interest/query":7.5,"index/query":3,"mark-price/{symbol}/current":4.5,"premium/query":4.5,"trade-statistics":4.5,"funding-rate/{symbol}/current":3,"contract/funding-rates":7.5,timestamp:3,status:6,"level2/message/query":1.3953},post:{"bullet-public":15}},futuresPrivate:{get:{"transaction-history":3,"account-overview":7.5,"account-overview-all":9,"transfer-list":30,orders:3,stopOrders:9,recentDoneOrders:7.5,"orders/{orderId}":7.5,"orders/byClientOid":7.5,fills:7.5,recentFills:4.5,openOrderStatistics:15,position:3,positions:3,"margin/maxWithdrawMargin":15,"contracts/risk-limit/{symbol}":7.5,"funding-history":7.5},post:{"transfer-out":30,"transfer-in":30,orders:3,"orders/test":3,"orders/multi":4.5,"position/margin/auto-deposit-status":6,"margin/withdrawMargin":15,"position/margin/deposit-margin":6,"position/risk-limit-level/change":6,"bullet-private":15},delete:{"orders/{orderId}":1.5,"orders/client-order/{clientOid}":1.5,orders:45,stopOrders:22.5}},webExchange:{get:{"currency/currency/chain-info":1}},broker:{get:{"broker/nd/info":2,"broker/nd/account":2,"broker/nd/account/apikey":2,"broker/nd/rebase/download":3,"asset/ndbroker/deposit/list":1,"broker/nd/transfer/detail":1,"broker/nd/deposit/detail":1,"broker/nd/withdraw/detail":1},post:{"broker/nd/transfer":1,"broker/nd/account":3,"broker/nd/account/apikey":3,"broker/nd/account/update-apikey":3},delete:{"broker/nd/account/apikey":3}},earn:{get:{"otc-loan/loan":1,"otc-loan/accounts":1,"earn/redeem-preview":7.5,"earn/saving/products":7.5,"earn/hold-assets":7.5,"earn/promotion/products":7.5,"earn/kcs-staking/products":7.5,"earn/staking/products":7.5,"earn/eth-staking/products":7.5},post:{"earn/orders":7.5},delete:{"earn/orders":7.5}}},timeframes:{"1m":"1min","3m":"3min","5m":"5min","15m":"15min","30m":"30min","1h":"1hour","2h":"2hour","4h":"4hour","6h":"6hour","8h":"8hour","12h":"12hour","1d":"1day","1w":"1week","1M":"1month"},precisionMode:o.kb,exceptions:{exact:{"The order does not exist.":r.OrderNotFound,"order not exist":r.OrderNotFound,"order not exist.":r.OrderNotFound,order_not_exist:r.OrderNotFound,order_not_exist_or_not_allow_to_cancel:r.InvalidOrder,"Order size below the minimum requirement.":r.InvalidOrder,"The withdrawal amount is below the minimum requirement.":r.ExchangeError,"Unsuccessful! Exceeded the max. funds out-transfer limit":r.InsufficientFunds,"The amount increment is invalid.":r.BadRequest,"The quantity is below the minimum requirement.":r.InvalidOrder,400:r.BadRequest,401:r.AuthenticationError,403:r.NotSupported,404:r.NotSupported,405:r.NotSupported,415:r.NotSupported,429:r.RateLimitExceeded,500:r.ExchangeNotAvailable,503:r.ExchangeNotAvailable,101030:r.PermissionDenied,103e3:r.InvalidOrder,130101:r.BadRequest,130102:r.ExchangeError,130103:r.OrderNotFound,130104:r.ExchangeError,130105:r.InsufficientFunds,130106:r.NotSupported,130107:r.ExchangeError,130108:r.OrderNotFound,130201:r.PermissionDenied,130202:r.ExchangeError,130203:r.InsufficientFunds,130204:r.BadRequest,130301:r.InsufficientFunds,130302:r.PermissionDenied,130303:r.NotSupported,130304:r.NotSupported,130305:r.NotSupported,130306:r.NotSupported,130307:r.NotSupported,130308:r.InvalidOrder,130309:r.InvalidOrder,130310:r.ExchangeError,130311:r.InvalidOrder,130312:r.InvalidOrder,130313:r.InvalidOrder,130314:r.InvalidOrder,130315:r.NotSupported,126e3:r.ExchangeError,126001:r.NotSupported,126002:r.ExchangeError,126003:r.InvalidOrder,126004:r.ExchangeError,126005:r.PermissionDenied,126006:r.ExchangeError,126007:r.ExchangeError,126009:r.ExchangeError,126010:r.ExchangeError,126011:r.ExchangeError,126013:r.InsufficientFunds,126015:r.ExchangeError,126021:r.NotSupported,126022:r.InvalidOrder,126027:r.InvalidOrder,126028:r.InvalidOrder,126029:r.InvalidOrder,126030:r.InvalidOrder,126033:r.InvalidOrder,126034:r.InvalidOrder,126036:r.InvalidOrder,126037:r.ExchangeError,126038:r.ExchangeError,126039:r.ExchangeError,126041:r.ExchangeError,126042:r.ExchangeError,126043:r.OrderNotFound,126044:r.InvalidOrder,126045:r.NotSupported,126046:r.NotSupported,126047:r.PermissionDenied,126048:r.PermissionDenied,135005:r.ExchangeError,135018:r.ExchangeError,200004:r.InsufficientFunds,210014:r.InvalidOrder,210021:r.InsufficientFunds,230003:r.InsufficientFunds,26e4:r.InvalidAddress,260100:r.InsufficientFunds,3e5:r.InvalidOrder,4e5:r.BadSymbol,400001:r.AuthenticationError,400002:r.InvalidNonce,400003:r.AuthenticationError,400004:r.AuthenticationError,400005:r.AuthenticationError,400006:r.AuthenticationError,400007:r.AuthenticationError,400008:r.NotSupported,400100:r.InsufficientFunds,400200:r.InvalidOrder,400330:r.InvalidOrder,400350:r.InvalidOrder,400370:r.InvalidOrder,400400:r.BadRequest,400401:r.AuthenticationError,400500:r.InvalidOrder,400600:r.BadSymbol,400760:r.InvalidOrder,401e3:r.BadRequest,408e3:r.BadRequest,411100:r.AccountSuspended,415e3:r.BadRequest,400303:r.PermissionDenied,5e5:r.ExchangeNotAvailable,260220:r.InvalidAddress,600100:r.InsufficientFunds,600101:r.InvalidOrder,900014:r.BadRequest},broad:{"Exceeded the access frequency":r.RateLimitExceeded,"require more permission":r.PermissionDenied}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0.001"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("50"),this.parseNumber("0.001")],[this.parseNumber("200"),this.parseNumber("0.0009")],[this.parseNumber("500"),this.parseNumber("0.0008")],[this.parseNumber("1000"),this.parseNumber("0.0007")],[this.parseNumber("2000"),this.parseNumber("0.0007")],[this.parseNumber("4000"),this.parseNumber("0.0006")],[this.parseNumber("8000"),this.parseNumber("0.0005")],[this.parseNumber("15000"),this.parseNumber("0.00045")],[this.parseNumber("25000"),this.parseNumber("0.0004")],[this.parseNumber("40000"),this.parseNumber("0.00035")],[this.parseNumber("60000"),this.parseNumber("0.0003")],[this.parseNumber("80000"),this.parseNumber("0.00025")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("50"),this.parseNumber("0.0009")],[this.parseNumber("200"),this.parseNumber("0.0007")],[this.parseNumber("500"),this.parseNumber("0.0005")],[this.parseNumber("1000"),this.parseNumber("0.0003")],[this.parseNumber("2000"),this.parseNumber("0")],[this.parseNumber("4000"),this.parseNumber("0")],[this.parseNumber("8000"),this.parseNumber("0")],[this.parseNumber("15000"),this.parseNumber("-0.00005")],[this.parseNumber("25000"),this.parseNumber("-0.00005")],[this.parseNumber("40000"),this.parseNumber("-0.00005")],[this.parseNumber("60000"),this.parseNumber("-0.00005")],[this.parseNumber("80000"),this.parseNumber("-0.00005")]]}},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{}}},commonCurrencies:{BIFI:"BIFIF",VAI:"VAIOT",WAX:"WAXP",ALT:"APTOSLAUNCHTOKEN",KALT:"ALT",FUD:"FTX Users' Debt"},options:{hf:void 0,version:"v1",symbolSeparator:"-",fetchMyTradesMethod:"private_get_fills",timeDifference:0,adjustForTimeDifference:!1,fetchCurrencies:{webApiEnable:!0,webApiRetries:1,webApiMuteFailure:!0},fetchMarkets:{fetchTickersFees:!0},withdraw:{includeFee:!1},versions:{public:{GET:{currencies:"v3","currencies/{currency}":"v3",symbols:"v2","mark-price/all-symbols":"v3",announcements:"v3"}},private:{GET:{"user-info":"v2","hf/margin/account/ledgers":"v3","sub/user":"v2","sub-accounts":"v2","margin/accounts":"v3","isolated/accounts":"v3","deposit-addresses":"v1","market/orderbook/level2":"v3","market/orderbook/level3":"v3","market/orderbook/level{level}":"v3","oco/order/{orderId}":"v3","oco/order/details/{orderId}":"v3","oco/client-order/{clientOid}":"v3","oco/orders":"v3","hf/margin/orders/active":"v3","hf/margin/order/active/symbols":"v3","hf/margin/orders/done":"v3","hf/margin/orders/{orderId}":"v3","hf/margin/orders/client-order/{clientOid}":"v3","hf/margin/fills":"v3","etf/info":"v3","margin/currencies":"v3","margin/borrow":"v3","margin/repay":"v3","margin/interest":"v3","project/list":"v3","project/marketInterestRate":"v3","redeem/orders":"v3","purchase/orders":"v3","migrate/user/account/status":"v3","margin/symbols":"v3","affiliate/inviter/statistics":"v2","asset/ndbroker/deposit/list":"v1"},POST:{"sub/user/created":"v2","accounts/universal-transfer":"v3","accounts/sub-transfer":"v2","accounts/inner-transfer":"v2","transfer-out":"v3","deposit-address/create":"v3","oco/order":"v3","hf/margin/order":"v3","hf/margin/order/test":"v3","margin/borrow":"v3","margin/repay":"v3",purchase:"v3",redeem:"v3","lend/purchase/update":"v3","position/update-user-leverage":"v3",withdrawals:"v3"},DELETE:{"hf/margin/orders/{orderId}":"v3","hf/margin/orders/client-order/{clientOid}":"v3","hf/margin/orders":"v3","oco/order/{orderId}":"v3","oco/client-order/{clientOid}":"v3","oco/orders":"v3"}},futuresPrivate:{POST:{"transfer-out":"v3"}}},partner:{spot:{id:"ccxt",key:"9e58cc35-5b5e-4133-92ec-166e3f077cb8"},future:{id:"ccxtfutures",key:"1b327198-f30c-4f14-a0ac-918871282f15"}},accountsByType:{spot:"trade",margin:"margin",cross:"margin",isolated:"isolated",main:"main",funding:"main",future:"contract",swap:"contract",mining:"pool",hf:"trade_hf"},networks:{BRC20:"btc",BTCNATIVESEGWIT:"bech32",ERC20:"eth",TRC20:"trx",HRC20:"heco",MATIC:"matic",KCC:"kcc",SOL:"sol",ALGO:"algo",EOS:"eos",BEP20:"bsc",BEP2:"bnb",ARBONE:"arbitrum",AVAXX:"avax",AVAXC:"avaxc",TLOS:"tlos",CFX:"cfx",ACA:"aca",OP:"optimism",ONT:"ont",GLMR:"glmr",CSPR:"cspr",KLAY:"klay",XRD:"xrd",RVN:"rvn",NEAR:"near",APT:"aptos",ETHW:"ethw",TON:"ton",BCH:"bch",BSV:"bchsv",BCHA:"bchabc",OSMO:"osmo",NANO:"nano",XLM:"xlm",VET:"vet",IOST:"iost",ZIL:"zil",XRP:"xrp",TOMO:"tomo",XMR:"xmr",COTI:"coti",XTZ:"xtz",ADA:"ada",WAX:"waxp",THETA:"theta",ONE:"one",IOTEX:"iotx",NULS:"nuls",KSM:"ksm",LTC:"ltc",WAVES:"waves",DOT:"dot",STEEM:"steem",QTUM:"qtum",DOGE:"doge",FIL:"fil",XYM:"xym",FLUX:"flux",ATOM:"atom",XDC:"xdc",KDA:"kda",ICP:"icp",CELO:"celo",LSK:"lsk",VSYS:"vsys",KAR:"kar",XCH:"xch",FLOW:"flow",BAND:"band",EGLD:"egld",HBAR:"hbar",XPR:"xpr",AR:"ar",FTM:"ftm",KAVA:"kava",KMA:"kma",XEC:"xec",IOTA:"iota",HNT:"hnt",ASTR:"astr",PDEX:"pdex",METIS:"metis",ZEC:"zec",POKT:"pokt",OASYS:"oas",OASIS:"oasis",ETC:"etc",AKT:"akt",FSN:"fsn",SCRT:"scrt",CFG:"cfg",ICX:"icx",KMD:"kmd",NEM:"NEM",STX:"stx",DGB:"dgb",DCR:"dcr",CKB:"ckb",ELA:"ela",HYDRA:"hydra",BTM:"btm",KARDIA:"kai",SXP:"sxp",NEBL:"nebl",ZEN:"zen",SDN:"sdn",LTO:"lto",WEMIX:"wemix",EVER:"ever",BNC:"bnc",BNCDOT:"bncdot",AION:"aion",GRIN:"grin",LOKI:"loki",QKC:"qkc",TT:"TT",PIVX:"pivx",SERO:"sero",METER:"meter",STATEMINE:"statemine",DVPN:"dvpn",XPRT:"xprt",MOVR:"movr",ERGO:"ergo",ABBC:"abbc",DIVI:"divi",PURA:"pura",DFI:"dfi",NEON3:"neon3",DOCK:"dock",TRUE:"true",CS:"cs",ORAI:"orai",BASE:"base"},marginModes:{cross:"MARGIN_TRADE",isolated:"MARGIN_ISOLATED_TRADE",spot:"TRADE"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!0},createOrders:{max:5},fetchMyTrades:{marginMode:!0,limit:void 0,daysBack:void 0,untilDays:7,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:500,trigger:!0,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:500,daysBack:void 0,daysBackCanceled:void 0,untilDays:7,trigger:!0,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1500}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=await this.publicGetTimestamp(e);return this.safeInteger(t,"data")}async fetchStatus(e={}){const t=await this.publicGetStatus(e),i=this.safeDict(t,"data",{});return{status:"open"===this.safeString(i,"status")?"ok":"maintenance",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchMarkets(e={}){let t;[t,e]=this.handleOptionAndParams(e,"fetchMarkets","fetchTickersFees",!0);const i=[];i.push(this.publicGetSymbols(e));const s=this.checkRequiredCredentials(!1),r=s&&this.safeBool(e,"marginables",!0);r&&(i.push(this.privateGetMarginSymbols(e)),i.push(this.privateGetIsolatedSymbols(e))),t&&i.push(this.publicGetMarketAllTickers(e)),s&&i.push(this.loadMigrationStatus());const o=await Promise.all(i),n=this.safeList(o[0],"data"),d=r?this.safeDict(o[1],"data",{}):{},h=this.safeList(d,"items",[]),c=this.indexBy(h,"symbol"),l=r?o[2]:{},u=this.safeList(l,"data",[]),f=this.indexBy(u,"symbol"),p=r?3:1,m=this.safeDict(o,p,{}),g=this.safeList(this.safeDict(m,"data",{}),"ticker",[]),v=this.indexBy(g,"symbol"),y=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"symbol"),[s,r]=i.split("-"),o=this.safeCurrencyCode(s),d=this.safeCurrencyCode(r),h=this.safeDict(v,i,{}),l=this.safeString(h,"makerFeeRate"),u=this.safeString(h,"takerFeeRate"),p=this.safeString(h,"makerCoefficient"),m=this.safeString(h,"takerCoefficient"),g=i in c,w=i in f,b=this.safeBool(t,"isMarginEnabled",!1)||g||w;y.push({id:i,symbol:o+"/"+d,base:o,quote:d,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:b,marginModes:{cross:g,isolated:w},swap:!1,future:!1,option:!1,active:this.safeBool(t,"enableTrading"),contract:!1,linear:void 0,inverse:void 0,taker:this.parseNumber(a.Y.stringMul(u,m)),maker:this.parseNumber(a.Y.stringMul(l,p)),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(t,"baseIncrement"),price:this.safeNumber(t,"priceIncrement")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"baseMinSize"),max:this.safeNumber(t,"baseMaxSize")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"quoteMinSize"),max:this.safeNumber(t,"quoteMaxSize")}},created:void 0,info:t})}return this.options.adjustForTimeDifference&&await this.loadTimeDifference(),y}async loadMigrationStatus(e=!1){if(!("hf"in this.options)||void 0===this.options.hf||e){const e=await this.privateGetHfAccountsOpened();this.options.hf=this.safeBool(e,"data")}return!0}handleHfAndParams(e={}){const t=this.safeBool(this.options,"hf",!1);let i;void 0!==t&&(i=!!t);return[this.safeBool(e,"hf",i),e=this.omit(e,"hf")]}async fetchCurrencies(e={}){const t=await this.publicGetCurrencies(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeString(t,"fullName"),o=this.safeCurrencyCode(r),n={},d=this.safeList(t,"chains",[]),h=this.safeString(t,"precision"),c=this.parseNumber(this.parsePrecision(h)),l=d.length;if(!l)continue;for(let e=0;e<l;e++){const t=d[e],i=this.safeString(t,"chainId"),s=this.networkIdToCode(i,o),r=this.safeBool(t,"isWithdrawEnabled",!1),a=this.safeBool(t,"isDepositEnabled",!1);n[s]={info:t,id:i,name:this.safeString(t,"chainName"),code:s,active:r&&a,fee:this.safeNumber(t,"withdrawalMinFee"),deposit:a,withdraw:r,precision:this.parseNumber(this.parsePrecision(this.safeString(t,"withdrawPrecision"))),limits:{withdraw:{min:this.safeNumber(t,"withdrawalMinSize"),max:this.safeNumber(t,"maxWithdraw")},deposit:{min:this.safeNumber(t,"depositMinSize"),max:this.safeNumber(t,"maxDeposit")}}}}const u="2"===h&&0===l;s[o]=this.safeCurrencyStructure({id:r,name:a,code:o,type:u?"fiat":"crypto",precision:c,info:t,networks:n,deposit:void 0,withdraw:void 0,active:void 0,fee:void 0,limits:void 0})}return s}async fetchAccounts(e={}){const t=await this.privateGetAccounts(e),i=this.safeList(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"id"),a=this.safeString(t,"currency"),o=this.safeCurrencyCode(a),n=this.safeString(t,"type");s.push({id:r,type:n,currency:o,code:o,info:t})}return s}async fetchTransactionFee(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id};let s;[s,t]=this.handleNetworkCodeAndParams(t),void 0!==s&&(i.chain=this.networkCodeToId(s).toLowerCase());const r=await this.privateGetWithdrawalsQuotas(this.extend(i,t)),a=this.safeDict(r,"data",{}),o={};return o[e]=this.safeNumber(a,"withdrawMinFee"),{info:r,withdraw:o,deposit:{}}}async fetchDepositWithdrawFee(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id};let r;[r,t]=this.handleNetworkCodeAndParams(t),void 0!==r&&(s.chain=this.networkCodeToId(r).toLowerCase());const a=await this.privateGetWithdrawalsQuotas(this.extend(s,t)),o=this.safeDict(a,"data");return this.parseDepositWithdrawFee(o,i)}parseDepositWithdrawFee(e,t=void 0){if("chains"in e){const i={info:e,withdraw:{fee:void 0,percentage:!1},deposit:{fee:void 0,percentage:void 0},networks:{}},s=this.safeList(e,"chains",[]);for(let e=0;e<s.length;e++){const r=s[e],a=this.networkIdToCode(this.safeString(r,"chainId"),this.safeString(t,"code"));i.networks[a]={withdraw:{fee:this.safeNumber(r,"withdrawMinFee"),percentage:!1},deposit:{fee:void 0,percentage:void 0}}}return i}const i=this.safeNumber(e,"withdrawMinFee"),s={info:e,withdraw:{fee:i,percentage:!1},deposit:{fee:void 0,percentage:void 0},networks:{}},r=this.safeString(e,"chain"),a=this.networkIdToCode(r,this.safeString(t,"code"));return s.networks[a]={withdraw:i,deposit:{fee:void 0,percentage:void 0}},s}isFuturesMethod(e,t){const i=this.safeString2(this.options,e,"defaultType","trade"),s=this.safeString(t,"type",i),a=this.safeDict(this.options,"accountsByType"),o=this.safeString(a,s);if(void 0===o){const e=Object.keys(a);throw new r.ExchangeError(this.id+" isFuturesMethod() type must be one of "+e.join(", "))}return t=this.omit(t,"type"),"contract"===o||"future"===o||"futures"===o}parseTicker(e,t=void 0){let i=this.safeString(e,"changeRate");void 0!==i&&(i=a.Y.stringMul(i,"100"));let s=this.safeString2(e,"last","lastTradedPrice");s=this.safeString(e,"price",s);const r=this.safeString(e,"symbol"),o=(t=this.safeMarket(r,t,"-")).symbol,n=this.safeString(e,"vol"),d=this.safeString(e,"volValue"),h=this.safeIntegerN(e,["time","datetime","timePoint"]);return this.safeTicker({symbol:o,timestamp:h,datetime:this.iso8601(h),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString2(e,"buy","bestBid"),bidVolume:this.safeString(e,"bestBidSize"),ask:this.safeString2(e,"sell","bestAsk"),askVolume:this.safeString(e,"bestAskSize"),vwap:void 0,open:this.safeString(e,"open"),close:s,last:s,previousClose:void 0,change:this.safeString(e,"changePrice"),percentage:i,average:this.safeString(e,"averagePrice"),baseVolume:n,quoteVolume:d,markPrice:this.safeString(e,"value"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarketAllTickers(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"ticker",[]),a=this.safeInteger(s,"time"),o={};for(let e=0;e<r.length;e++){r[e].time=a;const t=this.parseTicker(r[e]),i=this.safeString(t,"symbol");void 0!==i&&(o[i]=t)}return this.filterByArrayTickers(o,"symbol",e)}async fetchMarkPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarkPriceAllSymbols(t),s=this.safeList(i,"data",[]);return this.parseTickers(s)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetMarketStats(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetMarkPriceSymbolCurrent(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1500);const o=this.market(e),n={symbol:o.id,type:this.safeString(this.timeframes,t,t)},d=1e3*this.parseTimeframe(t);let h=this.milliseconds();void 0!==i?(n.startAt=this.parseToInt(Math.floor(i/1e3)),void 0===s&&(s=this.safeInteger(this.options,"fetchOHLCVLimit",1500)),h=this.sum(i,s*d)):void 0!==s&&(i=h-s*d,n.startAt=this.parseToInt(Math.floor(i/1e3))),n.endAt=this.parseToInt(Math.floor(h/1e3));const c=await this.publicGetMarketCandles(this.extend(n,r)),l=this.safeList(c,"data",[]);return this.parseOHLCVs(l,o,t,i,s)}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id};let r;[r,t]=this.handleNetworkCodeAndParams(t),void 0!==r&&(s.chain=this.networkCodeToId(r));const a=await this.privatePostDepositAddressCreate(this.extend(s,t)),o=this.safeDict(a,"data",{});return this.parseDepositAddress(o,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id};let a;[a,t]=this.handleNetworkCodeAndParams(t),void 0!==a&&(s.chain=this.networkCodeToId(a).toLowerCase());const o=this.options.versions.private.GET["deposit-addresses"];this.options.versions.private.GET["deposit-addresses"]="v1";const n=await this.privateGetDepositAddresses(this.extend(s,t));this.options.versions.private.GET["deposit-addresses"]=o;const d=this.safeValue(n,"data");if(void 0===d)throw new r.ExchangeError(this.id+" fetchDepositAddress() returned an empty response, you might try to run createDepositAddress() first and try again");return this.parseDepositAddress(d,i)}parseDepositAddress(e,t=void 0){let i,s=this.safeString(e,"address");return void 0!==s&&(s=s.replace("bitcoincash:","")),void 0!==t&&(i=this.safeCurrencyCode(t.id),"NIM"!==i&&this.checkAddress(s)),{info:e,currency:i,network:this.networkIdToCode(this.safeString(e,"chainId")),address:s,tag:this.safeString(e,"memo")}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=this.options.versions.private.GET["deposit-addresses"];this.options.versions.private.GET["deposit-addresses"]="v2";const a=await this.privateGetDepositAddresses(this.extend(s,t));this.options.versions.private.GET["deposit-addresses"]=r;const o=this.safeList(a,"data",[]),n=this.parseDepositAddresses(o,[i.code],!1,{currency:i.code});return this.indexBy(n,"network")}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),a=this.safeInteger(i,"level",2),o={symbol:s.id};let n;if(this.checkRequiredCredentials(!1)&&void 0===t)n=await this.privateGetMarketOrderbookLevel2(this.extend(o,i));else{if(2===a){if(o.level=a,void 0!==t){if(20!==t&&100!==t)throw new r.ExchangeError(this.id+" fetchOrderBook() limit argument must be 20 or 100");o.limit=t}o.limit=t||100}n=await this.publicGetMarketOrderbookLevelLevelLimit(this.extend(o,i))}const d=this.safeDict(n,"data",{}),h=this.safeInteger(d,"time"),c=this.parseOrderBook(d,s.symbol,h,"bids","asks",a-2,a-1);return c.nonce=this.safeInteger(d,"sequence"),c}handleTriggerPrices(e){const t=this.safeValue2(e,"triggerPrice","stopPrice"),i=this.safeValue(e,"stopLossPrice"),s=this.safeValue(e,"takeProfitPrice"),a=void 0!==s;if(void 0!==i&&a||t&&i||t&&a)throw new r.ExchangeError(this.id+" createOrder() - you should use either triggerPrice or stopLossPrice or takeProfitPrice");return[t,i,s]}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"test",!1);let d;a=this.omit(a,"test"),[d,a]=this.handleHfAndParams(a);let h=!1;[h,a]=this.handleOptionAndParams(a,"createOrder","sync",!1);const[c,l,u]=this.handleTriggerPrices(a),f=this.safeString(a,"tradeType"),p=c||l||u,m=this.handleMarginModeAndParams("createOrder",a),g=this.safeString(m,0),v="MARGIN_TRADE"===f||void 0!==g,y=this.createOrderRequest(e,t,i,s,r,a);let w;w=n?v?await this.privatePostMarginOrderTest(y):d?await this.privatePostHfOrdersTest(y):await this.privatePostOrdersTest(y):p?await this.privatePostStopOrder(y):v?await this.privatePostMarginOrder(y):h?await this.privatePostHfOrdersSync(y):d?await this.privatePostHfOrders(y):await this.privatePostOrders(y);const b=this.safeDict(w,"data",{});return this.parseOrder(b,o)}async createMarketOrderWithCost(e,t,i,s={}){return await this.loadMarkets(),s.cost=i,await this.createOrder(e,"market",t,i,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){return await this.loadMarkets(),await this.createMarketOrderWithCost(e,"buy",t,i)}async createMarketSellOrderWithCost(e,t,i={}){return await this.loadMarkets(),await this.createMarketOrderWithCost(e,"sell",t,i)}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s;for(let t=0;t<e.length;t++){const a=e[t],o=this.safeString(a,"symbol");if(void 0===s)s=o;else if(s!==o)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const n=this.safeString(a,"type");if("limit"!==n)throw new r.BadRequest(this.id+" createOrders() only supports limit orders");const d=this.safeString(a,"side"),h=this.safeValue(a,"amount"),c=this.safeValue(a,"price"),l=this.safeValue(a,"params",{}),u=this.createOrderRequest(o,n,d,h,c,l);i.push(u)}const a={symbol:this.market(s).id,orderList:i};let o;[o,t]=this.handleHfAndParams(t);let n,d=!1;[d,t]=this.handleOptionAndParams(t,"createOrders","sync",!1),n=d?await this.privatePostHfOrdersMultiSync(this.extend(a,t)):o?await this.privatePostHfOrdersMulti(this.extend(a,t)):await this.privatePostOrdersMulti(this.extend(a,t));let h=this.safeDict(n,"data",{});return h=this.safeList(h,"data",[]),this.parseOrders(h)}marketOrderAmountToPrecision(e,t){const i=this.market(e),s=this.decimalToPrecision(t,o.R3,i.info.quoteIncrement,this.precisionMode,this.paddingMode);if("0"===s)throw new r.InvalidOrder(this.id+" amount of "+i.symbol+" must be greater than minimum amount precision of "+this.numberToString(i.precision.amount));return s}createOrderRequest(e,t,i,s,a=void 0,o={}){const n=this.market(e),d=this.safeString2(o,"clientOid","clientOrderId",this.uuid());o=this.omit(o,["clientOid","clientOrderId"]);const h={clientOid:d,side:i,symbol:n.id,type:t},c=this.safeNumber2(o,"cost","funds");let l,u,f;[f,o]=this.handleMarginModeAndParams("createOrder",o),"market"===t?void 0!==c?(o=this.omit(o,["cost","funds"]),u=this.marketOrderAmountToPrecision(e,c),h.funds=u):(l=this.amountToPrecision(e,s),h.size=this.amountToPrecision(e,s)):(l=this.amountToPrecision(e,s),h.size=l,h.price=this.priceToPrecision(e,a));const p=this.safeString(o,"tradeType"),[m,g,v]=this.handleTriggerPrices(o),y=m||g||v,w="MARGIN_TRADE"===p||void 0!==f;if(o=this.omit(o,["stopLossPrice","takeProfitPrice","triggerPrice","stopPrice"]),y){if(m?h.stopPrice=this.priceToPrecision(e,m):(g||v)&&(g?(h.stop="buy"===i?"entry":"loss",h.stopPrice=this.priceToPrecision(e,g)):(h.stop="buy"===i?"loss":"entry",h.stopPrice=this.priceToPrecision(e,v))),"isolated"===f)throw new r.BadRequest(this.id+" createOrder does not support isolated margin for stop orders");"cross"===f&&(h.tradeType=this.options.marginModes[f])}else w&&"isolated"===f&&(h.marginModel="isolated");let b;return[b,o]=this.handlePostOnly("market"===t,!1,o),b&&(h.postOnly=!0),this.extend(h,o)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={symbol:n.id},h=this.safeString2(o,"clientOid","clientOrderId");void 0!==h?d.clientOid=h:d.orderId=e,void 0!==r&&(d.newSize=this.amountToPrecision(t,r)),void 0!==a&&(d.newPrice=this.priceToPrecision(t,a));const c=await this.privatePostHfOrdersAlter(this.extend(d,o)),l=this.safeDict(c,"data",{});return this.parseOrder(l,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},a=this.safeString2(i,"clientOid","clientOrderId"),o=this.safeBool2(i,"stop","trigger",!1);let n;[n,i]=this.handleHfAndParams(i);let d,h=!1;if([h,i]=this.handleOptionAndParams(i,"cancelOrder","sync",!1),n||h){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol parameter for hf orders");const e=this.market(t);s.symbol=e.id}if(i=this.omit(i,["clientOid","clientOrderId","stop","trigger"]),void 0!==a)return s.clientOid=a,d=o?await this.privateDeleteStopOrderCancelOrderByClientOid(this.extend(s,i)):h?await this.privateDeleteHfOrdersSyncClientOrderClientOid(this.extend(s,i)):n?await this.privateDeleteHfOrdersClientOrderClientOid(this.extend(s,i)):await this.privateDeleteOrderClientOrderClientOid(this.extend(s,i)),d=this.safeDict(d,"data"),this.parseOrder(d);{if(s.orderId=e,o)d=await this.privateDeleteStopOrderOrderId(this.extend(s,i));else if(h)d=await this.privateDeleteHfOrdersSyncOrderId(this.extend(s,i));else{if(n)return d=await this.privateDeleteHfOrdersOrderId(this.extend(s,i)),d=this.safeDict(d,"data"),this.parseOrder(d);d=await this.privateDeleteOrdersOrderId(this.extend(s,i))}const t=this.safeDict(d,"data"),r=this.safeList(t,"cancelledOrderIds",[]),a=this.safeString(r,0);return this.safeOrder({info:t,id:a})}}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={},s=this.safeBool(t,"stop",!1);let a;[a,t]=this.handleHfAndParams(t),t=this.omit(t,"stop");const[o,n]=this.handleMarginModeAndParams("cancelAllOrders",t);if(void 0!==e&&(i.symbol=this.marketId(e)),void 0!==o&&(i.tradeType=this.options.marginModes[o],"isolated"===o&&s))throw new r.BadRequest(this.id+" cancelAllOrders does not support isolated margin for stop orders");let d;return d=s?await this.privateDeleteStopOrderCancel(this.extend(i,n)):a?void 0===e?await this.privateDeleteHfOrdersCancelAll(this.extend(i,n)):await this.privateDeleteHfOrders(this.extend(i,n)):await this.privateDeleteOrders(this.extend(i,n)),d}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();let o=e.toLowerCase();const n=this.safeInteger(a,"until"),d=this.safeBool2(a,"stop","trigger",!1);let h;if([h,a]=this.handleHfAndParams(a),h&&void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrdersByStatus() requires a symbol parameter for hf orders");a=this.omit(a,["stop","trigger","till","until"]);const[c,l]=this.handleMarginModeAndParams("fetchOrdersByStatus",a);"open"===o?o="active":"closed"===o&&(o="done");const u={status:o};let f,p;void 0!==t&&(f=this.market(t),u.symbol=f.id),void 0!==i&&(u.startAt=i),void 0!==s&&(u.pageSize=s),n&&(u.endAt=n),u.tradeType=this.safeString(this.options.marginModes,c,"TRADE"),d?p=await this.privateGetStopOrder(this.extend(u,l)):h?"active"===o?p=await this.privateGetHfOrdersActive(this.extend(u,l)):"done"===o&&(p=await this.privateGetHfOrdersDone(this.extend(u,l))):p=await this.privateGetOrders(this.extend(u,l));const m=this.safeList(p,"data");if(void 0!==m)return this.parseOrders(m,f,i,s);const g=this.safeDict(p,"data",{}),v=this.safeList(g,"items",[]);return this.parseOrders(v,f,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r?await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s):await this.fetchOrdersByStatus("done",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r?await this.fetchPaginatedCallDynamic("fetchOpenOrders",e,t,i,s):await this.fetchOrdersByStatus("active",e,t,i,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},a=this.safeString2(i,"clientOid","clientOrderId"),o=this.safeBool2(i,"stop","trigger",!1);let n,d,h;if([n,i]=this.handleHfAndParams(i),void 0!==t&&(d=this.market(t)),n){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol parameter for hf orders");s.symbol=d.id}if(i=this.omit(i,["stop","clientOid","clientOrderId","trigger"]),void 0!==a)s.clientOid=a,o?(void 0!==t&&(s.symbol=d.id),h=await this.privateGetStopOrderQueryOrderByClientOid(this.extend(s,i))):h=n?await this.privateGetHfOrdersClientOrderClientOid(this.extend(s,i)):await this.privateGetOrderClientOrderClientOid(this.extend(s,i));else{if(void 0===e)throw new r.InvalidOrder(this.id+" fetchOrder() requires an order id");s.orderId=e,h=o?await this.privateGetStopOrderOrderId(this.extend(s,i)):n?await this.privateGetHfOrdersOrderId(this.extend(s,i)):await this.privateGetOrdersOrderId(this.extend(s,i))}let c=this.safeDict(h,"data",{});return Array.isArray(c)&&(c=this.safeValue(c,0)),this.parseOrder(c,d)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeInteger(e,"createdAt"),r=this.safeString(e,"feeCurrency"),a=this.safeBool(e,"cancelExist",!1),o=void 0!==this.safeString(e,"stop"),n=this.safeBool(e,"stopTriggered",!1),d=this.safeBool2(e,"isActive","active"),h=this.safeString(e,"status");let c;return void 0!==d&&(c=!0===d?"open":"closed"),o&&("NEW"===h?c="open":d||n||(c="cancelled")),a&&(c="canceled"),"fail"===h&&(c="rejected"),this.safeOrder({info:e,id:this.safeStringN(e,["id","orderId","newOrderId","cancelledOrderId"]),clientOrderId:this.safeString(e,"clientOid"),symbol:this.safeSymbol(i,t,"-"),type:this.safeString(e,"type"),timeInForce:this.safeString(e,"timeInForce"),postOnly:this.safeBool(e,"postOnly"),side:this.safeString(e,"side"),amount:this.safeString(e,"size"),price:this.safeString(e,"price"),triggerPrice:this.safeNumber(e,"stopPrice"),cost:this.safeString(e,"dealFunds"),filled:this.safeString(e,"dealSize"),remaining:void 0,timestamp:s,datetime:this.iso8601(s),fee:{currency:this.safeCurrencyCode(r),cost:this.safeNumber(e,"fee")},status:c,lastTradeTimestamp:void 0,average:this.safeString(e,"avgDealPrice"),trades:void 0},t)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a={orderId:e};return await this.fetchMyTrades(t,i,s,this.extend(a,r))}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);let o,n,d={};if([o,s]=this.handleHfAndParams(s),o&&void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol parameter for hf orders");void 0!==e&&(n=this.market(e),d.symbol=n.id);const h=this.options.fetchMyTradesMethod;let c,l=!1;if([d,s]=this.handleUntilOption("endAt",d,s),o)void 0!==i&&(d.limit=i),void 0!==t&&(d.startAt=t),c=await this.privateGetHfFills(this.extend(d,s));else if("private_get_fills"===h)void 0!==t&&(d.startAt=t),c=await this.privateGetFills(this.extend(d,s));else{if("private_get_limit_fills"!==h)throw new r.ExchangeError(this.id+" fetchMyTradesMethod() invalid method");l=!0,c=await this.privateGetLimitFills(this.extend(d,s))}const u=this.safeDict(c,"data",{});let f;return f=l?u:this.safeList(u,"items",[]),this.parseTrades(f,n,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.publicGetMarketHistories(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,"-");const s=this.safeString2(e,"tradeId","id"),r=this.safeString(e,"orderId"),a=this.safeString(e,"liquidity");let o=this.safeInteger(e,"time");void 0!==o?o=this.parseToInt(o/1e6):(o=this.safeInteger(e,"createdAt"),"dealValue"in e&&void 0!==o&&(o*=1e3));const n=this.safeString2(e,"price","dealPrice"),d=this.safeString2(e,"size","amount"),h=this.safeString(e,"side");let c;const l=this.safeString(e,"fee");if(void 0!==l){const i=this.safeString(e,"feeCurrency");let s=this.safeCurrencyCode(i);void 0===s&&(s="sell"===h?t.quote:t.base),c={cost:l,currency:s,rate:this.safeString(e,"feeRate")}}let u=this.safeString(e,"type");"match"===u&&(u=void 0);const f=this.safeString2(e,"funds","dealValue");return this.safeTrade({info:e,id:s,order:r,timestamp:o,datetime:this.iso8601(o),symbol:t.symbol,type:u,takerOrMaker:a,side:h,price:n,amount:d,cost:f,fee:c},t)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbols:i.id},r=await this.privateGetTradeFees(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0),n=this.safeString(o,"symbol");return{info:r,symbol:this.safeSymbol(n,i),maker:this.safeNumber(o,"makerFeeRate"),taker:this.safeNumber(o,"takerFeeRate"),percentage:!0,tierBased:!0}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets(),this.checkAddress(i);const a=this.currency(e),o={currency:a.id,toAddress:i,withdrawType:"ADDRESS"};let n,d;void 0!==s&&(o.memo=s),[n,r]=this.handleNetworkCodeAndParams(r),void 0!==n&&(o.chain=this.networkCodeToId(n).toLowerCase()),o.amount=parseFloat(this.currencyToPrecision(e,t,n)),[d,r]=this.handleOptionAndParams(r,"withdraw","includeFee",!1),d&&(o.feeDeductType="INTERNAL");const h=await this.privatePostWithdrawals(this.extend(o,r)),c=this.safeDict(h,"data",{});return this.parseTransaction(c,a)}parseTransactionStatus(e){return this.safeString({SUCCESS:"ok",PROCESSING:"pending",WALLET_PROCESSING:"pending",FAILURE:"failed"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeCurrencyCode(i,t);let r=this.safeString(e,"address");const o=this.safeString(e,"amount");let n=this.safeString(e,"walletTxId");if(void 0!==n){const e=n.split("@");e.length>1&&void 0===r&&e[1].length>1&&(r=e[1]),n=e[0]}let d=void 0===n?"withdrawal":"deposit";const h=this.safeString(e,"status");let c;const l=this.safeString(e,"fee");if(void 0!==l){let e;void 0!==o&&(e=a.Y.stringDiv(l,o)),c={cost:this.parseNumber(l),rate:this.parseNumber(e),currency:s}}let u=this.safeInteger2(e,"createdAt","createAt"),f=this.safeInteger(e,"updatedAt");!("createdAt"in e)&&(d="address"in e?"withdrawal":"deposit",void 0!==u&&(u*=1e3),void 0!==f&&(f*=1e3));const p=this.safeBool(e,"isInner"),m=this.safeString(e,"memo");return{info:e,id:this.safeString2(e,"id","withdrawalId"),timestamp:u,datetime:this.iso8601(u),network:this.networkIdToCode(this.safeString(e,"chain")),address:r,addressTo:r,addressFrom:void 0,tag:m,tagTo:m,tagFrom:void 0,currency:s,amount:this.parseNumber(o),txid:n,type:d,status:this.parseTransactionStatus(h),comment:this.safeString(e,"remark"),internal:p,fee:c,updated:f}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchDeposits",e,t,i,s);let a,o,n={};void 0!==e&&(a=this.currency(e),n.currency=a.id),void 0!==i&&(n.pageSize=i),[n,s]=this.handleUntilOption("endAt",n,s),void 0!==t&&t<1550448e6?(n.startAt=this.parseToInt(t/1e3),o=await this.privateGetHistDeposits(this.extend(n,s))):(void 0!==t&&(n.startAt=t),o=await this.privateGetDeposits(this.extend(n,s)));const d=this.safeDict(o,"data",{}),h=this.safeList(d,"items",[]);return this.parseTransactions(h,a,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchWithdrawals",e,t,i,s);let a,o,n={};void 0!==e&&(a=this.currency(e),n.currency=a.id),void 0!==i&&(n.pageSize=i),[n,s]=this.handleUntilOption("endAt",n,s),void 0!==t&&t<1550448e6?(n.startAt=this.parseToInt(t/1e3),o=await this.privateGetHistWithdrawals(this.extend(n,s))):(void 0!==t&&(n.startAt=t),o=await this.privateGetWithdrawals(this.extend(n,s)));const d=this.safeDict(o,"data",{}),h=this.safeList(d,"items",[]);return this.parseTransactions(h,a,t,i,{type:"withdrawal"})}parseBalanceHelper(e){const t=this.account();t.used=this.safeString2(e,"holdBalance","hold"),t.free=this.safeString2(e,"availableBalance","available"),t.total=this.safeString2(e,"totalBalance","total");const i=this.safeString(e,"liability"),s=this.safeString(e,"interest");return t.debt=a.Y.stringAdd(i,s),t}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(e,"code");let i;void 0!==t&&(i=this.currency(t));const s=this.safeString2(this.options,"fetchBalance","defaultType","spot"),r=this.safeString(e,"type",s),a=this.safeDict(this.options,"accountsByType");let o,n=this.safeString(a,r,r);e=this.omit(e,"type"),[o,e]=this.handleHfAndParams(e),o&&"main"!==n&&(n="trade_hf");const[d,h]=this.handleMarginModeAndParams("fetchBalance",e);let c;const l={},u="isolated"===d||"isolated"===n,f="cross"===d||"margin"===n;let p;u?(void 0!==i&&(l.balanceCurrency=i.id),c=await this.privateGetIsolatedAccounts(this.extend(l,h))):f?c=await this.privateGetMarginAccount(this.extend(l,h)):(void 0!==i&&(l.currency=i.id),l.type=n,c=await this.privateGetAccounts(this.extend(l,h)));const m={info:c,timestamp:void 0,datetime:void 0};if(u){p=this.safeDict(c,"data",{});const e=this.safeValue(p,"assets",p);for(let t=0;t<e.length;t++){const i=e[t],s=this.safeString(i,"symbol"),r=this.safeSymbol(s,void 0,"_"),a=this.safeDict(i,"baseAsset",{}),o=this.safeDict(i,"quoteAsset",{}),n=this.safeCurrencyCode(this.safeString(a,"currency")),d=this.safeCurrencyCode(this.safeString(o,"currency")),h={};h[n]=this.parseBalanceHelper(a),h[d]=this.parseBalanceHelper(o),m[r]=this.safeBalance(h)}}else if(f){p=this.safeDict(c,"data",{});const e=this.safeList(p,"accounts",[]);for(let t=0;t<e.length;t++){const i=e[t],s=this.safeString(i,"currency");m[this.safeCurrencyCode(s)]=this.parseBalanceHelper(i)}}else{p=this.safeList(c,"data",[]);for(let e=0;e<p.length;e++){const t=p[e];if(this.safeString(t,"type")===n){const e=this.safeString(t,"currency"),i=this.safeCurrencyCode(e),s=this.account();s.total=this.safeString(t,"balance"),s.free=this.safeString(t,"available"),s.used=this.safeString(t,"holds"),m[i]=s}}}let g=m;return u||(g=this.safeBalance(m)),g}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n=this.currencyToPrecision(e,t);let d=this.convertTypeToAccount(i),h=this.convertTypeToAccount(s);const c=this.inArray(d,this.ids),l=this.inArray(h,this.ids);if("contract"===d){if("main"!==h)throw new r.ExchangeError(this.id+" transfer() only supports transferring from futures account to main account");const e={currency:o.id,amount:n};"bizNo"in a||(e.bizNo=this.uuid22());const t=await this.futuresPrivatePostTransferOut(this.extend(e,a)),i=this.safeDict(t,"data");return this.parseTransfer(i,o)}{const e={currency:o.id,amount:n};(c||l)&&(this.inArray(d,this.ids)&&(e.fromTag=d,d="isolated"),this.inArray(h,this.ids)&&(e.toTag=h,h="isolated")),e.from=d,e.to=h,"clientOid"in a||(e.clientOid=this.uuid());const t=await this.privatePostAccountsInnerTransfer(this.extend(e,a)),i=this.safeDict(t,"data");return this.parseTransfer(i,o)}}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"createdAt"),s=this.safeString(e,"currency"),r=this.safeString(e,"status"),a=this.safeStringLower(e,"payAccountType"),o=this.safeStringLower(e,"recAccountType"),n=this.safeDict(this.options,"accountsByType"),d=this.safeString(n,a,a),h=this.safeString(n,o,o);return{id:this.safeString2(e,"applyId","orderId"),currency:this.safeCurrencyCode(s,t),timestamp:i,datetime:this.iso8601(i),amount:this.safeNumber(e,"amount"),fromAccount:d,toAccount:h,status:this.parseTransferStatus(r),info:e}}parseTransferStatus(e){return this.safeString({PROCESSING:"pending"},e,e)}parseLedgerEntryType(e){return this.safeString({"Assets Transferred in After Upgrading":"transfer",Deposit:"transaction",Withdrawal:"transaction",Transfer:"transfer",Trade_Exchange:"trade","KuCoin Bonus":"bonus","Referral Bonus":"referral",Rewards:"bonus","Airdrop/Fork":"airdrop","Other rewards":"bonus","Fee Rebate":"rebate","Buy Crypto":"trade","Sell Crypto":"sell","Public Offering Purchase":"trade","Refunded Fees":"fee","KCS Pay Fees":"fee","Margin Trade":"trade",Loans:"Loans","Instant Exchange":"trade","Sub-account transfer":"transfer","Liquidation Fees":"fee"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"currency"),r=this.safeCurrencyCode(s,t);t=this.safeCurrency(s,t);const a=this.safeNumber(e,"amount"),o=this.safeString(e,"bizType"),n=this.parseLedgerEntryType(o),d=this.safeString(e,"direction"),h=this.safeInteger(e,"createdAt"),c=this.iso8601(h),l=this.safeString(e,"accountType"),u=this.safeString(e,"context");let f,p;if(void 0!==u&&""!==u)try{const e=JSON.parse(u),t=this.safeString(e,"orderId"),i=this.safeString(e,"tradeId");f=void 0!==i?i:t}catch(e){f=u}const m=this.safeString(e,"fee");let g;return"0"!==m&&(g=r,p={cost:this.parseNumber(m),currency:g}),this.safeLedgerEntry({info:e,id:i,direction:d,account:l,referenceId:f,referenceAccount:l,type:n,currency:r,amount:a,timestamp:h,datetime:c,before:void 0,after:undefined,status:void 0,fee:p},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),await this.loadAccounts();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),[r,s]=this.handleHfAndParams(s),a)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s);let o,n,d,h={};void 0!==t&&(h.startAt=t),void 0!==e&&(o=this.currency(e),h.currency=o.id),[h,s]=this.handleUntilOption("endAt",h,s),[n,s]=this.handleMarginModeAndParams("fetchLedger",s),d=r?void 0!==n?await this.privateGetHfMarginAccountLedgers(this.extend(h,s)):await this.privateGetHfAccountsLedgers(this.extend(h,s)):await this.privateGetAccountsLedgers(this.extend(h,s));const c=this.safeList(d,"data");if(void 0!==c)return this.parseLedger(c,o,t,i);const l=this.safeDict(d,"data"),u=this.safeList(l,"items",[]);return this.parseLedger(u,o,t,i)}calculateRateLimiterCost(e,t,i,s,r={}){const a=this.safeDict(this.options,"versions",{}),o=this.safeDict(a,e,{}),n=this.safeDict(o,t,{}),d=this.safeString(n,i,this.options.version),h=this.safeString(s,"version",d);return"v3"===h&&"v3"in r?r.v3:"v2"===h&&"v2"in r?r.v2:"v1"===h&&"v1"in r?r.v1:this.safeValue(r,"cost",1)}parseBorrowRate(e,t=void 0){const i=this.safeString2(e,"createdAt","timestamp"),s=this.parseToInt(i.slice(0,13)),r=this.safeString(e,"currency");return{currency:this.safeCurrencyCode(r,t),rate:this.safeNumber2(e,"dailyIntRate","dayRatio"),period:864e5,timestamp:s,datetime:this.iso8601(s),info:e}}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),[a,r]=this.handleMarginModeAndParams("fetchBorrowInterest",r,"cross");const o={};let n,d,h;void 0!==e&&(n=this.currency(e),"isolated"===a?o.balanceCurrency=n.id:o.quoteCurrency=n.id),void 0!==t&&(d=this.market(t)),h="isolated"===a?await this.privateGetIsolatedAccounts(this.extend(o,r)):await this.privateGetMarginAccounts(this.extend(o,r));const c=this.safeDict(h,"data",{}),l="isolated"===a?this.safeList(c,"assets",[]):this.safeList(c,"accounts",[]),u=this.parseBorrowInterests(l,d),f=this.filterByCurrencySinceLimit(u,e,i,s);return this.filterBySymbolSinceLimit(f,t,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"symbol"),s=void 0===i?"cross":"isolated";t=this.safeMarket(i,t);const r=this.safeString(t,"symbol"),a=this.safeInteger(e,"createdAt"),o=this.safeDict(e,"baseAsset",{});let n,d,h;return"isolated"===s?(n=this.safeNumber(o,"liability"),d=this.safeNumber(o,"interest"),h=this.safeString(o,"currency")):(n=this.safeNumber(e,"liability"),d=this.safeNumber(e,"accruedInterest"),h=this.safeString(e,"currency")),{info:e,symbol:r,currency:this.safeCurrencyCode(h),interest:d,interestRate:this.safeNumber(e,"dailyIntRate"),amountBorrowed:n,marginMode:s,timestamp:a,datetime:this.iso8601(a)}}async fetchBorrowRateHistories(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.handleMarginModeAndParams("fetchBorrowRateHistories",s);let a={isIsolated:"isolated"===this.safeString(r,0,"cross")};void 0!==t&&(a.startTime=t),[a,s]=this.handleUntilOption("endTime",a,s),void 0!==i&&(a.pageSize=i);const o=await this.privateGetMarginInterest(this.extend(a,s)),n=this.safeDict(o,"data"),d=this.safeList(n,"items",[]);return this.parseBorrowRateHistories(d,e,t,i)}async fetchBorrowRateHistory(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.handleMarginModeAndParams("fetchBorrowRateHistories",s);let a={isIsolated:"isolated"===this.safeString(r,0,"cross"),currency:this.currency(e).id};void 0!==t&&(a.startTime=t),[a,s]=this.handleUntilOption("endTime",a,s),void 0!==i&&(a.pageSize=i);const o=await this.privateGetMarginInterest(this.extend(a,s)),n=this.safeDict(o,"data"),d=this.safeList(n,"items",[]);return this.parseBorrowRateHistory(d,e,t,i)}parseBorrowRateHistories(e,t,i,s){const r={};for(let i=0;i<e.length;i++){const s=e[i],a=this.safeCurrencyCode(this.safeString(s,"currency"));if(void 0===t||this.inArray(a,t)){a in r||(r[a]=[]);const e=this.parseBorrowRate(s);r[a].push(e)}}const a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e];r[t]=this.filterByCurrencySinceLimit(r[t],t,i,s)}return r}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={currency:s.id,size:this.currencyToPrecision(e,t),timeInForce:"FOK"},a=await this.privatePostMarginBorrow(this.extend(r,i)),o=this.safeDict(a,"data",{});return this.parseMarginLoan(o,s)}async borrowIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o={currency:a.id,size:this.currencyToPrecision(t,i),symbol:r.id,timeInForce:"FOK",isIsolated:!0},n=await this.privatePostMarginBorrow(this.extend(o,s)),d=this.safeDict(n,"data",{});return this.parseMarginLoan(d,a)}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={currency:s.id,size:this.currencyToPrecision(e,t)},a=await this.privatePostMarginRepay(this.extend(r,i)),o=this.safeDict(a,"data",{});return this.parseMarginLoan(o,s)}async repayIsolatedMargin(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.currency(t),o={currency:a.id,size:this.currencyToPrecision(t,i),symbol:r.id,isIsolated:!0},n=await this.privatePostMarginRepay(this.extend(o,s)),d=this.safeDict(n,"data",{});return this.parseMarginLoan(d,a)}parseMarginLoan(e,t=void 0){const i=this.milliseconds(),s=this.safeString(e,"currency");return{id:this.safeString(e,"orderNo"),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"actualSize"),symbol:void 0,timestamp:i,datetime:this.iso8601(i),info:e}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetCurrencies(t),s=this.safeList(i,"data",[]);return this.parseDepositWithdrawFees(s,e,"currency")}async setLeverage(e,t=void 0,i={}){let s,a,o;if(await this.loadMarkets(),[a,i]=this.handleMarketTypeAndParams("setLeverage",void 0,i),(void 0!==t||"spot"!==a)&&(s=this.market(t),s.contract))throw new r.NotSupported(this.id+" setLeverage currently supports only spot margin");if([o,i]=this.handleMarginModeAndParams("setLeverage",i),void 0===o)throw new r.ArgumentsRequired(this.id+" setLeverage requires a marginMode parameter");const n={};if("isolated"===o&&void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage requires a symbol parameter for isolated margin");return void 0!==t&&(n.symbol=s.id),n.leverage=e.toString(),n.isIsolated="isolated"===o,await this.privatePostPositionUpdateUserLeverage(this.extend(n,i))}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeDict(this.options,"versions",{}),d=this.safeDict(o,t,{}),h=this.safeDict(d,i,{}),c=this.safeString(h,e,this.options.version),l=this.safeString(s,"version",c);s=this.omit(s,"version");let u="/api/"+l+"/"+this.implodeParams(e,s);"webExchange"===t&&(u="/"+this.implodeParams(e,s)),"earn"===t&&(u="/api/v1/"+this.implodeParams(e,s));const f=this.omit(s,this.extractParams(e));let p="";r=void 0!==r?r:{};let m=this.urls.api[t];this.isEmpty(f)||("GET"!==i&&"DELETE"!==i||"orders/multi-cancel"===e?(p=a=this.json(f),r["Content-Type"]="application/json"):u+="?"+this.rawencode(f)),m+=u;const g="futuresPrivate"===t,v="broker"===t;if("private"===t||g||v||"earn"===t){this.checkRequiredCredentials();const e=this.nonce().toString();r=this.extend({"KC-API-KEY-VERSION":"2","KC-API-KEY":this.apiKey,"KC-API-TIMESTAMP":e},r);if("2"===this.safeString(r,"KC-API-KEY-VERSION")){const e=this.hmac(this.encode(this.password),this.encode(this.secret),n.s,"base64");r["KC-API-PASSPHRASE"]=e}else r["KC-API-PASSPHRASE"]=this.password;const t=e+i+u+p,s=this.hmac(this.encode(t),this.encode(this.secret),n.s,"base64");r["KC-API-SIGN"]=s;let a=this.safeDict(this.options,"partner",{});a=g?this.safeValue(a,"future",a):this.safeValue(a,"spot",a);const o=this.safeString(a,"id"),d=this.safeString2(a,"secret","key");if(void 0!==o&&void 0!==d){const t=e+o+this.apiKey,i=this.hmac(this.encode(t),this.encode(d),n.s,"base64");r["KC-API-PARTNER-SIGN"]=i,r["KC-API-PARTNER"]=o,r["KC-API-PARTNER-VERIFY"]="true"}if(v){const e=this.safeString(a,"name");void 0!==e&&(r["KC-BROKER-NAME"]=e)}}return{url:m,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return void this.throwBroadlyMatchedException(this.exceptions.broad,o,o);const c=this.safeString(n,"code"),l=this.safeString2(n,"msg","data",""),u=this.id+" "+o;if(this.throwExactlyMatchedException(this.exceptions.exact,l,u),this.throwExactlyMatchedException(this.exceptions.exact,c,u),this.throwBroadlyMatchedException(this.exceptions.broad,o,u),"200000"!==c&&"200"!==c)throw new r.ExchangeError(u)}}
class n extends o.A{describe(){return this.deepExtend(super.describe(),{id:"kucoinfutures",name:"KuCoin Futures",countries:["SC"],rateLimit:75,version:"v1",certified:!0,pro:!0,comment:"Platform 2.0",quoteJsonNumbers:!1,has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!0,option:!1,addMargin:!0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!0,closePositions:!1,createDepositAddress:!0,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!0,fetchLedger:!0,fetchLeverage:!0,fetchLeverageTiers:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!0,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrice:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTransactionFee:!1,fetchWithdrawals:!0,setLeverage:!1,setMarginMode:!0,transfer:!0,withdraw:void 0},urls:{logo:"https://user-images.githubusercontent.com/1294454/147508995-9e35030a-d046-43a1-a006-6fabd981b554.jpg",doc:["https://docs.kucoin.com/futures","https://docs.kucoin.com"],www:"https://futures.kucoin.com/",referral:"https://futures.kucoin.com/?rcode=E5wkqe",api:{public:"https://openapi-v2.kucoin.com",private:"https://openapi-v2.kucoin.com",futuresPrivate:"https://api-futures.kucoin.com",futuresPublic:"https://api-futures.kucoin.com",webExchange:"https://futures.kucoin.com/_api/web-front"}},requiredCredentials:{apiKey:!0,secret:!0,password:!0},api:{futuresPublic:{get:{"contracts/active":1,"contracts/{symbol}":1,"contracts/risk-limit/{symbol}":1,ticker:1,allTickers:1,"level2/snapshot":1.33,"level2/depth{limit}":1,"level2/message/query":1,"level3/message/query":1,"level3/snapshot":1,"trade/history":1,"interest/query":1,"index/query":1,"mark-price/{symbol}/current":1,"premium/query":1,"funding-rate/{symbol}/current":1,timestamp:1,status:1,"kline/query":1},post:{"bullet-public":1}},futuresPrivate:{get:{"account-overview":1.33,"transaction-history":4.44,"deposit-address":1,"deposit-list":1,"withdrawals/quotas":1,"withdrawal-list":1,"transfer-list":1,orders:1.33,stopOrders:1,recentDoneOrders:1,"orders/{orderId}":1,"orders/byClientOid":1,fills:4.44,recentFills:4.44,openOrderStatistics:1,position:1,positions:4.44,"funding-history":4.44,"sub/api-key":1,"trade-statistics":1,"trade-fees":1,"history-positions":1,getMaxOpenSize:1,getCrossUserLeverage:1,"position/getMarginMode":1},post:{withdrawals:1,"transfer-out":1,"transfer-in":1,orders:1.33,"st-orders":1.33,"orders/test":1.33,"position/margin/auto-deposit-status":1,"position/margin/deposit-margin":1,"position/risk-limit-level/change":1,"bullet-private":1,"sub/api-key":1,"sub/api-key/update":1,changeCrossUserLeverage:1,"position/changeMarginMode":1},delete:{"withdrawals/{withdrawalId}":1,"cancel/transfer-out":1,"orders/{orderId}":1,orders:4.44,stopOrders:1,"sub/api-key":1,"orders/client-order/{clientOid}":1,"orders/multi-cancel":20}},webExchange:{get:{"contract/{symbol}/funding-rates":1}}},precisionMode:a.kb,exceptions:{exact:{400:s.BadRequest,401:s.AuthenticationError,403:s.NotSupported,404:s.NotSupported,405:s.NotSupported,415:s.BadRequest,429:s.RateLimitExceeded,500:s.ExchangeNotAvailable,503:s.ExchangeNotAvailable,100001:s.InvalidOrder,100004:s.BadRequest,101030:s.PermissionDenied,200004:s.InsufficientFunds,230003:s.InsufficientFunds,260100:s.InsufficientFunds,300003:s.InsufficientFunds,300012:s.InvalidOrder,400001:s.AuthenticationError,400002:s.InvalidNonce,400003:s.AuthenticationError,400004:s.AuthenticationError,400005:s.AuthenticationError,400006:s.AuthenticationError,400007:s.AuthenticationError,404e3:s.NotSupported,400100:s.BadRequest,411100:s.AccountSuspended,5e5:s.ExchangeNotAvailable,300009:s.InvalidOrder},broad:{"Position does not exist":s.OrderNotFound}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0006"),maker:this.parseNumber("0.0002"),tiers:{taker:[[this.parseNumber("0"),this.parseNumber("0.0006")],[this.parseNumber("50"),this.parseNumber("0.0006")],[this.parseNumber("200"),this.parseNumber("0.0006")],[this.parseNumber("500"),this.parseNumber("0.0005")],[this.parseNumber("1000"),this.parseNumber("0.0004")],[this.parseNumber("2000"),this.parseNumber("0.0004")],[this.parseNumber("4000"),this.parseNumber("0.00038")],[this.parseNumber("8000"),this.parseNumber("0.00035")],[this.parseNumber("15000"),this.parseNumber("0.00032")],[this.parseNumber("25000"),this.parseNumber("0.0003")],[this.parseNumber("40000"),this.parseNumber("0.0003")],[this.parseNumber("60000"),this.parseNumber("0.0003")],[this.parseNumber("80000"),this.parseNumber("0.0003")]],maker:[[this.parseNumber("0"),this.parseNumber("0.02")],[this.parseNumber("50"),this.parseNumber("0.015")],[this.parseNumber("200"),this.parseNumber("0.01")],[this.parseNumber("500"),this.parseNumber("0.01")],[this.parseNumber("1000"),this.parseNumber("0.01")],[this.parseNumber("2000"),this.parseNumber("0")],[this.parseNumber("4000"),this.parseNumber("0")],[this.parseNumber("8000"),this.parseNumber("0")],[this.parseNumber("15000"),this.parseNumber("-0.003")],[this.parseNumber("25000"),this.parseNumber("-0.006")],[this.parseNumber("40000"),this.parseNumber("-0.009")],[this.parseNumber("60000"),this.parseNumber("-0.012")],[this.parseNumber("80000"),this.parseNumber("-0.015")]]}},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{}}},commonCurrencies:{HOT:"HOTNOW",EDGE:"DADI",WAX:"WAXP",TRY:"Trias",VAI:"VAIOT",XBT:"BTC"},timeframes:{"1m":1,"3m":void 0,"5m":5,"15m":15,"30m":30,"1h":60,"2h":120,"4h":240,"6h":void 0,"8h":480,"12h":720,"1d":1440,"1w":10080},options:{version:"v1",symbolSeparator:"-",defaultType:"swap",code:"USDT",marginModes:{},marginTypes:{},versions:{futuresPrivate:{GET:{getMaxOpenSize:"v2",getCrossUserLeverage:"v2","position/getMarginMode":"v2"},POST:{"transfer-out":"v2",changeCrossUserLeverage:"v2","position/changeMarginMode":"v2"}},futuresPublic:{GET:{"level3/snapshot":"v2"}}},networks:{OMNI:"omni",ERC20:"eth",TRC20:"trx"}},features:{spot:void 0,forDerivs:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!0},timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!0},createOrders:{max:20},fetchMyTrades:{marginMode:!0,limit:1e3,daysBack:void 0,untilDays:7,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:500}},swap:{linear:{extends:"forDerivs"},inverse:{extends:"forDerivs"}},future:{linear:{extends:"forDerivs"},inverse:{extends:"forDerivs"}}}})}async fetchStatus(e={}){const t=await this.futuresPublicGetStatus(e),i=this.safeValue(t,"data",{});return{status:"open"===this.safeString(i,"status")?"ok":"maintenance",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchMarkets(e={}){const t=await this.futuresPublicGetContractsActive(e),i=[],s=this.safeValue(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],a=this.safeString(t,"symbol"),o=this.safeInteger(t,"expireDate"),n=!!o,d=!n,h=this.safeString(t,"baseCurrency"),c=this.safeString(t,"quoteCurrency"),l=this.safeString(t,"settleCurrency"),u=this.safeCurrencyCode(h),f=this.safeCurrencyCode(c),p=this.safeCurrencyCode(l);let m=u+"/"+f+":"+p,g="swap";n&&(m=m+"-"+this.yymmdd(o,""),g="future");const v=this.safeValue(t,"isInverse"),y=this.safeString(t,"status"),w=this.safeString(t,"multiplier"),b=this.safeNumber(t,"tickSize"),k=this.safeNumber(t,"lotSize");let S=k;void 0===S&&(S=this.safeNumber(t,"baseMinSize"));let O=this.safeNumber(t,"maxOrderQty");void 0===O&&(O=this.safeNumber(t,"baseMaxSize"));let T=this.safeNumber(t,"maxPrice");if(void 0===T){const e=this.safeString(t,"baseMinSize"),i=this.safeString(t,"quoteMaxSize");T=this.parseNumber(r.Y.stringDiv(i,e))}i.push({id:a,symbol:m,base:u,quote:f,settle:p,baseId:h,quoteId:c,settleId:l,type:g,spot:!1,margin:!1,swap:d,future:n,option:!1,active:"Open"===y,contract:!0,linear:!v,inverse:v,taker:this.safeNumber(t,"takerFeeRate"),maker:this.safeNumber(t,"makerFeeRate"),contractSize:this.parseNumber(r.Y.stringAbs(w)),expiry:o,expiryDatetime:this.iso8601(o),strike:void 0,optionType:void 0,precision:{amount:k,price:b},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(t,"maxLeverage")},amount:{min:S,max:O},price:{min:b,max:T},cost:{min:this.safeNumber(t,"quoteMinSize"),max:this.safeNumber(t,"quoteMaxSize")}},created:this.safeInteger(t,"firstOpenDate"),info:t})}return i}async fetchTime(e={}){const t=await this.futuresPublicGetTimestamp(e);return this.safeInteger(t,"data")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,200);const o=this.market(e),n=o.id,d=this.safeInteger(this.timeframes,t),h={symbol:n};h.granularity=void 0!==d?d:t;const c=1e3*this.parseTimeframe(t);let l=this.milliseconds();void 0!==i?(h.from=i,void 0===s&&(s=this.safeInteger(this.options,"fetchOHLCVLimit",200)),l=this.sum(i,s*c)):void 0!==s&&(i=l-s*c,h.from=i),h.to=l;const u=await this.futuresPublicGetKlineQuery(this.extend(h,r)),f=this.safeList(u,"data",[]);return this.parseOHLCVs(f,o,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e).id,s={currency:i},r=await this.futuresPrivateGetDepositAddress(this.extend(s,t)),a=this.safeValue(r,"data",{}),o=this.safeString(a,"address");return"NIM"!==i&&this.checkAddress(o),{info:r,currency:i,network:this.safeString(a,"chain"),address:o,tag:this.safeString(a,"memo")}}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const r=this.safeNumber(i,"level");if(2!==r&&void 0!==r)throw new s.BadRequest(this.id+" fetchOrderBook() can only return level 2");const a=this.market(e),o={symbol:a.id};if(void 0!==t){if(20!==t&&100!==t)throw new s.BadRequest(this.id+" fetchOrderBook() limit argument must be 20 or 100");o.limit=t}else o.limit=20;const n=await this.futuresPublicGetLevel2DepthLimit(this.extend(o,i)),d=this.safeValue(n,"data",{}),h=this.parseToInt(this.safeInteger(d,"ts")/1e6),c=this.parseOrderBook(d,a.symbol,h,"bids","asks",0,1);return c.nonce=this.safeInteger(d,"sequence"),c}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.futuresPublicGetTicker(this.extend(s,t));return this.parseTicker(r.data,i)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.futuresPublicGetMarkPriceSymbolCurrent(this.extend(s,t));return this.parseTicker(r.data,i)}async fetchTickers(e=void 0,t={}){let i,s;await this.loadMarkets(),e=this.marketSymbols(e),[i,t]=this.handleOptionAndParams(t,"fetchTickers","method","futuresPublicGetContractsActive"),s="futuresPublicGetAllTickers"===i?await this.futuresPublicGetAllTickers(t):await this.futuresPublicGetContractsActive(t);const r=this.safeList(s,"data"),a=this.parseTickers(r,e);return this.filterByArrayTickers(a,"symbol",e)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,"-");const s=this.safeString2(e,"price","lastTradePrice"),r=this.safeIntegerProduct(e,"ts",1e-6);return this.safeTicker({symbol:t.symbol,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"highPrice"),low:this.safeString(e,"lowPrice"),bid:this.safeString(e,"bestBidPrice"),bidVolume:this.safeString(e,"bestBidSize"),ask:this.safeString(e,"bestAskPrice"),askVolume:this.safeString(e,"bestAskSize"),vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:this.safeString(e,"priceChg"),percentage:this.safeString(e,"priceChgPct"),average:void 0,baseVolume:this.safeString(e,"volumeOf24h"),quoteVolume:this.safeString(e,"turnoverOf24h"),markPrice:this.safeString2(e,"markPrice","value"),indexPrice:this.safeString(e,"indexPrice"),info:e},t)}async fetchBidsAsks(e=void 0,t={}){return await this.fetchTickers(e,this.extend({method:"futuresPublicGetAllTickers"},t))}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,r={}){if(void 0===e)throw new s.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");await this.loadMarkets();const a={symbol:this.market(e).id};void 0!==t&&(a.startAt=t),void 0!==i&&(a.maxCount=i);const o=await this.futuresPrivateGetFundingHistory(this.extend(a,r)),n=this.safeValue(o,"data"),d=this.safeValue(n,"dataList",[]),h=[];for(let t=0;t<d.length;t++){const i=d[t],s=this.safeInteger(i,"timePoint");h.push({info:i,symbol:e,code:this.safeCurrencyCode(this.safeString(i,"settleCurrency")),timestamp:s,datetime:this.iso8601(s),id:this.safeNumber(i,"id"),amount:this.safeNumber(i,"funding"),fundingRate:this.safeNumber(i,"fundingRate"),markPrice:this.safeNumber(i,"markPrice"),positionQty:this.safeNumber(i,"positionQty"),positionCost:this.safeNumber(i,"positionCost")})}return h}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.futuresPrivateGetPosition(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parsePosition(a,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.futuresPrivateGetPositions(t),s=this.safeList(i,"data");return this.parsePositions(s,e)}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),void 0===i&&(i=200);const r={limit:i};void 0!==t&&(r.from=t);const a=this.safeInteger(s,"until");void 0!==a&&(s=this.omit(s,"until"),r.to=a);const o=await this.futuresPrivateGetHistoryPositions(this.extend(r,s)),n=this.safeDict(o,"data"),d=this.safeList(n,"items",[]);return this.parsePositions(d,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeInteger(e,"currentTimestamp"),a=this.safeString(e,"currentQty");let o;const n=this.safeStringLower(e,"type");void 0!==a?r.Y.stringGt(a,"0")?o="long":r.Y.stringLt(a,"0")&&(o="short"):void 0!==n&&(o=n.indexOf("long")>-1?"long":"short");const d=r.Y.stringAbs(this.safeString(e,"posCost")),h=this.safeString(e,"posInit"),c=r.Y.stringDiv(h,d),l=this.safeString(e,"unrealisedPnl"),u=this.safeValue(e,"crossMode");let f;return void 0!==u&&(f=u?"cross":"isolated"),this.safePosition({info:e,id:this.safeString2(e,"id","positionId"),symbol:this.safeString(t,"symbol"),timestamp:s,datetime:this.iso8601(s),lastUpdateTimestamp:this.safeInteger(e,"closeTime"),initialMargin:this.parseNumber(h),initialMarginPercentage:this.parseNumber(c),maintenanceMargin:this.safeNumber(e,"posMaint"),maintenanceMarginPercentage:this.safeNumber(e,"maintMarginReq"),entryPrice:this.safeNumber2(e,"avgEntryPrice","openPrice"),notional:this.parseNumber(d),leverage:this.safeNumber2(e,"realLeverage","leverage"),unrealizedPnl:this.parseNumber(l),contracts:this.parseNumber(r.Y.stringAbs(a)),contractSize:this.safeValue(t,"contractSize"),realizedPnl:this.safeNumber2(e,"realisedPnl","pnl"),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"liquidationPrice"),markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,collateral:this.safeNumber(e,"maintMargin"),marginMode:f,side:o,percentage:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.safeBool(a,"test",!1);a=this.omit(a,"test");const d=void 0!==this.safeValue(a,"stopLoss")||void 0!==this.safeValue(a,"takeProfit"),h=this.createContractOrderRequest(e,t,i,s,r,a);let c;c=n?await this.futuresPrivatePostOrdersTest(h):d?await this.futuresPrivatePostStOrders(h):await this.futuresPrivatePostOrders(h);const l=this.safeDict(c,"data",{});return this.parseOrder(l,o)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.market(r),o=this.safeString(s,"type"),n=this.safeString(s,"side"),d=this.safeValue(s,"amount"),h=this.safeValue(s,"price"),c=this.safeValue(s,"params",{}),l=this.createContractOrderRequest(a.id,o,n,d,h,c);i.push(l)}const s=await this.futuresPrivatePostOrdersMulti(i),r=this.safeList(s,"data",[]);return this.parseOrders(r)}createContractOrderRequest(e,t,i,r,a=void 0,o={}){const n=this.market(e),d=this.safeString2(o,"clientOid","clientOrderId",this.uuid());o=this.omit(o,["clientOid","clientOrderId"]);const h={clientOid:d,side:i,symbol:n.id,type:t,leverage:1},c=this.safeString(o,"cost");if(o=this.omit(o,"cost"),void 0!==c)h.valueQty=this.costToPrecision(e,c);else{if(r<1)throw new s.InvalidOrder(this.id+" createOrder() minimum contract order amount is 1");h.size=parseInt(this.amountToPrecision(e,r))}const[l,u,f]=this.handleTriggerPrices(o),p=this.safeDict(o,"stopLoss"),m=this.safeDict(o,"takeProfit"),g={mark:"MP",last:"TP",index:"IP"},v=this.safeString(o,"triggerPriceType","mark"),y=this.safeString(g,v,v);if(o=this.omit(o,["stopLossPrice","takeProfitPrice","triggerPrice","stopPrice","takeProfit","stopLoss"]),l)h.stop="buy"===i?"up":"down",h.stopPrice=this.priceToPrecision(e,l),h.stopPriceType=y;else if(void 0!==p||void 0!==m){let t=y;if(void 0!==p){const i=this.safeString2(p,"triggerPrice","stopPrice");h.triggerStopDownPrice=this.priceToPrecision(e,i),t=this.safeString(p,"triggerPriceType","mark"),t=this.safeString(g,t,t)}if(void 0!==m){const i=this.safeString2(m,"triggerPrice","takeProfitPrice");h.triggerStopUpPrice=this.priceToPrecision(e,i),t=this.safeString(m,"triggerPriceType","mark"),t=this.safeString(g,t,t)}h.stopPriceType=t}else(u||f)&&(u?(h.stop="buy"===i?"up":"down",h.stopPrice=this.priceToPrecision(e,u)):(h.stop="buy"===i?"down":"up",h.stopPrice=this.priceToPrecision(e,f)),h.reduceOnly=!0,h.stopPriceType=y);const w=t.toUpperCase(),b=this.safeStringUpper(o,"timeInForce");if("LIMIT"===w){if(void 0===a)throw new s.ArgumentsRequired(this.id+" createOrder() requires a price argument for limit orders");h.price=this.priceToPrecision(e,a),void 0!==b&&(h.timeInForce=b)}let k;[k,o]=this.handlePostOnly("market"===t,!1,o),k&&(h.postOnly=!0);const S=this.safeValue(o,"hidden");if(k&&void 0!==S)throw new s.BadRequest(this.id+" createOrder() does not support the postOnly parameter together with a hidden parameter");if(this.safeValue(o,"iceberg")){if(void 0===this.safeValue(o,"visibleSize"))throw new s.ArgumentsRequired(this.id+" createOrder() requires a visibleSize parameter for iceberg orders")}return o=this.omit(o,["timeInForce","stopPrice","triggerPrice","stopLossPrice","takeProfitPrice"]),this.extend(h,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const r=this.safeString2(i,"clientOid","clientOrderId");i=this.omit(i,["clientOrderId"]);const a={};let o;if(void 0!==r){if(void 0===t)throw new s.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument when cancelling by clientOrderId");const e=this.market(t);a.symbol=e.id,a.clientOid=r,o=await this.futuresPrivateDeleteOrdersClientOrderClientOid(this.extend(a,i))}else a.orderId=e,o=await this.futuresPrivateDeleteOrdersOrderId(this.extend(a,i));return this.safeValue(o,"data")}async cancelOrders(e,t=void 0,i={}){let r;await this.loadMarkets(),void 0!==t&&(r=this.market(t));const a=[],o=this.safeList2(i,"clientOrderIds","clientOids",[]);i=this.omit(i,["clientOrderIds","clientOids"]);let n=!1;for(let e=0;e<o.length;e++){if(n=!0,void 0===t)throw new s.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument when cancelling by clientOrderIds");a.push({symbol:r.id,clientOid:this.safeString(o,e)})}for(let t=0;t<e.length;t++)a.push(e[t]);const d={};d[n?"clientOidsList":"orderIdsList"]=a;const h=await this.futuresPrivateDeleteOrdersMultiCancel(this.extend(d,i)),c=this.safeList(h,"data",[]);return this.parseOrders(c,r)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};void 0!==e&&(i.symbol=this.marketId(e));const s=this.safeValue2(t,"stop","trigger");let r;return t=this.omit(t,["stop","trigger"]),r=s?await this.futuresPrivateDeleteStopOrders(this.extend(i,t)):await this.futuresPrivateDeleteOrders(this.extend(i,t)),this.safeValue(r,"data")}async addMargin(e,t,i={}){await this.loadMarkets();const s=this.market(e),r=this.uuid(),a={symbol:s.id,margin:this.amountToPrecision(e,t),bizNo:r},o=await this.futuresPrivatePostPositionMarginDepositMargin(this.extend(a,i)),n=this.safeValue(o,"data");return this.extend(this.parseMarginModification(n,s),{amount:this.amountToPrecision(e,t),direction:"in"})}parseMarginModification(e,t=void 0){const i=this.safeString(e,"id");t=this.safeMarket(i,t);const s=this.safeString(e,"settleCurrency"),r=this.safeValue(e,"crossMode")?"cross":"isolated",a=this.safeString(t,"symbol"),o=this.safeInteger(e,"currentTimestamp");return{info:e,symbol:this.safeSymbol(a,t),type:void 0,marginMode:r,amount:void 0,total:void 0,code:this.safeCurrencyCode(s),status:void 0,timestamp:o,datetime:this.iso8601(o)}}async fetchOrdersByStatus(e,t=void 0,i=void 0,r=void 0,a={}){await this.loadMarkets();let o=!1;if([o,a]=this.handleOptionAndParams(a,"fetchOrdersByStatus","paginate"),o)return await this.fetchPaginatedCallDynamic("fetchOrdersByStatus",t,i,r,a);const n=this.safeBool2(a,"stop","trigger"),d=this.safeInteger(a,"until");a=this.omit(a,["stop","until","trigger"]),"closed"===e?e="done":"open"===e&&(e="active");const h={};if(n){if("active"!==e)throw new s.BadRequest(this.id+" fetchOrdersByStatus() can only fetch untriggered stop orders")}else h.status=e;let c,l;void 0!==t&&(c=this.market(t),h.symbol=c.id),void 0!==i&&(h.startAt=i),void 0!==d&&(h.endAt=d),l=n?await this.futuresPrivateGetStopOrders(this.extend(h,a)):await this.futuresPrivateGetOrders(this.extend(h,a));const u=this.safeValue(l,"data",{}),f=this.safeList(u,"items",[]);return this.parseOrders(f,c,i,r)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r?await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s):await this.fetchOrdersByStatus("done",e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;return[r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r?await this.fetchPaginatedCallDynamic("fetchOpenOrders",e,t,i,s):await this.fetchOrdersByStatus("open",e,t,i,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const r={};let a;if(void 0===e){const e=this.safeString2(i,"clientOid","clientOrderId");if(void 0===e)throw new s.InvalidOrder(this.id+" fetchOrder() requires parameter id or params.clientOid");r.clientOid=e,i=this.omit(i,["clientOid","clientOrderId"]),a=await this.futuresPrivateGetOrdersByClientOid(this.extend(r,i))}else r.orderId=e,a=await this.futuresPrivateGetOrdersOrderId(this.extend(r,i));const o=void 0!==t?this.market(t):void 0,n=this.safeDict(a,"data");return this.parseOrder(n,o)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,a=this.safeString2(e,"id","orderId"),o=this.safeString(e,"type"),n=this.safeInteger(e,"createdAt"),d=this.iso8601(n),h=this.safeString(e,"price"),c=this.safeString(e,"side"),l=this.safeString(e,"feeCurrency"),u=this.safeCurrencyCode(l),f=this.safeNumber(e,"fee"),p=this.safeString(e,"size"),m=this.safeString(e,"filledSize"),g=this.safeString(e,"filledValue");let v=this.safeString(e,"avgDealPrice");if(void 0===v&&r.Y.stringGt(m,"0")){const e=this.safeString(t,"contractSize");v=t.linear?r.Y.stringDiv(g,r.Y.stringMul(e,m)):r.Y.stringDiv(r.Y.stringMul(e,m),g)}const y=this.safeValue(e,"isActive");let w,b;void 0!==y&&(w=y?"open":"closed"),w=this.safeBool(e,"cancelExist",!1)?"canceled":w,void 0!==f&&(b={currency:u,cost:f});const k=this.safeString(e,"clientOid"),S=this.safeString(e,"timeInForce"),O=this.safeValue(e,"postOnly"),T=this.safeValue(e,"reduceOnly"),P=this.safeInteger(e,"updatedAt");return this.safeOrder({id:a,clientOrderId:k,symbol:s,type:o,timeInForce:S,postOnly:O,reduceOnly:T,side:c,amount:p,price:h,triggerPrice:this.safeNumber(e,"stopPrice"),cost:g,filled:m,remaining:void 0,timestamp:n,datetime:d,fee:b,status:w,info:e,lastTradeTimestamp:void 0,lastUpdateTimestamp:P,average:v,trades:void 0},t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.futuresPublicGetFundingRateSymbolCurrent(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseFundingRate(a,i)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"timePoint"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t,void 0,"contract"),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"value"),fundingTimestamp:i,fundingDatetime:this.iso8601(i),nextFundingRate:this.safeNumber(e,"predictedValue"),nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(this.safeString(e,"granularity"))}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeValue(e,"data"),s=this.safeString(i,"currency"),r=this.safeCurrencyCode(s),a=this.account();return a.free=this.safeString(i,"availableBalance"),a.total=this.safeString(i,"accountEquity"),t[r]=a,this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();let t=this.safeString(this.options,"code");const i=this.safeValue(this.options,"fetchBalance",{});t=this.safeString(i,"code",t);const s=this.safeString(e,"code",t),r={currency:this.currency(s).id},a=await this.futuresPrivateGetAccountOverview(this.extend(r,e));return this.parseBalance(a)}async transfer(e,t,i,r,a={}){await this.loadMarkets();const o=this.currency(e),n=this.currencyToPrecision(e,t),d={currency:this.safeString(o,"id"),amount:n},h=this.parseTransferType(r);let c;if("TRADE"===h||"MAIN"===h)d.recAccountType=h,c=await this.futuresPrivatePostTransferOut(this.extend(d,a));else{if("future"!==r&&"swap"!==r&&"contract"!==r)throw new s.BadRequest(this.id+" transfer() only supports transfers between future/swap, spot and funding accounts");d.payAccountType=this.parseTransferType(i),c=await this.futuresPrivatePostTransferIn(this.extend(d,a))}const l=this.safeDict(c,"data",{});return this.extend(this.parseTransfer(l,o),{amount:this.parseNumber(n),fromAccount:i,toAccount:r})}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"updatedAt");return{id:this.safeString(e,"applyId"),timestamp:i,datetime:this.iso8601(i),currency:this.safeCurrencyCode(void 0,t),amount:this.safeNumber(e,"amount"),fromAccount:void 0,toAccount:void 0,status:this.safeString(e,"status"),info:e}}parseTransferStatus(e){return this.safeString({PROCESSING:"pending"},e,e)}parseTransferType(e){return this.safeStringUpper({spot:"TRADE",funding:"MAIN"},e,e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);let a,o={};void 0!==e&&(a=this.market(e),o.symbol=a.id),void 0!==t&&(o.startAt=t),void 0!==i&&(o.pageSize=Math.min(1e3,i)),[o,s]=this.handleUntilOption("endAt",o,s);const n=await this.futuresPrivateGetFills(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"items",[]);return this.parseTrades(h,a,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.futuresPublicGetTradeHistory(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,"-");const s=this.safeString2(e,"tradeId","id"),a=this.safeString(e,"orderId"),o=this.safeString(e,"liquidity");let n=this.safeInteger(e,"ts");void 0!==n?n=this.parseToInt(n/1e6):(n=this.safeInteger(e,"createdAt"),"dealValue"in e&&void 0!==n&&(n*=1e3));const d=this.safeString2(e,"price","dealPrice"),h=this.safeString2(e,"size","amount"),c=this.safeString(e,"side");let l;const u=this.safeString(e,"fee");if(void 0!==u){const i=this.safeString(e,"feeCurrency");let s=this.safeCurrencyCode(i);void 0===s&&(s="sell"===c?t.quote:t.base),l={cost:u,currency:s,rate:this.safeString(e,"feeRate")}}let f=this.safeString2(e,"type","orderType");"match"===f&&(f=void 0);let p=this.safeString2(e,"funds","value");if(void 0===p){const e=this.safeString(t,"contractSize"),i=r.Y.stringMul(d,h);p=r.Y.stringMul(i,e)}return this.safeTrade({info:e,id:s,order:a,timestamp:n,datetime:this.iso8601(n),symbol:t.symbol,type:f,takerOrMaker:o,side:c,price:d,amount:h,cost:p,fee:l},t)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.pageSize=i),void 0!==t&&(r.startAt=t);const o=(await this.futuresPrivateGetDepositList(this.extend(r,s))).data.items;return this.parseTransactions(o,a,t,i,{type:"deposit"})}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.pageSize=i),void 0!==t&&(r.startAt=t);const o=(await this.futuresPrivateGetWithdrawalList(this.extend(r,s))).data.items;return this.parseTransactions(o,a,t,i,{type:"withdrawal"})}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new s.BadRequest(this.id+" fetchMarketLeverageTiers() supports contract markets only");const r={symbol:i.id},a=await this.futuresPublicGetContractsRiskLimitSymbol(this.extend(r,t)),o=this.safeValue(a,"data");return this.parseMarketLeverageTiers(o,i)}parseMarketLeverageTiers(e,t=void 0){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"symbol");i.push({tier:this.safeNumber(r,"level"),symbol:this.safeSymbol(a,t,void 0,"contract"),currency:t.base,minNotional:this.safeNumber(r,"minRiskLimit"),maxNotional:this.safeNumber(r,"maxRiskLimit"),maintenanceMarginRate:this.safeNumber(r,"maintainMargin"),maxLeverage:this.safeNumber(r,"maxLeverage"),info:r})}return i}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,r={}){if(void 0===e)throw new s.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id,from:0,to:this.milliseconds()},n=this.safeInteger(r,"until");r=this.omit(r,["until"]),void 0!==t&&(o.from=t,void 0===n&&(o.to=t+288e7)),void 0!==n&&(o.to=n,void 0===t&&(o.to=n-288e7));const d=await this.futuresPublicGetContractFundingRates(this.extend(o,r)),h=this.safeValue(d,"data");return this.parseFundingRateHistories(h,a,t,i)}parseFundingRateHistory(e,t=void 0){const i=this.safeInteger(e,"timepoint"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t),fundingRate:this.safeNumber(e,"fundingRate"),timestamp:i,datetime:this.iso8601(i)}}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);let r=this.safeString(i,"clientOrderId");const a=this.safeBool(i,"test",!1);i=this.omit(i,["test","clientOrderId"]),void 0===r&&(r=this.numberToString(this.nonce()));const o={symbol:s.id,closeOrder:!0,clientOid:r,type:"market"};let n;return n=a?await this.futuresPrivatePostOrdersTest(this.extend(o,i)):await this.futuresPrivatePostOrders(this.extend(o,i)),this.parseOrder(n,s)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbols:i.id},r=await this.privateGetTradeFees(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0),n=this.safeString(o,"symbol");return{info:r,symbol:this.safeSymbol(n,i),maker:this.safeNumber(o,"makerFeeRate"),taker:this.safeNumber(o,"takerFeeRate"),percentage:!0,tierBased:!0}}async fetchMarginMode(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.futuresPrivateGetPositionGetMarginMode(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseMarginMode(a,i)}parseMarginMode(e,t=void 0){let i=this.safeString(e,"marginMode");return i="ISOLATED"===i?"isolated":"cross",{info:e,symbol:t.symbol,marginMode:i}}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new s.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");this.checkRequiredArgument("setMarginMode",e,"marginMode",["cross","isolated"]),await this.loadMarkets();const r=this.market(t),a={symbol:r.id,marginMode:e.toUpperCase()},o=await this.futuresPrivatePostPositionChangeMarginMode(this.extend(a,i)),n=this.safeDict(o,"data",{});return this.parseMarginMode(n,r)}async fetchLeverage(e,t={}){let i;if([i,t]=this.handleMarginModeAndParams(e,t),"cross"!==i)throw new s.NotSupported(this.id+' fetchLeverage() currently supports only params["marginMode"] = "cross"');await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.futuresPrivateGetGetCrossUserLeverage(this.extend(a,t)),n=this.safeDict(o,"data",{}),d=this.parseLeverage(n,r);return this.extend(d,{marginMode:i})}async setLeverage(e,t=void 0,i={}){let r;if([r,i]=this.handleMarginModeAndParams(t,i),"cross"!==r)throw new s.NotSupported(this.id+' setLeverage() currently supports only params["marginMode"] = "cross"');await this.loadMarkets();const a=this.market(t),o={symbol:a.id,leverage:e.toString()},n=await this.futuresPrivatePostChangeCrossUserLeverage(this.extend(o,i));return this.parseLeverage(n,a)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeInteger(e,"leverage");return{info:e,symbol:t.symbol,marginMode:void 0,longLeverage:s,shortLeverage:s}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"kuna",name:"Kuna",countries:["UA"],rateLimit:1e3,version:"v4",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createOrder:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchL3OrderBook:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!1,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrdersByStatus:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawAddresses:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!0},timeframes:void 0,urls:{extension:".json",referral:"https://kuna.io?r=kunaid-gvfihe8az7o4",logo:"https://user-images.githubusercontent.com/51840849/87153927-f0578b80-c2c0-11ea-84b6-74612568e9e1.jpg",api:{xreserve:"https://api.xreserve.fund",v3:"https://api.kuna.io",v4:"https://api.kuna.io",public:"https://kuna.io",private:"https://kuna.io"},www:"https://kuna.io",doc:"https://kuna.io/documents/api",fees:"https://kuna.io/documents/api"},api:{xreserve:{get:{nonce:1,fee:1,"delegated-transactions":1},post:{"delegate-transfer":1}},v4:{private:{get:{"private/me":1,"private/getBalance":1,"order/private/active":1,"order/private/history":1,"order/private/{id}/trades":1,"order/private/details/{id}":1,"trade/private/history":1,"transaction/private/{hash}":1,"deposit/private/preRequest":1,"deposit/private/crypto/address":1,"deposit/private/crypto/getMerchantAddress":1,"deposit/private/history":1,"deposit/private/details/{depositId}":1,"withdraw/private/preRequest":1,"withdraw/private/history":1,"withdraw/private/details/{withdrawId}":1,"kuna-code/{id}":1,"kuna-code/{code}/check":1,"kuna-code/issued-by-me":1,"kuna-code/redeemed-by-me":1},post:{"order/private/create":1,"order/private/cancel":1,"order/private/cancel/multi":1,"deposit/private/crypto/generateAddress":1,"deposit/private/crypto/generateMerchantAddress":1,"withdraw/private/create":1,"kuna-code":1},put:{"kuna-code/redeem":1}},public:{get:{"public/timestamp":1,"public/fees":1,"public/currencies?type={type}":1,"public/currencies":1,"markets/public/getAll":1,"markets/public/tickers?pairs={pairs}":1,"order/public/book/{pairs}":1,"trade/public/book/{pairs}":1}}},v3:{public:{get:{timestamp:1,currencies:1,markets:1,tickers:1,k:1,trades_history:1,fees:1,"exchange-rates":1,"exchange-rates/currency":1,"book/market":1,"kuna_codes/code/check":1,landing_page_statistic:1,"translations/locale":1,"trades/market/hist":1},post:{http_test:1,deposit_channels:1,withdraw_channels:1,subscription_plans:1,send_to:1,confirm_token:1,kunaid:1,"withdraw/prerequest":1,"deposit/prerequest":1,"deposit/exchange-rates":1}},sign:{get:{"reset_password/token":1},post:{"signup/google":1,"signup/resend_confirmation":1,signup:1,signin:1,"signin/two_factor":1,"signin/resend_confirm_device":1,"signin/confirm_device":1,reset_password:1,"cool-signin":1},put:{"reset_password/token":1,"signup/code/confirm":1}},private:{post:{"auth/w/order/submit":1,"auth/r/orders":1,"auth/r/orders/market":1,"auth/r/orders/markets":1,"auth/api_tokens/delete":1,"auth/api_tokens/create":1,"auth/api_tokens":1,"auth/signin_history/uniq":1,"auth/signin_history":1,"auth/disable_withdraw_confirmation":1,"auth/change_password":1,"auth/deposit_address":1,"auth/announcements/accept":1,"auth/announcements/unaccepted":1,"auth/otp/deactivate":1,"auth/otp/activate":1,"auth/otp/secret":1,"auth/r/order/market/:order_id/trades":1,"auth/r/orders/market/hist":1,"auth/r/orders/hist":1,"auth/r/orders/hist/markets":1,"auth/r/orders/details":1,"auth/assets-history":1,"auth/assets-history/withdraws":1,"auth/assets-history/deposits":1,"auth/r/wallets":1,"auth/markets/favorites":1,"auth/markets/favorites/list":1,"auth/me/update":1,"auth/me":1,"auth/fund_sources":1,"auth/fund_sources/list":1,"auth/withdraw/resend_confirmation":1,"auth/withdraw":1,"auth/withdraw/details":1,"auth/withdraw/info":1,"auth/payment_addresses":1,"auth/deposit/prerequest":1,"auth/deposit/exchange-rates":1,"auth/deposit":1,"auth/deposit/details":1,"auth/deposit/info":1,"auth/kuna_codes/count":1,"auth/kuna_codes/details":1,"auth/kuna_codes/edit":1,"auth/kuna_codes/send-pdf":1,"auth/kuna_codes":1,"auth/kuna_codes/redeemed-by-me":1,"auth/kuna_codes/issued-by-me":1,"auth/payment_requests/invoice":1,"auth/payment_requests/type":1,"auth/referral_program/weekly_earnings":1,"auth/referral_program/stats":1,"auth/merchant/payout_services":1,"auth/merchant/withdraw":1,"auth/merchant/payment_services":1,"auth/merchant/deposit":1,"auth/verification/auth_token":1,"auth/kunaid_purchase/create":1,"auth/devices/list":1,"auth/sessions/list":1,"auth/subscriptions/reactivate":1,"auth/subscriptions/cancel":1,"auth/subscriptions/prolong":1,"auth/subscriptions/create":1,"auth/subscriptions/list":1,"auth/kuna_ids/list":1,"order/cancel/multi":1,"order/cancel":1},put:{"auth/fund_sources/id":1,"auth/kuna_codes/redeem":1},delete:{"auth/markets/favorites":1,"auth/fund_sources":1,"auth/devices":1,"auth/devices/list":1,"auth/sessions/list":1,"auth/sessions":1}}},public:{get:["depth","k_with_pending_trades","k","markets","order_book","order_book/{market}","tickers","tickers/{market}","timestamp","trades","trades/{market}"]},private:{get:["members/me","deposits","deposit","deposit_address","orders","order","trades/my","withdraws","withdraw"],post:["orders","orders/multi","orders/clear","order/delete","withdraw"]}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:14,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{tierBased:!1,percentage:!0,taker:this.parseNumber("0.0025"),maker:this.parseNumber("0.0025")},funding:{withdraw:{UAH:"1%",BTC:.001,BCH:.001,ETH:.01,WAVES:.01,GOL:0,GBG:0},deposit:{}}},commonCurrencies:{PLA:"Plair"},precisionMode:a.kb,exceptions:{ARGUMENT_VALIDATION_ERROR:r.BadRequest,PAYMENT_METHOD_NOT_SUPPORTED:r.BadRequest,NOT_FOUND:r.OrderNotFound,"INVALID:ORDER_SIZE":r.InvalidOrder,WrongRequestException:r.BadRequest,INSUFFICIENT_FUNDS:r.InsufficientFunds,2002:r.InsufficientFunds,2003:r.OrderNotFound},options:{}})}async fetchTime(e={}){const t=await this.v4PublicGetPublicTimestamp(e),i=this.safeValue(t,"data",{});return this.safeInteger(i,"timestamp_miliseconds")}async fetchCurrencies(e={}){const t=await this.v4PublicGetPublicCurrencies(e),i=this.safeValue(t,"data",[]);return this.parseCurrencies(i)}parseCurrency(e){const t=this.safeString(e,"code"),i=this.safeString(e,"precision"),s=this.safeString(e,"tradePrecision");return this.safeCurrencyStructure({info:e,id:t,code:this.safeCurrencyCode(t),type:void 0,margin:void 0,name:this.safeString(e,"name"),active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:this.parseNumber(d.Y.stringMin(i,s)),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}})}async fetchMarkets(e={}){const t=await this.v4PublicGetMarketsPublicGetAll(e),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"pair"),a=this.safeValue(t,"baseAsset"),o=this.safeValue(t,"quoteAsset"),n=this.safeString(a,"code"),d=this.safeString(o,"code"),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d),l=this.safeString(a,"precision"),u=this.safeString(o,"precision");s.push({id:r,symbol:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(l)),price:this.parseNumber(this.parsePrecision(u))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pairs:s.id};void 0!==t&&(r.level=t);const a=await this.v4PublicGetOrderPublicBookPairs(this.extend(r,i)),o=this.safeDict(a,"data",{});return this.parseOrderBook(o,s.symbol,void 0,"bids","asks",0,1)}parseTicker(e,t=void 0){const i=this.safeString(e,"pair");return this.safeTicker({info:e,symbol:this.safeSymbol(i,t),timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bestBidPrice"),ask:this.safeString(e,"bestAskPrice"),vwap:void 0,open:this.safeString(e,"open"),close:void 0,last:void 0,previousClose:void 0,change:this.safeString(e,"priceChange"),percentage:this.safeString(e,"percentagePriceChange"),average:void 0,baseVolume:this.safeString(e,"baseVolume"),quoteVolume:this.safeString(e,"quoteVolume")},t)}async fetchTickers(e=void 0,t={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchTickers () requires a symbols argument");e=this.marketSymbols(e);const i={pairs:this.marketIds(e).join(",")},s=await this.v4PublicGetMarketsPublicTickersPairsPairs(this.extend(i,t)),a=this.safeList(s,"data",[]);return this.parseTickers(a,e,t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pairs:i.id},r=await this.v4PublicGetMarketsPublicTickersPairsPairs(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.safeDict(a,0);return this.parseTicker(o,i)}async fetchL3OrderBook(e,t=void 0,i={}){return await this.fetchOrderBook(e,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pairs:r.id};void 0!==i&&(a.limit=i);const o=await this.v4PublicGetTradePublicBookPairs(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"createdAt"),s=this.safeString(e,"pair"),r=this.safeValue(e,"isMaker");let a=this.safeStringLower(e,"side");if(void 0===a){a=this.safeValue(e,"isBuyer")?"buy":"sell"}return this.safeTrade({info:e,id:this.safeString(e,"id"),symbol:this.safeSymbol(s,t),timestamp:this.parse8601(i),datetime:i,type:void 0,side:a,order:this.safeString(e,"orderId"),takerOrMaker:r?"taker":"maker",price:this.safeString2(e,"matchPrice","price"),amount:this.safeString2(e,"matchQuantity","quantity"),cost:this.safeString(e,"quoteQuantity"),fee:{cost:this.safeString(e,"fee"),currency:this.safeCurrencyCode(this.safeString(e,"feeCurrency"))}},t)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"balance"),o.used=this.safeString(s,"lockBalance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v4PrivateGetPrivateGetBalance(e),i=this.safeValue(t,"data",[]);return this.parseBalance(i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=this.safeString2(o,"triggerPrice","stopPrice");o=this.omit(o,["triggerPrice","stopPrice"]);const h=this.capitalize(t),c={pair:n.id,orderSide:"buy"===i?"Bid":"Ask",quantity:this.numberToString(s),type:h};if("Limit"===h&&(c.price=this.priceToPrecision(n.symbol,a)),void 0!==d){if("Market"===h)throw new r.BadRequest(this.id+" createOrder () cannot place trigger market orders, or trigger limit");c.stopPrice=this.priceToPrecision(n.symbol,d),"TakeProfitLimit"!==h&&(c.type="StopLossLimit")}const l=await this.v4PrivatePostOrderPrivateCreate(this.extend(c,o)),u=this.safeDict(l,"data",{});return this.parseOrder(u,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e},r=await this.v4PrivatePostOrderPrivateCancel(this.extend(s,i)),a=this.safeValue(r,"data",{});let o;void 0!==t&&(o=this.market(t));const n=this.parseOrder(a,o);return n.id=e,n}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s={orderIds:e},r=await this.v4PrivatePostOrderPrivateCancelMulti(this.extend(s,i)),a=this.safeList(r,"data",[]);return this.parseOrders(a)}parseOrderStatus(e){return this.safeString({Canceled:"canceled",Closed:"filled",Pending:"open",Open:"open",done:"closed",wait:"open",cancel:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"pair"),s=this.safeString(e,"createdAt");let r=this.safeString(e,"side");"Bid"===r?r="buy":"Ask"===r&&(r="sell");const a=this.safeValue(e,"trades",[]);return this.safeOrder({info:e,id:this.safeString2(e,"id","orderId"),clientOrderId:void 0,symbol:this.safeSymbol(i,t),timestamp:this.parse8601(s),datetime:s,lastTradeTimestamp:this.parse8601(this.safeString(e,"updatedAt")),status:this.parseOrderStatus(this.safeString(e,"status")),type:this.safeStringLower(e,"type"),timeInForce:void 0,postOnly:void 0,side:r,price:this.safeString(e,"price"),triggerPrice:this.safeString(e,"stopPrice"),amount:this.safeString(e,"quantity"),filled:this.safeString(e,"executedQuantity"),remaining:void 0,trades:this.parseTrades(a),cost:this.safeString(e,"cost"),average:void 0,fee:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e,withTrades:!0},r=await this.v4PrivateGetOrderPrivateDetailsId(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeInteger(s,"until");let a;s=this.omit(s,["until"]);const o={};void 0!==e&&(a=this.market(e),o.pairs=a.id),void 0!==t&&(o.start=this.iso8601(t)),void 0!==i&&(o.limit=i),void 0!==r&&(o.end=this.iso8601(r));const n=await this.v4PrivateGetOrderPrivateActive(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseOrders(d,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("closed",e,t,i,s)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){if(await this.loadMarkets(),"open"===e)return this.fetchOpenOrders(t,i,s,r);const a=this.safeInteger(r,"until");let o;r=this.omit(r,["until"]);const n={status:this.capitalize(e)};void 0!==t&&(o=this.market(t),n.pairs=o.id),void 0!==i&&(n.start=this.iso8601(i)),void 0!==s&&(n.limit=s),void 0!==a&&(n.end=this.iso8601(a));const d=await this.v4PrivateGetOrderPrivateHistory(n),h=this.safeList(d,"data",[]);return this.parseOrders(h,o,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.pair=r.id);const o=await this.v4PrivateGetTradePrivateHistory(this.extend(a,s)),n=this.safeList(o,"data");return this.parseTrades(n,r,t,i)}async withdraw(e,t,i,s=void 0,a={}){this.checkAddress(i);let o=this.safeString2(a,"chain","network");a=this.omit(a,["chain","network"]),await this.loadMarkets();const n=this.currency(e);if(void 0===o){if(n.code.indexOf("USD")>0)throw new r.ArgumentsRequired(this.id+' withdraw () requires an extra parameter params["network"] to withdraw '+n.code);o=n.id.toUpperCase()}const d={currency:this.networkCodeToId(o),amount:t,address:i,paymentMethod:o};void 0!==s&&(d.paymentId=s);const h=await this.v4PrivatePostWithdrawPrivateCreate(this.extend(d,a)),c=this.safeDict(h,"data",{});return this.parseTransaction(c,n)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeInteger(s,"until");let a;s=this.omit(s,"until"),void 0!==e&&(a=this.currency(e));const o={};void 0!==e&&(o.currency=e),void 0!==t&&(o.dateFrom=this.iso8601(t)),void 0!==i&&(o.take=i),void 0!==r&&(o.dateTo=this.iso8601(r));const n=await this.v4PrivateGetWithdrawPrivateHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={withdrawId:e},r=await this.v4PrivateGetWithdrawPrivateDetailsWithdrawId(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseTransaction(a)}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={source:i.id},r=await this.v4PrivatePostDepositPrivateCryptoGenerateAddress(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseDepositAddress(a,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={source:i.id.toUpperCase()},r=await this.v4PrivateGetDepositPrivateCryptoAddress(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseDepositAddress(a,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"source");return{info:this.safeString(e,""),currency:this.safeCurrencyCode(i,t),network:void 0,address:this.safeString(e,"address"),tag:void 0}}parseTransactionStatus(e){return this.safeString({Created:"pending",Canceled:"canceled",PartiallyProcessed:"pending",Processing:"pending",Processed:"ok",WaitForConfirmation:"pending",Pending:"pending",AmlChecking:"pending"},e,e)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeInteger(s,"until");let a;s=this.omit(s,"until"),void 0!==e&&(a=this.currency(e));const o={};void 0!==e&&(o.currency=e),void 0!==t&&(o.dateFrom=this.iso8601(t)),void 0!==i&&(o.take=i),void 0!==r&&(o.dateTo=this.iso8601(r));const n=await this.v4PrivateGetDepositPrivateHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a)}async fetchDeposit(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.currency(t));const r={depositId:e},a=await this.v4PrivateGetDepositPrivateDetailsDepositId(this.extend(r,i)),o=this.safeDict(a,"data",{});return this.parseTransaction(o,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"createdAt"),s=this.safeString(e,"asset"),r=this.safeCurrencyCode(s,t),a=this.safeString(e,"paymentCode"),o=this.safeStringLower(e,"type"),n=this.safeString(e,"address"),d="deposit"===o?o:"withdrawal";return{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"txId"),currency:r,timestamp:this.parse8601(i),datetime:i,network:this.networkIdToCode(a),addressFrom:void 0,address:n,addressTo:n,amount:this.safeNumber(e,"amount"),type:d,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:this.parse8601(this.safeString(e,"updatedAt")),tagFrom:void 0,tag:void 0,tagTo:void 0,comment:this.safeString(e,"memo"),internal:void 0,fee:{cost:this.safeNumber(e,"fee"),currency:r}}}nonce(){return this.milliseconds()}encodeParams(e){if("orders"in e){const t=e.orders;let i=this.urlencode(this.keysort(this.omit(e,"orders")));for(let e=0;e<t.length;e++){const s=t[e],r=Object.keys(s);for(let e=0;e<r.length;e++){const t=r[e];i+="&orders%5B%5D%5B"+t+"%5D="+s[t].toString()}}return i}return this.urlencode(this.keysort(e))}sign(e,t="public",i="GET",s={},a=void 0,d=void 0){let h;if(Array.isArray(t)){const o="GET"===i,c=this.safeString(t,0),l=this.safeString(t,1);if("v3"===c){if(h=this.urls.api[c]+"/"+c+"/"+this.implodeParams(e,s),"public"===l)o?Object.keys(s).length&&(h+="?"+this.urlencode(s)):"POST"!==i&&"PUT"!==i||(a={"Content-Type":"application/json"},d=this.json(s));else if("private"===l)throw new r.NotSupported(this.id+" private v3 API is not supported yet")}else if("v4"===c){const t=this.extractParams(e);let i="/"+c+"/"+this.implodeParams(e,s);if(s=this.omit(s,t),o){Object.keys(s).length>0&&(i+="?"+this.urlencode(s))}if("private"===l){const e=this.nonce().toString();let t=i+e;o?t+=this.json({}):(t+=this.json(s),d=s),a={"Content-Type":"application/json",accept:"application/json",nonce:e,"public-key":this.apiKey,signature:this.hmac(this.encode(t),this.encode(this.secret),n.qt,"hex")};"pro"===this.safeString(this.options,"account")&&(a.account="pro")}h=this.urls.api[c]+i}}else{let r="/api/"+this.version+"/"+this.implodeParams(e,s);"extension"in this.urls&&(r+=this.urls.extension);const n=this.omit(s,this.extractParams(e));if(h=this.urls.api[t]+r,"public"===t)Object.keys(n).length&&(h+="?"+this.urlencode(n));else{this.checkRequiredCredentials();const e=this.nonce().toString(),t=i+"|"+r+"|"+this.encodeParams(this.extend({access_key:this.apiKey,tonce:e},s)),c=n+"&signature="+this.hmac(this.encode(t),this.encode(this.secret),o.s);"GET"===i?h+="?"+c:(d=c,a={"Content-Type":"application/x-www-form-urlencoded"})}}return void 0!==d&&(d=JSON.stringify(d)),{url:h,method:i,body:d,headers:a}}handleErrors(e,t,i,s,a,o,n,d,h){const c=this.safeValue(n,"errors");if(!(void 0===n&&void 0===c||void 0===c&&400!==e)){let e=this.safeValue(c,0);void 0===e&&(e=this.safeValue(n,"error"));const t=this.safeString(e,"code"),i=this.id+" "+this.json(n);throw this.throwExactlyMatchedException(this.exceptions,t,i),new r.ExchangeError(i)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"latoken",name:"Latoken",countries:["KY"],version:"v2",rateLimit:1e3,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createPostOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!0,transfer:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/61511972-24c39f00-aa01-11e9-9f7c-471f1d6e5214.jpg",api:{rest:"https://api.latoken.com"},www:"https://latoken.com",doc:["https://api.latoken.com"],fees:"https://latoken.com/fees",referral:"https://latoken.com/invite?r=mvgp2djk"},api:{public:{get:{"book/{currency}/{quote}":1,"chart/week":1,"chart/week/{currency}/{quote}":1,currency:1,"currency/available":1,"currency/quotes":1,"currency/{currency}":1,pair:1,"pair/available":1,ticker:1,"ticker/{base}/{quote}":1,time:1,"trade/history/{currency}/{quote}":1,"trade/fee/{currency}/{quote}":1,"trade/feeLevels":1,"transaction/bindings":1}},private:{get:{"auth/account":1,"auth/account/currency/{currency}/{type}":1,"auth/order":1,"auth/order/getOrder/{id}":1,"auth/order/pair/{currency}/{quote}":1,"auth/order/pair/{currency}/{quote}/active":1,"auth/stopOrder":1,"auth/stopOrder/getOrder/{id}":1,"auth/stopOrder/pair/{currency}/{quote}":1,"auth/stopOrder/pair/{currency}/{quote}/active":1,"auth/trade":1,"auth/trade/pair/{currency}/{quote}":1,"auth/trade/fee/{currency}/{quote}":1,"auth/transaction":1,"auth/transaction/bindings":1,"auth/transaction/bindings/{currency}":1,"auth/transaction/{id}":1,"auth/transfer":1},post:{"auth/order/cancel":1,"auth/order/cancelAll":1,"auth/order/cancelAll/{currency}/{quote}":1,"auth/order/place":1,"auth/spot/deposit":1,"auth/spot/withdraw":1,"auth/stopOrder/cancel":1,"auth/stopOrder/cancelAll":1,"auth/stopOrder/cancelAll/{currency}/{quote}":1,"auth/stopOrder/place":1,"auth/transaction/depositAddress":1,"auth/transaction/withdraw":1,"auth/transaction/withdraw/cancel":1,"auth/transaction/withdraw/confirm":1,"auth/transaction/withdraw/resendCode":1,"auth/transfer/email":1,"auth/transfer/id":1,"auth/transfer/phone":1}}},precisionMode:a.kb,fees:{trading:{feeSide:"get",tierBased:!1,percentage:!0,maker:this.parseNumber("0.0049"),taker:this.parseNumber("0.0049")}},commonCurrencies:{BUX:"Buxcoin",CBT:"Community Business Token",CTC:"CyberTronchain",DMD:"Diamond Coin",FREN:"Frenchie",GDX:"GoldenX",GEC:"Geco One",GEM:"NFTmall",GMT:"GMT Token",IMC:"IMCoin",MT:"Monarch",TPAY:"Tetra Pay",TRADE:"Smart Trade Coin",TSL:"Treasure SL",UNO:"Unobtanium",WAR:"Warrior Token"},exceptions:{exact:{INTERNAL_ERROR:r.ExchangeError,SERVICE_UNAVAILABLE:r.ExchangeNotAvailable,NOT_AUTHORIZED:r.AuthenticationError,FORBIDDEN:r.PermissionDenied,BAD_REQUEST:r.BadRequest,NOT_FOUND:r.ExchangeError,ACCESS_DENIED:r.PermissionDenied,REQUEST_REJECTED:r.ExchangeError,HTTP_MEDIA_TYPE_NOT_SUPPORTED:r.BadRequest,MEDIA_TYPE_NOT_ACCEPTABLE:r.BadRequest,METHOD_ARGUMENT_NOT_VALID:r.BadRequest,VALIDATION_ERROR:r.BadRequest,ACCOUNT_EXPIRED:r.AccountSuspended,BAD_CREDENTIALS:r.AuthenticationError,COOKIE_THEFT:r.AuthenticationError,CREDENTIALS_EXPIRED:r.AccountSuspended,INSUFFICIENT_AUTHENTICATION:r.AuthenticationError,UNKNOWN_LOCATION:r.AuthenticationError,TOO_MANY_REQUESTS:r.RateLimitExceeded,INSUFFICIENT_FUNDS:r.InsufficientFunds,ORDER_VALIDATION:r.InvalidOrder,BAD_TICKS:r.InvalidOrder},broad:{"invalid API key, signature or digest":r.AuthenticationError,"The API key was revoked":r.AuthenticationError,"request expired or bad":r.InvalidNonce,"For input string":r.BadRequest,"Unable to resolve currency by tag":r.BadSymbol,"Can't find currency with tag":r.BadSymbol,"Unable to place order because pair is in inactive state":r.BadSymbol,"API keys are not available for":r.AccountSuspended}},options:{defaultType:"spot",types:{wallet:"ACCOUNT_TYPE_WALLET",funding:"ACCOUNT_TYPE_WALLET",spot:"ACCOUNT_TYPE_SPOT"},accounts:{ACCOUNT_TYPE_WALLET:"wallet",ACCOUNT_TYPE_SPOT:"spot"},fetchTradingFee:{method:"fetchPrivateTradingFee"}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:void 0,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.safeInteger(t,"serverTime")}async fetchMarkets(e={}){const t=await this.fetchCurrenciesFromCache(e),i=await this.publicGetPair(e);this.safeValue(this.options,"adjustForTimeDifference",!0)&&await this.loadTimeDifference();const s=this.indexBy(t,"id"),r=[];for(let e=0;e<i.length;e++){const t=i[e],a=this.safeString(t,"id"),o=this.safeString(t,"baseCurrency"),n=this.safeString(t,"quoteCurrency"),d=this.safeValue(s,o),h=this.safeValue(s,n);if(void 0!==d&&void 0!==h){const e=this.safeCurrencyCode(this.safeString(d,"tag")),i=this.safeCurrencyCode(this.safeString(h,"tag")),s=i.toLowerCase(),c=this.capitalize(s),l=this.safeString(t,"status");r.push({id:a,symbol:e+"/"+i,base:e,quote:i,settle:void 0,baseId:o,quoteId:n,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"PAIR_STATUS_ACTIVE"===l,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(t,"quantityTick"),price:this.safeNumber(t,"priceTick")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minOrderQuantity"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"minOrderCost"+c),max:this.safeNumber(t,"maxOrderCost"+c)}},created:this.safeInteger(t,"created"),info:t})}}return r}async fetchCurrenciesFromCache(e={}){const t=this.safeValue(this.options,"fetchCurrencies",{}),i=this.safeInteger(t,"timestamp"),s=this.safeInteger(t,"expires",1e3),r=this.milliseconds();if(void 0===i||r-i>s){const i=await this.publicGetCurrency(e);this.options.fetchCurrencies=this.extend(t,{response:i,timestamp:r})}return this.safeValue(this.options.fetchCurrencies,"response")}async fetchCurrencies(e={}){const t=await this.fetchCurrenciesFromCache(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"id"),a=this.safeString(s,"tag"),o=this.safeCurrencyCode(a),n=this.safeNumber(s,"fee");let d;d="CURRENCY_TYPE_ALTERNATIVE"===this.safeString(s,"type")?"other":"crypto";const h="CURRENCY_STATUS_ACTIVE"===this.safeString(s,"status"),c=this.safeString(s,"name");i[o]={id:r,code:o,info:s,name:c,type:d,active:h,deposit:void 0,withdraw:void 0,fee:n,precision:this.parseNumber(this.parsePrecision(this.safeString(s,"decimals"))),limits:{amount:{min:this.safeNumber(s,"minTransferAmount"),max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}}}return i}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAuthAccount(e),i={info:t,timestamp:void 0,datetime:void 0};let s;const r=this.safeString2(this.options,"fetchBalance","defaultType","spot"),a=this.safeString(e,"type",r),o=this.safeValue(this.options,"types",{}),n=this.safeString(o,a,a),d=this.groupBy(t,"type"),h=this.safeValue(d,n,[]);for(let e=0;e<h.length;e++){const t=h[e],r=this.safeString(t,"currency"),a=this.safeInteger(t,"timestamp");void 0!==a&&(s=void 0===s?a:Math.max(s,a));const o=this.safeCurrencyCode(r),n=this.account();n.free=this.safeString(t,"available"),n.used=this.safeString(t,"blocked"),i[o]=n}return i.timestamp=s,i.datetime=this.iso8601(s),this.safeBalance(i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={currency:s.baseId,quote:s.quoteId};void 0!==t&&(r.limit=t);const a=await this.publicGetBookCurrencyQuote(this.extend(r,i));return this.parseOrderBook(a,e,void 0,"bid","ask","price","quantity")}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeString(e,"lastPrice"),r=this.safeIntegerOmitZero(e,"updateTimestamp");return this.safeTicker({symbol:this.safeSymbol(i,t),timestamp:r,datetime:this.iso8601(r),low:void 0,high:void 0,bid:this.safeString(e,"bestBid"),bidVolume:this.safeString(e,"bestBidQuantity"),ask:this.safeString(e,"bestAsk"),askVolume:this.safeString(e,"bestAskQuantity"),vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:this.safeString(e,"change24h"),average:void 0,baseVolume:this.safeString(e,"amount24h"),quoteVolume:this.safeString(e,"volume24h"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={base:i.baseId,quote:i.quoteId},r=await this.publicGetTickerBaseQuote(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTicker(t);return this.parseTickers(i,e)}parseTrade(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"price"),r=this.safeString(e,"quantity"),a=this.safeString(e,"cost"),o=this.safeValue(e,"makerBuyer");let n=this.safeString(e,"direction");void 0===n?n=o?"sell":"buy":"TRADE_DIRECTION_BUY"===n?n="buy":"TRADE_DIRECTION_SELL"===n&&(n="sell");const d=o&&"buy"===n?"maker":"taker",h=this.safeString(e,"baseCurrency"),c=this.safeString(e,"quoteCurrency"),l=this.safeCurrencyCode(h),u=this.safeCurrencyCode(c),f=l+"/"+u;f in this.markets&&(t=this.market(f));const p=this.safeString(e,"id"),m=this.safeString(e,"order"),g=this.safeString(e,"fee");let v;return void 0!==g&&(v={cost:g,currency:u}),this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:f,id:p,order:m,type:undefined,takerOrMaker:d,side:n,price:s,amount:r,cost:a,fee:v},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={currency:r.baseId,quote:r.quoteId};void 0!==i&&(a.limit=Math.min(i,100));const o=await this.publicGetTradeHistoryCurrencyQuote(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchTradingFee(e,t={}){const i=this.safeValue(this.options,"fetchTradingFee",{}),s=this.safeString(i,"method","fetchPrivateTradingFee"),a=this.safeString(t,"method",s);if(t=this.omit(t,"method"),"fetchPrivateTradingFee"===a)return await this.fetchPrivateTradingFee(e,t);if("fetchPublicTradingFee"===a)return await this.fetchPublicTradingFee(e,t);throw new r.NotSupported(this.id+" not support this method")}async fetchPublicTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={currency:i.baseId,quote:i.quoteId},r=await this.publicGetTradeFeeCurrencyQuote(this.extend(s,t));return{info:r,symbol:i.symbol,maker:this.safeNumber(r,"makerFee"),taker:this.safeNumber(r,"takerFee"),percentage:void 0,tierBased:void 0}}async fetchPrivateTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={currency:i.baseId,quote:i.quoteId},r=await this.privateGetAuthTradeFeeCurrencyQuote(this.extend(s,t));return{info:r,symbol:i.symbol,maker:this.safeNumber(r,"makerFee"),taker:this.safeNumber(r,"takerFee"),percentage:void 0,tierBased:void 0}}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o;return void 0!==i&&(r.limit=i),void 0!==e?(a=this.market(e),r.currency=a.baseId,r.quote=a.quoteId,o=await this.privateGetAuthTradePairCurrencyQuote(this.extend(r,s))):o=await this.privateGetAuthTrade(this.extend(r,s)),this.parseTrades(o,a,t,i)}parseOrderStatus(e){return this.safeString({ORDER_STATUS_PLACED:"open",ORDER_STATUS_CLOSED:"closed",ORDER_STATUS_CANCELLED:"canceled"},e,e)}parseOrderType(e){return this.safeString({ORDER_TYPE_MARKET:"market",ORDER_TYPE_LIMIT:"limit"},e,e)}parseTimeInForce(e){return this.safeString({ORDER_CONDITION_GOOD_TILL_CANCELLED:"GTC",ORDER_CONDITION_IMMEDIATE_OR_CANCEL:"IOC",ORDER_CONDITION_FILL_OR_KILL:"FOK"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"baseCurrency"),a=this.safeString(e,"quoteCurrency"),o=this.safeCurrencyCode(r),n=this.safeCurrencyCode(a);let d;void 0!==o&&void 0!==n&&(d=o+"/"+n,d in this.markets&&(t=this.market(d)));const h=this.safeString(e,"side");let c;if(void 0!==h){const e=h.split("_"),t=e.length;c=this.safeStringLower(e,t-1)}const l=this.parseOrderType(this.safeString(e,"type")),u=this.safeString(e,"price"),f=this.safeString(e,"quantity"),p=this.safeString(e,"filled"),m=this.safeString(e,"cost");let g=this.parseOrderStatus(this.safeString(e,"status"));const v=this.safeString(e,"message");void 0!==v&&(v.indexOf("cancel")>=0?g="canceled":v.indexOf("accept")>=0&&(g="open"));const y=this.safeString(e,"clientOrderId"),w=this.parseTimeInForce(this.safeString(e,"condition"));return this.safeOrder({id:i,clientOrderId:y,info:e,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,status:g,symbol:d,type:l,timeInForce:w,postOnly:void 0,side:c,price:u,triggerPrice:this.safeString(e,"stopPrice"),cost:m,amount:f,filled:p,average:void 0,remaining:void 0,fee:void 0,trades:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");let a;await this.loadMarkets();const o=this.safeValue2(s,"trigger","stop");s=this.omit(s,"stop");const n=this.market(e),d={currency:n.baseId,quote:n.quoteId};return a=o?await this.privateGetAuthStopOrderPairCurrencyQuoteActive(this.extend(d,s)):await this.privateGetAuthOrderPairCurrencyQuoteActive(this.extend(d,s)),this.parseOrders(a,n,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;const o=this.safeValue2(s,"trigger","stop");let n;return s=this.omit(s,["stop","trigger"]),void 0!==i&&(r.limit=i),void 0!==e?(a=this.market(e),r.currency=a.baseId,r.quote=a.quoteId,n=o?await this.privateGetAuthStopOrderPairCurrencyQuote(this.extend(r,s)):await this.privateGetAuthOrderPairCurrencyQuote(this.extend(r,s))):n=o?await this.privateGetAuthStopOrder(this.extend(r,s)):await this.privateGetAuthOrder(this.extend(r,s)),this.parseOrders(n,a,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=this.safeValue2(i,"trigger","stop");let a;return i=this.omit(i,["stop","trigger"]),a=r?await this.privateGetAuthStopOrderGetOrderId(this.extend(s,i)):await this.privateGetAuthOrderGetOrderId(this.extend(s,i)),this.parseOrder(a)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=t.toUpperCase(),d={baseCurrency:o.baseId,quoteCurrency:o.quoteId,side:i.toUpperCase(),condition:"GTC",type:n,clientOrderId:this.uuid(),quantity:this.amountToPrecision(e,s),timestamp:this.seconds()};"LIMIT"===n&&(d.price=this.priceToPrecision(e,r));const h=this.safeString2(a,"triggerPrice","stopPrice");let c;return a=this.omit(a,["triggerPrice","stopPrice"]),void 0!==h?(d.stopPrice=this.priceToPrecision(e,h),c=await this.privatePostAuthStopOrderPlace(this.extend(d,a))):c=await this.privatePostAuthOrderPlace(this.extend(d,a)),this.parseOrder(c,o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=this.safeValue2(i,"trigger","stop");let a;return i=this.omit(i,["stop","trigger"]),a=r?await this.privatePostAuthStopOrderCancel(this.extend(s,i)):await this.privatePostAuthOrderCancel(this.extend(s,i)),this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s;const r=this.safeValue2(t,"trigger","stop");let a;return t=this.omit(t,["stop","trigger"]),void 0!==e?(s=this.market(e),i.currency=s.baseId,i.quote=s.quoteId,a=r?await this.privatePostAuthStopOrderCancelAllCurrencyQuote(this.extend(i,t)):await this.privatePostAuthOrderCancelAllCurrencyQuote(this.extend(i,t))):a=r?await this.privatePostAuthStopOrderCancelAll(this.extend(i,t)):await this.privatePostAuthOrderCancelAll(this.extend(i,t)),[this.safeOrder({info:a})]}async fetchTransactions(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.privateGetAuthTransaction(this.extend({},s));let a;void 0!==e&&(a=this.currency(e));const o=this.safeList(r,"content",[]);return this.parseTransactions(o,a,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"currency"),a=this.safeCurrencyCode(r,t),o=this.parseTransactionStatus(this.safeString(e,"status")),n=this.safeNumber(e,"amount"),d=this.safeString(e,"senderAddress"),h=this.safeString(e,"recipientAddress"),c=this.safeString(e,"transactionHash"),l=this.safeString(e,"memo"),u={currency:void 0,cost:void 0,rate:void 0},f=this.safeNumber(e,"transactionFee");void 0!==f&&(u.cost=f,u.currency=a);const p=this.parseTransactionType(this.safeString(e,"type"));return{info:e,id:i,txid:c,timestamp:s,datetime:this.iso8601(s),network:void 0,addressFrom:d,addressTo:h,address:h,tagFrom:void 0,tagTo:l,tag:l,type:p,amount:n,currency:a,status:o,updated:void 0,comment:void 0,internal:void 0,fee:u}}parseTransactionStatus(e){return this.safeString({TRANSACTION_STATUS_CONFIRMED:"ok",TRANSACTION_STATUS_EXECUTED:"ok",TRANSACTION_STATUS_CHECKING:"pending",TRANSACTION_STATUS_CANCELLED:"canceled"},e,e)}parseTransactionType(e){return this.safeString({TRANSACTION_TYPE_DEPOSIT:"deposit",TRANSACTION_TYPE_WITHDRAWAL:"withdrawal"},e,e)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.currency(e),a=await this.privateGetAuthTransfer(s),o=this.safeList(a,"content",[]);return this.parseTransfers(o,r,t,i)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a={currency:this.currency(e).id,recipient:s,value:this.currencyToPrecision(e,t)};let o;return o=s.indexOf("@")>=0?await this.privatePostAuthTransferEmail(this.extend(a,r)):36===s.length?await this.privatePostAuthTransferId(this.extend(a,r)):await this.privatePostAuthTransferPhone(this.extend(a,r)),this.parseTransfer(o)}parseTransfer(e,t=void 0){const i=this.safeTimestamp(e,"timestamp"),s=this.safeString(e,"currency"),r=this.safeString(e,"status");return{info:e,id:this.safeString(e,"id"),timestamp:this.safeInteger(e,"timestamp"),datetime:this.iso8601(i),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"transferringFunds"),fromAccount:this.safeString(e,"fromAccount"),toAccount:this.safeString(e,"toAccount"),status:this.parseTransferStatus(r)}}parseTransferStatus(e){return this.safeString({TRANSFER_STATUS_COMPLETED:"ok",TRANSFER_STATUS_PENDING:"pending",TRANSFER_STATUS_REJECTED:"failed",TRANSFER_STATUS_UNVERIFIED:"pending",TRANSFER_STATUS_CANCELLED:"canceled"},e,e)}sign(e,t="public",i="GET",s=void 0,r=void 0,a=void 0){const n="/"+this.version+"/"+this.implodeParams(e,s);let d=n;const h=this.omit(s,this.extractParams(e)),c=this.urlencode(h);if("GET"===i&&Object.keys(h).length&&(d+="?"+c),"private"===t){this.checkRequiredCredentials();const e=i+n+c,t=this.hmac(this.encode(e),this.encode(this.secret),o.Zf);r={"X-LA-APIKEY":this.apiKey,"X-LA-SIGNATURE":t,"X-LA-DIGEST":"HMAC-SHA512"},"POST"===i&&(r["Content-Type"]="application/json",a=this.json(h))}return{url:this.urls.api.rest+d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeString(n,"message"),l=this.id+" "+o;void 0!==c&&(this.throwExactlyMatchedException(this.exceptions.exact,c,l),this.throwBroadlyMatchedException(this.exceptions.broad,c,l));const u=this.safeValue(n,"error"),f=this.safeString(u,"message");if(void 0!==u||void 0!==f)throw this.throwExactlyMatchedException(this.exceptions.exact,u,l),this.throwBroadlyMatchedException(this.exceptions.broad,o,l),new r.ExchangeError(l)}}
class c extends s.A{describe(){return this.deepExtend(super.describe(),{id:"lbank",name:"LBank",countries:["CN"],version:"v2",rateLimit:20,pro:!0,has:{CORS:!1,spot:!0,margin:!1,swap:void 0,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFees:!0,fetchTransactionFees:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},timeframes:{"1m":"minute1","5m":"minute5","15m":"minute15","30m":"minute30","1h":"hour1","2h":"hour2","4h":"hour4","6h":"hour6","8h":"hour8","12h":"hour12","1d":"day1","1w":"week1"},urls:{logo:"https://user-images.githubusercontent.com/1294454/38063602-9605e28a-3302-11e8-81be-64b1e53c4cfb.jpg",api:{rest:"https://api.lbank.info",contract:"https://lbkperp.lbank.com"},api2:"https://api.lbkex.com",www:"https://www.lbank.com",doc:"https://www.lbank.com/en-US/docs/index.html",fees:"https://support.lbank.site/hc/en-gb/articles/900000535703-Trading-Fees-From-14-00-on-April-7-2020-UTC-8-",referral:"https://www.lbank.com/login/?icode=7QCY"},api:{spot:{public:{get:{currencyPairs:2.5,accuracy:2.5,usdToCny:2.5,withdrawConfigs:2.5,timestamp:2.5,"ticker/24hr":2.5,ticker:2.5,depth:2.5,incrDepth:2.5,trades:2.5,kline:2.5,"supplement/system_ping":2.5,"supplement/incrDepth":2.5,"supplement/trades":2.5,"supplement/ticker/price":2.5,"supplement/ticker/bookTicker":2.5},post:{"supplement/system_status":2.5}},private:{post:{user_info:2.5,"subscribe/get_key":2.5,"subscribe/refresh_key":2.5,"subscribe/destroy_key":2.5,get_deposit_address:2.5,deposit_history:2.5,create_order:1,batch_create_order:1,cancel_order:1,cancel_clientOrders:1,orders_info:2.5,orders_info_history:2.5,order_transaction_detail:2.5,transaction_history:2.5,orders_info_no_deal:2.5,withdraw:2.5,withdrawCancel:2.5,withdraws:2.5,"supplement/user_info":2.5,"supplement/withdraw":2.5,"supplement/deposit_history":2.5,"supplement/withdraws":2.5,"supplement/get_deposit_address":2.5,"supplement/asset_detail":2.5,"supplement/customer_trade_fee":2.5,"supplement/api_Restrictions":2.5,"supplement/system_ping":2.5,"supplement/create_order_test":1,"supplement/create_order":1,"supplement/cancel_order":1,"supplement/cancel_order_by_symbol":1,"supplement/orders_info":2.5,"supplement/orders_info_no_deal":2.5,"supplement/orders_info_history":2.5,"supplement/user_info_account":2.5,"supplement/transaction_history":2.5}}},contract:{public:{get:{"cfd/openApi/v1/pub/getTime":2.5,"cfd/openApi/v1/pub/instrument":2.5,"cfd/openApi/v1/pub/marketData":2.5,"cfd/openApi/v1/pub/marketOrder":2.5}}}},fees:{trading:{maker:this.parseNumber("0.001"),taker:this.parseNumber("0.001")},funding:{withdraw:{}}},commonCurrencies:{HIT:"Hiver",VET_ERC20:"VEN",PNT:"Penta"},precisionMode:a.kb,options:{cacheSecretAsPem:!0,createMarketBuyOrderRequiresPrice:!0,fetchTrades:{method:"spotPublicGetTrades"},fetchTransactionFees:{method:"fetchPrivateTransactionFees"},fetchDepositWithdrawFees:{method:"fetchPrivateDepositWithdrawFees"},fetchDepositAddress:{method:"fetchDepositAddressDefault"},createOrder:{method:"spotPrivatePostSupplementCreateOrder"},fetchOrder:{method:"fetchOrderSupplement"},fetchBalance:{method:"spotPrivatePostSupplementUserInfo"},networks:{ERC20:"erc20",ETH:"erc20",TRC20:"trc20",TRX:"trc20",OMNI:"omni",ASA:"asa",BEP20:"bep20(bsc)",BSC:"bep20(bsc)",HT:"heco",BNB:"bep2",BTC:"btc",DOGE:"dogecoin",MATIC:"matic",POLYGON:"matic",OEC:"oec",BTCTRON:"btctron",XRP:"xrp"},"inverse-networks":{erc20:"ERC20",trc20:"TRC20",omni:"OMNI",asa:"ASA","bep20(bsc)":"BSC",bep20:"BSC",heco:"HT",bep2:"BNB",btc:"BTC",dogecoin:"DOGE",matic:"MATIC",oec:"OEC",btctron:"BTCTRON",xrp:"XRP"},defaultNetworks:{USDT:"TRC20"}},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,selfTradePrevention:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:2,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:200,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:200,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:{limit:2e3}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){let t,i;return[t,e]=this.handleMarketTypeAndParams("fetchTime",void 0,e),i="swap"===t?await this.contractPublicGetCfdOpenApiV1PubGetTime(e):await this.spotPublicGetTimestamp(e),this.safeInteger(i,"data")}async fetchMarkets(e={}){const t=[this.fetchSpotMarkets(e),this.fetchSwapMarkets(e)],i=await Promise.all(t);return this.arrayConcat(i[0],i[1])}async fetchSpotMarkets(e={}){const t=await this.spotPublicGetAccuracy(e),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=r.split("_"),o=a[0],n=a[1],d=this.safeCurrencyCode(o),h=this.safeCurrencyCode(n),c=d+"/"+h;s.push({id:r,symbol:c,base:d,quote:h,baseId:o,quoteId:n,settle:void 0,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"quantityAccuracy"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"priceAccuracy")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minTranQua"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return s}async fetchSwapMarkets(e={}){const t=await this.contractPublicGetCfdOpenApiV1PubInstrument(this.extend({productGroup:"SwapU"},e)),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeString(t,"baseCurrency"),o=this.safeString(t,"clearCurrency"),n=o,d=this.safeCurrencyCode(a),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(o),l=d+"/"+h+":"+c;s.push({id:r,symbol:l,base:d,quote:h,settle:c,baseId:a,quoteId:n,settleId:o,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:!0,contract:!0,linear:!0,inverse:void 0,contractSize:this.safeNumber(t,"volumeMultiple"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(t,"volumeTick"),price:this.safeNumber(t,"priceTick")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"minOrderVolume"),max:this.safeNumber(t,"maxOrderVolume")},price:{min:this.safeNumber(t,"priceLimitLowerValue"),max:this.safeNumber(t,"priceLimitUpperValue")},cost:{min:this.safeNumber(t,"minOrderCost"),max:void 0}},created:void 0,info:t})}return s}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeValue(e,"ticker",{}),o=(t=this.safeMarket(s,t)).contract?e:a;return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString2(o,"high","highestPrice"),low:this.safeString2(o,"low","lowestPrice"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:this.safeString(o,"openPrice"),close:void 0,last:this.safeString2(o,"latest","lastPrice"),previousClose:void 0,change:void 0,percentage:this.safeString(o,"change"),average:void 0,baseVolume:this.safeString2(o,"vol","volume"),quoteVolume:this.safeString(o,"turnover"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e);if(i.swap){const e=await this.fetchTickers([i.symbol],t);return this.safeValue(e,i.symbol)}const s={symbol:i.id},r=await this.spotPublicGetTicker24hr(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0!==e){(e=this.marketSymbols(e)).length>0&&(i=this.market(e[0]))}const s={};let r,a;[r,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),"swap"===r?(s.productGroup="SwapU",a=await this.contractPublicGetCfdOpenApiV1PubMarketData(this.extend(s,t))):(s.symbol="all",a=await this.spotPublicGetTicker24hr(this.extend(s,t)));const o=this.safeList(a,"data",[]);return this.parseTickers(o,e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);void 0===t&&(t=60);const r={symbol:s.id};let a,o;[a,i]=this.handleMarketTypeAndParams("fetchOrderBook",s,i),"swap"===a?(r.depth=t,o=await this.contractPublicGetCfdOpenApiV1PubMarketOrder(this.extend(r,i))):(r.size=t,o=await this.spotPublicGetDepth(this.extend(r,i)));const n=this.safeValue(o,"data",{}),d=this.milliseconds();return s.swap?this.parseOrderBook(n,s.symbol,d,"bids","asks","price","volume"):this.parseOrderBook(n,s.symbol,d)}parseTrade(e,t=void 0){let i=this.safeInteger2(e,"date_ms","time");void 0===i&&(i=this.safeInteger(e,"dealTime"));let s=this.safeString2(e,"amount","qty");void 0===s&&(s=this.safeString(e,"dealQuantity"));let r=this.safeString(e,"price");void 0===r&&(r=this.safeString(e,"dealPrice"));let a=this.safeString(e,"quoteQty");void 0===a&&(a=this.safeString(e,"dealVolumePrice"));let o,n,d=this.safeString2(e,"tradeType","type");if(void 0!==d){const e=d.split("_");d=this.safeString(e,0);const t=this.safeString(e,1);o="limit",n="taker",void 0!==t&&("market"===t?o="market":"maker"===t&&(n="maker"))}let h=this.safeString2(e,"tid","id");void 0===h&&(h=this.safeString(e,"txUuid"));const c=this.safeString(e,"orderUuid"),l=this.safeSymbol(void 0,t);let u;const f=this.safeString(e,"tradeFee");return void 0!==f&&(u={cost:f,currency:"buy"===d?t.base:t.quote,rate:this.safeString(e,"tradeFeeRate")}),this.safeTrade({timestamp:i,datetime:this.iso8601(i),symbol:l,id:h,order:c,type:o,takerOrMaker:n,side:d,price:r,amount:s,cost:a,fee:u,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==t&&(a.time=t),a.size=void 0!==i?Math.min(i,600):600;const o=this.safeValue(this.options,"fetchTrades",{}),n=this.safeString(o,"method","spotPublicGetTrades"),d=this.safeString(s,"method",n);let h;s=this.omit(s,"method"),h="spotPublicGetSupplementTrades"===d?await this.spotPublicGetSupplementTrades(this.extend(a,s)):await this.spotPublicGetTrades(this.extend(a,s));const c=this.safeList(h,"data",[]);return this.parseTrades(c,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);if(s=void 0===s?100:Math.min(s,2e3),void 0===i){const e=this.parseTimeframe(t);i=this.milliseconds()-1e3*e*s}const o={symbol:a.id,type:this.safeString(this.timeframes,t,t),time:this.parseToInt(i/1e3),size:Math.min(s+1,2e3)},n=await this.spotPublicGetKline(this.extend(o,r)),d=this.safeList(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}parseBalance(e){const t=this.safeInteger(e,"ts"),i={info:e,timestamp:t,datetime:this.iso8601(t)},s=this.safeValue(e,"data");if(void 0!==this.safeValue(s,"toBtc")){const e=this.safeValue(s,"freeze",{}),t=this.safeValue(s,"free",{}),r=Object.keys(t);for(let s=0;s<r.length;s++){const a=r[s],o=this.safeCurrencyCode(a),n=this.account();n.used=this.safeString(e,a),n.free=this.safeString(t,a),i[o]=n}return this.safeBalance(i)}const r=this.safeValue(s,"balances");if(void 0!==r){for(let e=0;e<r.length;e++){const t=r[e],s=this.safeString(t,"asset"),a=this.safeCurrencyCode(s),o=this.account();o.free=this.safeString(t,"free"),o.used=this.safeString(t,"locked"),i[a]=o}return this.safeBalance(i)}if(!0===Array.isArray(s)){for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"coin"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"usableAmt"),o.used=this.safeString(t,"freezeAmt"),i[a]=o}return this.safeBalance(i)}}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeNumber(e,"markedPrice"),a=this.safeNumber(e,"underlyingPrice"),o=this.safeNumber(e,"fundingRate"),n=this.safeInteger(e,"nextFeeTime"),d=this.safeInteger(e,"positionFeeTime");let h;if(void 0!==d){h=this.parseToInt(d/60/60).toString()+"h"}return{info:e,symbol:s,markPrice:r,indexPrice:a,fundingRate:o,fundingTimestamp:n,fundingDatetime:this.iso8601(n),timestamp:void 0,datetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:h}}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.fetchFundingRates([i.symbol],t);return this.safeValue(s,i.symbol)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.contractPublicGetCfdOpenApiV1PubMarketData(this.extend({productGroup:"SwapU"},t)),s=this.safeList(i,"data",[]);return this.parseFundingRates(s,e)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeValue(this.options,"fetchBalance",{}),i=this.safeString(t,"method","spotPrivatePostSupplementUserInfo"),s=this.safeString(e,"method",i);let r;return r="spotPrivatePostSupplementUserInfoAccount"===s?await this.spotPrivatePostSupplementUserInfoAccount():"spotPrivatePostUserInfo"===s?await this.spotPrivatePostUserInfo():await this.spotPrivatePostSupplementUserInfo(),this.parseBalance(r)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(i),maker:this.safeNumber(e,"makerCommission"),taker:this.safeNumber(e,"takerCommission"),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){const i=this.market(e),s=await this.fetchTradingFees(this.extend(t,{category:i.id}));return this.safeDict(s,e)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.spotPrivatePostSupplementCustomerTradeFee(this.extend({},e)),i=this.safeValue(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=this.parseTradingFee(i[e]);s[t.symbol]=t}return s}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,a=void 0,n={}){await this.loadMarkets();const d=this.market(e),h=this.safeString2(n,"custom_id","clientOrderId"),c=this.safeBool(n,"postOnly",!1),l=this.safeStringUpper(n,"timeInForce");n=this.omit(n,["custom_id","clientOrderId","timeInForce","postOnly"]);const u={symbol:d.id},f="IOC"===l,p="FOK"===l,m=c||"PO"===l;if("market"===t&&(f||p||m))throw new r.InvalidOrder(this.id+" createOrder () does not allow market FOK, IOC, or postOnly orders. Only limit IOC, FOK, and postOnly orders are allowed");if("limit"===t)u.type=i,u.price=this.priceToPrecision(e,a),u.amount=this.amountToPrecision(e,s),f?u.type=i+"_ioc":p?u.type=i+"_fok":m&&(u.type=i+"_maker");else if("market"===t)if("sell"===i)u.type=i+"_market",u.amount=this.amountToPrecision(e,s);else if("buy"===i){let t;u.type=i+"_market";let d=!0;[d,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const h=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==h)t=this.costToPrecision(e,h);else if(d){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const i=this.numberToString(s),r=this.numberToString(a),n=o.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);u.price=t}void 0!==h&&(u.custom_id=h);const g=this.safeValue(this.options,"createOrder",{}),v=this.safeString(g,"method","spotPrivatePostSupplementCreateOrder"),y=this.safeString(n,"method",v);let w;n=this.omit(n,"method"),w="spotPrivatePostCreateOrder"===y?await this.spotPrivatePostCreateOrder(this.extend(u,n)):await this.spotPrivatePostSupplementCreateOrder(this.extend(u,n));const b=this.safeValue(w,"data",{});return this.safeOrder({id:this.safeString(b,"order_id"),info:b},d)}parseOrderStatus(e){return this.safeString({"-1":"canceled",0:"open",1:"open",2:"closed",3:"canceled",4:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"orderId","order_id"),s=this.safeString2(e,"clientOrderId","custom_id"),r=this.safeInteger2(e,"time","create_time"),a=this.safeString(e,"status"),o=this.safeString(e,"symbol");let n;t=this.safeMarket(o,t);let d=!1,h="limit";const c=this.safeString2(e,"type","tradeType"),l=c.split("_"),u=this.safeString(l,0),f=this.safeString(l,1);"market"===f&&(h="market"),"maker"===f&&(d=!0,n="PO"),"ioc"===f&&(n="IOC"),"fok"===f&&(n="FOK");const p=this.safeString(e,"price"),m=this.safeString(e,"cummulativeQuoteQty");let g;"buy_market"!==c&&(g=this.safeString2(e,"origQty","amount"));const v=this.safeString2(e,"executedQty","deal_amount");return this.safeOrder({id:i,clientOrderId:s,datetime:this.iso8601(r),timestamp:r,lastTradeTimestamp:void 0,status:this.parseOrderStatus(a),symbol:t.symbol,type:h,timeInForce:n,postOnly:d,side:u,price:p,triggerPrice:void 0,cost:m,amount:g,filled:v,remaining:void 0,trades:void 0,fee:void 0,info:e,average:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();let s=this.safeString(i,"method");if(void 0===s){const e=this.safeValue(this.options,"fetchOrder",{});s=this.safeString(e,"method","fetchOrderSupplement")}return"fetchOrderSupplement"===s?await this.fetchOrderSupplement(e,t,i):await this.fetchOrderDefault(e,t,i)}async fetchOrderSupplement(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s={symbol:this.market(t).id,orderId:e},a=await this.spotPrivatePostSupplementOrdersInfo(this.extend(s,i)),o=this.safeDict(a,"data",{});return this.parseOrder(o)}async fetchOrderDefault(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s={symbol:this.market(t).id,order_id:e},a=await this.spotPrivatePostOrdersInfo(this.extend(s,i)),o=this.safeValue(a,"data",[]);if(1===o.length)return this.parseOrder(o[0]);throw new r.BadRequest(this.id+" fetchOrder() can only fetch one order at a time")}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e);t=this.safeValue(s,"start_date",t),s=this.omit(s,"start_date");const o={symbol:a.id};void 0!==i&&(o.size=i),void 0!==t&&(o.start_date=this.ymd(t,"-"),o.end_date=this.ymd(t+864e5,"-"));const n=await this.spotPrivatePostTransactionHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);void 0===i&&(i=100);const o={symbol:a.id,current_page:1,page_length:i},n=await this.spotPrivatePostSupplementOrdersInfoHistory(this.extend(o,s)),d=this.safeValue(n,"data",{}),h=this.safeList(d,"orders",[]);return this.parseOrders(h,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e);void 0===i&&(i=100);const o={symbol:a.id,current_page:1,page_length:i},n=await this.spotPrivatePostSupplementOrdersInfoNoDeal(this.extend(o,s)),d=this.safeValue(n,"data",{}),h=this.safeList(d,"orders",[]);return this.parseOrders(h,a,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.safeString2(i,"origClientOrderId","clientOrderId");i=this.omit(i,["origClientOrderId","clientOrderId"]);const a={symbol:this.market(t).id,orderId:e};void 0!==s&&(a.origClientOrderId=s);const o=await this.spotPrivatePostSupplementCancelOrder(this.extend(a,i)),n=this.safeDict(o,"data",{});return this.parseOrder(n)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i={symbol:this.market(e).id},s=await this.spotPrivatePostSupplementCancelOrderBySymbol(this.extend(i,t)),a=this.safeList(s,"data",[]);return this.parseOrders(a)}getNetworkCodeForCurrency(e,t){const i=this.safeValue(this.options,"defaultNetworks"),s=this.safeStringUpper(i,e),r=this.safeValue(this.options,"networks",{});let a=this.safeStringUpper(t,"network",s);return a=this.safeString(r,a,a),a}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.safeValue(this.options,"fetchDepositAddress",{}),s=this.safeString(i,"method","fetchDepositAddressDefault"),r=this.safeString(t,"method",s);let a;return t=this.omit(t,"method"),a="fetchDepositAddressSupplement"===r?await this.fetchDepositAddressSupplement(e,t):await this.fetchDepositAddressDefault(e,t),a}async fetchDepositAddressDefault(e,t={}){await this.loadMarkets();const i={assetCode:this.currency(e).id},s=this.getNetworkCodeForCurrency(e,t);void 0!==s&&(i.netWork=s,t=this.omit(t,"network"));const r=await this.spotPrivatePostGetDepositAddress(this.extend(i,t)),a=this.safeValue(r,"data"),o=this.safeString(a,"address"),n=this.safeString(a,"memo"),d=this.safeString(a,"netWork"),h=this.safeValue(this.options,"inverse-networks",{});return{info:r,currency:e,network:this.safeStringUpper(h,d,d),address:o,tag:n}}async fetchDepositAddressSupplement(e,t={}){await this.loadMarkets();const i={coin:this.currency(e).id},s=this.safeValue(this.options,"networks");let r=this.safeStringUpper(t,"network");r=this.safeString(s,r,r),void 0!==r&&(i.networkName=r,t=this.omit(t,"network"));const a=await this.spotPrivatePostSupplementGetDepositAddress(this.extend(i,t)),o=this.safeValue(a,"data"),n=this.safeString(o,"address"),d=this.safeString(o,"memo"),h=this.safeValue(this.options,"inverse-networks",{});return{info:a,currency:e,network:this.safeStringUpper(h,r,r),address:n,tag:d}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.safeString(r,"fee");r=this.omit(r,"fee"),this.checkRequiredArgument("withdraw",a,"fee");const o={address:i,coin:this.currency(e).id,amount:t,fee:a};void 0!==s&&(o.memo=s);const n=this.safeStringUpper2(r,"network","networkName");r=this.omit(r,["network","networkName"]);const d=this.safeValue(this.options,"networks"),h=this.safeString(d,n,n);void 0!==h&&(o.networkName=h);const c=await this.spotPrivatePostSupplementWithdraw(this.extend(o,r)),l=this.safeValue(c,"data",{});return{info:l,id:this.safeString(l,"withdrawId")}}parseTransactionStatus(e,t){return this.safeString(this.safeValue({deposit:{1:"pending",2:"ok",3:"failed",4:"canceled",5:"transfer"},withdrawal:{1:"pending",2:"canceled",3:"failed",4:"ok"}},t,{}),e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id");let s;s=void 0===i?"deposit":"withdrawal";const r=this.safeString(e,"txId"),a=this.safeInteger2(e,"insertTime","applyTime"),o=this.safeValue(this.options,"inverse-networks",{}),n=this.safeString(e,"networkName"),d=this.safeString(o,n,n),h=this.safeString(e,"address");let c,l;"deposit"===s?c=h:l=h;const u=this.safeNumber(e,"amount"),f=this.safeString2(e,"coin","coid"),p=this.safeCurrencyCode(f,t),m=this.parseTransactionStatus(this.safeString(e,"status"),s);let g;const v=this.safeNumber(e,"fee");return void 0!==v&&(g={cost:v,currency:p}),{info:e,id:i,txid:r,timestamp:a,datetime:this.iso8601(a),network:d,address:h,addressTo:l,addressFrom:c,tag:void 0,tagTo:void 0,tagFrom:void 0,type:s,amount:u,currency:p,status:m,updated:void 0,comment:void 0,internal:"transfer"===m,fee:g}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t);const o=await this.spotPrivatePostSupplementDepositHistory(this.extend(r,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"depositOrders",[]);return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t);const o=await this.spotPrivatePostSupplementWithdraws(this.extend(r,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"withdraws",[]);return this.parseTransactions(d,a,t,i)}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();let i;if(!0===this.checkRequiredCredentials(!1)){const e=this.safeValue(this.options,"fetchTransactionFees",{}),s=this.safeString(e,"method","fetchPrivateTransactionFees"),r=this.safeString(t,"method",s);t=this.omit(t,"method"),i="fetchPublicTransactionFees"===r?await this.fetchPublicTransactionFees(t):await this.fetchPrivateTransactionFees(t)}else i=await this.fetchPublicTransactionFees(t);return i}async fetchPrivateTransactionFees(e={}){await this.loadMarkets();const t=await this.spotPrivatePostSupplementUserInfo(),i=this.safeValue(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"coin"),a=this.safeCurrencyCode(r),o=this.safeValue(t,"networkList",[]);s[a]={};for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"name"),r=this.safeString(this.options["inverse-networks"],i,i),n=this.safeNumber(t,"withdrawFee");void 0!==n&&(s[a][r]=n)}}return{withdraw:s,deposit:{},info:t}}async fetchPublicTransactionFees(e={}){await this.loadMarkets();const t=this.safeString2(e,"coin","assetCode");e=this.omit(e,["coin","assetCode"]);const i={};if(void 0!==t){const e=this.currency(t);i.assetCode=e.id}const s=await this.spotPublicGetWithdrawConfigs(this.extend(i,e)),r=this.safeValue(s,"data",[]),a={};for(let e=0;e<r.length;e++){const t=r[e];if("true"===this.safeValue(t,"canWithDraw")){const e=this.safeString(t,"assetCode"),i=this.safeCurrencyCode(e),s=this.safeString(t,"chain");let r=this.safeString(this.options["inverse-networks"],s,s);void 0===r&&(r=i);const o=this.safeString(t,"fee");void 0===a[i]&&(a[i]={}),a[i][r]=this.parseNumber(o)}}return{withdraw:a,deposit:{},info:s}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();let i;if(!0===this.checkRequiredCredentials(!1)){const s=this.safeValue(this.options,"fetchDepositWithdrawFees",{}),r=this.safeString(s,"method","fetchPrivateDepositWithdrawFees"),a=this.safeString(t,"method",r);t=this.omit(t,"method"),i="fetchPublicDepositWithdrawFees"===a?await this.fetchPublicDepositWithdrawFees(e,t):await this.fetchPrivateDepositWithdrawFees(e,t)}else i=await this.fetchPublicDepositWithdrawFees(e,t);return i}async fetchPrivateDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotPrivatePostSupplementUserInfo(t),s=this.safeList(i,"data",[]);return this.parseDepositWithdrawFees(s,e,"coin")}async fetchPublicDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotPublicGetWithdrawConfigs(this.extend({},t)),s=this.safeValue(i,"data",[]);return this.parsePublicDepositWithdrawFees(s,e)}parsePublicDepositWithdrawFees(e,t=void 0){const i={};for(let s=0;s<e.length;s++){const r=e[s];if(!0===this.safeValue(r,"canWithDraw")){const e=this.safeString(r,"assetCode"),s=this.safeCurrencyCode(e);if(void 0===t||this.inArray(s,t)){const e=this.safeNumber(r,"fee");if(void 0!==e){if(void 0===this.safeValue(i,s))i[s]=this.depositWithdrawFee([r]);else{i[s].info.push(r)}const t=this.safeString(r,"chain"),a=this.safeString(this.options["inverse-networks"],t,t);void 0!==a?i[s].networks[a]={withdraw:{fee:e,percentage:void 0},deposit:{fee:void 0,percentage:void 0}}:i[s].withdraw={fee:e,percentage:void 0}}}}}return i}parseDepositWithdrawFee(e,t=void 0){const i=this.depositWithdrawFee(e),s=this.safeValue(e,"networkList",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"name"),a=this.safeStringUpper(this.options["inverse-networks"],r,r),o=this.safeNumber(t,"withdrawFee"),n=this.safeValue(t,"isDefault");void 0!==o&&(n&&(i.withdraw={fee:o,percentage:void 0}),i.networks[a]={withdraw:{fee:o,percentage:void 0},deposit:{fee:void 0,percentage:void 0}})}return i}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.omit(s,this.extractParams(e)),c=this.urls.api.rest+"/"+this.version+"/"+this.implodeParams(e,s);if("spot"===t[0]?c+=".do":c=this.urls.api.contract+"/"+this.implodeParams(e,s),"public"===t[1])Object.keys(o).length&&(c+="?"+this.urlencode(this.keysort(o)));else{this.checkRequiredCredentials();const e=this.milliseconds().toString(),t=this.uuid22()+this.uuid16();let i;o=this.extend({api_key:this.apiKey},o),i=this.secret.length>32?"RSA":"HmacSHA256";const s=this.rawencode(this.keysort(this.extend({echostr:t,signature_method:i,timestamp:e},o))),c=this.encode(s),l=this.hash(c,n.F).toUpperCase();let u;if("RSA"===i){let e;this.safeBool(this.options,"cacheSecretAsPem",!0)?(e=this.safeValue(this.options,"pem"),void 0===e&&(e=this.convertSecretToPem(this.encode(this.secret)),this.options.pem=e)):e=this.convertSecretToPem(this.encode(this.secret)),u=(0,h.n)(l,e,d.s)}else"HmacSHA256"===i&&(u=this.hmac(this.encode(l),this.encode(this.secret),d.s));o.sign=u,a=this.urlencode(this.keysort(o)),r={"Content-Type":"application/x-www-form-urlencoded",timestamp:e,signature_method:i,echostr:t}}return{url:c,method:i,body:a,headers:r}}convertSecretToPem(e){const t=e.length-0;let i=this.parseToInt(t/64);i=this.sum(i,1);let s="-----BEGIN PRIVATE KEY-----\n";for(let e=0;e<i;e++){const t=64*e,i=this.sum(t,64);s+=this.secret.slice(t,i)+"\n"}return s+"-----END PRIVATE KEY-----"}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeValue(n,"result");if("false"===c||!c){const e=this.safeString(n,"error_code"),t=this.safeString({1e4:"Internal error",10001:"The required parameters can not be empty",10002:"Validation failed",10003:"Invalid parameter",10004:"Request too frequent",10005:"Secret key does not exist",10006:"User does not exist",10007:"Invalid signature",10008:"Invalid Trading Pair",10009:"Price and/or Amount are required for limit order",10010:"Price and/or Amount must be less than minimum requirement",10013:"The amount is too small",10014:"Insufficient amount of money in the account",10015:"Invalid order type",10016:"Insufficient account balance",10017:"Server Error",10018:"Page size should be between 1 and 50",10019:"Cancel NO more than 3 orders in one request",10020:"Volume < 0.001",10021:"Price < 0.01",10022:"Invalid authorization",10023:"Market Order is not supported yet",10024:"User cannot trade on this pair",10025:"Order has been filled",10026:"Order has been cancelld",10027:"Order is cancelling",10028:"Wrong query time",10029:"from is not in the query time",10030:"from do not match the transaction type of inqury",10031:"echostr length must be valid and length must be from 30 to 40",10033:"Failed to create order",10036:"customID duplicated",10100:"Has no privilege to withdraw",10101:"Invalid fee rate to withdraw",10102:"Too little to withdraw",10103:"Exceed daily limitation of withdraw",10104:"Cancel was rejected",10105:"Request has been cancelled",10106:"None trade time",10107:"Start price exception",10108:"can not create order",10109:"wallet address is not mapping",10110:"transfer fee is not mapping",10111:"mount > 0",10112:"fee is too lower",10113:"transfer fee is 0",10600:"intercepted by replay attacks filter, check timestamp",10601:"Interface closed unavailable",10701:"invalid asset code",10702:"not allowed deposit"},e,this.json(n));throw new(this.safeValue({10001:r.BadRequest,10002:r.AuthenticationError,10003:r.BadRequest,10004:r.RateLimitExceeded,10005:r.AuthenticationError,10006:r.AuthenticationError,10007:r.AuthenticationError,10008:r.BadSymbol,10009:r.InvalidOrder,10010:r.InvalidOrder,10013:r.InvalidOrder,10014:r.InsufficientFunds,10015:r.InvalidOrder,10016:r.InsufficientFunds,10017:r.ExchangeError,10018:r.BadRequest,10019:r.BadRequest,10020:r.BadRequest,10021:r.InvalidOrder,10022:r.PermissionDenied,10023:r.InvalidOrder,10024:r.PermissionDenied,10025:r.InvalidOrder,10026:r.InvalidOrder,10027:r.InvalidOrder,10028:r.BadRequest,10029:r.BadRequest,10030:r.BadRequest,10031:r.InvalidNonce,10033:r.ExchangeError,10036:r.DuplicateOrderId,10100:r.PermissionDenied,10101:r.BadRequest,10102:r.InsufficientFunds,10103:r.ExchangeError,10104:r.ExchangeError,10105:r.ExchangeError,10106:r.BadRequest,10107:r.BadRequest,10108:r.ExchangeError,10109:r.InvalidAddress,10110:r.ExchangeError,10111:r.BadRequest,10112:r.BadRequest,10113:r.BadRequest,10600:r.BadRequest,10601:r.ExchangeError,10701:r.BadSymbol,10702:r.PermissionDenied},e,r.ExchangeError))(t)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"luno",name:"luno",countries:["GB","SG","ZA"],rateLimit:200,version:"1",pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchAccounts:!0,fetchBalance:!0,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1},urls:{referral:"https://www.luno.com/invite/44893A",logo:"https://user-images.githubusercontent.com/1294454/27766607-8c1a69d8-5ede-11e7-930c-540b5eb9be24.jpg",api:{public:"https://api.luno.com/api",private:"https://api.luno.com/api",exchange:"https://api.luno.com/api/exchange",exchangePrivate:"https://api.luno.com/api/exchange"},www:"https://www.luno.com",doc:["https://www.luno.com/en/api","https://npmjs.org/package/bitx","https://github.com/bausmeier/node-bitx"]},api:{exchange:{get:{markets:1}},exchangePrivate:{get:{candles:1}},public:{get:{orderbook:1,orderbook_top:1,ticker:1,tickers:1,trades:1}},private:{get:{"accounts/{id}/pending":1,"accounts/{id}/transactions":1,balance:1,beneficiaries:1,fee_info:1,funding_address:1,listorders:1,listtrades:1,send_fee:1,"orders/{id}":1,withdrawals:1,"withdrawals/{id}":1,transfers:1},post:{accounts:1,"address/validate":1,postorder:1,marketorder:1,stoporder:1,funding_address:1,withdrawals:1,send:1,"oauth2/grant":1,beneficiaries:1},put:{"accounts/{id}/name":1},delete:{"withdrawals/{id}":1,"beneficiaries/{id}":1}}},timeframes:{"1m":60,"5m":300,"15m":900,"30m":1800,"1h":3600,"3h":10800,"4h":14400,"1d":86400,"3d":259200,"1w":604800},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0")}},precisionMode:o.kb,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchMarkets(e={}){const t=await this.exchangeGetMarkets(e),i=[],s=this.safeValue(t,"markets",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"market_id"),a=this.safeString(t,"base_currency"),o=this.safeString(t,"counter_currency"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.safeString(t,"trading_status");i.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"ACTIVE"===h,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"volume_scale"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"price_scale")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"min_volume"),max:this.safeNumber(t,"max_volume")},price:{min:this.safeNumber(t,"min_price"),max:this.safeNumber(t,"max_price")},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return i}async fetchAccounts(e={}){const t=await this.privateGetBalance(e),i=this.safeValue(t,"balance",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"account_id"),a=this.safeString(t,"asset"),o=this.safeCurrencyCode(a);s.push({id:r,type:void 0,currency:o,info:t})}return s}parseBalance(e){const t=this.safeValue(e,"balance",[]),i={info:e,timestamp:void 0,datetime:void 0};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"asset"),o=this.safeCurrencyCode(r),n=this.safeString(s,"reserved"),d=this.safeString(s,"unconfirmed"),h=this.safeString(s,"balance"),c=a.Y.stringAdd(n,d),l=a.Y.stringAdd(h,d);if(o in i)i[o].used=a.Y.stringAdd(i[o].used,c),i[o].total=a.Y.stringAdd(i[o].total,l);else{const e=this.account();e.used=c,e.total=l,i[o]=e}}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id};let a;a=void 0!==t&&t<=100?await this.publicGetOrderbookTop(this.extend(r,i)):await this.publicGetOrderbook(this.extend(r,i));const o=this.safeInteger(a,"timestamp");return this.parseOrderBook(a,s.symbol,o,"bids","asks","price","volume")}parseOrderStatus(e){return this.safeString({PENDING:"open"},e,e)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"creation_timestamp");let s,r=this.parseOrderStatus(this.safeString(e,"state"));const a=this.safeString(e,"type");"ASK"===a||"SELL"===a?s="sell":"BID"!==a&&"BUY"!==a||(s="buy");const o=this.safeString(e,"pair");t=this.safeMarket(o,t);const n=this.safeString(e,"limit_price"),d=this.safeString(e,"limit_volume"),h=this.safeNumber(e,"fee_counter"),c=this.safeNumber(e,"fee_base"),l=this.safeString(e,"base"),u=this.safeString(e,"counter");let f;void 0!==h?f={cost:h,currency:t.quote}:void 0!==c&&(f={cost:c,currency:t.base});const p=this.safeString(e,"order_id");return this.safeOrder({id:p,clientOrderId:void 0,datetime:this.iso8601(i),timestamp:i,lastTradeTimestamp:void 0,status:r,symbol:t.symbol,type:void 0,timeInForce:void 0,postOnly:void 0,side:s,price:n,triggerPrice:void 0,amount:d,filled:l,cost:u,remaining:void 0,trades:void 0,fee:f,info:e,average:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrdersId(this.extend(s,i));return this.parseOrder(r)}async fetchOrdersByState(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==e&&(a.state=e),void 0!==t&&(o=this.market(t),a.pair=o.id);const n=await this.privateGetListorders(this.extend(a,r)),d=this.safeList(n,"orders",[]);return this.parseOrders(d,o,i,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState(void 0,e,t,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState("PENDING",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState("COMPLETE",e,t,i,s)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"pair"),r=this.safeSymbol(s,t),a=this.safeString(e,"last_trade");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:void 0,low:void 0,bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"rolling_24_hour_volume"),quoteVolume:void 0,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetTickers(t),s=this.indexBy(i.tickers,"pair"),r=Object.keys(s),a={};for(let e=0;e<r.length;e++){const t=r[e],i=this.safeMarket(t),o=i.symbol,n=s[t];a[o]=this.parseTicker(n,i)}return this.filterByArrayTickers(a,"symbol",e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"order_id"),s=this.safeString(e,"sequence");let r,o;if(void 0!==i){const t=this.safeString(e,"type");"ASK"===t||"SELL"===t?o="sell":"BID"!==t&&"BUY"!==t||(o="buy"),r="sell"===o&&e.is_buy?"maker":"buy"!==o||e.is_buy?"taker":"maker"}else o=e.is_buy?"buy":"sell";const n=this.safeString(e,"fee_base"),d=this.safeString(e,"fee_counter");let h,c;void 0!==n?a.Y.stringEquals(n,"0.0")||(h=t.base,c=n):void 0!==d&&(a.Y.stringEquals(d,"0.0")||(h=t.quote,c=d));const l=this.safeInteger(e,"timestamp");return this.safeTrade({info:e,id:s,timestamp:l,datetime:this.iso8601(l),symbol:t.symbol,order:i,type:void 0,side:o,takerOrMaker:r,price:this.safeString(e,"price"),amount:this.safeString2(e,"volume","base"),cost:this.safeString(e,"counter"),fee:{cost:c,currency:h}},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};void 0!==t&&(a.since=t);const o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,"trades",[]);return this.parseTrades(n,r,t,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={duration:this.safeValue(this.timeframes,t,t),pair:a.id};if(void 0!==i)o.since=this.parseToInt(i);else{const e=1e6*this.parseTimeframe(t);o.since=this.milliseconds()-e}const n=await this.exchangePrivateGetCandles(this.extend(o,r)),d=this.safeList(n,"candles",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id};void 0!==t&&(o.since=t),void 0!==i&&(o.limit=i);const n=await this.privateGetListtrades(this.extend(o,s)),d=this.safeList(n,"trades",[]);return this.parseTrades(d,a,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i={pair:this.market(e).id},s=await this.privateGetFeeInfo(this.extend(i,t));return{info:s,symbol:e,maker:this.safeNumber(s,"maker_fee"),taker:this.safeNumber(s,"taker_fee"),percentage:void 0,tierBased:void 0}}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={pair:o.id};let d;return"market"===t?(n.type=i.toUpperCase(),"buy"===i?n.counter_volume=this.amountToPrecision(o.symbol,s):n.base_volume=this.amountToPrecision(o.symbol,s),d=await this.privatePostMarketorder(this.extend(n,a))):(n.volume=this.amountToPrecision(o.symbol,s),n.price=this.priceToPrecision(o.symbol,r),n.type="buy"===i?"BID":"ASK",d=await this.privatePostPostorder(this.extend(n,a))),this.safeOrder({info:d,id:d.order_id},o)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privatePostStoporder(this.extend(s,i));return this.safeOrder({info:r})}async fetchLedgerByEntries(e=void 0,t=void 0,i=void 0,s={}){void 0===t&&(t=-1),void 0===i&&(i=1);const r={min_row:t,max_row:this.sum(t,i)};return await this.fetchLedger(e,undefined,i,this.extend(r,s))}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){let a;await this.loadMarkets(),await this.loadAccounts();let o=this.safeString(s,"id"),n=this.safeValue(s,"min_row"),d=this.safeValue(s,"max_row");if(void 0===o){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchLedger() requires a currency code argument if no account id specified in params");a=this.currency(e);const t=this.indexBy(this.accounts,"currency"),i=this.safeValue(t,e);if(void 0===i)throw new r.ExchangeError(this.id+" fetchLedger() could not find account id for "+e);o=i.id}if(void 0===n&&void 0===d)d=0,n=-1e3;else if(void 0===n||void 0===d)throw new r.ExchangeError(this.id+" fetchLedger() require both params 'max_row' and 'min_row' or neither to be defined");if(void 0!==i&&d-n>i&&(d<=0?n=d-i:n>0&&(d=n+i)),d-n>1e3)throw new r.ExchangeError(this.id+" fetchLedger() requires the params 'max_row' - 'min_row' <= 1000");const h={id:o,min_row:n,max_row:d},c=await this.privateGetAccountsIdTransactions(this.extend(s,h)),l=this.safeValue(c,"transactions",[]);return this.parseLedger(l,a,t,i)}parseLedgerComment(e){const t=e.split(" ");let i;const s=this.safeString(t,0),r=this.safeString(t,2),a=this.safeString(t,3);let o=this.safeString({Withdrawal:"fee",Trading:"fee",Payment:"transaction",Sent:"transaction",Deposit:"transaction",Received:"transaction",Released:"released",Reserved:"reserved",Sold:"trade",Bought:"trade",Failure:"failed"},s,void 0);return void 0===o&&"fee"===r&&(o="fee"),"reserved"===o&&"order"===a&&(i=this.safeString(t,4)),{type:o,referenceId:i}}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"row_index"),s=this.safeString(e,"account_id"),r=this.safeInteger(e,"timestamp"),o=this.safeString(e,"currency"),n=this.safeCurrencyCode(o,t);t=this.safeCurrency(o,t);const d=this.safeString(e,"available_delta"),h=this.safeString(e,"balance_delta"),c=this.safeString(e,"balance"),l=this.safeString(e,"description");let u=c,f="0.0";const p=this.parseLedgerComment(l),m=p.type,g=p.referenceId;let v,y;return a.Y.stringEquals(h,"0.0")?a.Y.stringLt(d,"0.0")?(y="pending",f=a.Y.stringAbs(d)):a.Y.stringGt(d,"0.0")&&(y="canceled",f=a.Y.stringAbs(d)):(u=a.Y.stringSub(c,h),y="ok",f=a.Y.stringAbs(h)),a.Y.stringGt(h,"0")||a.Y.stringGt(d,"0")?v="in":(a.Y.stringLt(h,"0")||a.Y.stringLt(d,"0"))&&(v="out"),this.safeLedgerEntry({info:e,id:i,direction:v,account:s,referenceId:g,referenceAccount:void 0,type:m,currency:n,amount:this.parseToNumeric(f),timestamp:r,datetime:this.iso8601(r),before:this.parseToNumeric(u),after:this.parseToNumeric(c),status:y,fee:void 0},t)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/"+this.version+"/"+this.implodeParams(e,s);const n=this.omit(s,this.extractParams(e));if(Object.keys(n).length&&(o+="?"+this.urlencode(n)),"private"===t||"exchangePrivate"===t){this.checkRequiredCredentials();r={Authorization:"Basic "+this.stringToBase64(this.apiKey+":"+this.secret)}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(void 0!==this.safeValue(n,"error"))throw new r.ExchangeError(this.id+" "+this.json(n))}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"mercado",name:"Mercado Bitcoin",countries:["BR"],rateLimit:1e3,version:"v3",has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketOrder:!0,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistory:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:"emulated",fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,withdraw:!0},timeframes:{"15m":"15m","1h":"1h","3h":"3h","1d":"1d","1w":"1w","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/27837060-e7c58714-60ea-11e7-9192-f05e86adb83f.jpg",api:{public:"https://www.mercadobitcoin.net/api",private:"https://www.mercadobitcoin.net/tapi",v4Public:"https://www.mercadobitcoin.com.br/v4",v4PublicNet:"https://api.mercadobitcoin.net/api/v4"},www:"https://www.mercadobitcoin.com.br",doc:["https://www.mercadobitcoin.com.br/api-doc","https://www.mercadobitcoin.com.br/trade-api"]},api:{public:{get:["coins","{coin}/orderbook/","{coin}/ticker/","{coin}/trades/","{coin}/trades/{from}/","{coin}/trades/{from}/{to}","{coin}/day-summary/{year}/{month}/{day}/"]},private:{post:["cancel_order","get_account_info","get_order","get_withdrawal","list_system_messages","list_orders","list_orderbook","place_buy_order","place_sell_order","place_market_buy_order","place_market_sell_order","withdraw_coin"]},v4Public:{get:["{coin}/candle/"]},v4PublicNet:{get:["candles"]}},fees:{trading:{maker:.003,taker:.007}},options:{limits:{BTC:.001,BCH:.001,ETH:.01,LTC:.01,XRP:.1}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:500,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb})}async fetchMarkets(e={}){const t=await this.publicGetCoins(e),i=[],s=this.safeValue(this.options,"limits",{});for(let e=0;e<t.length;e++){const r=t[e],a=r,o="BRL",n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=d+n;i.push({id:h,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber("1e-8"),price:this.parseNumber("1e-5")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(s,a),max:void 0},price:{min:this.parseNumber("1e-5"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:r})}return i}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={coin:s.base},a=await this.publicGetCoinOrderbook(this.extend(r,i));return this.parseOrderBook(a,s.symbol)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeTimestamp(e,"date"),r=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"vol"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={coin:i.base},r=await this.publicGetCoinTicker(this.extend(s,t)),a=this.safeValue(r,"ticker",{});return this.parseTicker(a,i)}parseTrade(e,t=void 0){const i=this.safeTimestamp2(e,"date","executed_timestamp");t=this.safeMarket(void 0,t);const s=this.safeString2(e,"tid","operation_id"),r=this.safeString(e,"type"),a=this.safeString(e,"price"),o=this.safeString2(e,"amount","quantity"),n=this.safeString(e,"fee_rate");let d;return void 0!==n&&(d={cost:n,currency:void 0}),this.safeTrade({id:s,info:e,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,order:void 0,type:undefined,side:r,takerOrMaker:void 0,price:a,amount:o,cost:void 0,fee:d},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);let a="publicGetCoinTrades";const o={coin:r.base};void 0!==t&&(a+="From",o.from=this.parseToInt(t/1e3));void 0!==this.safeInteger(s,"to")&&(a+="To");const n=await this[a](this.extend(o,s));return this.parseTrades(n,r,t,i)}parseBalance(e){const t=this.safeValue(e,"response_data",{}),i=this.safeValue(t,"balance",{}),s={info:e},r=Object.keys(i);for(let e=0;e<r.length;e++){const t=r[e],a=this.safeCurrencyCode(t);if(t in i){const e=this.safeValue(i,t,{}),r=this.account();r.free=this.safeString(e,"available"),r.total=this.safeString(e,"total"),s[a]=r}}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGetAccountInfo(e);return this.parseBalance(t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const d=this.market(e),h={coin_pair:d.id};let c=this.capitalize(i)+"Order";if("limit"===t)c="privatePostPlace"+c,h.limit_price=this.priceToPrecision(d.symbol,a),h.quantity=this.amountToPrecision(d.symbol,s);else if(c="privatePostPlaceMarket"+c,"buy"===i){if(void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument with market buy orders to calculate total order cost (amount to spend), where cost = amount * price. Supply a price argument to createOrder() call if you want the cost to be calculated for you from price and amount");const e=this.numberToString(s),t=this.numberToString(a),i=this.parseToNumeric(n.Y.stringMul(e,t));h.cost=this.priceToPrecision(d.symbol,i)}else h.quantity=this.amountToPrecision(d.symbol,s);const l=await this[c](this.extend(h,o));return this.safeOrder({info:l,id:l.response_data.order.order_id.toString()},d)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={coin_pair:s.id,order_id:e},o=await this.privatePostCancelOrder(this.extend(a,i)),n=this.safeValue(o,"response_data",{}),d=this.safeDict(n,"order",{});return this.parseOrder(d,s)}parseOrderStatus(e){return this.safeString({2:"open",3:"canceled",4:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"order_id"),s=this.safeString(e,"order_type");let r;"order_type"in e&&(r="1"===s?"buy":"sell");const a=this.parseOrderStatus(this.safeString(e,"status")),o=this.safeString(e,"coin_pair");t=this.safeMarket(o,t);const n=this.safeTimestamp(e,"created_timestamp"),d={cost:this.safeString(e,"fee"),currency:t.quote},h=this.safeString(e,"limit_price"),c=this.safeString(e,"executed_price_avg"),l=this.safeString(e,"quantity"),u=this.safeString(e,"executed_quantity"),f=this.safeTimestamp(e,"updated_timestamp"),p=this.safeValue(e,"operations",[]);return this.safeOrder({info:e,id:i,clientOrderId:void 0,timestamp:n,datetime:this.iso8601(n),lastTradeTimestamp:f,symbol:t.symbol,type:"limit",timeInForce:void 0,postOnly:void 0,side:r,price:h,triggerPrice:void 0,cost:void 0,average:c,amount:l,filled:u,remaining:void 0,status:a,fee:d,trades:p},t)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={coin_pair:s.id,order_id:parseInt(e)},o=await this.privatePostGetOrder(this.extend(a,i)),n=this.safeValue(o,"response_data",{}),d=this.safeDict(n,"order");return this.parseOrder(d,s)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n={coin:o.id,quantity:t.toFixed(10),address:i};if("BRL"===e){if(!("account_ref"in a))throw new r.ArgumentsRequired(this.id+" withdraw() requires account_ref parameter to withdraw "+e)}else if("LTC"!==e){if(!("tx_fee"in a))throw new r.ArgumentsRequired(this.id+" withdraw() requires tx_fee parameter to withdraw "+e);if("XRP"===e)if(void 0===s){if(!("destination_tag"in a))throw new r.ArgumentsRequired(this.id+" withdraw() requires a tag argument or destination_tag parameter to withdraw "+e)}else n.destination_tag=s}const d=await this.privatePostWithdrawCoin(this.extend(n,a)),h=this.safeValue(d,"response_data",{}),c=this.safeDict(h,"withdrawal");return this.parseTransaction(c,o)}parseTransaction(e,t=void 0){return t=this.safeCurrency(void 0,t),{id:this.safeString(e,"id"),txid:void 0,timestamp:void 0,datetime:void 0,network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,amount:void 0,type:void 0,currency:t.code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:void 0,info:e}}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="15m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={resolution:this.safeString(this.timeframes,t,t),symbol:a.base+"-"+a.quote};void 0===s&&(s=100),void 0!==i?(o.from=this.parseToInt(i/1e3),o.to=this.sum(o.from,s*this.parseTimeframe(t))):(o.to=this.seconds(),o.from=o.to-s*this.parseTimeframe(t));const n=await this.v4PublicNetGetCandles(this.extend(o,r)),d=this.convertTradingViewToOHLCV(n,"t","o","h","l","c","v");return this.parseOHLCVs(d,a,t,i,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={coin_pair:a.id},n=await this.privatePostListOrders(this.extend(o,s)),d=this.safeValue(n,"response_data",{}),h=this.safeList(d,"orders",[]);return this.parseOrders(h,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={coin_pair:a.id,status_list:"[2]"},n=await this.privatePostListOrders(this.extend(o,s)),d=this.safeValue(n,"response_data",{}),h=this.safeList(d,"orders",[]);return this.parseOrders(h,a,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={coin_pair:a.id,has_fills:!0},n=await this.privatePostListOrders(this.extend(o,s)),d=this.safeValue(n,"response_data",{}),h=this.safeValue(d,"orders",[]),c=this.parseOrders(h,a,t,i),l=this.ordersToTrades(c);return this.filterBySymbolSinceLimit(l,a.symbol,t,i)}ordersToTrades(e){const t=[];for(let i=0;i<e.length;i++){const s=this.safeValue(e[i],"trades",[]);for(let e=0;e<s.length;e++)t.push(s[e])}return t}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n=this.urls.api[t]+"/";const d=this.omit(s,this.extractParams(e));if("public"===t||"v4Public"===t||"v4PublicNet"===t)n+=this.implodeParams(e,s),Object.keys(d).length&&(n+="?"+this.urlencode(d));else{this.checkRequiredCredentials(),n+=this.version+"/";const t=this.nonce();a=this.urlencode(this.extend({tapi_method:e,tapi_nonce:t},s));const i="/tapi/"+this.version+"/?"+a;r={"Content-Type":"application/x-www-form-urlencoded","TAPI-ID":this.apiKey,"TAPI-MAC":this.hmac(this.encode(i),this.encode(this.secret),o.Zf)}}return{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(void 0!==this.safeValue(n,"error_message"))throw new r.ExchangeError(this.id+" "+this.json(n))}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"mexc",name:"MEXC Global",countries:["SC"],rateLimit:50,version:"v3",certified:!0,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!0,borrowCrossMargin:!1,borrowIsolatedMargin:!1,borrowMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:void 0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTriggerOrder:!0,deposit:void 0,editOrder:void 0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchCanceledOrders:!0,fetchClosedOrder:void 0,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:void 0,fetchDepositAddress:!0,fetchDepositAddresses:void 0,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchL2OrderBook:!0,fetchLedger:void 0,fetchLedgerEntry:void 0,fetchLeverage:!0,fetchLeverages:!1,fetchLeverageTiers:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrder:void 0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:void 0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:"emulated",fetchPositionHistory:"emulated",fetchPositionMode:!0,fetchPositions:!0,fetchPositionsHistory:!0,fetchPositionsRisk:void 0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTradingLimits:void 0,fetchTransactionFee:"emulated",fetchTransactionFees:!0,fetchTransactions:void 0,fetchTransfer:!0,fetchTransfers:!0,fetchWithdrawal:void 0,fetchWithdrawals:!0,reduceMargin:!0,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!0,setMarginMode:!0,setPositionMode:!0,signIn:void 0,transfer:void 0,withdraw:!0},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:a.kb,timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","8h":"8h","1d":"1d","1w":"1w","1M":"1M"},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},options:{adjustForTimeDifference:!1,timeDifference:0,unavailableContracts:{"BTC/USDT:USDT":!0,"LTC/USDT:USDT":!0,"ETH/USDT:USDT":!0},fetchMarkets:{types:{spot:!0,swap:{linear:!0,inverse:!1}}},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",ASTR:"ASTAR",BTM:"BTM2",CRC20:"CRONOS",ETHF:"ETF",HRC20:"HECO",OASIS:"ROSE",OKC:"OKT",RSK:"RBTC"},networksById:{"BNB Smart Chain(BEP20-RACAV1)":"BSC","BNB Smart Chain(BEP20-RACAV2)":"BSC","BNB Smart Chain(BEP20)":"BSC"},recvWindow:5e3,maxTimeTillEnd:7775999999,broker:"CCXT"},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!1,triggerDirection:!1,triggerPriceType:{last:!1,mark:!1,index:!1},stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,trailing:!1,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:{max:20},fetchMyTrades:{marginMode:!1,limit:100,daysBack:30,untilDays:void 0,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!0,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!0,limit:1e3,daysBack:7,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:7,daysBackCanceled:7,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivs:{extends:"default",createOrder:{triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,hedged:!0,leverage:!0,marketBuyByCost:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:90,untilDays:90},fetchOrder:{marginMode:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:90,untilDays:90,trigger:!0,trailing:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:90,daysBackCanceled:void 0,untilDays:90,trigger:!0,trailing:!1},fetchOHLCV:{limit:2e3}},swap:{linear:{extends:"forDerivs"},inverse:{extends:"forDerivs"}},future:{linear:void 0,inverse:void 0}},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:{"-1128":r.BadRequest,"-2011":r.BadRequest,"-1121":r.BadSymbol,10101:r.InsufficientFunds,2009:r.InvalidOrder,2011:r.BadRequest,30004:r.InsufficientFunds,33333:r.BadRequest,44444:r.BadRequest,1002:r.InvalidOrder,30019:r.BadRequest,30005:r.InvalidOrder,2003:r.InvalidOrder,2005:r.InsufficientFunds,400:r.BadRequest,600:r.BadRequest,70011:r.PermissionDenied,88004:r.InsufficientFunds,88009:r.ExchangeError,88013:r.InvalidOrder,88015:r.InsufficientFunds,700003:r.InvalidNonce,26:r.ExchangeError,602:r.AuthenticationError,10001:r.AuthenticationError,10007:r.BadSymbol,10015:r.BadRequest,10072:r.BadRequest,10073:r.BadRequest,10095:r.InvalidOrder,10096:r.InvalidOrder,10097:r.InvalidOrder,10098:r.InvalidOrder,10099:r.BadRequest,10100:r.BadRequest,10102:r.InvalidOrder,10103:r.ExchangeError,10200:r.BadRequest,10201:r.BadRequest,10202:r.BadRequest,10206:r.BadRequest,10211:r.BadRequest,10212:r.BadRequest,10216:r.ExchangeError,10219:r.ExchangeError,10222:r.BadRequest,10232:r.BadRequest,10259:r.ExchangeError,10265:r.ExchangeError,10268:r.BadRequest,20001:r.ExchangeError,20002:r.ExchangeError,22222:r.BadRequest,3e4:r.ExchangeError,30001:r.InvalidOrder,30002:r.InvalidOrder,30003:r.InvalidOrder,30010:r.InvalidOrder,30014:r.InvalidOrder,30016:r.InvalidOrder,30018:r.AccountSuspended,30020:r.AuthenticationError,30021:r.BadRequest,30025:r.InvalidOrder,30026:r.BadRequest,30027:r.InvalidOrder,30028:r.InvalidOrder,30029:r.InvalidOrder,30032:r.InvalidOrder,30041:r.InvalidOrder,60005:r.ExchangeError,700001:r.AuthenticationError,700002:r.AuthenticationError,700004:r.BadRequest,700005:r.InvalidNonce,700006:r.BadRequest,700007:r.AuthenticationError,700008:r.BadRequest,700013:r.AuthenticationError,730001:r.BadRequest,730002:r.BadRequest,73e4:r.ExchangeError,730003:r.ExchangeError,730100:r.ExchangeError,730600:r.BadRequest,730601:r.BadRequest,730602:r.BadRequest,730700:r.BadRequest,730701:r.BadRequest,730702:r.BadRequest,730703:r.BadRequest,730704:r.BadRequest,730705:r.BadRequest,730706:r.BadRequest,730707:r.BadRequest,730101:r.BadRequest,140001:r.BadRequest,140002:r.AuthenticationError},broad:{"Order quantity error, please try to modify.":r.BadRequest,"Combination of optional parameters invalid":r.BadRequest,"api market order is disabled":r.BadRequest,"Contract not allow place order!":r.InvalidOrder,Oversold:r.InsufficientFunds,"Insufficient position":r.InsufficientFunds,"Insufficient balance!":r.InsufficientFunds,"Bid price is great than max allow price":r.InvalidOrder,"Invalid symbol.":r.BadSymbol,"Param error!":r.BadRequest,maintenance:r.OnMaintenance}}})}async fetchStatus(e={}){const[t,i]=this.handleMarketTypeAndParams("fetchStatus",void 0,e);let s,r,a;if("spot"===t){s=await this.spotPublicGetPing(i);r=Object.keys(s).length?this.json(s):"ok"}else"swap"===t&&(s=await this.contractPublicGetPing(i),r=this.safeValue(s,"success")?"ok":this.json(s),a=this.safeInteger(s,"data"));return{status:r,updated:a,url:void 0,eta:void 0,info:s}}async fetchTime(e={}){const[t,i]=this.handleMarketTypeAndParams("fetchTime",void 0,e);let s;return"spot"===t?(s=await this.spotPublicGetTime(i),this.safeInteger(s,"serverTime")):"swap"===t?(s=await this.contractPublicGetPing(i),this.safeInteger(s,"data")):void 0}async fetchCurrencies(e={}){if(!this.checkRequiredCredentials(!1))return;const t=await this.spotPrivateGetCapitalConfigGetall(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"coin"),a=this.safeCurrencyCode(r),n=this.safeString(s,"name");let d,h,c,l=!1,u=!1,f=!1;const p={},m=this.safeValue(s,"networkList",[]);for(let e=0;e<m.length;e++){const t=m[e],i=this.safeString2(t,"netWork","network"),s=this.networkIdToCode(i),r=this.safeBool(t,"depositEnable",!1),a=this.safeBool(t,"withdrawEnable",!1),n=r&&a;l=n||l;const g=this.safeString(t,"withdrawMin"),v=this.safeString(t,"withdrawMax");h=void 0===h?g:h,c=void 0===c?v:c;const y=this.safeNumber(t,"withdrawFee");d=void 0===d?y:d,o.Y.stringGt(h,g)&&(h=g),o.Y.stringLt(c,v)&&(c=v),r&&(u=!0),a&&(f=!0),p[s]={info:t,id:i,network:s,active:n,deposit:r,withdraw:a,fee:y,precision:void 0,limits:{withdraw:{min:g,max:v}}}}const g=Object.keys(p).length;if(1===g||"NONE"in p){const e=this.safeValue2(p,"NONE",g-1);void 0!==e&&(d=e.fee)}i[a]={info:s,id:r,code:a,name:n,active:l,deposit:u,withdraw:f,fee:d,precision:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:h,max:c}},networks:p}}return i}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=this.fetchSpotMarkets(e),i=this.fetchSwapMarkets(e),[s,r]=await Promise.all([t,i]);return this.arrayConcat(s,r)}async fetchSpotMarkets(e={}){const t=await this.spotPublicGetExchangeInfo(e),i=this.safeValue(t,"symbols",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeString(t,"baseAsset"),o=this.safeString(t,"quoteAsset"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o),h=this.safeString(t,"status"),c=this.safeValue(t,"isSpotTradingAllowed");let l=!1;"1"===h&&c&&(l=!0);const u=this.safeValue(t,"isMarginTradingAllowed"),f=this.safeNumber(t,"makerCommission"),p=this.safeNumber(t,"takerCommission"),m=this.safeNumber(t,"maxQuoteAmount");s.push({id:r,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:u,swap:!1,future:!1,option:!1,active:l,contract:!1,linear:void 0,inverse:void 0,taker:p,maker:f,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"baseAssetPrecision"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"quoteAssetPrecision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(t,"baseSizePrecision"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(t,"quoteAmountPrecision"),max:m}},created:void 0,info:t})}return s}async fetchSwapMarkets(e={}){const t=this.rateLimit;this.setProperty(this,"rateLimit",10);const i=await this.contractPublicGetDetail(e);this.setProperty(this,"rateLimit",t);const s=this.safeValue(i,"data",[]),r=[];for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"symbol"),a=this.safeString(t,"baseCoin"),o=this.safeString(t,"quoteCoin"),n=this.safeString(t,"settleCoin"),d=this.safeCurrencyCode(a),h=this.safeCurrencyCode(o),c=this.safeCurrencyCode(n),l=this.safeString(t,"state"),u=h===c;r.push({id:i,symbol:d+"/"+h+":"+c,base:d,quote:h,settle:c,baseId:a,quoteId:o,settleId:n,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:"0"===l,contract:!0,linear:u,inverse:!u,taker:this.safeNumber(t,"takerFeeRate"),maker:this.safeNumber(t,"makerFeeRate"),contractSize:this.safeNumber(t,"contractSize"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(t,"volUnit"),price:this.safeNumber(t,"priceUnit")},limits:{leverage:{min:this.safeNumber(t,"minLeverage"),max:this.safeNumber(t,"maxLeverage")},amount:{min:this.safeNumber(t,"minVol"),max:this.safeNumber(t,"maxVol")},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t})}return r}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let a;if(void 0!==t&&(r.limit=t),s.spot){const t=await this.spotPublicGetDepth(this.extend(r,i)),s=this.safeInteger(t,"timestamp");a=this.parseOrderBook(t,e,s),a.nonce=this.safeInteger(t,"lastUpdateId")}else if(s.swap){const t=await this.contractPublicGetDepthSymbol(this.extend(r,i)),s=this.safeValue(t,"data"),o=this.safeInteger(s,"timestamp");a=this.parseOrderBook(s,e,o),a.nonce=this.safeInteger(s,"version")}return a}parseBidAsk(e,t=0,i=1,s=2){const r=this.safeNumber(e,t),a=this.safeNumber(e,i),o=this.safeNumber(e,2);return void 0!==o?[r,a,o]:[r,a]}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id};let n;if(void 0!==i&&(o.limit=i),a.spot){const e=this.safeIntegerN(s,["endTime","until"]);if(void 0!==t&&(o.startTime=t,void 0===e))throw new r.ArgumentsRequired(this.id+" fetchTrades() requires an until parameter when since is provided");if(void 0!==e){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchTrades() requires a since parameter when until is provided");o.endTime=e}let i=this.safeString(this.options,"fetchTradesMethod","spotPublicGetAggTrades");if(i=this.safeString(s,"method",i),s=this.omit(s,["method"]),"spotPublicGetAggTrades"===i)n=await this.spotPublicGetAggTrades(this.extend(o,s));else if("spotPublicGetHistoricalTrades"===i)n=await this.spotPublicGetHistoricalTrades(this.extend(o,s));else{if("spotPublicGetTrades"!==i)throw new r.NotSupported(this.id+" fetchTrades() not support this method");n=await this.spotPublicGetTrades(this.extend(o,s))}}else if(a.swap){const e=await this.contractPublicGetDealsSymbol(this.extend(o,s));n=this.safeValue(e,"data")}return this.parseTrades(n,a,t,i)}parseTrade(e,t=void 0){let i,s,r,a,o;const n=void 0;let d,h,c,l,u;if("v"in e)s=this.safeInteger(e,"t"),a=(t=this.safeMarket(void 0,t)).symbol,c=this.safeString(e,"p"),l=this.safeString(e,"v"),d=this.parseOrderSide(this.safeString(e,"T")),h="taker";else{const n=this.safeString(e,"symbol");if(a=(t=this.safeMarket(n,t)).symbol,i=this.safeString2(e,"id","a"),c=this.safeString2(e,"price","p"),r=this.safeString(e,"orderId"),"positionMode"in e)s=this.safeInteger(e,"timestamp"),l=this.safeString(e,"vol"),d=this.parseOrderSide(this.safeString(e,"side")),o={cost:this.safeString(e,"fee"),currency:this.safeCurrencyCode(this.safeString(e,"feeCurrency"))},h=this.safeValue(e,"taker")?"taker":"maker";else{s=this.safeInteger2(e,"time","T"),l=this.safeString2(e,"qty","q"),u=this.safeString(e,"quoteQty");const t=this.safeValue(e,"isBuyer"),i=this.safeValue(e,"isMaker"),r=this.safeValue2(e,"isBuyerMaker","m");void 0!==i&&(h=i?"maker":"taker"),void 0!==t&&(d=t?"buy":"sell"),void 0!==r&&(d=r?"sell":"buy",h="taker");const a=this.safeString(e,"commissionAsset");void 0!==a&&(o={cost:this.safeString(e,"commission"),currency:this.safeCurrencyCode(a)})}}return void 0===i&&(i=this.syntheticTradeId(t,s,d,l,c,n,h)),this.safeTrade({id:i,order:r,timestamp:s,datetime:this.iso8601(s),symbol:a,type:n,side:d,takerOrMaker:h,price:c,amount:l,cost:u,fee:o,info:e},t)}syntheticTradeId(e=void 0,t=void 0,i=void 0,s=void 0,r=void 0,a=void 0,o=void 0){let n="";return void 0!==t&&(n=this.numberToString(t)+"-"+this.safeString(e,"id","_"),void 0!==i&&(n+="-"+i),void 0!==s&&(n+="-"+this.numberToString(s)),void 0!==r&&(n+="-"+this.numberToString(r)),void 0!==o&&(n+="-"+o),void 0!==a&&(n+="-"+a)),n}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=o.spot?1e3:2e3;let d=!1;if([d,a]=this.handleOptionAndParams(a,"fetchOHLCV","paginate",!1),d)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,a,n);const h=this.safeValue(this.options,"timeframes",{}),c=this.safeValue(h,o.type,{}),l=this.safeString(c,t),u=1e3*this.parseTimeframe(t),f={symbol:o.id,interval:l};let p;if(o.spot){const e=this.safeIntegerN(a,["until","endTime"]);if(void 0!==i&&(f.startTime=i,void 0===e)){const e=this.sum(i,n*u),t=this.milliseconds();f.endTime=Math.min(e,t)}void 0!==s&&(f.limit=s),void 0!==e&&(a=this.omit(a,["until"]),f.endTime=e);p=await this.spotPublicGetKlines(this.extend(f,a))}else if(o.swap){const e=this.safeIntegerProductN(a,["until","endTime"],.001);void 0!==i&&(f.start=this.parseToInt(i/1e3)),void 0!==e&&(a=this.omit(a,["until"]),f.end=e);const t=this.safeString(a,"price","default");let s;if(a=this.omit(a,"price"),"default"===t)s=await this.contractPublicGetKlineSymbol(this.extend(f,a));else if("index"===t)s=await this.contractPublicGetKlineIndexPriceSymbol(this.extend(f,a));else{if("mark"!==t)throw new r.NotSupported(this.id+" fetchOHLCV() not support this price type, [default, index, mark]");s=await this.contractPublicGetKlineFairPriceSymbol(this.extend(f,a))}const o=this.safeValue(s,"data");p=this.convertTradingViewToOHLCV(o,"time","open","high","low","close","vol")}return this.parseOHLCVs(p,o,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};let s,r=!1;if(void 0!==e){r=1===e.length;const t=this.safeString(e,0);s=this.market(t)}const[a,o]=this.handleMarketTypeAndParams("fetchTickers",s,t);let n;if(r&&(i.symbol=s.id),"spot"===a)n=await this.spotPublicGetTicker24hr(this.extend(i,o));else if("swap"===a){const e=await this.contractPublicGetTicker(this.extend(i,o));n=this.safeValue(e,"data",[])}return r&&(n=[n]),this.parseTickers(n,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),[s,r]=this.handleMarketTypeAndParams("fetchTicker",i,t);let a;const o={symbol:i.id};if("spot"===s)a=await this.spotPublicGetTicker24hr(this.extend(o,r));else if("swap"===s){const e=await this.contractPublicGetTicker(this.extend(o,r));a=this.safeValue(e,"data",{})}return this.parseTicker(a,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol");let s,r,a,n,d,h,c,l,u,f,p,m,g;t=this.safeMarket(i,t);return this.safeValue(t,"swap")||"timestamp"in e?(s=this.safeInteger(e,"timestamp"),r=this.safeString(e,"bid1"),a=this.safeString(e,"ask1"),h=this.safeString(e,"volume24"),c=this.safeString(e,"amount24"),u=this.safeString(e,"high24Price"),f=this.safeString(e,"lower24Price"),m=this.safeString(e,"riseFallValue"),p=this.safeString(e,"riseFallRate"),p=o.Y.stringMul(p,"100")):(s=this.safeInteger(e,"closeTime"),r=this.safeString(e,"bidPrice"),a=this.safeString(e,"askPrice"),n=this.safeString(e,"bidQty"),d=this.safeString(e,"askQty"),o.Y.stringEq(n,"0")&&(n=void 0),o.Y.stringEq(d,"0")&&(d=void 0),h=this.safeString(e,"volume"),c=this.safeString(e,"quoteVolume"),l=this.safeString(e,"openPrice"),u=this.safeString(e,"highPrice"),f=this.safeString(e,"lowPrice"),g=this.safeString(e,"prevClosePrice"),m=this.safeString(e,"priceChange"),p=this.safeString(e,"priceChangePercent"),p=o.Y.stringMul(p,"100")),this.safeTicker({symbol:t.symbol,timestamp:s,datetime:this.iso8601(s),open:l,high:u,low:f,close:this.safeString(e,"lastPrice"),bid:r,bidVolume:n,ask:a,askVolume:d,vwap:void 0,previousClose:g,change:m,percentage:p,average:void 0,baseVolume:h,quoteVolume:c,info:e},t)}async fetchBidsAsks(e=void 0,t={}){let i;await this.loadMarkets();let s=!1;if(void 0!==e){s=1===e.length,i=this.market(e[0])}const[a,o]=this.handleMarketTypeAndParams("fetchBidsAsks",i,t);let n;if("spot"===a)n=await this.spotPublicGetTickerBookTicker(o);else if("swap"===a)throw new r.NotSupported(this.id+" fetchBidsAsks() is not available for "+a+" markets");return s&&(n=[n]),this.parseTickers(n,e)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.cost=t,await this.createOrder(e,"market","buy",0,void 0,i)}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.cost=t,await this.createOrder(e,"market","sell",0,void 0,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),[n,d]=this.handleMarginModeAndParams("createOrder",a);return o.spot?await this.createSpotOrder(o,t,i,s,r,n,d):await this.createSwapOrder(o,t,i,s,r,n,d)}createSpotOrderRequest(e,t,i,s,a=void 0,n=void 0,d={}){const h=e.symbol,c=i.toUpperCase(),l={symbol:e.id,side:c,type:t.toUpperCase()};if("market"===t){const e=this.safeNumber2(d,"cost","quoteOrderQty");if(d=this.omit(d,"cost"),void 0!==e)s=e,l.quoteOrderQty=this.costToPrecision(h,s);else if(void 0===a)l.quantity=this.amountToPrecision(h,s);else{const e=this.numberToString(s),t=this.numberToString(a);s=o.Y.stringMul(e,t),l.quoteOrderQty=this.costToPrecision(h,s)}}else l.quantity=this.amountToPrecision(h,s);void 0!==a&&(l.price=this.priceToPrecision(h,a));const u=this.safeString(d,"clientOrderId");if(void 0!==u&&(l.newClientOrderId=u,d=this.omit(d,["type","clientOrderId"])),void 0!==n&&"isolated"!==n)throw new r.BadRequest(this.id+" createOrder() does not support marginMode "+n+" for spot-margin trading");let f;[f,d]=this.handlePostOnly("market"===t,"LIMIT_MAKER"===t,d),f&&(l.type="LIMIT_MAKER");const p=this.safeString(d,"timeInForce");return void 0!==p&&(d=this.omit(d,"timeInForce"),"IOC"===p?l.type="IMMEDIATE_OR_CANCEL":"FOK"===p&&(l.type="FILL_OR_KILL")),this.extend(l,d)}async createSpotOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.safeBool(o,"test",!1);o=this.omit(o,"test");const d=this.createSpotOrderRequest(e,t,i,s,r,a,o);let h;h=n?await this.spotPrivatePostOrderTest(d):await this.spotPrivatePostOrder(d);const c=this.parseOrder(h,e);return c.side=i,c.type=t,void 0===this.safeString(c,"price")&&(c.price=r),void 0===this.safeString(c,"amount")&&(c.amount=s),c}async createSwapOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=e.symbol,h=this.safeValue(this.options,"unavailableContracts",{});if(this.safeBool(h,d,!1))throw new r.NotSupported(this.id+" createSwapOrder() does not support yet this symbol:"+d);let c,l;if(void 0!==o)if("cross"===o)c=2;else{if("isolated"!==o)throw new r.ArgumentsRequired(this.id+' createSwapOrder() marginMode parameter should be either "cross" or "isolated"');c=1}else c=this.safeInteger(n,"openType",2);if("limit"!==t&&"market"!==t&&1!==t&&2!==t&&3!==t&&4!==t&&5!==t&&6!==t)throw new r.InvalidOrder(this.id+" createSwapOrder() order type must either limit, market, or 1 for limit orders, 2 for post-only orders, 3 for IOC orders, 4 for FOK orders, 5 for market orders or 6 to convert market price to current price");[l,n]=this.handlePostOnly("market"===t,2===t,n),l?t=2:"limit"===t?t=1:"market"===t&&(t=6);const u={symbol:e.id,vol:parseFloat(this.amountToPrecision(d,s)),type:t,openType:c};if(5!==t&&6!==t&&"market"!==t&&(u.price=parseFloat(this.priceToPrecision(d,a))),1===c){if(void 0===this.safeInteger(n,"leverage"))throw new r.ArgumentsRequired(this.id+" createSwapOrder() requires a leverage parameter for isolated margin orders")}const f=this.safeBool(n,"reduceOnly",!1);let p;this.safeBool(n,"hedged",!1)?(f&&(n=this.omit(n,"reduceOnly"),i="buy"===i?"sell":"buy"),p="buy"===i?1:3,u.positionMode=1):p=f?"buy"===i?2:4:"buy"===i?1:3,u.side=p;const m=this.safeString2(n,"clientOrderId","externalOid");void 0!==m&&(u.externalOid=m);const g=this.safeNumber2(n,"triggerPrice","stopPrice");let v;n=this.omit(n,["clientOrderId","externalOid","postOnly","stopPrice","triggerPrice","hedged"]),g?(u.triggerPrice=this.priceToPrecision(d,g),u.triggerType=this.safeInteger(n,"triggerType",1),u.executeCycle=this.safeInteger(n,"executeCycle",1),u.trend=this.safeInteger(n,"trend",1),u.orderType=this.safeInteger(n,"orderType",1),v=await this.contractPrivatePostPlanorderPlace(this.extend(u,n))):v=await this.contractPrivatePostOrderSubmit(this.extend(u,n));const y=this.safeString(v,"data");return this.safeOrder({id:y},e)}async createOrders(e,t={}){await this.loadMarkets();const i=[];let s;for(let a=0;a<e.length;a++){const o=e[a],n=this.safeString(o,"symbol"),d=this.market(n);if(!d.spot)throw new r.NotSupported(this.id+" createOrders() is only supported for spot markets");if(void 0===s)s=n;else if(s!==n)throw new r.BadRequest(this.id+" createOrders() requires all orders to have the same symbol");const h=this.safeString(o,"type"),c=this.safeString(o,"side"),l=this.safeValue(o,"amount"),u=this.safeValue(o,"price"),f=this.safeValue(o,"params",{});let p;[p,t]=this.handleMarginModeAndParams("createOrder",t);const m=this.createSpotOrderRequest(d,h,c,l,u,p,f);i.push(m)}const a={batchOrders:this.json(i)},o=await this.spotPrivatePostBatchOrders(a);return this.parseOrders(o)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id};let o;if(s.spot){const t=this.safeString(i,"clientOrderId");void 0!==t?(i=this.omit(i,"clientOrderId"),a.origClientOrderId=t):a.orderId=e;const[s,n]=this.handleMarginModeAndParams("fetchOrder",i);if(void 0!==s){if("isolated"!==s)throw new r.BadRequest(this.id+" fetchOrder() does not support marginMode "+s+" for spot-margin trading");o=await this.spotPrivateGetMarginOrder(this.extend(a,n))}else o=await this.spotPrivateGetOrder(this.extend(a,n))}else if(s.swap){a.order_id=e;const t=await this.contractPrivateGetOrderGetOrderId(this.extend(a,i));o=this.safeValue(t,"data")}return this.parseOrder(o,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;void 0!==e&&(o=this.market(e),a.symbol=o.id);const n=this.safeInteger(s,"until");s=this.omit(s,"until");const[d,h]=this.handleMarketTypeAndParams("fetchOrders",o,s);if("spot"===d){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument for spot market");const[d,h]=this.handleMarginModeAndParams("fetchOrders",s);let c;if(void 0!==t&&(a.startTime=t),void 0!==n&&(a.endTime=n),void 0!==i&&(a.limit=i),void 0!==d){if("isolated"!==d)throw new r.BadRequest(this.id+" fetchOrders() does not support marginMode "+d+" for spot-margin trading");c=await this.spotPrivateGetMarginAllOrders(this.extend(a,h))}else c=await this.spotPrivateGetAllOrders(this.extend(a,h));return this.parseOrders(c,o,t,i)}{if(void 0!==t){a.start_time=t;const e=this.safeInteger(s,"end_time",n);if(void 0===e)a.end_time=this.sum(t,this.options.maxTimeTillEnd);else{if(e-t>this.options.maxTimeTillEnd)throw new r.BadRequest(this.id+" end is invalid, i.e. exceeds allowed 90 days.");a.end_time=n}}else void 0!==n&&(a.start_time=this.sum(n,-1*this.options.maxTimeTillEnd),a.end_time=n);void 0!==i&&(a.page_size=i);let e=this.safeString(this.options,"fetchOrders","contractPrivateGetOrderListHistoryOrders");e=this.safeString(h,"method",e);let d=[],c=[];if("contractPrivateGetOrderListHistoryOrders"===e){const e=await this.contractPrivateGetOrderListHistoryOrders(this.extend(a,h));d=this.safeValue(e,"data")}else{const e=await this.contractPrivateGetPlanorderListOrders(this.extend(a,h));c=this.safeValue(e,"data")}const l=this.arrayConcat(c,d);return this.parseOrders(l,o,t,i,s)}}async fetchOrdersByIds(e,t=void 0,i={}){await this.loadMarkets();const s={};let a;void 0!==t&&(a=this.market(t),s.symbol=a.id);const[o,n]=this.handleMarketTypeAndParams("fetchOrdersByIds",a,i);if("spot"===o)throw new r.BadRequest(this.id+" fetchOrdersByIds() is not supported for "+o);{s.order_ids=e.join(",");const t=await this.contractPrivateGetOrderBatchQuery(this.extend(s,n)),i=this.safeList(t,"data");return this.parseOrders(i,a)}}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o,n;if(void 0!==e&&(o=this.market(e)),[n,s]=this.handleMarketTypeAndParams("fetchOpenOrders",o,s),"spot"===n){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument for spot market");a.symbol=o.id;const[n,d]=this.handleMarginModeAndParams("fetchOpenOrders",s);let h;if(void 0!==n){if("isolated"!==n)throw new r.BadRequest(this.id+" fetchOpenOrders() does not support marginMode "+n+" for spot-margin trading");h=await this.spotPrivateGetMarginOpenOrders(this.extend(a,d))}else h=await this.spotPrivateGetOpenOrders(this.extend(a,d));return this.parseOrders(h,o,t,i)}return await this.fetchOrdersByState(2,e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState(3,e,t,i,s)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByState(4,e,t,i,s)}async fetchOrdersByState(e,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();const o={};let n;void 0!==t&&(n=this.market(t));const[d]=this.handleMarketTypeAndParams("fetchOrdersByState",n,a);if("spot"===d)throw new r.NotSupported(this.id+" fetchOrdersByState() is not supported for "+d);return o.states=e,await this.fetchOrders(t,i,s,this.extend(o,a))}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={};let a,o;void 0!==t&&(a=this.market(t),s.symbol=a.id),[o,i]=this.handleMarketTypeAndParams("cancelOrder",a,i);const[n,d]=this.handleMarginModeAndParams("cancelOrder",i);let h;if("spot"===o){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const s={symbol:a.id},o=this.safeString(i,"clientOrderId");if(void 0!==o?(i=this.omit(d,"clientOrderId"),s.origClientOrderId=o):s.orderId=e,void 0!==n){if("isolated"!==n)throw new r.BadRequest(this.id+" cancelOrder() does not support marginMode "+n+" for spot-margin trading");h=await this.spotPrivateDeleteMarginOrder(this.extend(s,d))}else h=await this.spotPrivateDeleteOrder(this.extend(s,d))}else{let t,i=this.safeString(this.options,"cancelOrder","contractPrivatePostOrderCancel");if(i=this.safeString(d,"method",i),"contractPrivatePostOrderCancel"===i)t=await this.contractPrivatePostOrderCancel([e]);else{if("contractPrivatePostPlanorderCancel"!==i)throw new r.NotSupported(this.id+" cancelOrder() not support this method");t=await this.contractPrivatePostPlanorderCancel([e])}h=this.safeValue(t,"data");const s=this.safeValue(h,0),a=this.safeValue(s,"errorMsg","");if("success"!==a)throw new r.InvalidOrder(this.id+" cancelOrder() the order with id "+e+" cannot be cancelled: "+a)}return this.parseOrder(h,a)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=void 0!==t?this.market(t):void 0,[a]=this.handleMarketTypeAndParams("cancelOrders",s,i);if("spot"===a)throw new r.BadRequest(this.id+" cancelOrders() is not supported for "+a);{const t=await this.contractPrivatePostOrderCancel(e),i=this.safeList(t,"data");return this.parseOrders(i,s)}}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=void 0!==e?this.market(e):void 0,s={};let a;[a,t]=this.handleMarketTypeAndParams("cancelAllOrders",i,t);const[o,n]=this.handleMarginModeAndParams("cancelAllOrders",t);if("spot"===a){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument on spot");let t;if(s.symbol=i.id,void 0!==o){if("isolated"!==o)throw new r.BadRequest(this.id+" cancelAllOrders() does not support marginMode "+o+" for spot-margin trading");t=await this.spotPrivateDeleteMarginOpenOrders(this.extend(s,n))}else t=await this.spotPrivateDeleteOpenOrders(this.extend(s,n));return this.parseOrders(t,i)}{void 0!==e&&(s.symbol=i.id);let t,r=this.safeString(this.options,"cancelAllOrders","contractPrivatePostOrderCancelAll");r=this.safeString(n,"method",r),"contractPrivatePostOrderCancelAll"===r?t=await this.contractPrivatePostOrderCancelAll(this.extend(s,n)):"contractPrivatePostPlanorderCancelAll"===r&&(t=await this.contractPrivatePostPlanorderCancelAll(this.extend(s,n)));const a=this.safeList(t,"data",[]);return this.parseOrders(a,i)}}parseOrder(e,t=void 0){if(void 0!==this.safeInteger(e,"code"))return this.safeOrder({info:e,status:"rejected",clientOrderId:this.safeString(e,"newClientOrderId")});let i;i="string"==typeof e?e:this.safeString2(e,"orderId","id");const s=this.safeString(e,"symbol");t=this.safeMarket(s,t);const r=this.safeIntegerN(e,["time","createTime","transactTime"]);let a;const n=this.safeString(e,"feeCurrency");if(void 0!==n){const t=this.safeString(e,"takerFee"),i=this.safeString(e,"makerFee"),s=o.Y.stringAdd(t,i);a={currency:n,cost:this.parseNumber(s)}}return this.safeOrder({id:i,clientOrderId:this.safeString(e,"clientOrderId"),timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,status:this.parseOrderStatus(this.safeString2(e,"status","state")),symbol:t.symbol,type:this.parseOrderType(this.safeString(e,"type")),timeInForce:this.parseOrderTimeInForce(this.safeString(e,"timeInForce")),side:this.parseOrderSide(this.safeString(e,"side")),price:this.safeNumber(e,"price"),triggerPrice:this.safeNumber2(e,"stopPrice","triggerPrice"),average:this.safeNumber(e,"dealAvgPrice"),amount:this.safeNumber2(e,"origQty","vol"),cost:this.safeNumber(e,"cummulativeQuoteQty"),filled:this.safeNumber2(e,"executedQty","dealVol"),remaining:void 0,fee:a,trades:void 0,info:e},t)}parseOrderSide(e){return this.safeString({BUY:"buy",SELL:"sell",1:"buy",2:"sell"},e,e)}parseOrderType(e){return this.safeString({MARKET:"market",LIMIT:"limit",LIMIT_MAKER:"limit"},e,e)}parseOrderStatus(e){return this.safeString({NEW:"open",FILLED:"closed",CANCELED:"canceled",PARTIALLY_FILLED:"open",PARTIALLY_CANCELED:"canceled",2:"open",3:"closed",4:"canceled"},e,e)}parseOrderTimeInForce(e){return this.safeString({GTC:"GTC",FOK:"FOK",IOC:"IOC"},e,e)}async fetchAccountHelper(e,t){if("spot"===e)return await this.spotPrivateGetAccount(t);if("swap"===e){const e=await this.contractPrivateGetAccountAssets(t);return this.safeValue(e,"data")}}async fetchAccounts(e={}){const[t,i]=this.handleMarketTypeAndParams("fetchAccounts",void 0,e);await this.loadMarkets();const s=await this.fetchAccountHelper(t,i),r=this.safeValue(s,"balances",[]),a=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString2(t,"asset","currency"),s=this.safeCurrencyCode(i);a.push({id:this.safeString(t,"id"),type:this.safeString(t,"type"),code:s,info:t})}return a}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.spot)throw new r.BadRequest(this.id+" fetchTradingFee() supports spot markets only");const s={symbol:i.id},a=await this.spotPrivateGetTradeFee(this.extend(s,t)),o=this.safeDict(a,"data",{});return{info:o,symbol:e,maker:this.safeNumber(o,"makerCommission"),taker:this.safeNumber(o,"takerCommission"),percentage:void 0,tierBased:void 0}}customParseBalance(e,t){let i;i="margin"===t?this.safeValue(e,"assets",[]):"swap"===t?this.safeValue(e,"data",[]):this.safeValue(e,"balances",[]);const s={info:e};if("margin"===t){for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"symbol"),a=this.safeSymbol(r,void 0),o=this.safeValue(t,"baseAsset",{}),n=this.safeValue(t,"quoteAsset",{}),d=this.safeCurrencyCode(this.safeString(o,"asset")),h=this.safeCurrencyCode(this.safeString(n,"asset")),c={};c[d]=this.parseBalanceHelper(o),c[h]=this.parseBalanceHelper(n),s[a]=this.safeBalance(c)}return s}if("swap"===t){for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"availableBalance"),o.used=this.safeString(t,"frozenBalance"),s[a]=o}return this.safeBalance(s)}for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"free"),o.used=this.safeString(t,"locked"),s[a]=o}return this.safeBalance(s)}parseBalanceHelper(e){const t=this.account();t.used=this.safeString(e,"locked"),t.free=this.safeString(e,"free"),t.total=this.safeString(e,"totalAsset");const i=this.safeString(e,"borrowed"),s=this.safeString(e,"interest");return t.debt=o.Y.stringAdd(i,s),t}async fetchBalance(e={}){let t;await this.loadMarkets();const i={};[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const s=this.safeString(e,"marginMode"),a=this.safeBool(e,"margin",!1);let o;if(e=this.omit(e,["margin","marginMode"]),void 0!==s||a||"margin"===t){let s;const r=this.safeString(e,"symbol");if(void 0===r){const t=this.safeValue(e,"symbols");void 0!==t&&(s=this.marketIds(t).join(","))}else{s=this.market(r).id}this.checkRequiredArgument("fetchBalance",s,"symbol or symbols"),t="margin",i.symbols=s,e=this.omit(e,["symbol","symbols"]),o=await this.spotPrivateGetMarginIsolatedAccount(this.extend(i,e))}else if("spot"===t)o=await this.spotPrivateGetAccount(this.extend(i,e));else{if("swap"!==t)throw new r.NotSupported(this.id+" fetchBalance() not support this method");o=await this.contractPrivateGetAccountAssets(this.extend(i,e))}return this.customParseBalance(o,t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e);let o;[o,s]=this.handleMarketTypeAndParams("fetchMyTrades",a,s);const n={symbol:a.id};let d;if("spot"===o){void 0!==t&&(n.startTime=t),void 0!==i&&(n.limit=i);const e=this.safeInteger(s,"until");void 0!==e&&(s=this.omit(s,"until"),n.endTime=e),d=await this.spotPrivateGetMyTrades(this.extend(n,s))}else{if(void 0!==t){n.start_time=t;void 0===this.safeInteger(s,"end_time")&&(n.end_time=this.sum(t,this.options.maxTimeTillEnd))}void 0!==i&&(n.page_size=i);const e=await this.contractPrivateGetOrderListOrderDeals(this.extend(n,s));d=this.safeValue(e,"data")}return this.parseTrades(d,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();const o={};let n;void 0!==t&&(n=this.market(t));const[d,h]=this.handleMarketTypeAndParams("fetchOrderTrades",n,a);let c;if("spot"===d){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrderTrades() requires a symbol argument");o.symbol=n.id,o.orderId=e,c=await this.spotPrivateGetMyTrades(this.extend(o,h))}else{o.order_id=e;const t=await this.contractPrivateGetOrderDealDetailsOrderId(this.extend(o,h));c=this.safeValue(t,"data")}return this.parseTrades(c,n,i,s,h)}async modifyMarginHelper(e,t,i,s={}){const a=this.safeInteger(s,"positionId");if(void 0===a)throw new r.ArgumentsRequired(this.id+" modifyMarginHelper() requires a positionId parameter");await this.loadMarkets();const o={positionId:a,amount:t,type:i};return await this.contractPrivatePostPositionChangeMargin(this.extend(o,s))}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"SUB",i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"ADD",i)}async setLeverage(e,t=void 0,i={}){await this.loadMarkets();const s={leverage:e},a=this.safeInteger(i,"positionId");if(void 0===a){const e=this.safeNumber(i,"openType"),a=this.safeNumber(i,"positionType"),o=void 0!==t?this.market(t):void 0;if(void 0===e||void 0===a||void 0===o)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a positionId parameter or a symbol argument with openType and positionType parameters, use openType 1 or 2 for isolated or cross margin respectively, use positionType 1 or 2 for long or short positions");s.openType=e,s.symbol=o.id,s.positionType=a}else s.positionId=a;return await this.contractPrivatePostPositionChangeLeverage(this.extend(s,i))}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==i&&(a.page_size=i);const o=await this.contractPrivateGetPositionFundingRecords(this.extend(a,s)),n=this.safeValue(o,"data",{}),d=this.safeValue(n,"resultList",[]),h=[];for(let t=0;t<d.length;t++){const i=d[t],s=this.safeInteger(i,"settleTime");h.push({info:i,symbol:e,code:void 0,timestamp:s,datetime:this.iso8601(s),id:this.safeNumber(i,"id"),amount:this.safeNumber(i,"funding")})}return h}parseFundingRate(e,t=void 0){const i=this.safeNumber(e,"fundingRate"),s=this.safeInteger(e,"nextSettleTime"),r=this.safeString(e,"symbol"),a=this.safeSymbol(r,t,void 0,"contract"),o=this.safeInteger(e,"timestamp"),n=this.safeString(e,"collectCycle");let d;return void 0!==n&&(d=n+"h"),{info:e,symbol:a,markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:o,datetime:this.iso8601(o),fundingRate:i,fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:d}}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.contractPublicGetFundingRateSymbol(this.extend(s,t)),a=this.safeValue(r,"data",{});return this.parseFundingRate(a,i)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};void 0!==i&&(o.page_size=i);const n=await this.contractPublicGetFundingRateHistory(this.extend(o,s)),d=this.safeValue(n,"data"),h=this.safeValue(d,"resultList",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i),r=this.safeInteger(t,"settleTime");c.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"fundingRate"),timestamp:r,datetime:this.iso8601(r)})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,a.symbol,t,i)}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,"swap",!0,!0);const i=await this.contractPublicGetDetail(t),s=this.safeList(i,"data");return this.parseLeverageTiers(s,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeString(e,"symbol");let s=this.safeString(e,"maintenanceMarginRate"),r=this.safeString(e,"initialMarginRate");const a=this.safeString(e,"maxVol"),n=this.safeString(e,"riskIncrVol"),d=this.safeString(e,"riskIncrMmr"),h=this.safeString(e,"riskIncrImr");let c="0";const l=[],u=this.safeString(e,"quoteCoin");if("0"===n)return[{tier:0,symbol:this.safeSymbol(i,t,void 0,"contract"),currency:this.safeCurrencyCode(u),minNotional:void 0,maxNotional:void 0,maintenanceMarginRate:void 0,maxLeverage:this.safeNumber(e,"maxLeverage"),info:e}];for(;o.Y.stringLt(c,a);){const a=o.Y.stringAdd(c,n);l.push({tier:this.parseNumber(o.Y.stringDiv(a,n)),symbol:this.safeSymbol(i,t,void 0,"contract"),currency:this.safeCurrencyCode(u),minNotional:this.parseNumber(c),maxNotional:this.parseNumber(a),maintenanceMarginRate:this.parseNumber(s),maxLeverage:this.parseNumber(o.Y.stringDiv("1",r)),info:e}),r=o.Y.stringAdd(r,h),s=o.Y.stringAdd(s,d),c=a}return l}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"coin"),r=this.safeString(e,"netWork");return this.checkAddress(i),{info:e,currency:this.safeCurrencyCode(s,t),network:this.networkIdToCode(r,s),address:i,tag:this.safeString(e,"memo")}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id},r=this.safeString(t,"network");let a;if(void 0!==r){const t=this.networkIdToCode(r,e),s=this.safeDict(i,"networks",{});if(t in s){const e=this.safeDict(s,t,{}),i=this.safeValue(e,"info",{});a=this.safeString(i,"network")}else a=this.networkCodeToId(r,e)}void 0!==a&&(s.network=a),t=this.omit(t,"network");const o=await this.spotPrivateGetCapitalDepositAddress(this.extend(s,t)),n=this.parseDepositAddresses(o,void 0,!1);return this.indexBy(n,"network")}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={coin:i.id},a=this.safeString(t,"network");if(void 0===a)throw new r.ArgumentsRequired(this.id+" createDepositAddress requires a `network` parameter");let o;const n=this.networkIdToCode(a,e),d=this.safeDict(i,"networks",{});if(n in d){const e=this.safeDict(d,n,{}),t=this.safeValue(e,"info",{});o=this.safeString(t,"network")}else o=this.networkCodeToId(a,e);void 0!==o&&(s.network=o),t=this.omit(t,"network");const h=await this.spotPrivatePostCapitalDepositAddress(this.extend(s,t));return this.parseDepositAddress(h,i)}async fetchDepositAddress(e,t={}){const i=this.safeString(t,"network"),s=await this.fetchDepositAddressesByNetwork(e,t);let a;if(void 0!==i)a=this.safeDict(s,this.networkIdToCode(i,e));else{const t=this.safeDict(this.options,"defaultNetworks"),i=this.safeString(t,e);if(void 0!==i)a=this.safeDict(s,i);else{const e=Object.keys(s),t=this.safeString(e,0);a=this.safeDict(s,t)}}if(void 0===a)throw new r.InvalidAddress(this.id+" fetchDepositAddress() cannot find a deposit address for "+e+", and network"+i+"consider creating one using .createDepositAddress() method or in MEXC website");return a}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;if(void 0!==e){o=this.currency(e),a.coin=o.id;const t=this.safeString(s,"network");void 0!==t&&(s=this.omit(s,"network"),a.coin=a.coin+"-"+t)}if(void 0!==t&&(a.startTime=t),void 0!==i){if(i>1e3)throw new r.ExchangeError("This exchange supports a maximum limit of 1000");a.limit=i}const n=await this.spotPrivateGetCapitalDepositHisrec(this.extend(a,s));return this.parseTransactions(n,o,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;if(void 0!==e&&(o=this.currency(e),a.coin=o.id),void 0!==t&&(a.startTime=t),void 0!==i){if(i>1e3)throw new r.ExchangeError("This exchange supports a maximum limit of 1000");a.limit=i}const n=await this.spotPrivateGetCapitalWithdrawHistory(this.extend(a,s));return this.parseTransactions(n,o,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=void 0===i?"deposit":"withdrawal",r=this.safeInteger2(e,"insertTime","applyTime");let a;const n=this.safeString(e,"coin");let d;void 0!==n&&(a=n.split("-")[0]);const h=this.safeString(e,"network");void 0!==h&&(d=this.networkIdToCode(h));const c=this.safeCurrencyCode(a,t),l=this.parseTransactionStatusByType(this.safeString(e,"status"),s);let u=this.safeString(e,"amount");const f=this.safeString(e,"address"),p=this.safeString(e,"txId");let m;const g=this.safeString(e,"transactionFee");return void 0!==g&&(m={cost:this.parseNumber(g),currency:c}),"withdrawal"===s&&(u=o.Y.stringSub(u,g)),{info:e,id:i,txid:p,timestamp:r,datetime:this.iso8601(r),network:d,address:f,addressTo:f,addressFrom:void 0,tag:this.safeString(e,"memo"),tagTo:void 0,tagFrom:void 0,type:s,amount:this.parseNumber(u),currency:c,status:l,updated:void 0,comment:void 0,internal:void 0,fee:m}}parseTransactionStatusByType(e,t=void 0){const i=this.safeValue({deposit:{1:"failed",2:"pending",3:"pending",4:"pending",5:"ok",6:"pending",7:"failed"},withdrawal:{1:"pending",2:"pending",3:"pending",4:"pending",5:"pending",6:"pending",7:"ok",8:"failed",9:"canceled",10:"pending"}},t,{});return this.safeString(i,e,e)}async fetchPosition(e,t={}){await this.loadMarkets();const i={symbol:this.market(e).id},s=await this.fetchPositions(void 0,this.extend(i,t));return this.safeValue(s,0)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.contractPrivateGetPositionOpenPositions(t),s=this.safeList(i,"data",[]);return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=(t=this.safeMarket(this.safeString(e,"symbol"),t)).symbol,s=this.safeString(e,"holdVol"),r=this.safeNumber(e,"openAvgPrice"),a=this.safeString(e,"im"),o="1"===this.safeString(e,"positionType")?"long":"short",n="1"===this.safeString(e,"margin_mode")?"isolated":"cross",d=this.safeNumber(e,"leverage"),h=this.safeNumber(e,"liquidatePrice"),c=this.safeInteger(e,"updateTime");return this.safePosition({info:e,id:void 0,symbol:i,contracts:this.parseNumber(s),contractSize:void 0,entryPrice:r,collateral:void 0,side:o,unrealizedPnl:void 0,leverage:this.parseNumber(d),percentage:void 0,marginMode:n,notional:void 0,markPrice:void 0,lastPrice:void 0,liquidationPrice:h,initialMargin:this.parseNumber(a),initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,marginRatio:void 0,timestamp:c,datetime:this.iso8601(c),hedged:void 0,stopLossPrice:void 0,takeProfitPrice:void 0,lastUpdateTimestamp:void 0})}async fetchTransfer(e,t=void 0,i={}){const[s,a]=this.handleMarketTypeAndParams("fetchTransfer",void 0,i);if(await this.loadMarkets(),"spot"===s){const t={transact_id:e},i=await this.spot2PrivateGetAssetInternalTransferInfo(this.extend(t,a)),s=this.safeDict(i,"data",{});return this.parseTransfer(s)}if("swap"===s)throw new r.BadRequest(this.id+" fetchTransfer() is not supported for "+s)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){const[a,o]=this.handleMarketTypeAndParams("fetchTransfers",void 0,s);await this.loadMarkets();const n={};let d,h;if(void 0!==e&&(d=this.currency(e),n.currency=d.id),"spot"===a){if(void 0!==t&&(n.start_time=t),void 0!==i){if(i>50)throw new r.ExchangeError("This exchange supports a maximum limit of 50");n["page-size"]=i}const e=await this.spot2PrivateGetAssetInternalTransferRecord(this.extend(n,o)),s=this.safeValue(e,"data",{});h=this.safeValue(s,"result_list",[])}else if("swap"===a){void 0!==i&&(n.page_size=i);const e=await this.contractPrivateGetAccountTransferRecord(this.extend(n,o)),t=this.safeValue(e,"data");h=this.safeValue(t,"resultList")}return this.parseTransfers(h,d,t,i)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e),n={spot:"SPOT",swap:"FUTURES",margin:"ISOLATED_MARGIN"},d=this.safeString(n,i),h=this.safeString(n,s);if(void 0===d){const e=Object.keys(n);throw new r.ExchangeError(this.id+" fromAccount must be one of "+e.join(", "))}if(void 0===h){const e=Object.keys(n);throw new r.ExchangeError(this.id+" toAccount must be one of "+e.join(", "))}const c={asset:o.id,amount:t,fromAccountType:d,toAccountType:h};if("ISOLATED_MARGIN"===d||"ISOLATED_MARGIN"===h){const e=this.safeString(a,"symbol");if(a=this.omit(a,"symbol"),void 0===e)throw new r.ArgumentsRequired(this.id+" transfer() requires a symbol argument for isolated margin");const t=this.market(e);c.symbol=t.id}const l=await this.spotPrivatePostCapitalTransfer(this.extend(c,a)),u=this.parseTransfer(l,o);return this.extend(u,{amount:t,fromAccount:i,toAccount:s})}parseTransfer(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeStringN(e,["transact_id","txid","tranId"]),r=this.safeInteger(e,"createTime"),a=void 0!==r?this.iso8601(r):void 0,o=this.safeString(e,"type");let n,d;return void 0!==o?(n="IN"===o?"MAIN":"CONTRACT",d="IN"===o?"CONTRACT":"MAIN"):(n=this.safeString(e,"from"),d=this.safeString(e,"to")),{info:e,id:s,timestamp:r,datetime:a,currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amount"),fromAccount:this.parseAccountId(n),toAccount:this.parseAccountId(d),status:this.parseTransferStatus(this.safeString2(e,"transact_state","state"))}}parseAccountId(e){return this.safeString({MAIN:"spot",CONTRACT:"swap"},e,e)}parseTransferStatus(e){return this.safeString({SUCCESS:"ok",FAILED:"failed",WAIT:"pending"},e,e)}async withdraw(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(e);[s,r]=this.handleWithdrawTagAndParams(s,r);const o=this.safeDict(this.options,"networks",{});let n=this.safeString2(r,"network","netWork");n=this.safeString(o,n,n),n=this.networkCodeToId(n,a.code),this.checkAddress(i);const d={coin:a.id,address:i,amount:t};void 0!==s&&(d.memo=s),void 0!==n&&(d.netWork=n,r=this.omit(r,["network","netWork"]));const h=await this.spotPrivatePostCapitalWithdraw(this.extend(d,r));return this.parseTransaction(h,a)}async setPositionMode(e,t=void 0,i={}){const s={positionMode:e?1:2};return await this.contractPrivatePostPositionChangePositionMode(this.extend(s,i))}async fetchPositionMode(e=void 0,t={}){const i=await this.contractPrivateGetPositionPositionMode(t);return{info:i,hedged:1===this.safeInteger(i,"data")}}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotPrivateGetCapitalConfigGetall(t);return this.parseTransactionFees(i,e)}parseTransactionFees(e,t=void 0){const i={};for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"coin"),o=this.safeCurrency(a),n=this.safeString(o,"code");(void 0===t||this.inArray(n,t))&&(i[n]=this.parseTransactionFee(r,o))}return{withdraw:i,deposit:{},info:e}}parseTransactionFee(e,t=void 0){const i=this.safeValue(e,"networkList",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"network"),a=this.safeString(this.options.networks,r,r),o=this.safeNumber(t,"withdrawFee");s[a]=o}return s}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.spotPrivateGetCapitalConfigGetall(t);return this.parseDepositWithdrawFees(i,e,"coin")}parseDepositWithdrawFee(e,t=void 0){const i=this.safeValue(e,"networkList",[]),s=this.depositWithdrawFee(e);for(let e=0;e<i.length;e++){const r=i[e],a=this.safeString(r,"network"),o=this.networkIdToCode(a,this.safeString(t,"code"));s.networks[o]={withdraw:{fee:this.safeNumber(r,"withdrawFee"),percentage:void 0},deposit:{fee:void 0,percentage:void 0}}}return this.assignDefaultDepositWithdrawFees(s)}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.contractPrivateGetPositionLeverage(this.extend(s,t)),a=this.safeList(r,"data",[]);return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){let i,s,r;for(let t=0;t<e.length;t++){const a=e[t],o=this.safeInteger(a,"openType"),n=this.safeInteger(a,"positionType");1===n?s=this.safeInteger(a,"leverage"):2===n&&(r=this.safeInteger(a,"leverage")),i=1===o?"isolated":"cross"}return{info:e,symbol:t.symbol,marginMode:i,longLeverage:s,shortLeverage:r}}handleMarginModeAndParams(e,t={},i=void 0){const s=this.safeString(this.options,"defaultType"),r=this.safeBool(t,"margin",!1);let a;return[a,t]=super.handleMarginModeAndParams(e,t,i),"margin"!==s&&!0!==r||(a="isolated"),[a,t]}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(void 0!==e){if(1===e.length){const t=this.market(e[0]);r.symbol=t.id}}void 0!==i&&(r.page_size=i);const a=await this.contractPrivateGetPositionListHistoryPositions(this.extend(r,s)),o=this.safeList(a,"data"),n=this.parsePositions(o,e,s);return this.filterBySinceLimit(n,t,i)}async setMarginMode(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(t);if(s.spot)throw new r.BadSymbol(this.id+" setMarginMode() supports contract markets only");if("isolated"!==(e=e.toLowerCase())&&"cross"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");const a=this.safeInteger(i,"leverage");if(void 0===a)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a leverage parameter");const o=this.safeStringLower2(i,"direction","positionId"),n={leverage:a,openType:"isolated"===e?1:2};void 0!==t&&(n.symbol=s.id),void 0!==o&&(n.positionType="short"===o?2:1),i=this.omit(i,"direction");const d=await this.contractPrivatePostPositionChangeLeverage(this.extend(n,i));return this.parseLeverage(d,s)}nonce(){return this.milliseconds()-this.safeInteger(this.options,"timeDifference",0)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeString(t,0),d=this.safeString(t,1);let h;if([e,s]=this.resolvePath(e,s),"spot"===o||"broker"===o){h="broker"===o?this.urls.api[o][d]+"/"+e:this.urls.api[o][d]+"/api/"+this.version+"/"+e;let t=s;"private"===d&&("broker"!==o||"POST"!==i&&"PUT"!==i&&"DELETE"!==i?(t.timestamp=this.nonce(),t.recvWindow=this.safeInteger(this.options,"recvWindow",5e3)):(t={timestamp:this.nonce(),recvWindow:this.safeInteger(this.options,"recvWindow",5e3)},a=this.json(s)));let c="";if(Object.keys(t).length&&(c=this.urlencode(t),h+="?"+c),"private"===d){this.checkRequiredCredentials();h+="&signature="+this.hmac(this.encode(c),this.encode(this.secret),n.s),r={"X-MEXC-APIKEY":this.apiKey,source:this.safeString(this.options,"broker","CCXT")}}"POST"!==i&&"PUT"!==i&&"DELETE"!==i||(r["Content-Type"]="application/json")}else if("contract"===o||"spot2"===o)if(h=this.urls.api[o][d]+"/"+this.implodeParams(e,s),s=this.omit(s,this.extractParams(e)),"public"===d)Object.keys(s).length&&(h+="?"+this.urlencode(s));else{this.checkRequiredCredentials();const e=this.nonce().toString();let t="";r={ApiKey:this.apiKey,"Request-Time":e,"Content-Type":"application/json",source:this.safeString(this.options,"broker","CCXT")},"POST"===i?(t=this.json(s),a=t):(s=this.keysort(s),Object.keys(s).length&&(t+=this.urlencode(s),h+="?"+t)),t=this.apiKey+e+t;const o=this.hmac(this.encode(t),this.encode(this.secret),n.s);r.Signature=o}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(!0===this.safeBool(n,"success",!1))return;const c=this.safeString(n,"code",void 0);if(void 0!==c&&"200"!==c&&"0"!==c){const e=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,o,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}}
class r extends s.A{describe(){return this.deepExtend(super.describe(),{id:"myokx",name:"MyOKX (EEA)",certified:!1,pro:!0,hostname:"eea.okx.com",urls:{logo:"https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg",api:{rest:"https://{hostname}"},www:"https://my.okx.com",doc:"https://my.okx.com/docs-v5/en/#overview",fees:"https://my.okx.com/pages/products/fees.html",referral:{url:"https://www.my.okx.com/join/CCXT2023",discount:.2},test:{rest:"https://{hostname}"}},has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1},features:{swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"ndax",name:"NDAX",countries:["CA"],rateLimit:1e3,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchGreeks:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverages:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarginModes:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrices:!1,fetchMyLiquidations:!1,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOption:!1,fetchOptionChain:!1,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!1,fetchTicker:!0,fetchTickers:!1,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!0,transfer:!1,withdraw:!0},timeframes:{"1m":"60","5m":"300","15m":"900","30m":"1800","1h":"3600","2h":"7200","4h":"14400","6h":"21600","12h":"43200","1d":"86400","1w":"604800","1M":"2419200","4M":"9676800"},urls:{logo:"https://user-images.githubusercontent.com/1294454/108623144-67a3ef00-744e-11eb-8140-75c6b851e945.jpg",test:{public:"https://ndaxmarginstaging.cdnhop.net:8443/AP",private:"https://ndaxmarginstaging.cdnhop.net:8443/AP"},api:{public:"https://api.ndax.io:8443/AP",private:"https://api.ndax.io:8443/AP"},www:"https://ndax.io",doc:["https://apidoc.ndax.io/"],fees:"https://ndax.io/fees",referral:"https://one.ndax.io/bfQiSL"},api:{public:{get:{Activate2FA:1,Authenticate2FA:1,AuthenticateUser:1,GetL2Snapshot:1,GetLevel1:1,GetValidate2FARequiredEndpoints:1,LogOut:1,GetTickerHistory:1,GetProduct:1,GetProducts:1,GetInstrument:1,GetInstruments:1,Ping:1,trades:1,GetLastTrades:1,SubscribeLevel1:1,SubscribeLevel2:1,SubscribeTicker:1,SubscribeTrades:1,SubscribeBlockTrades:1,UnsubscribeBlockTrades:1,UnsubscribeLevel1:1,UnsubscribeLevel2:1,UnsubscribeTicker:1,UnsubscribeTrades:1,Authenticate:1}},private:{get:{GetUserAccountInfos:1,GetUserAccounts:1,GetUserAffiliateCount:1,GetUserAffiliateTag:1,GetUserConfig:1,GetAllUnredactedUserConfigsForUser:1,GetUnredactedUserConfigByKey:1,GetUserDevices:1,GetUserReportTickets:1,GetUserReportWriterResultRecords:1,GetAccountInfo:1,GetAccountPositions:1,GetAllAccountConfigs:1,GetTreasuryProductsForAccount:1,GetAccountTrades:1,GetAccountTransactions:1,GetOpenTradeReports:1,GetAllOpenTradeReports:1,GetTradesHistory:1,GetOpenOrders:1,GetOpenQuotes:1,GetOrderFee:1,GetOrderHistory:1,GetOrdersHistory:1,GetOrderStatus:1,GetOmsFeeTiers:1,GetAccountDepositTransactions:1,GetAccountWithdrawTransactions:1,GetAllDepositRequestInfoTemplates:1,GetDepositInfo:1,GetDepositRequestInfoTemplate:1,GetDeposits:1,GetDepositTicket:1,GetDepositTickets:1,GetOMSWithdrawFees:1,GetWithdrawFee:1,GetWithdraws:1,GetWithdrawTemplate:1,GetWithdrawTemplateTypes:1,GetWithdrawTicket:1,GetWithdrawTickets:1},post:{AddUserAffiliateTag:1,CancelUserReport:1,RegisterNewDevice:1,SubscribeAccountEvents:1,UpdateUserAffiliateTag:1,GenerateTradeActivityReport:1,GenerateTransactionActivityReport:1,GenerateTreasuryActivityReport:1,ScheduleTradeActivityReport:1,ScheduleTransactionActivityReport:1,ScheduleTreasuryActivityReport:1,CancelAllOrders:1,CancelOrder:1,CancelQuote:1,CancelReplaceOrder:1,CreateQuote:1,ModifyOrder:1,SendOrder:1,SubmitBlockTrade:1,UpdateQuote:1,CancelWithdraw:1,CreateDepositTicket:1,CreateWithdrawTicket:1,SubmitDepositTicketComment:1,SubmitWithdrawTicketComment:1,GetOrderHistoryByOrderId:1}}},features:{spot:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:{last:!0,mark:!1,index:!1},stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:void 0,fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.0025")}},requiredCredentials:{apiKey:!0,secret:!0,uid:!0,login:!0,password:!0},precisionMode:a.kb,exceptions:{exact:{Not_Enough_Funds:r.InsufficientFunds,"Server Error":r.ExchangeError,"Resource Not Found":r.OrderNotFound},broad:{"Invalid InstrumentId":r.BadSymbol,"This endpoint requires 2FACode along with the payload":r.AuthenticationError}},options:{omsId:1,orderTypes:{Market:1,Limit:2,StopMarket:3,StopLimit:4,TrailingStopMarket:5,TrailingStopLimit:6,BlockTrade:7,1:1,2:2,3:3,4:4,5:5,6:6,7:7}}})}async signIn(e={}){if(this.checkRequiredCredentials(),void 0===this.login||void 0===this.password)throw new r.AuthenticationError(this.id+" signIn() requires exchange.login, exchange.password");let t={grant_type:"client_credentials"};const i=await this.publicGetAuthenticate(this.extend(t,e));let s=this.safeString(i,"SessionToken");if(void 0!==s)return this.options.sessionToken=s,i;const a=this.safeString(i,"Pending2FaToken");if(void 0!==a){if(void 0===this.twofa)throw new r.AuthenticationError(this.id+" signIn() requires exchange.twofa credentials");this.options.pending2faToken=a,t={Code:(0,d.O)(this.twofa)};const i=await this.publicGetAuthenticate2FA(this.extend(t,e));return s=this.safeString(i,"SessionToken"),this.options.sessionToken=s,i}return i}async fetchCurrencies(e={}){const t={omsId:this.safeInteger(this.options,"omsId",1)},i=await this.publicGetGetProducts(this.extend(t,e)),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"ProductId"),a=this.safeString(t,"ProductFullName"),o=this.safeString(t,"ProductType");let n="NationalCurrency"===o?"fiat":"crypto";"Unknown"===o&&(n="other");const d=this.safeCurrencyCode(this.safeString(t,"Product")),h=!this.safeValue(t,"IsDisabled");s[d]={id:r,name:a,code:d,type:n,precision:this.safeNumber(t,"TickSize"),info:t,active:h,deposit:void 0,withdraw:void 0,fee:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}}}return s}async fetchMarkets(e={}){const t={omsId:this.safeInteger(this.options,"omsId",1)},i=await this.publicGetGetInstruments(this.extend(t,e));return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"InstrumentId"),i=this.safeString(e,"Product1"),s=this.safeString(e,"Product2"),r=this.safeCurrencyCode(this.safeString(e,"Product1Symbol")),a=this.safeCurrencyCode(this.safeString(e,"Product2Symbol")),o=this.safeString(e,"SessionStatus"),n=this.safeValue(e,"IsDisable");return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"Running"===o&&!n,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"QuantityIncrement"),price:this.safeNumber(e,"PriceIncrement")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"MinimumQuantity"),max:void 0},price:{min:this.safeNumber(e,"MinimumPrice"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}parseOrderBook(e,t,i=void 0,s="bids",r="asks",a=6,o=8,n=2){let d;const h={symbol:t,bids:[],asks:[],timestamp:void 0,datetime:void 0,nonce:void 0};for(let t=0;t<e.length;t++){const n=e[t];if(void 0===i)i=this.safeInteger(n,2);else{const e=this.safeInteger(n,2);i=Math.max(i,e)}if(void 0===d)d=this.safeInteger(n,0);else{const e=this.safeInteger(n,0);d=Math.max(d,e)}const c=this.parseBidAsk(n,a,o);h[this.safeInteger(n,9)?r:s].push(c)}return h.bids=this.sortBy(h.bids,0,!0),h.asks=this.sortBy(h.asks,0),h.timestamp=i,h.datetime=this.iso8601(i),h.nonce=d,h}async fetchOrderBook(e,t=void 0,i={}){const s=this.safeInteger(this.options,"omsId",1);await this.loadMarkets();t=void 0===t?100:t;const r={omsId:s,InstrumentId:this.market(e).id,Depth:t},a=await this.publicGetGetL2Snapshot(this.extend(r,i));return this.parseOrderBook(a,e)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"TimeStamp"),s=this.safeString(e,"InstrumentId");t=this.safeMarket(s,t);const r=this.safeSymbol(s,t),a=this.safeString(e,"LastTradedPx"),o=this.safeString(e,"Rolling24HrPxChangePercent"),n=this.safeString(e,"Rolling24HrPxChange"),d=this.safeString(e,"SessionOpen"),h=this.safeString(e,"Rolling24HrVolume"),c=this.safeString(e,"Rolling24HrNotional");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"SessionHigh"),low:this.safeString(e,"SessionLow"),bid:this.safeString(e,"BestBid"),bidVolume:void 0,ask:this.safeString(e,"BestOffer"),askVolume:void 0,vwap:void 0,open:d,close:a,last:a,previousClose:void 0,change:n,percentage:o,average:void 0,baseVolume:h,quoteVolume:c,info:e},t)}async fetchTicker(e,t={}){const i=this.safeInteger(this.options,"omsId",1);await this.loadMarkets();const s=this.market(e),r={omsId:i,InstrumentId:s.id},a=await this.publicGetGetLevel1(this.extend(r,t));return this.parseTicker(a,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,3),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){const a=this.safeInteger(this.options,"omsId",1);await this.loadMarkets();const o=this.market(e),n={omsId:a,InstrumentId:o.id,Interval:this.safeString(this.timeframes,t,t)},d=this.parseTimeframe(t),h=this.milliseconds();void 0===i?void 0!==s&&(n.FromDate=this.ymdhms(h-d*s*1e3),n.ToDate=this.ymdhms(h)):(n.FromDate=this.ymdhms(i),n.ToDate=void 0===s?this.ymdhms(h):this.ymdhms(this.sum(i,d*s*1e3)));const c=await this.publicGetGetTickerHistory(this.extend(n,r));return this.parseOHLCVs(c,o,t,i,s)}parseTrade(e,t=void 0){let i,s,r,a,o,n,d,h,c,l,u;if(Array.isArray(e)){i=this.safeString(e,3),s=this.safeString(e,2),a=this.safeInteger(e,6),o=this.safeString(e,0),n=this.safeString(e,1);d=this.safeValue(e,8)?"sell":"buy",h=this.safeString(e,4)}else{a=this.safeInteger2(e,"TradeTimeMS","ReceiveTime"),o=this.safeString(e,"TradeId"),h=this.safeString2(e,"OrderId","OrigOrderId"),n=this.safeString2(e,"InstrumentId","Instrument"),i=this.safeString(e,"Price"),s=this.safeString(e,"Quantity"),r=this.safeString2(e,"Value","GrossValueExecuted"),c=this.safeStringLower(e,"MakerTaker"),d=this.safeStringLower(e,"Side"),u=this.safeStringLower(e,"OrderType");const t=this.safeString(e,"Fee");if(void 0!==t){const i=this.safeString(e,"FeeProductId");l={cost:t,currency:this.safeCurrencyCode(i)}}}const f=this.safeSymbol(n,t);return this.safeTrade({info:e,id:o,symbol:f,timestamp:a,datetime:this.iso8601(a),order:h,type:u,side:d,takerOrMaker:c,price:i,amount:s,cost:r,fee:l},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets();const a=this.market(e),o={omsId:r,InstrumentId:a.id};void 0!==i&&(o.Count=i);const n=await this.publicGetGetLastTrades(this.extend(o,s));return this.parseTrades(n,a,t,i)}async fetchAccounts(e={}){if(!this.login)throw new r.AuthenticationError(this.id+" fetchAccounts() requires exchange.login email credential");const t=this.safeInteger(this.options,"omsId",1);this.checkRequiredCredentials();const i={omsId:t,UserId:this.uid,UserName:this.login},s=await this.privateGetGetUserAccounts(this.extend(i,e)),a=[];for(let e=0;e<s.length;e++){const t=this.safeString(s,e);a.push({id:t,type:void 0,currency:void 0,info:t})}return a}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"ProductId");if(r in this.currencies_by_id){const e=this.safeCurrencyCode(r),i=this.account();i.total=this.safeString(s,"Amount"),i.used=this.safeString(s,"Hold"),t[e]=i}}return this.safeBalance(t)}async fetchBalance(e={}){const t=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const i=this.safeInteger2(this.options,"accountId","AccountId");let s=this.safeInteger2(e,"accountId","AccountId",i);void 0===s&&(s=parseInt(this.accounts[0].id)),e=this.omit(e,["accountId","AccountId"]);const r={omsId:t,AccountId:s},a=await this.privateGetGetAccountPositions(this.extend(r,e));return this.parseBalance(a)}parseLedgerEntryType(e){return this.safeString({Trade:"trade",Deposit:"transaction",Withdraw:"transaction",Transfer:"transfer",OrderHold:"trade",WithdrawHold:"transaction",DepositHold:"transaction",MarginHold:"trade",ManualHold:"trade",ManualEntry:"trade",MarginAcquisition:"trade",MarginRelinquish:"trade",MarginQuoteHold:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"ProductId");t=this.safeCurrency(i,t);const s=this.safeString(e,"CR"),r=this.safeString(e,"DR");let a,n,d;o.Y.stringLt(s,"0")?(a=s,n="in"):o.Y.stringLt(r,"0")&&(a=r,n="out");const h=this.safeString(e,"Balance");"out"===n?d=o.Y.stringAdd(h,a):"in"===n&&(d=o.Y.stringMax("0",o.Y.stringSub(h,a)));const c=this.safeInteger(e,"TimeStamp");return this.safeLedgerEntry({info:e,id:this.safeString(e,"TransactionId"),direction:n,account:this.safeString(e,"AccountId"),referenceId:this.safeString(e,"ReferenceId"),referenceAccount:this.safeString(e,"Counterparty"),type:this.parseLedgerEntryType(this.safeString(e,"ReferenceType")),currency:this.safeCurrencyCode(i,t),amount:this.parseNumber(a),before:this.parseNumber(d),after:this.parseNumber(h),status:"ok",timestamp:c,datetime:this.iso8601(c),fee:void 0},t)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);s=this.omit(s,["accountId","AccountId"]);const n={omsId:r,AccountId:o};void 0!==i&&(n.Depth=i);const d=await this.privateGetGetAccountTransactions(this.extend(n,s));let h;return void 0!==e&&(h=this.currency(e)),this.parseLedger(d,h,t,i)}parseOrderStatus(e){return this.safeString({Accepted:"open",Rejected:"rejected",Working:"open",Canceled:"canceled",Expired:"expired",FullyExecuted:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"ReceiveTime"),s=this.safeString(e,"Instrument");return this.safeOrder({id:this.safeString2(e,"ReplacementOrderId","OrderId"),clientOrderId:this.safeString2(e,"ReplacementClOrdId","ClientOrderId"),info:e,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:this.safeInteger(e,"LastUpdatedTime"),status:this.parseOrderStatus(this.safeString(e,"OrderState")),symbol:this.safeSymbol(s,t),type:this.safeStringLower(e,"OrderType"),timeInForce:void 0,postOnly:void 0,side:this.safeStringLower(e,"Side"),price:this.safeString(e,"Price"),triggerPrice:this.parseNumber(this.omitZero(this.safeString(e,"StopPrice"))),cost:this.safeString(e,"GrossValueExecuted"),amount:this.safeString(e,"OrigQuantity"),filled:this.safeString(e,"QuantityExecuted"),average:this.safeString(e,"AvgPrice"),remaining:void 0,fee:void 0,trades:void 0},t)}async createOrder(e,t,i,s,r=void 0,a={}){const o=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const n=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),d=this.safeInteger2(a,"accountId","AccountId",n),h=this.safeInteger2(a,"ClientOrderId","clientOrderId");let c=this.safeInteger(this.options.orderTypes,this.capitalize(t));const l=this.safeString(a,"triggerPrice");void 0!==l&&("market"===t?c=3:"limit"===t&&(c=4)),a=this.omit(a,["accountId","AccountId","clientOrderId","ClientOrderId","triggerPrice"]);const u=this.market(e),f="buy"===i?0:1,p={InstrumentId:parseInt(u.id),omsId:o,AccountId:d,TimeInForce:1,Side:f,Quantity:parseFloat(this.amountToPrecision(e,s)),OrderType:c};void 0!==r&&(p.LimitPrice=parseFloat(this.priceToPrecision(e,r))),void 0!==h&&(p.ClientOrderId=h),void 0!==l&&(p.StopPrice=l);const m=await this.privatePostSendOrder(this.extend(p,a));return this.parseOrder(m,u)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){const n=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const d=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),h=this.safeInteger2(o,"accountId","AccountId",d),c=this.safeInteger2(o,"ClientOrderId","clientOrderId");o=this.omit(o,["accountId","AccountId","clientOrderId","ClientOrderId"]);const l=this.market(t),u="buy"===s?0:1,f={OrderIdToReplace:parseInt(e),InstrumentId:parseInt(l.id),omsId:n,AccountId:h,TimeInForce:1,Side:u,Quantity:parseFloat(this.amountToPrecision(t,r)),OrderType:this.safeInteger(this.options.orderTypes,this.capitalize(i))};void 0!==a&&(f.LimitPrice=parseFloat(this.priceToPrecision(t,a))),void 0!==c&&(f.ClientOrderId=c);const p=await this.privatePostCancelReplaceOrder(this.extend(f,o));return this.parseOrder(p,l)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);s=this.omit(s,["accountId","AccountId"]);const n={omsId:r,AccountId:o};let d;void 0!==e&&(d=this.market(e),n.InstrumentId=d.id),void 0!==t&&(n.StartTimeStamp=this.parseToInt(t/1e3)),void 0!==i&&(n.Depth=i);const h=await this.privateGetGetTradesHistory(this.extend(n,s));return this.parseTrades(h,d,t,i)}async cancelAllOrders(e=void 0,t={}){const i=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const s=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),r=this.safeInteger2(t,"accountId","AccountId",s);t=this.omit(t,["accountId","AccountId"]);const a={omsId:i,AccountId:r};if(void 0!==e){const t=this.market(e);a.IntrumentId=t.id}const o=await this.privatePostCancelAllOrders(this.extend(a,t));return[this.safeOrder({info:o})]}async cancelOrder(e,t=void 0,i={}){const s=this.safeInteger(this.options,"omsId",1);let r;await this.loadMarkets(),await this.loadAccounts(),void 0!==t&&(r=this.market(t));const a={omsId:s},o=this.safeInteger2(i,"clientOrderId","ClOrderId");void 0!==o?a.ClOrderId=o:a.OrderId=parseInt(e),i=this.omit(i,["clientOrderId","ClOrderId"]);const n=await this.privatePostCancelOrder(this.extend(a,i)),d=this.parseOrder(n,r);return this.extend(d,{id:e,clientOrderId:o})}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);let n;s=this.omit(s,["accountId","AccountId"]),void 0!==e&&(n=this.market(e));const d={omsId:r,AccountId:o},h=await this.privateGetGetOpenOrders(this.extend(d,s));return this.parseOrders(h,n,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);s=this.omit(s,["accountId","AccountId"]);const n={omsId:r,AccountId:o};let d;void 0!==e&&(d=this.market(e),n.InstrumentId=d.id),void 0!==t&&(n.StartTimeStamp=this.parseToInt(t/1e3)),void 0!==i&&(n.Depth=i);const h=await this.privateGetGetOrdersHistory(this.extend(n,s));return this.parseOrders(h,d,t,i)}async fetchOrder(e,t=void 0,i={}){const s=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const r=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),a=this.safeInteger2(i,"accountId","AccountId",r);let o;i=this.omit(i,["accountId","AccountId"]),void 0!==t&&(o=this.market(t));const n={omsId:s,AccountId:a,OrderId:parseInt(e)},d=await this.privateGetGetOrderStatus(this.extend(n,i));return this.parseOrder(d,o)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a=this.safeInteger(this.options,"omsId",1);let o;await this.loadMarkets(),await this.loadAccounts(),void 0!==t&&(o=this.market(t));const n={OMSId:this.parseToInt(a),OrderId:parseInt(e)},d=await this.privatePostGetOrderHistoryByOrderId(this.extend(n,r)),h=this.groupBy(d,"ChangeReason"),c=this.safeList(h,"Trade",[]);return this.parseTrades(c,o,i,s)}async fetchDepositAddress(e,t={}){const i=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const s=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),r=this.safeInteger2(t,"accountId","AccountId",s);t=this.omit(t,["accountId","AccountId"]);const a=this.currency(e),o={omsId:i,AccountId:r,ProductId:a.id,GenerateNewKey:!1},n=await this.privateGetGetDepositInfo(this.extend(o,t));return this.parseDepositAddress(n,a)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"DepositInfo"),s=JSON.parse(i),r=s.length,a=this.safeString(s,r-1).split("?memo="),o=this.safeString(a,0),n=this.safeString(a,1);let d;return void 0!==t&&(d=t.code),this.checkAddress(o),{info:e,currency:d,network:void 0,address:o,tag:n}}async createDepositAddress(e,t={}){return await this.fetchDepositAddress(e,this.extend({GenerateNewKey:!0},t))}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);let n;s=this.omit(s,["accountId","AccountId"]),void 0!==e&&(n=this.currency(e));const d={omsId:r,AccountId:o},h=await this.privateGetGetDeposits(this.extend(d,s));return"string"==typeof h?this.parseTransactions(JSON.parse(h),n,t,i):this.parseTransactions(h,n,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){const r=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const a=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),o=this.safeInteger2(s,"accountId","AccountId",a);let n;s=this.omit(s,["accountId","AccountId"]),void 0!==e&&(n=this.currency(e));const d={omsId:r,AccountId:o},h=await this.privateGetGetWithdraws(this.extend(d,s));return this.parseTransactions(h,n,t,i)}parseTransactionStatusByType(e,t=void 0){const i=this.safeValue({deposit:{New:"pending",AdminProcessing:"pending",Accepted:"pending",Rejected:"rejected",SystemProcessing:"pending",FullyProcessed:"ok",Failed:"failed",Pending:"pending",Confirmed:"pending",AmlProcessing:"pending",AmlAccepted:"pending",AmlRejected:"rejected",AmlFailed:"failed",LimitsAccepted:"pending",LimitsRejected:"rejected"},withdrawal:{New:"pending",AdminProcessing:"pending",Accepted:"pending",Rejected:"rejected",SystemProcessing:"pending",FullyProcessed:"ok",Failed:"failed",Pending:"pending",Pending2Fa:"pending",AutoAccepted:"pending",Delayed:"pending",UserCanceled:"canceled",AdminCanceled:"canceled",AmlProcessing:"pending",AmlAccepted:"pending",AmlRejected:"rejected",AmlFailed:"failed",LimitsAccepted:"pending",LimitsRejected:"rejected",Submitted:"pending",Confirmed:"pending",ManuallyConfirmed:"pending",Confirmed2Fa:"pending"}},t,{});return this.safeString(i,e,e)}parseTransaction(e,t=void 0){let i;const s=this.safeString(e,"ProductId"),r=this.safeCurrencyCode(s,t);let a;"DepositId"in e?(i=this.safeString(e,"DepositId"),a="deposit"):"WithdrawId"in e&&(i=this.safeString(e,"WithdrawId"),a="withdrawal");const o=this.parseJson(this.safeValue2(e,"TemplateForm","DepositInfo"));let n=this.safeInteger(e,"LastUpdateTimeStamp");void 0!==o&&(n=this.safeInteger(o,"LastUpdated",n));const d=this.safeString2(o,"ExternalAddress","ToAddress"),h=this.safeInteger(o,"TimeSubmitted"),c=this.safeNumber(e,"FeeAmount"),l=this.safeString(e,"TicketStatus");let u;return void 0!==c&&(u={currency:r,cost:c}),{info:e,id:i,txid:this.safeString2(o,"TxId","TXId"),timestamp:h,datetime:this.iso8601(h),address:d,addressTo:d,addressFrom:this.safeString(o,"FromAddress"),tag:void 0,tagTo:void 0,tagFrom:void 0,type:a,amount:this.safeNumber(e,"Amount"),currency:r,status:this.parseTransactionStatusByType(l,a),updated:n,fee:u,internal:void 0,comment:void 0,network:void 0}}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a);if(void 0===this.safeString(this.options,"sessionToken"))throw new r.AuthenticationError(this.id+" call signIn() method to obtain a session token");if(void 0===this.twofa)throw new r.AuthenticationError(this.id+" withdraw() requires exchange.twofa credentials");this.checkAddress(i);const o=this.safeInteger(this.options,"omsId",1);await this.loadMarkets(),await this.loadAccounts();const n=this.safeInteger2(this.options,"accountId","AccountId",parseInt(this.accounts[0].id)),h=this.safeInteger2(a,"accountId","AccountId",n);a=this.omit(a,["accountId","AccountId"]);const c=this.currency(e),l={omsId:o,AccountId:h,ProductId:c.id},u=await this.privateGetGetWithdrawTemplateTypes(l),f=this.safeValue(u,"TemplateTypes",[]),p=this.safeValue(f,0);if(void 0===p)throw new r.ExchangeError(this.id+" withdraw() could not find a withdraw template type for "+c.code);const m=this.safeString(p,"TemplateName"),g={omsId:o,AccountId:h,ProductId:c.id,TemplateType:m,AccountProviderId:p.AccountProviderId},v=await this.privateGetGetWithdrawTemplate(g),y=this.safeString(v,"Template");if(void 0===y)throw new r.ExchangeError(this.id+" withdraw() could not find a withdraw template for "+c.code);const w=JSON.parse(y);w.ExternalAddress=i,void 0!==s&&"Memo"in w&&(w.Memo=s);const b={omsId:o,AccountId:h,ProductId:c.id,TemplateForm:this.json(w),TemplateType:m},k={TfaType:"Google",TFaCode:(0,d.O)(this.twofa),Payload:this.json(b)},S=await this.privatePostCreateWithdrawTicket(this.deepExtend(k,a));return this.parseTransaction(S,c)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/"+this.implodeParams(e,s),d=this.omit(s,this.extractParams(e));if("public"===t){if("Authenticate"===e){const e=this.login+":"+this.password;r={Authorization:"Basic "+this.stringToBase64(e)}}else if("Authenticate2FA"===e){const e=this.safeString(this.options,"pending2faToken");void 0!==e&&(r={Pending2FaToken:e},d=this.omit(d,"pending2faToken"))}Object.keys(d).length&&(o+="?"+this.urlencode(d))}else if("private"===t){this.checkRequiredCredentials();const e=this.safeString(this.options,"sessionToken");if(void 0===e){const e=this.nonce().toString(),t=e+this.uid+this.apiKey,i=this.hmac(this.encode(t),this.encode(this.secret),n.s);r={Nonce:e,APIKey:this.apiKey,Signature:i,UserId:this.uid}}else r={APToken:e};"POST"===i?(r["Content-Type"]="application/json",a=this.json(d)):Object.keys(d).length&&(o+="?"+this.urlencode(d))}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(404===e)throw new r.AuthenticationError(this.id+" "+o);if(void 0===n)return;const c=this.safeString(n,"errormsg");if(void 0!==c&&""!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,o,e),new r.ExchangeError(e)}}}
class h extends s.A{describe(){return this.deepExtend(super.describe(),{id:"novadax",name:"NovaDAX",countries:["BR"],rateLimit:10,version:"v1",has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:"emulated",fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"ONE_MIN","5m":"FIVE_MIN","15m":"FIFTEEN_MIN","30m":"HALF_HOU","1h":"ONE_HOU","1d":"ONE_DAY","1w":"ONE_WEE","1M":"ONE_MON"},urls:{logo:"https://user-images.githubusercontent.com/1294454/92337550-2b085500-f0b3-11ea-98e7-5794fb07dd3b.jpg",api:{public:"https://api.novadax.com",private:"https://api.novadax.com"},www:"https://www.novadax.com.br",doc:["https://doc.novadax.com/pt-BR/"],fees:"https://www.novadax.com.br/fees-and-limits",referral:"https://www.novadax.com.br/?s=ccxt"},api:{public:{get:{"common/symbol":1,"common/symbols":1,"common/timestamp":1,"market/tickers":5,"market/ticker":1,"market/depth":1,"market/trades":5,"market/kline/history":5}},private:{get:{"orders/get":1,"orders/list":10,"orders/fill":3,"orders/fills":10,"account/getBalance":1,"account/subs":1,"account/subs/balance":1,"account/subs/transfer/record":10,"wallet/query/deposit-withdraw":3},post:{"orders/create":5,"orders/batch-create":50,"orders/cancel":1,"orders/batch-cancel":10,"orders/cancel-by-symbol":10,"account/subs/transfer":5,"wallet/withdraw/coin":3,"account/withdraw/coin":3}}},fees:{trading:{tierBased:!1,percentage:!0,taker:this.parseNumber("0.005"),maker:this.parseNumber("0.0025")}},requiredCredentials:{apiKey:!0,secret:!0},precisionMode:o.kb,exceptions:{exact:{A99999:r.ExchangeError,A10001:r.BadRequest,A10002:r.ExchangeError,A10003:r.AuthenticationError,A10004:r.RateLimitExceeded,A10005:r.PermissionDenied,A10006:r.AccountSuspended,A10007:r.AccountNotEnabled,A10011:r.BadSymbol,A10012:r.BadSymbol,A10013:r.OnMaintenance,A30001:r.OrderNotFound,A30002:r.InvalidOrder,A30003:r.InvalidOrder,A30004:r.InvalidOrder,A30005:r.InvalidOrder,A30006:r.InvalidOrder,A30007:r.InsufficientFunds,A30008:r.InvalidOrder,A30009:r.InvalidOrder,A30010:r.CancelPending,A30011:r.InvalidOrder,A30012:r.InvalidOrder,A40004:r.InsufficientFunds},broad:{}},options:{fetchOHLCV:{volume:"amount"},transfer:{fillResponseFromRequest:!0}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!0,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){const t=await this.publicGetCommonTimestamp(e);return this.safeInteger(t,"data")}async fetchMarkets(e={}){const t=await this.publicGetCommonSymbols(e),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"baseCurrency"),i=this.safeString(e,"quoteCurrency"),s=this.safeString(e,"symbol"),r=this.safeCurrencyCode(t),a=this.safeCurrencyCode(i);return{id:s,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:t,quoteId:i,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"ONLINE"===this.safeString(e,"status"),contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amountPrecision"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"pricePrecision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"minOrderAmount"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"minOrderValue"),max:void 0}},created:void 0,info:e}}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t,"_"),a=this.safeString(e,"open24h"),o=this.safeString(e,"lastPrice"),n=this.safeString(e,"baseVolume24h"),d=this.safeString(e,"quoteVolume24h");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high24h"),low:this.safeString(e,"low24h"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:a,close:o,last:o,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:n,quoteVolume:d,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetMarketTicker(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarketTickers(t),s=this.safeValue(i,"data",[]),r={};for(let e=0;e<s.length;e++){const t=this.parseTicker(s[e]);r[t.symbol]=t}return this.filterByArrayTickers(r,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.limit=t);const a=await this.publicGetMarketDepth(this.extend(r,i)),o=this.safeValue(a,"data",{}),n=this.safeInteger(o,"timestamp");return this.parseOrderBook(o,s.symbol,n,"bids","asks")}parseTrade(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"orderId"),r=this.safeInteger(e,"timestamp"),a=this.safeStringLower(e,"side"),o=this.safeString(e,"price"),n=this.safeString(e,"amount"),d=this.safeString(e,"symbol"),h=this.safeSymbol(d,t,"_"),c=this.safeStringLower(e,"role");let l;if(void 0!==this.safeString(e,"fee")){const t=this.safeString(e,"feeCurrency"),i=this.safeCurrencyCode(t);l={cost:this.safeString(e,"feeAmount"),currency:i}}return this.safeTrade({id:i,order:s,timestamp:r,datetime:this.iso8601(r),symbol:h,type:void 0,side:a,price:o,amount:n,cost:void 0,takerOrMaker:c,fee:l,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetMarketTrades(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,unit:this.safeString(this.timeframes,t,t)},n=this.parseTimeframe(t),d=this.seconds();if(void 0===s&&(s=3e3),void 0===i)o.from=d-s*n,o.to=d;else{const e=this.parseToInt(i/1e3);o.from=e,o.to=this.sum(e,s*n)}const h=await this.publicGetMarketKlineHistory(this.extend(o,r)),c=this.safeList(h,"data",[]);return this.parseOHLCVs(c,a,t,i,s)}parseOHLCV(e,t=void 0){const i=this.safeValue(this.options,"fetchOHLCV",{}),s=this.safeString(i,"volume","amount");return[this.safeTimestamp(e,"score"),this.safeNumber(e,"openPrice"),this.safeNumber(e,"highPrice"),this.safeNumber(e,"lowPrice"),this.safeNumber(e,"closePrice"),this.safeNumber(e,s)]}parseBalance(e){const t=this.safeValue(e,"data",[]),i={info:e,timestamp:void 0,datetime:void 0};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.free=this.safeString(s,"available"),o.used=this.safeString(s,"hold"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountGetBalance(e);return this.parseBalance(t)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e);let h=t.toUpperCase();const c=i.toUpperCase(),l={symbol:d.id,side:c},u=this.safeValue2(n,"triggerPrice","stopPrice");if(void 0===u){if("STOP_LIMIT"===h||"STOP_MARKET"===h)throw new r.ArgumentsRequired(this.id+" createOrder() requires a stopPrice parameter for "+h+" orders")}else{"LIMIT"===h?h="STOP_LIMIT":"MARKET"===h&&(h="STOP_MARKET");const t="BUY"===c?"LTE":"GTE";l.operator=this.safeString(n,"operator",t),l.stopPrice=this.priceToPrecision(e,u),n=this.omit(n,["triggerPrice","stopPrice"])}if("LIMIT"===h||"STOP_LIMIT"===h)l.price=this.priceToPrecision(e,o),l.amount=this.amountToPrecision(e,s);else if("MARKET"===h||"STOP_MARKET"===h)if("SELL"===c)l.amount=this.amountToPrecision(e,s);else if("BUY"===c){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber2(n,"cost","value");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);l.value=t}l.type=h;const f=await this.privatePostOrdersCreate(this.extend(l,n)),p=this.safeDict(f,"data",{});return this.parseOrder(p,d)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privatePostOrdersCancel(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.privateGetOrdersGet(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==i&&(r.limit=i),void 0!==t&&(r.fromTimestamp=t);const o=await this.privateGetOrdersList(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseOrders(n,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"SUBMITTED,PROCESSING,PARTIAL_FILLED,CANCELING"},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({status:"FILLED,CANCELED,REJECTED"},s))}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={id:e},o=await this.privateGetOrdersFill(this.extend(a,r));let n;void 0!==t&&(n=this.market(t));const d=this.safeValue(o,"data",[]);return this.parseTrades(d,n,i,s)}parseOrderStatus(e){return this.safeString({SUBMITTED:"open",PROCESSING:"open",PARTIAL_FILLED:"open",CANCELING:"open",FILLED:"closed",CANCELED:"canceled",REJECTED:"rejected"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"amount"),r=this.safeString(e,"price"),a=this.safeString2(e,"filledValue","value"),o=this.safeStringLower(e,"type"),n=this.safeStringLower(e,"side"),d=this.parseOrderStatus(this.safeString(e,"status")),h=this.safeInteger(e,"timestamp"),c=this.safeString(e,"averagePrice"),l=this.safeString(e,"filledAmount");let u;const f=this.safeNumber(e,"filledFee");void 0!==f&&(u={cost:f,currency:void 0});const p=this.safeString(e,"symbol"),m=this.safeSymbol(p,t,"_");return this.safeOrder({id:i,clientOrderId:void 0,info:e,timestamp:h,datetime:this.iso8601(h),lastTradeTimestamp:void 0,symbol:m,type:o,timeInForce:void 0,postOnly:void 0,side:n,price:r,triggerPrice:this.safeNumber(e,"stopPrice"),amount:s,cost:a,average:c,filled:l,remaining:void 0,status:d,fee:u,trades:void 0},t)}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e);if("main"!==i&&"main"!==s)throw new r.ExchangeError(this.id+" transfer() supports transfers between main account and subaccounts only");const n="main"===i?"master-transfer-in":"master-transfer-out",d={transferAmount:this.currencyToPrecision(e,t),currency:o.id,subId:"master-transfer-in"===n?s:i,transferType:n},h=await this.privatePostAccountSubsTransfer(this.extend(d,a)),c=this.parseTransfer(h,o),l=this.safeValue(this.options,"transfer",{});return this.safeBool(l,"fillResponseFromRequest",!0)&&(c.fromAccount=i,c.toAccount=s,c.amount=t),c}parseTransfer(e,t=void 0){const i=this.safeString(e,"data"),s=this.safeString(e,"message");return{info:e,id:i,amount:void 0,currency:this.safeCurrencyCode(void 0,t),fromAccount:void 0,toAccount:void 0,timestamp:void 0,datetime:void 0,status:s}}parseTransferStatus(e){return this.safeString({SUCCESS:"pending"},e,"failed")}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o={code:a.id,amount:this.currencyToPrecision(e,t),wallet:i};void 0!==s&&(o.tag=s);const n=await this.privatePostAccountWithdrawCoin(this.extend(o,r));return this.parseTransaction(n,a)}async fetchAccounts(e={}){const t=await this.privateGetAccountSubs(e),i=this.safeValue(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"subId"),a=this.safeString(t,"subAccount");s.push({id:r,type:a,currency:void 0,info:t})}return s}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({type:"coin_in"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({type:"coin_out"},s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.size=i);const o=await this.privateGetWalletQueryDepositWithdraw(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,a,t,i)}parseTransactionStatus(e){const t=e.split(" ");e=this.safeString(t,1,e);return this.safeString({Pending:"pending",confirming:"pending",SUCCESS:"ok",FAIL:"failed"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString2(e,"id","data");let s=this.safeString(e,"type");"COIN_IN"===s?s="deposit":"COIN_OUT"===s&&(s="withdraw");const r=this.safeNumber(e,"amount"),a=this.safeString(e,"address"),o=this.safeString(e,"addressTag"),n=this.safeString(e,"txHash"),d=this.safeInteger(e,"createdAt"),h=this.safeInteger(e,"updatedAt"),c=this.safeString(e,"currency"),l=this.safeCurrencyCode(c,t),u=this.parseTransactionStatus(this.safeString(e,"state"));return{info:e,id:i,currency:l,amount:r,network:this.safeString(e,"chain"),address:a,addressTo:a,addressFrom:void 0,tag:o,tagTo:o,tagFrom:void 0,status:u,type:s,updated:h,txid:n,timestamp:d,datetime:this.iso8601(d),comment:void 0,internal:void 0,fee:{currency:void 0,cost:void 0,rate:void 0}}}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==i&&(r.limit=i),void 0!==t&&(r.fromTimestamp=t);const o=await this.privateGetOrdersFills(this.extend(r,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,a,t,i)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o="/"+this.version+"/"+this.implodeParams(e,s);let h=this.urls.api[t]+o;const c=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(c).length&&(h+="?"+this.urlencode(c));else if("private"===t){this.checkRequiredCredentials();const e=this.milliseconds().toString();let t;r={"X-Nova-Access-Key":this.apiKey,"X-Nova-Timestamp":e},"POST"===i?(a=this.json(c),t=this.hash(this.encode(a),d.F),r["Content-Type"]="application/json"):(Object.keys(c).length&&(h+="?"+this.urlencode(c)),t=this.urlencode(this.keysort(c)));const s=i+"\n"+o+"\n"+t+"\n"+e;r["X-Nova-Signature"]=this.hmac(this.encode(s),this.encode(this.secret),n.s)}return{url:h,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code");if("A10000"!==c){const e=this.safeString(n,"message"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,t),this.throwBroadlyMatchedException(this.exceptions.broad,e,t),new r.ExchangeError(t)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"oceanex",name:"OceanEx",countries:["BS"],version:"v1",rateLimit:3e3,urls:{logo:"https://user-images.githubusercontent.com/1294454/58385970-794e2d80-8001-11e9-889c-0567cd79b78e.jpg",api:{rest:"https://api.oceanex.pro"},www:"https://www.oceanex.pro.com",doc:"https://api.oceanex.pro/doc/v1",referral:"https://oceanex.pro/signup?referral=VE24QX"},has:{CORS:void 0,spot:!0,margin:!1,swap:void 0,future:void 0,option:void 0,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,createMarketOrder:!0,createOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:"emulated",fetchDepositAddresses:void 0,fetchDepositAddressesByNetwork:!0,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarkets:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!0,fetchOrders:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:void 0},timeframes:{"1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","2h":"120","4h":"240","6h":"360","12h":"720","1d":"1440","3d":"4320","1w":"10080"},api:{public:{get:["markets","tickers/{pair}","tickers_multi","order_book","order_book/multi","fees/trading","trades","timestamp"],post:["k"]},private:{get:["key","members/me","orders","orders/filter"],post:["orders","orders/multi","order/delete","order/delete/multi","orders/clear","/withdraws/special/new","/deposit_address","/deposit_addresses","/deposit_history","/withdraw_history"]}},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.001"),taker:this.parseNumber("0.001")}},commonCurrencies:{PLA:"Plair"},precisionMode:a.kb,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!0,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:100}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{codes:{"-1":r.BadRequest,"-2":r.BadRequest,1001:r.BadRequest,1004:r.ArgumentsRequired,1006:r.AuthenticationError,1008:r.AuthenticationError,1010:r.AuthenticationError,1011:r.PermissionDenied,2001:r.AuthenticationError,2002:r.InvalidOrder,2004:r.OrderNotFound,9003:r.PermissionDenied},exact:{"market does not have a valid value":r.BadRequest,"side does not have a valid value":r.BadRequest,"Account::AccountError: Cannot lock funds":r.InsufficientFunds,"The account does not exist":r.AuthenticationError}}})}async fetchMarkets(e={}){const t=await this.publicGetMarkets(this.extend({show_details:!0},e)),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeValue(e,"id"),i=this.safeValue(e,"name");let[s,r]=i.split("/");const a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r);s=s.toLowerCase(),r=r.toLowerCase();return{id:t,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amount_precision"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"price_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"minimum_trading_amount"),max:void 0}},created:void 0,info:e}}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTickersPair(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),void 0===(e=this.marketSymbols(e))&&(e=this.symbols);const i={markets:this.marketIds(e)},s=await this.publicGetTickersMulti(this.extend(i,t)),r=this.safeValue(s,"data",[]),a={};for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"market"),s=this.safeMarket(i);a[s.symbol]=this.parseTicker(t,s)}return this.filterByArrayTickers(a,"symbol",e)}parseTicker(e,t=void 0){const i=this.safeValue(e,"ticker",{}),s=this.safeTimestamp(e,"at"),r=this.safeSymbol(void 0,t);return this.safeTicker({symbol:r,timestamp:s,datetime:this.iso8601(s),high:this.safeString(i,"high"),low:this.safeString(i,"low"),bid:this.safeString(i,"buy"),bidVolume:void 0,ask:this.safeString(i,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:this.safeString(i,"last"),last:this.safeString(i,"last"),previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(i,"volume"),quoteVolume:void 0,info:i},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={market:this.market(e).id};void 0!==t&&(s.limit=t);const r=await this.publicGetOrderBook(this.extend(s,i)),a=this.safeValue(r,"data",{}),o=this.safeTimestamp(a,"timestamp");return this.parseOrderBook(a,e,o)}async fetchOrderBooks(e=void 0,t=void 0,i={}){await this.loadMarkets(),void 0===e&&(e=this.symbols);const s={markets:this.marketIds(e)};void 0!==t&&(s.limit=t);const r=await this.publicGetOrderBookMulti(this.extend(s,i)),a=this.safeValue(r,"data",[]),o={};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"market"),s=this.safeSymbol(i),r=this.safeTimestamp(t,"timestamp");o[s]=this.parseOrderBook(t,s,r)}return o}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market:r.id};void 0!==i&&(a.limit=Math.min(i,1e3));const o=await this.publicGetTrades(this.extend(a,s)),n=this.safeList(o,"data");return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){let i=this.safeValue(e,"side");"bid"===i?i="buy":"ask"===i&&(i="sell");const s=this.safeValue(e,"market"),r=this.safeSymbol(s,t);let a=this.safeTimestamp(e,"created_on");void 0===a&&(a=this.parse8601(this.safeString(e,"created_at")));const o=this.safeString(e,"price"),n=this.safeString(e,"volume");return this.safeTrade({info:e,timestamp:a,datetime:this.iso8601(a),symbol:r,id:this.safeString(e,"id"),order:void 0,type:"limit",takerOrMaker:void 0,side:i,price:o,amount:n,cost:void 0,fee:void 0},t)}async fetchTime(e={}){const t=await this.publicGetTimestamp(e);return this.safeTimestamp(t,"data")}async fetchTradingFees(e={}){const t=await this.publicGetFeesTrading(e),i=this.safeValue(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeValue(t,"ask_fee",{}),a=this.safeValue(t,"bid_fee",{}),o=this.safeString(t,"market"),n=this.safeSymbol(o);s[n]={info:t,symbol:n,maker:this.safeNumber(r,"value"),taker:this.safeNumber(a,"value"),percentage:!0}}return s}async fetchKey(e={}){const t=await this.privateGetKey(e);return this.safeValue(t,"data")}parseBalance(e){const t=this.safeValue(e,"data"),i=this.safeValue(t,"accounts",[]),s={info:e};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeValue(t,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(t,"balance"),o.used=this.safeString(t,"locked"),s[a]=o}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetMembersMe(e);return this.parseBalance(t)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={market:o.id,side:i,ord_type:t,volume:this.amountToPrecision(e,s)};"limit"===t&&(n.price=this.priceToPrecision(e,r));const d=await this.privatePostOrders(this.extend(n,a)),h=this.safeDict(d,"data");return this.parseOrder(h,o)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const a={ids:[e]},o=await this.privateGetOrders(this.extend(a,i)),n=this.safeValue(o,"data"),d=n.length;if(void 0===n)throw new r.OrderNotFound(this.id+" could not found matching order");if(Array.isArray(e)){return this.parseOrders(n,s)[0]}if(0===d)throw new r.OrderNotFound(this.id+" could not found matching order");return this.parseOrder(n[0],s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({states:["wait"]},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({states:["done","cancel"]},s))}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o=this.safeValue(s,"states",["wait","done","cancel"]),n=this.omit(s,"states"),d={market:a.id,states:o,need_price:"True"};void 0!==i&&(d.limit=i);const h=await this.privateGetOrdersFilter(this.extend(d,n)),c=this.safeValue(h,"data",[]);let l=[];for(let e=0;e<c.length;e++){const s=this.safeValue(c[e],"orders",[]),r=this.parseOrderStatus(this.safeValue(c[e],"state")),o=this.parseOrders(s,a,t,i,{status:r});l=this.arrayConcat(l,o)}return l}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,period:this.safeString(this.timeframes,t,t)};void 0!==i&&(o.timestamp=i),void 0!==s&&(o.limit=Math.min(s,1e4));const n=await this.publicPostK(this.extend(o,r)),d=this.safeList(n,"data",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOrder(e,t=void 0){const i=this.parseOrderStatus(this.safeValue(e,"state")),s=this.safeString2(e,"market","market_id"),r=this.safeSymbol(s,t);let a=this.safeTimestamp(e,"created_on");void 0===a&&(a=this.parse8601(this.safeString(e,"created_at")));const o=this.safeString(e,"price"),n=this.safeString(e,"avg_price"),d=this.safeString(e,"volume"),h=this.safeString(e,"remaining_volume"),c=this.safeString(e,"executed_volume");return this.safeOrder({info:e,id:this.safeString(e,"id"),clientOrderId:void 0,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:void 0,symbol:r,type:this.safeValue(e,"ord_type"),timeInForce:void 0,postOnly:void 0,side:this.safeValue(e,"side"),price:o,triggerPrice:void 0,average:n,amount:d,remaining:h,filled:c,status:i,cost:void 0,trades:void 0,fee:void 0},t)}parseOrderStatus(e){return this.safeString({wait:"open",done:"closed",cancel:"canceled"},e,e)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privatePostOrderDelete(this.extend({id:e},i)),r=this.safeDict(s,"data");return this.parseOrder(r)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=await this.privatePostOrderDeleteMulti(this.extend({ids:e},i)),r=this.safeList(s,"data");return this.parseOrders(r)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=await this.privatePostOrdersClear(t),s=this.safeList(i,"data");return this.parseOrders(s)}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.privatePostDepositAddresses(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeDict(a,"data",{}),n=this.safeList(o,"resources",[]),d={};for(let e=0;e<n.length;e++){const t=n[e];if("enabled"===this.safeString(t,"deposit_status")){const e=this.parseDepositAddress(t,i);d[e.currency]=e}}return d}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");this.checkAddress(i);const s=this.safeString(e,"currency_id"),r=this.safeString(e,"chain_name");return{info:e,currency:this.safeCurrencyCode(s,t),network:this.networkIdToCode(r),address:i,tag:this.safeString(e,"memo")}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let d=this.urls.api.rest+"/"+this.version+"/"+this.implodeParams(e,s);const h=this.omit(s,this.extractParams(e));if("public"===t)if("tickers_multi"===e||"order_book/multi"===e){let e="?";const t=this.safeValue(s,"markets");for(let i=0;i<t.length;i++)e+="markets[]="+t[i]+"&";const i=this.safeValue(s,"limit");void 0!==i&&(e+="limit="+i),d+=e}else Object.keys(h).length&&(d+="?"+this.urlencode(h));else if("private"===t){this.checkRequiredCredentials();const e={uid:this.apiKey,data:h};d+="?user_jwt="+(0,n.a)(e,this.encode(this.secret),o.s,!0)}return{url:d,method:i,body:a,headers:{"Content-Type":"application/json"}}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code"),l=this.safeString(n,"message");if(void 0!==c&&"0"!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.codes,c,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"okcoin",name:"OKCoin",countries:["CN","US"],version:"v5",rateLimit:20,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!0,option:void 0,cancelOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchLedger:!0,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:void 0,fetchOrderTrades:!0,fetchPosition:!1,fetchPositions:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTransactions:void 0,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setMargin:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1H","2h":"2H","4h":"4H","6h":"6H","12h":"12H","1d":"1D","1w":"1W","1M":"1M","3M":"3M"},hostname:"okcoin.com",urls:{logo:"https://user-images.githubusercontent.com/51840849/87295551-102fbf00-c50e-11ea-90a9-462eebba5829.jpg",api:{rest:"https://www.{hostname}"},www:"https://www.okcoin.com",doc:"https://www.okcoin.com/docs/en/",fees:"https://www.okcoin.com/coin-fees",referral:"https://www.okcoin.com/account/register?flag=activity&channelId=600001513",test:{rest:"https://testnet.okex.com"}},api:{public:{get:{"market/tickers":1,"market/ticker":1,"market/books":.5,"market/candles":.5,"market/history-candles":.5,"market/trades":.2,"market/history-trades":2,"market/platform-24-volume":10,"market/open-oracle":50,"market/exchange-rate":20,"public/instruments":1,"public/time":2}},private:{get:{"trade/order":1/3,"trade/orders-pending":1/3,"trade/orders-history":.5,"trade/orders-history-archive":.5,"trade/fills":1/3,"trade/fills-history":2.2,"trade/fills-archive":2,"trade/order-algo":1,"trade/orders-algo-pending":1,"trade/orders-algo-history":1,"otc/rfq/trade":4,"otc/rfq/history":4,"account/balance":2,"account/bills":5/3,"account/bills-archive":5/3,"account/config":4,"account/max-size":4,"account/max-avail-size":4,"account/trade-fee":4,"account/max-withdrawal":4,"asset/currencies":5/3,"asset/balances":5/3,"asset/asset-valuation":10,"asset/transfer-state":10,"asset/bills":5/3,"asset/deposit-lightning":5,"asset/deposit-address":5/3,"asset/deposit-history":5/3,"asset/withdrawal-history":5/3,"asset/deposit-withdraw-status":20,"fiat/deposit-history":5/3,"fiat-withdraw-history":5/3,"fiat-channel":5/3,"users/subaccount/list":10,"users/subaccount/apiKey":10,"account/subaccount/balances":10,"asset/subaccount/balances":10,"asset/subaccount/bills":10},post:{"trade/order":1/3,"trade/batch-orders":1/15,"trade/cancel-order":1/3,"trade/cancel-batch-orders":1/15,"trade/amend-order":1/3,"trade/amend-batch-orders":1/150,"trade/order-algo":1,"trade/cancel-algos":1,"trade/cancel-advance-algos":1,"otc/rfq/quote":4,"otc/rfq/trade":4,"asset/transfer":4,"asset/withdrawal":4,"asset/withdrawal-lightning":4,"asset/withdrawal-cancel":4,"fiat/deposit":5/3,"fiat/cancel-deposit":5/3,"fiat/withdrawal":5/3,"fiat/cancel-withdrawal":5/3,"asset/subaccount/transfer":10}}},features:{spot:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerDirection:!0,triggerPriceType:{last:!0,mark:!1,index:!1},stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!1,index:!1},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:90,untilDays:90,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!0,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!0,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:90,daysBackCanceled:1/12,untilDays:90,trigger:!0,trailing:!0,symbolRequired:!1},fetchOHLCV:{limit:100}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},fees:{trading:{taker:.002,maker:.001},spot:{taker:.0015,maker:.001}},requiredCredentials:{apiKey:!0,secret:!0,password:!0},exceptions:{exact:{1:r.ExchangeError,2:r.ExchangeError,5e4:r.BadRequest,50001:r.OnMaintenance,50002:r.BadRequest,50004:r.RequestTimeout,50005:r.ExchangeNotAvailable,50006:r.BadRequest,50007:r.AccountSuspended,50008:r.AuthenticationError,50009:r.AccountSuspended,50010:r.ExchangeError,50011:r.RateLimitExceeded,50012:r.ExchangeError,50013:r.ExchangeNotAvailable,50014:r.BadRequest,50015:r.ExchangeError,50016:r.ExchangeError,50017:r.ExchangeError,50018:r.ExchangeError,50019:r.ExchangeError,50020:r.ExchangeError,50021:r.ExchangeError,50022:r.ExchangeError,50023:r.ExchangeError,50024:r.BadRequest,50025:r.ExchangeError,50026:r.ExchangeNotAvailable,50027:r.PermissionDenied,50028:r.ExchangeError,50029:r.ExchangeError,50030:r.PermissionDenied,50032:r.AccountSuspended,50033:r.AccountSuspended,50035:r.BadRequest,50036:r.BadRequest,50037:r.BadRequest,50038:r.ExchangeError,50039:r.ExchangeError,50041:r.ExchangeError,50044:r.BadRequest,50100:r.ExchangeError,50101:r.AuthenticationError,50102:r.InvalidNonce,50103:r.AuthenticationError,50104:r.AuthenticationError,50105:r.AuthenticationError,50106:r.AuthenticationError,50107:r.AuthenticationError,50108:r.ExchangeError,50109:r.ExchangeError,50110:r.PermissionDenied,50111:r.AuthenticationError,50112:r.AuthenticationError,50113:r.AuthenticationError,50114:r.AuthenticationError,50115:r.BadRequest,51e3:r.BadRequest,51001:r.BadSymbol,51002:r.BadSymbol,51003:r.BadRequest,51004:r.InvalidOrder,51005:r.InvalidOrder,51006:r.InvalidOrder,51007:r.InvalidOrder,51008:r.InsufficientFunds,51009:r.AccountSuspended,51010:r.AccountNotEnabled,51011:r.InvalidOrder,51012:r.BadSymbol,51014:r.BadSymbol,51015:r.BadSymbol,51016:r.InvalidOrder,51017:r.ExchangeError,51018:r.ExchangeError,51019:r.ExchangeError,51020:r.InvalidOrder,51023:r.ExchangeError,51024:r.AccountSuspended,51025:r.ExchangeError,51026:r.BadSymbol,51030:r.InvalidOrder,51031:r.InvalidOrder,51032:r.InvalidOrder,51033:r.InvalidOrder,51037:r.InvalidOrder,51038:r.InvalidOrder,51044:r.InvalidOrder,51046:r.InvalidOrder,51047:r.InvalidOrder,51048:r.InvalidOrder,51049:r.InvalidOrder,51050:r.InvalidOrder,51051:r.InvalidOrder,51052:r.InvalidOrder,51053:r.InvalidOrder,51054:r.BadRequest,51056:r.InvalidOrder,51058:r.InvalidOrder,51059:r.InvalidOrder,51100:r.InvalidOrder,51102:r.InvalidOrder,51103:r.InvalidOrder,51108:r.InvalidOrder,51109:r.InvalidOrder,51110:r.InvalidOrder,51111:r.BadRequest,51112:r.InvalidOrder,51113:r.RateLimitExceeded,51115:r.InvalidOrder,51116:r.InvalidOrder,51117:r.InvalidOrder,51118:r.InvalidOrder,51119:r.InsufficientFunds,51120:r.InvalidOrder,51121:r.InvalidOrder,51122:r.InvalidOrder,51124:r.InvalidOrder,51125:r.InvalidOrder,51126:r.InvalidOrder,51127:r.InsufficientFunds,51128:r.InvalidOrder,51129:r.InvalidOrder,51130:r.BadSymbol,51131:r.InsufficientFunds,51132:r.InvalidOrder,51133:r.InvalidOrder,51134:r.InvalidOrder,51135:r.InvalidOrder,51136:r.InvalidOrder,51137:r.InvalidOrder,51138:r.InvalidOrder,51139:r.InvalidOrder,51156:r.BadRequest,51159:r.BadRequest,51162:r.InvalidOrder,51163:r.InvalidOrder,51166:r.InvalidOrder,51174:r.InvalidOrder,51201:r.InvalidOrder,51202:r.InvalidOrder,51203:r.InvalidOrder,51204:r.InvalidOrder,51205:r.InvalidOrder,51250:r.InvalidOrder,51251:r.InvalidOrder,51252:r.InvalidOrder,51253:r.InvalidOrder,51254:r.InvalidOrder,51255:r.InvalidOrder,51256:r.InvalidOrder,51257:r.InvalidOrder,51258:r.InvalidOrder,51259:r.InvalidOrder,51260:r.InvalidOrder,51261:r.InvalidOrder,51262:r.InvalidOrder,51263:r.InvalidOrder,51264:r.InvalidOrder,51265:r.InvalidOrder,51267:r.InvalidOrder,51268:r.InvalidOrder,51269:r.InvalidOrder,51270:r.InvalidOrder,51271:r.InvalidOrder,51272:r.InvalidOrder,51273:r.InvalidOrder,51274:r.InvalidOrder,51275:r.InvalidOrder,51276:r.InvalidOrder,51277:r.InvalidOrder,51278:r.InvalidOrder,51279:r.InvalidOrder,51280:r.InvalidOrder,51321:r.InvalidOrder,51322:r.InvalidOrder,51323:r.BadRequest,51324:r.BadRequest,51325:r.InvalidOrder,51327:r.InvalidOrder,51328:r.InvalidOrder,51329:r.InvalidOrder,51330:r.InvalidOrder,51400:r.OrderNotFound,51401:r.OrderNotFound,51402:r.OrderNotFound,51403:r.InvalidOrder,51404:r.InvalidOrder,51405:r.ExchangeError,51406:r.ExchangeError,51407:r.BadRequest,51408:r.ExchangeError,51409:r.ExchangeError,51410:r.CancelPending,51500:r.ExchangeError,51501:r.ExchangeError,51502:r.InsufficientFunds,51503:r.ExchangeError,51506:r.ExchangeError,51508:r.ExchangeError,51509:r.ExchangeError,51510:r.ExchangeError,51511:r.ExchangeError,51600:r.ExchangeError,51601:r.ExchangeError,51602:r.ExchangeError,51603:r.OrderNotFound,51732:r.AuthenticationError,51733:r.AuthenticationError,51734:r.AuthenticationError,51735:r.ExchangeError,51736:r.InsufficientFunds,52e3:r.ExchangeError,54e3:r.ExchangeError,54001:r.ExchangeError,58e3:r.ExchangeError,58001:r.AuthenticationError,58002:r.PermissionDenied,58003:r.ExchangeError,58004:r.AccountSuspended,58005:r.ExchangeError,58006:r.ExchangeError,58007:r.ExchangeError,58100:r.ExchangeError,58101:r.AccountSuspended,58102:r.RateLimitExceeded,58103:r.ExchangeError,58104:r.ExchangeError,58105:r.ExchangeError,58106:r.ExchangeError,58107:r.ExchangeError,58108:r.ExchangeError,58109:r.ExchangeError,58110:r.ExchangeError,58111:r.ExchangeError,58112:r.ExchangeError,58114:r.ExchangeError,58115:r.ExchangeError,58116:r.ExchangeError,58117:r.ExchangeError,58125:r.BadRequest,58126:r.BadRequest,58127:r.BadRequest,58128:r.BadRequest,58200:r.ExchangeError,58201:r.ExchangeError,58202:r.ExchangeError,58203:r.InvalidAddress,58204:r.AccountSuspended,58205:r.ExchangeError,58206:r.ExchangeError,58207:r.InvalidAddress,58208:r.ExchangeError,58209:r.ExchangeError,58210:r.ExchangeError,58211:r.ExchangeError,58212:r.ExchangeError,58213:r.AuthenticationError,58221:r.BadRequest,58222:r.BadRequest,58224:r.BadRequest,58227:r.BadRequest,58228:r.BadRequest,58229:r.InsufficientFunds,58300:r.ExchangeError,58350:r.InsufficientFunds,59e3:r.ExchangeError,59001:r.ExchangeError,59100:r.ExchangeError,59101:r.ExchangeError,59102:r.ExchangeError,59103:r.InsufficientFunds,59104:r.ExchangeError,59105:r.ExchangeError,59106:r.ExchangeError,59107:r.ExchangeError,59108:r.InsufficientFunds,59109:r.ExchangeError,59128:r.InvalidOrder,59200:r.InsufficientFunds,59201:r.InsufficientFunds,59216:r.BadRequest,59300:r.ExchangeError,59301:r.ExchangeError,59313:r.ExchangeError,59401:r.ExchangeError,59500:r.ExchangeError,59501:r.ExchangeError,59502:r.ExchangeError,59503:r.ExchangeError,59504:r.ExchangeError,59505:r.ExchangeError,59506:r.ExchangeError,59507:r.ExchangeError,59508:r.AccountSuspended,60001:r.AuthenticationError,60002:r.AuthenticationError,60003:r.AuthenticationError,60004:r.AuthenticationError,60005:r.AuthenticationError,60006:r.InvalidNonce,60007:r.AuthenticationError,60008:r.AuthenticationError,60009:r.AuthenticationError,60010:r.AuthenticationError,60011:r.AuthenticationError,60012:r.BadRequest,60013:r.BadRequest,60014:r.RateLimitExceeded,60015:r.NetworkError,60016:r.ExchangeNotAvailable,60017:r.BadRequest,60018:r.BadRequest,60019:r.BadRequest,63999:r.ExchangeError,70010:r.BadRequest,70013:r.BadRequest,70016:r.BadRequest},broad:{"Internal Server Error":r.ExchangeNotAvailable,"server error":r.ExchangeNotAvailable}},precisionMode:o.kb,options:{fetchOHLCV:{type:"Candles"},createMarketBuyOrderRequiresPrice:!0,fetchMarkets:["spot"],defaultType:"spot",accountsByType:{classic:"1",spot:"1",funding:"6",main:"6",unified:"18"},accountsById:{1:"spot",6:"funding",18:"unified"},auth:{time:"public",currencies:"private",instruments:"public",rate:"public","{instrument_id}/constituents":"public"},warnOnFetchCurrenciesWithoutAuthorization:!1,defaultNetwork:"ERC20",networks:{ERC20:"Ethereum",BTC:"Bitcoin",OMNI:"Omni",TRC20:"TRON"}},commonCurrencies:{AE:"AET",BOX:"DefiBox",HOT:"Hydro Protocol",HSR:"HC",MAG:"Maggie",SBTC:"Super Bitcoin",TRADE:"Unitrade",YOYO:"YOYOW",WIN:"WinToken"}})}async fetchTime(e={}){const t=await this.publicGetPublicTime(e),i=this.safeList(t,"data"),s=this.safeDict(i,0);return this.safeInteger(s,"ts")}async fetchMarkets(e={}){const t=await this.publicGetPublicInstruments(this.extend({instType:"SPOT"},e)),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"instId");let i=this.safeStringLower(e,"instType");"futures"===i&&(i="future");const s="spot"===i,r="swap"===i||"future"===i||"option"===i,o=this.safeString(e,"baseCcy"),n=this.safeString(e,"quoteCcy"),d=this.safeCurrencyCode(o),h=this.safeCurrencyCode(n),c=d+"/"+h,l=this.safeString(e,"tickSz"),u=this.safeValue2(this.fees,i,"trading",{});let f=this.safeString(e,"lever","1");f=a.Y.stringMax(f,"1");const p=this.safeNumber(e,"maxMktSz");return this.extend(u,{id:t,symbol:c,base:d,quote:h,settle:void 0,baseId:o,quoteId:n,settleId:void 0,type:i,spot:s,margin:s&&a.Y.stringGt(f,"1"),swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:r?this.safeNumber(e,"ctVal"):void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,created:this.safeInteger(e,"listTime"),precision:{amount:this.safeNumber(e,"lotSz"),price:this.parseNumber(l)},limits:{leverage:{min:this.parseNumber("1"),max:this.parseNumber(f)},amount:{min:this.safeNumber(e,"minSz"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:r?void 0:p}},info:e})}async fetchCurrencies(e={}){if(this.checkRequiredCredentials(!1)){const t=await this.privateGetAssetCurrencies(e),i=this.safeValue(t,"data",[]),s={},r=this.groupBy(i,"ccy"),o=Object.keys(r);for(let e=0;e<o.length;e++){const t=o[e],i=this.safeCurrency(t).code,n=r[t],d={};let h,c=!1,l=!1,u=!1;for(let e=0;e<n.length;e++){const t=n[e],i=this.safeValue(t,"canDep");l=i||l;const s=this.safeValue(t,"canWd");u=s||u;const r=this.safeValue(t,"canInternal"),o=!!(i&&s&&r);c=o||c;const f=this.safeString(t,"chain");if(void 0!==f&&f.indexOf("-")>=0){const e=f.split("-"),r=this.safeString(e,1,f),n=this.networkIdToCode(r),c=this.parsePrecision(this.safeString(t,"wdTickSz"));h=void 0===h?c:a.Y.stringMin(h,c),d[n]={id:f,network:n,active:o,deposit:i,withdraw:s,fee:this.safeNumber(t,"minFee"),precision:this.parseNumber(c),limits:{withdraw:{min:this.safeNumber(t,"minWd"),max:this.safeNumber(t,"maxWd")}},info:t}}}const f=this.safeValue(n,0);s[i]={info:n,code:i,id:t,name:this.safeString(f,"name"),active:c,deposit:l,withdraw:u,fee:void 0,precision:this.parseNumber(h),limits:{amount:{min:void 0,max:void 0}},networks:d}}return s}if(this.options.warnOnFetchCurrenciesWithoutAuthorization)throw new r.ExchangeError(this.id+' fetchCurrencies() is a private API endpoint that requires authentication with API keys. Set the API keys on the exchange instance or exchange.options["warnOnFetchCurrenciesWithoutAuthorization"] = false to suppress this warning message.')}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={instId:this.market(e).id};void 0!==(t=void 0===t?20:t)&&(s.sz=t);const r=await this.publicGetMarketBooks(this.extend(s,i)),a=this.safeValue(r,"data",[]),o=this.safeValue(a,0,{}),n=this.safeInteger(o,"ts");return this.parseOrderBook(o,e,n)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,a=this.safeString(e,"last"),o=this.safeString(e,"open24h"),n=this.safeBool(t,"spot",!1)?this.safeString(e,"volCcy24h"):void 0,d=this.safeString(e,"vol24h"),h=this.safeString(e,"high24h"),c=this.safeString(e,"low24h");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:h,low:c,bid:this.safeString(e,"bidPx"),bidVolume:this.safeString(e,"bidSz"),ask:this.safeString(e,"askPx"),askVolume:this.safeString(e,"askSz"),vwap:void 0,open:o,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:d,quoteVolume:n,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.publicGetMarketTicker(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.safeValue(a,0,{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){e=this.marketSymbols(e);const i=await this.publicGetMarketTickers(this.extend({instType:"SPOT"},t)),s=this.safeList(i,"data",[]);return this.parseTickers(s,e,t)}parseTrade(e,t=void 0){const i=this.safeString(e,"tradeId"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,o=this.safeInteger(e,"ts"),n=this.safeString2(e,"fillPx","px"),d=this.safeString2(e,"fillSz","sz"),h=this.safeString(e,"side"),c=this.safeString(e,"ordId"),l=this.safeString(e,"fee");let u;if(void 0!==l){const t=a.Y.stringNeg(l),i=this.safeString(e,"feeCcy");u={cost:t,currency:this.safeCurrencyCode(i)}}let f=this.safeString(e,"execType");return"T"===f?f="taker":"M"===f&&(f="maker"),this.safeTrade({info:e,timestamp:o,datetime:this.iso8601(o),symbol:r,id:i,order:c,type:void 0,takerOrMaker:f,side:h,price:n,amount:d,cost:void 0,fee:u},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);(void 0===i||i>100)&&(i=100);const a={instId:r.id};let o,n;[o,s]=this.handleOptionAndParams(s,"fetchTrades","method","publicGetMarketTrades"),n="publicGetMarketTrades"===o?await this.publicGetMarketTrades(this.extend(a,s)):await this.publicGetMarketHistoryTrades(this.extend(a,s));const d=this.safeList(n,"data",[]);return this.parseTrades(d,r,t,i)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.parseTimeframe(t),n=this.safeValue(this.options,"fetchOHLCV",{});let d=this.safeString(this.timeframes,t,t);const h=this.safeString(n,"timezone","UTC");"UTC"===h&&o>=21600&&(d+=h.toLowerCase());const c={instId:a.id,bar:d};let l,u;void 0!==s&&(c.limit=s),[l,r]=this.handleOptionAndParams(r,"fetchOHLCV","method","publicGetMarketCandles"),u="publicGetMarketCandles"===l?await this.publicGetMarketCandles(this.extend(c,r)):await this.publicGetMarketHistoryCandles(this.extend(c,r));const f=this.safeList(u,"data",[]);return this.parseOHLCVs(f,a,t,i,s)}parseAccountBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"balance"),o.used=this.safeString(s,"hold"),o.free=this.safeString(s,"available"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const[t,i]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),s={};let r;return r="funding"===t?await this.privateGetAssetBalances(this.extend(s,i)):await this.privateGetAccountBalance(this.extend(s,i)),"funding"===t?this.parseFundingBalance(r):this.parseTradingBalance(r)}parseTradingBalance(e){const t={info:e},i=this.safeValue(e,"data",[]),s=this.safeValue(i,0,{}),r=this.safeInteger(s,"uTime"),a=this.safeValue(s,"details",[]);for(let e=0;e<a.length;e++){const i=a[e],s=this.safeString(i,"ccy"),r=this.safeCurrencyCode(s),o=this.account(),n=this.safeString(i,"eq"),d=this.safeString(i,"availEq");void 0===n||void 0===d?(o.free=this.safeString(i,"availBal"),o.used=this.safeString(i,"frozenBal")):(o.total=n,o.free=d),t[r]=o}return t.timestamp=r,t.datetime=this.iso8601(r),this.safeBalance(t)}parseFundingBalance(e){const t={info:e},i=this.safeValue(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"ccy"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"bal"),o.free=this.safeString(s,"availBal"),o.used=this.safeString(s,"frozenBal"),t[a]=o}return this.safeBalance(t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return i.createMarketBuyOrderRequiresPrice=!1,i.tgtCcy="quote_ccy",await this.createOrder(e,"market","buy",t,void 0,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);let d=this.createOrderRequest(e,t,i,s,a,o),h=this.safeString(this.options,"createOrder","privatePostTradeBatchOrders");const c=this.safeString(d,"ordType");let l;if("trigger"!==c&&"conditional"!==c&&"oco"!==t&&"move_order_stop"!==t&&"iceberg"!==t&&"twap"!==t||(h="privatePostTradeOrderAlgo"),"privatePostTradeBatchOrders"===h&&(d=[d]),"privatePostTradeOrder"===h)l=await this.privatePostTradeOrder(d);else if("privatePostTradeOrderAlgo"===h)l=await this.privatePostTradeOrderAlgo(d);else{if("privatePostTradeBatchOrders"!==h)throw new r.ExchangeError(this.id+' createOrder() this.options["createOrder"] must be either privatePostTradeBatchOrders or privatePostTradeOrder or privatePostTradeOrderAlgo');l=await this.privatePostTradeBatchOrders(d)}const u=this.safeValue(l,"data",[]),f=this.safeValue(u,0),p=this.parseOrder(f,n);return p.type=t,p.side=i,p}createOrderRequest(e,t,i,s,o=void 0,n={}){const d=this.market(e),h={instId:d.id,side:i,ordType:t},c=this.safeValueN(n,["triggerPrice","stopPrice","triggerPx"]),l=this.safeString(n,"timeInForce","GTC"),u=this.safeValue2(n,"takeProfitPrice","tpTriggerPx"),f=this.safeValue(n,"tpOrdPx",o),p=this.safeString(n,"tpTriggerPxType","last"),m=this.safeValue2(n,"stopLossPrice","slTriggerPx"),g=this.safeValue(n,"slOrdPx",o),v=this.safeString(n,"slTriggerPxType","last"),y=this.safeString2(n,"clOrdId","clientOrderId"),w=this.safeValue(n,"stopLoss"),b=void 0!==w,k=this.safeValue(n,"takeProfit"),S=void 0!==k,O=this.safeString2(this.options,"defaultMarginMode","marginMode","cross");let T=this.safeString2(n,"marginMode","tdMode"),P=!1;if(void 0!==T&&"cash"!==T?P=!0:(T=O,P=this.safeBool(n,"margin",!1)),P){const e="buy"===i?d.quote:d.base,t=this.safeString(n,"ccy",e);h.ccy=this.safeCurrencyCode(t)}const I=P?T:"cash";h.tdMode=I;const M="market"===t;let x=!1;[x,n]=this.handlePostOnly(M,"post_only"===t,n),n=this.omit(n,["currency","ccy","marginMode","timeInForce","stopPrice","triggerPrice","clientOrderId","stopLossPrice","takeProfitPrice","slOrdPx","tpOrdPx","margin","stopLoss","takeProfit"]);const A="IOC"===l||"ioc"===t,C="FOK"===l||"fok"===t,B=void 0!==c||"trigger"===t,_=void 0!==m||void 0!==u||"conditional"===t,E=M&&A||"optimal_limit_ioc"===t,N=this.safeString(this.options,"tgtCcy","base_ccy"),R=this.safeString(n,"tgtCcy",N);if(P||(h.tgtCcy=R),M||E)if(h.ordType="market","buy"===i)if("quote_ccy"===R){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber2(n,"cost","sz");if(n=this.omit(n,["cost","sz"]),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);h.sz=t}else h.sz=this.amountToPrecision(e,s);else h.sz=this.amountToPrecision(e,s);else h.sz=this.amountToPrecision(e,s),B||_||(h.px=this.priceToPrecision(e,o));if(x)h.ordType="post_only";else if(A&&!E)h.ordType="ioc";else if(C)h.ordType="fok";else if(b||S){if(b){const t=this.safeValueN(w,["triggerPrice","stopPrice","slTriggerPx"]);if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"] for a stop loss order');h.slTriggerPx=this.priceToPrecision(e,t);const i=this.safeValueN(w,["price","stopLossPrice","slOrdPx"]),s=this.safeString(w,"type");if(void 0!==s){const t="limit"===s;if(!t&&!("market"===s))throw new r.InvalidOrder(this.id+' createOrder() params["stopLoss"]["type"] must be either "limit" or "market"');if(t){if(void 0===i)throw new r.InvalidOrder(this.id+' createOrder() requires a limit price in params["stopLoss"]["price"] for a stop loss limit order');h.slOrdPx=this.priceToPrecision(e,i)}else"market"===s&&(h.slOrdPx="-1")}else h.slOrdPx=void 0!==i?this.priceToPrecision(e,i):"-1";const a=this.safeString2(w,"triggerPriceType","slTriggerPxType","last");if(void 0!==a){if("last"!==a&&"index"!==a&&"mark"!==a)throw new r.InvalidOrder(this.id+' createOrder() stop loss trigger price type must be one of "last", "index" or "mark"');h.slTriggerPxType=a}}if(S){const t=this.safeValueN(k,["triggerPrice","stopPrice","tpTriggerPx"]);if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["takeProfit"]["triggerPrice"], or params["takeProfit"]["stopPrice"], or params["takeProfit"]["tpTriggerPx"] for a take profit order');h.tpTriggerPx=this.priceToPrecision(e,t);const i=this.safeValueN(k,["price","takeProfitPrice","tpOrdPx"]),s=this.safeString(k,"type");if(void 0!==s){const t="limit"===s;if(!t&&!("market"===s))throw new r.InvalidOrder(this.id+' createOrder() params["takeProfit"]["type"] must be either "limit" or "market"');if(t){if(void 0===i)throw new r.InvalidOrder(this.id+' createOrder() requires a limit price in params["takeProfit"]["price"] or params["takeProfit"]["tpOrdPx"] for a take profit limit order');h.tpOrdPx=this.priceToPrecision(e,i)}else"market"===s&&(h.tpOrdPx="-1")}else h.tpOrdPx=void 0!==i?this.priceToPrecision(e,i):"-1";const a=this.safeString2(k,"triggerPriceType","tpTriggerPxType","last");if(void 0!==a){if("last"!==a&&"index"!==a&&"mark"!==a)throw new r.InvalidOrder(this.id+' createOrder() take profit trigger price type must be one of "last", "index" or "mark"');h.tpTriggerPxType=a}}}else if(B)h.ordType="trigger",h.triggerPx=this.priceToPrecision(e,c),h.orderPx=M?"-1":this.priceToPrecision(e,o);else if(_){h.ordType="conditional";void 0!==u&&void 0!==m&&(h.ordType="oco"),void 0!==u&&(h.tpTriggerPx=this.priceToPrecision(e,u),h.tpOrdPx=void 0===f?"-1":this.priceToPrecision(e,f),h.tpTriggerPxType=p),void 0!==m&&(h.slTriggerPx=this.priceToPrecision(e,m),h.slOrdPx=void 0===g?"-1":this.priceToPrecision(e,g),h.slTriggerPxType=v)}if(void 0===y){const e=this.safeString(this.options,"brokerId");void 0!==e&&(h.clOrdId=e+this.uuid16(),h.tag=e)}else h.clOrdId=y,n=this.omit(n,["clOrdId","clientOrderId"]);return this.extend(h,n)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.safeValue2(i,"stop","trigger"),a=this.safeValue(i,"advanced");if(s||a){const s=await this.cancelOrders([e],t,i);return this.safeValue(s,0)}const o=this.market(t),n={instId:o.id},d=this.safeString2(i,"clOrdId","clientOrderId");void 0!==d?n.clOrdId=d:n.ordId=e.toString();const h=this.omit(i,["clOrdId","clientOrderId"]),c=await this.privatePostTradeCancelOrder(this.extend(n,h)),l=this.safeValue(c,"data",[]),u=this.safeDict(l,0);return this.parseOrder(u,o)}parseIds(e){return"string"==typeof e?e.split(","):e}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.safeValue2(i,"stop","trigger"),a=this.safeValue(i,"advanced");i=this.omit(i,["stop","trigger","advanced"]);const o=this.market(t),n=[],d=this.parseIds(this.safeValue2(i,"clOrdId","clientOrderId")),h=this.parseIds(this.safeValue(i,"algoId"));if(void 0===d){if(e=this.parseIds(e),void 0!==h)for(let e=0;e<h.length;e++)n.push({algoId:h[e],instId:o.id});for(let t=0;t<e.length;t++)s||a?n.push({algoId:e[t],instId:o.id}):n.push({ordId:e[t],instId:o.id})}else for(let e=0;e<d.length;e++)n.push({instId:o.id,clOrdId:d[e]});let c;c=s?await this.privatePostTradeCancelAlgos(n):a?await this.privatePostTradeCancelAdvanceAlgos(n):await this.privatePostTradeCancelBatchOrders(n);const l=this.safeList(c,"data",[]);return this.parseOrders(l,o,void 0,void 0,i)}parseOrderStatus(e){return this.safeString({canceled:"canceled",live:"open",partially_filled:"open",filled:"closed",effective:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString2(e,"algoId","ordId"),s=this.safeInteger(e,"cTime"),r=this.safeInteger(e,"uTime"),o=this.safeInteger(e,"fillTime"),n=this.safeString(e,"side");let d,h,c=this.safeString(e,"ordType");"post_only"===c?(d=!0,c="limit"):"fok"===c?(h="FOK",c="limit"):"ioc"===c&&(h="IOC",c="limit");const l=this.safeString(e,"instId");t=this.safeMarket(l,t);const u=this.safeSymbol(l,t,"-"),f=this.safeString(e,"accFillSz"),p=this.safeString2(e,"px","ordPx"),m=this.safeString(e,"avgPx"),g=this.parseOrderStatus(this.safeString(e,"state")),v=this.safeString(e,"fee");let y,w;const b=this.safeString(this.options,"tgtCcy","base_ccy"),k=this.safeString(e,"tgtCcy",b);let S;if("buy"===n&&"market"===c&&"quote_ccy"===k?w=this.safeString(e,"sz"):y=this.safeString(e,"sz"),void 0!==v){const t=a.Y.stringNeg(v),i=this.safeString(e,"feeCcy"),s=this.safeCurrencyCode(i);S={cost:this.parseNumber(t),currency:s}}let O=this.safeString(e,"clOrdId");void 0!==O&&O.length<1&&(O=void 0);const T=this.safeNumber2(e,"slTriggerPx","slOrdPx"),P=this.safeNumber2(e,"tpTriggerPx","tpOrdPx"),I=this.safeString(e,"reduceOnly");let M=!1;return void 0!==M&&(M="true"===I),this.safeOrder({info:e,id:i,clientOrderId:O,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:o,lastUpdateTimestamp:r,symbol:u,type:c,timeInForce:h,postOnly:d,side:n,price:p,stopLossPrice:T,takeProfitPrice:P,triggerPrice:this.safeNumberN(e,["triggerPx","moveTriggerPx"]),average:m,cost:w,amount:y,filled:f,remaining:void 0,status:g,fee:S,trades:void 0,reduceOnly:M},t)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s={instId:this.market(t).id},a=this.safeString2(i,"clOrdId","clientOrderId"),o=this.safeValue2(i,"stop","trigger");o?void 0!==a?s.algoClOrdId=a:s.algoId=e:void 0!==a?s.clOrdId=a:s.ordId=e;const n=this.omit(i,["clientOrderId","stop","trigger"]);let d;d=o?await this.privateGetTradeOrderAlgo(this.extend(s,n)):await this.privateGetTradeOrder(this.extend(s,n));const h=this.safeValue(d,"data",[]),c=this.safeDict(h,0);return this.parseOrder(c)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.instId=a.id),void 0!==i&&(r.limit=i);const o=this.safeString(s,"ordType"),n=this.safeValue(s,"stop")||void 0!==this.safeString(s,"ordType");let d;n&&void 0===o&&(r.ordType="trigger"),s=this.omit(s,["stop"]),d=n?await this.privateGetTradeOrdersAlgoPending(this.extend(r,s)):await this.privateGetTradeOrdersPending(this.extend(r,s));const h=this.safeList(d,"data",[]);return this.parseOrders(h,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={instType:"SPOT"};let a;void 0!==e&&(a=this.market(e),r.instId=a.id);const o=this.safeString(s,"ordType"),n=this.safeValue(s,"stop")||void 0!==this.safeString(s,"ordType");let d;if(n&&void 0===o&&(r.ordType="trigger"),s=this.omit(s,["stop"]),n)d=await this.privateGetTradeOrdersAlgoHistory(this.extend(r,s));else{let e;[e,s]=this.handleOptionAndParams(s,"fetchClosedOrders","method","privateGetTradeOrdersHistory"),d="privateGetTradeOrdersHistory"===e?await this.privateGetTradeOrdersHistory(this.extend(r,s)):await this.privateGetTradeOrdersHistoryArchive(this.extend(r,s))}const h=this.safeList(d,"data",[]);return this.parseOrders(h,a,t,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"addr");let s=this.safeStringN(e,["tag","pmtId","memo"]);if(void 0===s){const t=this.safeValue(e,"addrEx",{});s=this.safeString(t,"comment")}const r=this.safeString(e,"ccy"),a=(t=this.safeCurrency(r,t)).code,o=this.safeString(e,"chain").replace(r+"-",""),n=this.networkIdToCode(o);return this.checkAddress(i),{info:e,currency:a,network:n,address:i,tag:s}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.safeString(this.options,"defaultNetwork","ERC20"),s=this.safeString(t,"network",i),a=this.networkIdToCode(s);t=this.omit(t,"network");const o=await this.fetchDepositAddressesByNetwork(e,t),n=this.safeValue(o,a);if(void 0===n)throw new r.InvalidAddress(this.id+" fetchDepositAddress() cannot find "+a+" deposit address for "+e);return n}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={ccy:i.id},r=await this.privateGetAssetDepositAddress(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.filterBy(a,"selected",!0),n=this.parseDepositAddresses(o,[i.code],!1);return this.indexBy(n,"network")}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h={ccy:a.id,amt:this.currencyToPrecision(e,t),type:"0",from:n,to:d};"master"===n?(h.type="1",h.subAcct=d,h.from=this.safeString(r,"from","6"),h.to=this.safeString(r,"to","6")):"master"===d&&(h.type="2",h.subAcct=n,h.from=this.safeString(r,"from","6"),h.to=this.safeString(r,"to","6"));const c=await this.privatePostAssetTransfer(this.extend(h,r)),l=this.safeValue(c,"data",[]),u=this.safeDict(l,0,{});return this.parseTransfer(u,a)}parseTransfer(e,t=void 0){const i=this.safeString2(e,"transId","billId"),s=this.safeString(e,"ccy"),r=this.safeCurrencyCode(s,t);let o=this.safeNumber(e,"amt");const n=this.safeString(e,"from"),d=this.safeString(e,"to"),h=this.safeValue(this.options,"accountsById",{}),c=this.safeInteger(e,"ts",this.milliseconds()),l=this.safeString(e,"sz");return void 0!==l&&(o=this.parseNumber(a.Y.stringAbs(l))),{info:e,id:i,timestamp:c,datetime:this.iso8601(c),currency:r,amount:o,fromAccount:this.safeString(h,n),toAccount:this.safeString(h,d),status:this.parseTransferStatus(this.safeString(e,"state"))}}parseTransferStatus(e){return this.safeString({success:"ok"},e,e)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);void 0!==s&&s.length>0&&(i=i+":"+s);const n={ccy:o.id,toAddr:i,dest:"4",amt:this.numberToString(t)};let d=this.safeString(a,"network");if(void 0!==d){const e=this.safeValue(this.options,"networks",{});d=this.safeString(e,d.toUpperCase(),d),n.chain=o.id+"-"+d,a=this.omit(a,"network")}let h=this.safeString(a,"fee");if(void 0===h){const e=this.safeValue(o.networks,this.networkIdToCode(d),{});if(h=this.safeString(e,"fee"),void 0===h)throw new r.ArgumentsRequired(this.id+' withdraw() requires a "fee" string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set "0". Withdrawing to external digital asset address requires network transaction fee.')}n.fee=this.numberToString(h);const c=await this.privatePostAssetWithdrawal(this.extend(n,a)),l=this.safeValue(c,"data",[]),u=this.safeDict(l,0);return this.parseTransaction(u,o)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a={};void 0!==e&&(r=this.currency(e),a.ccy=r.id),void 0!==t&&(a.before=Math.max(t-1,0)),void 0!==i&&(a.limit=i),[a,s]=this.handleUntilOption("after",a,s);const o=await this.privateGetAssetDepositHistory(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,r,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a={};void 0!==e&&(r=this.currency(e),a.ccy=r.id),void 0!==t&&(a.before=Math.max(t-1,0)),void 0!==i&&(a.limit=i),[a,s]=this.handleUntilOption("after",a,s);const o=await this.privateGetAssetWithdrawalHistory(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTransactions(n,r,t,i,s)}parseTransactionStatus(e){return this.safeString({"-3":"pending","-2":"canceled","-1":"failed",0:"pending",1:"pending",2:"ok",3:"pending",4:"pending",5:"pending"},e,e)}parseTransaction(e,t=void 0){let i,s;const r=this.safeString(e,"wdId"),a=this.safeString(e,"from"),o=this.safeString(e,"to"),n=o;let d=this.safeString2(e,"tag","memo");d=this.safeString2(e,"pmtId",d),void 0!==r?(i="withdrawal",s=r):(s=this.safeString(e,"depId"),i="deposit");const h=this.safeString(e,"ccy"),c=this.safeCurrencyCode(h),l=this.safeNumber(e,"amt"),u=this.parseTransactionStatus(this.safeString(e,"state")),f=this.safeString(e,"txId"),p=this.safeInteger(e,"ts");let m;return m="deposit"===i?0:this.safeNumber(e,"fee"),{info:e,id:s,currency:c,amount:l,network:void 0,addressFrom:a,addressTo:o,address:n,tagFrom:void 0,tagTo:d,tag:d,status:u,type:i,updated:void 0,txid:f,timestamp:p,datetime:this.iso8601(p),comment:void 0,internal:void 0,fee:{currency:c,cost:m}}}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={instType:"SPOT"};let a,o,n;void 0!==i&&i>100&&(i=100),void 0!==e&&(a=this.market(e),r.instId=a.id),[o,s]=this.handleOptionAndParams(s,"fetchMyTrades","method","privateGetTradeFillsHistory"),n="privateGetTradeFillsHistory"===o?await this.privateGetTradeFillsHistory(this.extend(r,s)):await this.privateGetTradeFills(this.extend(r,s));const d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a={order_id:e};return await this.fetchMyTrades(t,i,s,this.extend(a,r))}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),[r,s]=this.handleOptionAndParams(s,"fetchLedger","method","privateGetAccountBills");let a,o,n={};void 0!==i&&(n.limit=i),void 0!==e&&(a=this.currency(e),n.ccy=a.id),[n,s]=this.handleUntilOption("end",n,s),o="privateGetAccountBillsArchive"===r?await this.privateGetAccountBillsArchive(this.extend(n,s)):"privateGetAssetBills"===r?await this.privateGetAssetBills(this.extend(n,s)):await this.privateGetAccountBills(this.extend(n,s));const d=this.safeValue(o,"data",[]);return this.parseLedger(d,a,t,i)}parseLedgerEntryType(e){return this.safeString({1:"transfer",2:"trade",3:"trade",4:"rebate",5:"trade",6:"transfer",7:"trade",8:"fee",9:"trade",10:"trade",11:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"ccy"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeInteger(e,"ts"),o=this.safeString(e,"fee");let n;void 0!==o&&(n={cost:this.parseToNumeric(a.Y.stringNeg(o)),currency:s});const d=this.safeString(e,"instId"),h=this.safeSymbol(d,void 0,"-");return this.safeLedgerEntry({info:e,id:this.safeString(e,"billId"),timestamp:r,datetime:this.iso8601(r),account:void 0,referenceId:this.safeString(e,"ordId"),referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:s,symbol:h,amount:this.safeNumber(e,"balChg"),before:void 0,after:this.safeNumber(e,"bal"),status:"ok",fee:n},t)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=Array.isArray(s),d="/api/"+this.version+"/"+this.implodeParams(e,s),h=this.omit(s,this.extractParams(e));let c=this.implodeHostname(this.urls.api.rest)+d;if("public"===t)Object.keys(h).length&&(c+="?"+this.urlencode(h));else if("private"===t){this.checkRequiredCredentials();const e=this.iso8601(this.milliseconds());r={"OK-ACCESS-KEY":this.apiKey,"OK-ACCESS-PASSPHRASE":this.password,"OK-ACCESS-TIMESTAMP":e};let t=e+i+d;if("GET"===i){if(Object.keys(h).length){const e="?"+this.urlencode(h);c+=e,t+=e}}else(o||Object.keys(h).length)&&(t+=a=this.json(h)),r["Content-Type"]="application/json";const s=this.hmac(this.encode(t),this.encode(this.secret),n.s,"base64");r["OK-ACCESS-SIGN"]=s}return{url:c,method:i,body:a,headers:r}}parseBalanceByType(e,t){return"funding"===e?this.parseFundingBalance(t):this.parseTradingBalance(t)}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeString(n,"code");if("0"!==c){const e=this.id+" "+o,t=this.safeValue(n,"data",[]);for(let i=0;i<t.length;i++){const s=t[i],r=this.safeString(s,"sCode"),a=this.safeString(s,"sMsg");this.throwExactlyMatchedException(this.exceptions.exact,r,e),this.throwBroadlyMatchedException(this.exceptions.broad,a,e)}throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"okx",name:"OKX",countries:["CN","US"],version:"v5",rateLimit:103,pro:!0,certified:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!0,option:!0,addMargin:!0,cancelAllOrders:!1,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!0,closeAllPositions:!1,closePosition:!0,createConvertTrade:!0,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketSellOrderWithCost:!0,createOrder:!0,createOrders:!0,createOrderWithTakeProfitAndStopLoss:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopLossOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,createTakeProfitOrder:!0,createTrailingPercentOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:void 0,fetchBorrowInterest:!0,fetchBorrowRateHistories:!0,fetchBorrowRateHistory:!0,fetchCanceledOrders:!0,fetchClosedOrder:void 0,fetchClosedOrders:!0,fetchConvertCurrencies:!0,fetchConvertQuote:!0,fetchConvertTrade:!0,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!0,fetchCrossBorrowRates:!0,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!0,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchGreeks:!0,fetchIndexOHLCV:!0,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!0,fetchLedgerEntry:void 0,fetchLeverage:!0,fetchLeverageTiers:!1,fetchLongShortRatio:!1,fetchLongShortRatioHistory:!0,fetchMarginAdjustmentHistory:!0,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!0,fetchMarkPrice:!0,fetchMarkPrices:!0,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!0,fetchOpenOrder:void 0,fetchOpenOrders:!0,fetchOption:!0,fetchOptionChain:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:"emulated",fetchPositions:!0,fetchPositionsForSymbol:!0,fetchPositionsHistory:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!0,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!0,fetchTransfers:!0,fetchUnderlyingAssets:!0,fetchVolatilityHistory:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!0,repayCrossMargin:!0,sandbox:!0,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!0,signIn:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1H","2h":"2H","4h":"4H","6h":"6H","12h":"12H","1d":"1D","1w":"1W","1M":"1M","3M":"3M"},hostname:"www.okx.com",urls:{logo:"https://user-images.githubusercontent.com/1294454/152485636-38b19e4a-bece-4dec-979a-5982859ffc04.jpg",api:{rest:"https://{hostname}"},www:"https://www.okx.com",doc:"https://www.okx.com/docs-v5/en/",fees:"https://www.okx.com/pages/products/fees.html",referral:{url:"https://www.okx.com/join/CCXT2023",discount:.2},test:{rest:"https://{hostname}"}},api:{public:{get:{"market/books-full":2,"market/tickers":1,"market/ticker":1,"market/index-tickers":1,"market/books":.5,"market/books-lite":5/3,"market/candles":.5,"market/history-candles":1,"market/index-candles":1,"market/history-index-candles":2,"market/mark-price-candles":1,"market/history-mark-price-candles":2,"market/trades":.2,"market/history-trades":2,"market/option/instrument-family-trades":1,"market/platform-24-volume":10,"market/open-oracle":50,"market/exchange-rate":20,"market/index-components":1,"public/economic-calendar":50,"market/block-tickers":1,"market/block-ticker":1,"public/block-trades":1,"public/instruments":1,"public/delivery-exercise-history":.5,"public/open-interest":1,"public/funding-rate":1,"public/funding-rate-history":1,"public/price-limit":1,"public/opt-summary":1,"public/estimated-price":2,"public/discount-rate-interest-free-quota":10,"public/time":2,"public/mark-price":2,"public/position-tiers":2,"public/interest-rate-loan-quota":10,"public/vip-interest-rate-loan-quota":10,"public/underlying":1,"public/insurance-fund":2,"public/convert-contract-coin":2,"public/option-trades":1,"public/instrument-tick-bands":4,"rubik/stat/trading-data/support-coin":4,"rubik/stat/taker-volume":4,"rubik/stat/margin/loan-ratio":4,"rubik/stat/contracts/long-short-account-ratio":4,"rubik/stat/contracts/long-short-account-ratio-contract":4,"rubik/stat/contracts/open-interest-volume":4,"rubik/stat/option/open-interest-volume":4,"rubik/stat/option/open-interest-volume-ratio":4,"rubik/stat/option/open-interest-volume-expiry":4,"rubik/stat/option/open-interest-volume-strike":4,"rubik/stat/option/taker-block-volume":4,"system/status":50,"sprd/spreads":1,"sprd/books":.5,"sprd/ticker":1,"sprd/public-trades":.2,"market/sprd-ticker":2,"market/sprd-candles":2,"market/sprd-history-candles":2,"tradingBot/grid/ai-param":1,"tradingBot/grid/min-investment":1,"tradingBot/public/rsi-back-testing":1,"asset/exchange-list":5/3,"finance/staking-defi/eth/apy-history":5/3,"finance/staking-defi/sol/apy-history":5/3,"finance/savings/lending-rate-summary":5/3,"finance/savings/lending-rate-history":5/3,"finance/fixed-loan/lending-offers":10/3,"finance/fixed-loan/lending-apy-history":10/3,"finance/fixed-loan/pending-lending-volume":10/3,"finance/sfp/dcd/products":2/3,"copytrading/public-lead-traders":4,"copytrading/public-weekly-pnl":4,"copytrading/public-stats":4,"copytrading/public-preference-currency":4,"copytrading/public-current-subpositions":4,"copytrading/public-subpositions-history":4,"support/announcements-types":20}},private:{get:{"rfq/counterparties":4,"rfq/maker-instrument-settings":4,"rfq/mmp-config":4,"rfq/rfqs":10,"rfq/quotes":10,"rfq/trades":4,"rfq/public-trades":4,"sprd/order":1/3,"sprd/orders-pending":1/3,"sprd/orders-history":.5,"sprd/orders-history-archive":.5,"sprd/trades":1/3,"trade/order":1/3,"trade/orders-pending":1/3,"trade/orders-history":.5,"trade/orders-history-archive":1,"trade/fills":1/3,"trade/fills-history":2.2,"trade/fills-archive":2,"trade/order-algo":1,"trade/orders-algo-pending":1,"trade/orders-algo-history":1,"trade/easy-convert-currency-list":20,"trade/easy-convert-history":20,"trade/one-click-repay-currency-list":20,"trade/one-click-repay-history":20,"trade/account-rate-limit":1,"asset/currencies":5/3,"asset/balances":5/3,"asset/non-tradable-assets":5/3,"asset/asset-valuation":10,"asset/transfer-state":10,"asset/bills":5/3,"asset/deposit-lightning":5,"asset/deposit-address":5/3,"asset/deposit-history":5/3,"asset/withdrawal-history":5/3,"asset/deposit-withdraw-status":20,"asset/convert/currencies":5/3,"asset/convert/currency-pair":5/3,"asset/convert/history":5/3,"asset/monthly-statement":2,"account/instruments":1,"account/balance":2,"account/positions":2,"account/positions-history":100,"account/account-position-risk":2,"account/bills":5/3,"account/bills-archive":5/3,"account/bills-history-archive":2,"account/config":4,"account/max-size":1,"account/max-avail-size":1,"account/leverage-info":1,"account/adjust-leverage-info":4,"account/max-loan":1,"account/trade-fee":4,"account/interest-accrued":4,"account/interest-rate":4,"account/max-withdrawal":1,"account/risk-state":2,"account/quick-margin-borrow-repay-history":4,"account/borrow-repay-history":4,"account/vip-interest-accrued":4,"account/vip-interest-deducted":4,"account/vip-loan-order-list":4,"account/vip-loan-order-detail":4,"account/interest-limits":4,"account/greeks":2,"account/position-tiers":2,"account/mmp-config":4,"account/fixed-loan/borrowing-limit":4,"account/fixed-loan/borrowing-quote":5,"account/fixed-loan/borrowing-orders-list":5,"account/spot-manual-borrow-repay":10,"account/set-auto-repay":4,"account/spot-borrow-repay-history":4,"users/subaccount/list":10,"account/subaccount/balances":10/3,"asset/subaccount/balances":10/3,"account/subaccount/max-withdrawal":1,"asset/subaccount/bills":5/3,"asset/subaccount/managed-subaccount-bills":5/3,"users/entrust-subaccount-list":10,"account/subaccount/interest-limits":4,"tradingBot/grid/orders-algo-pending":1,"tradingBot/grid/orders-algo-history":1,"tradingBot/grid/orders-algo-details":1,"tradingBot/grid/sub-orders":1,"tradingBot/grid/positions":1,"tradingBot/grid/ai-param":1,"tradingBot/signal/signals":1,"tradingBot/signal/orders-algo-details":1,"tradingBot/signal/orders-algo-history":1,"tradingBot/signal/positions":1,"tradingBot/signal/positions-history":1,"tradingBot/signal/sub-orders":1,"tradingBot/signal/event-history":1,"tradingBot/recurring/orders-algo-pending":1,"tradingBot/recurring/orders-algo-history":1,"tradingBot/recurring/orders-algo-details":1,"tradingBot/recurring/sub-orders":1,"finance/savings/balance":5/3,"finance/savings/lending-history":5/3,"finance/staking-defi/offers":10/3,"finance/staking-defi/orders-active":10/3,"finance/staking-defi/orders-history":10/3,"finance/staking-defi/eth/balance":5/3,"finance/staking-defi/eth/purchase-redeem-history":5/3,"finance/staking-defi/eth/product-info":3,"finance/staking-defi/sol/balance":5/3,"finance/staking-defi/sol/purchase-redeem-history":5/3,"copytrading/current-subpositions":1,"copytrading/subpositions-history":1,"copytrading/instruments":4,"copytrading/profit-sharing-details":4,"copytrading/total-profit-sharing":4,"copytrading/unrealized-profit-sharing-details":4,"copytrading/copy-settings":4,"copytrading/batch-leverage-info":4,"copytrading/current-lead-traders":4,"copytrading/lead-traders-history":4,"broker/nd/info":10,"broker/nd/subaccount-info":10,"broker/nd/subaccount/apikey":10,"asset/broker/nd/subaccount-deposit-address":5/3,"asset/broker/nd/subaccount-deposit-history":4,"asset/broker/nd/subaccount-withdrawal-history":4,"broker/nd/rebate-daily":100,"broker/nd/rebate-per-orders":300,"finance/sfp/dcd/order":2,"finance/sfp/dcd/orders":2,"broker/fd/rebate-per-orders":300,"broker/fd/if-rebate":5,"affiliate/invitee/detail":1,"users/partner/if-rebate":1,"support/announcements":4},post:{"rfq/create-rfq":4,"rfq/cancel-rfq":4,"rfq/cancel-batch-rfqs":10,"rfq/cancel-all-rfqs":10,"rfq/execute-quote":15,"rfq/maker-instrument-settings":4,"rfq/mmp-reset":4,"rfq/mmp-config":100,"rfq/create-quote":.4,"rfq/cancel-quote":.4,"rfq/cancel-batch-quotes":10,"rfq/cancel-all-quotes":10,"sprd/order":1,"sprd/cancel-order":1,"sprd/mass-cancel":1,"sprd/amend-order":1,"sprd/cancel-all-after":10,"trade/order":1/3,"trade/batch-orders":1/15,"trade/cancel-order":1/3,"trade/cancel-batch-orders":1/15,"trade/amend-order":1/3,"trade/amend-batch-orders":1/150,"trade/close-position":1,"trade/fills-archive":172800,"trade/order-algo":1,"trade/cancel-algos":1,"trade/amend-algos":1,"trade/cancel-advance-algos":1,"trade/easy-convert":20,"trade/one-click-repay":20,"trade/mass-cancel":4,"trade/cancel-all-after":10,"asset/transfer":10,"asset/withdrawal":5/3,"asset/withdrawal-lightning":5,"asset/cancel-withdrawal":5/3,"asset/convert-dust-assets":10,"asset/convert/estimate-quote":1,"asset/convert/trade":1,"asset/monthly-statement":1,"account/set-position-mode":4,"account/set-leverage":1,"account/position/margin-balance":1,"account/set-greeks":4,"account/set-isolated-mode":4,"account/quick-margin-borrow-repay":4,"account/borrow-repay":5/3,"account/simulated_margin":10,"account/position-builder":10,"account/set-riskOffset-type":2,"account/activate-option":4,"account/set-auto-loan":4,"account/set-account-level":4,"account/mmp-reset":4,"account/mmp-config":100,"account/fixed-loan/borrowing-order":5,"account/fixed-loan/amend-borrowing-order":5,"account/fixed-loan/manual-reborrow":5,"account/fixed-loan/repay-borrowing-order":5,"account/bills-history-archive":72e3,"users/subaccount/modify-apikey":10,"asset/subaccount/transfer":10,"users/subaccount/set-transfer-out":10,"account/subaccount/set-loan-allocation":4,"tradingBot/grid/order-algo":1,"tradingBot/grid/amend-order-algo":1,"tradingBot/grid/stop-order-algo":1,"tradingBot/grid/close-position":1,"tradingBot/grid/cancel-close-order":1,"tradingBot/grid/order-instant-trigger":1,"tradingBot/grid/withdraw-income":1,"tradingBot/grid/compute-margin-balance":1,"tradingBot/grid/margin-balance":1,"tradingBot/grid/min-investment":1,"tradingBot/grid/adjust-investment":1,"tradingBot/signal/create-signal":1,"tradingBot/signal/order-algo":1,"tradingBot/signal/stop-order-algo":1,"tradingBot/signal/margin-balance":1,"tradingBot/signal/amendTPSL":1,"tradingBot/signal/set-instruments":1,"tradingBot/signal/close-position":1,"tradingBot/signal/sub-order":1,"tradingBot/signal/cancel-sub-order":1,"tradingBot/recurring/order-algo":1,"tradingBot/recurring/amend-order-algo":1,"tradingBot/recurring/stop-order-algo":1,"finance/savings/purchase-redempt":5/3,"finance/savings/set-lending-rate":5/3,"finance/staking-defi/purchase":3,"finance/staking-defi/redeem":3,"finance/staking-defi/cancel":3,"finance/staking-defi/eth/purchase":5,"finance/staking-defi/eth/redeem":5,"finance/staking-defi/sol/purchase":5,"finance/staking-defi/sol/redeem":5,"copytrading/algo-order":1,"copytrading/close-subposition":1,"copytrading/set-instruments":4,"copytrading/first-copy-settings":4,"copytrading/amend-copy-settings":4,"copytrading/stop-copy-trading":4,"copytrading/batch-set-leverage":4,"broker/nd/create-subaccount":.25,"broker/nd/delete-subaccount":1,"broker/nd/subaccount/apikey":.25,"broker/nd/subaccount/modify-apikey":1,"broker/nd/subaccount/delete-apikey":1,"broker/nd/set-subaccount-level":4,"broker/nd/set-subaccount-fee-rate":4,"broker/nd/set-subaccount-assets":.25,"asset/broker/nd/subaccount-deposit-address":1,"asset/broker/nd/modify-subaccount-deposit-address":5/3,"broker/nd/rebate-per-orders":36e3,"finance/sfp/dcd/quote":10,"finance/sfp/dcd/order":10,"broker/nd/report-subaccount-ip":.25,"broker/fd/rebate-per-orders":36e3}}},fees:{trading:{taker:this.parseNumber("0.0015"),maker:this.parseNumber("0.0010")},spot:{taker:this.parseNumber("0.0015"),maker:this.parseNumber("0.0010")},future:{taker:this.parseNumber("0.0005"),maker:this.parseNumber("0.0002")},swap:{taker:this.parseNumber("0.00050"),maker:this.parseNumber("0.00020")}},requiredCredentials:{apiKey:!0,secret:!0,password:!0},exceptions:{exact:{1:r.ExchangeError,2:r.ExchangeError,4088:r.ManualInteractionNeeded,5e4:r.BadRequest,50001:r.OnMaintenance,50002:r.BadRequest,50004:r.RequestTimeout,50005:r.ExchangeNotAvailable,50006:r.BadRequest,50007:r.AccountSuspended,50008:r.AuthenticationError,50009:r.AccountSuspended,50010:r.ExchangeError,50011:r.RateLimitExceeded,50012:r.ExchangeError,50013:r.ExchangeNotAvailable,50014:r.BadRequest,50015:r.ExchangeError,50016:r.ExchangeError,50017:r.ExchangeError,50018:r.ExchangeError,50019:r.ExchangeError,50020:r.ExchangeError,50021:r.ExchangeError,50022:r.ExchangeError,50023:r.ExchangeError,50024:r.BadRequest,50025:r.ExchangeError,50026:r.ExchangeNotAvailable,50027:r.PermissionDenied,50028:r.ExchangeError,50044:r.BadRequest,50061:r.ExchangeError,50062:r.ExchangeError,50100:r.ExchangeError,50101:r.AuthenticationError,50102:r.InvalidNonce,50103:r.AuthenticationError,50104:r.AuthenticationError,50105:r.AuthenticationError,50106:r.AuthenticationError,50107:r.AuthenticationError,50108:r.ExchangeError,50109:r.ExchangeError,50110:r.PermissionDenied,50111:r.AuthenticationError,50112:r.AuthenticationError,50113:r.AuthenticationError,50114:r.AuthenticationError,50115:r.BadRequest,51e3:r.BadRequest,51001:r.BadSymbol,51002:r.BadSymbol,51003:r.BadRequest,51004:r.InvalidOrder,51005:r.InvalidOrder,51006:r.InvalidOrder,51007:r.InvalidOrder,51008:r.InsufficientFunds,51009:r.AccountSuspended,51010:r.AccountNotEnabled,51011:r.InvalidOrder,51012:r.BadSymbol,51014:r.BadSymbol,51015:r.BadSymbol,51016:r.InvalidOrder,51017:r.ExchangeError,51018:r.ExchangeError,51019:r.ExchangeError,51020:r.InvalidOrder,51021:r.ContractUnavailable,51022:r.ContractUnavailable,51023:r.ExchangeError,51024:r.AccountSuspended,51025:r.ExchangeError,51026:r.BadSymbol,51027:r.ContractUnavailable,51028:r.ContractUnavailable,51029:r.ContractUnavailable,51030:r.ContractUnavailable,51031:r.InvalidOrder,51046:r.InvalidOrder,51047:r.InvalidOrder,51072:r.InvalidOrder,51073:r.InvalidOrder,51074:r.InvalidOrder,51090:r.InvalidOrder,51091:r.InvalidOrder,51092:r.InvalidOrder,51093:r.InvalidOrder,51094:r.InvalidOrder,51095:r.InvalidOrder,51096:r.InvalidOrder,51098:r.InvalidOrder,51099:r.InvalidOrder,51100:r.InvalidOrder,51101:r.InvalidOrder,51102:r.InvalidOrder,51103:r.InvalidOrder,51104:r.InvalidOrder,51105:r.InvalidOrder,51106:r.InvalidOrder,51107:r.InvalidOrder,51108:r.InvalidOrder,51109:r.InvalidOrder,51110:r.InvalidOrder,51111:r.BadRequest,51112:r.InvalidOrder,51113:r.RateLimitExceeded,51115:r.InvalidOrder,51116:r.InvalidOrder,51117:r.InvalidOrder,51118:r.InvalidOrder,51119:r.InsufficientFunds,51120:r.InvalidOrder,51121:r.InvalidOrder,51122:r.InvalidOrder,51124:r.InvalidOrder,51125:r.InvalidOrder,51126:r.InvalidOrder,51127:r.InsufficientFunds,51128:r.InvalidOrder,51129:r.InvalidOrder,51130:r.BadSymbol,51131:r.InsufficientFunds,51132:r.InvalidOrder,51133:r.InvalidOrder,51134:r.InvalidOrder,51135:r.InvalidOrder,51136:r.InvalidOrder,51137:r.InvalidOrder,51138:r.InvalidOrder,51139:r.InvalidOrder,51156:r.BadRequest,51159:r.BadRequest,51162:r.InvalidOrder,51163:r.InvalidOrder,51166:r.InvalidOrder,51174:r.InvalidOrder,51185:r.InvalidOrder,51201:r.InvalidOrder,51202:r.InvalidOrder,51203:r.InvalidOrder,51204:r.InvalidOrder,51205:r.InvalidOrder,51250:r.InvalidOrder,51251:r.InvalidOrder,51252:r.InvalidOrder,51253:r.InvalidOrder,51254:r.InvalidOrder,51255:r.InvalidOrder,51256:r.InvalidOrder,51257:r.InvalidOrder,51258:r.InvalidOrder,51259:r.InvalidOrder,51260:r.InvalidOrder,51261:r.InvalidOrder,51262:r.InvalidOrder,51263:r.InvalidOrder,51264:r.InvalidOrder,51265:r.InvalidOrder,51267:r.InvalidOrder,51268:r.InvalidOrder,51269:r.InvalidOrder,51270:r.InvalidOrder,51271:r.InvalidOrder,51272:r.InvalidOrder,51273:r.InvalidOrder,51274:r.InvalidOrder,51275:r.InvalidOrder,51276:r.InvalidOrder,51277:r.InvalidOrder,51278:r.InvalidOrder,51279:r.InvalidOrder,51280:r.InvalidOrder,51321:r.InvalidOrder,51322:r.InvalidOrder,51323:r.BadRequest,51324:r.BadRequest,51325:r.InvalidOrder,51327:r.InvalidOrder,51328:r.InvalidOrder,51329:r.InvalidOrder,51330:r.InvalidOrder,51400:r.OrderNotFound,51401:r.OrderNotFound,51402:r.OrderNotFound,51403:r.InvalidOrder,51404:r.InvalidOrder,51405:r.ExchangeError,51406:r.ExchangeError,51407:r.BadRequest,51408:r.ExchangeError,51409:r.ExchangeError,51410:r.CancelPending,51500:r.ExchangeError,51501:r.ExchangeError,51502:r.InsufficientFunds,51503:r.ExchangeError,51506:r.ExchangeError,51508:r.ExchangeError,51509:r.ExchangeError,51510:r.ExchangeError,51511:r.ExchangeError,51600:r.ExchangeError,51601:r.ExchangeError,51602:r.ExchangeError,51603:r.OrderNotFound,51732:r.AuthenticationError,51733:r.AuthenticationError,51734:r.AuthenticationError,51735:r.ExchangeError,51736:r.InsufficientFunds,52e3:r.ExchangeError,54e3:r.ExchangeError,54001:r.ExchangeError,54008:r.InvalidOrder,54009:r.InvalidOrder,54011:r.InvalidOrder,55100:r.InvalidOrder,55101:r.InvalidOrder,55102:r.InvalidOrder,55103:r.InvalidOrder,55104:r.InvalidOrder,55111:r.InvalidOrder,55112:r.InvalidOrder,55113:r.InvalidOrder,58e3:r.ExchangeError,58001:r.AuthenticationError,58002:r.PermissionDenied,58003:r.ExchangeError,58004:r.AccountSuspended,58005:r.ExchangeError,58006:r.ExchangeError,58007:r.ExchangeError,58100:r.ExchangeError,58101:r.AccountSuspended,58102:r.RateLimitExceeded,58103:r.ExchangeError,58104:r.ExchangeError,58105:r.ExchangeError,58106:r.ExchangeError,58107:r.ExchangeError,58108:r.ExchangeError,58109:r.ExchangeError,58110:r.ExchangeError,58111:r.ExchangeError,58112:r.ExchangeError,58114:r.ExchangeError,58115:r.ExchangeError,58116:r.ExchangeError,58117:r.ExchangeError,58125:r.BadRequest,58126:r.BadRequest,58127:r.BadRequest,58128:r.BadRequest,58200:r.ExchangeError,58201:r.ExchangeError,58202:r.ExchangeError,58203:r.InvalidAddress,58204:r.AccountSuspended,58205:r.ExchangeError,58206:r.ExchangeError,58207:r.InvalidAddress,58208:r.ExchangeError,58209:r.ExchangeError,58210:r.ExchangeError,58211:r.ExchangeError,58212:r.ExchangeError,58213:r.AuthenticationError,58221:r.BadRequest,58222:r.BadRequest,58224:r.BadRequest,58227:r.BadRequest,58228:r.BadRequest,58229:r.InsufficientFunds,58300:r.ExchangeError,58350:r.InsufficientFunds,59e3:r.ExchangeError,59001:r.ExchangeError,59100:r.ExchangeError,59101:r.ExchangeError,59102:r.ExchangeError,59103:r.InsufficientFunds,59104:r.ExchangeError,59105:r.ExchangeError,59106:r.ExchangeError,59107:r.ExchangeError,59108:r.InsufficientFunds,59109:r.ExchangeError,59128:r.InvalidOrder,59200:r.InsufficientFunds,59201:r.InsufficientFunds,59216:r.BadRequest,59260:r.PermissionDenied,59262:r.PermissionDenied,59300:r.ExchangeError,59301:r.ExchangeError,59313:r.ExchangeError,59401:r.ExchangeError,59410:r.OperationRejected,59411:r.InsufficientFunds,59412:r.OperationRejected,59413:r.OperationRejected,59414:r.BadRequest,59500:r.ExchangeError,59501:r.ExchangeError,59502:r.ExchangeError,59503:r.ExchangeError,59504:r.ExchangeError,59505:r.ExchangeError,59506:r.ExchangeError,59507:r.ExchangeError,59508:r.AccountSuspended,59642:r.BadRequest,59643:r.ExchangeError,60001:r.AuthenticationError,60002:r.AuthenticationError,60003:r.AuthenticationError,60004:r.AuthenticationError,60005:r.AuthenticationError,60006:r.InvalidNonce,60007:r.AuthenticationError,60008:r.AuthenticationError,60009:r.AuthenticationError,60010:r.AuthenticationError,60011:r.AuthenticationError,60012:r.BadRequest,60013:r.BadRequest,60014:r.RateLimitExceeded,60015:r.NetworkError,60016:r.ExchangeNotAvailable,60017:r.BadRequest,60018:r.BadRequest,60019:r.BadRequest,60020:r.ExchangeError,60021:r.AccountNotEnabled,60022:r.AuthenticationError,60023:r.DDoSProtection,60024:r.AuthenticationError,60025:r.ExchangeError,60026:r.AuthenticationError,60027:r.ArgumentsRequired,60028:r.NotSupported,60029:r.AccountNotEnabled,60030:r.AccountNotEnabled,60031:r.AuthenticationError,60032:r.AuthenticationError,63999:r.ExchangeError,64e3:r.BadRequest,64001:r.BadRequest,64002:r.BadRequest,64003:r.AccountNotEnabled,70010:r.BadRequest,70013:r.BadRequest,70016:r.BadRequest,1009:r.BadRequest,4001:r.AuthenticationError,4002:r.BadRequest,4003:r.RateLimitExceeded,4004:r.NetworkError,4005:r.ExchangeNotAvailable,4006:r.BadRequest,4007:r.AuthenticationError,4008:r.RateLimitExceeded},broad:{"Internal Server Error":r.ExchangeNotAvailable,"server error":r.ExchangeNotAvailable}},httpExceptions:{429:r.ExchangeNotAvailable},precisionMode:o.kb,options:{sandboxMode:!1,defaultNetwork:"ERC20",defaultNetworks:{ETH:"ERC20",BTC:"BTC",USDT:"TRC20"},networks:{BTC:"Bitcoin",BTCLN:"Lightning",BEP20:"BSC",ERC20:"ERC20",TRC20:"TRC20",CRC20:"Crypto",ACA:"Acala",ALGO:"Algorand",BHP:"BHP",APT:"Aptos",ARBONE:"Arbitrum One",AVAXC:"Avalanche C-Chain",AVAXX:"Avalanche X-Chain",ARK:"ARK",AR:"Arweave",ASTR:"Astar",BCH:"BitcoinCash",BSV:"Bitcoin SV",BTM:"Bytom",ADA:"Cardano",CSPR:"Casper",CELO:"CELO",XCH:"Chia",CHZ:"Chiliz",ATOM:"Cosmos",TRUE:"TrueChain",DCR:"Decred",DGB:"Digibyte",DOGE:"Dogecoin",XEC:"XEC",EGLD:"Elrond",EOS:"EOS",ETC:"Ethereum Classic",ETHW:"EthereumPow",FTM:"Fantom",FIL:"Filecoin",FLOW:"FLOW",FSN:"Fusion",ONE:"Harmony",HBAR:"Hedera",HNT:"Helium",ZEN:"Horizen",ICX:"ICON",ICP:"Dfinity",IOST:"IOST",IOTA:"MIOTA",KDA:"Kadena",KAR:"KAR",KLAY:"Klaytn",KSM:"Kusama",LSK:"Lisk",LTC:"Litecoin",METIS:"Metis",MINA:"Mina",XMR:"Monero",GLRM:"Moonbeam",MOVR:"Moonriver",NANO:"Nano",NEAR:"NEAR",NAS:"Nebulas",NEM:"New Economy Movement",NULS:"NULS",OASYS:"OASYS",OKC:"OKC",ONT:"Ontology",OPTIMISM:"Optimism",LAT:"PlatON",DOT:"Polkadot",MATIC:"Polygon",RVN:"Ravencoin",XRP:"Ripple",SC:"Siacoin",SOL:"Solana",STX:"l-Stacks",XLM:"Stellar Lumens",XTZ:"Tezos",TON:"TON",THETA:"Theta",VSYS:"VSYSTEMS",WAVES:"WAVES",WAX:"Wax",ZEC:"Zcash",ZIL:"Zilliqa",ZKSYNC:"ZKSYNC",OMNI:"Omni"},fetchOpenInterestHistory:{timeframes:{"5m":"5m","1h":"1H","8h":"8H","1d":"1D","5M":"5m","1H":"1H","8H":"8H","1D":"1D"}},fetchOHLCV:{timezone:"UTC"},fetchPositions:{method:"privateGetAccountPositions"},createOrder:"privatePostTradeBatchOrders",createMarketBuyOrderRequiresPrice:!1,fetchMarkets:["spot","future","swap","option"],timeDifference:0,adjustForTimeDifference:!1,defaultType:"spot",fetchLedger:{method:"privateGetAccountBills"},fetchOrder:{method:"privateGetTradeOrder"},fetchOpenOrders:{method:"privateGetTradeOrdersPending"},cancelOrders:{method:"privatePostTradeCancelBatchOrders"},fetchCanceledOrders:{method:"privateGetTradeOrdersHistory"},fetchClosedOrders:{method:"privateGetTradeOrdersHistory"},withdraw:{password:void 0,pwd:void 0},algoOrderTypes:{conditional:!0,trigger:!0,oco:!0,move_order_stop:!0,iceberg:!0,twap:!0},accountsByType:{funding:"6",trading:"18",spot:"18",future:"18",futures:"18",margin:"18",swap:"18",option:"18"},accountsById:{6:"funding",18:"trading"},exchangeType:{spot:"SPOT",margin:"MARGIN",swap:"SWAP",future:"FUTURES",futures:"FUTURES",option:"OPTION",SPOT:"SPOT",MARGIN:"MARGIN",SWAP:"SWAP",FUTURES:"FUTURES",OPTION:"OPTION"},brokerId:"e847386590ce4dBC"},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!1,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:{triggerPriceType:{last:!0,mark:!0,index:!0},price:!0},timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!0,trailing:!0,iceberg:!0,leverage:!1,selfTradePrevention:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!1},createOrders:{max:20},fetchMyTrades:{marginMode:!1,daysBack:90,limit:100,untilDays:1e4,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!0,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!0,trailing:!0,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:90,daysBackCanceled:1/12,untilDays:void 0,trigger:!0,trailing:!0,symbolRequired:!1},fetchOHLCV:{limit:300}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:{extends:"default"},inverse:{extends:"default"}}},commonCurrencies:{AE:"AET",WIN:"WINTOKEN"}})}handleMarketTypeAndParams(e,t=void 0,i={},s=void 0){const r=this.safeString(i,"instType");i=this.omit(i,"instType");return void 0===this.safeString(i,"type")&&void 0!==r&&(i.type=r),super.handleMarketTypeAndParams(e,t,i,s)}convertToInstrumentType(e){const t=this.safeDict(this.options,"exchangeType",{});return this.safeString(t,e,e)}createExpiredOptionMarket(e){const t="USD",i=e.split("-"),s=e.split("/");let r;r=e.indexOf("/")>-1?this.safeString(s,0):this.safeString(i,0);const a=r,o=this.safeString(i,2),n=this.safeString(i,3),d=this.safeString(i,4),h=this.convertExpireDate(o),c=this.parse8601(h);return{id:r+"-"+t+"-"+o+"-"+n+"-"+d,symbol:r+"/"+t+":"+a+"-"+o+"-"+n+"-"+d,base:r,quote:t,settle:a,baseId:r,quoteId:t,settleId:a,active:!1,type:"option",linear:void 0,inverse:void 0,spot:!1,swap:!1,future:!1,option:!0,margin:!1,contract:!0,contractSize:this.parseNumber("1"),expiry:c,expiryDatetime:h,optionType:"C"===d?"call":"put",strike:this.parseNumber(n),precision:{amount:void 0,price:void 0},limits:{amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},info:void 0}}safeMarket(e=void 0,t=void 0,i=void 0,s=void 0){return void 0!==e&&(e.indexOf("-C")>-1||e.indexOf("-P")>-1)&&!(e in this.markets_by_id)?this.createExpiredOptionMarket(e):super.safeMarket(e,t,i,s)}async fetchStatus(e={}){const t=await this.publicGetSystemStatus(e),i=this.safeList(t,"data",[]),s={updated:void 0,status:0===i.length?"ok":"maintenance",eta:void 0,url:void 0,info:t};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"state");s.eta=this.safeInteger(t,"end"),s.url=this.safeString(t,"href"),"ongoing"===r?s.status="maintenance":("scheduled"===r||"completed"===r||"canceled"===r)&&(s.status="ok")}return s}async fetchTime(e={}){const t=await this.publicGetPublicTime(e),i=this.safeList(t,"data",[]),s=this.safeDict(i,0,{});return this.safeInteger(s,"ts")}async fetchAccounts(e={}){const t=await this.privateGetAccountConfig(e),i=this.safeList(t,"data",[]),s=[];for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"uid"),a=this.safeString(t,"acctLv");s.push({id:r,type:a,currency:void 0,info:t,code:void 0})}return s}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=this.safeList(this.options,"fetchMarkets",[]);let i=[],s=[];for(let s=0;s<t.length;s++)i.push(this.fetchMarketsByType(t[s],e));i=await Promise.all(i);for(let e=0;e<i.length;e++)s=this.arrayConcat(s,i[e]);return s}parseMarket(e){const t=this.safeString(e,"instId");let i=this.safeStringLower(e,"instType");"futures"===i&&(i="future");const s="spot"===i,r="future"===i,o="swap"===i,n="option"===i,d=o||r||n;let h=this.safeString(e,"baseCcy"),c=this.safeString(e,"quoteCcy");const l=this.safeString(e,"settleCcy"),u=this.safeCurrencyCode(l),f=this.safeString(e,"uly");if(void 0!==f&&!s){const e=f.split("-");h=this.safeString(e,0),c=this.safeString(e,1)}const p=this.safeCurrencyCode(h),m=this.safeCurrencyCode(c);let g,v,y,w=p+"/"+m;if(d)if(w=w+":"+u,g=this.safeInteger(e,"expTime"),r){w=w+"-"+this.yymmdd(g)}else if(n){v=this.safeString(e,"stk"),y=this.safeString(e,"optType");w=w+"-"+this.yymmdd(g)+"-"+v+"-"+y,y="P"===y?"put":"call"}const b=this.safeString(e,"tickSz"),k=this.safeDict2(this.fees,i,"trading",{});let S=this.safeString(e,"lever","1");S=a.Y.stringMax(S,"1");const O=this.safeNumber(e,"maxMktSz");return this.extend(k,{id:t,symbol:w,base:p,quote:m,settle:u,baseId:h,quoteId:c,settleId:l,type:i,spot:s,margin:s&&a.Y.stringGt(S,"1"),swap:o,future:r,option:n,active:!0,contract:d,linear:d?c===l:void 0,inverse:d?h===l:void 0,contractSize:d?this.safeNumber(e,"ctVal"):void 0,expiry:g,expiryDatetime:this.iso8601(g),strike:this.parseNumber(v),optionType:y,created:this.safeInteger(e,"listTime"),precision:{amount:this.safeNumber(e,"lotSz"),price:this.parseNumber(b)},limits:{leverage:{min:this.parseNumber("1"),max:this.parseNumber(S)},amount:{min:this.safeNumber(e,"minSz"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:d?void 0:O}},info:e})}async fetchMarketsByType(e,t={}){const i={instType:this.convertToInstrumentType(e)};if("option"===e){const e=this.safeList(this.options,"defaultUnderlying",["BTC-USD","ETH-USD"]),s=[];for(let r=0;r<e.length;r++){const a=e[r];i.uly=a,s.push(this.publicGetPublicInstruments(this.extend(i,t)))}const r=await Promise.all(s);let a=[];for(let e=0;e<r.length;e++){const t=this.safeDict(r,e,{}),i=this.safeList(t,"data",[]);a=this.arrayConcat(a,i)}return this.parseMarkets(a)}const s=await this.publicGetPublicInstruments(this.extend(i,t)),r=this.safeList(s,"data",[]);return this.parseMarkets(r)}async fetchCurrencies(e={}){const t=this.safeBool(this.options,"sandboxMode",!1);if(!this.checkRequiredCredentials(!1)||t)return;const i=await this.privateGetAssetCurrencies(e),s=this.safeList(i,"data",[]),r={},o=this.groupBy(s,"ccy"),n=Object.keys(o);for(let e=0;e<n.length;e++){const t=n[e],i=this.safeCurrency(t),s=i.code,d=o[t],h={};let c,l=!1,u=!1,f=!1;for(let e=0;e<d.length;e++){const t=d[e],s=this.safeBool(t,"canDep");u=s||u;const r=this.safeBool(t,"canWd");f=r||f;const o=this.safeBool(t,"canInternal"),n=!!(s&&r&&o);l=n||l;const p=this.safeString(t,"chain");if(void 0!==p&&p.indexOf("-")>=0){const e=p.split("-"),o=this.arraySlice(e,1).join("-"),d=this.networkIdToCode(o,i.code),l=this.parsePrecision(this.safeString(t,"wdTickSz"));c=void 0===c?l:a.Y.stringMin(c,l),h[d]={id:p,network:d,active:n,deposit:s,withdraw:r,fee:this.safeNumber(t,"fee"),precision:this.parseNumber(l),limits:{withdraw:{min:this.safeNumber(t,"minWd"),max:this.safeNumber(t,"maxWd")}},info:t}}}const p=this.safeDict(d,0,{});r[s]={info:d,code:s,id:t,name:this.safeString(p,"name"),active:l,deposit:u,withdraw:f,fee:void 0,precision:this.parseNumber(c),limits:{amount:{min:void 0,max:void 0}},networks:h}}return r}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={instId:this.market(e).id};let r,a;[r,i]=this.handleOptionAndParams(i,"fetchOrderBook","method","publicGetMarketBooks"),"publicGetMarketBooksFull"===r&&void 0===t&&(t=5e3),void 0!==(t=void 0===t?100:t)&&(s.sz=t),a="publicGetMarketBooksFull"===r||t>400?await this.publicGetMarketBooksFull(this.extend(s,i)):await this.publicGetMarketBooks(this.extend(s,i));const o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{}),d=this.safeInteger(n,"ts");return this.parseOrderBook(n,e,d)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,a=this.safeString(e,"last"),o=this.safeString(e,"open24h"),n=this.safeBool(t,"spot",!1)?this.safeString(e,"volCcy24h"):void 0,d=this.safeString(e,"vol24h"),h=this.safeString(e,"high24h"),c=this.safeString(e,"low24h");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:h,low:c,bid:this.safeString(e,"bidPx"),bidVolume:this.safeString(e,"bidSz"),ask:this.safeString(e,"askPx"),askVolume:this.safeString(e,"askSz"),vwap:void 0,open:o,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:d,quoteVolume:n,markPrice:this.safeString(e,"markPx"),indexPrice:this.safeString(e,"idxPx"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.publicGetMarketTicker(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.getMarketFromSymbols(e);let s;[s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t);const a={instType:this.convertToInstrumentType(s)};if("option"===s){const e=this.safeString(this.options,"defaultUnderlying","BTC-USD"),i=this.safeString2(t,"uly","marketId",e);if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchTickers() requires an underlying uly or marketId parameter for options markets");a.uly=i}const o=await this.publicGetMarketTickers(this.extend(a,t)),n=this.safeList(o,"data",[]);return this.parseTickers(n,e)}async fetchMarkPrice(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.publicGetPublicMarkPrice(this.extend(s,t)),a=this.safeList(r,"data");return this.parseTicker(this.safeDict(a,0),i)}async fetchMarkPrices(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=this.getMarketFromSymbols(e);let s;[s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t,"swap");const a={instType:this.convertToInstrumentType(s)};if("option"===s){const e=this.safeString(this.options,"defaultUnderlying","BTC-USD"),i=this.safeString2(t,"uly","marketId",e);if(void 0===i)throw new r.ArgumentsRequired(this.id+" fetchMarkPrices() requires an underlying uly or marketId parameter for options markets");a.uly=i}const o=await this.publicGetPublicMarkPrice(this.extend(a,t)),n=this.safeList(o,"data",[]);return this.parseTickers(n,e)}parseTrade(e,t=void 0){const i=this.safeString(e,"tradeId"),s=this.safeString(e,"instId"),r=(t=this.safeMarket(s,t,"-")).symbol,o=this.safeInteger(e,"ts"),n=this.safeString2(e,"fillPx","px"),d=this.safeString2(e,"fillSz","sz"),h=this.safeString(e,"side"),c=this.safeString(e,"ordId"),l=this.safeString(e,"fee");let u;if(void 0!==l){const t=a.Y.stringNeg(l),i=this.safeString(e,"feeCcy");u={cost:t,currency:this.safeCurrencyCode(i)}}let f=this.safeString(e,"execType");return"T"===f?f="taker":"M"===f&&(f="maker"),this.safeTrade({info:e,timestamp:o,datetime:this.iso8601(o),symbol:r,id:i,order:c,type:void 0,takerOrMaker:f,side:h,price:n,amount:d,cost:void 0,fee:u},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchTrades",e,t,i,s,"tradeId","after",void 0,100);const a=this.market(e),o={instId:a.id};let n;if(a.option)n=await this.publicGetPublicOptionTrades(this.extend(o,s));else{let e;void 0!==i&&(o.limit=i),[e,s]=this.handleOptionAndParams(s,"fetchTrades","method","publicGetMarketTrades"),"publicGetMarketTrades"===e?n=await this.publicGetMarketTrades(this.extend(o,s)):"publicGetMarketHistoryTrades"===e&&(n=await this.publicGetMarketHistoryTrades(this.extend(o,s)))}const d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseOHLCV(e,t=void 0){const i="spot"===this.handleMarketTypeAndParams("fetchOHLCV",t,void 0)[0]?5:6;return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,i)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);let o=!1;if([o,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate"),o)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,200);const n=this.safeString(r,"price");r=this.omit(r,"price");const d=this.safeDict(this.options,"fetchOHLCV",{}),h=this.safeString(d,"timezone","UTC");void 0===s&&(s=100);const c=this.parseTimeframe(t);let l=this.safeString(this.timeframes,t,t);"UTC"===h&&c>=21600&&(l+=h.toLowerCase());const u={instId:a.id,bar:l,limit:s};let f="Candles";if(void 0!==i){const e=1e3*c;i<this.milliseconds()-1439*e&&(f="HistoryCandles");const t=Math.max(i-1,0);u.before=t,u.after=this.sum(i,e*s)}const p=this.safeInteger(r,"until");void 0!==p&&(u.after=p,r=this.omit(r,"until")),f=this.safeString(d,"type",f);const m=this.safeString(r,"type",f);r=this.omit(r,"type");const g="HistoryCandles"===m;let v;"mark"===n?v=g?await this.publicGetMarketHistoryMarkPriceCandles(this.extend(u,r)):await this.publicGetMarketMarkPriceCandles(this.extend(u,r)):"index"===n?(u.instId=a.info.instFamily,v=g?await this.publicGetMarketHistoryIndexCandles(this.extend(u,r)):await this.publicGetMarketIndexCandles(this.extend(u,r))):v=g?await this.publicGetMarketHistoryCandles(this.extend(u,r)):await this.publicGetMarketCandles(this.extend(u,r));const y=this.safeList(v,"data",[]);return this.parseOHLCVs(y,a,t,i,s)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();let a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),a)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s,100);const o=this.market(e),n={instId:o.id};void 0!==t&&(n.before=Math.max(t-1,0)),void 0!==i&&(n.limit=i);const d=await this.publicGetPublicFundingRateHistory(this.extend(n,s)),h=[],c=this.safeList(d,"data",[]);for(let e=0;e<c.length;e++){const t=c[e],i=this.safeInteger(t,"fundingTime");h.push({info:t,symbol:this.safeSymbol(this.safeString(t,"instId")),fundingRate:this.safeNumber(t,"realizedRate"),timestamp:i,datetime:this.iso8601(i)})}const l=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(l,o.symbol,t,i)}parseBalanceByType(e,t){return"funding"===e?this.parseFundingBalance(t):this.parseTradingBalance(t)}parseTradingBalance(e){const t={info:e},i=this.safeList(e,"data",[]),s=this.safeDict(i,0,{}),r=this.safeInteger(s,"uTime"),a=this.safeList(s,"details",[]);for(let e=0;e<a.length;e++){const i=a[e],s=this.safeString(i,"ccy"),r=this.safeCurrencyCode(s),o=this.account(),n=this.safeString(i,"eq"),d=this.safeString(i,"availEq");void 0===n||void 0===d?(o.free=this.safeString(i,"availBal"),o.used=this.safeString(i,"frozenBal")):(o.total=n,o.free=d),t[r]=o}return t.timestamp=r,t.datetime=this.iso8601(r),this.safeBalance(t)}parseFundingBalance(e){const t={info:e},i=this.safeList(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"ccy"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"bal"),o.free=this.safeString(s,"availBal"),o.used=this.safeString(s,"frozenBal"),t[a]=o}return this.safeBalance(t)}parseTradingFee(e,t=void 0){return{info:e,symbol:this.safeSymbol(void 0,t),maker:this.parseNumber(a.Y.stringNeg(this.safeString2(e,"maker","makerU"))),taker:this.parseNumber(a.Y.stringNeg(this.safeString2(e,"taker","takerU"))),percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={instType:this.convertToInstrumentType(i.type)};if(i.spot)s.instId=i.id;else{if(!(i.swap||i.future||i.option))throw new r.NotSupported(this.id+" fetchTradingFee() supports spot, swap, future or option markets only");s.uly=i.baseId+"-"+i.quoteId}const a=await this.privateGetAccountTradeFee(this.extend(s,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseTradingFee(n,i)}async fetchBalance(e={}){await this.loadMarkets();const[t,i]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),s={};let r;return r="funding"===t?await this.privateGetAssetBalances(this.extend(s,i)):await this.privateGetAccountBalance(this.extend(s,i)),this.parseBalanceByType(t,r)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot markets only");return await this.createOrder(e,"market","buy",t,void 0,this.extend({createMarketBuyOrderRequiresPrice:!1,tgtCcy:"quote_ccy"},i))}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketSellOrderWithCost() supports spot markets only");return await this.createOrder(e,"market","sell",t,void 0,this.extend({createMarketBuyOrderRequiresPrice:!1,tgtCcy:"quote_ccy"},i))}createOrderRequest(e,t,i,s,o=void 0,n={}){const d=this.market(e),h={instId:d.id,side:i,ordType:t,sz:this.amountToPrecision(e,s)},c=d.spot,l=d.contract,u=this.safeValueN(n,["triggerPrice","stopPrice","triggerPx"]),f=this.safeString(n,"timeInForce","GTC"),p=this.safeValue2(n,"takeProfitPrice","tpTriggerPx"),m=this.safeValue(n,"tpOrdPx",o),g=this.safeString(n,"tpTriggerPxType","last"),v=this.safeValue2(n,"stopLossPrice","slTriggerPx"),y=this.safeValue(n,"slOrdPx",o),w=this.safeString(n,"slTriggerPxType","last"),b=this.safeString2(n,"clOrdId","clientOrderId"),k=this.safeValue(n,"stopLoss"),S=void 0!==k,O=this.safeValue(n,"takeProfit"),T=void 0!==O,P=this.safeString2(n,"trailingPercent","callbackRatio"),I=void 0!==P,M=void 0!==u||"trigger"===t,x=this.safeValue(n,"reduceOnly",!1),A=this.safeString2(this.options,"defaultMarginMode","marginMode","cross");let C=this.safeString2(n,"marginMode","tdMode"),B=!1;if(void 0!==C&&"cash"!==C?B=!0:(C=A,B=this.safeBool(n,"margin",!1)),c){if(B){const e="buy"===i?d.quote:d.base,t=this.safeString(n,"ccy",e);h.ccy=this.safeCurrencyCode(t)}const e=B?C:"cash";h.tdMode=e}else if(l){if(d.swap||d.future){let e;if([e,n]=this.handleOptionAndParams(n,"createOrder","positionSide"),void 0!==e)h.posSide=e;else{let e;if([e,n]=this.handleOptionAndParams(n,"createOrder","hedged"),e){const e="buy"===i;void 0!==p||void 0!==v||x?(h.posSide=e?"short":"long",x&&(n=this.omit(n,"reduceOnly"))):h.posSide=e?"long":"short"}}}h.tdMode=C}const _="market"===t;let E=!1;[E,n]=this.handlePostOnly(_,"post_only"===t,n),n=this.omit(n,["currency","ccy","marginMode","timeInForce","stopPrice","triggerPrice","clientOrderId","stopLossPrice","takeProfitPrice","slOrdPx","tpOrdPx","margin","stopLoss","takeProfit","trailingPercent"]);const N="IOC"===f||"ioc"===t,R="FOK"===f||"fok"===t,L=void 0!==v||void 0!==p||"conditional"===t,D=_&&N||"optimal_limit_ioc"===t,q=this.safeString(this.options,"tgtCcy","base_ccy"),V=this.safeString(n,"tgtCcy",q);if(l||B||(h.tgtCcy=V),_||D){if(h.ordType="market",c&&"buy"===i&&"quote_ccy"===V){let t=!0;[t,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);let i=this.safeNumber2(n,"cost","sz");if(n=this.omit(n,["cost","sz"]),t){if(void 0!==o){if(void 0===i){const e=this.numberToString(s),t=this.numberToString(o),r=a.Y.stringMul(e,t);i=this.parseNumber(r)}}else if(void 0===i)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument with market buy orders to calculate total order cost (amount to spend), where cost = amount * price. Supply a price argument to createOrder() call if you want the cost to be calculated for you from price and amount, or, alternatively, add .options['createMarketBuyOrderRequiresPrice'] = false and supply the total cost value in the 'amount' argument or in the 'cost' unified extra parameter or in exchange-specific 'sz' extra parameter (the exchange-specific behaviour)")}else i=void 0===i?s:i;h.sz=this.costToPrecision(e,i)}D&&l&&(h.ordType="optimal_limit_ioc")}else M||L||(h.px=this.priceToPrecision(e,o));if(E?h.ordType="post_only":N&&!D?h.ordType="ioc":R&&(h.ordType="fok"),I){const e=a.Y.stringDiv(P,"100");h.callbackRatio=e,h.ordType="move_order_stop"}else if(S||T){if(S){const t=this.safeValueN(k,["triggerPrice","stopPrice","slTriggerPx"]);if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"], or params["stopLoss"]["stopPrice"], or params["stopLoss"]["slTriggerPx"] for a stop loss order');h.slTriggerPx=this.priceToPrecision(e,t);const i=this.safeValueN(k,["price","stopLossPrice","slOrdPx"]),s=this.safeString(k,"type");if(void 0!==s){const t="limit"===s;if(!t&&!("market"===s))throw new r.InvalidOrder(this.id+' createOrder() params["stopLoss"]["type"] must be either "limit" or "market"');if(t){if(void 0===i)throw new r.InvalidOrder(this.id+' createOrder() requires a limit price in params["stopLoss"]["price"] or params["stopLoss"]["slOrdPx"] for a stop loss limit order');h.slOrdPx=this.priceToPrecision(e,i)}else"market"===s&&(h.slOrdPx="-1")}else h.slOrdPx=void 0!==i?this.priceToPrecision(e,i):"-1";const a=this.safeString2(k,"triggerPriceType","slTriggerPxType","last");if(void 0!==a){if("last"!==a&&"index"!==a&&"mark"!==a)throw new r.InvalidOrder(this.id+' createOrder() stop loss trigger price type must be one of "last", "index" or "mark"');h.slTriggerPxType=a}}if(T){const t=this.safeValueN(O,["triggerPrice","stopPrice","tpTriggerPx"]);if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["takeProfit"]["triggerPrice"], or params["takeProfit"]["stopPrice"], or params["takeProfit"]["tpTriggerPx"] for a take profit order');h.tpTriggerPx=this.priceToPrecision(e,t);const i=this.safeValueN(O,["price","takeProfitPrice","tpOrdPx"]),s=this.safeString2(O,"type","tpOrdKind");if(void 0!==s){const t="limit"===s;if(!t&&!("market"===s))throw new r.InvalidOrder(this.id+' createOrder() params["takeProfit"]["type"] must be either "limit" or "market"');if(t){if(void 0===i)throw new r.InvalidOrder(this.id+' createOrder() requires a limit price in params["takeProfit"]["price"] or params["takeProfit"]["tpOrdPx"] for a take profit limit order');h.tpOrdKind=s,h.tpOrdPx=this.priceToPrecision(e,i)}else"market"===s&&(h.tpOrdPx="-1")}else void 0!==i?(h.tpOrdKind="limit",h.tpOrdPx=this.priceToPrecision(e,i)):h.tpOrdPx="-1";const a=this.safeString2(O,"triggerPriceType","tpTriggerPxType","last");if(void 0!==a){if("last"!==a&&"index"!==a&&"mark"!==a)throw new r.InvalidOrder(this.id+' createOrder() take profit trigger price type must be one of "last", "index" or "mark"');h.tpTriggerPxType=a}}}else if(M)h.ordType="trigger",h.triggerPx=this.priceToPrecision(e,u),h.orderPx=_?"-1":this.priceToPrecision(e,o);else if(L){h.ordType="conditional";if(void 0!==p&&void 0!==v&&(h.ordType="oco"),void 0!==p){h.tpTriggerPx=this.priceToPrecision(e,p);let t="-1";void 0!==m&&(t=this.priceToPrecision(e,m)),h.tpOrdPx=t,h.tpTriggerPxType=g}if(void 0!==v){h.slTriggerPx=this.priceToPrecision(e,v);let t="-1";void 0!==y&&(t=this.priceToPrecision(e,y)),h.slOrdPx=t,h.slTriggerPxType=w}}if(void 0===b){const e=this.safeString(this.options,"brokerId");void 0!==e&&(h.clOrdId=e+this.uuid16(),h.tag=e)}else h.clOrdId=b,n=this.omit(n,["clOrdId","clientOrderId"]);return this.extend(h,n)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);let d=this.createOrderRequest(e,t,i,s,a,o),h=this.safeString(this.options,"createOrder","privatePostTradeBatchOrders");const c=this.safeString(d,"ordType");if("trigger"!==c&&"conditional"!==c&&"move_order_stop"!==c&&"move_order_stop"!==t&&"oco"!==t&&"iceberg"!==t&&"twap"!==t||(h="privatePostTradeOrderAlgo"),"privatePostTradeOrder"!==h&&"privatePostTradeOrderAlgo"!==h&&"privatePostTradeBatchOrders"!==h)throw new r.ExchangeError(this.id+' createOrder() this.options["createOrder"] must be either privatePostTradeBatchOrders or privatePostTradeOrder or privatePostTradeOrderAlgo');let l;"privatePostTradeBatchOrders"===h&&(d=[d]),l="privatePostTradeOrder"===h?await this.privatePostTradeOrder(d):"privatePostTradeOrderAlgo"===h?await this.privatePostTradeOrderAlgo(d):await this.privatePostTradeBatchOrders(d);const u=this.safeList(l,"data",[]),f=this.safeDict(u,0,{}),p=this.parseOrder(f,n);return p.type=t,p.side=i,p}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"symbol"),o=this.safeString(r,"type"),n=this.safeString(r,"side"),d=this.safeValue(r,"amount"),h=this.safeValue(r,"price"),c=this.safeDict(r,"params",{}),l=this.extend(c,t),u=this.createOrderRequest(a,o,n,d,h,l);i.push(u)}const s=await this.privatePostTradeBatchOrders(i),r=this.safeList(s,"data",[]);return this.parseOrders(r)}editOrderRequest(e,t,i,s,a=void 0,o=void 0,n={}){const d={instId:this.market(t).id};let h;"trigger"!==i&&"conditional"!==i&&"move_order_stop"!==i&&"oco"!==i&&"iceberg"!==i&&"twap"!==i||(h=!0);const c=this.safeString2(n,"clOrdId","clientOrderId");void 0!==c?h?d.algoClOrdId=c:d.clOrdId=c:h?d.algoId=e:d.ordId=e;let l=this.safeValue2(n,"stopLossPrice","newSlTriggerPx"),u=this.safeValue(n,"newSlOrdPx");const f=this.safeString(n,"newSlTriggerPxType","last");let p=this.safeValue2(n,"takeProfitPrice","newTpTriggerPx"),m=this.safeValue(n,"newTpOrdPx");const g=this.safeString(n,"newTpTriggerPxType","last"),v=this.safeValue(n,"stopLoss"),y=this.safeValue(n,"takeProfit"),w=void 0!==v,b=void 0!==y;if(h){if(void 0===l&&void 0===p)throw new r.BadRequest(this.id+" editOrder() requires a stopLossPrice or takeProfitPrice parameter for editing an algo order");if(void 0!==l){if(void 0===u)throw new r.BadRequest(this.id+" editOrder() requires a newSlOrdPx parameter for editing an algo order");d.newSlTriggerPx=this.priceToPrecision(t,l),d.newSlOrdPx="market"===i?"-1":this.priceToPrecision(t,u),d.newSlTriggerPxType=f}if(void 0!==p){if(void 0===m)throw new r.BadRequest(this.id+" editOrder() requires a newTpOrdPx parameter for editing an algo order");d.newTpTriggerPx=this.priceToPrecision(t,p),d.newTpOrdPx="market"===i?"-1":this.priceToPrecision(t,m),d.newTpTriggerPxType=g}}else{if(void 0!==l&&(d.newSlTriggerPx=this.priceToPrecision(t,l),d.newSlOrdPx="market"===i?"-1":this.priceToPrecision(t,u),d.newSlTriggerPxType=f),void 0!==p&&(d.newTpTriggerPx=this.priceToPrecision(t,p),d.newTpOrdPx="market"===i?"-1":this.priceToPrecision(t,m),d.newTpTriggerPxType=g),w){l=this.safeValue(v,"triggerPrice"),u=this.safeValue(v,"price");const e=this.safeString(v,"type");d.newSlTriggerPx=this.priceToPrecision(t,l),d.newSlOrdPx="market"===e?"-1":this.priceToPrecision(t,u),d.newSlTriggerPxType=f}if(b){p=this.safeValue(y,"triggerPrice"),m=this.safeValue(y,"price");const e=this.safeString(y,"type");d.newTpOrdKind="limit"===e?e:"condition",d.newTpTriggerPx=this.priceToPrecision(t,p),d.newTpOrdPx="market"===e?"-1":this.priceToPrecision(t,m),d.newTpTriggerPxType=g}}return void 0!==a&&(d.newSz=this.amountToPrecision(t,a)),h||void 0!==o&&(d.newPx=this.priceToPrecision(t,o)),n=this.omit(n,["clOrdId","clientOrderId","takeProfitPrice","stopLossPrice","stopLoss","takeProfit","postOnly"]),this.extend(d,n)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d=this.editOrderRequest(e,t,i,s,r,a,o);let h,c;"trigger"!==i&&"conditional"!==i&&"move_order_stop"!==i&&"oco"!==i&&"iceberg"!==i&&"twap"!==i||(h=!0),c=h?await this.privatePostTradeAmendAlgos(this.extend(d,o)):await this.privatePostTradeAmendOrder(this.extend(d,o));const l=this.safeList(c,"data",[]),u=this.safeDict(l,0,{}),f=this.parseOrder(u,n);return f.type=i,f.side=s,f}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const s=this.safeValue2(i,"stop","trigger"),a=this.safeBool(i,"trailing",!1);if(s||a){const s=await this.cancelOrders([e],t,i);return this.safeValue(s,0)}await this.loadMarkets();const o=this.market(t),n={instId:o.id},d=this.safeString2(i,"clOrdId","clientOrderId");void 0!==d?n.clOrdId=d:n.ordId=e;const h=this.omit(i,["clOrdId","clientOrderId"]),c=await this.privatePostTradeCancelOrder(this.extend(n,h)),l=this.safeValue(c,"data",[]),u=this.safeDict(l,0);return this.parseOrder(u,o)}parseIds(e){return void 0!==e&&"string"==typeof e?e.split(","):e}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a=[],o=this.safeValue(this.options,"cancelOrders",{}),n=this.safeString(o,"method","privatePostTradeCancelBatchOrders");let d=this.safeString(i,"method",n);const h=this.parseIds(this.safeValue2(i,"clOrdId","clientOrderId")),c=this.parseIds(this.safeValue(i,"algoId")),l=this.safeValue2(i,"stop","trigger"),u=this.safeBool(i,"trailing",!1);if((l||u)&&(d="privatePostTradeCancelAlgos"),void 0===h){if(e=this.parseIds(e),void 0!==c)for(let e=0;e<c.length;e++)a.push({algoId:c[e],instId:s.id});for(let t=0;t<e.length;t++)u||l?a.push({algoId:e[t],instId:s.id}):a.push({ordId:e[t],instId:s.id})}else for(let e=0;e<h.length;e++)a.push({instId:s.id,clOrdId:h[e]});let f;f="privatePostTradeCancelAlgos"===d?await this.privatePostTradeCancelAlgos(a):await this.privatePostTradeCancelBatchOrders(a);const p=this.safeList(f,"data",[]);return this.parseOrders(p,s,void 0,void 0,i)}async cancelOrdersForSymbols(e,t={}){await this.loadMarkets();const i=[],s=this.safeDict(this.options,"cancelOrders",{}),r=this.safeString(s,"method","privatePostTradeCancelBatchOrders");let a=this.safeString(t,"method",r);const o=this.safeBool2(t,"stop","trigger"),n=this.safeBool(t,"trailing",!1),d=o||n;d&&(a="privatePostTradeCancelAlgos");for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"id"),a=this.safeString2(s,"clOrdId","clientOrderId"),o=this.safeString(s,"symbol");let n="ordId";d?n="algoId":void 0!==a&&(n="clOrdId");const h={instId:this.market(o).id};h[n]=void 0!==a?a:r,i.push(h)}let h;h="privatePostTradeCancelAlgos"===a?await this.privatePostTradeCancelAlgos(i):await this.privatePostTradeCancelBatchOrders(i);const c=this.safeList(h,"data",[]);return this.parseOrders(c,void 0,void 0,void 0,t)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={timeOut:e>0?this.parseToInt(e/1e3):0};return await this.privatePostTradeCancelAllAfter(this.extend(i,t))}parseOrderStatus(e){return this.safeString({canceled:"canceled",order_failed:"canceled",live:"open",partially_filled:"open",filled:"closed",effective:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"sCode");if(void 0!==i&&"0"!==i)return this.safeOrder({id:this.safeString(e,"ordId"),clientOrderId:this.safeString(e,"clOrdId"),status:"rejected",info:e});const s=this.safeString2(e,"algoId","ordId"),r=this.safeInteger(e,"cTime"),o=this.safeInteger(e,"uTime"),n=this.safeInteger(e,"fillTime"),d=this.safeString(e,"side");let h,c,l=this.safeString(e,"ordType");"post_only"===l?(h=!0,l="limit"):"fok"===l?(c="FOK",l="limit"):"ioc"===l&&(c="IOC",l="limit");const u=this.safeString(e,"instId");t=this.safeMarket(u,t);const f=this.safeSymbol(u,t,"-"),p=this.safeString(e,"accFillSz"),m=this.safeString2(e,"px","ordPx"),g=this.safeString(e,"avgPx"),v=this.parseOrderStatus(this.safeString(e,"state")),y=this.safeString(e,"fee");let w,b;const k=this.safeString(this.options,"tgtCcy","base_ccy"),S=this.safeString(e,"tgtCcy",k),O=this.safeString(e,"instType");let T;if("buy"===d&&"market"===l&&"SPOT"===O&&"quote_ccy"===S?b=this.safeString(e,"sz"):w=this.safeString(e,"sz"),void 0!==y){const t=a.Y.stringNeg(y),i=this.safeString(e,"feeCcy"),s=this.safeCurrencyCode(i);T={cost:this.parseNumber(t),currency:s}}let P=this.safeString(e,"clOrdId");void 0!==P&&P.length<1&&(P=void 0);const I=this.safeNumber2(e,"slTriggerPx","slOrdPx"),M=this.safeNumber2(e,"tpTriggerPx","tpOrdPx"),x=this.safeString(e,"reduceOnly");let A=!1;return void 0!==A&&(A="true"===x),this.safeOrder({info:e,id:s,clientOrderId:P,timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:n,lastUpdateTimestamp:o,symbol:f,type:l,timeInForce:c,postOnly:h,side:d,price:m,stopLossPrice:I,takeProfitPrice:M,triggerPrice:this.safeNumberN(e,["triggerPx","moveTriggerPx"]),average:g,cost:b,amount:w,filled:p,remaining:void 0,status:v,fee:T,trades:void 0,reduceOnly:A},t)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={instId:s.id},o=this.safeString2(i,"clOrdId","clientOrderId"),n=this.safeValue(this.options,"fetchOrder",{}),d=this.safeString(n,"method","privateGetTradeOrder");let h=this.safeString(i,"method",d);this.safeValue2(i,"stop","trigger")?(h="privateGetTradeOrderAlgo",void 0!==o?a.algoClOrdId=o:a.algoId=e):void 0!==o?a.clOrdId=o:a.ordId=e;const c=this.omit(i,["method","clOrdId","clientOrderId","stop","trigger"]);let l;l="privateGetTradeOrderAlgo"===h?await this.privateGetTradeOrderAlgo(this.extend(a,c)):await this.privateGetTradeOrder(this.extend(a,c));const u=this.safeValue(l,"data",[]),f=this.safeDict(u,0);return this.parseOrder(f,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOpenOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchOpenOrders",e,t,i,s);const a={};let o;void 0!==e&&(o=this.market(e),a.instId=o.id),void 0!==i&&(a.limit=i);const n=this.safeValue(this.options,"fetchOpenOrders",{}),d=this.safeValue(this.options,"algoOrderTypes",{}),h=this.safeString(n,"method","privateGetTradeOrdersPending");let c=this.safeString(s,"method",h);const l=this.safeString(s,"ordType"),u=this.safeValue2(s,"stop","trigger"),f=this.safeBool(s,"trailing",!1);(f||u||l in d)&&(c="privateGetTradeOrdersAlgoPending"),f?a.ordType="move_order_stop":u&&void 0===l&&(a.ordType="trigger");const p=this.omit(s,["method","stop","trigger","trailing"]);let m;m="privateGetTradeOrdersAlgoPending"===c?await this.privateGetTradeOrdersAlgoPending(this.extend(a,p)):await this.privateGetTradeOrdersPending(this.extend(a,p));const g=this.safeList(m,"data",[]);return this.parseOrders(g,o,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o,n,d;void 0!==e&&(o=this.market(e),a.instId=o.id),[n,d]=this.handleMarketTypeAndParams("fetchCanceledOrders",o,s),a.instType=this.convertToInstrumentType(n),void 0!==i&&(a.limit=i),a.state="canceled";const h=this.safeValue(this.options,"fetchCanceledOrders",{}),c=this.safeValue(this.options,"algoOrderTypes",{}),l=this.safeString(h,"method","privateGetTradeOrdersHistory");let u=this.safeString(s,"method",l);const f=this.safeString(s,"ordType"),p=this.safeValue2(s,"stop","trigger");if(this.safeBool(s,"trailing",!1))u="privateGetTradeOrdersAlgoHistory",a.ordType="move_order_stop";else if(p||f in c){u="privateGetTradeOrdersAlgoHistory";const e=this.safeString(s,"algoId");if(void 0!==e&&(a.algoId=e,s=this.omit(s,"algoId")),p&&void 0===f)throw new r.ArgumentsRequired(this.id+' fetchCanceledOrders() requires an "ordType" string parameter, "conditional", "oco", "trigger", "move_order_stop", "iceberg", or "twap"')}else{void 0!==t&&(a.begin=t);const e=this.safeInteger(d,"until");void 0!==e&&(a.end=e,d=this.omit(d,["until"]))}const m=this.omit(d,["method","stop","trigger","trailing"]);let g;g="privateGetTradeOrdersAlgoHistory"===u?await this.privateGetTradeOrdersAlgoHistory(this.extend(a,m)):await this.privateGetTradeOrdersHistory(this.extend(a,m));const v=this.safeList(g,"data",[]);return this.parseOrders(v,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchClosedOrders","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchClosedOrders",e,t,i,s);const a={};let o,n,d;void 0!==e&&(o=this.market(e),a.instId=o.id),[n,d]=this.handleMarketTypeAndParams("fetchClosedOrders",o,s),a.instType=this.convertToInstrumentType(n),void 0!==i&&(a.limit=i);const h=this.safeDict(this.options,"fetchClosedOrders",{}),c=this.safeDict(this.options,"algoOrderTypes",{}),l=this.safeString(h,"method","privateGetTradeOrdersHistory");let u=this.safeString(s,"method",l);const f=this.safeString(s,"ordType"),p=this.safeBool2(s,"stop","trigger"),m=this.safeBool(s,"trailing",!1);if((m||p||f in c)&&(u="privateGetTradeOrdersAlgoHistory",a.state="effective"),m)a.ordType="move_order_stop";else if(p)void 0===f&&(a.ordType="trigger");else{void 0!==t&&(a.begin=t);const e=this.safeInteger(d,"until");void 0!==e&&(a.end=e,d=this.omit(d,["until"])),a.state="filled"}const g=this.omit(d,["method","stop","trigger","trailing"]);let v;v="privateGetTradeOrdersAlgoHistory"===u?await this.privateGetTradeOrdersAlgoHistory(this.extend(a,g)):"privateGetTradeOrdersHistoryArchive"===u?await this.privateGetTradeOrdersHistoryArchive(this.extend(a,g)):await this.privateGetTradeOrdersHistory(this.extend(a,g));const y=this.safeList(v,"data",[]);return this.parseOrders(y,o,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);let a,o={};void 0!==e&&(a=this.market(e),o.instId=a.id),void 0!==t&&(o.begin=t),[o,s]=this.handleUntilOption("end",o,s);const[n,d]=this.handleMarketTypeAndParams("fetchMyTrades",a,s);o.instType=this.convertToInstrumentType(n),void 0!==i&&void 0===t&&(o.limit=i);const h=await this.privateGetTradeFillsHistory(this.extend(o,d)),c=this.safeList(h,"data",[]);return this.parseTrades(c,a,t,i,d)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){const a={ordId:e};return await this.fetchMyTrades(t,i,s,this.extend(a,r))}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchLedger","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchLedger",e,t,i,s);const a=this.safeDict(this.options,"fetchLedger",{});let o=this.safeString(a,"method");o=this.safeString(s,"method",o),s=this.omit(s,"method");let n,d={};[n,s]=this.handleMarginModeAndParams("fetchLedger",s),void 0===n&&(n=this.safeString(s,"mgnMode")),"privateGetAssetBills"!==o&&void 0!==n&&(d.mgnMode=n);const[h,c]=this.handleMarketTypeAndParams("fetchLedger",void 0,s);let l,u;void 0!==h&&(d.instType=this.convertToInstrumentType(h)),void 0!==i&&(d.limit=i),void 0!==e&&(l=this.currency(e),d.ccy=l.id),[d,s]=this.handleUntilOption("end",d,s),u="privateGetAccountBillsArchive"===o?await this.privateGetAccountBillsArchive(this.extend(d,c)):"privateGetAssetBills"===o?await this.privateGetAssetBills(this.extend(d,c)):await this.privateGetAccountBills(this.extend(d,c));const f=this.safeList(u,"data",[]);return this.parseLedger(f,l,t,i)}parseLedgerEntryType(e){return this.safeString({1:"transfer",2:"trade",3:"trade",4:"rebate",5:"trade",6:"transfer",7:"trade",8:"fee",9:"trade",10:"trade",11:"trade"},e,e)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"ccy"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeInteger(e,"ts"),o=this.safeString(e,"fee");let n;void 0!==o&&(n={cost:this.parseNumber(a.Y.stringNeg(o)),currency:s});const d=this.safeString(e,"instId"),h=this.safeSymbol(d,void 0,"-");return this.safeLedgerEntry({info:e,id:this.safeString(e,"billId"),timestamp:r,datetime:this.iso8601(r),account:void 0,referenceId:this.safeString(e,"ordId"),referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:s,symbol:h,amount:this.safeNumber(e,"balChg"),before:void 0,after:this.safeNumber(e,"bal"),status:"ok",fee:n},t)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"addr");let s=this.safeStringN(e,["tag","pmtId","memo"]);if(void 0===s){const t=this.safeValue(e,"addrEx",{});s=this.safeString(t,"comment")}const r=this.safeString(e,"ccy"),a=(t=this.safeCurrency(r,t)).code,o=this.safeString(e,"chain"),n=this.safeValue(t,"networks",{}),d=this.indexBy(n,"id");let h=this.safeValue(d,o);"USDT-Polygon"===o&&(h=this.safeValue2(d,"USDT-Polygon-Bridge","USDT-Polygon"));const c=this.safeString(h,"network"),l=this.networkIdToCode(c,a);return this.checkAddress(i),{info:e,currency:a,network:l,address:i,tag:s}}async fetchDepositAddressesByNetwork(e,t={}){await this.loadMarkets();const i=this.currency(e),s={ccy:i.id},r=await this.privateGetAssetDepositAddress(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.filterBy(a,"selected",!0),n=this.parseDepositAddresses(o,[i.code],!1);return this.indexBy(n,"network")}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.safeStringUpper(t,"network");t=this.omit(t,"network"),e=this.safeCurrencyCode(e);const s=this.networkIdToCode(i,e),a=await this.fetchDepositAddressesByNetwork(e,t);if(void 0!==s){const t=this.safeDict(a,s);if(void 0===t)throw new r.InvalidAddress(this.id+" fetchDepositAddress() cannot find "+s+" deposit address for "+e);return t}const o=this.networkIdToCode(e,e);if(o in a)return a[o];const n=Object.keys(a),d=this.safeString(n,0);return this.safeDict(a,d)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);void 0!==s&&s.length>0&&(i=i+":"+s);const n={ccy:o.id,toAddr:i,dest:"4",amt:this.numberToString(t)};let d=this.safeString(a,"network");if(void 0!==d){const e=this.safeDict(this.options,"networks",{});d=this.safeString(e,d.toUpperCase(),d),n.chain=o.id+"-"+d,a=this.omit(a,"network")}let h=this.safeString(a,"fee");if(void 0===h){const e=await this.fetchCurrencies();this.currencies=this.deepExtend(this.currencies,e);const t=this.safeDict(o.networks,this.networkIdToCode(d),{});if(h=this.safeString(t,"fee"),void 0===h)throw new r.ArgumentsRequired(this.id+' withdraw() requires a "fee" string parameter, network transaction fee must be ≥ 0. Withdrawals to OKCoin or OKX are fee-free, please set "0". Withdrawing to external digital asset address requires network transaction fee.')}n.fee=this.numberToString(h);const c=this.omit(a,["fee"]),l=await this.privatePostAssetWithdrawal(this.extend(n,c)),u=this.safeList(l,"data",[]),f=this.safeDict(u,0);return this.parseTransaction(f,o)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchDeposits",e,t,i,s);let a,o={};void 0!==e&&(a=this.currency(e),o.ccy=a.id),void 0!==t&&(o.before=Math.max(t-1,0)),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("after",o,s);const n=await this.privateGetAssetDepositHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,s)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={depId:e};let r;void 0!==t&&(r=this.currency(t),s.ccy=r.id);const a=await this.privateGetAssetDepositHistory(this.extend(s,i)),o=this.safeValue(a,"data"),n=this.safeDict(o,0,{});return this.parseTransaction(n,r)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallDynamic("fetchWithdrawals",e,t,i,s);let a,o={};void 0!==e&&(a=this.currency(e),o.ccy=a.id),void 0!==t&&(o.before=Math.max(t-1,0)),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("after",o,s);const n=await this.privateGetAssetWithdrawalHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,a,t,i,s)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={wdId:e};let r;void 0!==t&&(r=this.currency(t),s.ccy=r.id);const a=await this.privateGetAssetWithdrawalHistory(this.extend(s,i)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseTransaction(n)}parseTransactionStatus(e){return this.safeString({"-3":"pending","-2":"canceled","-1":"failed",0:"pending",1:"pending",2:"ok",3:"pending",4:"pending",5:"pending",6:"pending",7:"pending",8:"pending",9:"pending",10:"pending",12:"pending",15:"pending",16:"pending"},e,e)}parseTransaction(e,t=void 0){let i,s;const r=this.safeString(e,"wdId"),a=this.safeString(e,"from"),o=this.safeString(e,"to"),n=o;let d=this.safeString2(e,"tag","memo");d=this.safeString2(e,"pmtId",d),void 0!==r?(i="withdrawal",s=r):(s=this.safeString(e,"depId"),i="deposit");const h=this.safeString(e,"ccy"),c=this.safeCurrencyCode(h),l=this.safeNumber(e,"amt"),u=this.parseTransactionStatus(this.safeString(e,"state")),f=this.safeString(e,"txId"),p=this.safeInteger(e,"ts");let m;return m="deposit"===i?0:this.safeNumber(e,"fee"),{info:e,id:s,currency:c,amount:l,network:void 0,addressFrom:a,addressTo:o,address:n,tagFrom:void 0,tagTo:d,tag:d,status:u,type:i,updated:void 0,txid:f,timestamp:p,datetime:this.iso8601(p),internal:void 0,comment:void 0,fee:{currency:c,cost:m}}}async fetchLeverage(e,t={}){let i;if(await this.loadMarkets(),[i,t]=this.handleMarginModeAndParams("fetchLeverage",t),void 0===i&&(i=this.safeString(t,"mgnMode","cross")),"cross"!==i&&"isolated"!==i)throw new r.BadRequest(this.id+" fetchLeverage() requires a marginMode parameter that must be either cross or isolated");const s=this.market(e),a={instId:s.id,mgnMode:i},o=await this.privateGetAccountLeverageInfo(this.extend(a,t)),n=this.safeList(o,"data",[]);return this.parseLeverage(n,s)}parseLeverage(e,t=void 0){let i,s,r,a;for(let t=0;t<e.length;t++){const o=e[t];s=this.safeStringLower(o,"mgnMode"),i=this.safeString(o,"instId");const n=this.safeStringLower(o,"posSide");"long"===n?r=this.safeInteger(o,"lever"):("short"===n||(r=this.safeInteger(o,"lever")),a=this.safeInteger(o,"lever"))}return{info:e,symbol:this.safeSymbol(i,t),marginMode:s,longLeverage:r,shortLeverage:a}}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),[s,r]=this.handleMarketTypeAndParams("fetchPosition",i,t),a={instId:i.id};void 0!==s&&(a.instType=this.convertToInstrumentType(s));const o=await this.privateGetAccountPositions(this.extend(a,r)),n=this.safeList(o,"data",[]),d=this.safeDict(n,0);if(void 0!==d)return this.parsePosition(d,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=[];for(let i=0;i<e.length;i++){const s=e[i],r=this.market(s);t.push(r.id)}t.length>0&&(i.instId=t.join(","))}const s=this.safeDict(this.options,"fetchPositions",{});let r;r="privateGetAccountPositionsHistory"===this.safeString(s,"method","privateGetAccountPositions")?await this.privateGetAccountPositionsHistory(this.extend(i,t)):await this.privateGetAccountPositions(this.extend(i,t));const a=this.safeList(r,"data",[]),o=[];for(let e=0;e<a.length;e++)o.push(this.parsePosition(a[e]));return this.filterByArrayPositions(o,"symbol",this.marketSymbols(e),!1)}async fetchPositionsForSymbol(e,t={}){return await this.fetchPositions([e],t)}parsePosition(e,t=void 0){const i=this.safeString(e,"instId"),s=(t=this.safeMarket(i,t,void 0,"contract")).symbol,r=this.safeString(e,"pos"),o=a.Y.stringAbs(r);let n=this.safeString2(e,"posSide","direction");const d="net"!==n,h=this.parseNumber(o);if(t.margin){if("net"===n){const i=this.safeString(e,"posCcy"),s=this.safeCurrencyCode(i);void 0!==s&&(n=t.base===s?"long":"short")}void 0===n&&(n=this.safeString(e,"direction"))}else void 0!==r&&"net"===n&&(n=a.Y.stringGt(r,"0")?"long":a.Y.stringLt(r,"0")?"short":void 0);const c=this.safeNumber(t,"contractSize"),l=this.numberToString(c),u=this.safeString(e,"markPx");let f=this.safeString(e,"notionalUsd");t.inverse&&(f=a.Y.stringDiv(a.Y.stringMul(o,l),u));const p=this.parseNumber(f),m=this.safeString(e,"mgnMode");let g;const v=this.safeString2(e,"avgPx","openAvgPx"),y=this.safeString(e,"upl"),w=this.safeString(e,"lever");let b,k;"cross"===m?(g=this.safeString(e,"imr"),k=a.Y.stringAdd(g,y)):"isolated"===m&&(b=a.Y.stringDiv("1",w),k=this.safeString(e,"margin"));const S=this.safeString(e,"mmr"),O=this.parseNumber(S),T=a.Y.stringDiv(S,f);void 0===b?b=this.parseNumber(a.Y.stringDiv(g,f,4)):void 0===g&&(g=a.Y.stringMul(b,f));const P=this.parseNumber(a.Y.stringDiv(a.Y.stringAdd(T,"0.00005"),"1",4)),I=this.safeNumber(e,"liqPx"),M=this.safeString(e,"uplRatio"),x=this.parseNumber(a.Y.stringMul(M,"100")),A=this.safeInteger(e,"cTime"),C=this.parseNumber(a.Y.stringDiv(S,k,4));return this.safePosition({info:e,id:this.safeString(e,"posId"),symbol:s,notional:p,marginMode:m,liquidationPrice:I,entryPrice:this.parseNumber(v),unrealizedPnl:this.parseNumber(y),realizedPnl:this.safeNumber(e,"realizedPnl"),percentage:x,contracts:h,contractSize:c,markPrice:this.parseNumber(u),lastPrice:this.safeNumber(e,"closeAvgPx"),side:n,hedged:d,timestamp:A,datetime:this.iso8601(A),lastUpdateTimestamp:this.safeInteger(e,"uTime"),maintenanceMargin:O,maintenanceMarginPercentage:P,collateral:this.parseNumber(k),initialMargin:this.parseNumber(g),initialMarginPercentage:this.parseNumber(b),leverage:this.parseNumber(w),marginRatio:C,stopLossPrice:void 0,takeProfitPrice:void 0})}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeDict(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h={ccy:a.id,amt:this.currencyToPrecision(e,t),type:"0",from:n,to:d};"master"===n?(h.type="1",h.subAcct=d,h.from=this.safeString(r,"from","6"),h.to=this.safeString(r,"to","6")):"master"===d&&(h.type="2",h.subAcct=n,h.from=this.safeString(r,"from","6"),h.to=this.safeString(r,"to","6"));const c=await this.privatePostAssetTransfer(this.extend(h,r)),l=this.safeList(c,"data",[]),u=this.safeDict(l,0,{});return this.parseTransfer(u,a)}parseTransfer(e,t=void 0){const i=this.safeString2(e,"transId","billId"),s=this.safeString(e,"ccy"),r=this.safeCurrencyCode(s,t);let o=this.safeNumber(e,"amt");const n=this.safeString(e,"from"),d=this.safeString(e,"to"),h=this.safeDict(this.options,"accountsById",{}),c=this.safeInteger(e,"ts"),l=this.safeString(e,"sz");return void 0!==l&&(o=this.parseNumber(a.Y.stringAbs(l))),{info:e,id:i,timestamp:c,datetime:this.iso8601(c),currency:r,amount:o,fromAccount:this.safeString(h,n),toAccount:this.safeString(h,d),status:this.parseTransferStatus(this.safeString(e,"state"))}}parseTransferStatus(e){return this.safeString({success:"ok"},e,e)}async fetchTransfer(e,t=void 0,i={}){await this.loadMarkets();const s={transId:e},r=await this.privateGetAssetTransferState(this.extend(s,i)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0);return this.parseTransfer(o)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={type:"1"};void 0!==e&&(r=this.currency(e),a.ccy=r.id),void 0!==t&&(a.begin=t),void 0!==i&&(a.limit=i);const o=await this.privateGetAccountBillsArchive(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTransfers(n,r,t,i,s)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=Array.isArray(s),d="/api/"+this.version+"/"+this.implodeParams(e,s),h=this.omit(s,this.extractParams(e));let c=this.implodeHostname(this.urls.api.rest)+d;if("public"===t)Object.keys(h).length&&(c+="?"+this.urlencode(h));else if("private"===t){if(this.checkRequiredCredentials(),"POST"===i&&("trade/batch-orders"===e||"trade/order-algo"===e||"trade/order"===e)){const e=this.safeString(this.options,"brokerId","e847386590ce4dBC");if(Array.isArray(s))for(let t=0;t<s.length;t++){const i=s[t];void 0===this.safeString(i,"clOrdId")&&(i.clOrdId=e+this.uuid16(),i.tag=e,s[t]=i)}else{void 0===this.safeString(s,"clOrdId")&&(s.clOrdId=e+this.uuid16(),s.tag=e)}}const t=this.iso8601(this.nonce());r={"OK-ACCESS-KEY":this.apiKey,"OK-ACCESS-PASSPHRASE":this.password,"OK-ACCESS-TIMESTAMP":t};let l=t+i+d;if("GET"===i){if(Object.keys(h).length){const e="?"+this.urlencode(h);c+=e,l+=e}}else(o||Object.keys(h).length)&&(l+=a=this.json(h)),r["Content-Type"]="application/json";const u=this.hmac(this.encode(l),this.encode(this.secret),n.s,"base64");r["OK-ACCESS-SIGN"]=u}return{url:c,method:i,body:a,headers:r}}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"nextFundingTime"),s=this.safeString(e,"instId"),r=this.safeSymbol(s,t),o=this.safeNumber(e,"nextFundingRate"),n=this.safeInteger(e,"fundingTime"),d=this.safeString(e,"fundingTime"),h=this.safeString(e,"nextFundingRate"),c=a.Y.stringSub(h,d);return{info:e,symbol:r,markPrice:void 0,indexPrice:void 0,interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:n,fundingDatetime:this.iso8601(n),nextFundingRate:o,nextFundingTimestamp:i,nextFundingDatetime:this.iso8601(i),previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(c)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.ExchangeError(this.id+" fetchFundingRate() is only valid for swap markets");const s={instId:i.id},a=await this.publicGetPublicFundingRate(this.extend(s,t)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseFundingRate(n,i)}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={type:"8"};let a;void 0!==i&&(r.limit=i.toString()),void 0!==e&&(a=this.market(e),e=a.symbol,a.contract&&(a.linear?(r.ctType="linear",r.ccy=a.quoteId):(r.ctType="inverse",r.ccy=a.baseId)));const[o,n]=this.handleMarketTypeAndParams("fetchFundingHistory",a,s);"swap"===o&&(r.instType=this.convertToInstrumentType(o));const d=await this.privateGetAccountBillsArchive(this.extend(r,n)),h=this.safeList(d,"data",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeInteger(t,"ts"),s=this.safeString(t,"instId"),r=this.safeMarket(s),a=this.safeString(t,"ccy"),o=this.safeCurrencyCode(a);c.push({info:t,symbol:r.symbol,code:o,timestamp:i,datetime:this.iso8601(i),id:this.safeString(t,"billId"),amount:this.safeNumber(t,"balChg")})}const l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,e,t,i)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<1||e>125)throw new r.BadRequest(this.id+" setLeverage() leverage should be between 1 and 125");await this.loadMarkets();const s=this.market(t);let a;if([a,i]=this.handleMarginModeAndParams("setLeverage",i),void 0===a&&(a=this.safeString(i,"mgnMode","cross")),"cross"!==a&&"isolated"!==a)throw new r.BadRequest(this.id+" setLeverage() requires a marginMode parameter that must be either cross or isolated");const o={lever:e,mgnMode:a,instId:s.id},n=this.safeString(i,"posSide","net");if("isolated"===a){if("long"!==n&&"short"!==n&&"net"!==n)throw new r.BadRequest(this.id+' setLeverage() requires the posSide argument to be either "long", "short" or "net"');o.posSide=n}return await this.privatePostAccountSetLeverage(this.extend(o,i))}async fetchPositionMode(e=void 0,t={}){const i=await this.fetchAccounts();let s;if(i.length>1){const e=this.safeString(t,"accountId");if(void 0===e){const e=this.getListFromObjectValues(i,"id");throw new r.ExchangeError(this.id+' fetchPositionMode() can not detect position mode, because you have multiple accounts. Set params["accountId"] to desired id from: '+e.join(", "))}{const t=this.indexBy(i,"id");s=this.safeDict(t,e)}}else s=i[0];const a=s.info;return{info:a,hedged:"long_short_mode"===this.safeString(a,"posMode")}}async setPositionMode(e,t=void 0,i={}){let s;s=e?"long_short_mode":"net_mode";const r={posMode:s};return await this.privatePostAccountSetPositionMode(this.extend(r,i))}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("cross"!==(e=e.toLowerCase())&&"isolated"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode must be either cross or isolated");await this.loadMarkets();const s=this.market(t),a=this.safeInteger2(i,"lever","leverage");if(void 0===a||a<1||a>125)throw new r.BadRequest(this.id+' setMarginMode() params["lever"] should be between 1 and 125');i=this.omit(i,["leverage"]);const o={lever:a,mgnMode:e,instId:s.id};return await this.privatePostAccountSetLeverage(this.extend(o,i))}async fetchCrossBorrowRates(e={}){await this.loadMarkets();const t=await this.privateGetAccountInterestRate(e),i=this.safeList(t,"data",[]),s=[];for(let e=0;e<i.length;e++)s.push(this.parseBorrowRate(i[e]));return s}async fetchCrossBorrowRate(e,t={}){await this.loadMarkets();const i={ccy:this.currency(e).id},s=await this.privateGetAccountInterestRate(this.extend(i,t)),r=this.safeList(s,"data",[]),a=this.safeDict(r,0,{});return this.parseBorrowRate(a)}parseBorrowRate(e,t=void 0){const i=this.safeString(e,"ccy"),s=this.safeInteger(e,"ts");return{currency:this.safeCurrencyCode(i),rate:this.safeNumber2(e,"interestRate","rate"),period:864e5,timestamp:s,datetime:this.iso8601(s),info:e}}parseBorrowRateHistories(e,t,i,s){const r={};for(let i=0;i<e.length;i++){const s=e[i],a=this.safeCurrencyCode(this.safeString(s,"ccy"));if(void 0===t||this.inArray(a,t)){a in r||(r[a]=[]);const e=this.parseBorrowRate(s);r[a].push(e)}}const a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e];r[t]=this.filterByCurrencySinceLimit(r[t],t,i,s)}return r}async fetchBorrowRateHistories(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};void 0!==t&&(r.before=t),void 0!==i&&(r.limit=i);const a=await this.publicGetFinanceSavingsLendingRateHistory(this.extend(r,s)),o=this.safeList(a,"data",[]);return this.parseBorrowRateHistories(o,e,t,i)}async fetchBorrowRateHistory(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={ccy:this.currency(e).id};void 0!==t&&(r.before=t),void 0!==i&&(r.limit=i);const a=await this.publicGetFinanceSavingsLendingRateHistory(this.extend(r,s)),o=this.safeList(a,"data",[]);return this.parseBorrowRateHistory(o,e,t,i)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r=this.market(e),a=this.safeString(s,"posSide","net");s=this.omit(s,["posSide"]);const o={instId:r.id,amt:t,type:i,posSide:a},n=await this.privatePostAccountPositionMarginBalance(this.extend(o,s)),d=this.safeList(n,"data",[]),h=this.safeDict(d,0,{}),c=this.safeString(n,"code");return this.extend(this.parseMarginModification(h,r),{status:"0"===c?"ok":"failed"})}parseMarginModification(e,t=void 0){const i=this.safeString2(e,"amt","posBalChg"),s=this.safeString(e,"type");let r;r="6"===s?a.Y.stringGt(i,"0")?"add":"reduce":s;const o=a.Y.stringAbs(i),n=this.safeString(e,"instId"),d=this.safeMarket(n,t),h=d.inverse?d.base:d.quote,c=this.safeInteger(e,"ts");return{info:e,symbol:d.symbol,type:r,marginMode:"isolated",amount:this.parseNumber(o),code:h,total:void 0,status:void 0,timestamp:c,datetime:this.iso8601(c)}}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"reduce",i)}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"add",i)}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e),s=i.spot?"MARGIN":this.convertToInstrumentType(i.type),a=this.safeString(i.info,"uly");if(!a&&"MARGIN"!==s)throw new r.BadRequest(this.id+" fetchMarketLeverageTiers() cannot fetch leverage tiers for "+e);let o;[o,t]=this.handleMarginModeAndParams("fetchMarketLeverageTiers",t),void 0===o&&(o=this.safeString(t,"tdMode","cross"));const n={instType:s,tdMode:o,uly:a};"MARGIN"===s&&(n.instId=i.id);const d=await this.publicGetPublicPositionTiers(this.extend(n,t)),h=this.safeList(d,"data",[]);return this.parseMarketLeverageTiers(h,i)}parseMarketLeverageTiers(e,t=void 0){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"instId");i.push({tier:this.safeInteger(r,"tier"),symbol:this.safeSymbol(a,t),currency:t.quote,minNotional:this.safeNumber(r,"minSz"),maxNotional:this.safeNumber(r,"maxSz"),maintenanceMarginRate:this.safeNumber(r,"mmr"),maxLeverage:this.safeNumber(r,"maxLever"),info:r})}return i}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),[a,r]=this.handleMarginModeAndParams("fetchBorrowInterest",r),void 0===a&&(a=this.safeString(r,"mgnMode","cross"));const o={mgnMode:a};let n;if(void 0!==e){const t=this.currency(e);o.ccy=t.id}void 0!==i&&(o.before=i-1),void 0!==s&&(o.limit=s),void 0!==t&&(n=this.market(t),o.instId=n.id);const d=await this.privateGetAccountInterestAccrued(this.extend(o,r)),h=this.safeList(d,"data",[]),c=this.parseBorrowInterests(h);return this.filterByCurrencySinceLimit(c,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"instId");void 0!==i&&(t=this.safeMarket(i,t));const s=this.safeInteger(e,"ts");return{info:e,symbol:this.safeString(t,"symbol"),currency:this.safeCurrencyCode(this.safeString(e,"ccy")),interest:this.safeNumber(e,"interest"),interestRate:this.safeNumber(e,"interestRate"),amountBorrowed:this.safeNumber(e,"liab"),marginMode:this.safeString(e,"mgnMode"),timestamp:s,datetime:this.iso8601(s)}}async borrowCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.currency(e),r={ccy:s.id,amt:this.currencyToPrecision(e,t),side:"borrow"},a=await this.privatePostAccountBorrowRepay(this.extend(r,i)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{});return this.parseMarginLoan(n,s)}async repayCrossMargin(e,t,i={}){await this.loadMarkets();const s=this.safeString2(i,"id","ordId");if(i=this.omit(i,"id"),void 0===s)throw new r.ArgumentsRequired(this.id+" repayCrossMargin() requires an id parameter");const a=this.currency(e),o={ccy:a.id,amt:this.currencyToPrecision(e,t),side:"repay",ordId:s},n=await this.privatePostAccountBorrowRepay(this.extend(o,i)),d=this.safeList(n,"data",[]),h=this.safeDict(d,0,{});return this.parseMarginLoan(h,a)}parseMarginLoan(e,t=void 0){const i=this.safeString(e,"ccy");return{id:void 0,currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amt"),symbol:void 0,timestamp:void 0,datetime:void 0,info:e}}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s={instType:this.convertToInstrumentType(i.type),uly:this.safeString(i.info,"uly"),instId:i.id},a=await this.publicGetPublicOpenInterest(this.extend(s,t)),o=this.safeList(a,"data",[]);return this.parseOpenInterest(o[0],i)}async fetchOpenInterestHistory(e,t="1d",i=void 0,s=void 0,a={}){const o=this.safeDict(this.options,"fetchOpenInterestHistory",{}),n=this.safeDict(o,"timeframes",{});if("5m"!==(t=this.safeString(n,t,t))&&"1H"!==t&&"1D"!==t)throw new r.BadRequest(this.id+" fetchOpenInterestHistory cannot only use the 5m, 1h, and 1d timeframe");let d,h;if(await this.loadMarkets(),e in this.markets||e in this.markets_by_id)h=this.market(e),d=h.baseId;else{d=this.currency(e).id}const c={ccy:d,period:t};let l,u;if([l,a]=this.handleMarketTypeAndParams("fetchOpenInterestHistory",h,a),"option"===l)u=await this.publicGetRubikStatOptionOpenInterestVolume(this.extend(c,a));else{void 0!==i&&(c.begin=i);const e=this.safeInteger(a,"until");void 0!==e&&(c.end=e,a=this.omit(a,["until"])),u=await this.publicGetRubikStatContractsOpenInterestVolume(this.extend(c,a))}const f=this.safeList(u,"data",[]);return this.parseOpenInterestsHistory(f,void 0,i,s)}parseOpenInterest(e,t=void 0){const i=this.safeString(e,"instId");t=this.safeMarket(i,t);const s=this.safeInteger(e,"ts"),r=this.safeInteger(e,0,s);let a,o,n,d;const h=this.safeString(this.options,"defaultType");return Array.isArray(e)?"option"===h?(n=this.safeNumber(e,1),a=this.safeNumber(e,2)):(d=this.safeNumber(e,1),o=this.safeNumber(e,2)):(a=this.safeNumber(e,"oiCcy"),n=this.safeNumber(e,"oi"),d=this.safeNumber(e,"oiUsd")),this.safeOpenInterest({symbol:this.safeSymbol(i),baseVolume:a,quoteVolume:o,openInterestAmount:n,openInterestValue:d,timestamp:r,datetime:this.iso8601(r),info:e},t)}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e,e?this.headers["x-simulated-trading"]="1":"x-simulated-trading"in this.headers&&(this.headers=this.omit(this.headers,"x-simulated-trading"))}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=this.currencyIds(e);i.ccy=t.join(",")}const s=await this.privateGetAssetCurrencies(this.extend(i,t)),r=this.safeList(s,"data");return this.parseDepositWithdrawFees(r,e)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={};t=this.marketCodes(t);for(let i=0;i<e.length;i++){const r=e[i],a=this.safeString(r,"ccy"),o=this.safeCurrencyCode(a);if(void 0===t||this.inArray(o,t)){void 0===this.safeValue(s,o)&&(s[o]=this.depositWithdrawFee({})),s[o].info[a]=r;const e=this.safeString(r,"chain");if(void 0===e)continue;const t=e.split("-"),i=this.safeValue(t,1),n=this.safeNumber(r,"fee"),d={fee:n,percentage:void 0===n&&void 0},h={fee:void 0,percentage:void 0},c=this.networkIdToCode(i,o);s[o].networks[c]={withdraw:d,deposit:h}}}const r=Object.keys(s);for(let e=0;e<r.length;e++){const t=r[e],i=this.currency(t);s[t]=this.assignDefaultDepositWithdrawFees(s[t],i)}return s}async fetchSettlementHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchSettlementHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e);let o;if([o,s]=this.handleMarketTypeAndParams("fetchSettlementHistory",a,s),"future"!==o&&"option"!==o)throw new r.NotSupported(this.id+" fetchSettlementHistory() supports futures and options markets only");const n={instType:this.convertToInstrumentType(o),uly:a.baseId+"-"+a.quoteId};void 0!==t&&(n.before=t-1),void 0!==i&&(n.limit=i);const d=await this.publicGetPublicDeliveryExerciseHistory(this.extend(n,s)),h=this.safeList(d,"data",[]),c=this.parseSettlements(h,a),l=this.sortBy(c,"timestamp");return this.filterBySymbolSinceLimit(l,a.symbol,t,i)}parseSettlement(e,t){const i=this.safeString(e,"insId");return{info:e,symbol:this.safeSymbol(i,t),price:this.safeNumber(e,"px"),timestamp:void 0,datetime:void 0}}parseSettlements(e,t){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeInteger(r,"ts"),o=this.safeList(r,"details",[]);for(let e=0;e<o.length;e++){const s=this.parseSettlement(o[e],t);i.push(this.extend(s,{timestamp:a,datetime:this.iso8601(a)}))}}return i}async fetchUnderlyingAssets(e={}){let t;if(await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchUnderlyingAssets",void 0,e),void 0!==t&&"spot"!==t||(t="option"),"option"!==t&&"swap"!==t&&"future"!==t)throw new r.NotSupported(this.id+" fetchUnderlyingAssets() supports contract markets only");const i={instType:this.convertToInstrumentType(t)},s=await this.publicGetPublicUnderlying(this.extend(i,e));return this.safeList(s,"data",[])[0]}async fetchGreeks(e,t={}){await this.loadMarkets();const i=this.market(e),s=i.id,r=s.split("-"),a={uly:i.info.uly,instFamily:i.info.instFamily,expTime:this.safeString(r,2)},o=await this.publicGetPublicOptSummary(this.extend(a,t)),n=this.safeList(o,"data",[]);for(let e=0;e<n.length;e++){const t=n[e];if(this.safeString(t,"instId")===s)return this.parseGreeks(t,i)}}parseGreeks(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString(e,"instId");return{symbol:this.safeSymbol(s,t),timestamp:i,datetime:this.iso8601(i),delta:this.safeNumber(e,"delta"),gamma:this.safeNumber(e,"gamma"),theta:this.safeNumber(e,"theta"),vega:this.safeNumber(e,"vega"),rho:void 0,bidSize:void 0,askSize:void 0,bidImpliedVolatility:this.safeNumber(e,"bidVol"),askImpliedVolatility:this.safeNumber(e,"askVol"),markImpliedVolatility:this.safeNumber(e,"markVol"),bidPrice:void 0,askPrice:void 0,markPrice:void 0,lastPrice:void 0,underlyingPrice:void 0,info:e}}async closePosition(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r=this.safeString(i,"clientOrderId"),a=this.safeString(i,"code");let o;[o,i]=this.handleMarginModeAndParams("closePosition",i,"cross");const n={instId:s.id,mgnMode:o};if(void 0!==t&&(n.posSide="buy"===t?"long":"sell"===t?"short":t),void 0!==r&&(n.clOrdId=r),void 0!==a){const e=this.currency(a);n.ccy=e.id}const d=await this.privatePostTradeClosePosition(this.extend(n,i)),h=this.safeList(d,"data",[]),c=this.safeDict(h,0);return this.parseOrder(c,s)}async fetchOption(e,t={}){await this.loadMarkets();const i=this.market(e),s={instId:i.id},r=await this.publicGetMarketTicker(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseOption(o,void 0,i)}async fetchOptionChain(e,t={}){await this.loadMarkets();const i={uly:this.currency(e).code+"-USD",instType:"OPTION"},s=await this.publicGetMarketTickers(this.extend(i,t)),r=this.safeList(s,"data",[]);return this.parseOptionChain(r,void 0,"instId")}parseOption(e,t=void 0,i=void 0){const s=this.safeString(e,"instId");i=this.safeMarket(s,i);const r=this.safeInteger(e,"ts");return{info:e,currency:void 0,symbol:i.symbol,timestamp:r,datetime:this.iso8601(r),impliedVolatility:void 0,openInterest:void 0,bidPrice:this.safeNumber(e,"bidPx"),askPrice:this.safeNumber(e,"askPx"),midPrice:void 0,markPrice:void 0,lastPrice:this.safeNumber(e,"last"),underlyingPrice:void 0,change:void 0,percentage:void 0,baseVolume:this.safeNumber(e,"volCcy24h"),quoteVolume:void 0}}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r={baseCcy:e.toUpperCase(),quoteCcy:t.toUpperCase(),rfqSzCcy:e.toUpperCase(),rfqSz:this.numberToString(i),side:"sell"},a=await this.privatePostAssetConvertEstimateQuote(this.extend(r,s)),o=this.safeList(a,"data",[]),n=this.safeDict(o,0,{}),d=this.safeString(n,"baseCcy",e),h=this.currency(d),c=this.safeString(n,"quoteCcy",t),l=this.currency(c);return this.parseConversion(n,h,l)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a={quoteId:e,baseCcy:t,quoteCcy:i,szCcy:t,sz:this.numberToString(s),side:"sell"},o=await this.privatePostAssetConvertTrade(this.extend(a,r)),n=this.safeList(o,"data",[]),d=this.safeDict(n,0,{}),h=this.safeString(d,"baseCcy",t),c=this.currency(h),l=this.safeString(d,"quoteCcy",i),u=this.currency(l);return this.parseConversion(d,c,u)}async fetchConvertTrade(e,t=void 0,i={}){await this.loadMarkets();const s={clTReqId:e},r=await this.privateGetAssetConvertHistory(this.extend(s,i)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{}),n=this.safeString(o,"baseCcy"),d=this.safeString(o,"quoteCcy");let h,c;return void 0!==n&&(h=this.currency(n)),void 0!==d&&(c=this.currency(d)),this.parseConversion(o,h,c)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={};[r,s]=this.handleUntilOption("after",r,s),void 0!==t&&(r.before=t),void 0!==i&&(r.limit=i);const a=await this.privateGetAssetConvertHistory(this.extend(r,s)),o=this.safeList(a,"data",[]);return this.parseConversions(o,e,"baseCcy","quoteCcy",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeInteger2(e,"quoteTime","ts"),r=this.safeString(e,"baseCcy"),a=this.safeCurrencyCode(r,t),o=this.safeString(e,"quoteCcy"),n=this.safeCurrencyCode(o,i);return{info:e,timestamp:s,datetime:this.iso8601(s),id:this.safeStringN(e,["clQReqId","tradeId","quoteId"]),fromCurrency:a,fromAmount:this.safeNumber2(e,"baseSz","fillBaseSz"),toCurrency:n,toAmount:this.safeNumber2(e,"quoteSz","fillQuoteSz"),price:this.safeNumber2(e,"cnvtPx","fillPx"),fee:void 0}}async fetchConvertCurrencies(e={}){await this.loadMarkets();const t=await this.privateGetAssetConvertCurrencies(e),i={},s=this.safeList(t,"data",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"ccy"),a=this.safeCurrencyCode(r);i[a]={info:t,id:r,code:a,networks:void 0,type:void 0,name:void 0,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:void 0,limits:{amount:{min:this.safeNumber(t,"min"),max:this.safeNumber(t,"max")},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},created:void 0}}return i}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeString(n,"code");if("0"!==c&&"2"!==c){const e=this.id+" "+o,t=this.safeList(n,"data",[]);for(let i=0;i<t.length;i++){const s=t[i],r=this.safeString(s,"sCode"),a=this.safeString(s,"sMsg");this.throwExactlyMatchedException(this.exceptions.exact,r,e),this.throwBroadlyMatchedException(this.exceptions.broad,a,e)}throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),new r.ExchangeError(e)}}async fetchMarginAdjustmentHistory(e=void 0,t=void 0,i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.safeBool(a,"auto");if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchMarginAdjustmentHistory () requires a type argument");const n="add"===t;let d=n?"160":"161";if(o){if(!n)throw new r.BadRequest(this.id+" cannot fetch margin adjustments for type "+t);d="162"}const h={subType:d,mgnMode:"isolated"},c=this.safeInteger(a,"until");let l;a=this.omit(a,"until"),void 0!==i&&(h.startTime=i),void 0!==s&&(h.limit=s),void 0!==c&&(h.endTime=c);const u=this.milliseconds(),f=u-7776e6;if(void 0===i||i>u-6048e5)l=await this.privateGetAccountBills(this.extend(h,a));else{if(!(i>f))throw new r.BadRequest(this.id+" fetchMarginAdjustmentHistory () cannot fetch margin adjustments older than 3 months");l=await this.privateGetAccountBillsArchive(this.extend(h,a))}const p=this.safeList(l,"data"),m=this.parseMarginModifications(p);return this.filterBySymbolSinceLimit(m,e,i,s)}async fetchPositionsHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeString(s,"marginMode"),a=this.safeStringUpper(s,"instType");s=this.omit(s,["until","marginMode","instType"]),void 0===i&&(i=100);const o={limit:i};if(void 0!==e){if(1===e.length){const t=this.market(e[0]);o.instId=t.id}}void 0!==r&&(o.mgnMode=r),void 0!==a&&(o.instType=a);const n=await this.privateGetAccountPositionsHistory(this.extend(o,s)),d=this.safeList(n,"data"),h=this.parsePositions(d,e,s);return this.filterBySinceLimit(h,t,i)}async fetchLongShortRatioHistory(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={instId:a.id},n=this.safeString2(r,"until","end");r=this.omit(r,"until"),void 0!==n&&(o.end=n),void 0!==t&&(o.period=t),void 0!==i&&(o.begin=i),void 0!==s&&(o.limit=s);const d=await this.publicGetRubikStatContractsLongShortAccountRatioContract(this.extend(o,r)),h=this.safeList(d,"data",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e];c.push({timestamp:this.safeString(t,0),longShortRatio:this.safeString(t,1)})}return this.parseLongShortRatioHistory(c,a)}parseLongShortRatio(e,t=void 0){const i=this.safeInteger(e,"timestamp");let s;return void 0!==t&&(s=t.symbol),{info:e,symbol:s,timestamp:i,datetime:this.iso8601(i),timeframe:void 0,longShortRatio:this.safeNumber(e,"longShortRatio")}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"onetrading",name:"One Trading",countries:["AT"],rateLimit:300,version:"v1",pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!1,createStopOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!1,fetchLeverage:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!1,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{"1m":"1/MINUTES","5m":"5/MINUTES","15m":"15/MINUTES","30m":"30/MINUTES","1h":"1/HOURS","4h":"4/HOURS","1d":"1/DAYS","1w":"1/WEEKS","1M":"1/MONTHS"},urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/bdbc26fd-02f2-4ca7-9f1e-17333690bb1c",api:{public:"https://api.onetrading.com/fast",private:"https://api.onetrading.com/fast"},www:"https://onetrading.com/",doc:["https://docs.onetrading.com"],fees:"https://onetrading.com/fees"},api:{public:{get:["currencies","candlesticks/{instrument_code}","fees","instruments","order-book/{instrument_code}","market-ticker","market-ticker/{instrument_code}","time"]},private:{get:["account/balances","account/fees","account/orders","account/orders/{order_id}","account/orders/{order_id}/trades","account/trades","account/trades/{trade_id}"],post:["account/orders"],delete:["account/orders","account/orders/{order_id}","account/orders/client/{client_id}"]}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0015"),maker:this.parseNumber("0.001"),tiers:[{taker:[[this.parseNumber("0"),this.parseNumber("0.0015")],[this.parseNumber("100"),this.parseNumber("0.0013")],[this.parseNumber("250"),this.parseNumber("0.0013")],[this.parseNumber("1000"),this.parseNumber("0.001")],[this.parseNumber("5000"),this.parseNumber("0.0009")],[this.parseNumber("10000"),this.parseNumber("0.00075")],[this.parseNumber("20000"),this.parseNumber("0.00065")]],maker:[[this.parseNumber("0"),this.parseNumber("0.001")],[this.parseNumber("100"),this.parseNumber("0.001")],[this.parseNumber("250"),this.parseNumber("0.0009")],[this.parseNumber("1000"),this.parseNumber("0.00075")],[this.parseNumber("5000"),this.parseNumber("0.0006")],[this.parseNumber("10000"),this.parseNumber("0.0005")],[this.parseNumber("20000"),this.parseNumber("0.0005")]]}]}},requiredCredentials:{apiKey:!0,secret:!1},precisionMode:o.kb,exceptions:{exact:{INVALID_CLIENT_UUID:r.InvalidOrder,ORDER_NOT_FOUND:r.OrderNotFound,ONLY_ONE_ERC20_ADDRESS_ALLOWED:r.InvalidAddress,DEPOSIT_ADDRESS_NOT_USED:r.InvalidAddress,INVALID_CREDENTIALS:r.AuthenticationError,MISSING_CREDENTIALS:r.AuthenticationError,INVALID_APIKEY:r.AuthenticationError,INVALID_SCOPES:r.AuthenticationError,INVALID_SUBJECT:r.AuthenticationError,INVALID_ISSUER:r.AuthenticationError,INVALID_AUDIENCE:r.AuthenticationError,INVALID_DEVICE_ID:r.AuthenticationError,INVALID_IP_RESTRICTION:r.AuthenticationError,APIKEY_REVOKED:r.AuthenticationError,APIKEY_EXPIRED:r.AuthenticationError,SYNCHRONIZER_TOKEN_MISMATCH:r.AuthenticationError,SESSION_EXPIRED:r.AuthenticationError,INTERNAL_ERROR:r.AuthenticationError,CLIENT_IP_BLOCKED:r.PermissionDenied,MISSING_PERMISSION:r.PermissionDenied,ILLEGAL_CHARS:r.BadRequest,UNSUPPORTED_MEDIA_TYPE:r.BadRequest,ACCOUNT_HISTORY_TIME_RANGE_TOO_BIG:r.BadRequest,CANDLESTICKS_TIME_RANGE_TOO_BIG:r.BadRequest,INVALID_INSTRUMENT_CODE:r.BadRequest,INVALID_ORDER_TYPE:r.BadRequest,INVALID_UNIT:r.BadRequest,INVALID_PERIOD:r.BadRequest,INVALID_TIME:r.BadRequest,INVALID_DATE:r.BadRequest,INVALID_CURRENCY:r.BadRequest,INVALID_AMOUNT:r.BadRequest,INVALID_PRICE:r.BadRequest,INVALID_LIMIT:r.BadRequest,INVALID_QUERY:r.BadRequest,INVALID_CURSOR:r.BadRequest,INVALID_ACCOUNT_ID:r.BadRequest,INVALID_SIDE:r.InvalidOrder,INVALID_ACCOUNT_HISTORY_FROM_TIME:r.BadRequest,INVALID_ACCOUNT_HISTORY_MAX_PAGE_SIZE:r.BadRequest,INVALID_ACCOUNT_HISTORY_TIME_PERIOD:r.BadRequest,INVALID_ACCOUNT_HISTORY_TO_TIME:r.BadRequest,INVALID_CANDLESTICKS_GRANULARITY:r.BadRequest,INVALID_CANDLESTICKS_UNIT:r.BadRequest,INVALID_ORDER_BOOK_DEPTH:r.BadRequest,INVALID_ORDER_BOOK_LEVEL:r.BadRequest,INVALID_PAGE_CURSOR:r.BadRequest,INVALID_TIME_RANGE:r.BadRequest,INVALID_TRADE_ID:r.BadRequest,INVALID_UI_ACCOUNT_SETTINGS:r.BadRequest,NEGATIVE_AMOUNT:r.InvalidOrder,NEGATIVE_PRICE:r.InvalidOrder,MIN_SIZE_NOT_SATISFIED:r.InvalidOrder,BAD_AMOUNT_PRECISION:r.InvalidOrder,BAD_PRICE_PRECISION:r.InvalidOrder,BAD_TRIGGER_PRICE_PRECISION:r.InvalidOrder,MAX_OPEN_ORDERS_EXCEEDED:r.BadRequest,MISSING_PRICE:r.InvalidOrder,MISSING_ORDER_TYPE:r.InvalidOrder,MISSING_SIDE:r.InvalidOrder,MISSING_CANDLESTICKS_PERIOD_PARAM:r.ArgumentsRequired,MISSING_CANDLESTICKS_UNIT_PARAM:r.ArgumentsRequired,MISSING_FROM_PARAM:r.ArgumentsRequired,MISSING_INSTRUMENT_CODE:r.ArgumentsRequired,MISSING_ORDER_ID:r.InvalidOrder,MISSING_TO_PARAM:r.ArgumentsRequired,MISSING_TRADE_ID:r.ArgumentsRequired,INVALID_ORDER_ID:r.OrderNotFound,NOT_FOUND:r.OrderNotFound,INSUFFICIENT_LIQUIDITY:r.InsufficientFunds,INSUFFICIENT_FUNDS:r.InsufficientFunds,NO_TRADING:r.ExchangeNotAvailable,SERVICE_UNAVAILABLE:r.ExchangeNotAvailable,GATEWAY_TIMEOUT:r.ExchangeNotAvailable,RATELIMIT:r.DDoSProtection,CF_RATELIMIT:r.DDoSProtection,INTERNAL_SERVER_ERROR:r.ExchangeError},broad:{"Order not found.":r.OrderNotFound}},commonCurrencies:{MIOTA:"IOTA"},options:{fetchTradingFees:{method:"fetchPrivateTradingFees"},fiat:["EUR","CHF"]},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1/12,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:5e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.safeInteger(t,"epoch_millis")}async fetchCurrencies(e={}){const t=await this.publicGetCurrencies(e),i={};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"code"),a=this.safeCurrencyCode(r);i[a]={id:r,code:a,name:void 0,info:s,active:void 0,fee:void 0,precision:this.parseNumber(this.parsePrecision(this.safeString(s,"precision"))),withdraw:void 0,deposit:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:{}}}return i}async fetchMarkets(e={}){const t=await this.publicGetInstruments(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeValue(e,"base",{}),i=this.safeValue(e,"quote",{}),s=this.safeString(t,"code"),r=this.safeString(i,"code"),a=s+"_"+r,o=this.safeCurrencyCode(s),n=this.safeCurrencyCode(r);return{id:a,symbol:o+"/"+n,base:o,quote:n,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"ACTIVE"===this.safeString(e,"state"),contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"amount_precision"))),price:this.parseNumber(this.parsePrecision(this.safeString(e,"market_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"min_size"),max:void 0}},created:void 0,info:e}}async fetchTradingFees(e={}){let t=this.safeString(e,"method");if(e=this.omit(e,"method"),void 0===t){const e=this.safeValue(this.options,"fetchTradingFees",{});t=this.safeString(e,"method","fetchPrivateTradingFees")}if("fetchPrivateTradingFees"===t)return await this.fetchPrivateTradingFees(e);if("fetchPublicTradingFees"===t)return await this.fetchPublicTradingFees(e);throw new r.NotSupported(this.id+" fetchTradingFees() does not support "+t+", fetchPrivateTradingFees and fetchPublicTradingFees are supported")}async fetchPublicTradingFees(e={}){await this.loadMarkets();const t=await this.publicGetFees(e),i=this.safeValue(t,0,{}),s=this.safeValue(i,"fee_tiers"),r=this.parseFeeTiers(s),a=this.safeValue(s,0,{}),o={};for(let e=0;e<this.symbols.length;e++){const t=this.symbols[e];o[t]={info:i,symbol:t,maker:this.safeNumber(a,"maker_fee"),taker:this.safeNumber(a,"taker_fee"),percentage:!0,tierBased:!0,tiers:r}}return o}async fetchPrivateTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetAccountFees(e),i=this.safeValue(t,"active_fee_tier",{});let s=this.safeString(i,"maker_fee"),r=this.safeString(i,"taker_fee");s=a.Y.stringDiv(s,"100"),r=a.Y.stringDiv(r,"100");const o=this.safeValue(t,"fee_tiers"),n={},d=this.parseFeeTiers(o);for(let e=0;e<this.symbols.length;e++){const i=this.symbols[e];n[i]={info:t,symbol:i,maker:this.parseNumber(s),taker:this.parseNumber(r),percentage:!0,tierBased:!0,tiers:d}}return n}parseFeeTiers(e,t=void 0){const i=[],s=[];for(let t=0;t<e.length;t++){const r=e[t],o=this.safeNumber(r,"volume");let n=this.safeString(r,"taker_fee"),d=this.safeString(r,"maker_fee");d=a.Y.stringDiv(d,"100"),n=a.Y.stringDiv(n,"100"),s.push([o,this.parseNumber(d)]),i.push([o,this.parseNumber(n)])}return{maker:s,taker:i}}parseTicker(e,t=void 0){const i=this.parse8601(this.safeString(e,"time")),s=this.safeString(e,"instrument_code"),r=this.safeSymbol(s,t,"_"),a=this.safeString(e,"last_price"),o=this.safeString(e,"price_change_percentage"),n=this.safeString(e,"price_change"),d=this.safeString(e,"base_volume"),h=this.safeString(e,"quote_volume");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"best_bid"),bidVolume:void 0,ask:this.safeString(e,"best_ask"),askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:n,percentage:o,average:void 0,baseVolume:d,quoteVolume:h,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={instrument_code:i.id},r=await this.publicGetMarketTickerInstrumentCode(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarketTicker(t),s={};for(let e=0;e<i.length;e++){const t=this.parseTicker(i[e]);s[t.symbol]=t}return this.filterByArrayTickers(s,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={instrument_code:s.id};void 0!==t&&(r.depth=t);const a=await this.publicGetOrderBookInstrumentCode(this.extend(r,i)),o=this.parse8601(this.safeString(a,"time"));return this.parseOrderBook(a,s.symbol,o,"bids","asks","price","amount")}parseOHLCV(e,t=void 0){const i=this.safeValue(e,"granularity"),s=this.safeString(i,"unit"),r=this.safeString(i,"period")+this.safeString({MINUTES:"m",HOURS:"h",DAYS:"d",WEEKS:"w",MONTHS:"M"},s),a=1e3*this.parseTimeframe(r),o=this.parse8601(this.safeString(e,"time")),n=a*this.parseToInt(o/a),d=this.safeValue(this.options,"fetchOHLCV",{}),h=this.safeString(d,"volume","total_amount");return[n,this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,h)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t),[n,d]=o.split("/"),h=1e3*this.parseTimeframe(t);void 0===s&&(s=1500);const c={instrument_code:a.id,period:n,unit:d};if(void 0===i){const e=this.milliseconds();c.to=this.iso8601(e),c.from=this.iso8601(e-s*h)}else c.from=this.iso8601(i),c.to=this.iso8601(this.sum(i,s*h));const l=await this.publicGetCandlesticksInstrumentCode(this.extend(c,r)),u=this.safeList(l,"candlesticks");return this.parseOHLCVs(u,a,t,i,s)}parseTrade(e,t=void 0){const i=this.safeValue(e,"fee",{});e=this.safeValue(e,"trade",e);let s=this.safeInteger(e,"trade_timestamp");void 0===s&&(s=this.parse8601(this.safeString(e,"time")));const r=this.safeStringLower2(e,"side","taker_side"),a=this.safeString(e,"price"),o=this.safeString(e,"amount"),n=this.safeString(e,"volume"),d=this.safeString(e,"instrument_code"),h=this.safeSymbol(d,t,"_"),c=this.safeString(i,"fee_amount");let l,u;if(void 0!==c){const e=this.safeString(i,"fee_currency");u={cost:c,currency:this.safeCurrencyCode(e),rate:this.safeString(i,"fee_percentage")},l=this.safeStringLower(i,"fee_type")}return this.safeTrade({id:this.safeString2(e,"trade_id","sequence"),order:this.safeString(e,"order_id"),timestamp:s,datetime:this.iso8601(s),symbol:h,type:void 0,side:r,price:a,amount:o,cost:n,takerOrMaker:l,fee:u,info:e},t)}parseBalance(e){const t=this.safeValue(e,"balances",[]),i={info:e};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"currency_code"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"available"),o.used=this.safeString(s,"locked"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountBalances(e);return this.parseBalance(t)}parseOrderStatus(e){return this.safeString({FILLED:"open",FILLED_FULLY:"closed",FILLED_CLOSED:"canceled",FILLED_REJECTED:"rejected",OPEN:"open",REJECTED:"rejected",CLOSED:"canceled",FAILED:"failed",STOP_TRIGGERED:"triggered",DONE:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.safeValue(e,"order",e),s=this.safeString(i,"order_id"),r=this.safeString(i,"client_id"),a=this.parse8601(this.safeString(i,"time")),o=this.parseOrderStatus(this.safeString(i,"status")),n=this.parseOrderStatus(o),d=this.safeString(i,"instrument_code"),h=this.safeSymbol(d,t,"_"),c=this.safeString(i,"price"),l=this.safeString(i,"amount"),u=this.safeString(i,"filled_amount"),f=this.safeStringLower(i,"side"),p=this.safeStringLower(i,"type"),m=this.parseTimeInForce(this.safeString(i,"time_in_force")),g=this.safeValue(i,"is_post_only"),v=this.safeValue(e,"trades",[]);return this.safeOrder({id:s,clientOrderId:r,info:e,timestamp:a,datetime:this.iso8601(a),lastTradeTimestamp:void 0,symbol:h,type:this.parseOrderType(p),timeInForce:m,postOnly:g,side:f,price:c,triggerPrice:this.safeNumber(i,"trigger_price"),amount:l,cost:void 0,average:void 0,filled:u,remaining:void 0,status:n,trades:v},t)}parseOrderType(e){return this.safeString({booked:"limit"},e,e)}parseTimeInForce(e){return this.safeString({GOOD_TILL_CANCELLED:"GTC",GOOD_TILL_TIME:"GTT",IMMEDIATE_OR_CANCELLED:"IOC",FILL_OR_KILL:"FOK"},e,e)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=t.toUpperCase(),h={instrument_code:n.id,type:d,side:i.toUpperCase(),amount:this.amountToPrecision(e,s)};let c=!1;"LIMIT"!==d&&"STOP"!==d||(c=!0);const l=this.safeNumberN(o,["triggerPrice","trigger_price","stopPrice"]);if(void 0!==l){if("MARKET"===d)throw new r.BadRequest(this.id+" createOrder() cannot place stop market orders, only stop limit");h.trigger_price=this.priceToPrecision(e,l),h.type="STOP",o=this.omit(o,["triggerPrice","trigger_price","stopPrice"])}else if("STOP"===d)throw new r.ArgumentsRequired(this.id+" createOrder() requires a triggerPrice param for "+t+" orders");c&&(h.price=this.priceToPrecision(e,a));const u=this.safeString2(o,"clientOrderId","client_id");void 0!==u&&(h.client_id=u,o=this.omit(o,["clientOrderId","client_id"]));const f=this.safeString2(o,"timeInForce","time_in_force","GOOD_TILL_CANCELLED");o=this.omit(o,"timeInForce"),h.time_in_force=f;const p=await this.privatePostAccountOrders(this.extend(h,o));return this.parseOrder(p,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeString2(i,"clientOrderId","client_id");i=this.omit(i,["clientOrderId","client_id"]);let r="privateDeleteAccountOrdersOrderId";const a={};let o;return void 0!==s?(r="privateDeleteAccountOrdersClientClientId",a.client_id=s):a.order_id=e,o="privateDeleteAccountOrdersOrderId"===r?await this.privateDeleteAccountOrdersOrderId(this.extend(a,i)):await this.privateDeleteAccountOrdersClientClientId(this.extend(a,i)),this.parseOrder(o)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=this.market(e);i.instrument_code=t.id}return await this.privateDeleteAccountOrders(this.extend(i,t))}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s={ids:e.join(",")};return await this.privateDeleteAccountOrders(this.extend(s,i))}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:e},r=await this.privateGetAccountOrdersOrderId(this.extend(s,i));return this.parseOrder(r)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;if(void 0!==e&&(o=this.market(e),a.instrument_code=o.id),void 0!==t){if(void 0===this.safeString(s,"to"))throw new r.ArgumentsRequired(this.id+' fetchOpenOrders() requires a "to" iso8601 string param with the since argument is specified, max range is 100 days');a.from=this.iso8601(t)}void 0!==i&&(a.max_page_size=i);const n=await this.privateGetAccountOrders(this.extend(a,s)),d=this.safeList(n,"order_history",[]);return this.parseOrders(d,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOpenOrders(e,t,i,this.extend({with_cancelled_and_rejected:!0},s))}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={order_id:e};void 0!==s&&(a.max_page_size=s);const o=await this.privateGetAccountOrdersOrderIdTrades(this.extend(a,r)),n=this.safeValue(o,"trade_history",[]);let d;return void 0!==t&&(d=this.market(t)),this.parseTrades(n,d,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const a={};let o;if(void 0!==e&&(o=this.market(e),a.instrument_code=o.id),void 0!==t){if(void 0===this.safeString(s,"to"))throw new r.ArgumentsRequired(this.id+' fetchMyTrades() requires a "to" iso8601 string param with the since argument is specified, max range is 100 days');a.from=this.iso8601(t)}void 0!==i&&(a.max_page_size=i);const n=await this.privateGetAccountTrades(this.extend(a,s)),d=this.safeList(n,"trade_history",[]);return this.parseTrades(d,o,t,i)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t]+"/"+this.version+"/"+this.implodeParams(e,s);const n=this.omit(s,this.extractParams(e));return"public"===t?Object.keys(n).length&&(o+="?"+this.urlencode(n)):"private"===t&&(this.checkRequiredCredentials(),r={Accept:"application/json",Authorization:"Bearer "+this.apiKey},"POST"===i?(a=this.json(n),r["Content-Type"]="application/json"):Object.keys(n).length&&(o+="?"+this.urlencode(n))),{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"error");if(void 0!==c){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,c,e),this.throwBroadlyMatchedException(this.exceptions.broad,c,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"oxfun",name:"OXFUN",countries:["PA"],version:"v3",rateLimit:120,pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createPostOnlyOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,deposit:!1,editOrder:!1,fetchAccounts:!0,fetchBalance:!0,fetchBidsAsks:!1,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingRate:"emulated",fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!0,fetchWithdrawal:!1,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!0,ws:!0},timeframes:{"1m":"60s","5m":"300s","15m":"900s","30m":"1800s","1h":"3600s","2h":"7200s","4h":"14400s","1d":"86400s"},urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/6a196124-c1ee-4fae-8573-962071b61a85",referral:"https://ox.fun/register?shareAccountId=5ZUD4a7G",api:{public:"https://api.ox.fun",private:"https://api.ox.fun"},test:{public:"https://stgapi.ox.fun",private:"https://stgapi.ox.fun"},www:"https://ox.fun/",doc:"https://docs.ox.fun/",fees:"https://support.ox.fun/en/articles/8819866-trading-fees"},api:{public:{get:{"v3/markets":1,"v3/assets":1,"v3/tickers":1,"v3/funding/estimates":1,"v3/candles":1,"v3/depth":1,"v3/markets/operational":1,"v3/exchange-trades":1,"v3/funding/rates":1,"v3/leverage/tiers":1}},private:{get:{"v3/account":1,"v3/account/names":1,"v3/wallet":1,"v3/transfer":1,"v3/balances":1,"v3/positions":1,"v3/funding":1,"v3/deposit-addresses":1,"v3/deposit":1,"v3/withdrawal-addresses":1,"v3/withdrawal":1,"v3/withdrawal-fees":1,"v3/orders/status":1,"v3/orders/working":1,"v3/trades":1},post:{"v3/transfer":1,"v3/withdrawal":1,"v3/orders/place":1},delete:{"v3/orders/cancel":1,"v3/orders/cancel-all":1}}},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.00020"),taker:this.parseNumber("0.00070"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.00020")],[this.parseNumber("2500000"),this.parseNumber("0.00010")],[this.parseNumber("25000000"),this.parseNumber("0")]],taker:[[this.parseNumber("0"),this.parseNumber("0.00070")],[this.parseNumber("2500000"),this.parseNumber("0.00050")],[this.parseNumber("25000000"),this.parseNumber("0.00040")]]}}},precisionMode:o.kb,options:{sandboxMode:!1,networks:{BTC:"Bitcoin",ERC20:"Ethereum",AVAX:"Avalanche",SOL:"Solana",ARB:"Arbitrum",MATIC:"Polygon",FTM:"Fantom",BNB:"BNBSmartChain",OPTIMISM:"Optimism"},networksById:{Bitcoin:"BTC",Ethereum:"ERC20",Avalanche:"AVAX",Solana:"SOL",Arbitrum:"ARB",Polygon:"MATIC",Fantom:"FTM",Base:"BASE",BNBSmartChain:"BNB",Optimism:"OPTIMISM"}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!0},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:500,daysBack:1e5,untilDays:7,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:500}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{"-0010":a.OperationFailed,"-429":a.RateLimitExceeded,"-05001":a.AuthenticationError,"-10001":a.ExchangeError,"-20000":a.BadRequest,"-20001":a.BadRequest,"-20002":a.BadRequest,"-20003":a.NotSupported,"-20005":a.AuthenticationError,"-20006":a.BadRequest,"-20007":a.AuthenticationError,"-20008":a.BadRequest,"-20009":a.BadRequest,"-20010":a.ArgumentsRequired,"-20011":a.ArgumentsRequired,"-20012":a.ArgumentsRequired,"-20013":a.ArgumentsRequired,"-20014":a.BadRequest,"-20015":a.BadSymbol,"-20016":a.BadRequest,"-20017":a.BadRequest,"-20018":a.BadRequest,"-20019":a.BadRequest,"-20020":a.BadRequest,"-20021":a.BadRequest,"-20022":a.ArgumentsRequired,"-20023":a.ArgumentsRequired,"-20024":a.ExchangeError,"-20025":a.AuthenticationError,"-20026":a.BadRequest,"-20027":a.BadRequest,"-20028":a.BadRequest,"-20029":a.BadRequest,"-20030":a.BadRequest,"-20031":a.MarketClosed,"-20032":a.NetworkError,"-20033":a.BadRequest,"-20034":a.BadRequest,"-20050":a.ExchangeError,"-30001":a.BadRequest,"-35034":a.AuthenticationError,"-35046":a.AuthenticationError,"-40001":a.ExchangeError,"-50001":a.ExchangeError,"-300001":a.AccountNotEnabled,"-300011":a.InvalidOrder,"-300012":a.InvalidOrder,"-100005":a.OrderNotFound,"-100006":a.InvalidOrder,"-100008":a.BadRequest,"-100015":a.NetworkError,"-710001":a.ExchangeError,"-710002":a.BadRequest,"-710003":a.BadRequest,"-710004":a.BadRequest,"-710005":a.InsufficientFunds,"-710006":a.InsufficientFunds,"-710007":a.InsufficientFunds,"-000101":a.NetworkError,"-000201":a.NetworkError},broad:{"-20001":a.OperationFailed,"-200050":a.RequestTimeout}}})}async fetchMarkets(e={}){const[t,i]=await Promise.all([this.publicGetV3Markets(e),this.publicGetV3Tickers(e)]),s=this.safeList(t,"data",[]),r=this.safeList(i,"data",[]),a=this.arrayConcat(s,r);return this.parseMarkets(a)}parseMarkets(e){const t=[],i=[];for(let s=0;s<e.length;s++){const r=e[s],a=this.safeString(r,"marketCode");this.inArray(a,t)||(t.push(a),i.push(this.parseMarket(r)))}return i}parseMarket(e){const t=this.safeString(e,"marketCode",""),i=t.split("-"),s=this.safeString(i,0),r=this.safeString(i,1),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r);let n,d,h=a+"/"+o,c=this.safeStringLower(e,"type","spot");const l="future"===c;l&&(c="swap",n="OX",d=this.safeCurrencyCode("OX"),h=h+":"+d);const u="spot"===c;return this.safeMarketStructure({id:t,numericId:void 0,symbol:h,base:a,quote:o,settle:d,baseId:s,quoteId:r,settleId:n,type:c,spot:u,margin:!1,swap:l,future:!1,option:!1,active:!0,contract:l,linear:!!l||void 0,inverse:!l&&void 0,taker:this.fees.trading.taker,maker:this.fees.trading.maker,contractSize:l?1:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:void 0,price:this.safeNumber(e,"tickSize")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"minSize"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:this.safeInteger(e,"listedAt"),index:void 0,info:e})}async fetchCurrencies(e={}){const t=await this.publicGetV3Assets(e),i=this.safeList(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],a=this.safeString(t,"asset","").split(".")[0],o=this.safeCurrencyCode(a);let n={};const d=this.safeList(t,"networkList",[]);let h,c,l;for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"network"),s=this.networkIdToCode(i),a=this.safeBool(t,"canDeposit"),o=this.safeBool(t,"canWithdraw"),u=a&&o,f=this.safeString(t,"minDeposit"),p=this.safeString(t,"minWithdrawal"),m=this.parsePrecision(this.safeString(t,"transactionPrecision"));n[s]={id:i,network:s,margin:void 0,deposit:a,withdraw:o,active:u,fee:void 0,precision:this.parseNumber(m),limits:{deposit:{min:f,max:void 0},withdraw:{min:p,max:void 0}},info:t},(void 0===c||a)&&(c=a),(void 0===l||o)&&(l=o),(void 0===h||r.Y.stringGt(h,m))&&(h=m)}o in s&&(n=this.extend(s[o].networks,n)),s[o]={id:a,code:o,name:void 0,type:void 0,active:void 0,deposit:c,withdraw:l,fee:void 0,precision:this.parseNumber(h),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},networks:n,info:t}}return s}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetV3Tickers(t),s=this.safeList(i,"data",[]);return this.parseTickers(s,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={marketCode:i.id},r=await this.publicGetV3Tickers(this.extend(s,t)),a=this.safeList(r,"data",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"lastUpdatedAt"),s=this.safeString(e,"marketCode"),r=(t=this.safeMarket(s,t)).symbol,a=this.safeString(e,"lastTradedPrice");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high24h"),low:this.safeString(e,"low24h"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:this.safeString(e,"open24h"),close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"currencyVolume24h"),quoteVolume:void 0,markPrice:this.safeString(e,"markPrice"),info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e);t=this.safeString(this.timeframes,t,t);const o={marketCode:a.id,timeframe:t};void 0!==i&&(o.startTime=i),void 0!==s&&(o.limit=s);const n=this.safeInteger(r,"until");void 0!==n?(o.endTime=n,r=this.omit(r,"until")):void 0!==i&&(o.endTime=this.sum(i,6048e5));const d=await this.publicGetV3Candles(this.extend(o,r)),h=this.safeList(d,"data",[]);return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"openedAt"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"currencyVolume")]}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={marketCode:s.id};void 0!==t&&(r.level=t);const a=await this.publicGetV3Depth(this.extend(r,i)),o=this.safeDict(a,"data",{}),n=this.safeInteger(o,"lastUpdatedAt");return this.parseOrderBook(o,s.symbol,n)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetV3FundingEstimates(t),s=this.safeList(i,"data",[]);return this.parseFundingRates(s,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"marketCode");t=this.market(i);const s=this.safeInteger(e,"fundingAt");return{info:e,symbol:t.symbol,markPrice:void 0,indexPrice:void 0,interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:s,datetime:this.iso8601(s),fundingRate:this.safeNumber(e,"estFundingRate"),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={marketCode:r.id};void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i);const o=this.safeInteger(s,"until");void 0!==o&&(a.endTime=o,s=this.omit(s,"until"));const n=await this.publicGetV3FundingRates(this.extend(a,s)),d=this.safeList(n,"data",[]);return this.parseFundingRateHistories(d,r,t,i)}parseFundingRateHistory(e,t=void 0){const i=this.safeString(e,"marketCode"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeInteger(e,"createdAt");return{info:e,symbol:s,fundingRate:this.safeNumber(e,"fundingRate"),timestamp:r,datetime:this.iso8601(r)}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={marketCode:r.id};void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i);const o=this.safeInteger(s,"until");void 0!==o&&(a.endTime=o,s=this.omit(s,"until"));const n=await this.privateGetV3Funding(this.extend(a,s)),d=this.safeList(n,"data",[]);return this.parseIncomes(d,r,t,i)}parseIncome(e,t=void 0){const i=this.safeString(e,"marketCode"),s=this.safeSymbol(i,t),r=this.safeNumber(e,"payment"),a=this.safeCurrencyCode("OX"),o=this.safeString(e,"id"),n=this.safeTimestamp(e,"createdAt"),d=this.safeNumber(e,"fundingRate");return{info:e,symbol:s,code:a,timestamp:n,datetime:this.iso8601(n),id:o,amount:r,rate:d}}async fetchLeverageTiers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetV3LeverageTiers(t),s=this.safeList(i,"data",[]);return this.parseLeverageTiers(s,e,"marketCode")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeString(e,"marketCode");t=this.safeMarket(i,t);const s=this.safeList(e,"tiers",[]),r=[];for(let e=0;e<s.length;e++){const a=s[e];r.push({tier:this.safeNumber(a,"tier"),symbol:this.safeSymbol(i,t),currency:t.settle,minNotional:this.safeNumber(a,"positionFloor"),maxNotional:this.safeNumber(a,"positionCap"),maintenanceMarginRate:this.safeNumber(a,"maintenanceMargin"),maxLeverage:this.safeNumber(a,"leverage"),info:a})}return r}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={marketCode:r.id};void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i);const o=this.safeInteger(s,"until");void 0!==o?(a.endTime=o,s=this.omit(s,"until")):void 0!==t&&(a.endTime=this.sum(t,6048e5));const n=await this.publicGetV3ExchangeTrades(this.extend(a,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.marketCode=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until");void 0!==o?(r.endTime=o,s=this.omit(s,"until")):void 0!==t&&(r.endTime=this.sum(t,6048e5));const n=await this.privateGetV3Trades(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"marketCode"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeInteger(e,"matchedAt"),a={cost:this.safeString(e,"fee"),currency:this.safeCurrencyCode(this.safeString(e,"feeAsset"))};return this.safeTrade({id:this.safeString(e,"matchId"),timestamp:r,datetime:this.iso8601(r),symbol:s,type:void 0,order:this.safeString(e,"orderId"),side:this.safeStringLower(e,"side"),takerOrMaker:this.safeStringLower2(e,"matchType","orderMatchType"),price:this.safeString(e,"matchPrice"),amount:this.safeString2(e,"matchQuantity","matchedQuantity"),cost:void 0,fee:a,info:e},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetV3Balances(e),i=this.safeList(t,"data",[]);let s=i[0];const r=this.safeString(e,"subAcc");if(void 0!==r)for(let e=0;e<i.length;e++){const t=i[e];if(this.safeString(t,"name")===r){s=t;break}}return this.parseBalance(s)}parseBalance(e){const t={info:e},i=this.safeList(e,"balances",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"asset"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"total"),o.free=this.safeString(s,"available"),o.used=this.safeString(s,"reserved"),t[a]=o}return this.safeBalance(t)}async fetchAccounts(e={}){await this.loadMarkets();const t=await this.privateGetV3AccountNames(e),i=this.safeList(t,"data",[]);return this.parseAccounts(i,e)}parseAccount(e){return{id:this.safeString(e,"accountId"),type:void 0,code:void 0,info:e}}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={asset:a.id,quantity:this.currencyToPrecision(e,t),fromAccount:i,toAccount:s},n=await this.privatePostV3Transfer(this.extend(o,r)),d=this.safeDict(n,"data",{});return this.parseTransfer(d,a)}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until");void 0!==o?(r.endTime=o,s=this.omit(s,"until")):void 0!==t&&(r.endTime=this.sum(t,6048e5));const n=await this.privateGetV3Transfer(this.extend(r,s)),d=this.safeList(n,"data",[]);return this.parseTransfers(d,a,t,i)}parseTransfer(e,t=void 0){const i=this.safeInteger(e,"transferredAt"),s=this.safeString(e,"asset");return{id:this.safeString(e,"id"),timestamp:i,datetime:this.iso8601(i),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"quantity"),fromAccount:this.safeString(e,"fromAccount"),toAccount:this.safeString(e,"toAccount"),status:this.parseTransferStatus(this.safeString(e,"status")),info:e}}parseTransferStatus(e){return this.safeString({COMPLETED:"ok"},e,e)}async fetchDepositAddress(e,t={}){const i=this.safeString(t,"network"),s=this.networkCodeToId(i,e);if(void 0===s)throw new a.BadRequest(this.id+" fetchDepositAddress() require network parameter");await this.loadMarkets();const r=this.currency(e),o={asset:r.id,network:s};t=this.omit(t,"network");const n=await this.privateGetV3DepositAddresses(this.extend(o,t)),d=this.safeDict(n,"data",{});return this.parseDepositAddress(d,r)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");return this.checkAddress(i),{info:e,currency:t.code,network:void 0,address:i,tag:void 0}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until");void 0!==o&&(r.endTime=o,s=this.omit(s,"until"));const n=await this.privateGetV3Deposit(this.extend(r,s)),d=this.safeList(n,"data",[]);for(let e=0;e<d.length;e++)d[e].type="deposit";return this.parseTransactions(d,a,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.asset=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=this.safeInteger(s,"until");void 0!==o&&(r.endTime=o,s=this.omit(s,"until"));const n=await this.privateGetV3Withdrawal(this.extend(r,s)),d=this.safeList(n,"data",[]);for(let e=0;e<d.length;e++)d[e].type="withdrawal";return this.parseTransactions(d,a,t,i)}parseTransactions(e,t=void 0,i=void 0,s=void 0,r={}){let a=[];for(let i=0;i<e.length;i++){e[i]=this.extend(e[i],r);const s=this.parseTransaction(e[i],t);a.push(s)}a=this.sortBy(a,"timestamp");const o=void 0!==t?t.code:void 0;return this.filterByCurrencySinceLimit(a,o,i,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"type");let r,a,o;e=this.omit(e,"type"),"deposit"===s?(r=this.safeString(e,"address"),o=this.parseDepositStatus(this.safeString(e,"status"))):"withdrawal"===s&&(a=this.safeString(e,"address"),o=this.parseWithdrawalStatus(this.safeString(e,"status")));const n=this.safeString(e,"txId"),d=this.safeString(e,"asset"),h=this.safeCurrencyCode(d,t),c=this.safeString(e,"network"),l=this.networkIdToCode(c),u=this.safeInteger2(e,"creditedAt","requestedAt"),f=this.safeNumber(e,"quantity"),p=this.safeNumber(e,"fee");let m;return void 0!==p&&(m={cost:p,currency:h}),{info:e,id:i,txid:n,timestamp:u,datetime:this.iso8601(u),network:l,address:r,addressTo:a,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:s,amount:f,currency:h,status:o,updated:void 0,internal:void 0,comment:void 0,fee:m}}parseDepositStatus(e){return this.safeString({COMPLETED:"ok"},e,e)}parseWithdrawalStatus(e){return this.safeString({COMPLETED:"ok",PROCESSING:"pending","IN SWEEPING":"pending",PENDING:"pending","ON HOLD":"pending",CANCELED:"canceled",FAILED:"failed"},e,e)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets();const a=this.currency(e),o=this.currencyToPrecision(e,t),n={asset:a.id,address:i,quantity:o};let d;void 0!==s&&(n.memo=s),[d,r]=this.handleNetworkCodeAndParams(r),void 0!==d&&(n.network=this.networkCodeToId(d)),n.externalFee=!1;const h=await this.privatePostV3Withdrawal(this.extend(n,r)),c=this.safeDict(h,"data",{});return c.type="withdrawal",this.parseTransaction(c,a)}async fetchPositions(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.privateGetV3Positions(t),s=this.safeList(i,"data",[]);let r=[];for(let e=0;e<s.length;e++){const t=s[e],i=this.safeList(t,"positions",[]);r=this.arrayConcat(r,i)}return this.parsePositions(r,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"marketCode");return t=this.safeMarket(i,t),this.safePosition({info:e,id:void 0,symbol:t.symbol,notional:void 0,marginMode:"cross",liquidationPrice:this.safeNumber(e,"estLiquidationPrice"),entryPrice:this.safeNumber(e,"entryPrice"),unrealizedPnl:this.safeNumber(e,"positionPnl"),realizedPnl:void 0,percentage:void 0,contracts:this.safeNumber(e,"position"),contractSize:void 0,markPrice:this.safeNumber(e,"markPrice"),lastPrice:void 0,side:void 0,hedged:void 0,timestamp:void 0,datetime:void 0,lastUpdateTimestamp:this.safeInteger(e,"lastUpdatedAt"),maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,collateral:void 0,initialMargin:void 0,initialMarginPercentage:void 0,leverage:void 0,marginRatio:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o={responseType:this.safeString(a,"responseType","FULL"),timestamp:this.safeInteger(a,"timestamp",this.milliseconds())};a=this.omit(a,["responseType","timestamp"]);const n=this.safeInteger(a,"recvWindow");void 0!==n&&(o.recvWindow=n,a=this.omit(a,"recvWindow"));const d=this.createOrderRequest(e,t,i,s,r,a);o.orders=[d];const h=await this.privatePostV3OrdersPlace(o),c=this.safeList(h,"data",[]),l=this.safeDict(c,0,{});return this.parseOrder(l)}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"symbol"),a=this.safeString(s,"type"),o=this.safeString(s,"side"),n=this.safeNumber(s,"amount"),d=this.safeNumber(s,"price"),h=this.safeDict(s,"params",{}),c=this.createOrderRequest(r,a,o,n,d,h);i.push(c)}const s={responseType:"FULL",timestamp:this.milliseconds(),orders:i},r=await this.privatePostV3OrdersPlace(this.extend(s,t)),a=this.safeList(r,"data",[]);return this.parseOrders(a)}createOrderRequest(e,t,i,s,r=void 0,a={}){const o={marketCode:this.market(e).id,side:i.toUpperCase(),source:1e3},n=this.safeString2(a,"cost","amount");void 0!==n?(o.amount=n,a=this.omit(a,["cost","amount"])):o.quantity=s;const d=this.safeString2(a,"triggerPrice","stopPrice");let h,c=t.toUpperCase();void 0!==d&&("MARKET"===c?c="STOP_MARKET":"LIMIT"===c&&(c="STOP_LIMIT"),o.stopPrice=d,a=this.omit(a,["triggerPrice","stopPrice"])),o.orderType=c,"STOP_LIMIT"===c?o.limitPrice=r:void 0!==r&&(o.price=r);const l="MARKET"===c||"STOP_MARKET"===c;[h,a]=this.handlePostOnly(l,!1,a);const u=this.safeStringUpper(a,"timeInForce");return h&&"MAKER_ONLY_REPRICE"!==u&&(o.timeInForce="MAKER_ONLY"),this.extend(o,a)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new a.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");const s={cost:t};return await this.createOrder(e,"market","buy",void 0,void 0,this.extend(s,i))}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderId:e},r=await this.privateGetV3OrdersStatus(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r;void 0!==e&&(r=this.market(e));const a=await this.privateGetV3OrdersWorking(this.extend({},s)),o=this.safeList(a,"data",[]);return this.parseOrders(o,r,t,i)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");const s=this.market(t).id,r={timestamp:this.milliseconds(),responseType:"FULL"},o={marketCode:s,orderId:e},n=this.safeInteger(i,"clientOrderId");void 0!==n&&(o.clientOrderId=n),r.orders=[o];const d=await this.privateDeleteV3OrdersCancel(this.extend(r,i)),h=this.safeList(d,"data",[]),c=this.safeDict(h,0,{});return this.parseOrder(c)}async cancelAllOrders(e=void 0,t={}){const i={};if(void 0!==e){const t=this.market(e);i.marketCode=t.id}return await this.privateDeleteV3OrdersCancelAll(this.extend(i,t))}async cancelOrders(e,t=void 0,i={}){if(void 0===t)throw new a.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t),r=s.id,o={timestamp:this.milliseconds(),responseType:"FULL"},n=[];for(let t=0;t<e.length;t++){const i={marketCode:r,orderId:e[t]};n.push(i)}o.orders=n;const d=await this.privateDeleteV3OrdersCancel(this.extend(o,i)),h=this.safeList(d,"data",[]);return this.parseOrders(h,s)}parseOrder(e,t=void 0){const i=this.safeString(e,"marketCode");t=this.safeMarket(i,t);const s=this.safeInteger(e,"createdAt");let r;const a=this.safeString(e,"feeInstrumentId");void 0!==a&&(r={currency:this.safeCurrencyCode(a),cost:this.safeNumber(e,"fees")});let o=this.safeString(e,"status");void 0!==this.safeInteger(e,"code")&&(o="rejected");const n=this.safeString(e,"stopPrice");return this.safeOrder({id:this.safeString(e,"orderId"),clientOrderId:this.safeString(e,"clientOrderId"),timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:this.safeInteger(e,"lastMatchedAt"),lastUpdateTimestamp:this.safeInteger(e,"lastModifiedAt"),status:this.parseOrderStatus(o),symbol:t.symbol,type:this.parseOrderType(this.safeString(e,"orderType")),timeInForce:this.parseOrderTimeInForce(this.safeString(e,"timeInForce")),side:this.safeStringLower(e,"side"),price:this.safeStringN(e,["price","matchPrice","limitPrice"]),average:void 0,amount:this.safeString2(e,"totalQuantity","quantity"),filled:this.safeString2(e,"cumulativeMatchedQuantity","matchQuantity"),remaining:this.safeString(e,"remainQuantity"),triggerPrice:n,stopLossPrice:n,cost:this.omitZero(this.safeString(e,"amount")),trades:void 0,fee:r,info:e},t)}parseOrderStatus(e){return this.safeString({OPEN:"open",PARTIALLY_FILLED:"open",PARTIAL_FILL:"open",FILLED:"closed",CANCELED:"canceled",CANCELED_BY_USER:"canceled",CANCELED_BY_MAKER_ONLY:"rejected",CANCELED_BY_FOK:"rejected",CANCELED_ALL_BY_IOC:"rejected",CANCELED_PARTIAL_BY_IOC:"canceled",CANCELED_BY_SELF_TRADE_PROTECTION:"rejected"},e,e)}parseOrderType(e){return this.safeString({LIMIT:"limit",STOP_LIMIT:"limit",MARKET:"market",STOP_MARKET:"market"},e,e)}parseOrderTimeInForce(e){return this.safeString({GTC:"GTC",IOC:"IOC",FOK:"FOK",MAKER_ONLY:"PO",MAKER_ONLY_REPRICE:"PO"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.urls.api[t];let d=o+"/"+e,h="";if("GET"===i&&(h=this.urlencode(s),0!==h.length&&(d+="?"+h)),"private"===t){this.checkRequiredCredentials();const t=this.milliseconds(),d=this.iso8601(t).split(".")[0],c=this.nonce(),l=o.split("//");"POST"!==i&&"DELETE"!==i||(h=a=this.json(s));const u=d+"\n"+c.toString()+"\n"+i+"\n"+l[1]+"\n/"+e+"\n"+h,f=this.hmac(this.encode(u),this.encode(this.secret),n.s,"base64");r={"Content-Type":"application/json",AccessKey:this.apiKey,Timestamp:d,Signature:f,Nonce:c.toString()}}return{url:d,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){if(void 0!==n&&200!==e){const e=this.safeString(n,"code",void 0),t=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,o,t),this.throwExactlyMatchedException(this.exceptions.exact,e,t),new a.ExchangeError(t)}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"p2b",name:"p2b",countries:["LT"],rateLimit:100,version:"v2",pro:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createMarketOrder:!1,createOrder:!0,createOrders:!1,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!1,fetchLedgerEntry:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawAddresses:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!1},timeframes:{"1m":"1m","1h":"1h","1d":"1d"},urls:{extension:".json",referral:"https://p2pb2b.com?referral=ee784c53",logo:"https://github.com/ccxt/ccxt/assets/43336371/8da13a80-1f0a-49be-bb90-ff8b25164755",api:{public:"https://api.p2pb2b.com/api/v2/public",private:"https://api.p2pb2b.com/api/v2"},www:"https://p2pb2b.com/",doc:"https://github.com/P2B-team/p2b-api-docs/blob/master/api-doc.md",fees:"https://p2pb2b.com/fee-schedule/"},api:{public:{get:{markets:1,market:1,tickers:1,ticker:1,book:1,history:1,"depth/result":1,"market/kline":1}},private:{post:{"account/balances":1,"account/balance":1,"order/new":1,"order/cancel":1,orders:1,"account/market_order_history":1,"account/market_deal_history":1,"account/order":1,"account/order_history":1,"account/executed_history":1}}},fees:{trading:{tierBased:!0,percentage:!0,taker:[[this.parseNumber("0"),this.parseNumber("0.2")],[this.parseNumber("1"),this.parseNumber("0.19")],[this.parseNumber("5"),this.parseNumber("0.18")],[this.parseNumber("10"),this.parseNumber("0.17")],[this.parseNumber("25"),this.parseNumber("0.16")],[this.parseNumber("75"),this.parseNumber("0.15")],[this.parseNumber("100"),this.parseNumber("0.14")],[this.parseNumber("150"),this.parseNumber("0.13")],[this.parseNumber("300"),this.parseNumber("0.12")],[this.parseNumber("450"),this.parseNumber("0.11")],[this.parseNumber("500"),this.parseNumber("0.1")]],maker:[[this.parseNumber("0"),this.parseNumber("0.2")],[this.parseNumber("1"),this.parseNumber("0.18")],[this.parseNumber("5"),this.parseNumber("0.16")],[this.parseNumber("10"),this.parseNumber("0.14")],[this.parseNumber("25"),this.parseNumber("0.12")],[this.parseNumber("75"),this.parseNumber("0.1")],[this.parseNumber("100"),this.parseNumber("0.08")],[this.parseNumber("150"),this.parseNumber("0.06")],[this.parseNumber("300"),this.parseNumber("0.04")],[this.parseNumber("450"),this.parseNumber("0.02")],[this.parseNumber("500"),this.parseNumber("0.01")]]}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1,symbolRequired:!0},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1/12,untilDays:1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:500}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},precisionMode:a.kb,exceptions:{1001:r.AuthenticationError,1002:r.AuthenticationError,1003:r.AuthenticationError,1004:r.AuthenticationError,1005:r.AuthenticationError,1006:r.AuthenticationError,1007:r.AuthenticationError,1008:r.AuthenticationError,1009:r.AuthenticationError,1010:r.AuthenticationError,1011:r.AuthenticationError,1012:r.AuthenticationError,1013:r.AuthenticationError,1014:r.AuthenticationError,1015:r.AuthenticationError,1016:r.AuthenticationError,2010:r.BadRequest,2020:r.BadRequest,2021:r.BadRequest,2030:r.BadRequest,2040:r.InsufficientFunds,2050:r.BadRequest,2051:r.BadRequest,2052:r.BadRequest,2060:r.BadRequest,2061:r.BadRequest,2062:r.BadRequest,2070:r.BadRequest,3001:r.BadRequest,3020:r.BadRequest,3030:r.BadRequest,3040:r.BadRequest,3050:r.BadRequest,3060:r.BadRequest,3070:r.BadRequest,3080:r.BadRequest,3090:r.BadRequest,3100:r.BadRequest,3110:r.BadRequest,4001:r.ExchangeNotAvailable,6010:r.InsufficientFunds},options:{}})}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e),i=this.safeValue(t,"result",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeString(e,"stock"),s=this.safeString(e,"money"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o=this.safeValue(e,"limits"),n=this.safeString(o,"max_amount"),d=this.safeString(o,"max_price");return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(o,"step_size"),price:this.safeNumber(o,"tick_size")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(o,"min_amount"),max:this.parseNumber(this.omitZero(n))},price:{min:this.safeNumber(o,"min_price"),max:this.parseNumber(this.omitZero(d))},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t),s=this.safeValue(i,"result",{});return this.parseTickers(s,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.publicGetTicker(this.extend(s,t)),a=this.safeValue(r,"result",{}),o=this.safeIntegerProduct(r,"cache_time",1e3);return this.extend({timestamp:o,datetime:this.iso8601(o)},this.parseTicker(a,i))}parseTicker(e,t=void 0){const i=this.safeIntegerProduct(e,"at",1e3);"ticker"in e&&(e=this.safeValue(e,"ticker"));const s=this.safeString(e,"last");return this.safeTicker({symbol:this.safeString(t,"symbol"),timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:s,last:s,previousClose:void 0,change:void 0,percentage:this.safeString(e,"change"),average:void 0,baseVolume:this.safeString2(e,"vol","volume"),quoteVolume:this.safeString(e,"deal"),info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={market:s.id};void 0!==t&&(r.limit=t);const a=await this.publicGetDepthResult(this.extend(r,i)),o=this.safeValue(a,"result",{}),n=this.safeIntegerProduct(a,"current_time",1e3);return this.parseOrderBook(o,s.symbol,n,"bids","asks",0,1)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const a=this.safeInteger(s,"lastId");if(void 0===a)throw new r.ArgumentsRequired(this.id+' fetchTrades () requires an extra parameter params["lastId"]');const o=this.market(e),n={market:o.id,lastId:a};void 0!==i&&(n.limit=i);const d=await this.publicGetHistory(this.extend(n,s)),h=this.safeList(d,"result",[]);return this.parseTrades(h,o,t,i)}parseTrade(e,t=void 0){const i=this.safeIntegerProduct2(e,"time","deal_time",1e3);let s=this.safeString(e,"role");return"1"===s?s="maker":"2"===s&&(s="taker"),this.safeTrade({info:e,id:this.safeString2(e,"id","deal_id"),timestamp:i,datetime:this.iso8601(i),symbol:this.safeString(t,"symbol"),order:this.safeString2(e,"dealOrderId","deal_order_id"),type:void 0,side:this.safeString2(e,"type","side"),takerOrMaker:s,price:this.safeString(e,"price"),amount:this.safeString(e,"amount"),cost:this.safeString(e,"deal"),fee:{currency:t.quote,cost:this.safeString2(e,"fee","deal_fee")}},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,interval:t};void 0!==s&&(o.limit=s);const n=await this.publicGetMarketKline(this.extend(o,r)),d=this.safeList(n,"result",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeIntegerProduct(e,0,1e3),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostAccountBalances(e),i=this.safeValue(t,"result",{});return this.parseBalance(i)}parseBalance(e){const t={info:e},i=Object.keys(e);for(let s=0;s<i.length;s++){const r=i[s],a=e[r],o=this.safeCurrencyCode(r),n=this.safeString(a,"freeze"),d={free:this.safeString(a,"available"),used:n};t[o]=d}return this.safeBalance(t)}async createOrder(e,t,i,s,a=void 0,o={}){if(await this.loadMarkets(),"market"===t)throw new r.BadRequest(this.id+' createOrder () can only accept orders with type "limit"');const n=this.market(e),d={market:n.id,side:i,amount:this.amountToPrecision(e,s),price:this.priceToPrecision(e,a)},h=await this.privatePostOrderNew(this.extend(d,o)),c=this.safeDict(h,"result");return this.parseOrder(c,n)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s={market:this.market(t).id,orderId:e},a=await this.privatePostOrderCancel(this.extend(s,i)),o=this.safeDict(a,"result");return this.parseOrder(o)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders () requires the symbol argument");await this.loadMarkets();const a=this.market(e),o={market:a.id};void 0!==i&&(o.limit=i);const n=await this.privatePostOrders(this.extend(o,s)),d=this.safeList(n,"result",[]);return this.parseOrders(d,a,t,i)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.safeMarket(t),o={orderId:e};void 0!==s&&(o.limit=s);const n=await this.privatePostAccountOrder(this.extend(o,r)),d=this.safeValue(n,"result",{}),h=this.safeList(d,"records",[]);return this.parseTrades(h,a,i,s)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();let a=this.safeInteger(s,"until");if(s=this.omit(s,"until"),void 0===a&&(a=void 0===t?this.milliseconds():t+864e5),void 0===t&&(t=a-864e5),a-t>864e5)throw new r.BadRequest(this.id+' fetchMyTrades () the time between since and params["until"] cannot be greater than 24 hours');const o=this.market(e),n={market:o.id,startTime:this.parseToInt(t/1e3),endTime:this.parseToInt(a/1e3)};void 0!==i&&(n.limit=i);const d=await this.privatePostAccountMarketDealHistory(this.extend(n,s)),h=this.safeValue(d,"result",{}),c=this.safeList(h,"deals",[]);return this.parseTrades(c,o,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let a,o=this.safeInteger(s,"until");if(s=this.omit(s,"until"),void 0!==e&&(a=this.market(e)),void 0===o&&(o=void 0===t?this.milliseconds():t+864e5),void 0===t&&(t=o-864e5),o-t>864e5)throw new r.BadRequest(this.id+' fetchClosedOrders () the time between since and params["until"] cannot be greater than 24 hours');const n={startTime:this.parseToInt(t/1e3),endTime:this.parseToInt(o/1e3)};void 0!==a&&(n.market=a.id),void 0!==i&&(n.limit=i);const d=await this.privatePostAccountOrderHistory(this.extend(n,s)),h=this.safeValue(d,"result");let c=[];const l=Object.keys(h);for(let e=0;e<l.length;e++){const s=h[l[e]],r=this.parseOrders(s,a,t,i);c=this.arrayConcat(c,r)}return c}parseOrder(e,t=void 0){const i=this.safeIntegerProduct2(e,"timestamp","ctime",1e3),s=this.safeString(e,"market");return t=this.safeMarket(s,t),this.safeOrder({info:e,id:this.safeString2(e,"id","orderId"),clientOrderId:void 0,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:t.symbol,type:this.safeString(e,"type"),timeInForce:void 0,postOnly:void 0,side:this.safeString(e,"side"),price:this.safeString(e,"price"),triggerPrice:void 0,amount:this.safeString(e,"amount"),cost:void 0,average:void 0,filled:this.safeString(e,"dealStock"),remaining:this.safeString(e,"left"),status:void 0,fee:{currency:t.quote,cost:this.safeString(e,"dealFee")},trades:void 0},t)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let n=this.urls.api[t]+"/"+this.implodeParams(e,s);if(s=this.omit(s,this.extractParams(e)),"GET"===i&&Object.keys(s).length&&(n+="?"+this.urlencode(s)),"private"===t){s.request="/api/v2/"+e,s.nonce=this.nonce().toString();const t=this.stringToBase64(this.json(s));r={"Content-Type":"application/json","X-TXC-APIKEY":this.apiKey,"X-TXC-PAYLOAD":t,"X-TXC-SIGNATURE":this.hmac(this.encode(t),this.encode(this.secret),o.Zf)},a=this.json(s)}return{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(void 0!==o&&400===e){const e=this.safeValue(o,"error"),t=this.safeString(e,"code"),i=this.id+" "+this.json(o);this.throwExactlyMatchedException(this.exceptions,t,i)}}}
class c extends r.A{describe(){return this.deepExtend(super.describe(),{id:"paradex",name:"Paradex",countries:[],version:"v1",rateLimit:50,certified:!1,pro:!0,dex:!0,has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,borrowCrossMargin:!1,borrowIsolatedMargin:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!1,cancelOrders:!1,cancelOrdersForSymbols:!1,closeAllPositions:!1,closePosition:!1,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!1,createReduceOnlyOrder:!1,createStopOrder:!0,createTriggerOrder:!0,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDeposits:!0,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchLiquidations:!0,fetchMarginMode:void 0,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!1},timeframes:{"1m":1,"3m":3,"5m":5,"15m":15,"30m":30,"1h":60},hostname:"paradex.trade",urls:{logo:"https://github.com/user-attachments/assets/84628770-784e-4ec4-a759-ec2fbb2244ea",api:{v1:"https://api.prod.{hostname}/v1"},test:{v1:"https://api.testnet.{hostname}/v1"},www:"https://www.paradex.trade/",doc:"https://docs.api.testnet.paradex.trade/",fees:"https://docs.paradex.trade/getting-started/trading-fees",referral:"https://app.paradex.trade/r/ccxt24"},api:{public:{get:{"bbo/{market}":1,"funding/data":1,markets:1,"markets/klines":1,"markets/summary":1,"orderbook/{market}":1,insurance:1,"referrals/config":1,"system/config":1,"system/state":1,"system/time":1,trades:1}},private:{get:{account:1,"account/profile":1,balance:1,fills:1,"funding/payments":1,positions:1,tradebusts:1,transactions:1,liquidations:1,orders:1,"orders-history":1,"orders/by_client_id/{client_id}":1,"orders/{order_id}":1,"points_data/{market}/{program}":1,"referrals/summary":1,transfers:1},post:{"account/profile/referral_code":1,"account/profile/username":1,auth:1,onboarding:1,orders:1},delete:{orders:1,"orders/by_client_id/{client_id}":1,"orders/{order_id}":1}}},fees:{swap:{taker:this.parseNumber("0.0002"),maker:this.parseNumber("0.0002")},spot:{taker:this.parseNumber("0.0002"),maker:this.parseNumber("0.0002")}},requiredCredentials:{apiKey:!1,secret:!1,walletAddress:!0,privateKey:!0},exceptions:{exact:{VALIDATION_ERROR:a.AuthenticationError,BINDING_ERROR:a.OperationRejected,INTERNAL_ERROR:a.ExchangeError,NOT_FOUND:a.BadRequest,SERVICE_UNAVAILABLE:a.ExchangeError,INVALID_REQUEST_PARAMETER:a.BadRequest,ORDER_ID_NOT_FOUND:a.InvalidOrder,ORDER_IS_CLOSED:a.InvalidOrder,ORDER_IS_NOT_OPEN_YET:a.InvalidOrder,CLIENT_ORDER_ID_NOT_FOUND:a.InvalidOrder,DUPLICATED_CLIENT_ID:a.InvalidOrder,INVALID_PRICE_PRECISION:a.OperationRejected,INVALID_SYMBOL:a.OperationRejected,INVALID_TOKEN:a.OperationRejected,INVALID_ETHEREUM_ADDRESS:a.OperationRejected,INVALID_ETHEREUM_SIGNATURE:a.OperationRejected,INVALID_STARKNET_ADDRESS:a.OperationRejected,INVALID_STARKNET_SIGNATURE:a.OperationRejected,STARKNET_SIGNATURE_VERIFICATION_FAILED:a.AuthenticationError,BAD_STARKNET_REQUEST:a.BadRequest,ETHEREUM_SIGNER_MISMATCH:a.BadRequest,ETHEREUM_HASH_MISMATCH:a.BadRequest,NOT_ONBOARDED:a.BadRequest,INVALID_TIMESTAMP:a.BadRequest,INVALID_SIGNATURE_EXPIRATION:a.AuthenticationError,ACCOUNT_NOT_FOUND:a.AuthenticationError,INVALID_ORDER_SIGNATURE:a.AuthenticationError,PUBLIC_KEY_INVALID:a.BadRequest,UNAUTHORIZED_ETHEREUM_ADDRESS:a.BadRequest,ETHEREUM_ADDRESS_ALREADY_ONBOARDED:a.BadRequest,MARKET_NOT_FOUND:a.BadRequest,ALLOWLIST_ENTRY_NOT_FOUND:a.BadRequest,USERNAME_IN_USE:a.AuthenticationError,GEO_IP_BLOCK:a.PermissionDenied,ETHEREUM_ADDRESS_BLOCKED:a.PermissionDenied,PROGRAM_NOT_FOUND:a.BadRequest,INVALID_DASHBOARD:a.OperationRejected,MARKET_NOT_OPEN:a.BadRequest,INVALID_REFERRAL_CODE:a.OperationRejected,PARENT_ADDRESS_ALREADY_ONBOARDED:a.BadRequest,INVALID_PARENT_ACCOUNT:a.OperationRejected,INVALID_VAULT_OPERATOR_CHAIN:a.OperationRejected,VAULT_OPERATOR_ALREADY_ONBOARDED:a.OperationRejected,VAULT_NAME_IN_USE:a.OperationRejected,BATCH_SIZE_OUT_OF_RANGE:a.OperationRejected,ISOLATED_MARKET_ACCOUNT_MISMATCH:a.OperationRejected,POINTS_SUMMARY_NOT_FOUND:a.OperationRejected,"-32700":a.BadRequest,"-32600":a.BadRequest,"-32601":a.BadRequest,"-32602":a.BadRequest,"-32603":a.ExchangeError,100:a.BadRequest,40110:a.AuthenticationError,40111:a.AuthenticationError,40112:a.PermissionDenied},broad:{"missing or malformed jwt":a.AuthenticationError}},precisionMode:o.kb,commonCurrencies:{},options:{paradexAccount:void 0,broker:"CCXT"},features:{spot:void 0,forSwap:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!0,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!0,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchClosedOrders:void 0,fetchOHLCV:{limit:void 0}},swap:{linear:{extends:"forSwap"},inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){const t=await this.publicGetSystemTime(e);return this.safeInteger(t,"server_time")}async fetchStatus(e={}){const t=await this.publicGetSystemState(e);return{status:"ok"===this.safeString(t,"status")?"ok":"maintenance",updated:void 0,eta:void 0,url:void 0,info:t}}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e),i=this.safeList(t,"results");return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"quote_currency"),s=this.safeString(e,"base_currency"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o=this.safeString(e,"settlement_currency"),n=this.safeCurrencyCode(o),d=a+"/"+r+":"+n,h=this.safeInteger(e,"expiry_at"),c=this.parseNumber("0.0003"),l=this.parseNumber("-0.00005");return this.safeMarketStructure({id:t,symbol:d,base:a,quote:r,settle:n,baseId:s,quoteId:i,settleId:o,type:"swap",spot:!1,margin:void 0,swap:!0,future:!1,option:!1,active:this.safeBool(e,"enableTrading"),contract:!0,linear:!0,inverse:void 0,taker:c,maker:l,contractSize:this.parseNumber("1"),expiry:0===h?void 0:h,expiryDatetime:0===h?void 0:this.iso8601(h),strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"order_size_increment"),price:this.safeNumber(e,"price_tick_size")},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:this.safeNumber(e,"max_order_size")},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"min_notional"),max:void 0}},created:void 0,info:e})}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={resolution:this.safeString(this.timeframes,t,t),symbol:a.id},n=this.milliseconds(),d=this.parseTimeframe(t),h=this.safeInteger2(r,"until","till",n);r=this.omit(r,["until","till"]),void 0!==i?(o.start_at=i,o.end_at=void 0!==s?this.sum(i,d*(s+1)*1e3)-1:h):(o.end_at=h,o.start_at=void 0!==s?h-d*(s+1)*1e3+1:h-101*d*1e3+1);const c=await this.publicGetMarketsKlines(this.extend(o,r)),l=this.safeList(c,"results",[]);return this.parseOHLCVs(l,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};void 0!==(e=this.marketSymbols(e))?Array.isArray(e)?i.market=this.marketId(e[0]):i.market=this.marketId(e):i.market="ALL";const s=await this.publicGetMarketsSummary(this.extend(i,t)),r=this.safeList(s,"results",[]);return this.parseTickers(r,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.publicGetMarketsSummary(this.extend(s,t)),a=this.safeList(r,"results",[]),o=this.safeDict(a,0,{});return this.parseTicker(o,i)}parseTicker(e,t=void 0){let i=this.safeString(e,"price_change_rate_24h");void 0!==i&&(i=s.Y.stringMul(i,"100"));const r=this.safeString(e,"last_traded_price"),a=this.safeString(e,"symbol"),o=(t=this.safeMarket(a,t)).symbol,n=this.safeInteger(e,"created_at");return this.safeTicker({symbol:o,timestamp:n,datetime:this.iso8601(n),high:void 0,low:void 0,bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:i,average:void 0,baseVolume:void 0,quoteVolume:this.safeString(e,"volume_24h"),markPrice:this.safeString(e,"mark_price"),info:e},t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={market:s.id},a=await this.publicGetOrderbookMarket(this.extend(r,i));void 0!==t&&(r.depth=t);const o=this.safeInteger(a,"last_updated_at"),n=this.parseOrderBook(a,s.symbol,o);return n.nonce=this.safeInteger(a,"seq_no"),n}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchTrades",e,t,i,s,"next","cursor",void 0,100);const a=this.market(e);let o={market:a.id};void 0!==i&&(o.page_size=i),void 0!==t&&(o.start_at=t),[o,s]=this.handleUntilOption("end_at",o,s);const n=await this.publicGetTrades(this.extend(o,s)),d=this.safeList(n,"results",[]);for(let e=0;e<d.length;e++)d[e].next=this.safeString(n,"next");return this.parseTrades(d,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString(e,"market");t=this.safeMarket(i,t);const s=this.safeString(e,"id"),r=this.safeInteger(e,"created_at"),a=this.safeString(e,"price"),o=this.safeString(e,"size"),n=this.safeStringLower(e,"side"),d="taker"===this.safeStringLower(e,"liquidity","taker")?"taker":"maker",h=this.safeString(e,"fee_currency"),c=this.safeCurrencyCode(h);return this.safeTrade({info:e,id:s,order:this.safeString(e,"order_id"),timestamp:r,datetime:this.iso8601(r),symbol:t.symbol,type:void 0,takerOrMaker:d,side:n,price:a,amount:o,cost:void 0,fee:{cost:this.safeString(e,"fee"),currency:c,rate:void 0}},t)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new a.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s={market:i.id},r=await this.publicGetMarketsSummary(this.extend(s,t)),o=this.safeList(r,"results",[]),n=this.safeDict(o,0,{});return this.parseOpenInterest(n,i)}parseOpenInterest(e,t=void 0){const i=this.safeInteger(e,"created_at"),s=this.safeString(e,"symbol"),r=(t=this.safeMarket(s,t)).symbol;return this.safeOpenInterest({symbol:r,openInterestAmount:this.safeString(e,"open_interest"),openInterestValue:void 0,timestamp:i,datetime:this.iso8601(i),info:e},t)}hashMessage(e){return"0x"+this.hash(e,d.lY,"hex")}signHash(e,t){const i=(0,n.h1)(e.slice(-64),t.slice(-64),h.bI,void 0),s=i.r,r=i.s,a=this.intToBase16(this.sum(27,i.v));return"0x"+s.padStart(64,"0")+r.padStart(64,"0")+a}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}async getSystemConfig(){const e=this.safeDict(this.options,"systemConfig");if(void 0!==e)return e;const t=await this.publicGetSystemConfig();return this.options.systemConfig=t,t}async prepareParadexDomain(e=!1){const t=await this.getSystemConfig();if(!0===e){return{name:"Paradex",chainId:t.l1_chain_id,version:"1"}}return{name:"Paradex",chainId:t.starknet_chain_id,version:1}}async retrieveAccount(){const e=this.safeDict(this.options,"paradexAccount");if(void 0!==e)return e;this.checkRequiredCredentials();const t=await this.getSystemConfig(),i=await this.prepareParadexDomain(!0),s=this.ethEncodeStructuredData(i,{Constant:[{name:"action",type:"string"}]},{action:"STARK Key"}),r=this.signMessage(s,this.privateKey),a=this.retrieveStarkAccount(r,t.paraclear_account_hash,t.paraclear_account_proxy_hash);return this.options.paradexAccount=a,a}async onboarding(e={}){const t=await this.retrieveAccount(),i=await this.prepareParadexDomain(),s=this.starknetEncodeStructuredData(i,{Constant:[{name:"action",type:"felt"}]},{action:"Onboarding"},t.address),r=this.starknetSign(s,t.privateKey);e.signature=r,e.account=t.address,e.public_key=t.publicKey;return await this.privatePostOnboarding(e)}async authenticateRest(e={}){const t=this.safeString(this.options,"authToken"),i=this.nonce();if(void 0!==t){if(i<this.safeInteger(this.options,"expires"))return t}const s=await this.retrieveAccount(),r=i+180,a={method:"POST",path:"/v1/auth",body:"",timestamp:i,expiration:r},o=await this.prepareParadexDomain(),n=this.starknetEncodeStructuredData(o,{Request:[{name:"method",type:"felt"},{name:"path",type:"felt"},{name:"body",type:"felt"},{name:"timestamp",type:"felt"},{name:"expiration",type:"felt"}]},a,s.address),d=this.starknetSign(n,s.privateKey);e.signature=d,e.account=s.address,e.timestamp=a.timestamp,e.expiration=a.expiration;const h=await this.privatePostAuth(e),c=this.safeString(h,"jwt_token");return this.options.authToken=c,this.options.expires=r,c}parseOrder(e,t=void 0){const i=this.safeInteger(e,"created_at"),s=this.safeString(e,"id"),r=this.omitZero(this.safeString(e,"client_id")),a=this.safeString(e,"market"),o=(t=this.safeMarket(a,t)).symbol,n=this.safeString(e,"price"),d=this.safeString(e,"size"),h=this.safeString(e,"type"),c=this.safeString(e,"status"),l=this.safeStringLower(e,"side"),u=this.omitZero(this.safeString(e,"avg_fill_price")),f=this.omitZero(this.safeString(e,"remaining_size")),p=this.safeInteger(e,"last_updated_at");let m;return"REDUCE_ONLY"in this.safeList(e,"flags",[])&&(m=!0),this.safeOrder({id:s,clientOrderId:r,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,lastUpdateTimestamp:p,status:this.parseOrderStatus(c),symbol:o,type:this.parseOrderType(h),timeInForce:this.parseTimeInForce(this.safeString(e,"instrunction")),postOnly:void 0,reduceOnly:m,side:l,price:n,triggerPrice:this.safeString(e,"trigger_price"),takeProfitPrice:void 0,stopLossPrice:void 0,average:u,amount:d,filled:void 0,remaining:f,cost:void 0,trades:void 0,fee:{cost:void 0,currency:void 0},info:e},t)}parseTimeInForce(e){return this.safeString({IOC:"IOC",GTC:"GTC",POST_ONLY:"PO"},e,void 0)}parseOrderStatus(e){if(void 0!==e){const t={NEW:"open",UNTRIGGERED:"open",OPEN:"open",CLOSED:"closed"};return this.safeString(t,e,e)}return e}parseOrderType(e){return this.safeStringLower({LIMIT:"limit",MARKET:"market",STOP_LIMIT:"limit",STOP_MARKET:"market"},e,e)}convertShortString(e){return"0x"+this.binaryToBase16(this.base64ToBinary(this.stringToBase64(e)))}scaleNumber(e){return s.Y.stringMul(e,"100000000")}async createOrder(e,t,i,s,r=void 0,a={}){await this.authenticateRest(),await this.loadMarkets();const o=this.market(e);let n=this.safeBool2(a,"reduceOnly","reduce_only");const d=t.toUpperCase(),h=i.toUpperCase(),c={market:o.id,side:h,type:d},l=this.safeString2(a,"triggerPrice","stopPrice"),u=this.safeString(a,"stopLossPrice"),f=this.safeString(a,"takeProfitPrice"),p="MARKET"===d,m=void 0!==f,g=void 0!==u,v=void 0!==l||m||g,y=this.safeStringUpper(a,"timeInForce"),w=this.isPostOnly(p,void 0,a);p||(w?c.instruction="POST_ONLY":"ioc"===y&&(c.instruction="IOC")),void 0!==r&&(c.price=this.priceToPrecision(e,r));const b=this.safeStringN(a,["clOrdID","clientOrderId","client_order_id"]);void 0!==b&&(c.client_id=b);let k,S="0";v?p?g?(k=this.priceToPrecision(e,u),n=!0,c.type="STOP_LOSS_MARKET"):m?(k=this.priceToPrecision(e,f),n=!0,c.type="TAKE_PROFIT_MARKET"):(k=this.priceToPrecision(e,l),S=this.amountToPrecision(e,s),c.type="STOP_MARKET"):g?(k=this.priceToPrecision(e,u),n=!0,c.type="STOP_LOSS_LIMIT"):m?(k=this.priceToPrecision(e,f),n=!0,c.type="TAKE_PROFIT_LIMIT"):(k=this.priceToPrecision(e,l),S=this.amountToPrecision(e,s),c.type="STOP_LIMIT"):S=this.amountToPrecision(e,s),void 0!==k&&(c.trigger_price=k),c.size=S,n&&(c.flags=["REDUCE_ONLY"]),a=this.omit(a,["reduceOnly","reduce_only","clOrdID","clientOrderId","client_order_id","postOnly","timeInForce","stopPrice","triggerPrice","stopLossPrice","takeProfitPrice"]);const O=await this.retrieveAccount(),T={timestamp:1e3*this.nonce(),market:this.convertShortString(c.market),side:"BUY"===h?"1":"2",orderType:this.convertShortString(c.type),size:this.scaleNumber(c.size),price:p?"0":this.scaleNumber(c.price)},P=await this.prepareParadexDomain(),I=this.starknetEncodeStructuredData(P,{Order:[{name:"timestamp",type:"felt"},{name:"market",type:"felt"},{name:"side",type:"felt"},{name:"orderType",type:"felt"},{name:"size",type:"felt"},{name:"price",type:"felt"}]},T,O.address),M=this.starknetSign(I,O.privateKey);c.signature=M,c.signature_timestamp=T.timestamp;const x=await this.privatePostOrders(this.extend(c,a));return this.parseOrder(x,o)}async cancelOrder(e,t=void 0,i={}){await this.authenticateRest(),await this.loadMarkets();const s={},r=this.safeStringN(i,["clOrdID","clientOrderId","client_order_id"]);let a;return void 0!==r?(s.client_id=r,a=await this.privateDeleteOrdersByClientIdClientId(this.extend(s,i))):(s.order_id=e,a=await this.privateDeleteOrdersOrderId(this.extend(s,i))),this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.authenticateRest(),await this.loadMarkets();const i={market:this.market(e).id};return await this.privateDeleteOrders(this.extend(i,t))}async fetchOrder(e,t=void 0,i={}){await this.authenticateRest(),await this.loadMarkets();const s={},r=this.safeStringN(i,["clOrdID","clientOrderId","client_order_id"]);let a;return i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]),void 0!==r?(s.client_id=r,a=await this.privateGetOrdersByClientIdClientId(this.extend(s,i))):(s.order_id=e,a=await this.privateGetOrdersOrderId(this.extend(s,i))),this.parseOrder(a)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.authenticateRest(),await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),r)return await this.fetchPaginatedCallCursor("fetchOrders",e,t,i,s,"next","cursor",void 0,50);let a,o={};void 0!==e&&(a=this.market(e),o.market=a.id),void 0!==t&&(o.start_at=t),void 0!==i&&(o.page_size=i),[o,s]=this.handleUntilOption("end_at",o,s);const n=await this.privateGetOrdersHistory(this.extend(o,s)),d=this.safeList(n,"results",[]),h=this.safeString(n,"next"),c=d.length;if(void 0!==h&&c>0){const e=d[0];e.next=h,d[0]=e}return this.parseOrders(d,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.authenticateRest(),await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.market=a.id);const o=await this.privateGetOrders(this.extend(r,s)),n=this.safeList(o,"results",[]);return this.parseOrders(n,a,t,i)}async fetchBalance(e={}){await this.authenticateRest(),await this.loadMarkets();const t=await this.privateGetBalance(),i=this.safeList(t,"results",[]);return this.parseBalance(i)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=this.safeDict(e,i,{}),r=this.safeString(s,"token"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"size"),t[a]=o}return this.safeBalance(t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.authenticateRest(),await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallCursor("fetchMyTrades",e,t,i,s,"next","cursor",void 0,100);let a,o={};void 0!==e&&(a=this.market(e),o.market=a.id),void 0!==i&&(o.page_size=i),void 0!==t&&(o.start_at=t),[o,s]=this.handleUntilOption("end_at",o,s);const n=await this.privateGetFills(this.extend(o,s)),d=this.safeList(n,"results",[]);for(let e=0;e<d.length;e++)d[e].next=this.safeString(n,"next");return this.parseTrades(d,a,t,i)}async fetchPosition(e,t={}){await this.authenticateRest(),await this.loadMarkets();const i=this.market(e),s=await this.fetchPositions([i.symbol],t);return this.safeDict(s,0,{})}async fetchPositions(e=void 0,t={}){await this.authenticateRest(),await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.privateGetPositions(),s=this.safeList(i,"results",[]);return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"market"),r=(t=this.safeMarket(i,t)).symbol,a=this.safeStringLower(e,"side");let o=this.safeString(e,"size");"long"!==a&&(o=s.Y.stringMul("-1",o));const n=this.safeInteger(e,"time");return this.safePosition({info:e,id:this.safeString(e,"id"),symbol:r,entryPrice:this.safeString(e,"average_entry_price"),markPrice:void 0,notional:void 0,collateral:this.safeString(e,"cost"),unrealizedPnl:this.safeString(e,"unrealized_pnl"),side:a,contracts:this.parseNumber(o),contractSize:void 0,timestamp:n,datetime:this.iso8601(n),hedged:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,initialMargin:void 0,initialMarginPercentage:void 0,leverage:void 0,liquidationPrice:void 0,marginRatio:void 0,marginMode:void 0,percentage:void 0})}async fetchLiquidations(e,t=void 0,i=void 0,s={}){await this.authenticateRest();let r={};r.from=void 0!==t?t:1;const a=this.market(e);[r,s]=this.handleUntilOption("to",r,s);const o=await this.privateGetLiquidations(this.extend(r,s)),n=this.safeList(o,"results",[]);return this.parseLiquidations(n,a,t,i)}parseLiquidation(e,t=void 0){const i=this.safeInteger(e,"created_at");return this.safeLiquidation({info:e,symbol:void 0,contracts:void 0,contractSize:void 0,price:void 0,baseValue:void 0,quoteValue:void 0,timestamp:i,datetime:this.iso8601(i)})}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.authenticateRest(),await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchDeposits","paginate"),r)return await this.fetchPaginatedCallCursor("fetchDeposits",e,t,i,s,"next","cursor",void 0,100);let a={};void 0!==i&&(a.page_size=i),void 0!==t&&(a.start_at=t),[a,s]=this.handleUntilOption("end_at",a,s);const o=await this.privateGetTransfers(this.extend(a,s)),n=this.safeList(o,"results",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e];"DEPOSIT"===t.kind&&d.push(t)}return this.parseTransactions(d,void 0,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.authenticateRest(),await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchWithdrawals","paginate"),r)return await this.fetchPaginatedCallCursor("fetchWithdrawals",e,t,i,s,"next","cursor",void 0,100);let a={};void 0!==i&&(a.page_size=i),void 0!==t&&(a.start_at=t),[a,s]=this.handleUntilOption("end_at",a,s);const o=await this.privateGetTransfers(this.extend(a,s)),n=this.safeList(o,"results",[]),d=[];for(let e=0;e<n.length;e++){const t=n[e];"WITHDRAWAL"===t.kind&&d.push(t)}return this.parseTransactions(d,void 0,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"account"),r=this.safeString(e,"txn_hash"),a=this.safeString(e,"token"),o=this.safeCurrencyCode(a,t),n=this.safeInteger(e,"created_at"),d=this.safeInteger(e,"last_updated_at");let h=this.safeString(e,"kind");h="DEPOSIT"===h?"deposit":"withdrawal";const c=this.parseTransactionStatus(this.safeString(e,"status")),l=this.safeNumber(e,"amount");return{info:e,id:i,txid:r,timestamp:n,datetime:this.iso8601(n),network:void 0,address:s,addressTo:s,addressFrom:void 0,tag:void 0,tagTo:void 0,tagFrom:void 0,type:h,amount:l,currency:o,status:c,updated:d,internal:void 0,comment:void 0,fee:void 0}}parseTransactionStatus(e){return this.safeString({PENDING:"pending",AVAILABLE:"pending",COMPLETED:"ok",FAILED:"failed"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.implodeHostname(this.urls.api[this.version])+"/"+this.implodeParams(e,s);const n=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(n).length&&(o+="?"+this.urlencode(n));else if("private"===t)if(r={Accept:"application/json","PARADEX-PARTNER":this.safeString(this.options,"broker","CCXT")},"auth"===e)r["PARADEX-STARKNET-ACCOUNT"]=n.account,r["PARADEX-STARKNET-SIGNATURE"]=n.signature,r["PARADEX-TIMESTAMP"]=n.timestamp.toString(),r["PARADEX-SIGNATURE-EXPIRATION"]=n.expiration.toString();else if("onboarding"===e)r["PARADEX-ETHEREUM-ACCOUNT"]=this.walletAddress,r["PARADEX-STARKNET-ACCOUNT"]=n.account,r["PARADEX-STARKNET-SIGNATURE"]=n.signature,r["PARADEX-TIMESTAMP"]=this.nonce().toString(),r["Content-Type"]="application/json",a=this.json({public_key:n.public_key});else{const e=this.options.authToken;r.Authorization="Bearer "+e,"POST"===i?(r["Content-Type"]="application/json",a=this.json(n)):o=o+"?"+this.urlencode(n)}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,o,n,d,h){if(!n)return;const c=this.safeString(n,"error");if(void 0!==c){const e=this.id+" "+o;throw this.throwBroadlyMatchedException(this.exceptions.broad,o,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e),new a.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"paymium",name:"Paymium",countries:["FR","EU"],rateLimit:2e3,version:"v1",has:{CORS:!0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelOrder:!0,createDepositAddress:!0,createOrder:!0,fetchBalance:!0,fetchDepositAddress:!0,fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchOrderBook:!0,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,transfer:!0},urls:{logo:"https://user-images.githubusercontent.com/51840849/87153930-f0f02200-c2c0-11ea-9c0a-40337375ae89.jpg",api:{rest:"https://paymium.com/api"},www:"https://www.paymium.com",fees:"https://www.paymium.com/page/help/fees",doc:["https://github.com/Paymium/api-documentation","https://www.paymium.com/page/developers","https://paymium.github.io/api-documentation/"],referral:"https://www.paymium.com/page/sign-up?referral=eDAzPoRQFMvaAB8sf-qj"},api:{public:{get:["countries","currencies","data/{currency}/ticker","data/{currency}/trades","data/{currency}/depth","bitcoin_charts/{id}/trades","bitcoin_charts/{id}/depth"]},private:{get:["user","user/addresses","user/addresses/{address}","user/orders","user/orders/{uuid}","user/price_alerts","merchant/get_payment/{uuid}"],post:["user/addresses","user/orders","user/withdrawals","user/email_transfers","user/payment_requests","user/price_alerts","merchant/create_payment"],delete:["user/orders/{uuid}","user/orders/{uuid}/cancel","user/price_alerts/{id}"]}},markets:{"BTC/EUR":this.safeMarketStructure({id:"eur",symbol:"BTC/EUR",base:"BTC",quote:"EUR",baseId:"btc",quoteId:"eur",type:"spot",spot:!0})},fees:{trading:{maker:this.parseNumber("-0.001"),taker:this.parseNumber("0.005")}},precisionMode:o.kb,features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:void 0,fetchOpenOrders:void 0,fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}parseBalance(e){const t={info:e},i=Object.keys(this.currencies);for(let s=0;s<i.length;s++){const r=i[s],a=this.currency(r).id,o="balance_"+a;if(o in e){const i=this.account(),s="locked_"+a;i.free=this.safeString(e,o),i.used=this.safeString(e,s),t[r]=i}}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetUser(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={currency:s.id},a=await this.publicGetDataCurrencyDepth(this.extend(r,i));return this.parseOrderBook(a,s.symbol,void 0,"bids","asks","price","amount")}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeTimestamp(e,"at"),r=this.safeString(e,"vwap"),o=this.safeString(e,"volume"),n=a.Y.stringMul(o,r),d=this.safeString(e,"price");return this.safeTicker({symbol:i,timestamp:s,datetime:this.iso8601(s),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:r,open:this.safeString(e,"open"),close:d,last:d,previousClose:void 0,change:void 0,percentage:this.safeString(e,"variation"),average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={currency:i.id},r=await this.publicGetDataCurrencyTicker(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"created_at_int"),s=this.safeString(e,"uuid");t=this.safeMarket(void 0,t);const r=this.safeString(e,"side"),a=this.safeString(e,"price"),o="traded_"+t.base.toLowerCase(),n=this.safeString(e,o);return this.safeTrade({info:e,id:s,order:void 0,timestamp:i,datetime:this.iso8601(i),symbol:t.symbol,type:void 0,side:r,takerOrMaker:void 0,price:a,amount:n,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={currency:r.id},o=await this.publicGetDataCurrencyTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async createDepositAddress(e,t={}){await this.loadMarkets();const i=await this.privatePostUserAddresses(t);return this.parseDepositAddress(i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={address:e},s=await this.privateGetUserAddressesAddress(this.extend(i,t));return this.parseDepositAddress(s)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetUserAddresses(t);return this.parseDepositAddresses(i,e)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"currency");return{info:e,currency:this.safeCurrencyCode(s,t),network:void 0,address:i,tag:void 0}}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={type:this.capitalize(t)+"Order",currency:o.id,direction:i,amount:s};"market"!==t&&(n.price=r);const d=await this.privatePostUserOrders(this.extend(n,a));return this.safeOrder({info:d,id:d.uuid},o)}async cancelOrder(e,t=void 0,i={}){const s={uuid:e},r=await this.privateDeleteUserOrdersUuidCancel(this.extend(s,i));return this.safeOrder({info:r})}async transfer(e,t,i,s,a={}){await this.loadMarkets();const o=this.currency(e);if(s.indexOf("@")<0)throw new r.ExchangeError(this.id+" transfer() only allows transfers to an email address");if("BTC"!==e&&"EUR"!==e)throw new r.ExchangeError(this.id+" transfer() only allows BTC or EUR");const n={currency:o.id,amount:this.currencyToPrecision(e,t),email:s},d=await this.privatePostUserEmailTransfers(this.extend(n,a));return this.parseTransfer(d,o)}parseTransfer(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeString(e,"updated_at"),r=this.parseDate(s),a=this.safeValue(e,"account_operations"),o=this.safeValue(a,0,{}),n=this.safeString(e,"state");return{info:e,id:this.safeString(e,"uuid"),timestamp:r,datetime:this.iso8601(r),currency:this.safeCurrencyCode(i,t),amount:this.safeNumber(e,"amount"),fromAccount:void 0,toAccount:this.safeString(o,"address"),status:this.parseTransferStatus(n)}}parseTransferStatus(e){return this.safeString({executed:"ok"},e,e)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/"+this.version+"/"+this.implodeParams(e,s);const d=this.omit(s,this.extractParams(e));if("public"===t)Object.keys(d).length&&(o+="?"+this.urlencode(d));else{this.checkRequiredCredentials();const e=this.nonce().toString();let t=e+o;if(r={"Api-Key":this.apiKey,"Api-Nonce":e},"POST"===i)Object.keys(d).length&&(t+=a=this.json(d),r["Content-Type"]="application/json");else if(Object.keys(d).length){const e=this.urlencode(d);t+=e,o+="?"+e}r["Api-Signature"]=this.hmac(this.encode(t),this.encode(this.secret),n.s)}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(void 0!==this.safeValue(n,"errors"))throw new r.ExchangeError(this.id+" "+this.json(n))}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"phemex",name:"Phemex",countries:["CN"],rateLimit:120.5,version:"v1",certified:!1,pro:!0,hostname:"api.phemex.com",has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,closePosition:!1,createConvertTrade:!0,createOrder:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchConvertQuote:!0,fetchConvertTrade:!1,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistories:!1,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!0,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransfers:!0,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!0,setLeverage:!0,setMargin:!0,setMarginMode:!0,setPositionMode:!0,transfer:!0,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/85225056-221eb600-b3d7-11ea-930d-564d2690e3f6.jpg",test:{v1:"https://testnet-api.phemex.com/v1",v2:"https://testnet-api.phemex.com",public:"https://testnet-api.phemex.com/exchange/public",private:"https://testnet-api.phemex.com"},api:{v1:"https://{hostname}/v1",v2:"https://{hostname}",public:"https://{hostname}/exchange/public",private:"https://{hostname}"},www:"https://phemex.com",doc:"https://phemex-docs.github.io/#overview",fees:"https://phemex.com/fees-conditions",referral:{url:"https://phemex.com/register?referralCode=EDNVJ",discount:.1}},timeframes:{"1m":"60","3m":"180","5m":"300","15m":"900","30m":"1800","1h":"3600","2h":"7200","3h":"10800","4h":"14400","6h":"21600","12h":"43200","1d":"86400","1w":"604800","1M":"2592000","3M":"7776000","1Y":"31104000"},api:{public:{get:{"cfg/v2/products":5,"cfg/fundingRates":5,products:5,"nomics/trades":5,"md/kline":5,"md/v2/kline/list":5,"md/v2/kline":5,"md/v2/kline/last":5,"md/orderbook":5,"md/trade":5,"md/spot/ticker/24hr":5,"exchange/public/cfg/chain-settings":5}},v1:{get:{"md/fullbook":5,"md/orderbook":5,"md/trade":5,"md/ticker/24hr":5,"md/ticker/24hr/all":5,"md/spot/ticker/24hr":5,"md/spot/ticker/24hr/all":5,"exchange/public/products":5,"api-data/public/data/funding-rate-history":5}},v2:{get:{"public/products":5,"public/products-plus":5,"md/v2/orderbook":5,"md/v2/trade":5,"md/v2/ticker/24hr":5,"md/v2/ticker/24hr/all":5,"api-data/public/data/funding-rate-history":5}},private:{get:{"spot/orders/active":1,"spot/orders":1,"spot/wallets":5,"exchange/spot/order":5,"exchange/spot/order/trades":5,"exchange/order/v2/orderList":5,"exchange/order/v2/tradingList":5,"accounts/accountPositions":1,"g-accounts/accountPositions":1,"accounts/positions":25,"api-data/futures/funding-fees":5,"api-data/g-futures/funding-fees":5,"api-data/futures/orders":5,"api-data/g-futures/orders":5,"api-data/futures/orders/by-order-id":5,"api-data/g-futures/orders/by-order-id":5,"api-data/futures/trades":5,"api-data/g-futures/trades":5,"api-data/futures/trading-fees":5,"api-data/g-futures/trading-fees":5,"api-data/futures/v2/tradeAccountDetail":5,"g-orders/activeList":1,"orders/activeList":1,"exchange/order/list":5,"exchange/order":5,"exchange/order/trade":5,"phemex-user/users/children":5,"phemex-user/wallets/v2/depositAddress":5,"phemex-user/wallets/tradeAccountDetail":5,"phemex-deposit/wallets/api/depositAddress":5,"phemex-deposit/wallets/api/depositHist":5,"phemex-deposit/wallets/api/chainCfg":5,"phemex-withdraw/wallets/api/withdrawHist":5,"phemex-withdraw/wallets/api/asset/info":5,"phemex-user/order/closedPositionList":5,"exchange/margins/transfer":5,"exchange/wallets/confirm/withdraw":5,"exchange/wallets/withdrawList":5,"exchange/wallets/depositList":5,"exchange/wallets/v2/depositAddress":5,"api-data/spots/funds":5,"api-data/spots/orders":5,"api-data/spots/orders/by-order-id":5,"api-data/spots/pnls":5,"api-data/spots/trades":5,"api-data/spots/trades/by-order-id":5,"assets/convert":5,"assets/transfer":5,"assets/spots/sub-accounts/transfer":5,"assets/futures/sub-accounts/transfer":5,"assets/quote":5},post:{"spot/orders":1,orders:1,"g-orders":1,"positions/assign":5,"exchange/wallets/transferOut":5,"exchange/wallets/transferIn":5,"exchange/margins":5,"exchange/wallets/createWithdraw":5,"exchange/wallets/cancelWithdraw":5,"exchange/wallets/createWithdrawAddress":5,"assets/transfer":5,"assets/spots/sub-accounts/transfer":5,"assets/futures/sub-accounts/transfer":5,"assets/universal-transfer":5,"assets/convert":5,"phemex-withdraw/wallets/api/createWithdraw":5,"phemex-withdraw/wallets/api/cancelWithdraw":5},put:{"spot/orders/create":1,"spot/orders":1,"orders/replace":1,"g-orders/replace":1,"positions/leverage":5,"g-positions/leverage":5,"g-positions/switch-pos-mode-sync":5,"positions/riskLimit":5},delete:{"spot/orders":2,"spot/orders/all":2,"orders/cancel":1,orders:1,"orders/all":3,"g-orders/cancel":1,"g-orders":1,"g-orders/all":3}}},precisionMode:o.kb,fees:{trading:{tierBased:!1,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0.001")}},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{mark:!0,last:!0,index:!0},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:200,daysBack:1e5,untilDays:2,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:void 0,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:200,daysBack:1e5,daysBackCanceled:1e5,untilDays:2,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{triggerDirection:!0,attachedStopLossTakeProfit:{triggerPriceType:{mark:!0,last:!0,index:!0},price:!0},hedged:!0},fetchOHLCV:{limit:2e3}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:void 0,inverse:void 0}},requiredCredentials:{apiKey:!0,secret:!0},exceptions:{exact:{401:r.AuthenticationError,412:r.BadRequest,6001:r.BadRequest,19999:r.BadRequest,10001:r.DuplicateOrderId,10002:r.OrderNotFound,10003:r.CancelPending,10004:r.CancelPending,10005:r.CancelPending,11001:r.InsufficientFunds,11002:r.InvalidOrder,11003:r.InsufficientFunds,11004:r.InvalidOrder,11005:r.InsufficientFunds,11006:r.ExchangeError,11007:r.ExchangeError,11008:r.ExchangeError,11009:r.ExchangeError,11010:r.InsufficientFunds,11011:r.InvalidOrder,11012:r.InvalidOrder,11013:r.InvalidOrder,11014:r.InvalidOrder,11015:r.InvalidOrder,11016:r.BadRequest,11017:r.ExchangeError,11018:r.ExchangeError,11019:r.ExchangeError,11020:r.ExchangeError,11021:r.ExchangeError,11022:r.AccountSuspended,11023:r.ExchangeError,11024:r.ExchangeError,11025:r.BadRequest,11026:r.ExchangeError,11027:r.BadSymbol,11028:r.BadSymbol,11029:r.ExchangeError,11030:r.ExchangeError,11031:r.DDoSProtection,11032:r.DDoSProtection,11033:r.DuplicateOrderId,11034:r.InvalidOrder,11035:r.InvalidOrder,11036:r.InvalidOrder,11037:r.InvalidOrder,11038:r.InvalidOrder,11039:r.InvalidOrder,11040:r.InvalidOrder,11041:r.InvalidOrder,11042:r.InvalidOrder,11043:r.InvalidOrder,11044:r.InvalidOrder,11045:r.InvalidOrder,11046:r.InvalidOrder,11047:r.InvalidOrder,11048:r.InvalidOrder,11049:r.InvalidOrder,11050:r.InvalidOrder,11051:r.InvalidOrder,11052:r.InvalidOrder,11053:r.InvalidOrder,11054:r.InvalidOrder,11055:r.InvalidOrder,11056:r.InvalidOrder,11057:r.InvalidOrder,11058:r.InvalidOrder,11059:r.InvalidOrder,11060:r.InvalidOrder,11061:r.CancelPending,11062:r.InvalidOrder,11063:r.InvalidOrder,11064:r.InvalidOrder,11065:r.InvalidOrder,11066:r.InvalidOrder,11067:r.InvalidOrder,11068:r.InvalidOrder,11069:r.ExchangeError,11070:r.BadSymbol,11071:r.InvalidOrder,11072:r.InvalidOrder,11073:r.InvalidOrder,11074:r.InvalidOrder,11075:r.InvalidOrder,11076:r.InvalidOrder,11077:r.InvalidOrder,11078:r.InvalidOrder,11079:r.InvalidOrder,11080:r.InvalidOrder,11081:r.InvalidOrder,11082:r.InsufficientFunds,11083:r.InvalidOrder,11084:r.InvalidOrder,11085:r.DuplicateOrderId,11086:r.InvalidOrder,11087:r.InvalidOrder,11088:r.InvalidOrder,11089:r.InvalidOrder,11090:r.InvalidOrder,11091:r.InvalidOrder,11092:r.InvalidOrder,11093:r.InvalidOrder,11094:r.InvalidOrder,11095:r.InvalidOrder,11096:r.InvalidOrder,11097:r.BadRequest,11098:r.BadRequest,11099:r.ExchangeError,11100:r.InsufficientFunds,11101:r.InsufficientFunds,11102:r.BadRequest,11103:r.BadRequest,11104:r.BadRequest,11105:r.InsufficientFunds,11106:r.InsufficientFunds,11107:r.ExchangeError,11108:r.InvalidOrder,11109:r.InvalidOrder,11110:r.InvalidOrder,11111:r.InvalidOrder,11112:r.InvalidOrder,11113:r.BadRequest,11114:r.InvalidOrder,11115:r.InvalidOrder,11116:r.InvalidOrder,11117:r.InvalidOrder,11118:r.InvalidOrder,11119:r.InvalidOrder,11120:r.InvalidOrder,11121:r.InvalidOrder,11122:r.InvalidOrder,11123:r.InvalidOrder,11124:r.InvalidOrder,11125:r.InvalidOrder,11126:r.InvalidOrder,11128:r.InvalidOrder,11129:r.InvalidOrder,11130:r.InvalidOrder,11131:r.InvalidOrder,11132:r.InvalidOrder,11133:r.InvalidOrder,11134:r.InvalidOrder,3e4:r.BadRequest,30018:r.BadRequest,34003:r.PermissionDenied,35104:r.InsufficientFunds,39995:r.RateLimitExceeded,39996:r.PermissionDenied,39997:r.BadSymbol},broad:{"401 Insufficient privilege":r.PermissionDenied,"401 Request IP mismatch":r.PermissionDenied,"Failed to find api-key":r.AuthenticationError,"Missing required parameter":r.BadRequest,"API Signature verification failed":r.AuthenticationError,"Api key not found":r.AuthenticationError}},options:{brokerId:"CCXT123456","x-phemex-request-expiry":60,createOrderByQuoteRequiresPrice:!0,networks:{TRC20:"TRX",ERC20:"ETH",BEP20:"BNB"},defaultNetworks:{USDT:"ETH"},defaultSubType:"linear",accountsByType:{spot:"spot",swap:"future"},stableCoins:["BUSD","FEI","TUSD","USD","USDC","USDD","USDP","USDT"],transfer:{fillResponseFromRequest:!0},triggerPriceTypesMap:{last:"ByLastPrice",mark:"ByMarkPrice",index:"ByIndexPrice",ask:"ByAskPrice",bid:"ByBidPrice"}}})}parseSafeNumber(e=void 0){if(void 0===e)return e;let t=e.split(",");return e=t.join(""),t=e.split(" "),this.safeNumber(t,0)}parseSwapMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"contractUnderlyingAssets"),s=this.safeString(e,"baseCurrency",i),r=this.safeString(e,"quoteCurrency"),a=this.safeString(e,"settleCurrency");let o=this.safeCurrencyCode(s);o=o.replace(" ","");const n=this.safeCurrencyCode(r),d=this.safeCurrencyCode(a);let h=!1;a!==r&&(h=!0,"baseCurrency"in e||o!==n||(o=d));const c=this.safeInteger(e,"priceScale"),l=this.safeInteger(e,"ratioScale"),u=this.safeInteger(e,"valueScale"),f=this.safeString(e,"minPriceEp"),p=this.safeString(e,"maxPriceEp"),m=this.safeString(e,"makerFeeRateEr"),g=this.safeString(e,"takerFeeRateEr"),v=this.safeString(e,"status"),y=this.safeString(e,"contractSize"," ");let w;if("USDT"===d)w=this.parseNumber("1");else if(y.indexOf(" ")){const e=y.split(" ");w=this.parseNumber(e[0])}else w=this.parseNumber(y);return this.safeMarketStructure({id:t,symbol:o+"/"+n+":"+d,base:o,quote:n,settle:d,baseId:s,quoteId:r,settleId:a,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:"Listed"===v,contract:!0,linear:!h,inverse:h,taker:this.parseNumber(this.fromEn(g,l)),maker:this.parseNumber(this.fromEn(m,l)),contractSize:w,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,priceScale:c,valueScale:u,ratioScale:l,precision:{amount:this.safeNumber2(e,"lotSize","qtyStepSize"),price:this.safeNumber(e,"tickSize")},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(e,"maxLeverage")},amount:{min:void 0,max:void 0},price:{min:this.parseNumber(this.fromEn(f,c)),max:this.parseNumber(this.fromEn(p,c))},cost:{min:void 0,max:this.parseNumber(this.safeString(e,"maxOrderQty"))}},created:void 0,info:e})}parseSpotMarket(e){const t=this.safeStringLower(e,"type"),i=this.safeString(e,"symbol"),s=this.safeString(e,"quoteCurrency"),r=this.safeString(e,"baseCurrency"),a=this.safeCurrencyCode(r),o=this.safeCurrencyCode(s),n=this.safeString(e,"status"),d=this.parseSafeNumber(this.safeString(e,"baseTickSize")),h=this.parseSafeNumber(this.safeString(e,"quoteTickSize"));return this.safeMarketStructure({id:i,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:r,quoteId:s,settleId:void 0,type:t,spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"Listed"===n,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(e,"defaultTakerFee"),maker:this.safeNumber(e,"defaultMakerFee"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,priceScale:this.safeInteger(e,"priceScale"),valueScale:this.safeInteger(e,"valueScale"),ratioScale:this.safeInteger(e,"ratioScale"),precision:{amount:d,price:h},limits:{leverage:{min:void 0,max:void 0},amount:{min:d,max:this.parseSafeNumber(this.safeString(e,"maxBaseOrderSize"))},price:{min:h,max:void 0},cost:{min:this.parseSafeNumber(this.safeString(e,"minOrderValue")),max:this.parseSafeNumber(this.safeString(e,"maxOrderValue"))}},created:this.safeInteger(e,"listTime"),info:e})}async fetchMarkets(e={}){const t=this.v2GetPublicProducts(e),i=this.v1GetExchangePublicProducts(e),[s,r]=await Promise.all([t,i]),a=this.safeValue(r,"data",[]),o=this.safeDict(s,"data",{});let n=this.safeList(o,"products",[]);const d=this.safeList(o,"perpProductsV2",[]);n=this.arrayConcat(n,d);let h=this.safeList(o,"riskLimits",[]);const c=this.safeList(o,"riskLimitsV2",[]);h=this.arrayConcat(h,c);const l=this.safeList(o,"currencies",[]),u=this.indexBy(h,"symbol"),f=this.indexBy(a,"symbol"),p=this.indexBy(l,"currency"),m=[];for(let e=0;e<n.length;e++){let t=n[e];const i=this.safeStringLower(t,"type");if("perpetual"===i||"perpetualv2"===i||"perpetualpilot"===i){const e=this.safeString(t,"symbol"),i=this.safeDict(u,e,{});t=this.extend(t,i);const s=this.safeDict(f,e,{});t=this.extend(t,s),t=this.parseSwapMarket(t)}else{const e=this.safeString(t,"baseCurrency"),i=this.safeDict(p,e,{}),s=this.safeString(i,"valueScale","8");t=this.extend(t,{valueScale:s}),t=this.parseSpotMarket(t)}m.push(t)}return m}async fetchCurrencies(e={}){const t=await this.v2GetPublicProducts(e),i=this.safeValue(t,"data",{}),s=this.safeValue(i,"currencies",[]),r={};for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"currency"),o=this.safeString(t,"name"),n=this.safeCurrencyCode(i),d=this.safeString(t,"status"),h=this.safeString(t,"valueScale"),c=parseInt(h),l=this.safeString(t,"minValueEv"),u=this.safeString(t,"maxValueEv");let f,p,m;if(void 0!==c){const e=this.parsePrecision(h);m=this.parseNumber(e),f=this.parseNumber(a.Y.stringMul(l,e)),p=this.parseNumber(a.Y.stringMul(u,e))}r[n]={id:i,info:t,code:n,name:o,active:"Listed"===d,deposit:void 0,withdraw:void 0,fee:void 0,precision:m,limits:{amount:{min:f,max:p},withdraw:{min:void 0,max:void 0}},valueScale:c,networks:{}}}return r}customParseBidAsk(e,t=0,i=1,s=void 0){if(void 0===s)throw new r.ArgumentsRequired(this.id+" customParseBidAsk() requires a market argument");let a=this.safeString(e,i);return s.spot&&(a=this.fromEv(a,s)),[this.parseNumber(this.fromEp(this.safeString(e,t),s)),this.parseNumber(a)]}customParseOrderBook(e,t,i=void 0,s="bids",r="asks",a=0,o=1,n=void 0){const d={symbol:t,timestamp:i,datetime:this.iso8601(i),nonce:void 0},h=[s,r];for(let t=0;t<h.length;t++){const i=h[t],s=[],r=this.safeValue(e,i);for(let e=0;e<r.length;e++)s.push(this.customParseBidAsk(r[e],a,o,n));d[i]=s}return d[s]=this.sortBy(d[s],0,!0),d[r]=this.sortBy(d[r],0),d}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let a;a=s.linear&&"USDT"===s.settle?await this.v2GetMdV2Orderbook(this.extend(r,i)):void 0!==t&&t<=30?await this.v1GetMdOrderbook(this.extend(r,i)):await this.v1GetMdFullbook(this.extend(r,i));const o=this.safeValue(a,"result",{}),n=this.safeValue2(o,"book","orderbook_p",{}),d=this.safeIntegerProduct(o,"timestamp",1e-6),h=this.customParseOrderBook(n,e,d,"bids","asks",0,1,s);return h.nonce=this.safeInteger(o,"sequence"),h}toEn(e,t){const i=this.numberToString(e),s=new a.Y(i);s.decimals=s.decimals-t,s.reduce();const r=s.toString();return this.parseToNumeric(r)}toEv(e,t=void 0){return void 0===e||void 0===t?e:this.toEn(e,t.valueScale)}toEp(e,t=void 0){return void 0===e||void 0===t?e:this.toEn(e,t.priceScale)}fromEn(e,t){if(void 0===e||void 0===t)return;const i=new a.Y(e);return i.decimals=this.sum(i.decimals,t),i.reduce(),i.toString()}fromEp(e,t=void 0){return void 0===e||void 0===t?e:this.fromEn(e,this.safeInteger(t,"priceScale"))}fromEv(e,t=void 0){return void 0===e||void 0===t?e:this.fromEn(e,this.safeInteger(t,"valueScale"))}fromEr(e,t=void 0){return void 0===e||void 0===t?e:this.fromEn(e,this.safeInteger(t,"ratioScale"))}parseOHLCV(e,t=void 0){let i;return i=void 0!==t&&t.spot?this.parseNumber(this.fromEv(this.safeString(e,7),t)):this.safeNumber(e,7),[this.safeTimestamp(e,0),this.parseNumber(this.fromEp(this.safeString(e,3),t)),this.parseNumber(this.fromEp(this.safeString(e,4),t)),this.parseNumber(this.fromEp(this.safeString(e,5),t)),this.parseNumber(this.fromEp(this.safeString(e,6),t)),i]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=s,n={symbol:a.id,resolution:this.safeString(this.timeframes,t,t)},d=this.safeInteger2(r,"until","to");r=this.omit(r,["until"]);let h,c=1e3;if((a.linear||"USDT"===a.settle)&&(void 0!==i||void 0!==d)&&(c=2e3),void 0===s&&(s=c),n.limit=Math.min(s,c),a.linear||"USDT"===a.settle)if(void 0!==d||void 0!==i){const e=this.parseTimeframe(t);if(void 0!==i?(i=Math.round(i/1e3),n.from=i):i=d/100-c*e,void 0!==d)n.to=Math.round(d/1e3);else{let t=i+c*e;const s=this.seconds();t>s&&(t=s),n.to=t}h=await this.publicGetMdV2KlineList(this.extend(n,r))}else h=await this.publicGetMdV2KlineLast(this.extend(n,r));else{if(void 0!==i){const e=1e3*this.parseTimeframe(t),r=this.milliseconds()-i;s=this.parseToInt(r/e)}h=await this.publicGetMdV2Kline(this.extend(n,r))}const l=this.safeValue(h,"data",{}),u=this.safeList(l,"rows",[]);return this.parseOHLCVs(u,a,t,i,o)}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeIntegerProduct(e,"timestamp",1e-6),a=this.fromEp(this.safeString2(e,"lastEp","closeRp"),t),o=this.fromEr(this.safeString2(e,"turnoverEv","turnoverRv"),t);let n=this.safeString(e,"volume");void 0===n&&(n=this.fromEv(this.safeString2(e,"volumeEv","volumeRq"),t));const d=this.fromEp(this.safeString(e,"openEp"),t);return this.safeTicker({symbol:s,timestamp:r,datetime:this.iso8601(r),high:this.fromEp(this.safeString2(e,"highEp","highRp"),t),low:this.fromEp(this.safeString2(e,"lowEp","lowRp"),t),bid:this.fromEp(this.safeString(e,"bidEp"),t),bidVolume:void 0,ask:this.fromEp(this.safeString(e,"askEp"),t),askVolume:void 0,vwap:void 0,open:d,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:n,quoteVolume:o,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.swap?i.inverse||"USD"===i.settle?await this.v1GetMdTicker24hr(this.extend(s,t)):await this.v2GetMdV2Ticker24hr(this.extend(s,t)):await this.v1GetMdSpotTicker24hr(this.extend(s,t));const a=this.safeDict(r,"result",{});return this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){let i,s,r;if(await this.loadMarkets(),void 0!==e){const t=this.safeValue(e,0);i=this.market(t)}[s,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),[r,t]=this.handleSubTypeAndParams("fetchTickers",i,t);const a=this.omit(t,"type");let o;o="spot"===s?await this.v1GetMdSpotTicker24hrAll(a):"inverse"===r||"USD"===this.safeString(i,"settle")?await this.v1GetMdTicker24hrAll(a):await this.v2GetMdV2Ticker24hrAll(a);const n=this.safeList(o,"result",[]);return this.parseTickers(n,e)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};let o;o=r.linear&&"USDT"===r.settle?await this.v2GetMdV2Trade(this.extend(a,s)):await this.v1GetMdTrade(this.extend(a,s));const n=this.safeValue(o,"result",{}),d=this.safeValue2(n,"trades","trades_p",[]);return this.parseTrades(d,r,t,i)}parseTrade(e,t=void 0){let i,s,r,a,o,n,d,h,c,l,u;const f=this.safeString(e,"symbol"),p=(t=this.safeMarket(f,t)).symbol;let m,g;if(Array.isArray(e)){const n=e.length;r=this.safeIntegerProduct(e,0,1e-6),n>4&&(a=this.safeString(e,n-4)),o=this.safeStringLower(e,n-3),i=this.safeString(e,n-2),s=this.safeString(e,n-1),"number"==typeof e[n-2]&&(i=this.fromEp(i,t),s=this.fromEv(s,t))}else{if(r=this.safeIntegerProduct(e,"transactTimeNs",1e-6),void 0===r&&(r=this.safeInteger(e,"createdAt")),a=this.safeString2(e,"execId","execID"),m=this.safeString(e,"orderID"),"USDT"===t.settle){const t=this.safeStringLower(e,"side");"buy"===t||"sell"===t?o=t:void 0!==t&&(o="1"===t?"buy":"sell");const r=this.safeString(e,"ordType");if("1"===r?d="market":"2"===r&&(d="limit"),i=this.safeString(e,"execPriceRp"),s=this.safeString(e,"execQtyRq"),n=this.safeString(e,"execValueRv"),c=this.omitZero(this.safeString(e,"execFeeRv")),l=this.safeString(e,"feeRateRr"),void 0!==c){const t=this.safeString(e,"currency");u=this.safeCurrencyCode(t)}else{const t=this.omitZero(this.safeString(e,"ptFeeRv"));void 0!==t&&(c=t,u="PT")}}else{o=this.safeStringLower(e,"side"),d=this.parseOrderType(this.safeString(e,"ordType"));if("MakerFill"===this.safeString(e,"execStatus")&&(g="maker"),i=this.fromEp(this.safeString(e,"execPriceEp"),t),s=this.fromEv(this.safeString(e,"execBaseQtyEv"),t),s=this.safeString(e,"execQty",s),n=this.fromEr(this.safeString2(e,"execQuoteQtyEv","execValueEv"),t),c=this.fromEr(this.omitZero(this.safeString(e,"execFeeEv")),t),void 0!==c)if(l=this.fromEr(this.safeString(e,"feeRateEr"),t),t.spot)u=this.safeCurrencyCode(this.safeString(e,"feeCurrency"));else{const e=this.safeValue(t,"info");if(void 0!==e){const t=this.safeString(e,"settlementCurrency");u=this.safeCurrencyCode(t)}}else c=this.safeString(e,"ptFeeRv"),void 0!==c&&(u="PT")}h={cost:c,rate:l,currency:u}}return this.safeTrade({info:e,id:a,symbol:p,timestamp:r,datetime:this.iso8601(r),order:m,type:d,side:o,takerOrMaker:g,price:i,amount:s,cost:n,fee:h},t)}parseSpotBalance(e){let t;const i={info:e},s=this.safeValue(e,"data",[]);for(let e=0;e<s.length;e++){const r=s[e],o=this.safeString(r,"currency"),n=this.safeCurrencyCode(o),d=this.safeValue(this.currencies,n,{}),h=this.safeInteger(d,"valueScale",8),c=this.account(),l=this.safeString(r,"balanceEv"),u=this.safeString(r,"lockedTradingBalanceEv"),f=this.safeString(r,"lockedWithdrawEv"),p=this.fromEn(l,h),m=this.fromEn(u,h),g=this.fromEn(f,h),v=a.Y.stringAdd(m,g),y=this.safeIntegerProduct(r,"lastUpdateTimeNs",1e-6);t=void 0===t?y:Math.max(t,y),c.total=p,c.used=v,i[n]=c}return i.timestamp=t,i.datetime=this.iso8601(t),this.safeBalance(i)}parseSwapBalance(e){const t={info:e},i=this.safeValue(e,"data",{}),s=this.safeValue(i,"account",{}),r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.currency(a),n=this.safeInteger(o,"valueScale",8),d=this.account(),h=this.safeString2(s,"accountBalanceEv","accountBalanceRv"),c=this.safeString2(s,"totalUsedBalanceEv","totalUsedBalanceRv"),l="USDT"!==a;return d.total=l?this.fromEn(h,n):h,d.used=l?this.fromEn(c,n):c,t[a]=d,this.safeBalance(t)}async fetchBalance(e={}){let t;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e);const i=this.safeString(e,"code");let s;e=this.omit(e,["code"]);const a={};if("spot"!==t&&"swap"!==t)throw new r.BadRequest(this.id+" does not support "+t+" markets, only spot and swap");if("swap"===t){let o;if([o,e]=this.handleOptionAndParams(e,"fetchBalance","settle","USDT"),void 0!==i||void 0!==o){let t;t=void 0!==i?i:o;const r=this.currency(t);a.currency=r.id,s="USDT"===r.id?await this.privateGetGAccountsAccountPositions(this.extend(a,e)):await this.privateGetAccountsAccountPositions(this.extend(a,e))}else{if(void 0===this.safeString(e,"currency"))throw new r.ArgumentsRequired(this.id+" fetchBalance() requires a code parameter or a currency or settle parameter for "+t+" type");s=await this.privateGetSpotWallets(this.extend(a,e))}}else s=await this.privateGetSpotWallets(this.extend(a,e));return"swap"===t?this.parseSwapBalance(s):this.parseSpotBalance(s)}parseOrderStatus(e){return this.safeString({Created:"open",Untriggered:"open",Deactivated:"closed",Triggered:"open",Rejected:"rejected",New:"open",PartiallyFilled:"open",Filled:"closed",Canceled:"canceled",Suspended:"canceled",1:"open",2:"canceled",3:"closed",4:"canceled",5:"open",6:"open",7:"closed",8:"canceled"},e,e)}parseOrderType(e){return this.safeString({1:"market",2:"limit",3:"stop",4:"stopLimit",5:"market",6:"limit",7:"market",8:"market",9:"stopLimit",10:"market",Limit:"limit",Market:"market"},e,e)}parseTimeInForce(e){return this.safeString({GoodTillCancel:"GTC",PostOnly:"PO",ImmediateOrCancel:"IOC",FillOrKill:"FOK"},e,e)}parseSpotOrder(e,t=void 0){const i=this.safeString(e,"orderID");let s=this.safeString(e,"clOrdID");void 0!==s&&s.length<1&&(s=void 0);const r=this.safeString(e,"symbol"),a=(t=this.safeMarket(r,t)).symbol,o=this.fromEp(this.safeString(e,"priceEp"),t),n=this.fromEv(this.safeString(e,"baseQtyEv"),t),d=this.omitZero(this.fromEv(this.safeString(e,"leavesBaseQtyEv"),t)),h=this.fromEv(this.safeString2(e,"cumBaseQtyEv","cumBaseValueEv"),t),c=this.fromEr(this.safeString2(e,"cumQuoteValueEv","quoteQtyEv"),t),l=this.fromEp(this.safeString(e,"avgPriceEp"),t),u=this.parseOrderStatus(this.safeString(e,"ordStatus")),f=this.safeStringLower(e,"side"),p=this.parseOrderType(this.safeString(e,"ordType")),m=this.safeIntegerProduct2(e,"actionTimeNs","createTimeNs",1e-6);let g;const v=this.fromEv(this.safeString(e,"cumFeeEv"),t);void 0!==v&&(g={cost:v,currency:this.safeCurrencyCode(this.safeString(e,"feeCurrency"))});const y=this.parseTimeInForce(this.safeString(e,"timeInForce")),w=this.parseNumber(this.omitZero(this.fromEp(this.safeString(e,"stopPxEp")))),b="PO"===y;return this.safeOrder({info:e,id:i,clientOrderId:s,timestamp:m,datetime:this.iso8601(m),lastTradeTimestamp:void 0,symbol:a,type:p,timeInForce:y,postOnly:b,side:f,price:o,triggerPrice:w,amount:n,cost:c,average:l,filled:h,remaining:d,status:u,fee:g,trades:void 0},t)}parseOrderSide(e){return this.safeString({1:"buy",2:"sell"},e,e)}parseSwapOrder(e,t=void 0){const i=this.safeString2(e,"orderID","orderId");let s=this.safeString2(e,"clOrdID","clOrdId");void 0!==s&&s.length<1&&(s=void 0);const r=this.safeString(e,"symbol"),a=this.safeSymbol(r,t);t=this.safeMarket(r,t);const o=this.parseOrderStatus(this.safeString(e,"ordStatus")),n=this.parseOrderSide(this.safeStringLower(e,"side")),d=this.parseOrderType(this.safeString(e,"orderType"));let h=this.safeString(e,"priceRp");void 0===h&&(h=this.fromEp(this.safeString(e,"priceEp"),t));const c=this.safeNumber2(e,"orderQty","orderQtyRq"),l=this.safeNumber2(e,"cumQty","cumQtyRq"),u=this.safeNumber2(e,"leavesQty","leavesQtyRq");let f=this.safeIntegerProduct(e,"actionTimeNs",1e-6);void 0===f&&(f=this.safeInteger(e,"createdAt"));const p=this.safeNumber2(e,"cumValue","cumValueRv");let m=this.safeIntegerProduct(e,"transactTimeNs",1e-6);0===m&&(m=void 0);const g=this.parseTimeInForce(this.safeString(e,"timeInForce")),v=this.omitZero(this.safeString2(e,"stopPx","stopPxRp")),y="PO"===g;let w=this.safeValue(e,"reduceOnly");"ReduceOnly"===this.safeString(e,"execInst")&&(w=!0);const b=this.safeString(e,"takeProfitRp"),k=this.safeString(e,"stopLossRp"),S=this.omitZero(this.safeString(e,"execFeeRv")),O=this.omitZero(this.safeString(e,"ptFeeRv"));let T;return void 0!==S?T={cost:S,currency:t.quote}:void 0!==O&&(T={cost:O,currency:"PT"}),this.safeOrder({info:e,id:i,clientOrderId:s,datetime:this.iso8601(f),timestamp:f,lastTradeTimestamp:m,symbol:a,type:d,timeInForce:g,postOnly:y,reduceOnly:w,side:n,price:h,triggerPrice:v,takeProfitPrice:b,stopLossPrice:k,amount:c,filled:l,remaining:u,cost:p,average:void 0,status:o,fee:T,trades:void 0})}parseOrder(e,t=void 0){return this.safeBool(t,"swap",!1)||("closedPnl"in e||"closedPnlRv"in e||"totalPnlRv"in e)?this.parseSwapOrder(e,t):this.parseSpotOrder(e,t)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e),h=this.capitalize(i);t=this.capitalize(t);const c={symbol:d.id,side:h,ordType:t},l=this.safeString2(n,"clOrdID","clientOrderId"),u=this.safeValue(n,"stopLoss"),f=void 0!==u,p=this.safeValue(n,"takeProfit"),m=void 0!==p;if(void 0===l){const e=this.safeString(this.options,"brokerId","CCXT123456");void 0!==e&&(c.clOrdID=e+this.uuid16())}else c.clOrdID=l,n=this.omit(n,["clOrdID","clientOrderId"]);const g=this.safeStringN(n,["stopPx","stopPrice","triggerPrice"]);if(void 0!==g&&("USDT"===d.settle?c.stopPxRp=this.priceToPrecision(e,g):c.stopPxEp=this.toEp(g,d)),n=this.omit(n,["stopPx","stopPrice","stopLoss","takeProfit","triggerPrice"]),d.spot){let e=this.safeValue(n,"qtyType","ByBase");if("Market"!==t&&"Stop"!==t&&"MarketIfTouched"!==t||void 0!==o&&(e="ByQuote"),void 0!==g&&("Limit"===t?c.ordType="StopLimit":"Market"===t&&(c.ordType="Stop"),c.trigger="ByLastPrice"),c.qtyType=e,"ByQuote"===e){let t=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),this.options.createOrderByQuoteRequiresPrice)if(void 0!==o){const e=this.numberToString(s),i=this.numberToString(o),r=a.Y.stringMul(e,i);t=this.parseNumber(r)}else if(void 0===t)throw new r.ArgumentsRequired(this.id+" createOrder() "+e+" requires a price argument or a cost parameter");t=void 0===t?s:t;const i=this.numberToString(t);c.quoteQtyEv=this.toEv(i,d)}else{const e=this.numberToString(s);c.baseQtyEv=this.toEv(e,d)}}else if(d.swap){const a=this.safeBool(n,"hedged",!1);n=this.omit(n,"hedged");let o=this.safeStringLower(n,"posSide");if(void 0===o)if(a){this.safeBool(n,"reduceOnly")&&(i="buy"===i?"sell":"buy",n=this.omit(n,"reduceOnly")),o="buy"===i?"Long":"Short"}else o="Merged";if(o=this.capitalize(o),c.posSide=o,"USDT"===d.settle?c.orderQtyRq=s:c.orderQty=this.parseToInt(s),void 0!==g){const e=this.safeString(n,"triggerType","ByMarkPrice");let s;if(c.triggerType=e,[s,n]=this.handleParamString(n,"triggerDirection"),void 0===s)throw new r.ArgumentsRequired(this.id+" createOrder() also requires a 'triggerDirection' parameter with either 'up' or 'down' value");"up"===s?"sell"===i?c.ordType="Market"===t?"MarketIfTouched":"LimitIfTouched":"buy"===i&&(c.ordType="Market"===t?"Stop":"StopLimit"):"down"===s&&("sell"===i?c.ordType="Market"===t?"Stop":"StopLimit":"buy"===i&&(c.ordType="Market"===t?"MarketIfTouched":"LimitIfTouched"))}if(f||m){if(f){const t=this.safeValue2(u,"triggerPrice","stopPrice");if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["stopLoss"]["triggerPrice"] for a stop loss order');"USDT"===d.settle?c.stopLossRp=this.priceToPrecision(e,t):c.stopLossEp=this.toEp(t,d);const i=this.safeString2(u,"triggerPriceType","slTrigger");void 0!==i&&(c.slTrigger=this.safeString(this.options.triggerPriceTypesMap,i,i));const s=this.safeString(u,"price");void 0!==s&&(c.slPxRp=this.priceToPrecision(e,s))}if(m){const t=this.safeValue2(p,"triggerPrice","stopPrice");if(void 0===t)throw new r.InvalidOrder(this.id+' createOrder() requires a trigger price in params["takeProfit"]["triggerPrice"] for a take profit order');"USDT"===d.settle?c.takeProfitRp=this.priceToPrecision(e,t):c.takeProfitEp=this.toEp(t,d);const i=this.safeString2(p,"triggerPriceType","tpTrigger");void 0!==i&&(c.tpTrigger=this.safeString(this.options.triggerPriceTypesMap,i,i));const s=this.safeString(p,"price");void 0!==s&&(c.tpPxRp=this.priceToPrecision(e,s))}}}if("Limit"===t||"StopLimit"===t||"LimitIfTouched"===t)if("USDT"===d.settle)c.priceRp=this.priceToPrecision(e,o);else{const e=this.numberToString(o);c.priceEp=this.toEp(e,d)}const v=this.safeString(n,"takeProfitPrice");void 0!==v&&("USDT"===d.settle?c.takeProfitRp=this.priceToPrecision(e,v):c.takeProfitEp=this.toEp(v,d),n=this.omit(n,"takeProfitPrice"));const y=this.safeString(n,"stopLossPrice");let w;void 0!==y&&("USDT"===d.settle?c.stopLossRp=this.priceToPrecision(e,y):c.stopLossEp=this.toEp(y,d),n=this.omit(n,"stopLossPrice")),w="USDT"===d.settle?await this.privatePostGOrders(this.extend(c,n)):d.contract?await this.privatePostOrders(this.extend(c,n)):await this.privatePostSpotOrders(this.extend(c,n));const b=this.safeDict(w,"data",{});return this.parseOrder(b,d)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={symbol:n.id},h=this.safeString2(o,"clientOrderId","clOrdID");o=this.omit(o,["clientOrderId","clOrdID"]);const c="USDT"===n.settle;void 0!==h?d.clOrdID=h:d.orderID=e,void 0!==a&&(c?d.priceRp=this.priceToPrecision(n.symbol,a):d.priceEp=this.toEp(a,n));const l=this.safeString(o,"baseQtyEv");o=this.omit(o,["baseQtyEv"]),void 0!==l?d.baseQtyEV=l:void 0!==r&&(c?d.orderQtyRq=this.amountToPrecision(n.symbol,r):d.baseQtyEV=this.toEv(r,n));const u=this.safeStringN(o,["triggerPrice","stopPx","stopPrice"]);let f;if(void 0!==u&&(c?d.stopPxRp=this.priceToPrecision(t,u):d.stopPxEp=this.toEp(u,n)),o=this.omit(o,["triggerPrice","stopPx","stopPrice"]),c){void 0===this.safeString(o,"posSide")&&(d.posSide="Merged"),f=await this.privatePutGOrdersReplace(this.extend(d,o))}else f=n.swap?await this.privatePutOrdersReplace(this.extend(d,o)):await this.privatePutSpotOrders(this.extend(d,o));const p=this.safeDict(f,"data",{});return this.parseOrder(p,n)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id},o=this.safeString2(i,"clientOrderId","clOrdID");let n;if(i=this.omit(i,["clientOrderId","clOrdID"]),void 0!==o?a.clOrdID=o:a.orderID=e,"USDT"===s.settle){void 0===this.safeString(i,"posSide")&&(a.posSide="Merged"),n=await this.privateDeleteGOrdersCancel(this.extend(a,i))}else n=s.swap?await this.privateDeleteOrdersCancel(this.extend(a,i)):await this.privateDeleteSpotOrders(this.extend(a,i));const d=this.safeDict(n,"data",{});return this.parseOrder(d,s)}async cancelAllOrders(e=void 0,t={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");await this.loadMarkets();const i=this.market(e),s=this.safeValue2(t,"stop","trigger",!1);t=this.omit(t,["stop","trigger"]);const a={symbol:i.id};let o;return s&&(a.untriggerred=s),o="USDT"===i.settle?await this.privateDeleteGOrdersAll(this.extend(a,t)):i.swap?await this.privateDeleteOrdersAll(this.extend(a,t)):await this.privateDeleteSpotOrdersAll(this.extend(a,t)),[this.safeOrder({info:o})]}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={symbol:s.id},o=this.safeString2(i,"clientOrderId","clOrdID");let n;i=this.omit(i,["clientOrderId","clOrdID"]),void 0!==o?a.clOrdID=o:a.orderID=e,n="USDT"===s.settle?await this.privateGetApiDataGFuturesOrdersByOrderId(this.extend(a,i)):s.spot?await this.privateGetApiDataSpotsOrdersByOrderId(this.extend(a,i)):await this.privateGetExchangeOrder(this.extend(a,i));const d=this.safeValue(n,"data",{});let h=d;if(Array.isArray(d)){if(d.length<1)throw void 0!==o?new r.OrderNotFound(this.id+" fetchOrder() "+t+" order with clientOrderId "+o+" not found"):new r.OrderNotFound(this.id+" fetchOrder() "+t+" order with id "+e+" not found");h=this.safeDict(d,0,{})}else if(s.spot){const e=this.safeList(d,"rows",[]);h=this.safeDict(e,0,{})}return this.parseOrder(h,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};let n;void 0!==t&&(o.start=t),void 0!==i&&(o.limit=i),"USDT"===a.settle?(o.currency=a.settle,n=await this.privateGetExchangeOrderV2OrderList(this.extend(o,s))):n=a.swap?await this.privateGetExchangeOrderList(this.extend(o,s)):await this.privateGetApiDataSpotsOrders(this.extend(o,s));const d=this.safeValue(n,"data",{}),h=this.safeList(d,"rows",d);return this.parseOrders(h,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};let n;try{n="USDT"===a.settle?await this.privateGetGOrdersActiveList(this.extend(o,s)):a.swap?await this.privateGetOrdersActiveList(this.extend(o,s)):await this.privateGetSpotOrders(this.extend(o,s))}catch(e){if(e instanceof r.OrderNotFound)return[];throw e}const d=this.safeValue(n,"data",{});if(Array.isArray(d))return this.parseOrders(d,a,t,i);{const e=this.safeList(d,"rows",[]);return this.parseOrders(e,a,t,i)}}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};let o;void 0!==r&&(a.symbol=r.id),void 0!==t&&(a.start=t),void 0!==i&&(a.limit=i),void 0===e||"USDT"===this.safeString(r,"settle")?(a.currency=this.safeString(s,"settle","USDT"),o=await this.privateGetExchangeOrderV2OrderList(this.extend(a,s))):o=r.swap?await this.privateGetExchangeOrderList(this.extend(a,s)):await this.privateGetExchangeSpotOrder(this.extend(a,s));const n=this.safeValue(o,"data",{});if(Array.isArray(n))return this.parseOrders(n,r,t,i);{const e=this.safeList(n,"rows",[]);return this.parseOrders(e,r,t,i)}}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==i&&(i=Math.min(200,i),a.limit=i);const o=void 0===e||"USDT"===this.safeString(r,"settle");let n,d;return o?(a.currency="USDT",a.offset=0,void 0===i&&(a.limit=200)):a.symbol=r.id,void 0!==t&&(a.start=t),n=o?await this.privateGetExchangeOrderV2TradingList(this.extend(a,s)):r.swap?await this.privateGetExchangeOrderTrade(this.extend(a,s)):await this.privateGetExchangeSpotOrderTrades(this.extend(a,s)),o?d=this.safeValue(n,"data",[]):(d=this.safeValue(n,"data",{}),d=this.safeValue(d,"rows",[])),this.parseTrades(d,r,t,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=this.safeDict(this.options,"defaultNetworks"),a=this.safeStringUpper(r,e),o=this.safeDict(this.options,"networks",{});let n=this.safeStringUpper(t,"network",a);n=this.safeString(o,n,n),void 0===n?s.chainName=i.id:(s.chainName=n,t=this.omit(t,"network"));const d=await this.privateGetPhemexUserWalletsV2DepositAddress(this.extend(s,t)),h=this.safeValue(d,"data",{}),c=this.safeString(h,"address"),l=this.safeString(h,"tag");return this.checkAddress(c),{info:d,currency:e,network:void 0,address:c,tag:l}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a=await this.privateGetExchangeWalletsDepositList(s),o=this.safeList(a,"data",[]);return this.parseTransactions(o,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.currency(e));const a=await this.privateGetExchangeWalletsWithdrawList(s),o=this.safeList(a,"data",[]);return this.parseTransactions(o,r,t,i)}parseTransactionStatus(e){return this.safeString({Success:"ok",Succeed:"ok",Rejected:"failed","Security check failed":"failed",SecurityCheckFailed:"failed",Expired:"failed","Address Risk":"failed","Security Checking":"pending",SecurityChecking:"pending","Pending Review":"pending","Pending Transfer":"pending",AmlCsApporve:"pending",New:"pending",Confirmed:"pending",Cancelled:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"address"),r=void 0,a=this.safeString(e,"txHash"),o=this.safeString(e,"currency"),n=(t=this.safeCurrency(o,t)).code,d=this.safeString(e,"chainName"),h=this.safeIntegerN(e,["createdAt","submitedAt","submittedAt"]);let c,l=this.safeStringLower(e,"type"),u=this.parseNumber(this.fromEn(this.safeString(e,"feeEv"),t.valueScale));void 0===u&&(u=this.safeNumber(e,"feeRv")),void 0!==u&&(l="withdrawal",c={cost:u,currency:n});const f=this.parseTransactionStatus(this.safeString(e,"status"));let p=this.parseNumber(this.fromEn(this.safeString(e,"amountEv"),t.valueScale));return void 0===p&&(p=this.safeNumber(e,"amountRv")),{info:e,id:i,txid:a,timestamp:h,datetime:this.iso8601(h),network:this.networkIdToCode(d),address:s,addressTo:s,addressFrom:void 0,tag:r,tagTo:r,tagFrom:void 0,type:l,amount:p,currency:n,status:f,updated:void 0,comment:void 0,internal:void 0,fee:c}}async fetchPositions(e=void 0,t={}){let i;await this.loadMarkets(),e=this.marketSymbols(e);let s,r,a=this.safeString2(t,"currency","code","USD");t=this.omit(t,["currency","code"]);const o=this.safeString(e,0);void 0!==o?(r=this.market(o),s=r.settle,a=r.settle):[s,t]=this.handleOptionAndParams(t,"fetchPositions","settle",a),[i,t]=this.handleSubTypeAndParams("fetchPositions",r,t);const n="USDT"===s;n?a="USDT":"BTC"===s?a="BTC":void 0===a&&(a="linear"===i?"USD":"BTC");const d={currency:this.currency(a).id};let h;if(n){let e;[e,t]=this.handleOptionAndParams(t,"fetchPositions","method","privateGetGAccountsAccountPositions"),h="privateGetGAccountsAccountPositions"===e?await this.privateGetGAccountsAccountPositions(this.extend(d,t)):await this.privateGetAccountsPositions(this.extend(d,t))}else h=await this.privateGetAccountsAccountPositions(this.extend(d,t));const c=this.safeValue(h,"data",{}),l=this.safeValue(c,"positions",[]),u=[];for(let e=0;e<l.length;e++){const t=l[e];u.push(this.parsePosition(t))}return this.filterByArrayPositions(u,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).symbol,r=this.safeString2(e,"positionMargin","positionMarginRv"),o=this.safeString2(e,"value","valueRv"),n=this.safeString2(e,"maintMarginReq","maintMarginReqRr"),d=a.Y.stringMul(o,n),h=this.safeString2(e,"assignedPosBalance","assignedPosBalanceRv"),c=a.Y.stringDiv(h,o),l=this.safeNumber2(e,"liquidationPrice","liquidationPriceRp"),u=this.safeString2(e,"markPrice","markPriceRp"),f=this.safeString(e,"size"),p=this.safeValue(t,"contractSize"),m=this.numberToString(p),g=this.parseNumber(a.Y.stringAbs(this.safeString2(e,"leverage","leverageRr"))),v=this.safeString2(e,"avgEntryPrice","avgEntryPriceRp"),y=this.safeString(e,"side");let w,b;void 0!==y&&(w="Buy"===y?"long":"short");b="USD"===this.safeString(e,"currency")?"long"===w?a.Y.stringSub(u,v):a.Y.stringSub(v,u):"long"===w?a.Y.stringSub(a.Y.stringDiv("1",v),a.Y.stringDiv("1",u)):a.Y.stringSub(a.Y.stringDiv("1",u),a.Y.stringDiv("1",v));const k=a.Y.stringMul(a.Y.stringMul(b,f),m),S=a.Y.stringDiv(d,r),O=this.safeValue(e,"crossMargin");return this.safePosition({info:e,id:void 0,symbol:s,contracts:this.parseNumber(f),contractSize:p,unrealizedPnl:this.parseNumber(k),leverage:g,liquidationPrice:l,collateral:this.parseNumber(r),notional:this.parseNumber(o),markPrice:this.parseNumber(u),lastPrice:void 0,entryPrice:this.parseNumber(v),timestamp:void 0,lastUpdateTimestamp:void 0,initialMargin:this.parseNumber(h),initialMarginPercentage:this.parseNumber(c),maintenanceMargin:this.parseNumber(d),maintenanceMarginPercentage:this.parseNumber(n),marginRatio:this.parseNumber(S),datetime:void 0,marginMode:O?"cross":"isolated",side:w,hedged:!1,percentage:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={symbol:a.id};if(void 0!==i){if(i>200)throw new r.BadRequest(this.id+" fetchFundingHistory() limit argument cannot exceed 200");o.limit=i}let n;n="USDT"===a.settle?await this.privateGetApiDataGFuturesFundingFees(this.extend(o,s)):await this.privateGetApiDataFuturesFundingFees(this.extend(o,s));const d=this.safeValue(n,"data",{}),h=this.safeValue(d,"rows",[]),c=[];for(let e=0;e<h.length;e++){const t=h[e],i=this.safeInteger(t,"createTime"),s=this.safeString2(t,"execFeeEv","execFeeRv"),r=this.safeCurrencyCode(this.safeString(t,"currency"));c.push({info:t,symbol:this.safeString(t,"symbol"),code:r,timestamp:i,datetime:this.iso8601(i),id:void 0,amount:this.parseFundingFeeToPrecision(s,a,r)})}return c}parseFundingFeeToPrecision(e,t=void 0,i=void 0){if(void 0===e||void 0===i)return e;if(!("USDT"===t.settle)){const t=this.safeCurrency(i),s=this.safeString(t.info,"valueScale"),r=this.parsePrecision(s);e=a.Y.stringMul(e,r)}return e}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new r.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={symbol:i.id};let a={};a=i.linear?await this.v2GetMdV2Ticker24hr(this.extend(s,t)):await this.v1GetMdTicker24hr(this.extend(s,t));const o=this.safeValue(a,"result",{});return this.parseFundingRate(o,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.safeIntegerProduct(e,"timestamp",1e-6),a=this.fromEp(this.safeString(e,"markEp"),t),o=this.fromEp(this.safeString(e,"indexEp"),t),n=this.fromEr(this.safeString(e,"fundingRateEr"),t),d=this.fromEr(this.safeString(e,"predFundingRateEr"),t);return{info:e,symbol:s,markPrice:this.safeNumber(e,"markPriceRp",a),indexPrice:this.safeNumber(e,"indexPriceRp",o),interestRate:void 0,estimatedSettlePrice:void 0,timestamp:r,datetime:this.iso8601(r),fundingRate:this.safeNumber(e,"fundingRateRr",n),fundingTimestamp:void 0,fundingDatetime:void 0,nextFundingRate:this.safeNumber(e,"predFundingRateRr",d),nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async setMargin(e,t,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id,posBalanceEv:this.toEv(t,s)},a=await this.privatePostPositionsAssign(this.extend(r,i));return this.extend(this.parseMarginModification(a,s),{amount:t})}parseMarginStatus(e){return this.safeString({0:"ok"},e,e)}parseMarginModification(e,t=void 0){t=this.safeMarket(void 0,t);const i=this.safeValue(t,"inverse")?"base":"quote";return{info:e,symbol:this.safeSymbol(void 0,t),type:"set",marginMode:"isolated",amount:void 0,total:void 0,code:t[i],status:this.parseMarginStatus(this.safeString(e,"code")),timestamp:void 0,datetime:void 0}}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(!s.swap||"USDT"===s.settle)throw new r.BadSymbol(this.id+" setMarginMode() supports swap (non USDT based) contracts only");if("isolated"!==(e=e.toLowerCase())&&"cross"!==e)throw new r.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");let a=this.safeInteger(i,"leverage");if("cross"===e&&(a=0),void 0===a)throw new r.ArgumentsRequired(this.id+" setMarginMode() requires a leverage parameter");const o={symbol:s.id,leverage:a};return await this.privatePutPositionsLeverage(this.extend(o,i))}async setPositionMode(e,t=void 0,i={}){this.checkRequiredArgument("setPositionMode",t,"symbol"),await this.loadMarkets();const s=this.market(t);if("USDT"!==s.settle)throw new r.BadSymbol(this.id+" setPositionMode() supports USDT settled markets only");const a={symbol:s.id};return a.targetPosMode=e?"Hedged":"OneWay",await this.privatePutGPositionsSwitchPosModeSync(this.extend(a,i))}async fetchLeverageTiers(e=void 0,t={}){if(await this.loadMarkets(),void 0!==e){const t=this.safeValue(e,0);if("USD"!==this.market(t).settle)throw new r.BadSymbol(this.id+" fetchLeverageTiers() supports USD settled markets only")}const i=await this.publicGetCfgV2Products(t),s=this.safeValue(i,"data",{}),a=this.safeList(s,"riskLimits");return this.parseLeverageTiers(a,e,"symbol")}parseMarketLeverageTiers(e,t=void 0){const i=this.safeString(e,"symbol"),s=(t=this.safeMarket(i,t)).info.riskLimits,r=[];let a=0;for(let e=0;e<s.length;e++){const o=s[e],n=this.safeInteger(o,"limit");r.push({tier:this.sum(e,1),symbol:this.safeSymbol(i,t),currency:t.settle,minNotional:a,maxNotional:n,maintenanceMarginRate:this.safeString(o,"maintenanceMargin"),maxLeverage:void 0,info:o}),a=n}return r}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),d="/"+this.implodeParams(e,s);let h=d,c="";if("GET"!==i&&"DELETE"!==i&&"PUT"!==i&&"/positions/assign"!==h||Object.keys(o).length&&(c=this.urlencodeWithArrayRepeat(o),h+="?"+c),"private"===t){this.checkRequiredCredentials();const t=this.seconds(),o=this.safeInteger(this.options,"x-phemex-request-expiry",60),h=this.sum(t,o).toString();r={"x-phemex-access-token":this.apiKey,"x-phemex-request-expiry":h};let l="";if("POST"===i){if(("g-orders"===e||"spot/orders"===e||"orders"===e)&&void 0===this.safeString(s,"clOrdID")){const e=this.safeString(this.options,"brokerId","CCXT123456");s.clOrdID=e+this.uuid16()}l=this.json(s),a=l,r["Content-Type"]="application/json"}const u=d+c+h+l;r["x-phemex-request-signature"]=this.hmac(this.encode(u),this.encode(this.secret),n.s)}return h=this.implodeHostname(this.urls.api[t])+h,{url:h,method:i,body:a,headers:r}}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");if(e<-100||e>100)throw new r.BadRequest(this.id+" setLeverage() leverage should be between -100 and 100");await this.loadMarkets();const s=this.safeBool(i,"hedged",!1),a=this.safeInteger(i,"longLeverageRr"),o=this.safeInteger(i,"shortLeverageRr"),n=this.market(t),d={symbol:n.id};let h;if("USDT"===n.settle){if(s||void 0!==a||void 0!==o){const t=void 0!==a?a:e,i=void 0!==o?o:e;d.longLeverageRr=t,d.shortLeverageRr=i}else d.leverageRr=e;h=await this.privatePutGPositionsLeverage(this.extend(d,i))}else d.leverage=e,h=await this.privatePutPositionsLeverage(this.extend(d,i));return h}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.toEv(t,a);let c,l;if("spot"===n&&"future"===d?c=2:"future"===n&&"spot"===d&&(c=1),void 0!==c){const e={currency:a.id,moveOp:c,amountEv:h},t=await this.privatePostAssetsTransfer(this.extend(e,r)),i=this.safeValue(t,"data",{});l=this.parseTransfer(i,a)}else{const e={fromUserId:n,toUserId:d,amountEv:h,currency:a.id,bizType:this.safeString(r,"bizType","SPOT")},t=await this.privatePostAssetsUniversalTransfer(this.extend(e,r));l=this.parseTransfer(t)}const u=this.safeValue(this.options,"transfer",{});return this.safeBool(u,"fillResponseFromRequest",!0)&&(void 0===l.fromAccount&&(l.fromAccount=i),void 0===l.toAccount&&(l.toAccount=s),void 0===l.amount&&(l.amount=t),void 0===l.currency&&(l.currency=e)),l}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchTransfers() requires a code argument");const a=this.currency(e),o={currency:a.id};void 0!==t&&(o.start=t),void 0!==i&&(o.limit=i);const n=await this.privateGetAssetsTransfer(this.extend(o,s)),d=this.safeValue(n,"data",{}),h=this.safeList(d,"rows",[]);return this.parseTransfers(h,a,t,i)}parseTransfer(e,t=void 0){const i=this.safeString(e,"linkKey"),s=this.safeString(e,"status"),r=this.safeString(e,"amountEv"),a=this.fromEv(r),o=this.safeString(e,"currency"),n=this.safeCurrencyCode(o,t),d=this.safeInteger(e,"side");let h,c;1===d?(h="swap",c="spot"):2===d&&(h="spot",c="swap");const l=this.safeInteger(e,"createTime");return{info:e,id:i,timestamp:l,datetime:this.iso8601(l),currency:n,amount:a,fromAccount:h,toAccount:c,status:this.parseTransferStatus(s)}}parseTransferStatus(e){return this.safeString({3:"rejected",6:"canceled",10:"ok",11:"failed"},e,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o="USDT"===a.settle;if(!a.swap)throw new r.BadRequest(this.id+" fetchFundingRateHistory() supports swap contracts only");let n,d=!1;if([d,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),d)return await this.fetchPaginatedCallDeterministic("fetchFundingRateHistory",e,t,i,"8h",s,100);n=o?"."+a.id+"FR8H":"."+a.baseId+"FR8H";let h,c={symbol:n};void 0!==t&&(c.start=t),void 0!==i&&(c.limit=i),[c,s]=this.handleUntilOption("end",c,s),h=o?await this.v2GetApiDataPublicDataFundingRateHistory(this.extend(c,s)):await this.v1GetApiDataPublicDataFundingRateHistory(this.extend(c,s));const l=this.safeValue(h,"data",{}),u=this.safeValue(l,"rows"),f=[];for(let t=0;t<u.length;t++){const i=u[t],s=this.safeInteger(i,"fundingTime");f.push({info:i,symbol:e,fundingRate:this.safeNumber(i,"fundingRate"),timestamp:s,datetime:this.iso8601(s)})}const p=this.sortBy(f,"timestamp");return this.filterBySymbolSinceLimit(p,e,t,i)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),await this.loadMarkets(),this.checkAddress(i);const o=this.currency(e);let n,d;[n,a]=this.handleNetworkCodeAndParams(a),void 0!==n&&(d=this.networkCodeToId(n));const h=this.safeValue(this.options,"stableCoins");if(void 0===d){if(this.inArray(e,h))throw new r.ArgumentsRequired(this.id+' withdraw () requires an extra argument params["network"]');d=o.id}const c={currency:o.id,address:i,amount:t,chainName:d.toUpperCase()};void 0!==s&&(c.addressTag=s);const l=await this.privatePostPhemexWithdrawWalletsApiCreateWithdraw(this.extend(c,a)),u=this.safeDict(l,"data",{});return this.parseTransaction(u,o)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest is only supported for contract markets.");const s={symbol:i.id},a=await this.v2GetMdV2Ticker24hr(this.extend(s,t)),o=this.safeDict(a,"result");return this.parseOpenInterest(o,i)}parseOpenInterest(e,t=void 0){const i=this.safeInteger(e,"timestamp")/1e6,s=this.safeString(e,"symbol");return this.safeOpenInterest({info:e,symbol:this.safeSymbol(s,t),baseVolume:this.safeString(e,"volumeRq"),quoteVolume:void 0,openInterestAmount:this.safeString(e,"openInterestRv"),openInterestValue:void 0,timestamp:i,datetime:this.iso8601(i)},t)}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r=this.currency(e),a=this.currency(t),o=this.safeInteger(r,"valueScale"),n={fromCurrency:e,toCurrency:t,fromAmountEv:this.toEn(i,o)},d=await this.privateGetAssetsQuote(this.extend(n,s)),h=this.safeDict(d,"data",{});return this.parseConversion(h,r,a)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(t),o=this.currency(i),n=this.safeInteger(a,"valueScale"),d={code:e,fromCurrency:t,toCurrency:i};void 0!==s&&(d.fromAmountEv=this.toEn(s,n));const h=await this.privatePostAssetsConvert(this.extend(d,r)),c=this.safeDict(h,"data",{}),l=this.safeString(c,"fromCurrency"),u=this.safeCurrency(l,a),f=this.safeString(c,"toCurrency"),p=this.safeCurrency(f,o);return this.parseConversion(c,u,p)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={};void 0!==e&&(r.fromCurrency=e),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[r,s]=this.handleUntilOption("endTime",r,s);const a=await this.privateGetAssetsConvert(this.extend(r,s)),o=this.safeDict(a,"data",{}),n=this.safeList(o,"rows",[]);return this.parseConversions(n,e,"fromCurrency","toCurrency",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeDict(e,"quoteArgs",{}),r=this.safeInteger(s,"requestAt"),a=this.safeInteger(e,"createTime",r),o=this.safeString(e,"fromCurrency",this.safeString(t,"code")),n=this.safeCurrencyCode(o,t),d=this.safeString(e,"toCurrency",this.safeString(i,"code")),h=this.safeCurrencyCode(d,i),c=this.safeInteger(t,"valueScale"),l=this.safeInteger(i,"valueScale");let u=this.fromEn(this.safeString(e,"fromAmountEv"),c);void 0===u&&void 0!==s&&(u=this.fromEn(this.safeString(s,"origin"),c));let f=this.fromEn(this.safeString(e,"toAmountEv"),l);return void 0===f&&void 0!==s&&(f=this.fromEn(this.safeString(s,"proceeds"),l)),{info:e,timestamp:a,datetime:this.iso8601(a),id:this.safeString(e,"code"),fromCurrency:n,fromAmount:this.parseNumber(u),toCurrency:h,toAmount:this.parseNumber(f),price:this.safeNumber(s,"price"),fee:void 0}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeValue(n,"error",n),l=this.safeString(c,"code"),u=this.safeString(c,"msg");if(void 0!==l&&"0"!==l){const e=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,l,e),this.throwBroadlyMatchedException(this.exceptions.broad,u,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"poloniex",name:"Poloniex",countries:["US"],rateLimit:5,certified:!1,pro:!0,has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelOrder:!0,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!0,fetchBalance:!0,fetchClosedOrder:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrderTrades:!0,fetchPosition:!1,fetchPositionMode:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawals:!0,sandbox:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"MINUTE_1","5m":"MINUTE_5","10m":"MINUTE_10","15m":"MINUTE_15","30m":"MINUTE_30","1h":"HOUR_1","2h":"HOUR_2","4h":"HOUR_4","6h":"HOUR_6","12h":"HOUR_12","1d":"DAY_1","3d":"DAY_3","1w":"WEEK_1","1M":"MONTH_1"},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766817-e9456312-5ee6-11e7-9b3c-b628ca5626a5.jpg",api:{rest:"https://api.poloniex.com"},test:{rest:"https://sand-spot-api-gateway.poloniex.com"},www:"https://www.poloniex.com",doc:"https://api-docs.poloniex.com/spot/",fees:"https://poloniex.com/fees",referral:"https://poloniex.com/signup?c=UBFZJRPJ"},api:{public:{get:{markets:20,"markets/{symbol}":1,currencies:20,"currencies/{currency}":20,"v2/currencies":20,"v2/currencies/{currency}":20,timestamp:1,"markets/price":1,"markets/{symbol}/price":1,"markets/markPrice":1,"markets/{symbol}/markPrice":1,"markets/{symbol}/markPriceComponents":1,"markets/{symbol}/orderBook":1,"markets/{symbol}/candles":1,"markets/{symbol}/trades":20,"markets/ticker24h":20,"markets/{symbol}/ticker24h":20,"markets/collateralInfo":1,"markets/{currency}/collateralInfo":1,"markets/borrowRatesInfo":1}},private:{get:{accounts:4,"accounts/balances":4,"accounts/{id}/balances":4,"accounts/activity":20,"accounts/transfer":20,"accounts/transfer/{id}":4,feeinfo:20,"accounts/interest/history":1,subaccounts:4,"subaccounts/balances":20,"subaccounts/{id}/balances":4,"subaccounts/transfer":20,"subaccounts/transfer/{id}":4,"wallets/addresses":20,"wallets/addresses/{currency}":20,"wallets/activity":20,"margin/accountMargin":4,"margin/borrowStatus":4,"margin/maxSize":4,orders:20,"orders/{id}":4,"orders/killSwitchStatus":4,smartorders:20,"smartorders/{id}":4,"orders/history":20,"smartorders/history":20,trades:20,"orders/{id}/trades":4},post:{"accounts/transfer":4,"subaccounts/transfer":20,"wallets/address":20,"wallets/withdraw":20,"v2/wallets/withdraw":20,orders:4,"orders/batch":20,"orders/killSwitch":4,smartorders:4},delete:{"orders/{id}":4,"orders/cancelByIds":20,orders:20,"smartorders/{id}":4,"smartorders/cancelByIds":20,smartorders:20},put:{"orders/{id}":20,"smartorders/{id}":20}}},fees:{trading:{feeSide:"get",maker:this.parseNumber("0.0009"),taker:this.parseNumber("0.0009")},funding:{}},commonCurrencies:{AIR:"AirCoin",APH:"AphroditeCoin",BCC:"BTCtalkcoin",BCHABC:"BCHABC",BDG:"Badgercoin",BTM:"Bitmark",CON:"Coino",ETHTRON:"ETH",GOLD:"GoldEagles",GPUC:"GPU",HOT:"Hotcoin",ITC:"Information Coin",KEY:"KEYCoin",MASK:"NFTX Hashmasks Index",MEME:"Degenerator Meme",PLX:"ParallaxCoin",REPV2:"REP",STR:"XLM",SOC:"SOCC",TRADE:"Unitrade",TRXETH:"TRX",XAP:"API Coin",USDTBSC:"USDT",USDTTRON:"USDT",USDTETH:"USDT",UST:"USTC"},options:{createMarketBuyOrderRequiresPrice:!0,networks:{BEP20:"BSC",ERC20:"ETH",TRC20:"TRON"},limits:{cost:{min:{BTC:1e-4,ETH:1e-4,USDT:1,TRX:100,BNB:.06,USDC:1,USDJ:1,TUSD:1e-4,DAI:1,PAX:1,BUSD:1}}},accountsByType:{spot:"spot",future:"futures"},accountsById:{exchange:"spot",futures:"future"}},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!0,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:2e3,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:500}},spot:{extends:"default"},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{500:r.ExchangeNotAvailable,603:r.RequestTimeout,601:r.BadRequest,415:r.ExchangeError,602:r.ArgumentsRequired,21604:r.BadRequest,21600:r.AuthenticationError,21605:r.AuthenticationError,21102:r.ExchangeError,21100:r.AuthenticationError,21704:r.AuthenticationError,21700:r.BadRequest,21705:r.BadRequest,21707:r.ExchangeError,21708:r.BadRequest,21601:r.AccountSuspended,21711:r.ExchangeError,21709:r.InsufficientFunds,25e4:r.ExchangeError,250001:r.BadRequest,250002:r.BadRequest,250003:r.BadRequest,250004:r.BadRequest,250005:r.InsufficientFunds,250008:r.BadRequest,250012:r.ExchangeError,21110:r.BadRequest,10040:r.BadSymbol,10060:r.ExchangeError,10020:r.BadSymbol,10041:r.BadSymbol,21340:r.OnMaintenance,21341:r.InvalidOrder,21342:r.InvalidOrder,21343:r.InvalidOrder,21351:r.AccountSuspended,21352:r.BadSymbol,21353:r.PermissionDenied,21354:r.PermissionDenied,21359:r.OrderNotFound,21360:r.InvalidOrder,24106:r.BadRequest,24201:r.ExchangeNotAvailable,21301:r.OrderNotFound,21302:r.ExchangeError,21304:r.ExchangeError,21305:r.OrderNotFound,21307:r.ExchangeError,21309:r.InvalidOrder,21310:r.InvalidOrder,21311:r.InvalidOrder,21312:r.InvalidOrder,21314:r.InvalidOrder,21315:r.InvalidOrder,21317:r.InvalidOrder,21319:r.InvalidOrder,21320:r.InvalidOrder,21321:r.InvalidOrder,21322:r.InvalidOrder,21324:r.BadRequest,21327:r.InvalidOrder,21328:r.InvalidOrder,21330:r.InvalidOrder,21335:r.InvalidOrder,21336:r.InvalidOrder,21337:r.InvalidOrder,21344:r.InvalidOrder,21345:r.InvalidOrder,21346:r.InvalidOrder,21348:r.InvalidOrder,21347:r.InvalidOrder,21349:r.InvalidOrder,21350:r.InvalidOrder,21355:r.ExchangeError,21356:r.BadRequest,21721:r.InsufficientFunds,24101:r.BadSymbol,24102:r.InvalidOrder,24103:r.InvalidOrder,24104:r.InvalidOrder,24105:r.InvalidOrder,25020:r.InvalidOrder,25e3:r.InvalidOrder,25001:r.InvalidOrder,25002:r.InvalidOrder,25003:r.ExchangeError,25004:r.InvalidOrder,25005:r.ExchangeError,25006:r.InvalidOrder,25007:r.InvalidOrder,25008:r.InvalidOrder,25009:r.ExchangeError,25010:r.PermissionDenied,25011:r.InvalidOrder,25012:r.ExchangeError,25013:r.OrderNotFound,25014:r.OrderNotFound,25015:r.OrderNotFound,25016:r.ExchangeError,25017:r.ExchangeError,25018:r.BadRequest,25019:r.BadSymbol},broad:{}}})}parseOHLCV(e,t=void 0){return[this.safeInteger(e,12),this.safeNumber(e,2),this.safeNumber(e,1),this.safeNumber(e,0),this.safeNumber(e,3),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,500);const o=this.market(e);let n={symbol:o.id,interval:this.safeString(this.timeframes,t,t)};void 0!==i&&(n.startTime=i),void 0!==s&&(n.limit=s),[n,r]=this.handleUntilOption("endTime",n,r);const d=await this.publicGetMarketsSymbolCandles(this.extend(n,r));return this.parseOHLCVs(d,o,t,i,s)}async loadMarkets(e=!1,t={}){const i=await super.loadMarkets(e,t);return(void 0===this.safeValue(this.options,"currenciesByNumericId")||e)&&(this.options.currenciesByNumericId=this.indexBy(this.currencies,"numericId")),i}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"baseCurrencyName"),s=this.safeString(e,"quoteCurrencyName"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o="NORMAL"===this.safeString(e,"state"),n=this.safeValue(e,"symbolTradeLimit");return{id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:o,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(n,"quantityScale"))),price:this.parseNumber(this.parsePrecision(this.safeString(n,"priceScale")))},limits:{amount:{min:this.safeNumber(n,"minQuantity"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(n,"minAmount"),max:void 0}},created:this.safeInteger(e,"tradableStartTime"),info:e}}async fetchTime(e={}){const t=await this.publicGetTimestamp(e);return this.safeInteger(t,"serverTime")}parseTicker(e,t=void 0){const i=this.safeInteger(e,"ts"),s=this.safeString(e,"symbol");t=this.safeMarket(s);const r=this.safeString(e,"close"),o=this.safeString(e,"dailyChange"),n=a.Y.stringMul(o,"100"),d=this.safeString(e,"bidQuantity"),h=this.safeString(e,"askQuantity");return this.safeTicker({id:s,symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:d,ask:this.safeString(e,"ask"),askVolume:h,vwap:void 0,open:this.safeString(e,"open"),close:r,last:r,previousClose:void 0,change:void 0,percentage:n,average:void 0,baseVolume:this.safeString(e,"quantity"),quoteVolume:this.safeString(e,"amount"),markPrice:this.safeString(e,"markPrice"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarketsTicker24h(t);return this.parseTickers(i,e)}async fetchCurrencies(e={}){const t=await this.publicGetCurrencies(this.extend(e,{includeMultiChainCurrencies:!0})),i={};for(let e=0;e<t.length;e++){const s=this.safeValue(t,e),r=Object.keys(s),o=this.safeValue(r,0),n=this.safeValue(s,o),d=this.safeCurrencyCode(o),h=this.safeString(n,"name"),c=this.safeString(n,"blockchain");let l;void 0!==c&&(l=this.networkIdToCode(c,d));const u=this.safeValue(n,"delisted"),f="ENABLED"===this.safeString(n,"walletState"),p="ENABLED"===this.safeString(n,"walletDepositState"),m="ENABLED"===this.safeString(n,"walletWithdrawalState"),g=!u&&f&&p&&m,v=this.safeInteger(n,"id"),y=this.safeString(n,"withdrawalFee"),w=void 0===this.safeValue(n,"parentChain");void 0===this.safeValue(i,d)&&(i[d]={id:o,code:d,info:void 0,name:h,active:g,deposit:p,withdraw:m,fee:this.parseNumber(y),precision:void 0,limits:{amount:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}}});let b=this.safeString(i[d],"fee");void 0!==y&&(b=void 0===b?y:a.Y.stringMin(y,b));let k=this.safeValue(i[d],"deposit");k=p||k;let S=this.safeValue(i[d],"withdraw");S=m||S;const O=this.safeValue(i[d],"networks",{});void 0!==l&&(O[l]={info:n,id:c,network:l,currencyId:o,numericId:v,deposit:p,withdraw:m,active:g,fee:this.parseNumber(y),precision:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}}}),i[d].networks=O;const T=this.safeValue(i[d],"info",[]),P={};P[o]=n,T.push(P),i[d].info=T,w&&(i[d].id=o,i[d].name=h),i[d].active=k&&S,i[d].deposit=k,i[d].withdraw=S,i[d].fee=this.parseNumber(b)}return i}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetMarketsSymbolTicker24h(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){const i=this.safeString2(e,"id","tradeID"),s=this.safeString(e,"orderId"),r=this.safeInteger2(e,"ts","createTime"),a=this.safeString(e,"symbol"),o=(t=this.safeMarket(a,t,"_")).symbol,n=this.safeStringLower2(e,"side","takerSide");let d;const h=this.safeString(e,"price"),c=this.safeString(e,"quantity"),l=this.safeString(e,"amount"),u=this.safeString(e,"feeCurrency"),f=this.safeString(e,"feeAmount");if(void 0!==f){d={cost:f,currency:this.safeCurrencyCode(u)}}return this.safeTrade({id:i,info:e,timestamp:r,datetime:this.iso8601(r),symbol:o,order:s,type:this.safeStringLower(e,"type"),side:n,takerOrMaker:this.safeStringLower(e,"matchRole"),price:h,amount:c,cost:l,fee:d},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetMarketsSymbolTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a=!1;if([a,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),a)return await this.fetchPaginatedCallDynamic("fetchMyTrades",e,t,i,s);void 0!==e&&(r=this.market(e));let o={};void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i),[o,s]=this.handleUntilOption("endTime",o,s);const n=await this.privateGetTrades(this.extend(o,s));return this.parseTrades(n,r,t,i)}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",PENDING_CANCEL:"canceled",PARTIALLY_CANCELED:"canceled",CANCELED:"canceled",FAILED:"canceled"},e,e)}parseOrder(e,t=void 0){let i=this.safeInteger2(e,"timestamp","createTime");void 0===i&&(i=this.parse8601(this.safeString(e,"date")));const s=this.safeString(e,"symbol"),r=(t=this.safeMarket(s,t,"_")).symbol;let a=this.safeValue(e,"resultingTrades");void 0!==a&&(Array.isArray(a)||(a=this.safeValue(a,this.safeString(t,"id",s))));const o=this.safeString2(e,"price","rate"),n=this.safeString(e,"quantity"),d=this.safeString(e,"filledQuantity"),h=this.parseOrderStatus(this.safeString(e,"state")),c=this.safeStringLower(e,"side"),l=this.safeString(e,"type"),u=this.parseOrderType(l),f=this.safeStringN(e,["orderNumber","id","orderId"]);let p;const m=this.safeString(e,"tokenFeeCurrency");let g,v;const y=this.safeString(e,"fee");void 0===m?v="buy"===c?t.base:t.quote:(v=this.safeCurrencyCode(m),g=this.safeString(e,"tokenFee")),void 0!==g&&(p={rate:y,cost:g,currency:v});const w=this.safeString(e,"clientOrderId");return this.safeOrder({info:e,id:f,clientOrderId:w,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:this.safeInteger(e,"updateTime"),status:h,symbol:r,type:u,timeInForce:this.safeString(e,"timeInForce"),postOnly:void 0,side:c,price:o,triggerPrice:this.safeString2(e,"triggerPrice","stopPrice"),cost:void 0,average:this.safeString(e,"avgPrice"),amount:n,filled:d,remaining:void 0,trades:a,fee:p},t)}parseOrderType(e){return this.safeString({MARKET:"market",LIMIT:"limit","STOP-LIMIT":"limit","STOP-MARKET":"market"},e,e)}parseOpenOrders(e,t,i){for(let s=0;s<e.length;s++){const r=e[s],a=this.extend(r,{status:"open",type:"limit",side:r.type,price:r.rate});i.push(this.parseOrder(a,t))}return i}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.symbol=r.id),void 0!==i&&(a.limit=i);const o=this.safeValue2(s,"trigger","stop");let n;s=this.omit(s,["trigger","stop"]),n=o?await this.privateGetSmartorders(this.extend(a,s)):await this.privateGetOrders(this.extend(a,s));return this.parseOrders(n,r,t,i,{status:"open"})}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);if(!n.spot)throw new r.NotSupported(this.id+" createOrder() does not support "+n.type+" orders, only spot orders are accepted");let d={symbol:n.id,side:i};const h=this.safeNumber2(o,"stopPrice","triggerPrice");let c;return[d,o]=this.orderRequest(e,t,i,s,d,a,o),c=void 0!==h?await this.privatePostSmartorders(this.extend(d,o)):await this.privatePostOrders(this.extend(d,o)),c=this.extend(c,{type:t,side:i}),this.parseOrder(c,n)}orderRequest(e,t,i,s,o,n=void 0,d={}){let h=t.toUpperCase();const c="MARKET"===h,l=this.isPostOnly(c,"LIMIT_MAKER"===h,d),u=this.safeNumber2(d,"stopPrice","triggerPrice");if(d=this.omit(d,["postOnly","triggerPrice","stopPrice"]),void 0!==u?(h=void 0===n?"STOP":"STOP_LIMIT",o.stopPrice=u):l&&(h="LIMIT_MAKER"),o.type=h,c)if("buy"===i){let t,i=!0;[i,d]=this.handleOptionAndParams(d,"createOrder","createMarketBuyOrderRequiresPrice",!0);const h=this.safeNumber(d,"cost");if(d=this.omit(d,"cost"),void 0!==h)t=this.costToPrecision(e,h);else if(i){if(void 0===n)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),r=this.numberToString(n),o=a.Y.stringMul(i,r);t=this.costToPrecision(e,o)}}else t=this.costToPrecision(e,s);o.amount=t}else o.quantity=this.amountToPrecision(e,s);else o.quantity=this.amountToPrecision(e,s),o.price=this.priceToPrecision(e,n);const f=this.safeString(d,"clientOrderId");return void 0!==f&&(o.clientOrderId=f,d=this.omit(d,"clientOrderId")),[o,d]}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t);if(!d.spot)throw new r.NotSupported(this.id+" editOrder() does not support "+d.type+" orders, only spot orders are accepted");let h={id:e};const c=this.safeNumber2(n,"stopPrice","triggerPrice");let l;return[h,n]=this.orderRequest(t,i,s,a,h,o,n),l=void 0!==c?await this.privatePutSmartordersId(this.extend(h,n)):await this.privatePutOrdersId(this.extend(h,n)),l=this.extend(l,{side:s,type:i}),this.parseOrder(l,d)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={},r=this.safeValue(i,"clientOrderId");void 0!==r&&(e=r),s.id=e;const a=this.safeValue2(i,"trigger","stop");let o;return i=this.omit(i,["clientOrderId","trigger","stop"]),o=a?await this.privateDeleteSmartordersId(this.extend(s,i)):await this.privateDeleteOrdersId(this.extend(s,i)),this.parseOrder(o)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={symbols:[]};let s;void 0!==e&&(s=this.market(e),i.symbols=[s.id]);const r=this.safeValue2(t,"trigger","stop");let a;return t=this.omit(t,["trigger","stop"]),a=r?await this.privateDeleteSmartorders(this.extend(i,t)):await this.privateDeleteOrders(this.extend(i,t)),this.parseOrders(a,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={id:e=e.toString()},r=this.safeValue2(i,"trigger","stop");let a;i=this.omit(i,["trigger","stop"]),r?(a=await this.privateGetSmartordersId(this.extend(s,i)),a=this.safeValue(a,0)):a=await this.privateGetOrdersId(this.extend(s,i));const o=this.parseOrder(a);return o.id=e,o}async fetchOrderStatus(e,t=void 0,i={}){await this.loadMarkets();const s=await this.fetchOpenOrders(t,void 0,void 0,i);return e in this.indexBy(s,"id")?"open":"closed"}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={id:e},o=await this.privateGetOrdersIdTrades(this.extend(a,r));return this.parseTrades(o)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=this.safeValue(e,i,{}),r=this.safeValue(s,"balances");for(let e=0;e<r.length;e++){const i=this.safeValue(r,e),s=this.safeString(i,"currency"),a=this.safeCurrencyCode(s),o=this.account();o.free=this.safeString(i,"available"),o.used=this.safeString(i,"hold"),t[a]=o}}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountsBalances(this.extend({accountType:"SPOT"},e));return this.parseBalance(t)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.privateGetFeeinfo(e),i={};for(let e=0;e<this.symbols.length;e++){const s=this.symbols[e];i[s]={info:t,symbol:s,maker:this.safeNumber(t,"makerRate"),taker:this.safeNumber(t,"takerRate"),percentage:!0,tierBased:!0}}return i}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};void 0!==t&&(r.limit=t);const a=await this.publicGetMarketsSymbolOrderBook(this.extend(r,i)),o=this.safeInteger(a,"time"),n=this.safeValue(a,"asks"),d=this.safeValue(a,"bids"),h=[],c=[];for(let e=0;e<n.length;e++)if(e%2<1){const t=this.safeNumber(n,e),i=this.safeNumber(n,this.sum(e,1));h.push([t,i])}for(let e=0;e<d.length;e++)if(e%2<1){const t=this.safeNumber(d,e),i=this.safeNumber(d,this.sum(e,1));c.push([t,i])}return{symbol:s.symbol,bids:this.sortBy(c,0,!0),asks:this.sortBy(h,0),timestamp:o,datetime:this.iso8601(o),nonce:void 0}}async createDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},a=this.safeValue(this.options,"networks",{});let o=this.safeStringUpper(t,"network");if(o=this.safeString(a,o,o),void 0!==o)s.currency=s.currency+o,t=this.omit(t,"network");else if("USDT"===i.id)throw new r.ArgumentsRequired(this.id+" createDepositAddress requires a network parameter for "+e+".");const n=await this.privatePostWalletsAddress(this.extend(s,t));let d,h=this.safeString(n,"address");if(this.checkAddress(h),void 0!==i){const e=this.safeString(i.info,"depositAddress");void 0!==e&&(d=h,h=e)}return{currency:e,address:h,tag:d,network:o,info:n}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},a=this.safeValue(this.options,"networks",{});let o=this.safeStringUpper(t,"network");if(o=this.safeString(a,o,o),void 0!==o)s.currency=s.currency+o,t=this.omit(t,"network");else if("USDT"===i.id)throw new r.ArgumentsRequired(this.id+" fetchDepositAddress requires a network parameter for "+e+".");const n=await this.privateGetWalletsAddresses(this.extend(s,t));let d,h=this.safeString(n,s.currency);if(this.checkAddress(h),void 0!==i){const e=this.safeString(i.info,"depositAddress");void 0!==e&&(d=h,h=e)}return{info:n,currency:e,network:o,address:h,tag:d}}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsByType",{}),n=this.safeString(o,i,i),d=this.safeString(o,s,i),h={amount:this.currencyToPrecision(e,t),currency:a.id,fromAccount:n,toAccount:d},c=await this.privatePostAccountsTransfer(this.extend(h,r));return this.parseTransfer(c,a)}parseTransfer(e,t=void 0){return{info:e,id:this.safeString(e,"transferId"),timestamp:void 0,datetime:void 0,currency:this.safeString(t,"id"),amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e),o={currency:a.id,amount:t,address:i};void 0!==s&&(o.paymentId=s);const n=this.safeValue(this.options,"networks",{});let d=this.safeStringUpper(r,"network");d=this.safeString(n,d,d),void 0!==d&&(o.currency=o.currency+d,r=this.omit(r,"network"));const h=await this.privatePostWalletsWithdraw(this.extend(o,r));return this.parseTransaction(h,a)}async fetchTransactionsHelper(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.seconds(),a={start:void 0!==t?this.parseToInt(t/1e3):r-31104e4,end:r};return await this.privateGetWalletsActivity(this.extend(a,s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.fetchTransactionsHelper(e,t,i,s);let a;void 0!==e&&(a=this.currency(e));const o=this.safeValue(r,"withdrawals",[]),n=this.safeValue(r,"deposits",[]),d=this.parseTransactions(o,a,t,i),h=this.parseTransactions(n,a,t,i),c=this.arrayConcat(h,d);return this.filterByCurrencySinceLimit(this.sortBy(c,"timestamp"),e,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){const r=await this.fetchTransactionsHelper(e,t,i,s);let a;void 0!==e&&(a=this.currency(e));const o=this.safeValue(r,"withdrawals",[]),n=this.parseTransactions(o,a,t,i);return this.filterByCurrencySinceLimit(n,e,t,i)}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetCurrencies(this.extend(t,{includeMultiChainCurrencies:!0})),s={};for(let e=0;e<i.length;e++){const t=i[e],r=Object.keys(t),a=this.safeString(r,0);s[a]=t[a]}return this.parseDepositWithdrawFees(s,e)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={};t=this.marketCodes(t);const r=Object.keys(e);for(let i=0;i<r.length;i++){const a=r[i],o=this.safeCurrencyCode(a),n=e[a];if(void 0===t||this.inArray(o,t)){const t=this.currency(o);s[o]=this.parseDepositWithdrawFee(n,t);const i=this.safeValue(n,"childChains");if(i.length>0)for(let t=0;t<i.length;t++){let r=i[t];r=r.replace(o,"");const a=this.networkIdToCode(r),n=this.safeValue(e,r),d={},h=this.safeNumber(n,"withdrawalFee");d[a]={withdraw:{fee:h,percentage:void 0===h&&void 0},deposit:{fee:void 0,percentage:void 0}},s[o].networks=this.extend(s[o].networks,d)}}}return s}parseDepositWithdrawFee(e,t=void 0){const i=this.depositWithdrawFee({});i.info[t.code]=e;const s=this.safeString(e,"blockchain"),r=this.safeNumber(e,"withdrawalFee"),a={fee:r,percentage:void 0===r&&void 0},o={fee:void 0,percentage:void 0};i.withdraw=a,i.deposit=o;const n=this.networkIdToCode(s);return i.networks[n]={withdraw:a,deposit:o},i}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){const r=await this.fetchTransactionsHelper(e,t,i,s);let a;void 0!==e&&(a=this.currency(e));const o=this.safeValue(r,"deposits",[]),n=this.parseTransactions(o,a,t,i);return this.filterByCurrencySinceLimit(n,e,t,i)}parseTransactionStatus(e){return this.safeString({COMPLETE:"ok",COMPLETED:"ok","AWAITING APPROVAL":"pending",AWAITING_APPROVAL:"pending",PENDING:"pending",PROCESSING:"pending","COMPLETE ERROR":"failed",COMPLETE_ERROR:"failed"},e,e)}parseTransaction(e,t=void 0){const i=this.safeTimestamp(e,"timestamp"),s=this.safeString(e,"currency"),r=this.safeCurrencyCode(s);let o=this.safeString(e,"status","pending");o=this.parseTransactionStatus(o);const n=this.safeString(e,"txid"),d="withdrawalRequestsId"in e?"withdrawal":"deposit",h=this.safeString2(e,"withdrawalRequestsId","depositNumber"),c=this.safeString(e,"address"),l=this.safeString(e,"paymentID");let u=this.safeString(e,"amount");const f=this.safeString(e,"fee");return"withdrawal"===d&&(u=a.Y.stringSub(u,f)),{info:e,id:h,currency:r,amount:this.parseNumber(u),network:void 0,address:c,addressTo:void 0,addressFrom:void 0,tag:l,tagTo:void 0,tagFrom:void 0,status:o,type:d,updated:void 0,txid:n,timestamp:i,datetime:this.iso8601(i),comment:void 0,internal:void 0,fee:{currency:r,cost:this.parseNumber(f),rate:void 0}}}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest;const d=this.omit(s,this.extractParams(e)),h=this.implodeParams(e,s);if("public"===t)o+="/"+h,Object.keys(d).length&&(o+="?"+this.urlencode(d));else{this.checkRequiredCredentials();const e=this.nonce().toString();let t=i+"\n";if(o+="/"+h,t+="/"+h,"POST"===i||"PUT"===i||"DELETE"===i)t+="\n",Object.keys(d).length&&(t+="requestBody="+(a=this.json(d))+"&"),t+="signTimestamp="+e;else{let i=this.extend({signTimestamp:e},d);i=this.keysort(i),t+="\n"+this.urlencode(i),Object.keys(d).length&&(o+="?"+this.urlencode(d))}const s=this.hmac(this.encode(t),this.encode(this.secret),n.s,"base64");r={"Content-Type":"application/json",key:this.apiKey,signTimestamp:e,signature:s}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeString(n,"code");if(void 0!==c&&"200"!==c){const e=n.code,t=this.safeString(n,"message"),i=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,i),this.throwBroadlyMatchedException(this.exceptions.broad,t,i),new r.ExchangeError(i)}}}
class d extends r.A{describe(){return this.deepExtend(super.describe(),{id:"poloniexfutures",name:"Poloniex Futures",countries:["US"],rateLimit:33.3,certified:!1,pro:!0,version:"v1",has:{CORS:void 0,spot:!1,margin:!0,swap:!0,future:!1,option:void 0,createOrder:!0,createStopOrder:!0,createTriggerOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchCurrencies:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchL3OrderBook:!0,fetchMarkets:!0,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrdersByStatus:!0,fetchPositions:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,setMarginMode:!0},timeframes:{"1m":1,"5m":5,"15m":15,"30m":30,"1h":60,"2h":120,"4h":480,"12h":720,"1d":1440,"1w":10080},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766817-e9456312-5ee6-11e7-9b3c-b628ca5626a5.jpg",api:{public:"https://futures-api.poloniex.com",private:"https://futures-api.poloniex.com"},www:"https://www.poloniex.com",doc:"https://api-docs.poloniex.com/futures/",fees:"https://poloniex.com/fee-schedule",referral:"https://poloniex.com/signup?c=UBFZJRPJ"},api:{public:{get:{"contracts/active":10,"contracts/{symbol}":10,ticker:10,tickers:10,"level2/snapshot":180.002,"level2/depth":180.002,"level2/message/query":180.002,"level3/snapshot":180.002,"trade/history":10,"interest/query":10,"index/query":10,"mark-price/{symbol}/current":10,"premium/query":10,"funding-rate/{symbol}/current":10,timestamp:10,status:10,"kline/query":10},post:{"bullet-public":10}},private:{get:{"account-overview":1,"transaction-history":1,maxActiveOrders:1,maxRiskLimit:1,userFeeRate:1,"marginType/query":1,orders:1,stopOrders:1,recentDoneOrders:1,"orders/{order-id}":1,"clientOrderId/{clientOid}":1,fills:1,openOrderStatistics:1,position:1.5,positions:1.5,"funding-history":1},post:{orders:1.5,batchOrders:1.5,"position/margin/auto-deposit-status":1.5,"position/margin/deposit-margin":1.5,"position/margin/withdraw-margin":1.5,"bullet-private":1,"marginType/change":1},delete:{"orders/{order-id}":1.5,orders:150.016,stopOrders:150.016}}},precisionMode:a.kb,fees:{trading:{tierBased:!1,percentage:!0,taker:this.parseNumber("0.00075"),maker:this.parseNumber("0.0001")},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{}}},commonCurrencies:{},requiredCredentials:{apiKey:!0,secret:!0,password:!0},options:{networks:{OMNI:"omni",ERC20:"eth",TRC20:"trx"},versions:{public:{GET:{ticker:"v2",tickers:"v2","level3/snapshot":"v2"}}}},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},triggerDirection:!0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,leverage:!0,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,trailing:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:7,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:200}},spot:void 0,swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{400:o.BadRequest,401:o.AuthenticationError,403:o.NotSupported,404:o.NotSupported,405:o.NotSupported,415:o.BadRequest,429:o.RateLimitExceeded,500:o.ExchangeNotAvailable,503:o.ExchangeNotAvailable,400001:o.AuthenticationError,400002:o.InvalidNonce,400003:o.AuthenticationError,400004:o.AuthenticationError,400005:o.AuthenticationError,400006:o.AuthenticationError,400007:o.AuthenticationError,404e3:o.NotSupported,400100:o.BadRequest,411100:o.AccountSuspended,5e5:o.ExchangeNotAvailable},broad:{"Position does not exist":o.OrderNotFound}}})}async fetchMarkets(e={}){const t=await this.publicGetContractsActive(e),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString(e,"baseCurrency"),r=this.safeString(e,"quoteCurrency"),a=this.safeString(e,"rootSymbol"),o=this.safeCurrencyCode(i),n=this.safeCurrencyCode(r),d=this.safeCurrencyCode(a),h=o+"/"+n+":"+d,c=this.safeValue(e,"isInverse"),l=this.safeString(e,"status"),u=this.safeString(e,"multiplier"),f=this.safeNumber(e,"indexPriceTickSize"),p=this.safeNumber(e,"lotSize"),m=this.safeNumber(e,"maxOrderQty"),g=this.safeNumber(e,"maxPrice");return{id:t,symbol:h,base:o,quote:n,settle:d,baseId:i,quoteId:r,settleId:a,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:"Open"===l,contract:!0,linear:!c,inverse:c,taker:this.safeNumber(e,"takerFeeRate"),maker:this.safeNumber(e,"makerFeeRate"),contractSize:this.parseNumber(s.Y.stringAbs(u)),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:p,price:f},limits:{leverage:{min:this.parseNumber("1"),max:this.safeNumber(e,"maxLeverage")},amount:{min:p,max:m},price:{min:f,max:g},cost:{min:void 0,max:void 0}},created:this.safeInteger(e,"firstOpenDate"),info:e}}parseTicker(e,t=void 0){const i=this.safeString(e,"symbol"),r=this.safeSymbol(i,t),a=this.safeString(e,"ts");let o;o=16===a.length?.001:17===a.length?1e-4:18===a.length?1e-5:1e-6;const n=this.safeIntegerProduct(e,"ts",o),d=this.safeString2(e,"price","lastPrice"),h=s.Y.stringMul(this.safeString(e,"priceChgPct"),"100");return this.safeTicker({symbol:r,timestamp:n,datetime:this.iso8601(n),high:void 0,low:void 0,bid:this.safeString(e,"bestBidPrice"),bidVolume:this.safeString(e,"bestBidSize"),ask:this.safeString(e,"bestAskPrice"),askVolume:this.safeString(e,"bestAskSize"),vwap:void 0,open:void 0,close:d,last:d,previousClose:void 0,change:void 0,percentage:h,average:void 0,baseVolume:this.safeString2(e,"size","volume"),quoteVolume:this.safeString(e,"turnover"),info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetTicker(this.extend(s,t));return this.parseTicker(this.safeValue(r,"data",{}),i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetTickers(t),s=this.safeList(i,"data",[]);return this.parseTickers(s,e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeNumber(i,"level");if(i=this.omit(i,"level"),void 0!==s&&2!==s&&3!==s)throw new o.BadRequest(this.id+" fetchOrderBook() can only return level 2 & 3");const r=this.market(e),a={symbol:r.id};let n;n=3===s?await this.publicGetLevel3Snapshot(this.extend(a,i)):await this.publicGetLevel2Snapshot(this.extend(a,i));const d=this.safeValue(n,"data",{}),h=this.safeIntegerProduct(d,"ts",1e-6);let c;return c=3===s?this.parseOrderBook(d,r.symbol,h,"bids","asks",1,2):this.parseOrderBook(d,r.symbol,h,"bids","asks",0,1),c.nonce=this.safeInteger(d,"sequence"),c}async fetchL3OrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e);return this.fetchOrderBook(s.id,void 0,{level:3})}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,"-");const s=this.safeString(e,"tradeId"),r=this.safeString(e,"orderId"),a=this.safeString(e,"liquidity");let o=this.safeInteger(e,"ts");void 0!==o?o=this.parseToInt(o/1e6):(o=this.safeInteger(e,"createdAt"),"dealValue"in e&&void 0!==o&&(o*=1e3));const n=this.safeString(e,"price"),d=this.safeString(e,"size"),h=this.safeString(e,"side");let c;const l=this.safeString(e,"fee");if(void 0!==l){const i=this.safeString(e,"feeCurrency");let s=this.safeCurrencyCode(i);void 0===s&&(s="sell"===h?t.quote:t.base),c={cost:l,currency:s,rate:this.safeString(e,"feeRate")}}let u=this.safeString(e,"orderType");"match"===u&&(u=void 0);const f=this.safeString(e,"value");return this.safeTrade({info:e,id:s,order:r,timestamp:o,datetime:this.iso8601(o),symbol:t.symbol,type:u,takerOrMaker:a,side:h,price:n,amount:d,cost:f,fee:c},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id},o=await this.publicGetTradeHistory(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}async fetchTime(e={}){const t=await this.publicGetTimestamp(e);return this.safeInteger(t,"data")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=a.id,n=this.safeInteger(this.timeframes,t),d={symbol:o};d.granularity=void 0!==n?n:t;const h=1e3*this.parseTimeframe(t);let c=this.milliseconds();void 0!==i?(d.from=i,void 0===s&&(s=this.safeInteger(this.options,"fetchOHLCVLimit",200)),c=this.sum(i,s*h),d.to=c):void 0!==s&&(i=c-s*h,d.from=i);const l=await this.publicGetKlineQuery(this.extend(d,r)),u=this.safeList(l,"data",[]);return this.parseOHLCVs(u,a,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeValue(e,"data"),s=this.safeString(i,"currency"),r=this.safeCurrencyCode(s),a=this.account();return a.free=this.safeString(i,"availableBalance"),a.total=this.safeString(i,"accountEquity"),t[r]=a,this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString(e,"currency");let i={};if(void 0!==t){i={currency:this.currency(t).id}}const s=await this.privateGetAccountOverview(this.extend(i,e));return this.parseBalance(s)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const n=this.market(e),d=this.safeString2(a,"clientOid","clientOrderId",this.uuid());if(a=this.omit(a,["clientOid","clientOrderId"]),s<1)throw new o.InvalidOrder(this.id+" createOrder() minimum contract order amount is 1");const h=parseInt(this.amountToPrecision(e,s)),c={clientOid:d,side:i,symbol:n.id,type:t,size:h,leverage:1},l=this.safeValue2(a,"triggerPrice","stopPrice");if(l){c.stop="buy"===i?"up":"down";const t=this.safeString(a,"stopPriceType","TP");c.stopPriceType=t,c.stopPrice=this.priceToPrecision(e,l)}const u=this.safeStringUpper(a,"timeInForce");if("limit"===t){if(void 0===r)throw new o.ArgumentsRequired(this.id+" createOrder() requires a price argument for limit orders");c.price=this.priceToPrecision(e,r),void 0!==u&&(c.timeInForce=u)}const f=this.safeBool(a,"postOnly",!1),p=this.safeValue(a,"hidden");if(f&&void 0!==p)throw new o.BadRequest(this.id+" createOrder() does not support the postOnly parameter together with a hidden parameter");if(this.safeValue(a,"iceberg")){if(void 0===this.safeValue(a,"visibleSize"))throw new o.ArgumentsRequired(this.id+" createOrder() requires a visibleSize parameter for iceberg orders")}a=this.omit(a,["timeInForce","stopPrice","triggerPrice"]);const m=await this.privatePostOrders(this.extend(c,a)),g=this.safeValue(m,"data",{});return this.safeOrder({id:this.safeString(g,"orderId"),clientOrderId:void 0,timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,symbol:void 0,type:void 0,side:void 0,price:void 0,amount:void 0,cost:void 0,average:void 0,filled:void 0,remaining:void 0,status:void 0,fee:void 0,trades:void 0,timeInForce:void 0,postOnly:void 0,triggerPrice:void 0,info:m},n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={"order-id":e},r=await this.privateDeleteOrdersOrderId(this.extend(s,i)),a=this.safeValue(r,"data");if(0===this.safeValue(a,"cancelledOrderIds").length)throw new o.InvalidOrder(this.id+" cancelOrder() order already cancelled");return this.parseOrder(a)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetPositions(t),s=this.safeList(i,"data");return this.parsePositions(s,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const r=this.safeInteger(e,"currentTimestamp"),a=this.safeString(e,"currentQty");let o;s.Y.stringGt(a,"0")?o="long":s.Y.stringLt(a,"0")&&(o="short");const n=s.Y.stringAbs(this.safeString(e,"posCost")),d=this.safeString(e,"posInit"),h=s.Y.stringDiv(d,n),c=this.safeString(e,"unrealisedPnl"),l=this.safeValue(e,"crossMode")?"cross":"isolated";return{info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:r,datetime:this.iso8601(r),initialMargin:this.parseNumber(d),initialMarginPercentage:this.parseNumber(h),maintenanceMargin:this.safeNumber(e,"posMaint"),maintenanceMarginPercentage:this.safeNumber(e,"maintMarginReq"),entryPrice:this.safeNumber(e,"avgEntryPrice"),notional:this.parseNumber(n),leverage:this.safeNumber(e,"realLeverage"),unrealizedPnl:this.parseNumber(c),contracts:this.parseNumber(s.Y.stringAbs(a)),contractSize:this.safeValue(t,"contractSize"),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"liquidationPrice"),markPrice:this.safeNumber(e,"markPrice"),collateral:this.safeNumber(e,"maintMargin"),marginMode:l,side:o,percentage:this.parseNumber(s.Y.stringDiv(c,d)),stopLossPrice:void 0,takeProfitPrice:void 0}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");await this.loadMarkets();const r={symbol:this.market(e).id};void 0!==t&&(r.startAt=t),void 0!==i&&(r.maxCount=i);const a=await this.privateGetFundingHistory(this.extend(r,s)),n=this.safeValue(a,"data"),d=this.safeValue(n,"dataList",[]),h=d.length,c=[];for(let t=0;t<h;t++){const i=d[t],s=this.safeInteger(i,"timePoint");c.push({info:i,symbol:e,code:this.safeCurrencyCode(this.safeString(i,"settleCurrency")),timestamp:s,datetime:this.iso8601(s),id:this.safeNumber(i,"id"),amount:this.safeNumber(i,"funding"),fundingRate:this.safeNumber(i,"fundingRate"),markPrice:this.safeNumber(i,"markPrice"),positionQty:this.safeNumber(i,"positionQty"),positionCost:this.safeNumber(i,"positionCost")})}return c}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};void 0!==e&&(i.symbol=this.marketId(e));const s=this.safeValue2(t,"stop","trigger");let r;t=this.omit(t,["stop","trigger"]),r=s?await this.privateDeleteStopOrders(this.extend(i,t)):await this.privateDeleteOrders(this.extend(i,t));const a=this.safeValue(r,"data"),o=[],n=this.safeValue(a,"cancelledOrderIds"),d=n.length;for(let e=0;e<d;e++){const t=this.safeString(n,e);o.push(this.safeOrder({id:t,clientOrderId:void 0,timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,symbol:void 0,type:void 0,side:void 0,price:void 0,amount:void 0,cost:void 0,average:void 0,filled:void 0,remaining:void 0,status:void 0,fee:void 0,trades:void 0,timeInForce:void 0,postOnly:void 0,triggerPrice:void 0,info:r}))}return o}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.safeValue2(r,"stop","trigger"),n=this.safeInteger(r,"until");r=this.omit(r,["trigger","stop","until"]),"closed"===e&&(e="done");const d={};if(a){if("open"!==e)throw new o.BadRequest(this.id+" fetchOrdersByStatus() can only fetch untriggered stop orders")}else d.status="open"===e?"active":"done";let h,c;void 0!==t&&(h=this.market(t),d.symbol=h.id),void 0!==i&&(d.startAt=i),void 0!==n&&(d.endAt=n),c=a?await this.privateGetStopOrders(this.extend(d,r)):await this.privateGetOrders(this.extend(d,r));const l=this.safeValue(c,"data",{}),u=this.safeValue(l,"items",[]),f=u.length,p=[];for(let t=0;t<f;t++){const i=u[t];e===this.safeString(i,"status")&&p.push(u[t])}return this.parseOrders(p,h,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("open",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("closed",e,t,i,s)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={};let r;if(void 0===e){const e=this.safeString2(i,"clientOid","clientOrderId");if(void 0===e)throw new o.InvalidOrder(this.id+" fetchOrder() requires parameter id or params.clientOid");s.clientOid=e,i=this.omit(i,["clientOid","clientOrderId"]),r=await this.privateGetClientOrderIdClientOid(this.extend(s,i))}else s["order-id"]=e,r=await this.privateGetOrdersOrderId(this.extend(s,i));const a=void 0!==t?this.market(t):void 0,n=this.safeDict(r,"data");return this.parseOrder(n,a)}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const r=this.safeInteger(e,"createdAt"),a=this.safeString(e,"feeCurrency"),o=this.safeString(e,"dealSize"),n=this.safeString2(e,"dealFunds","filledValue");let d;if(s.Y.stringGt(o,"0")){const e=this.safeString(t,"contractSize");d=t.linear?s.Y.stringDiv(n,s.Y.stringMul(e,o)):s.Y.stringDiv(s.Y.stringMul(e,o),n)}const h=this.safeBool(e,"isActive",!1),c=this.safeBool(e,"cancelExist",!1),l=h?"open":"closed";let u=this.safeString(e,"id");if("cancelledOrderIds"in e){const t=this.safeValue(e,"cancelledOrderIds");u=this.safeString(t,0)}return this.safeOrder({info:e,id:u,clientOrderId:this.safeString(e,"clientOid"),symbol:this.safeString(t,"symbol"),type:this.safeString(e,"type"),timeInForce:this.safeString(e,"timeInForce"),postOnly:this.safeValue(e,"postOnly"),side:this.safeString(e,"side"),amount:this.safeString(e,"size"),price:this.safeString(e,"price"),triggerPrice:this.safeString(e,"stopPrice"),cost:this.safeString(e,"dealValue"),filled:o,remaining:void 0,timestamp:r,datetime:this.iso8601(r),fee:{currency:this.safeCurrencyCode(a),cost:this.safeString(e,"fee")},status:c?"canceled":l,lastTradeTimestamp:void 0,average:d,trades:void 0},t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.publicGetFundingRateSymbolCurrent(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseFundingRate(a,i)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}parseFundingRate(e,t=void 0){const i=this.safeInteger(e,"timePoint"),s=this.safeString(e,"symbol");return{info:e,symbol:this.safeSymbol(s,t,void 0,"contract"),markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"value"),fundingTimestamp:i,fundingDatetime:this.iso8601(i),nextFundingRate:this.safeNumber(e,"predictedValue"),nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:this.parseFundingInterval(this.safeString(e,"granularity"))}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==t&&(r.startAt=t);const o=await this.privateGetFills(this.extend(r,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"items",[]);return this.parseTrades(d,a,t,i)}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");if("0"!==e&&"1"!==e&&"isolated"!==e&&"cross"!==e)throw new o.ArgumentsRequired(this.id+" setMarginMode() marginMode must be 0/isolated or 1/cross");await this.loadMarkets(),"isolated"===e&&(e="0"),"cross"===e&&(e="1");const s={symbol:this.market(t).id,marginType:this.parseToInt(e)};return await this.privatePostMarginTypeChange(s)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t];const d=this.safeValue(this.options,"versions",{}),h=this.safeValue(d,t,{}),c=this.safeValue(h,i,{}),l=this.safeString(c,e,this.version);o+="/api/"+this.safeString(s,"version",l)+"/"+this.implodeParams(e,s);const u=this.omit(s,this.extractParams(e)),f=Object.keys(u).length;if("public"===t)f&&(o+="?"+this.urlencode(u));else{this.checkRequiredCredentials();let t="/api/v1/"+this.implodeParams(e,s);const d=this.urlencode(u);"GET"!==i&&"HEAD"!==i?a=u:f&&""!==d&&(o+="?"+d,t+="?"+d);const h=this.milliseconds().toString();let c="";void 0!==a&&(c=a=this.json(u));const l=h+i+t+c;(r={"PF-API-SIGN":this.hmac(this.encode(l),this.encode(this.secret),n.s,"base64"),"PF-API-TIMESTAMP":h,"PF-API-KEY":this.apiKey,"PF-API-PASSPHRASE":this.password})["Content-Type"]="application/json"}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(!o)return void this.throwBroadlyMatchedException(this.exceptions.broad,a,a);const h=this.safeString(o,"code"),c=this.safeString(o,"msg",""),l=this.id+" "+c;this.throwExactlyMatchedException(this.exceptions.exact,c,l),this.throwExactlyMatchedException(this.exceptions.exact,h,l),this.throwBroadlyMatchedException(this.exceptions.broad,a,l)}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"probit",name:"ProBit",countries:["SC","KR"],rateLimit:50,pro:!0,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,createMarketBuyOrderWithCost:!0,createMarketOrder:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactions:"emulated",fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,signIn:!0,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","10m":"10m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","6h":"6h","12h":"12h","1d":"1D","1w":"1W","1M":"1M"},version:"v1",urls:{logo:"https://user-images.githubusercontent.com/51840849/79268032-c4379480-7ea2-11ea-80b3-dd96bb29fd0d.jpg",api:{accounts:"https://accounts.probit.com",public:"https://api.probit.com/api/exchange",private:"https://api.probit.com/api/exchange"},www:"https://www.probit.com",doc:["https://docs-en.probit.com","https://docs-ko.probit.com"],fees:"https://support.probit.com/hc/en-us/articles/360020968611-Trading-Fees",referral:"https://www.probit.com/r/34608773"},api:{public:{get:{market:1,currency:1,currency_with_platform:1,time:1,ticker:1,order_book:1,trade:1,candle:1}},private:{post:{new_order:2,cancel_order:1,withdrawal:2},get:{balance:1,order:1,open_order:1,order_history:1,trade_history:1,deposit_address:1,"transfer/payment":1}},accounts:{post:{token:1}}},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:90,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:4e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},exceptions:{exact:{UNAUTHORIZED:r.AuthenticationError,INVALID_ARGUMENT:r.BadRequest,TRADING_UNAVAILABLE:r.ExchangeNotAvailable,NOT_ENOUGH_BALANCE:r.InsufficientFunds,NOT_ALLOWED_COMBINATION:r.BadRequest,INVALID_ORDER:r.InvalidOrder,RATE_LIMIT_EXCEEDED:r.RateLimitExceeded,MARKET_UNAVAILABLE:r.ExchangeNotAvailable,INVALID_MARKET:r.BadSymbol,MARKET_CLOSED:r.MarketClosed,MARKET_NOT_FOUND:r.BadSymbol,INVALID_CURRENCY:r.BadRequest,TOO_MANY_OPEN_ORDERS:r.DDoSProtection,DUPLICATE_ADDRESS:r.InvalidAddress,invalid_grant:r.AuthenticationError}},requiredCredentials:{apiKey:!0,secret:!0},precisionMode:o.kb,options:{createMarketBuyOrderRequiresPrice:!0,timeInForce:{limit:"gtc",market:"ioc"},networks:{BEP20:"BSC",ERC20:"ETH",TRC20:"TRON"}},commonCurrencies:{BB:"Baby Bali",CBC:"CryptoBharatCoin",CTK:"Cryptyk",CTT:"Castweet",DKT:"DAKOTA",EGC:"EcoG9coin",EPS:"Epanus",FX:"Fanzy",GM:"GM Holding",GOGOL:"GOL",GOL:"Goldofir",HUSL:"The Hustle App",LAND:"Landbox",SST:"SocialSwap",TCT:"Top Coin Token",TOR:"Torex",UNI:"UNICORN Token",UNISWAP:"UNI"}})}async fetchMarkets(e={}){const t=await this.publicGetMarket(e),i=this.safeValue(t,"data",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"id"),i=this.safeString(e,"base_currency_id"),s=this.safeString(e,"quote_currency_id"),r=this.safeCurrencyCode(i),o=this.safeCurrencyCode(s),n=this.safeBool(e,"closed",!1),d=this.safeBool(e,"show_in_ui",!0),h=!n&&d,c=this.safeString(e,"taker_fee_rate"),l=a.Y.stringDiv(c,"100"),u=this.safeString(e,"maker_fee_rate"),f=a.Y.stringDiv(u,"100");return{id:t,symbol:r+"/"+o,base:r,quote:o,settle:void 0,baseId:i,quoteId:s,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:h,contract:!1,linear:void 0,inverse:void 0,taker:this.parseNumber(l),maker:this.parseNumber(f),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(e,"quantity_precision"))),price:this.safeNumber(e,"price_increment"),cost:this.parseNumber(this.parsePrecision(this.safeString(e,"cost_precision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"min_quantity"),max:this.safeNumber(e,"max_quantity")},price:{min:this.safeNumber(e,"min_price"),max:this.safeNumber(e,"max_price")},cost:{min:this.safeNumber(e,"min_cost"),max:this.safeNumber(e,"max_cost")}},created:void 0,info:e}}async fetchCurrencies(e={}){const t=await this.publicGetCurrencyWithPlatform(e),i=this.safeValue(t,"data",[]),s={};for(let e=0;e<i.length;e++){const t=i[e],r=this.safeString(t,"id"),a=this.safeCurrencyCode(r),o=this.safeValue(t,"display_name"),n=this.safeString(o,"en-us"),d=this.safeValue(t,"platform",[]),h=this.sortBy(d,"priority");let c;const l={};for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"id"),s=this.networkIdToCode(i),a=!this.safeValue(t,"deposit_suspended"),o=!this.safeValue(t,"withdrawal_suspended"),n=a&&o;n&&(c=t);const d=this.parsePrecision(this.safeString(t,"precision")),u=this.safeValue(t,"withdrawal_fee",[]);let f=this.safeValue(u,0,{});for(let e=0;e<u.length;e++){const t=u[e];if(this.safeString(t,"currency_id")===r){f=t;break}}l[s]={id:i,network:s,active:n,deposit:a,withdraw:o,fee:this.safeNumber(f,"amount"),precision:this.parseNumber(d),limits:{withdraw:{min:this.safeNumber(t,"min_withdrawal_amount"),max:void 0},deposit:{min:this.safeNumber(t,"min_deposit_amount"),max:void 0}},info:t}}void 0===c&&(c=this.safeValue(h,0,{}));const u=!this.safeValue(c,"deposit_suspended"),f=!this.safeValue(c,"withdrawal_suspended"),p=u&&f,m=this.safeValue(c,"withdrawal_fee",{}),g=[];for(let e=0;e<m.length;e++){const t=m[e],i=this.safeNumber(t,"amount"),s=this.safeInteger(t,"priority");void 0!==i&&void 0!==s&&g.push(t)}const v=this.sortBy(g,"priority"),y=this.safeValue(v,0,{}),w=this.safeNumber(y,"amount");s[a]={id:r,code:a,info:t,name:n,active:p,deposit:u,withdraw:f,fee:w,precision:this.parseNumber(this.parsePrecision(this.safeString(c,"precision"))),limits:{amount:{min:void 0,max:void 0},deposit:{min:this.safeNumber(c,"min_deposit_amount"),max:void 0},withdraw:{min:this.safeNumber(c,"min_withdrawal_amount"),max:void 0}},networks:l}}return s}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0},i=this.safeValue(e,"data",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeString(s,"currency_id"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"total"),o.free=this.safeString(s,"available"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={market_id:s.id},a=await this.publicGetOrderBook(this.extend(r,i)),o=this.safeValue(a,"data",[]),n=this.groupBy(o,"side");return this.parseOrderBook(n,s.symbol,void 0,"buy","sell","price","quantity")}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i={};if(void 0!==e){const t=this.marketIds(e);i.market_ids=t.join(",")}const s=await this.publicGetTicker(this.extend(i,t)),r=this.safeList(s,"data",[]);return this.parseTickers(r,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market_ids:i.id},a=await this.publicGetTicker(this.extend(s,t)),o=this.safeValue(a,"data",[]),n=this.safeValue(o,0);if(void 0===n)throw new r.BadResponse(this.id+" fetchTicker() returned an empty response");return this.parseTicker(n,i)}parseTicker(e,t=void 0){const i=this.parse8601(this.safeString(e,"time")),s=this.safeString(e,"market_id"),r=this.safeSymbol(s,t,"-"),a=this.safeString(e,"last"),o=this.safeString(e,"change"),n=this.safeString(e,"base_volume"),d=this.safeString(e,"quote_volume");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:void 0,close:a,last:a,previousClose:void 0,change:o,percentage:void 0,average:void 0,baseVolume:n,quoteVolume:d,info:e},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a=this.milliseconds(),o={limit:100,start_time:this.iso8601(a-31536e6),end_time:this.iso8601(a)};void 0!==e&&(r=this.market(e),o.market_id=r.id),void 0!==t&&(o.start_time=this.iso8601(t),o.end_time=this.iso8601(Math.min(a,t+31536e6))),void 0!==i&&(o.limit=i);const n=await this.privateGetTradeHistory(this.extend(o,s)),d=this.safeList(n,"data",[]);return this.parseTrades(d,r,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market_id:r.id,start_time:"1970-01-01T00:00:00.000Z",end_time:this.iso8601(this.milliseconds())};void 0!==t&&(a.start_time=this.iso8601(t)),a.limit=void 0!==i?Math.min(i,1e3):1e3;const o=await this.publicGetTrade(this.extend(a,s)),n=this.safeList(o,"data",[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.parse8601(this.safeString(e,"time")),s=this.safeString(e,"id");let r;if(void 0!==s){const e=s.split(":");r=this.safeString(e,0)}r=this.safeString(e,"market_id",r);const a=this.safeSymbol(r,t,"-"),o=this.safeString(e,"side"),n=this.safeString(e,"price"),d=this.safeString(e,"quantity"),h=this.safeString(e,"order_id"),c=this.safeString(e,"fee_amount");let l;if(void 0!==c){const t=this.safeString(e,"fee_currency_id");l={cost:c,currency:this.safeCurrencyCode(t)}}return this.safeTrade({id:s,info:e,timestamp:i,datetime:this.iso8601(i),symbol:a,order:h,type:void 0,side:o,takerOrMaker:void 0,price:n,amount:d,cost:void 0,fee:l},t)}async fetchTime(e={}){const t=await this.publicGetTime(e);return this.parse8601(this.safeString(t,"data"))}normalizeOHLCVTimestamp(e,t,i=!1){const s=this.parseTimeframe(t);if("1M"===t){const t=this.iso8601(e).split("-"),s=this.safeString(t,0),r=this.safeInteger(t,1);let a;return i&&(a=this.sum(r,1).toString()),r<10&&(a="0"+r.toString()),s+"-"+a+"-01T00:00:00.000Z"}if("1w"===t){const t=259200,r=(e=this.parseToInt(e/1e3))-t,a=Math.floor(r/s);let o=this.sum(t,a*s);return i&&(o=this.sum(o,s)),this.iso8601(1e3*o)}return e=this.parseToInt(e/1e3),e=s*this.parseToInt(e/s),i&&(e=this.sum(e,s)),this.iso8601(1e3*e)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(this.timeframes,t,t);s=void 0===s?100:s;let n=this.sum(s,1);n=Math.min(1e3,n);const d={market_ids:a.id,interval:o,sort:"asc",limit:n},h=this.milliseconds(),c=this.safeInteger(r,"until"),l=1e3*this.parseTimeframe(t);let u=i,f=void 0!==c?c-l:h;if(void 0===i){void 0===s&&(s=n);u=f-(s-1)*l}else if(void 0!==s){const e=this.sum(i,s*l);f=Math.min(f,e)}const p=this.normalizeOHLCVTimestamp(u,t),m=this.normalizeOHLCVTimestamp(f,t,!0);d.start_time=p,d.end_time=m;const g=await this.publicGetCandle(this.extend(d,r)),v=this.safeList(g,"data",[]);return this.parseOHLCVs(v,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"start_time")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"base_volume")]}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets(),t=this.parse8601(t);const r={};let a;void 0!==e&&(a=this.market(e),r.market_id=a.id);const o=await this.privateGetOpenOrder(this.extend(r,s)),n=this.safeList(o,"data");return this.parseOrders(n,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={start_time:this.iso8601(0),end_time:this.iso8601(this.milliseconds()),limit:100};let a;void 0!==e&&(a=this.market(e),r.market_id=a.id),t&&(r.start_time=this.iso8601(t)),i&&(r.limit=i);const o=await this.privateGetOrderHistory(this.extend(r,s)),n=this.safeList(o,"data");return this.parseOrders(n,a,t,i)}async fetchOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" fetchOrder() requires a symbol argument");await this.loadMarkets();const s=this.market(t),a={market_id:s.id},o=this.safeString2(i,"clientOrderId","client_order_id");void 0!==o?a.client_order_id=o:a.order_id=e;const n=this.omit(i,["clientOrderId","client_order_id"]),d=await this.privateGetOrder(this.extend(a,n)),h=this.safeValue(d,"data",[]),c=this.safeDict(h,0);return this.parseOrder(c,s)}parseOrderStatus(e){return this.safeString({open:"open",cancelled:"canceled",filled:"closed"},e,e)}parseOrder(e,t=void 0){const i=this.parseOrderStatus(this.safeString(e,"status")),s=this.safeString(e,"id"),r=this.safeString(e,"type"),o=this.safeString(e,"side"),n=this.safeString(e,"market_id"),d=this.safeSymbol(n,t,"-"),h=this.parse8601(this.safeString(e,"time"));let c=this.safeString(e,"limit_price");const l=this.safeString(e,"filled_quantity");let u=this.safeString(e,"open_quantity");const f=this.safeString(e,"cancelled_quantity");void 0!==f&&(u=a.Y.stringAdd(u,f));const p=this.safeString(e,"quantity",a.Y.stringAdd(l,u)),m=this.safeString2(e,"filled_cost","cost");"market"===r&&(c=void 0);const g=this.safeString(e,"client_order_id"),v=this.safeStringUpper(e,"time_in_force");return this.safeOrder({id:s,info:e,clientOrderId:g,timestamp:h,datetime:this.iso8601(h),lastTradeTimestamp:void 0,symbol:d,type:r,timeInForce:v,side:o,status:i,price:c,triggerPrice:void 0,amount:p,filled:l,remaining:u,average:void 0,cost:m,fee:void 0,trades:void 0},t)}costToPrecision(e,t){return this.decimalToPrecision(t,o.R3,this.markets[e].precision.cost,this.precisionMode)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e),h=this.safeValue(this.options,"timeInForce"),c=this.safeValue(h,t),l=this.safeString2(n,"timeInForce","time_in_force",c),u={market_id:d.id,type:t,side:i,time_in_force:l},f=this.safeString2(n,"clientOrderId","client_order_id");let p;if(void 0!==f&&(u.client_order_id=f),"limit"===t)u.limit_price=this.priceToPrecision(e,o),u.quantity=this.amountToPrecision(e,s);else if("market"===t)if("buy"===i){let t=!0;[t,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const i=this.safeString(n,"cost");if(n=this.omit(n,"cost"),void 0!==i)p=this.costToPrecision(e,i);else if(t){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument");{const t=this.numberToString(s),i=this.numberToString(o),r=a.Y.stringMul(t,i);p=this.costToPrecision(e,r)}}else p=this.costToPrecision(e,s);u.cost=p}else u.quantity=this.amountToPrecision(e,s);const m=this.omit(n,["timeInForce","time_in_force","clientOrderId","client_order_id"]),g=await this.privatePostNewOrder(this.extend(u,m)),v=this.safeValue(g,"data"),y=this.parseOrder(v,d);return"market"===t&&"buy"===i&&(y.amount=void 0,y.cost=this.parseNumber(p),y.remaining=void 0),y}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s={market_id:this.market(t).id,order_id:e},a=await this.privatePostCancelOrder(this.extend(s,i)),o=this.safeDict(a,"data");return this.parseOrder(o)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address"),s=this.safeString(e,"destination_tag"),r=this.safeString(e,"currency_id"),a=(t=this.safeCurrency(r,t)).code,o=this.safeString(e,"platform_id");return this.checkAddress(i),{info:e,currency:a,network:o,address:i,tag:s}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency_id:i.id},a=this.safeValue(this.options,"networks",{});let o=this.safeStringUpper(t,"network");o=this.safeString(a,o,o),void 0!==o&&(s.platform_id=o,t=this.omit(t,"platform_id"));const n=await this.privateGetDepositAddress(this.extend(s,t)),d=this.safeValue(n,"data",[]),h=this.safeValue(d,0);if(void 0===h)throw new r.InvalidAddress(this.id+" fetchDepositAddress() returned an empty response");return this.parseDepositAddress(h,i)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i={};if(e){const t=[];for(let i=0;i<e.length;i++){const s=this.currency(e[i]);t.push(s.id)}i.currency_id=e.join(",")}const s=await this.privateGetDepositAddress(this.extend(i,t)),r=this.safeList(s,"data",[]);return this.parseDepositAddresses(r,e)}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const a=this.currency(e);void 0===s&&(s="");const o={currency_id:a.id,address:i,destination_tag:s,amount:this.numberToString(t)},n=this.safeValue(this.options,"networks",{});let d=this.safeStringUpper(r,"network");d=this.safeString(n,d,d),void 0!==d&&(o.platform_id=d,r=this.omit(r,"network"));const h=await this.privatePostWithdrawal(this.extend(o,r)),c=this.safeDict(h,"data");return this.parseTransaction(c,a)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactions(e,t,i,this.extend({type:"deposit"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchTransactions(e,t,i,this.extend({type:"withdrawal"},s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.currency(e),a.currency_id=r.id),a.start_time=void 0!==t?this.iso8601(t):this.iso8601(1);const o=this.safeInteger(s,"until");void 0!==o?(a.end_time=this.iso8601(o),s=this.omit(s,["until"])):a.end_time=this.iso8601(this.milliseconds()),a.limit=void 0!==i?i:100;const n=await this.privateGetTransferPayment(this.extend(a,s)),d=this.safeList(n,"data",[]);return this.parseTransactions(d,r,t,i)}parseTransaction(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeString(e,"platform_id"),r=this.networkIdToCode(s),a=this.safeNumber(e,"amount"),o=this.safeString(e,"address"),n=this.safeString(e,"destination_tag"),d=this.safeString(e,"hash"),h=this.parse8601(this.safeString(e,"time")),c=this.safeString(e,"type"),l=this.safeString(e,"currency_id"),u=this.safeCurrencyCode(l),f=this.parseTransactionStatus(this.safeString(e,"status")),p=this.safeString(e,"fee");let m;return void 0!==p&&"0"!==p&&(m={currency:u,cost:this.parseNumber(p)}),{id:i,currency:u,amount:a,network:r,addressFrom:void 0,address:o,addressTo:o,tagFrom:void 0,tag:n,tagTo:n,status:f,type:c,txid:d,timestamp:h,datetime:this.iso8601(h),updated:void 0,internal:void 0,comment:void 0,fee:m,info:e}}parseTransactionStatus(e){return this.safeString({requested:"pending",pending:"pending",confirming:"pending",confirmed:"pending",applying:"pending",done:"ok",cancelled:"canceled",cancelling:"canceled"},e,e)}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.publicGetCurrencyWithPlatform(t),s=this.safeList(i,"data");return this.parseDepositWithdrawFees(s,e,"id")}parseDepositWithdrawFee(e,t=void 0){const i=this.depositWithdrawFee({}),s=this.safeValue(e,"platform",[]),r={fee:void 0,percentage:void 0};for(let e=0;e<s.length;e++){const a=s[e],o=this.safeString(a,"id"),n=this.networkIdToCode(o,t.code),d=this.safeValue(a,"withdrawal_fee",{}),h=this.safeNumber(d[0],"amount");if(d.length){const t={fee:h,percentage:void 0===h&&void 0};0===e&&(i.withdraw=t),i.networks[n]={withdraw:t,deposit:r}}}return i.info=e,i}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},a=void 0,o=void 0){let n=this.urls.api[t]+"/";const d=this.omit(s,this.extractParams(e));if("accounts"===t){this.checkRequiredCredentials(),n+=this.implodeParams(e,s);const t=this.apiKey+":"+this.secret;a={Authorization:"Basic "+this.stringToBase64(t),"Content-Type":"application/json"},Object.keys(d).length&&(o=this.json(d))}else if(n+=this.version+"/","public"===t)n+=this.implodeParams(e,s),Object.keys(d).length&&(n+="?"+this.urlencode(d));else if("private"===t){const t=this.milliseconds();this.checkRequiredCredentials();const h=this.safeInteger(this.options,"expires");if(void 0===h||h<t)throw new r.AuthenticationError(this.id+" access token expired, call signIn() method");a={Authorization:"Bearer "+this.safeString(this.options,"accessToken")},n+=this.implodeParams(e,s),"GET"===i?Object.keys(d).length&&(n+="?"+this.urlencode(d)):Object.keys(d).length&&(o=this.json(d),a["Content-Type"]="application/json")}return{url:n,method:i,body:o,headers:a}}async signIn(e={}){this.checkRequiredCredentials();const t=await this.accountsPostToken(this.extend({grant_type:"client_credentials"},e)),i=this.safeInteger(t,"expires_in"),s=this.safeString(t,"access_token");return this.options.accessToken=s,this.options.expires=this.sum(this.milliseconds(),1e3*i),t}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&"errorCode"in n){const e=this.safeString(n,"errorCode");if(void 0!==e){const t=this.safeString(n,"message",""),i=this.safeValue(n,"details"),s=this.id+" "+e+" "+t+" "+this.json(i);throw"exact"in this.exceptions&&this.throwExactlyMatchedException(this.exceptions.exact,e,s),"broad"in this.exceptions&&this.throwBroadlyMatchedException(this.exceptions.broad,t,s),new r.ExchangeError(s)}}}}
class n extends s.A{describe(){return this.deepExtend(super.describe(),{id:"timex",name:"TimeX",countries:["AU"],version:"v1",rateLimit:1500,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,cancelOrders:!0,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,editOrder:!0,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!0,fetchWithdrawal:!1,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!1,setMarginMode:!1,setPositionMode:!1},timeframes:{"1m":"I1","5m":"I5","15m":"I15","30m":"I30","1h":"H1","2h":"H2","4h":"H4","6h":"H6","12h":"H12","1d":"D1","1w":"W1"},urls:{logo:"https://user-images.githubusercontent.com/1294454/70423869-6839ab00-1a7f-11ea-8f94-13ae72c31115.jpg",api:{rest:"https://plasma-relay-backend.timex.io"},www:"https://timex.io",doc:"https://plasma-relay-backend.timex.io/swagger-ui/index.html",referral:"https://timex.io/?refcode=1x27vNkTbP1uwkCck"},api:{addressbook:{get:["me"],post:["","id/{id}","id/{id}/remove"]},custody:{get:["credentials","credentials/h/{hash}","credentials/k/{key}","credentials/me","credentials/me/address","deposit-addresses","deposit-addresses/h/{hash}"]},history:{get:["orders","orders/details","orders/export/csv","trades","trades/export/csv"]},currencies:{get:["a/{address}","i/{id}","s/{symbol}"],post:["perform","prepare","remove/perform","s/{symbol}/remove/prepare","s/{symbol}/update/perform","s/{symbol}/update/prepare"]},manager:{get:["deposits","transfers","withdrawals"]},markets:{get:["i/{id}","s/{symbol}"],post:["perform","prepare","remove/perform","s/{symbol}/remove/prepare","s/{symbol}/update/perform","s/{symbol}/update/prepare"]},public:{get:["candles","currencies","markets","orderbook","orderbook/raw","orderbook/v2","tickers","trades"]},statistics:{get:["address"]},trading:{get:["balances","fees","orders"],post:["orders","orders/json"],put:["orders","orders/json"],delete:["orders","orders/json"]},tradingview:{get:["config","history","symbol_info","time"]}},precisionMode:o.kb,exceptions:{exact:{0:r.ExchangeError,1:r.NotSupported,4e3:r.BadRequest,4001:r.BadRequest,4002:r.InsufficientFunds,4003:r.AuthenticationError,4004:r.AuthenticationError,4005:r.BadRequest,4006:r.BadRequest,4007:r.BadRequest,4300:r.PermissionDenied,4100:r.AuthenticationError,4400:r.OrderNotFound,5001:r.InvalidOrder,5002:r.ExchangeError,400:r.BadRequest,401:r.AuthenticationError,403:r.PermissionDenied,404:r.OrderNotFound,429:r.RateLimitExceeded,500:r.ExchangeError,503:r.ExchangeNotAvailable},broad:{Insufficient:r.InsufficientFunds}},options:{expireIn:31536e3,fetchTickers:{period:"1d"},fetchTrades:{sort:"timestamp,asc"},fetchMyTrades:{sort:"timestamp,asc"},fetchOpenOrders:{sort:"createdAt,asc"},fetchClosedOrders:{sort:"createdAt,asc"},defaultSort:"timestamp,asc",defaultSortOrders:"createdAt,asc"},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchTime(e={}){const t=await this.tradingviewGetTime(e);return 1e3*this.parseToInt(t)}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e);return this.parseMarkets(t)}async fetchCurrencies(e={}){const t=await this.publicGetCurrencies(e);return this.parseCurrencies(t)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){const a=this.safeString(s,"address");if(s=this.omit(s,"address"),void 0===a)throw new r.ArgumentsRequired(this.id+" fetchDeposits() requires an address parameter");const o={address:a},n=await this.managerGetDeposits(this.extend(o,s)),d=this.safeCurrency(e);return this.parseTransactions(n,d,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){const a=this.safeString(s,"address");if(s=this.omit(s,"address"),void 0===a)throw new r.ArgumentsRequired(this.id+" fetchDeposits() requires an address parameter");const o={address:a},n=await this.managerGetWithdrawals(this.extend(o,s)),d=this.safeCurrency(e);return this.parseTransactions(n,d,t,i)}getCurrencyByAddress(e){const t=this.currencies;for(let i=0;i<t.length;i++){const s=t[i],r=this.safeValue(s,"info",{});if(this.safeString(r,"address")===e)return s}}parseTransaction(e,t=void 0){const i=this.safeString(e,"timestamp"),s=this.safeString(e,"token","");return t=this.getCurrencyByAddress(s),{info:e,id:this.safeString(e,"transferHash"),txid:this.safeString(e,"txid"),timestamp:this.parse8601(i),datetime:i,network:void 0,address:void 0,addressTo:this.safeString(e,"to"),addressFrom:this.safeString(e,"from"),tag:void 0,tagTo:void 0,tagFrom:void 0,type:void 0,amount:this.safeNumber(e,"value"),currency:this.safeCurrencyCode(void 0,t),status:"ok",updated:void 0,internal:void 0,comment:void 0,fee:void 0}}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=this.safeString(this.options.fetchTickers,"period","1d"),s={period:this.timeframes[i]},r=await this.publicGetTickers(this.extend(s,t));return this.parseTickers(r,e)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s=this.safeString(this.options.fetchTickers,"period","1d"),r={market:i.id,period:this.timeframes[s]},a=await this.publicGetTickers(this.extend(r,t)),o=this.safeDict(a,0);return this.parseTicker(o,i)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={market:this.market(e).id};void 0!==t&&(s.limit=t);const r=await this.publicGetOrderbookV2(this.extend(s,i)),a=this.parse8601(this.safeString(r,"timestamp"));return this.parseOrderBook(r,e,a,"bid","ask","price","baseTokenAmount")}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a=this.safeValue(this.options,"fetchTrades",{}),o=this.safeValue(a,"sort","timestamp,asc"),n=this.safeString(s,"sort",o),d=this.omit(s,"sort"),h={market:r.id,sort:n};void 0!==t&&(h.from=this.iso8601(t)),void 0!==i&&(h.size=i);const c=await this.publicGetTrades(this.extend(h,d));return this.parseTrades(c,r,t,i)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,period:this.safeString(this.timeframes,t,t)},n=this.parseTimeframe(t),d=this.safeInteger(r,"until");if(void 0===s&&(s=1e3),void 0!==i)o.from=this.iso8601(i),o.till=void 0===d?this.iso8601(this.sum(i,this.sum(s,1)*n*1e3)):this.iso8601(d);else if(void 0!==d){o.till=this.iso8601(d);const e=d-this.sum(s,1)*n*1e3;o.from=this.iso8601(e)}else{const e=this.milliseconds();o.till=this.iso8601(e),o.from=this.iso8601(e-this.sum(s,1)*n*1e3-1)}r=this.omit(r,"until");const h=await this.publicGetCandles(this.extend(o,r));return this.parseOHLCVs(h,a,t,i,s)}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.total=this.safeString(s,"totalBalance"),o.used=this.safeString(s,"lockedBalance"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.tradingGetBalances(e);return this.parseBalance(t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=i.toUpperCase();let h=t.toUpperCase();this.safeBool(o,"postOnly",!1)&&(h="POST_ONLY",o=this.omit(o,["postOnly"]));const c={symbol:n.id,quantity:this.amountToPrecision(e,s),side:d,orderTypes:h};let l=o;if("LIMIT"===h||"POST_ONLY"===h){c.price=this.priceToPrecision(e,a);const i=this.safeInteger(this.options,"expireIn"),s=this.safeValue(o,"expireTime"),n=this.safeValue(o,"expireIn",i);if(void 0!==s)c.expireTime=s;else{if(void 0===n)throw new r.InvalidOrder(this.id+" createOrder() method requires a expireTime or expireIn param for a "+t+" order, you can also set the expireIn exchange-wide option");c.expireIn=n}l=this.omit(o,["expireTime","expireIn"])}else c.price=0;const u=await this.tradingPostOrders(this.extend(c,l)),f=this.safeValue(u,"orders",[]),p=this.safeDict(f,0,{});return this.parseOrder(p,n)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={id:e};void 0!==r&&(d.quantity=this.amountToPrecision(t,r)),void 0!==a&&(d.price=this.priceToPrecision(t,a));const h=await this.tradingPutOrders(this.extend(d,o));if("unchangedOrders"in h){const e=this.safeValue(h,"unchangedOrders",[]),t=this.safeString(e,0);return this.safeOrder({id:t,info:h})}const c=this.safeValue(h,"changedOrders",[]),l=this.safeValue(c,0,{}),u=this.safeDict(l,"newOrder",{});return this.parseOrder(u,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s=await this.cancelOrders([e],t,i);return this.safeDict(s,0)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s={id:e},r=await this.tradingDeleteOrders(this.extend(s,i)),a=this.safeList(r,"changedOrders",[]),o=this.safeList(r,"unchangedOrders",[]),n=[];for(let e=0;e<a.length;e++){const t=this.safeDict(a[e],"newOrder");n.push(this.parseOrder(t))}for(let e=0;e<o.length;e++)n.push(this.safeOrder({info:o[e],id:o[e],status:"unchanged"}));return n}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={orderHash:e},r=await this.historyGetOrdersDetails(s),a=this.safeValue(r,"order",{}),o=this.safeList(r,"trades",[]);return this.parseOrder(this.extend(a,{trades:o}))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeValue(this.options,"fetchOpenOrders",{}),a=this.safeValue(r,"sort","createdAt,asc"),o=this.safeString(s,"sort",a),n=this.omit(s,"sort"),d={sort:o};let h;void 0!==e&&(h=this.market(e),d.symbol=h.id),void 0!==i&&(d.size=i);const c=await this.tradingGetOrders(this.extend(d,n)),l=this.safeList(c,"orders",[]);return this.parseOrders(l,h,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeValue(this.options,"fetchClosedOrders",{}),a=this.safeValue(r,"sort","createdAt,asc"),o=this.safeString(s,"sort",a),n=this.omit(s,"sort"),d={sort:o,side:"BUY"};let h;void 0!==e&&(h=this.market(e),d.symbol=h.id),void 0!==t&&(d.from=this.iso8601(t)),void 0!==i&&(d.size=i);const c=await this.historyGetOrders(this.extend(d,n)),l=this.safeList(c,"orders",[]);return this.parseOrders(l,h,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.safeValue(this.options,"fetchMyTrades",{}),a=this.safeValue(r,"sort","timestamp,asc"),o=this.safeString(s,"sort",a),n=this.omit(s,"sort"),d={sort:o};let h;void 0!==e&&(h=this.market(e),d.symbol=h.id),void 0!==t&&(d.from=this.iso8601(t)),void 0!==i&&(d.size=i);const c=await this.historyGetTrades(this.extend(d,n)),l=this.safeList(c,"trades",[]);return this.parseTrades(l,h,t,i)}parseTradingFee(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeNumber(e,"fee");return{info:e,symbol:this.safeSymbol(i,t),maker:s,taker:s,percentage:void 0,tierBased:void 0}}async fetchTradingFee(e,t={}){await this.loadMarkets();const i=this.market(e),s={markets:i.id},r=await this.tradingGetFees(this.extend(s,t)),a=this.safeValue(r,0,{});return this.parseTradingFee(a,i)}parseMarket(e){const t=this.safeValue(e,"locked"),i=this.safeString(e,"symbol"),s=this.safeString(e,"baseCurrency"),r=this.safeString(e,"quoteCurrency"),o=this.safeCurrencyCode(s),n=this.safeCurrencyCode(r),d=this.safeString(e,"quantityIncrement"),h=this.safeString(e,"baseMinSize"),c=a.Y.stringMax(d,h),l=this.safeString(e,"tickSize"),u=this.safeNumber(e,"quoteMinSize");return{id:i,symbol:o+"/"+n,base:o,quote:n,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!t,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(e,"takerFee"),maker:this.safeNumber(e,"makerFee"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"quantityIncrement"),price:this.safeNumber(e,"tickSize")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber(c),max:void 0},price:{min:this.parseNumber(l),max:void 0},cost:{min:u,max:void 0}},created:void 0,info:e}}parseCurrency(e){const t=this.safeString(e,"symbol"),i=this.safeCurrencyCode(t),s=this.safeString(e,"name"),r=this.safeValue(e,"depositEnabled"),a=this.safeValue(e,"withdrawalEnabled"),o=this.safeValue(e,"active"),n=r&&a&&o,d=this.safeString(e,"withdrawalFee"),h=this.safeInteger(e,"tradeDecimals");let c;if(void 0!==d&&void 0!==h){const e=d.length-h;if(e>0){const t=d.slice(0,e),i=d.slice(-e);c=this.parseNumber(t+"."+i)}else{let t=".";for(let i=0;i<-e;i++)t+="0";c=this.parseNumber(t+d)}}return this.safeCurrencyStructure({id:i,code:i,info:e,type:void 0,name:s,active:n,deposit:r,withdraw:a,fee:c,precision:this.parseNumber(this.parsePrecision(this.safeString(e,"decimals"))),limits:{withdraw:{min:c,max:void 0},amount:{min:void 0,max:void 0}},networks:{}})}parseTicker(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeSymbol(i,t,"/"),r=this.parse8601(this.safeString(e,"timestamp")),a=this.safeString(e,"last"),o=this.safeString(e,"open");return this.safeTicker({symbol:s,info:e,timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:o,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:this.safeString(e,"volumeQuote")},t)}parseTrade(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t),r=this.parse8601(this.safeString(e,"timestamp")),o=this.safeString(e,"price"),n=this.safeString(e,"quantity"),d=this.parseNumber(o),h=this.parseNumber(n),c=this.parseNumber(a.Y.stringMul(o,n)),l=this.safeString(e,"id"),u=this.safeStringLower2(e,"direction","side"),f=this.safeStringLower(e,"makerOrTaker");let p,m;void 0!==f&&(p=this.safeString(e,f+"OrderId"));const g=this.safeNumber(e,"fee"),v=this.safeCurrencyCode(this.safeString(e,"feeToken"));return void 0!==g&&(m={cost:g,currency:v}),{info:e,id:l,timestamp:r,datetime:this.iso8601(r),symbol:s,order:p,type:void 0,side:u,price:d,amount:h,cost:c,takerOrMaker:f,fee:m}}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"timestamp")),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}parseOrder(e,t=void 0){const i=this.safeString(e,"id"),s=this.safeStringLower(e,"type"),r=this.safeStringLower(e,"side"),o=this.safeString(e,"symbol"),n=this.safeSymbol(o,t),d=this.parse8601(this.safeString(e,"createdAt")),h=this.safeString(e,"price"),c=this.safeString(e,"quantity"),l=this.safeString(e,"filledQuantity"),u=this.omitZero(this.safeString(e,"cancelledQuantity"));let f;f=a.Y.stringEquals(l,c)?"closed":void 0!==u?"canceled":"open";const p=this.safeValue(e,"trades",[]),m=this.safeString(e,"clientOrderId");return this.safeOrder({info:e,id:i,clientOrderId:m,timestamp:d,datetime:this.iso8601(d),lastTradeTimestamp:void 0,symbol:n,type:s,timeInForce:void 0,postOnly:void 0,side:r,price:h,triggerPrice:void 0,amount:c,cost:void 0,average:void 0,filled:l,remaining:void 0,status:f,fee:void 0,trades:p},t)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={symbol:i.code},r=await this.currenciesGetSSymbol(this.extend(s,t)),a=this.safeDict(r,"currency",{});return this.parseDepositAddress(a,i)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"symbol");return{info:e,currency:this.safeCurrencyCode(i,t),network:void 0,address:this.safeString(e,"address"),tag:void 0}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.extractParams(e);e=this.implodeParams(e,s),s=this.omit(s,o);let n=this.urls.api.rest+"/"+t+"/"+e;if(Object.keys(s).length&&(n+="?"+this.urlencodeWithArrayRepeat(s)),"public"!==t&&"tradingview"!==t){this.checkRequiredCredentials();r={authorization:"Basic "+this.stringToBase64(this.apiKey+":"+this.secret)}}return{url:n,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&e>=400){const e=this.id+" "+o;let t=this.safeValue(n,"error");void 0===t&&(t=n);const i=this.safeString2(t,"code","status"),s=this.safeString2(t,"message","debugMessage");throw this.throwBroadlyMatchedException(this.exceptions.broad,s,e),this.throwExactlyMatchedException(this.exceptions.exact,i,e),this.throwExactlyMatchedException(this.exceptions.exact,s,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"tokocrypto",name:"Tokocrypto",countries:["ID"],certified:!1,pro:!1,version:"v1",has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,addMargin:void 0,borrowMargin:void 0,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:void 0,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createReduceOnlyOrder:void 0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowInterest:void 0,fetchBorrowRateHistories:void 0,fetchBorrowRateHistory:void 0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:"emulated",fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!1,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchL3OrderBook:!1,fetchLedger:void 0,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:"emulated",fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!1,fetchTicker:!1,fetchTickers:!1,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/183870484-d3398d0c-f6a1-4cce-91b8-d58792308716.jpg",api:{rest:{public:"https://www.tokocrypto.com",binance:"https://api.binance.com/api/v3",private:"https://www.tokocrypto.com"}},www:"https://tokocrypto.com",doc:"https://www.tokocrypto.com/apidocs/",fees:"https://www.tokocrypto.com/fees/newschedule"},api:{binance:{get:{ping:1,time:1,depth:{cost:1,byLimit:[[100,1],[500,5],[1e3,10],[5e3,50]]},trades:1,aggTrades:1,historicalTrades:5,klines:1,"ticker/24hr":{cost:1,noSymbol:40},"ticker/price":{cost:1,noSymbol:2},"ticker/bookTicker":{cost:1,noSymbol:2},exchangeInfo:10},put:{userDataStream:1},post:{userDataStream:1},delete:{userDataStream:1}},public:{get:{"open/v1/common/time":1,"open/v1/common/symbols":1,"open/v1/market/depth":1,"open/v1/market/trades":1,"open/v1/market/agg-trades":1,"open/v1/market/klines":1}},private:{get:{"open/v1/orders/detail":1,"open/v1/orders":1,"open/v1/account/spot":1,"open/v1/account/spot/asset":1,"open/v1/orders/trades":1,"open/v1/withdraws":1,"open/v1/deposits":1,"open/v1/deposits/address":1},post:{"open/v1/orders":1,"open/v1/orders/cancel":1,"open/v1/orders/oco":1,"open/v1/withdraws":1,"open/v1/user-data-stream":1}}},fees:{trading:{tierBased:!0,percentage:!0,taker:this.parseNumber("0.0075"),maker:this.parseNumber("0.0075")}},precisionMode:r.kb,options:{createMarketBuyOrderRequiresPrice:!0,defaultTimeInForce:"GTC",hasAlreadyAuthenticatedSuccessfully:!1,warnOnFetchOpenOrdersWithoutSymbol:!0,recvWindow:5e3,timeDifference:0,adjustForTimeDifference:!1,newOrderRespType:{market:"FULL",limit:"FULL"},quoteOrderQty:!1,networks:{ERC20:"ETH",TRC20:"TRX",BEP2:"BNB",BEP20:"BSC",OMNI:"OMNI",EOS:"EOS",SPL:"SOL"},reverseNetworks:{"tronscan.org":"TRC20","etherscan.io":"ERC20","bscscan.com":"BSC","explorer.binance.org":"BEP2","bithomp.com":"XRP","bloks.io":"EOS","stellar.expert":"XLM","blockchair.com/bitcoin":"BTC","blockchair.com/bitcoin-cash":"BCH","blockchair.com/ecash":"XEC","explorer.litecoin.net":"LTC","explorer.avax.network":"AVAX","solscan.io":"SOL","polkadot.subscan.io":"DOT","dashboard.internetcomputer.org":"ICP","explorer.chiliz.com":"CHZ","cardanoscan.io":"ADA","mainnet.theoan.com":"AION","algoexplorer.io":"ALGO","explorer.ambrosus.com":"AMB","viewblock.io/zilliqa":"ZIL","viewblock.io/arweave":"AR","explorer.ark.io":"ARK","atomscan.com":"ATOM","www.mintscan.io":"CTK","explorer.bitcoindiamond.org":"BCD","btgexplorer.com":"BTG","bts.ai":"BTS","explorer.celo.org":"CELO","explorer.nervos.org":"CKB","cerebro.cortexlabs.ai":"CTXC","chainz.cryptoid.info":"VIA","explorer.dcrdata.org":"DCR","digiexplorer.info":"DGB","dock.subscan.io":"DOCK","dogechain.info":"DOGE","explorer.elrond.com":"EGLD","blockscout.com":"ETC","explore-fetchhub.fetch.ai":"FET","filfox.info":"FIL","fio.bloks.io":"FIO","explorer.firo.org":"FIRO","neoscan.io":"NEO","ftmscan.com":"FTM","explorer.gochain.io":"GO","block.gxb.io":"GXS","hash-hash.info":"HBAR","www.hiveblockexplorer.com":"HIVE","explorer.helium.com":"HNT","tracker.icon.foundation":"ICX","www.iostabc.com":"IOST","explorer.iota.org":"IOTA","iotexscan.io":"IOTX","irishub.iobscan.io":"IRIS","kava.mintscan.io":"KAVA","scope.klaytn.com":"KLAY","kmdexplorer.io":"KMD","kusama.subscan.io":"KSM","explorer.lto.network":"LTO","polygonscan.com":"POLYGON","explorer.ont.io":"ONT","minaexplorer.com":"MINA","nanolooker.com":"NANO","explorer.nebulas.io":"NAS","explorer.nbs.plus":"NBS","explorer.nebl.io":"NEBL","nulscan.io":"NULS","nxscan.com":"NXS","explorer.harmony.one":"ONE","explorer.poa.network":"POA","qtum.info":"QTUM","explorer.rsk.co":"RSK","www.oasisscan.com":"ROSE","ravencoin.network":"RVN","sc.tokenview.com":"SC","secretnodes.com":"SCRT","explorer.skycoin.com":"SKY","steemscan.com":"STEEM","explorer.stacks.co":"STX","www.thetascan.io":"THETA","scan.tomochain.com":"TOMO","explore.vechain.org":"VET","explorer.vite.net":"VITE","www.wanscan.org":"WAN","wavesexplorer.com":"WAVES","wax.eosx.io":"WAXP","waltonchain.pro":"WTC","chain.nem.ninja":"XEM","verge-blockchain.info":"XVG","explorer.yoyow.org":"YOYOW","explorer.zcha.in":"ZEC","explorer.zensystem.io":"ZEN"},impliedNetworks:{ETH:{ERC20:"ETH"},TRX:{TRC20:"TRX"}},legalMoney:{MXN:!0,UGX:!0,SEK:!0,CHF:!0,VND:!0,AED:!0,DKK:!0,KZT:!0,HUF:!0,PEN:!0,PHP:!0,USD:!0,TRY:!0,EUR:!0,NGN:!0,PLN:!0,BRL:!0,ZAR:!0,KES:!0,ARS:!0,RUB:!0,AUD:!0,NOK:!0,CZK:!0,GBP:!0,UAH:!0,GHS:!0,HKD:!0,CAD:!0,INR:!0,JPY:!0,NZD:!0}},exceptions:{exact:{"System is under maintenance.":a.OnMaintenance,"System abnormality":a.ExchangeError,"You are not authorized to execute this request.":a.PermissionDenied,"API key does not exist":a.AuthenticationError,"Order would trigger immediately.":a.OrderImmediatelyFillable,"Stop price would trigger immediately.":a.OrderImmediatelyFillable,"Order would immediately match and take.":a.OrderImmediatelyFillable,"Account has insufficient balance for requested action.":a.InsufficientFunds,"Rest API trading is not enabled.":a.ExchangeNotAvailable,"You don't have permission.":a.PermissionDenied,"Market is closed.":a.ExchangeNotAvailable,"Too many requests. Please try again later.":a.DDoSProtection,"This action disabled is on this account.":a.AccountSuspended,"-1000":a.ExchangeNotAvailable,"-1001":a.ExchangeNotAvailable,"-1002":a.AuthenticationError,"-1003":a.RateLimitExceeded,"-1004":a.DDoSProtection,"-1005":a.PermissionDenied,"-1006":a.BadResponse,"-1007":a.RequestTimeout,"-1010":a.BadResponse,"-1011":a.PermissionDenied,"-1013":a.InvalidOrder,"-1014":a.InvalidOrder,"-1015":a.RateLimitExceeded,"-1016":a.ExchangeNotAvailable,"-1020":a.BadRequest,"-1021":a.InvalidNonce,"-1022":a.AuthenticationError,"-1023":a.BadRequest,"-1099":a.AuthenticationError,"-1100":a.BadRequest,"-1101":a.BadRequest,"-1102":a.BadRequest,"-1103":a.BadRequest,"-1104":a.BadRequest,"-1105":a.BadRequest,"-1106":a.BadRequest,"-1108":a.BadRequest,"-1109":a.AuthenticationError,"-1110":a.BadRequest,"-1111":a.BadRequest,"-1112":a.InvalidOrder,"-1113":a.BadRequest,"-1114":a.BadRequest,"-1115":a.BadRequest,"-1116":a.BadRequest,"-1117":a.BadRequest,"-1118":a.BadRequest,"-1119":a.BadRequest,"-1120":a.BadRequest,"-1121":a.BadSymbol,"-1125":a.AuthenticationError,"-1127":a.BadRequest,"-1128":a.BadRequest,"-1130":a.BadRequest,"-1131":a.BadRequest,"-1136":a.BadRequest,"-2008":a.AuthenticationError,"-2010":a.ExchangeError,"-2011":a.OrderNotFound,"-2013":a.OrderNotFound,"-2014":a.AuthenticationError,"-2015":a.AuthenticationError,"-2016":a.BadRequest,"-2018":a.InsufficientFunds,"-2019":a.InsufficientFunds,"-2020":a.OrderNotFillable,"-2021":a.OrderImmediatelyFillable,"-2022":a.InvalidOrder,"-2023":a.InsufficientFunds,"-2024":a.InsufficientFunds,"-2025":a.InvalidOrder,"-2026":a.InvalidOrder,"-2027":a.InvalidOrder,"-2028":a.InsufficientFunds,"-3000":a.ExchangeError,"-3001":a.AuthenticationError,"-3002":a.BadSymbol,"-3003":a.BadRequest,"-3004":a.ExchangeError,"-3005":a.InsufficientFunds,"-3006":a.InsufficientFunds,"-3007":a.ExchangeError,"-3008":a.InsufficientFunds,"-3009":a.BadRequest,"-3010":a.ExchangeError,"-3011":a.BadRequest,"-3012":a.ExchangeError,"-3013":a.BadRequest,"-3014":a.AccountSuspended,"-3015":a.ExchangeError,"-3016":a.BadRequest,"-3017":a.ExchangeError,"-3018":a.AccountSuspended,"-3019":a.AccountSuspended,"-3020":a.InsufficientFunds,"-3021":a.BadRequest,"-3022":a.AccountSuspended,"-3023":a.BadRequest,"-3024":a.ExchangeError,"-3025":a.BadRequest,"-3026":a.BadRequest,"-3027":a.BadSymbol,"-3028":a.BadSymbol,"-3029":a.ExchangeError,"-3036":a.AccountSuspended,"-3037":a.ExchangeError,"-3038":a.BadRequest,"-3041":a.InsufficientFunds,"-3042":a.BadRequest,"-3043":a.BadRequest,"-3044":a.DDoSProtection,"-3045":a.ExchangeError,"-3999":a.ExchangeError,"-4001":a.BadRequest,"-4002":a.BadRequest,"-4003":a.BadRequest,"-4004":a.AuthenticationError,"-4005":a.RateLimitExceeded,"-4006":a.BadRequest,"-4007":a.BadRequest,"-4008":a.BadRequest,"-4010":a.BadRequest,"-4011":a.BadRequest,"-4012":a.BadRequest,"-4013":a.AuthenticationError,"-4014":a.PermissionDenied,"-4015":a.ExchangeError,"-4016":a.PermissionDenied,"-4017":a.PermissionDenied,"-4018":a.BadSymbol,"-4019":a.BadSymbol,"-4021":a.BadRequest,"-4022":a.BadRequest,"-4023":a.ExchangeError,"-4024":a.InsufficientFunds,"-4025":a.InsufficientFunds,"-4026":a.InsufficientFunds,"-4027":a.ExchangeError,"-4028":a.BadRequest,"-4029":a.BadRequest,"-4030":a.ExchangeError,"-4031":a.ExchangeError,"-4032":a.ExchangeError,"-4033":a.BadRequest,"-4034":a.ExchangeError,"-4035":a.PermissionDenied,"-4036":a.BadRequest,"-4037":a.ExchangeError,"-4038":a.ExchangeError,"-4039":a.BadRequest,"-4040":a.BadRequest,"-4041":a.ExchangeError,"-4042":a.ExchangeError,"-4043":a.BadRequest,"-4044":a.BadRequest,"-4045":a.ExchangeError,"-4046":a.AuthenticationError,"-4047":a.BadRequest,"-5001":a.BadRequest,"-5002":a.InsufficientFunds,"-5003":a.InsufficientFunds,"-5004":a.BadRequest,"-5005":a.InsufficientFunds,"-5006":a.BadRequest,"-5007":a.BadRequest,"-5008":a.InsufficientFunds,"-5009":a.BadRequest,"-5010":a.ExchangeError,"-5011":a.BadRequest,"-5012":a.ExchangeError,"-5013":a.InsufficientFunds,"-5021":a.BadRequest,"-6001":a.BadRequest,"-6003":a.BadRequest,"-6004":a.ExchangeError,"-6005":a.InvalidOrder,"-6006":a.BadRequest,"-6007":a.BadRequest,"-6008":a.BadRequest,"-6009":a.RateLimitExceeded,"-6011":a.BadRequest,"-6012":a.InsufficientFunds,"-6013":a.ExchangeError,"-6014":a.BadRequest,"-6015":a.BadRequest,"-6016":a.BadRequest,"-6017":a.BadRequest,"-6018":a.BadRequest,"-6019":a.AuthenticationError,"-6020":a.BadRequest,"-7001":a.BadRequest,"-7002":a.BadRequest,"-9000":a.InsufficientFunds,"-10017":a.BadRequest,"-11008":a.InsufficientFunds,"-12014":a.RateLimitExceeded,"-13000":a.BadRequest,"-13001":a.BadRequest,"-13002":a.BadRequest,"-13003":a.BadRequest,"-13004":a.BadRequest,"-13005":a.BadRequest,"-13006":a.InvalidOrder,"-13007":a.AuthenticationError,"-21001":a.BadRequest,"-21002":a.BadRequest,"-21003":a.BadRequest,100001003:a.BadRequest,2202:a.InsufficientFunds,3210:a.InvalidOrder,3203:a.InvalidOrder,3211:a.InvalidOrder,3207:a.InvalidOrder,3218:a.OrderNotFound},broad:{"has no operation privilege":a.PermissionDenied,MAX_POSITION:a.InvalidOrder}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!0,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:1e3,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!0},fetchOHLCV:{limit:1e3}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=await this.publicGetOpenV1CommonTime(e);return this.safeInteger(t,"timestamp")}async fetchMarkets(e={}){const t=await this.publicGetOpenV1CommonSymbols(e);this.options.adjustForTimeDifference&&await this.loadTimeDifference();const i=this.safeValue(t,"data",{}),s=this.safeValue(i,"list",[]),r=[];for(let e=0;e<s.length;e++){const t=s[e],i=this.safeString(t,"baseAsset"),a=this.safeString(t,"quoteAsset"),o=this.safeString(t,"symbol"),n=this.safeStringLower(t,"symbol"),d=this.safeString(t,"marginAsset"),h=this.safeCurrencyCode(i),c=this.safeCurrencyCode(a),l=this.safeCurrencyCode(d),u=h+"/"+c,f=this.safeValue(t,"filters",[]),p=this.indexBy(f,"filterType");let m="1"===this.safeString(t,"spotTradingEnable");const g=this.safeValue(t,"permissions",[]);for(let e=0;e<g.length;e++)if("TRD_GRP_003"===g[e]){m=!1;break}const v={id:o,lowercaseId:n,symbol:u,base:h,quote:c,settle:l,baseId:i,quoteId:a,settleId:d,type:"spot",spot:!0,margin:this.safeBool(t,"isMarginTradingAllowed",!1),swap:!1,future:!1,delivery:!1,option:!1,active:m,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(t,"quantityPrecision"))),price:this.parseNumber(this.parsePrecision(this.safeString(t,"pricePrecision"))),base:this.parseNumber(this.parsePrecision(this.safeString(t,"baseAssetPrecision"))),quote:this.parseNumber(this.parsePrecision(this.safeString(t,"quotePrecision")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:t};if("PRICE_FILTER"in p){const e=this.safeValue(p,"PRICE_FILTER",{});v.precision.price=this.safeNumber(e,"tickSize"),v.limits.price={min:this.safeNumber(e,"minPrice"),max:this.safeNumber(e,"maxPrice")},v.precision.price=e.tickSize}if("LOT_SIZE"in p){const e=this.safeValue(p,"LOT_SIZE",{});v.precision.amount=this.safeNumber(e,"stepSize"),v.limits.amount={min:this.safeNumber(e,"minQty"),max:this.safeNumber(e,"maxQty")}}if("MARKET_LOT_SIZE"in p){const e=this.safeValue(p,"MARKET_LOT_SIZE",{});v.limits.market={min:this.safeNumber(e,"minQty"),max:this.safeNumber(e,"maxQty")}}if("MIN_NOTIONAL"in p){const e=this.safeValue(p,"MIN_NOTIONAL",{});v.limits.cost.min=this.safeNumber2(e,"minNotional","notional")}r.push(v)}return r}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={};let a;void 0!==t&&(r.limit=t),"USDT"===s.quote?(r.symbol=s.baseId+s.quoteId,a=await this.binanceGetDepth(this.extend(r,i))):(r.symbol=s.id,a=await this.publicGetOpenV1MarketDepth(this.extend(r,i)));const o=this.safeValue(a,"data",a),n=this.safeInteger2(a,"T","timestamp"),d=this.parseOrderBook(o,e,n);return d.nonce=this.safeInteger(o,"lastUpdateId"),d}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"T","time"),s=this.safeString2(e,"p","price"),r=this.safeString2(e,"q","qty"),a=this.safeString2(e,"quoteQty","baseQty"),o=this.safeString(e,"symbol"),n=this.safeSymbol(o,t);let d,h=this.safeString2(e,"t","a");h=this.safeString2(e,"id","tradeId",h);const c=this.safeString(e,"orderId"),l=this.safeValue2(e,"m","isBuyerMaker");let u,f;return void 0!==l?(d=l?"sell":"buy",u="taker"):"side"in e?d=this.safeStringLower(e,"side"):"isBuyer"in e&&(d=e.isBuyer?"buy":"sell"),"commission"in e&&(f={cost:this.safeString(e,"commission"),currency:this.safeCurrencyCode(this.safeString(e,"commissionAsset"))}),"isMaker"in e&&(u=e.isMaker?"maker":"taker"),"maker"in e&&(u=e.maker?"maker":"taker"),this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:n,id:h,order:c,type:void 0,side:d,takerOrMaker:u,price:s,amount:r,cost:a,fee:f},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:this.getMarketIdByType(r)};if("USDT"!==r.quote){void 0!==i&&(a.limit=i);const e=this.publicGetOpenV1MarketTrades(this.extend(a,s)),o=this.safeDict(e,"data",{}),n=this.safeList(o,"list",[]);return this.parseTrades(n,r,t,i)}void 0!==i&&(a.limit=i);let o;return"binanceGetAggTrades"===this.safeString(this.options,"fetchTradesMethod","binanceGetTrades")&&void 0!==t?(a.startTime=t,a.endTime=this.sum(t,36e5),o=await this.binanceGetAggTrades(this.extend(a,s))):o=await this.binanceGetTrades(this.extend(a,s)),this.parseTrades(o,r,t,i)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"closeTime"),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeString(e,"lastPrice");let o,n;return"baseVolume"in e?(o=this.safeString(e,"baseVolume"),n=this.safeString(e,"volume")):(o=this.safeString(e,"volume"),n=this.safeString(e,"quoteVolume")),this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"highPrice"),low:this.safeString(e,"lowPrice"),bid:this.safeString(e,"bidPrice"),bidVolume:this.safeString(e,"bidQty"),ask:this.safeString(e,"askPrice"),askVolume:this.safeString(e,"askQty"),vwap:this.safeString(e,"weightedAvgPrice"),open:this.safeString(e,"openPrice"),close:a,last:a,previousClose:this.safeString(e,"prevClosePrice"),change:this.safeString(e,"priceChange"),percentage:this.safeString(e,"priceChangePercent"),average:void 0,baseVolume:o,quoteVolume:n,info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.binanceGetTicker24hr(t);return this.parseTickers(i,e)}getMarketIdByType(e){return"USDT"===e.quote?e.baseId+e.quoteId:e.id}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.baseId+i.quoteId},r=await this.binanceGetTicker24hr(this.extend(s,t));if(Array.isArray(r)){const e=this.safeDict(r,0,{});return this.parseTicker(e,i)}return this.parseTicker(r,i)}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets();const i=await this.binanceGetTickerBookTicker(t);return this.parseTickers(i,e)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,0),this.safeNumber(e,1),this.safeNumber(e,2),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,5)]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.safeString(r,"price"),n=this.safeInteger(r,"until");r=this.omit(r,["price","until"]),s=void 0===s?500:Math.min(s,1500);const d={interval:this.safeString(this.timeframes,t,t),limit:s};let h;"index"===o?d.pair=a.id:d.symbol=this.getMarketIdByType(a),void 0!==i&&(d.startTime=i),void 0!==n&&(d.endTime=n),h="USDT"===a.quote?await this.binanceGetKlines(this.extend(d,r)):await this.publicGetOpenV1MarketKlines(this.extend(d,r));const c=this.safeList(h,"data",h);return this.parseOHLCVs(c,a,t,i,s)}async fetchBalance(e={}){await this.loadMarkets();const t=this.safeString2(this.options,"fetchBalance","defaultType","spot"),i=this.safeString(e,"type",t),s=this.safeString2(this.options,"marginMode","defaultMarginMode"),r=this.safeStringLower(e,"marginMode",s),a=await this.privateGetOpenV1AccountSpot(this.extend({},e));return this.parseBalanceCustom(a,i,r)}parseBalanceCustom(e,t=void 0,i=void 0){const s=this.safeInteger(e,"updateTime"),r={info:e,timestamp:s,datetime:this.iso8601(s)},a=this.safeValue(e,"data",{}),o=this.safeValue(a,"accountAssets",[]);for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"asset"),s=this.safeCurrencyCode(i),a=this.account();a.free=this.safeString(t,"free"),a.used=this.safeString(t,"locked"),r[s]=a}return this.safeBalance(r)}parseOrderStatus(e){return this.safeString({"-2":"open",0:"open",1:"open",2:"closed",3:"canceled",4:"canceling",5:"rejected",6:"expired",NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",CANCELED:"canceled",PENDING_CANCEL:"canceling",REJECTED:"rejected",EXPIRED:"expired"},e,e)}parseOrder(e,t=void 0){const i=this.parseOrderStatus(this.safeString(e,"status")),s=this.safeString(e,"symbol"),r=this.safeSymbol(s,t),a=this.safeString(e,"executedQty","0"),o=this.safeInteger(e,"createTime"),n=this.safeString(e,"avgPrice"),d=this.safeString2(e,"price","executedPrice"),h=this.safeString(e,"origQty"),c=this.safeStringN(e,["cummulativeQuoteQty","cumQuote","executedQuoteQty","cumBase"]),l=this.safeString(e,"orderId"),u=this.parseOrderType(this.safeStringLower(e,"type"));let f=this.safeStringLower(e,"side");"0"===f?f="buy":"1"===f&&(f="sell");const p=this.safeValue(e,"fills",[]),m=this.safeString2(e,"clientOrderId","clientId");let g=this.safeString(e,"timeInForce");"GTX"===g&&(g="PO");const v="limit_maker"===u||"PO"===g;return this.safeOrder({info:e,id:l,clientOrderId:m,timestamp:o,datetime:this.iso8601(o),lastTradeTimestamp:void 0,symbol:r,type:u,timeInForce:g,postOnly:v,reduceOnly:this.safeValue(e,"reduceOnly"),side:f,price:d,triggerPrice:this.parseNumber(this.omitZero(this.safeString(e,"stopPrice"))),amount:h,cost:c,average:n,filled:a,remaining:void 0,status:i,fee:void 0,trades:p},t)}parseOrderType(e){return this.safeString({2:"market",1:"limit",4:"limit",7:"limit"},e,e)}async createOrder(e,t,i,s,n=void 0,d={}){await this.loadMarkets();const h=this.market(e),c=this.safeString2(d,"clientOrderId","clientId");this.safeBool(d,"postOnly",!1)&&(t="LIMIT_MAKER"),d=this.omit(d,["clientId","clientOrderId"]);const l=t.toUpperCase();let u=l;const f=this.safeValue2(d,"triggerPrice","stopPrice");void 0!==f&&(d=this.omit(d,["triggerPrice","stopPrice"]),"MARKET"===u?u="STOP_LOSS":"LIMIT"===u&&(u="STOP_LOSS_LIMIT"));const p=this.safeValue(h.info,"orderTypes");if(!this.inArray(u,p))throw l!==u?new a.InvalidOrder(this.id+" triggerPrice parameter is not allowed for "+e+" "+t+" orders"):new a.InvalidOrder(this.id+" "+t+" is not a valid order type for the "+e+" market");const m={symbol:h.baseId+"_"+h.quoteId,type:this.safeString({LIMIT:1,MARKET:2,STOP_LOSS:3,STOP_LOSS_LIMIT:4,TAKE_PROFIT:5,TAKE_PROFIT_LIMIT:6,LIMIT_MAKER:7},u)};if("buy"===i?m.side=0:"sell"===i&&(m.side=1),void 0===c){const e=this.safeValue(this.options,"broker");if(void 0!==e){const t=this.safeString(e,"marketType");void 0!==t&&(m.clientId=t+this.uuid22())}}else m.clientId=c;let g=!1,v=!1,y=!1;if("MARKET"===u)if("buy"===i){const e=h.precision.price;let t,i=!0;[i,d]=this.handleOptionAndParams(d,"createOrder","createMarketBuyOrderRequiresPrice",!0);const c=this.safeNumber2(d,"cost","quoteOrderQty");if(d=this.omit(d,["cost","quoteOrderQty"]),void 0!==c)t=c;else if(i){if(void 0===n)throw new a.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const e=this.numberToString(s),i=this.numberToString(n);t=o.Y.stringMul(e,i)}}else t=s;m.quoteOrderQty=this.decimalToPrecision(t,r.R3,e,this.precisionMode)}else y=!0;else"LIMIT"===u?(g=!0,y=!0):"STOP_LOSS"===u||"TAKE_PROFIT"===u?(v=!0,y=!0,(h.linear||h.inverse)&&(g=!0)):"STOP_LOSS_LIMIT"===u||"TAKE_PROFIT_LIMIT"===u?(y=!0,v=!0,g=!0):"LIMIT_MAKER"===u&&(g=!0,y=!0);if(y&&(m.quantity=this.amountToPrecision(e,s)),g){if(void 0===n)throw new a.InvalidOrder(this.id+" createOrder() requires a price argument for a "+t+" order");m.price=this.priceToPrecision(e,n)}if(v){if(void 0===f)throw new a.InvalidOrder(this.id+" createOrder() requires a triggerPrice extra param for a "+t+" order");m.stopPrice=this.priceToPrecision(e,f)}const w=await this.privatePostOpenV1Orders(this.extend(m,d)),b=this.safeDict(w,"data",{});return this.parseOrder(b,h)}async fetchOrder(e,t=void 0,i={}){const s={orderId:e},r=await this.privateGetOpenV1Orders(this.extend(s,i)),a=this.safeValue(r,"data",{}),o=this.safeValue(a,"list",[]),n=this.safeDict(o,0,{});return this.parseOrder(n)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const r=this.market(e),o={symbol:r.id};void 0!==t&&(o.startTime=t),void 0!==i&&(o.limit=i);const n=await this.privateGetOpenV1Orders(this.extend(o,s)),d=this.safeValue(n,"data",{}),h=this.safeList(d,"list",[]);return this.parseOrders(h,r,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({type:1},s))}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrders(e,t,i,this.extend({type:2},s))}async cancelOrder(e,t=void 0,i={}){const s={orderId:e},r=await this.privatePostOpenV1OrdersCancel(this.extend(s,i)),a=this.safeDict(r,"data",{});return this.parseOrder(a)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new a.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const r=this.market(e),o={symbol:r.id},n=this.safeInteger2(s,"until","endTime");void 0!==t&&(o.startTime=t),void 0!==n&&(o.endTime=n,s=this.omit(s,["endTime","until"])),void 0!==i&&(o.limit=i);const d=await this.privateGetOpenV1OrdersTrades(this.extend(o,s)),h=this.safeValue(d,"data",{}),c=this.safeList(h,"list",[]);return this.parseTrades(c,r,t,i)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={asset:this.currency(e).id},s=this.safeValue(this.options,"networks",{});let r=this.safeStringUpper(t,"network");r=this.safeString(s,r,r),void 0!==r&&(i.network=r,t=this.omit(t,"network"));const a=await this.privateGetOpenV1DepositsAddress(this.extend(i,t)),o=this.safeValue(a,"data",{}),n=this.safeString(o,"address");let d=this.safeString(o,"addressTag","");return 0===d.length&&(d=void 0),this.checkAddress(n),{info:a,currency:e,network:this.safeString(o,"network"),address:n,tag:d}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={},o=this.safeInteger(s,"until");if(void 0!==e&&(r=this.currency(e),a.coin=r.id),void 0!==t){a.startTime=t;let e=this.sum(t,7776e6);void 0!==o&&(e=Math.min(e,o)),a.endTime=e}void 0!==i&&(a.limit=i);const n=await this.privateGetOpenV1Deposits(this.extend(a,s)),d=this.safeValue(n,"data",{}),h=this.safeList(d,"list",[]);return this.parseTransactions(h,r,t,i)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.coin=a.id),void 0!==t&&(r.startTime=t,r.endTime=this.sum(t,7776e6)),void 0!==i&&(r.limit=i);const o=await this.privateGetOpenV1Withdraws(this.extend(r,s)),n=this.safeValue(o,"data",{}),d=this.safeList(n,"list",[]);return this.parseTransactions(d,a,t,i)}parseTransactionStatusByType(e,t=void 0){const i=this.safeValue({deposit:{0:"pending",1:"ok"},withdrawal:{0:"pending",1:"canceled",2:"pending",3:"failed",4:"pending",5:"failed",10:"ok"}},t,{});return this.safeString(i,e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"address");let s=this.safeString(e,"addressTag");void 0!==s&&s.length<1&&(s=void 0);let r=this.safeString(e,"txId");void 0!==r&&r.indexOf("Internal transfer ")>=0&&(r=r.slice(18));const a=this.safeString2(e,"coin","fiatCurrency"),o=this.safeCurrencyCode(a,t);let n;const d=this.safeInteger(e,"insertTime"),h=this.safeInteger2(e,"createTime","timestamp");let c=this.safeString(e,"type");void 0===c&&(void 0!==d&&void 0===h?(c="deposit",n=d):void 0===d&&void 0!==h&&(c="withdrawal",n=h));const l=this.safeNumber2(e,"transactionFee","totalFee"),u={currency:void 0,cost:void 0,rate:void 0};void 0!==l&&(u.currency=o,u.cost=l);let f=!1;void 0!==this.safeInteger(e,"transferType")&&(f=!0);let p=this.safeString(e,"id");if(void 0===p){const t=this.safeValue(e,"data",{});p=this.safeString(t,"withdrawId"),c="withdrawal"}return{info:e,id:p,txid:r,type:c,currency:o,network:this.safeString(e,"network"),amount:this.safeNumber(e,"amount"),status:this.parseTransactionStatusByType(this.safeString(e,"status"),c),timestamp:n,datetime:this.iso8601(n),address:i,addressFrom:void 0,addressTo:i,tag:s,tagFrom:void 0,tagTo:s,updated:this.safeInteger2(e,"successTime","updateTime"),comment:void 0,internal:f,fee:u}}async withdraw(e,t,i,s=void 0,r={}){[s,r]=this.handleWithdrawTagAndParams(s,r),await this.loadMarkets(),this.checkAddress(i);const a=this.currency(e),o={asset:a.id,address:i,amount:this.numberToString(t)};void 0!==s&&(o.addressTag=s);const[n,d]=this.handleNetworkCodeAndParams(r),h=this.networkCodeToId(n);void 0!==h&&(o.network=h.toUpperCase());const c=await this.privatePostOpenV1Withdraws(this.extend(o,d));return this.parseTransaction(c,a)}sign(e,t="public",i="GET",s={},r=void 0,o=void 0){if(!(t in this.urls.api.rest))throw new a.NotSupported(this.id+" does not have a testnet/sandbox URL for "+t+" endpoints");let d=this.urls.api.rest[t];d+="/"+e,"wapi"===t&&(d+=".html");if("userDataStream"===e||"listenKey"===e){if(!this.apiKey)throw new a.AuthenticationError(this.id+" userDataStream endpoint requires `apiKey` credential");r={"X-MBX-APIKEY":this.apiKey,"Content-Type":"application/x-www-form-urlencoded"},"GET"!==i&&(o=this.urlencode(s))}else if("private"===t||"sapi"===t&&"system/status"!==e||"sapiV3"===t||"wapi"===t&&"systemStatus"!==e||"dapiPrivate"===t||"dapiPrivateV2"===t||"fapiPrivate"===t||"fapiPrivateV2"===t){let a;this.checkRequiredCredentials();const h=this.safeInteger(this.options,"recvWindow"),c=this.extend({timestamp:this.nonce()},s);void 0!==h&&(c.recvWindow=h);const l=this.safeInteger(s,"recvWindow");void 0!==l&&(c.recvWindow=l),a="sapi"===t&&"asset/dust"===e?this.urlencodeWithArrayRepeat(c):"batchOrders"===e||e.indexOf("sub-account")>=0||"capital/withdraw/apply"===e||e.indexOf("staking")>=0?this.rawencode(c):this.urlencode(c);a+="&signature="+this.hmac(this.encode(a),this.encode(this.secret),n.s),r={"X-MBX-APIKEY":this.apiKey},"GET"===i||"DELETE"===i||"wapi"===t?d+="?"+a:(o=a,r["Content-Type"]="application/x-www-form-urlencoded")}else Object.keys(s).length&&(d+="?"+this.urlencode(s));return{url:d,method:i,body:o,headers:r}}handleErrors(e,t,i,s,r,n,d,h,c){if(418===e||429===e)throw new a.DDoSProtection(this.id+" "+e.toString()+" "+t+" "+n);if(e>=400){if(n.indexOf("Price * QTY is zero or less")>=0)throw new a.InvalidOrder(this.id+" order cost = amount * price is zero or less "+n);if(n.indexOf("LOT_SIZE")>=0)throw new a.InvalidOrder(this.id+" order amount should be evenly divisible by lot size "+n);if(n.indexOf("PRICE_FILTER")>=0)throw new a.InvalidOrder(this.id+" order price is invalid, i.e. exceeds allowed price precision, exceeds min price or max price limits or is invalid value in general, use this.priceToPrecision (symbol, amount) "+n)}if(void 0===d)return;const l=this.safeBool(d,"success",!0);if(!l){const e=this.safeString(d,"msg");let t;if(void 0!==e){try{t=JSON.parse(e)}catch(e){t=void 0}void 0!==t&&(d=t)}}const u=this.safeString(d,"msg");void 0!==u&&(this.throwExactlyMatchedException(this.exceptions.exact,u,this.id+" "+u),this.throwBroadlyMatchedException(this.exceptions.broad,u,this.id+" "+u));const f=this.safeString(d,"code");if(void 0!==f){if("200"===f||o.Y.stringEquals(f,"0"))return;if("-2015"===f&&this.options.hasAlreadyAuthenticatedSuccessfully)throw new a.DDoSProtection(this.id+" "+n);const e=this.id+" "+n;if("No need to change margin type."===u)throw new a.MarginModeAlreadySet(e);throw this.throwExactlyMatchedException(this.exceptions.exact,f,e),new a.ExchangeError(e)}if(!l)throw new a.ExchangeError(this.id+" "+n)}calculateRateLimiterCost(e,t,i,s,r={}){if("noCoin"in r&&!("coin"in s))return r.noCoin;if("noSymbol"in r&&!("symbol"in s))return r.noSymbol;if("noPoolId"in r&&!("poolId"in s))return r.noPoolId;if("byLimit"in r&&"limit"in s){const e=s.limit,t=r.byLimit;for(let i=0;i<t.length;i++){const s=t[i];if(e<=s[0])return s[1]}}return this.safeInteger(r,"cost",1)}}
class o extends s.A{describe(){return this.deepExtend(super.describe(),{id:"tradeogre",name:"tradeogre",countries:[],rateLimit:100,version:"v2",pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createMarketOrder:!1,createOrder:!0,createOrders:!1,createPostOnlyOrder:!1,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!1,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchDepositsWithdrawals:!1,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!1,fetchLedgerEntry:!1,fetchLeverageTiers:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!1,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!1,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfers:!1,fetchWithdrawAddresses:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,signIn:!1,transfer:!1,withdraw:!1},urls:{referral:"",logo:"https://github.com/ccxt/ccxt/assets/43336371/3aa748b7-ea44-45e9-a9e7-b1d207a2578a",api:{rest:"https://tradeogre.com/api/v1"},www:"https://tradeogre.com",doc:"https://tradeogre.com/help/api",fees:"https://tradeogre.com/help/fees"},fees:{trading:{maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002")}},api:{public:{get:{markets:1,"orders/{market}":1,"ticker/{market}":1,"history/{market}":1,"chart/{interval}/{market}/{timestamp}":1}},private:{get:{"account/balance":1,"account/balances":1,"account/order/{uuid}":1},post:{"order/buy":1,"order/sell":1,"order/cancel":1,orders:1,"account/orders":1}}},commonCurrencies:{},precisionMode:a.kb,exceptions:{exact:{"Must be authorized":r.AuthenticationError,"Market not found":r.BadRequest,"Insufficient funds":r.InsufficientFunds,"Order not found":r.BadRequest}},timeframes:{"1m":"1m","15m":"15m","1h":"1h","4h":"4h","1d":"1d","1w":"1w"},options:{},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}}})}async fetchMarkets(e={}){const t=await this.publicGetMarkets(e),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=Object.keys(s),a=this.safeString(r,0),o=a.split("-"),n=this.safeString(o,0),d=this.safeString(o,1),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d),l=this.safeMarketStructure({id:a,symbol:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,taker:this.fees.trading.taker,maker:this.fees.trading.maker,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision("8")),price:this.parseNumber(this.parsePrecision("8"))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:s});i.push(l)}return i}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.publicGetTickerMarket(this.extend(s,t));return this.parseTicker(r,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.publicGetMarkets(this.extend({},t)),s={};for(let e=0;e<i.length;e++){const t=i[e],r=Object.keys(t),a=this.safeString(r,0),o=this.safeMarket(a),n=t[a],d=this.parseTicker(n,o);s[d.symbol]=d}return this.filterByArrayTickers(s,"symbol",e)}parseTicker(e,t=void 0){return this.safeTicker({symbol:this.safeString(t,"symbol"),timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:void 0,last:void 0,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"volume"),quoteVolume:void 0,info:e},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={market:o.id,interval:this.safeString(this.timeframes,t,t)};if(void 0===i)throw new r.BadRequest(this.id+" fetchOHLCV requires a since argument");n.timestamp=i;const d=await this.publicGetChartIntervalMarketTimestamp(this.extend(n,a));return this.parseOHLCVs(d,o,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={market:this.market(e).id},r=await this.publicGetOrdersMarket(this.extend(s,i)),a={bids:this.safeDict(r,"buy",{}),asks:this.safeDict(r,"sell",{})};return this.parseOrderBook(a,e)}parseBidsAsks(e,t=0,i=1,s=2){const r=Object.keys(e),a=[];for(let t=0;t<r.length;t++){const i=this.safeString(r,t),s=this.safeNumber(r,t),o=this.safeNumber(e,i);a.push([s,o])}return a}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market:r.id},o=await this.publicGetHistoryMarket(this.extend(a,s));return this.parseTrades(o,r,t,i)}parseTrade(e,t=void 0){const i=this.safeIntegerProduct(e,"date",1e3);return this.safeTrade({info:e,id:void 0,timestamp:i,datetime:this.iso8601(i),symbol:this.safeString(t,"symbol"),order:void 0,type:void 0,side:this.safeString(e,"type"),takerOrMaker:void 0,price:this.safeString(e,"price"),amount:this.safeString(e,"quantity"),cost:void 0,fee:{currency:void 0,cost:void 0}},t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccountBalances(e),i=this.safeDict(t,"balances",{});return this.parseBalance(i)}parseBalance(e){const t={info:e},i=Object.keys(e);for(let s=0;s<i.length;s++){const r=i[s],a={total:e[r]};t[this.safeCurrencyCode(r)]=a}return this.safeBalance(t)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e);if("market"===t)throw new r.BadRequest(this.id+" createOrder does not support market orders");if(void 0===a)throw new r.ArgumentsRequired(this.id+" createOrder requires a price parameter");const d={market:n.id,quantity:this.amountToPrecision(e,s),price:this.priceToPrecision(e,a)};let h;return h="buy"===i?await this.privatePostOrderBuy(this.extend(d,o)):await this.privatePostOrderSell(this.extend(d,o)),this.parseOrder(h,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e},r=await this.privatePostOrderCancel(this.extend(s,i));return this.parseOrder(r)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();return[await this.cancelOrder("all",e,t)]}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==e&&(r=this.market(e));const a={};void 0!==e&&(a.market=r.id);const o=await this.privatePostAccountOrders(this.extend(a,s));return this.parseOrders(o,r,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e},r=await this.privateGetAccountOrderUuid(this.extend(s,i));return this.parseOrder(r,void 0)}parseOrder(e,t=void 0){const i=this.safeIntegerProduct(e,"date",1e3),s=this.safeString(e,"market");return t=this.safeMarket(s,t),this.safeOrder({info:e,id:this.safeString(e,"uuid"),clientOrderId:void 0,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:t.symbol,type:void 0,timeInForce:void 0,postOnly:void 0,side:this.safeString(e,"type"),price:this.safeString(e,"price"),triggerPrice:void 0,amount:this.safeString(e,"quantity"),cost:void 0,average:void 0,filled:this.safeString(e,"fulfilled"),remaining:void 0,status:void 0,fee:{currency:void 0,cost:void 0},trades:void 0},t)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/"+this.implodeParams(e,s);return s=this.omit(s,this.extractParams(e)),"GET"===i&&Object.keys(s).length&&(o+="?"+this.urlencode(s)),"private"===t&&(r={"Content-Type":"application/x-www-form-urlencoded",Referer:"CCXT",authorization:"Basic "+this.stringToBase64(this.apiKey+":"+this.secret)},"GET"!==i&&(a=this.urlencode(s))),{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;if(!("success"in n))return;if(this.safeBool(n,"success"))return;if("true"===this.safeString(n,"success"))return;const c=this.safeValue(n,"error"),l=this.safeString(c,"code"),u=this.id+" "+this.json(n);throw this.throwExactlyMatchedException(this.exceptions.exact,l,u),new r.ExchangeError(u)}}
class c extends s.A{describe(){return this.deepExtend(super.describe(),{id:"upbit",name:"Upbit",countries:["KR"],version:"v1",rateLimit:1e3,pro:!0,has:{CORS:!0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelOrder:!0,createDepositAddress:!0,createMarketBuyOrderWithCost:!0,createMarketOrder:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,fetchBalance:!0,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!1,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!0,fetchOrders:!1,fetchPositionMode:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!0,fetchTradingFees:!1,fetchTransactions:!1,fetchWithdrawal:!0,fetchWithdrawals:!0,transfer:!1,withdraw:!0},timeframes:{"1m":"minutes","3m":"minutes","5m":"minutes","10m":"minutes","15m":"minutes","30m":"minutes","1h":"minutes","4h":"minutes","1d":"days","1w":"weeks","1M":"months"},hostname:"api.upbit.com",urls:{logo:"https://user-images.githubusercontent.com/1294454/49245610-eeaabe00-f423-11e8-9cba-4b0aed794799.jpg",api:{public:"https://{hostname}",private:"https://{hostname}"},www:"https://upbit.com",doc:"https://docs.upbit.com/docs/%EC%9A%94%EC%B2%AD-%EC%88%98-%EC%A0%9C%ED%95%9C",fees:"https://upbit.com/service_center/guide"},api:{public:{get:["market/all","candles/{timeframe}","candles/{timeframe}/{unit}","candles/minutes/{unit}","candles/minutes/1","candles/minutes/3","candles/minutes/5","candles/minutes/10","candles/minutes/15","candles/minutes/30","candles/minutes/60","candles/minutes/240","candles/days","candles/weeks","candles/months","trades/ticks","ticker","orderbook"]},private:{get:["accounts","orders/chance","order","orders","orders/closed","orders/open","orders/uuids","withdraws","withdraw","withdraws/chance","deposits","deposit","deposits/coin_addresses","deposits/coin_address"],post:["orders","withdraws/coin","withdraws/krw","deposits/generate_coin_address"],delete:["order"]}},fees:{trading:{tierBased:!1,percentage:!0,maker:this.parseNumber("0.0025"),taker:this.parseNumber("0.0025")},funding:{tierBased:!1,percentage:!1,withdraw:{},deposit:{}}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!1,GTD:!1},hedged:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,trailing:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:7,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:200}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"This key has expired.":r.AuthenticationError,"Missing request parameter error. Check the required parameters!":r.BadRequest,"side is missing, side does not have a valid value":r.InvalidOrder},broad:{thirdparty_agreement_required:r.PermissionDenied,out_of_scope:r.PermissionDenied,order_not_found:r.OrderNotFound,insufficient_funds:r.InsufficientFunds,invalid_access_key:r.AuthenticationError,jwt_verification:r.AuthenticationError,create_ask_error:r.ExchangeError,create_bid_error:r.ExchangeError,volume_too_large:r.InvalidOrder,invalid_funds:r.InvalidOrder}},options:{createMarketBuyOrderRequiresPrice:!0,fetchTickersMaxLength:4096,fetchOrderBooksMaxLength:4096,tradingFeesByQuoteCurrency:{KRW:5e-4}},commonCurrencies:{TON:"Tokamak Network"}})}async fetchCurrency(e,t={}){await this.loadMarkets();const i=this.currency(e);return await this.fetchCurrencyById(i.id,t)}async fetchCurrencyById(e,t={}){const i={currency:e},s=await this.privateGetWithdrawsChance(this.extend(i,t)),r=this.safeValue(s,"member_level",{}),o=this.safeValue(s,"currency",{}),n=this.safeValue(s,"withdraw_limit",{}),d=this.safeValue(n,"can_withdraw"),h=this.safeString(o,"wallet_state"),c=this.safeValue(r,"wallet_locked"),l=this.safeValue(r,"locked");let u=!0;void 0===d||d?("working"!==h||void 0!==c&&c||void 0!==l&&l)&&(u=!1):u=!1;const f=this.safeString(n,"onetime"),p=this.safeString(n,"daily",f),m=this.safeString(n,"remaining_daily",p);let g;g=a.Y.stringGt(m,"0")?m:p;const v=this.safeString(o,"code"),y=this.safeCurrencyCode(v);return{info:s,id:v,code:y,name:y,active:u,fee:this.safeNumber(o,"withdraw_fee"),precision:void 0,limits:{withdraw:{min:this.safeNumber(n,"minimum"),max:this.parseNumber(g)}}}}async fetchMarket(e,t={}){await this.loadMarkets();const i=this.market(e);return await this.fetchMarketById(i.id,t)}async fetchMarketById(e,t={}){const i={market:e},s=await this.privateGetOrdersChance(this.extend(i,t)),r=this.safeValue(s,"market"),o=this.safeValue(r,"bid"),n=this.safeValue(r,"ask"),d=this.safeString(r,"id"),h=this.safeString(n,"currency"),c=this.safeString(o,"currency"),l=this.safeCurrencyCode(h),u=this.safeCurrencyCode(c),f=this.safeString(r,"state"),p=this.safeString(s,"bid_fee"),m=this.safeString(s,"ask_fee"),g=this.parseNumber(a.Y.stringMax(p,m));return this.safeMarketStructure({id:d,symbol:l+"/"+u,base:l,quote:u,settle:void 0,baseId:h,quoteId:c,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:"active"===f,contract:!1,linear:void 0,inverse:void 0,taker:g,maker:g,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber("1e-8"),price:this.parseNumber("1e-8")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(n,"min_total"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(o,"min_total"),max:this.safeNumber(r,"max_total")},info:s}})}async fetchMarkets(e={}){const t=await this.publicGetMarketAll(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"market"),[i,s]=t.split("-"),r=this.safeCurrencyCode(s),a=this.safeCurrencyCode(i);return this.safeMarketStructure({id:t,symbol:r+"/"+a,base:r,quote:a,settle:void 0,baseId:s,quoteId:i,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:!0,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(this.options.tradingFeesByQuoteCurrency,a,this.fees.trading.taker),maker:this.safeNumber(this.options.tradingFeesByQuoteCurrency,a,this.fees.trading.maker),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{price:this.parseNumber("1e-8"),amount:this.parseNumber("1e-8")},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e})}parseBalance(e){const t={info:e,timestamp:void 0,datetime:void 0};for(let i=0;i<e.length;i++){const s=e[i],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.free=this.safeString(s,"balance"),o.used=this.safeString(s,"locked"),t[a]=o}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privateGetAccounts(e);return this.parseBalance(t)}async fetchOrderBooks(e=void 0,t=void 0,i={}){let s;if(await this.loadMarkets(),void 0===e){if(s=this.ids.join(","),s.length>this.options.fetchOrderBooksMaxLength){const e=this.ids.length;throw new r.ExchangeError(this.id+" fetchOrderBooks() has "+e.toString()+" symbols ("+s.length.toString()+" characters) exceeding max URL length ("+this.options.fetchOrderBooksMaxLength.toString()+" characters), you are required to specify a list of symbols in the first argument to fetchOrderBooks")}}else s=this.marketIds(e),s=s.join(",");const a={markets:s},o=await this.publicGetOrderbook(this.extend(a,i)),n={};for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"market"),s=this.safeSymbol(i,void 0,"-"),r=this.safeInteger(t,"timestamp");n[s]={symbol:s,bids:this.sortBy(this.parseBidsAsks(t.orderbook_units,"bid_price","bid_size"),0,!0),asks:this.sortBy(this.parseBidsAsks(t.orderbook_units,"ask_price","ask_size"),0),timestamp:r,datetime:this.iso8601(r),nonce:void 0}}return n}async fetchOrderBook(e,t=void 0,i={}){const s=await this.fetchOrderBooks([e],t,i);return this.safeValue(s,e)}parseTicker(e,t=void 0){const i=this.safeInteger(e,"trade_timestamp"),s=this.safeString2(e,"market","code");t=this.safeMarket(s,t,"-");const r=this.safeString(e,"trade_price");return this.safeTicker({symbol:t.symbol,timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high_price"),low:this.safeString(e,"low_price"),bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:this.safeString(e,"opening_price"),close:r,last:r,previousClose:this.safeString(e,"prev_closing_price"),change:this.safeString(e,"signed_change_price"),percentage:this.safeString(e,"signed_change_rate"),average:void 0,baseVolume:this.safeString(e,"acc_trade_volume_24h"),quoteVolume:this.safeString(e,"acc_trade_price_24h"),info:e},t)}async fetchTickers(e=void 0,t={}){let i;if(await this.loadMarkets(),void 0===(e=this.marketSymbols(e))){if(i=this.ids.join(","),i.length>this.options.fetchTickersMaxLength){const e=this.ids.length;throw new r.ExchangeError(this.id+" fetchTickers() has "+e.toString()+" symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchTickers")}}else i=this.marketIds(e),i=i.join(",");const s={markets:i},a=await this.publicGetTicker(this.extend(s,t)),o={};for(let e=0;e<a.length;e++){const t=this.parseTicker(a[e]);o[t.symbol]=t}return this.filterByArrayTickers(o,"symbol",e)}async fetchTicker(e,t={}){const i=await this.fetchTickers([e],t);return this.safeValue(i,e)}parseTrade(e,t=void 0){const i=this.safeString2(e,"sequential_id","uuid");let s,r=this.safeInteger(e,"timestamp");void 0===r&&(r=this.parse8601(this.safeString(e,"created_at")));const a=this.safeStringLower2(e,"ask_bid","side");"ask"===a?s="sell":"bid"===a&&(s="buy");const o=this.safeString(e,"funds"),n=this.safeString2(e,"trade_price","price"),d=this.safeString2(e,"trade_volume","volume"),h=this.safeString2(e,"market","code");let c;t=this.safeMarket(h,t,"-");const l=this.safeString(e,a+"_fee");return void 0!==l&&(c={currency:t.quote,cost:l}),this.safeTrade({id:i,info:e,order:undefined,timestamp:r,datetime:this.iso8601(r),symbol:t.symbol,type:void 0,side:s,takerOrMaker:void 0,price:n,amount:d,cost:o,fee:c},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);void 0===i&&(i=200);const a={market:r.id,count:i},o=await this.publicGetTradesTicks(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchTradingFee(e,t={}){await this.loadMarkets();const i={market:this.market(e).id},s=await this.privateGetOrdersChance(this.extend(i,t)),r=this.safeString(s,"ask_fee"),o=this.safeString(s,"bid_fee"),n=a.Y.stringMax(r,o),d=this.safeString(s,"maker_ask_fee"),h=this.safeString(s,"maker_bid_fee"),c=a.Y.stringMax(d,h);return{info:s,symbol:e,maker:this.parseNumber(c),taker:this.parseNumber(n),percentage:!0,tierBased:!1}}parseOHLCV(e,t=void 0){return[this.parse8601(this.safeString(e,"candle_date_time_utc")),this.safeNumber(e,"opening_price"),this.safeNumber(e,"high_price"),this.safeNumber(e,"low_price"),this.safeNumber(e,"trade_price"),this.safeNumber(e,"candle_acc_trade_volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o=this.parseTimeframe(t),n=this.safeString(this.timeframes,t,t);void 0===s&&(s=200);const d={market:a.id,timeframe:n,count:s};let h;if(void 0!==i&&(d.to=this.iso8601(this.sum(i,o*s*1e3))),"minutes"===n){const e=Math.round(o/60);d.unit=e,h=await this.publicGetCandlesTimeframeUnit(this.extend(d,r))}else h=await this.publicGetCandlesTimeframe(this.extend(d,r));return this.parseOHLCVs(h,a,t,i,s)}async createOrder(e,t,i,s,o=void 0,n={}){await this.loadMarkets();const d=this.market(e);let h;if("buy"===i)h="bid";else{if("sell"!==i)throw new r.InvalidOrder(this.id+" createOrder() allows buy or sell side only!");h="ask"}const c={market:d.id,side:h};if("limit"===t&&(c.price=this.priceToPrecision(e,o)),"market"===t&&"buy"===i){let t,i=!0;[i,n]=this.handleOptionAndParams(n,"createOrder","createMarketBuyOrderRequiresPrice",!0);const d=this.safeNumber(n,"cost");if(n=this.omit(n,"cost"),void 0!==d)t=this.costToPrecision(e,d);else if(i){if(void 0===o)throw new r.InvalidOrder(this.id+" createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend (quote quantity) in the amount argument");{const i=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(i,r);t=this.costToPrecision(e,n)}}else t=this.costToPrecision(e,s);c.ord_type="price",c.price=t}else c.ord_type=t,c.volume=this.amountToPrecision(e,s);const l=this.safeString2(n,"clientOrderId","identifier");if(void 0!==l&&(c.identifier=l),"market"!==t){const e=this.safeStringLower2(n,"timeInForce","time_in_force");n=this.omit(n,"timeInForce"),void 0!==e&&(c.time_in_force=e)}n=this.omit(n,["clientOrderId","identifier"]);const u=await this.privatePostOrders(this.extend(c,n));return this.parseOrder(u)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e},r=await this.privateDeleteOrder(this.extend(s,i));return this.parseOrder(r)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetDeposits(this.extend(r,s));return this.parseTransactions(o,a,t,i)}async fetchDeposit(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e};let r;void 0!==t&&(r=this.currency(t),s.currency=r.id);const a=await this.privateGetDeposit(this.extend(s,i));return this.parseTransaction(a,r)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetWithdraws(this.extend(r,s));return this.parseTransactions(o,a,t,i)}async fetchWithdrawal(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e};let r;void 0!==t&&(r=this.currency(t),s.currency=r.id);const a=await this.privateGetWithdraw(this.extend(s,i));return this.parseTransaction(a,r)}parseTransactionStatus(e){return this.safeString({submitting:"pending",submitted:"pending",almost_accepted:"pending",rejected:"failed",accepted:"ok",processing:"pending",done:"ok",canceled:"canceled"},e,e)}parseTransaction(e,t=void 0){const i=this.safeString(e,"done_at"),s=this.parse8601(this.safeString(e,"created_at",i));let r=this.safeString(e,"type");"withdraw"===r&&(r="withdrawal");const a=this.safeString(e,"currency"),o=this.safeCurrencyCode(a,t);return{info:e,id:this.safeString(e,"uuid"),currency:o,amount:this.safeNumber(e,"amount"),network:void 0,address:undefined,addressTo:void 0,addressFrom:void 0,tag:undefined,tagTo:void 0,tagFrom:void 0,status:this.parseTransactionStatus(this.safeStringLower(e,"state")),type:r,updated:this.parse8601(i),txid:this.safeString(e,"txid"),timestamp:s,datetime:this.iso8601(s),internal:void 0,comment:void 0,fee:{currency:o,cost:this.safeNumber(e,"fee")}}}parseOrderStatus(e){return this.safeString({wait:"open",done:"closed",cancel:"canceled"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"uuid");let s=this.safeString(e,"side");s="bid"===s?"buy":"sell";let r=this.safeString(e,"ord_type");const o=this.parse8601(this.safeString(e,"created_at")),n=this.parseOrderStatus(this.safeString(e,"state"));let d,h=this.safeString(e,"price");const c=this.safeString(e,"volume"),l=this.safeString(e,"remaining_volume"),u=this.safeString(e,"executed_volume");let f,p,m;"price"===r&&(r="market",f=h,h=void 0);let g=this.safeString(e,"paid_fee");const v=this.safeString(e,"market");t=this.safeMarket(v,t);let y=this.safeValue(e,"trades",[]);y=this.parseTrades(y,t,void 0,void 0,{order:i,type:r});const w=y.length;if(w>0){d=y[w-1].timestamp;let e=!1;void 0===g&&(e=!0,g="0"),f="0";for(let t=0;t<w;t++){const i=y[t];if(f=a.Y.stringAdd(f,this.safeString(i,"cost")),e){const e=this.safeValue(y[t],"fee",{}),i=this.safeString(e,"cost");void 0!==i&&(g=a.Y.stringAdd(g,i))}}p=a.Y.stringDiv(f,u)}return void 0!==g&&(m={currency:t.quote,cost:g}),this.safeOrder({info:e,id:i,clientOrderId:void 0,timestamp:o,datetime:this.iso8601(o),lastTradeTimestamp:d,symbol:t.symbol,type:r,timeInForce:this.safeStringUpper(e,"time_in_force"),postOnly:void 0,side:s,price:h,triggerPrice:void 0,cost:this.parseNumber(f),average:this.parseNumber(p),amount:c,filled:u,remaining:l,status:n,fee:m,trades:y})}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),r.market=a.id),void 0!==i&&(r.limit=i);const o=await this.privateGetOrdersOpen(this.extend(r,s));return this.parseOrders(o,a,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a={state:"done"};void 0!==e&&(r=this.market(e),a.market=r.id),void 0!==t&&(a.start_time=t),void 0!==i&&(a.limit=i),[a,s]=this.handleUntilOption("end_time",a,s);const o=await this.privateGetOrdersClosed(this.extend(a,s));return this.parseOrders(o,r,t,i)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r,a={state:"cancel"};void 0!==e&&(r=this.market(e),a.market=r.id),void 0!==t&&(a.start_time=t),void 0!==i&&(a.limit=i),[a,s]=this.handleUntilOption("end_time",a,s);const o=await this.privateGetOrdersClosed(this.extend(a,s));return this.parseOrders(o,r,t,i)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={uuid:e},r=await this.privateGetOrder(this.extend(s,i));return this.parseOrder(r)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=await this.privateGetDepositsCoinAddresses(t);return this.parseDepositAddresses(i,e)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"deposit_address"),s=this.safeString(e,"secondary_address"),r=this.safeString(e,"currency"),a=this.safeCurrencyCode(r),o=this.safeString(e,"net_type");return this.checkAddress(i),{info:e,currency:a,network:this.networkIdToCode(o),address:i,tag:s}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e);let s;if([s,t]=this.handleNetworkCodeAndParams(t),void 0===s)throw new r.ArgumentsRequired(this.id+' fetchDepositAddress requires params["network"]');const a=await this.privateGetDepositsCoinAddress(this.extend({currency:i.id,net_type:this.networkCodeToId(s,i.code)},t));return this.parseDepositAddress(a)}async createDepositAddress(e,t={}){await this.loadMarkets();const i={currency:this.currency(e).id},s=await this.privatePostDepositsGenerateCoinAddress(this.extend(i,t));if(void 0!==this.safeString(s,"message"))throw new r.AddressPending(this.id+" is generating "+e+" deposit address, call fetchDepositAddress or createDepositAddress one more time later to retrieve the generated address");return this.parseDepositAddress(s)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),await this.loadMarkets();const o=this.currency(e),n={amount:t};let d;if("KRW"!==e){this.checkAddress(i);const e=this.safeStringUpper2(a,"network","net_type");if(void 0===e)throw new r.ArgumentsRequired(this.id+" withdraw() requires a network argument");a=this.omit(a,["network"]),n.net_type=e,n.currency=o.id,n.address=i,void 0!==s&&(n.secondary_address=s),a=this.omit(a,"network"),d=await this.privatePostWithdrawsCoin(this.extend(n,a))}else d=await this.privatePostWithdrawsKrw(this.extend(n,a));return this.parseTransaction(d)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.implodeParams(this.urls.api[t],{hostname:this.hostname});o+="/"+this.version+"/"+this.implodeParams(e,s);const c=this.omit(s,this.extractParams(e));if("POST"!==i&&Object.keys(c).length&&(o+="?"+this.urlencode(c)),"private"===t){this.checkRequiredCredentials(),r={};const e=this.uuid(),t={access_key:this.apiKey,nonce:e},o=Object.keys(c).length;let l;if("GET"!==i&&"DELETE"!==i&&(a=this.json(s),r["Content-Type"]="application/json"),o&&(l=this.rawencode(c)),void 0!==l){const e=this.hash(this.encode(l),n.Zf);t.query_hash=e,t.query_hash_alg="SHA512"}const u=(0,h.a)(t,this.encode(this.secret),d.s);r.Authorization="Bearer "+u}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.safeValue(n,"error");if(void 0!==c){const e=this.safeString(c,"message"),t=this.safeString(c,"name"),i=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,i),this.throwExactlyMatchedException(this.exceptions.exact,t,i),this.throwBroadlyMatchedException(this.exceptions.broad,e,i),this.throwBroadlyMatchedException(this.exceptions.broad,t,i),new r.ExchangeError(i)}}}
class c extends s.A{describe(){return this.deepExtend(super.describe(),{id:"vertex",name:"Vertex",countries:[],version:"v1",rateLimit:50,certified:!1,pro:!0,dex:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!0,future:!0,option:!1,addMargin:!1,borrowCrossMargin:!1,borrowIsolatedMargin:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!1,cancelOrder:!0,cancelOrders:!0,cancelOrdersForSymbols:!1,closeAllPositions:!1,closePosition:!1,createMarketBuyOrderWithCost:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrders:!0,createReduceOnlyOrder:!0,createStopOrder:!0,createTriggerOrder:!0,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchCanceledOrders:!1,fetchClosedOrders:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDepositAddresses:!1,fetchDeposits:!1,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!1,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLedger:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginMode:void 0,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyLiquidations:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!0,fetchOpenInterestHistory:!1,fetchOpenInterests:!0,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!1,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!1,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":60,"5m":300,"15m":900,"1h":3600,"2h":7200,"4h":14400,"1d":86400,"1w":604800,"1M":604800},hostname:"vertexprotocol.com",urls:{logo:"https://github.com/ccxt/ccxt/assets/43336371/bd04a0fa-3b48-47b6-9d8b-124954d520a8",api:{v1:{archive:"https://archive.prod.{hostname}/v1",gateway:"https://gateway.prod.{hostname}/v1",trigger:"https://trigger.prod.{hostname}/v1"},v2:{archive:"https://archive.prod.{hostname}/v2",gateway:"https://gateway.prod.{hostname}/v2"}},test:{v1:{archive:"https://archive.sepolia-test.{hostname}/v1",gateway:"https://gateway.sepolia-test.{hostname}/v1",trigger:"https://trigger.sepolia-test.{hostname}/v1"},v2:{archive:"https://archive.sepolia-test.{hostname}/v2",gateway:"https://gateway.sepolia-test.{hostname}/v2"}},www:"https://vertexprotocol.com/",doc:"https://docs.vertexprotocol.com/",fees:"https://docs.vertexprotocol.com/basics/fees",referral:"https://app.vertexprotocol.com?referrer=0xCfC9BaB96a2eA3d3c3F031c005e82E1D9F295aC1"},api:{v1:{archive:{post:{"":1}},gateway:{get:{query:1,symbols:1,time:1},post:{query:1,execute:1}},trigger:{post:{execute:1,query:1}}},v2:{archive:{get:{tickers:1,contracts:1,trades:1,vrtx:1}},gateway:{get:{assets:.6667,pairs:1,orderbook:1}}}},fees:{swap:{taker:this.parseNumber("0.0002"),maker:this.parseNumber("0.0002")},spot:{taker:this.parseNumber("0.0002"),maker:this.parseNumber("0.0002")}},requiredCredentials:{apiKey:!1,secret:!1,walletAddress:!0,privateKey:!0},exceptions:{exact:{1e3:r.RateLimitExceeded,1015:r.RateLimitExceeded,1001:r.PermissionDenied,1002:r.PermissionDenied,1003:r.PermissionDenied,2e3:r.InvalidOrder,2001:r.InvalidOrder,2002:r.InvalidOrder,2003:r.InvalidOrder,2004:r.InvalidOrder,2005:r.InvalidOrder,2006:r.InvalidOrder,2007:r.InvalidOrder,2008:r.InvalidOrder,2009:r.InvalidOrder,2010:r.InvalidOrder,2011:r.BadRequest,2012:r.BadRequest,2013:r.InvalidOrder,2014:r.PermissionDenied,2015:r.InvalidOrder,2016:r.InvalidOrder,2017:r.InvalidOrder,2019:r.InvalidOrder,2020:r.InvalidOrder,2021:r.InvalidOrder,2022:r.InvalidOrder,2023:r.InvalidOrder,2024:r.InsufficientFunds,2025:r.InsufficientFunds,2026:r.BadRequest,2027:r.AuthenticationError,2028:r.AuthenticationError,2029:r.AuthenticationError,2030:r.BadRequest,2031:r.InvalidOrder,2033:r.InvalidOrder,2034:r.InvalidOrder,2035:r.InvalidOrder,2036:r.InvalidOrder,2037:r.InvalidOrder,2038:r.InvalidOrder,2039:r.InvalidOrder,2040:r.InvalidOrder,2041:r.InvalidOrder,2042:r.InvalidOrder,2043:r.InvalidOrder,2044:r.InvalidOrder,2045:r.InvalidOrder,2046:r.InvalidOrder,2047:r.InvalidOrder,2048:r.InvalidOrder,2049:r.ExchangeError,2050:r.PermissionDenied,2051:r.InvalidOrder,2052:r.InvalidOrder,2053:r.InvalidOrder,2054:r.InvalidOrder,2055:r.InvalidOrder,2056:r.InvalidOrder,2057:r.InvalidOrder,2058:r.InvalidOrder,2059:r.InvalidOrder,2060:r.InvalidOrder,2061:r.InvalidOrder,2062:r.InvalidOrder,2063:r.InvalidOrder,2064:r.InvalidOrder,2065:r.InvalidOrder,2066:r.InvalidOrder,2067:r.InvalidOrder,2068:r.InvalidOrder,2069:r.InvalidOrder,2070:r.InvalidOrder,2071:r.InvalidOrder,2072:r.InvalidOrder,2073:r.InvalidOrder,2074:r.InvalidOrder,2075:r.InvalidOrder,2076:r.InvalidOrder,3e3:r.BadRequest,3001:r.BadRequest,3002:r.BadRequest,3003:r.BadRequest,4e3:r.BadRequest,4001:r.ExchangeError,4002:r.ExchangeError,4003:r.ExchangeError,4004:r.InvalidOrder,5e3:r.ExchangeError},broad:{}},precisionMode:o.kb,commonCurrencies:{},options:{defaultType:"swap",sandboxMode:!1,timeDifference:0,brokerId:5930043274845996},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!0,takeProfitPrice:!0,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!0,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!0,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:1e5,untilDays:void 0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!0},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:1e3}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:void 0},future:{linear:void 0,inverse:void 0}}})}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}convertToX18(e){if("string"==typeof e)return a.Y.stringMul(e,"1000000000000000000");const t=this.numberToString(e);return a.Y.stringMul(t,"1000000000000000000")}convertFromX18(e){if("string"==typeof e)return a.Y.stringDiv(e,"1000000000000000000");const t=this.numberToString(e);return a.Y.stringDiv(t,"1000000000000000000")}async fetchCurrencies(e={}){const t=await this.v2GatewayGetAssets(this.extend({},e)),i={};for(let e=0;e<t.length;e++){const s=this.safeDict(t,e,{}),r=this.safeString(s,"ticker_id");if(void 0!==r&&r.indexOf("PERP")>0)continue;const a=this.safeString(s,"product_id"),o=this.safeString(s,"symbol"),n=this.safeCurrencyCode(o);i[n]={id:a,name:o,code:n,precision:void 0,info:s,active:void 0,deposit:this.safeBool(s,"can_deposit"),withdraw:this.safeBool(s,"can_withdraw"),networks:void 0,fee:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}}}}return i}parseMarket(e){const t=this.safeString(e,"type"),i="USDC",s=this.safeCurrencyCode(i),r=this.safeString(e,"symbol"),a=this.safeCurrencyCode(r),o=i,n=this.safeCurrencyCode(o);let d=a+"/"+s;const h="spot"===t,c=!h,l=!h;if(l){d=a.split("-")[0]+"/"+s+":"+n}const u=this.safeString(e,"price_increment_x18"),f=this.safeString(e,"size_increment"),p=this.safeString(e,"min_size"),m=this.safeNumber(e,"taker_fee_rate_x18"),g=this.safeNumber(e,"maker_fee_rate_x18"),v=!!h&&void 0,y=!h||void 0,w=h?void 0:this.parseNumber("1");return{id:this.safeString(e,"product_id"),symbol:d,base:a,quote:s,settle:h?void 0:n,baseId:r,quoteId:i,settleId:h?void 0:o,type:h?"spot":"swap",spot:h,margin:void 0,swap:l,future:!1,option:!1,active:!0,contract:c,linear:y,inverse:v,taker:this.parseNumber(this.convertFromX18(m)),maker:this.parseNumber(this.convertFromX18(g)),contractSize:w,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.convertFromX18(f)),price:this.parseNumber(this.convertFromX18(u))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.parseNumber(this.convertFromX18(p)),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchMarkets(e={}){const t=await this.v1GatewayGetQuery(this.extend({type:"symbols"},e)),i=this.safeDict(t,"data",{}),s=this.safeDict(i,"symbols",{}),r=Object.keys(s),a=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeDict(s,t,{});a.push(this.parseMarket(i))}return a}async fetchTime(e={}){const t=await this.v1GatewayGetTime(e);return this.parseToInt(t)}async fetchStatus(e={}){const t=await this.v1GatewayGetQuery(this.extend({type:"status"},e));let i=this.safeString(t,"data");return i="active"===i?"ok":"error",{status:i,updated:void 0,eta:void 0,url:void 0,info:t}}parseTrade(e,t=void 0){let i,s,r,o;const n=this.convertFromX18(this.safeString(e,"fee"));void 0!==n&&(o={cost:n,currency:void 0});const d=this.safeString2(e,"trade_id","submission_idx"),h=this.safeString(e,"digest"),c=this.safeTimestamp(e,"timestamp");if(void 0===c){const o=this.safeDict(this.safeDict(e,"pre_balance",{}),"base",{});let n;n="perp"in o?this.safeString(this.safeDict(o,"perp",{}),"product_id"):this.safeString(this.safeDict(o,"spot",{}),"product_id"),t=this.safeMarket(n);const d=this.safeDict(e,"order",{});i=this.convertFromX18(this.safeString(d,"priceX18")),s=this.convertFromX18(this.safeString(e,"base_filled")),r=a.Y.stringLt(s,"0")?"sell":"buy"}else{const a=this.safeString(e,"ticker_id").split("_"),o=a[0].split("-")[0]+a[1];t=this.safeMarket(o,t),i=this.safeString(e,"price"),s=this.safeString(e,"base_filled"),r=this.safeStringLower(e,"trade_type")}s=a.Y.stringAbs(s);const l=t.symbol;return this.safeTrade({id:d,timestamp:c,datetime:this.iso8601(c),symbol:l,side:r,price:i,amount:s,cost:void 0,order:h,takerOrMaker:void 0,type:void 0,fee:o,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={ticker_id:r.baseId+"_USDC"};void 0!==i&&(a.limit=i);const o=await this.v2ArchiveGetTrades(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r,a;await this.loadMarkets(),[r,s]=this.handlePublicAddress("fetchMyTrades",s);const o={subaccount:this.convertAddressToSender(r)};void 0!==e&&(a=this.market(e),o.product_ids=[this.parseToNumeric(a.id)]);const n=this.safeInteger(s,"until");void 0!==n&&(s=this.omit(s,"until"),o.max_time=n),void 0!==i&&(o.limit=i);const d={matches:o},h=await this.v1ArchivePost(this.extend(d,s)),c=this.safeList(h,"matches",[]);return this.parseTrades(c,a,t,i,s)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();void 0===t&&(t=100);const s={ticker_id:this.market(e).baseId+"_USDC",depth:t},r=await this.v2GatewayGetOrderbook(this.extend(s,i)),a=this.safeInteger(r,"timestamp");return this.parseOrderBook(r,e,a,"bids","asks")}async fetchTradingFees(e={}){let t;await this.loadMarkets(),[t,e]=this.handlePublicAddress("fetchTradingFees",e);const i={type:"fee_rates",sender:this.convertAddressToSender(t)},s=await this.v1GatewayGetQuery(this.extend(i,e)),r=this.safeDict(s,"data",{}),a=this.safeList(r,"maker_fee_rates_x18",[]),o=this.safeList(r,"taker_fee_rates_x18",[]),n={};for(let e=0;e<o.length;e++){const t=this.safeMarket(this.numberToString(e));if(void 0===t.id)continue;const i=t.symbol;n[i]={info:s,symbol:i,maker:this.parseNumber(this.convertFromX18(a[e])),taker:this.parseNumber(this.convertFromX18(o[e])),percentage:!0,tierBased:!1}}return n}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,"timestamp"),this.parseNumber(this.convertFromX18(this.safeString(e,"open_x18"))),this.parseNumber(this.convertFromX18(this.safeString(e,"high_x18"))),this.parseNumber(this.convertFromX18(this.safeString(e,"low_x18"))),this.parseNumber(this.convertFromX18(this.safeString(e,"close_x18"))),this.parseNumber(this.convertFromX18(this.safeString(e,"volume")))]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={product_id:this.parseToInt(a.id),granularity:this.safeInteger(this.timeframes,t)},n=this.safeInteger(r,"until");void 0!==n&&(r=this.omit(r,"until"),o.max_time=n),void 0!==s&&(o.limit=Math.min(s,1e3));const d={candlesticks:o},h=await this.v1ArchivePost(this.extend(d,r)),c=this.safeList(h,"candlesticks",[]);return this.parseOHLCVs(c,a,t,i,s)}parseFundingRate(e,t=void 0){let i=this.safeNumber(e,"funding_rate");if(void 0===i){const t=this.safeString(e,"funding_rate_x18");i=this.parseNumber(this.convertFromX18(t))}const s=this.safeTimestamp2(e,"update_time","next_funding_rate_timestamp"),r=this.safeNumber(e,"mark_price"),a=this.safeNumber(e,"index_price");return{info:e,symbol:t.symbol,markPrice:r,indexPrice:a,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:i,fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={funding_rate:{product_id:this.parseToInt(i.id)}},r=await this.v1ArchivePost(this.extend(s,t));return this.parseFundingRate(r,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets();void 0!==e&&(e=this.marketSymbols(e));const i=await this.v2ArchiveGetContracts(this.extend({},t)),s=Object.keys(i),r={};for(let e=0;e<s.length;e++){const t=s[e],a=t.split("-"),o=i[t],n=a[0]+"/USDC:USDC",d=this.market(n),h=this.parseFundingRate(o,d);r[h.symbol]=h}return this.filterByArray(r,"symbol",e)}parseOpenInterest(e,t=void 0){const i=this.safeString(e,"ticker_id");return this.safeOpenInterest({symbol:this.safeSymbol(i,t),openInterestAmount:this.safeNumber(e,"open_interest"),openInterestValue:this.safeNumber(e,"open_interest_usd"),timestamp:void 0,datetime:void 0,info:e},t)}async fetchOpenInterests(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v2ArchiveGetContracts(t),s=[],r=[],a=Object.keys(i);if(void 0===e){e=[];for(let t=0;t<a.length;t++){const i=a[t].split("-")[0]+"/USDC:USDC";this.inArray(i,e)||e.push(i)}}for(let t=0;t<a.length;t++){const o=a[t],n=this.safeMarket(o),d=this.safeDict(i,o,{});for(let t=0;t<e.length;t++){const i=this.market(e[t]),a=i.base+"_USDC";n.marketId===a&&(s.push(i.symbol),r.push(this.parseOpenInterest(d,i)))}}return this.filterByArray(r,"symbol",s)}async fetchOpenInterest(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.contract)throw new r.BadRequest(this.id+" fetchOpenInterest() supports contract markets only");const s=await this.v2ArchiveGetContracts(this.extend({},t)),a=i.base+"_USDC",o=this.safeDict(s,a,{});return this.parseOpenInterest(o,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"base_currency");let s=i+"/"+this.safeString(e,"quote_currency");i.indexOf("PERP")>0&&(s=s.replace("-PERP","")+":USDC"),t=this.safeMarket(s,t);const r=this.safeString(e,"last_price");return this.safeTicker({symbol:t.symbol,timestamp:void 0,datetime:void 0,high:void 0,low:void 0,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:void 0,open:void 0,close:r,last:r,previousClose:void 0,change:void 0,percentage:this.safeString(e,"price_change_percent_24h"),average:void 0,baseVolume:this.safeString(e,"base_volume"),quoteVolume:this.safeString(e,"quote_volume"),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e,void 0,!0,!0,!0);const i=await this.v2ArchiveGetTickers(this.extend({},t)),s=Object.values(i);return this.parseTickers(s,e)}async queryContracts(e={}){const t=this.safeDict(this.options,"v1contracts");if(void 0!==t)return t;const i=await this.v1GatewayGetQuery(this.extend({type:"contracts"},e)),s=this.safeDict(i,"data",{});return this.options.v1contracts=s,s}nonce(){return this.milliseconds()-this.options.timeDifference}hashMessage(e){return"0x"+this.hash(e,n.lY,"hex")}signHash(e,t){const i=(0,h.h1)(e.slice(-64),t.slice(-64),d.bI,void 0),s=i.r,r=i.s,a=this.intToBase16(this.sum(27,i.v));return"0x"+s.padStart(64,"0")+r.padStart(64,"0")+a}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}buildSig(e,t,i,s=""){const r={chainId:e,name:"Vertex",verifyingContract:s,version:"0.0.1"},a=this.ethEncodeStructuredData(r,t,i);return this.signMessage(a,this.privateKey)}buildCreateOrderSig(e,t,i){return this.buildSig(t,{Order:[{name:"sender",type:"bytes32"},{name:"priceX18",type:"int128"},{name:"amount",type:"int128"},{name:"expiration",type:"uint64"},{name:"nonce",type:"uint64"}]},e,i)}buildListTriggerTxSig(e,t,i){return this.buildSig(t,{ListTriggerOrders:[{name:"sender",type:"bytes32"},{name:"recvTime",type:"uint64"}]},e,i)}buildCancelAllOrdersSig(e,t,i){return this.buildSig(t,{CancellationProducts:[{name:"sender",type:"bytes32"},{name:"productIds",type:"uint32[]"},{name:"nonce",type:"uint64"}]},e,i)}buildCancelOrdersSig(e,t,i){return this.buildSig(t,{Cancellation:[{name:"sender",type:"bytes32"},{name:"productIds",type:"uint32[]"},{name:"digests",type:"bytes32[]"},{name:"nonce",type:"uint64"}]},e,i)}buildWithdrawSig(e,t,i){return this.buildSig(t,{WithdrawCollateral:[{name:"sender",type:"bytes32"},{name:"productId",type:"uint32"},{name:"amount",type:"uint128"},{name:"nonce",type:"uint64"}]},e,i)}convertAddressToSender(e){return(e+"64656661756c74").padEnd(66,"0")}getNonce(e,t){return void 0===e&&(e=this.nonce()),a.Y.stringAdd(a.Y.stringMul(a.Y.stringAdd(this.numberToString(e),this.numberToString(t)),"1048576"),"1000")}getExpiration(e,t,i,s){let r=a.Y.stringAdd(this.numberToString(e),"86400");return"ioc"===t?r=a.Y.stringOr(r,"4611686018427387904"):"fok"===t?r=a.Y.stringOr(r,"9223372036854775808"):i&&(r=a.Y.stringOr(r,"13835058055282163712")),s&&(r=a.Y.stringOr(r,"2305843009213693952")),r}getAmount(e,t){let i=this.numberToString(e);return"sell"===t?e>0&&(i=a.Y.stringMul(i,"-1")):e<0&&(i=a.Y.stringMul(i,"-1")),i}async createOrder(e,t,i,s,o=void 0,n={}){this.checkRequiredCredentials();const d="market"===t.toLowerCase();if(d&&void 0===o)throw new r.ArgumentsRequired(this.id+" createOrder() requires a price argument for market order");await this.loadMarkets();const h=this.market(e),c=this.parseToInt(h.id),l=await this.queryContracts(),u=this.safeString(l,"chain_id"),f=this.safeList(l,"book_addrs",[]),p=this.safeString(f,c),m=d?"fok":void 0,g=this.safeStringLower(n,"timeInForce",m),v=this.safeBool(n,"postOnly",!1),y=this.safeBool(n,"reduceOnly",!1),w=this.safeString2(n,"triggerPrice","stopPrice"),b=this.safeString(n,"stopLossPrice",w),k=this.safeString(n,"takeProfitPrice"),S=b||k,O=this.nonce();let T=this.getNonce(O,9e4);if(v&&y)throw new r.NotSupported(this.id+" reduceOnly not supported when postOnly is enabled");const P=this.getExpiration(O,g,v,y);S&&(T=a.Y.stringOr(T,"9223372036854775808"));const I=this.getAmount(s,i),M={sender:this.convertAddressToSender(this.walletAddress),priceX18:this.convertToX18(this.priceToPrecision(e,o)),amount:this.convertToX18(this.amountToPrecision(e,I)),expiration:P,nonce:T},x={place_order:{product_id:c,order:{sender:M.sender,priceX18:M.priceX18,amount:M.amount,expiration:this.numberToString(M.expiration),nonce:M.nonce},signature:this.buildCreateOrderSig(M,u,p),id:this.safeInteger(this.options,"brokerId",5930043274845996)}};let A;if(n=this.omit(n,["timeInForce","reduceOnly","postOnly","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice"]),S){const e={};void 0!==b?e.last_price_below=this.convertToX18(b):void 0!==k&&(e.last_price_above=this.convertToX18(k)),x.place_order.trigger=e,A=await this.v1TriggerPostExecute(this.extend(x,n))}else A=await this.v1GatewayPostExecute(this.extend(x,n));const C=this.safeDict(A,"data",{});return this.safeOrder({id:this.safeString(C,"digest")})}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){this.checkRequiredCredentials();const d="market"===i.toLowerCase();if(d&&void 0===o)throw new r.ArgumentsRequired(this.id+" editOrder() requires a price argument for market order");await this.loadMarkets();const h=this.market(t),c=this.parseToInt(h.id),l=d?"fok":void 0,u=this.safeStringLower(n,"timeInForce",l),f=this.safeBool(n,"postOnly",!1),p=this.safeBool(n,"reduceOnly",!1),m=this.safeString2(n,"triggerPrice","stopPrice"),g=this.safeString(n,"stopLossPrice",m),v=this.safeString(n,"takeProfitPrice"),y=g||v,w=await this.queryContracts(),b=this.safeString(w,"chain_id"),k=this.safeList(w,"book_addrs",[]),S=this.safeString(k,c),O=this.safeString(w,"endpoint_addr"),T=this.nonce(),P=this.getNonce(T,9e4),I=this.convertAddressToSender(this.walletAddress);if(f&&p)throw new r.NotSupported(this.id+" reduceOnly not supported when postOnly is enabled");if(y)throw new r.NotSupported(this.id+" editOrder() not supported for trigger order");const M=this.getExpiration(T,u,f,p),x=this.getAmount(a,s),A={sender:I,priceX18:this.convertToX18(this.priceToPrecision(t,o)),amount:this.convertToX18(this.amountToPrecision(t,x)),expiration:M,nonce:P},C={sender:I,productIds:[c],digests:[e],nonce:P},B={cancel_and_place:{cancel_tx:{sender:C.sender,productIds:C.productIds,digests:C.digests,nonce:this.numberToString(C.nonce)},cancel_signature:this.buildCancelOrdersSig(C,b,O),place_order:{product_id:c,order:{sender:A.sender,priceX18:A.priceX18,amount:A.amount,expiration:this.numberToString(A.expiration),nonce:A.nonce},signature:this.buildCreateOrderSig(A,b,S),id:this.safeInteger(this.options,"brokerId",5930043274845996)}}};n=this.omit(n,["timeInForce","reduceOnly","postOnly","triggerPrice","stopPrice","stopLossPrice","takeProfitPrice"]);const _=await this.v1GatewayPostExecute(this.extend(B,n)),E=this.safeDict(_,"data",{});return this.safeOrder({id:this.safeString(E,"digest")})}parseOrderStatus(e){if(void 0!==e){const t={pending:"open"};if("string"==typeof e)return this.safeString(t,e,e);if(void 0!==this.safeDict(e,"cancelled"))return"canceled";const i=this.safeDict(e,"triggered",{});return"success"===this.safeString(i,"status","failure")?"closed":"canceled"}return e}parseOrder(e,t=void 0){let i=this.safeString(e,"product_id"),s=this.safeTimestamp(e,"placed_at"),r=this.safeString(e,"amount"),a=this.safeString(e,"price_x18");const o=this.safeString(e,"unfilled_amount");let n;const d=this.safeValue(e,"status");if(void 0!==d){const t=this.safeDict(e,"order",{}),o=this.safeDict(t,"order",{});i=this.safeString(t,"product_id"),r=this.safeString(o,"amount"),a=this.safeString(o,"priceX18"),s=this.safeTimestamp(e,"updated_at");const d=this.safeDict(t,"trigger",{}),h=this.safeStringN(d,["price_above","price_below","last_price_above","last_price_below"]);void 0!==h&&(n=this.parseToNumeric(this.convertFromX18(h)))}const h=(t=this.safeMarket(i,t)).symbol;let c,l,u,f;void 0!==a&&(c=this.parseToNumeric(this.convertFromX18(a))),void 0!==r&&(l=this.parseToNumeric(this.convertFromX18(r))),void 0!==o&&(u=this.parseToNumeric(this.convertFromX18(o))),void 0!==l&&void 0!==u&&(f=l<0||u<0?"sell":"buy");const p=this.parseTimeInForce(this.safeString(e,"order_type")),m="PO"===p;return this.safeOrder({info:e,id:this.safeString(e,"digest"),clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,lastUpdateTimestamp:void 0,symbol:h,type:void 0,timeInForce:p,postOnly:m,reduceOnly:void 0,side:f,price:c,triggerPrice:n,amount:l,cost:void 0,average:void 0,filled:void 0,remaining:u,status:this.parseOrderStatus(d),fee:void 0,trades:void 0},t)}parseTimeInForce(e){return this.safeStringUpper({POST_ONLY:"PO"},e,e)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(t),r={type:"order",product_id:this.parseToInt(s.id),digest:e},a=await this.v1GatewayGetQuery(this.extend(r,i)),o=this.safeDict(a,"data");return this.parseOrder(o,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;this.checkRequiredCredentials(),await this.loadMarkets(),[r,s]=this.handlePublicAddress("fetchOpenOrders",s);const a={};let o;const n=this.safeBool2(s,"stop","trigger");let d;if(s=this.omit(s,["stop","trigger"]),void 0!==e&&(o=this.market(e),a.product_id=this.parseToNumeric(o.id)),n){const e=await this.queryContracts(),t=this.safeString(e,"chain_id"),o=this.safeString(e,"endpoint_addr"),n={sender:this.convertAddressToSender(r),recvTime:this.nonce()+9e4};a.signature=this.buildListTriggerTxSig(n,t,o),a.tx={sender:n.sender,recvTime:this.numberToString(n.recvTime)},a.type="list_trigger_orders",a.pending=!0;const h=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==h&&(a.max_update_time=h),void 0!==i&&(a.limit=i),d=await this.v1TriggerPostQuery(this.extend(a,s))}else this.checkRequiredArgument("fetchOpenOrders",e,"symbol"),a.type="subaccount_orders",a.sender=this.convertAddressToSender(r),d=await this.v1GatewayPostQuery(this.extend(a,s));const h=this.safeDict(d,"data",{}),c=this.safeList(h,"orders");return this.parseOrders(c,o,t,i)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){this.checkRequiredCredentials();const a=this.safeBool2(s,"stop","trigger");if(s=this.omit(s,["stop","trigger"]),!a)throw new r.NotSupported(this.id+" fetchOrders only support trigger orders");let o,n;[o,s]=this.handlePublicAddress("fetchOrders",s),await this.loadMarkets();const d={type:"list_trigger_orders",pending:!1};void 0!==e&&(n=this.market(e),d.product_id=this.parseToNumeric(n.id));const h=await this.queryContracts(),c=this.safeString(h,"chain_id"),l=this.safeString(h,"endpoint_addr"),u={sender:this.convertAddressToSender(o),recvTime:this.nonce()+9e4};d.signature=this.buildListTriggerTxSig(u,c,l),d.tx={sender:u.sender,recvTime:this.numberToString(u.recvTime)};const f=this.safeInteger(s,"until");s=this.omit(s,"until"),void 0!==f&&(d.max_update_time=f),void 0!==i&&(d.limit=i);const p=await this.v1TriggerPostQuery(this.extend(d,s)),m=this.safeDict(p,"data",{}),g=this.safeList(m,"orders");return this.parseOrders(g,n,t,i)}async cancelAllOrders(e=void 0,t={}){if(this.checkRequiredCredentials(),await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" cancelAllOrders() requires a symbol argument");const i=this.market(e).id,s=await this.queryContracts(),a=this.safeString(s,"chain_id"),o=this.safeString(s,"endpoint_addr"),n=this.nonce(),d=this.getNonce(n,9e4),h={sender:this.convertAddressToSender(this.walletAddress),productIds:[this.parseToNumeric(i)],nonce:d},c={cancel_product_orders:{tx:{sender:h.sender,productIds:h.productIds,nonce:this.numberToString(h.nonce)},signature:this.buildCancelAllOrdersSig(h,a,o)}},l=this.safeBool2(t,"stop","trigger");let u;return t=this.omit(t,["stop","trigger"]),u=l?await this.v1TriggerPostExecute(this.extend(c,t)):await this.v1GatewayPostExecute(this.extend(c,t)),u}async cancelOrder(e,t=void 0,i={}){return await this.cancelOrders([e],t,i)}async cancelOrders(e,t=void 0,i={}){if(this.checkRequiredCredentials(),void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");await this.loadMarkets();const s=this.market(t).id,a=await this.queryContracts(),o=this.safeString(a,"chain_id"),n=this.safeString(a,"endpoint_addr"),d=this.nonce(),h=this.getNonce(d,9e4),c={sender:this.convertAddressToSender(this.walletAddress),productIds:[],digests:e,nonce:h},l=c.productIds,u=this.parseToNumeric(s);for(let t=0;t<e.length;t++)l.push(u);const f={cancel_orders:{tx:{sender:c.sender,productIds:l,digests:c.digests,nonce:this.numberToString(c.nonce)},signature:this.buildCancelOrdersSig(c,o,n)}},p=this.safeBool2(i,"stop","trigger");let m;return i=this.omit(i,["stop","trigger"]),m=p?await this.v1TriggerPostExecute(this.extend(f,i)):await this.v1GatewayPostExecute(this.extend(f,i)),m}async fetchBalance(e={}){let t;[t,e]=this.handlePublicAddress("fetchBalance",e);const i={type:"subaccount_info",subaccount:this.convertAddressToSender(t)},s=await this.v1GatewayGetQuery(this.extend(i,e)),r=this.safeDict(s,"data",{}),a=this.safeList(r,"spot_balances",[]),o={info:s};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"product_id"),s=this.safeMarket(i),r="0"===i;if(void 0===s.id&&!r)continue;const n=r?"USDC":this.safeString(s,"baseId"),d=this.safeCurrencyCode(n),h=this.account(),c=this.safeDict(t,"balance",{}),l=this.convertFromX18(this.safeString(c,"amount"));h.total=l,o[d]=h}return this.safeBalance(o)}parsePosition(e,t=void 0){const i=this.safeString(e,"product_id");t=this.safeMarket(i);const s=this.safeDict(e,"balance",{}),r=this.convertFromX18(this.safeString(s,"amount"));let o="buy";return a.Y.stringLt(r,"1")&&(o="sell"),this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:void 0,datetime:void 0,lastUpdateTimestamp:void 0,initialMargin:void 0,initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,entryPrice:void 0,notional:void 0,leverage:void 0,unrealizedPnl:void 0,contracts:void 0,contractSize:this.parseToNumeric(r),marginRatio:void 0,liquidationPrice:void 0,markPrice:void 0,lastPrice:void 0,collateral:void 0,marginMode:"cross",marginType:void 0,side:o,percentage:void 0,hedged:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchPositions(e=void 0,t={}){let i;[i,t]=this.handlePublicAddress("fetchPositions",t);const s={type:"subaccount_info",subaccount:this.convertAddressToSender(i)},r=await this.v1GatewayGetQuery(this.extend(s,t)),a=this.safeDict(r,"data",{}),o=this.safeList(a,"perp_balances",[]);e=this.marketSymbols(e);const n=[];for(let e=0;e<o.length;e++){const i=this.extend(this.parsePosition(o[e],void 0),t);0!==i.contractSize&&n.push(i)}return this.filterByArrayPositions(n,"symbol",e,!1)}async queryNonces(){const e={type:"nonces",address:this.walletAddress},t=await this.v1GatewayGetQuery(e);return this.safeDict(t,"data",{})}async withdraw(e,t,i,s=void 0,r={}){this.checkRequiredCredentials(),await this.loadMarkets();const a=this.currency(e),o=await this.queryContracts(),n=this.safeString(o,"chain_id"),d=this.safeString(o,"endpoint_addr"),h=await this.queryNonces(),c=this.safeNumber(h,"tx_nonce"),l={sender:this.convertAddressToSender(this.walletAddress),productId:this.parseToNumeric(a.id),amount:t.toString(),nonce:c},u={withdraw_collateral:{tx:{sender:l.sender,productId:l.productId,amount:l.amount,nonce:this.numberToString(l.nonce)},signature:this.buildWithdrawSig(l,n,d)}},f=await this.v1GatewayPostExecute(this.extend(u,r)),p=this.parseTransaction(f,a);return this.extend(p,{amount:t,address:i})}parseTransaction(e,t=void 0){let i;return void 0!==t&&(i=t.code),{info:e,id:void 0,txid:void 0,timestamp:void 0,datetime:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,type:"withdrawal",amount:void 0,currency:i,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:void 0,network:void 0,comment:void 0,internal:void 0,fee:void 0}}parseTransactionStatus(e){return this.safeString({success:"ok"},e,e)}handlePublicAddress(e,t){let i;[i,t]=this.handleOptionAndParams(t,e,"user");let s=i;if([s,t]=this.handleOptionAndParams(t,e,"address",i),void 0!==s&&""!==s)return[s,t];if(void 0!==this.walletAddress&&""!==this.walletAddress)return[this.walletAddress,t];throw new r.ArgumentsRequired(this.id+" "+e+"() requires a user parameter inside 'params' or the wallet address set")}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;if("failure"===this.safeString(n,"status","")){const e=this.safeString(n,"error"),t=this.id+" "+o,i=this.safeString(n,"error_code");throw this.throwExactlyMatchedException(this.exceptions.exact,i,t),this.throwBroadlyMatchedException(this.exceptions.broad,e,t),new r.ExchangeError(t)}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.safeString(t,0),n=this.safeString(t,1);let d=this.implodeHostname(this.urls.api[o][n]);return"v1"===o&&"archive"===n||(d=d+"/"+e),"POST"===i?(r={"Content-Type":"application/json"},a=this.json(s)):Object.keys(s).length&&(d+="?"+this.urlencode(s)),"execute"!==e&&(void 0!==r?r["Accept-Encoding"]="gzip":r={"Accept-Encoding":"gzip"}),{url:d,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"wavesexchange",name:"Waves.Exchange",countries:["CH"],certified:!1,pro:!1,dex:!0,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createMarketOrder:!0,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:void 0,fetchDepositAddressesByNetwork:void 0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchLeverage:!1,fetchLeverageTiers:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTransfer:!1,fetchTransfers:!1,reduceMargin:!1,sandbox:!0,setLeverage:!1,setMarginMode:!1,setPositionMode:!1,signIn:!0,transfer:!1,withdraw:!0,ws:!1},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","3h":"3h","4h":"4h","6h":"6h","12h":"12h","1d":"1d","1w":"1w","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/84547058-5fb27d80-ad0b-11ea-8711-78ac8b3c7f31.jpg",test:{matcher:"https://matcher-testnet.wx.network",node:"https://nodes-testnet.wavesnodes.com",public:"https://api-testnet.wavesplatform.com/v0",private:"https://api-testnet.wx.network/v1",forward:"https://testnet.wx.network/api/v1/forward/matcher",market:"https://testnet.wx.network/api/v1/forward/marketdata/api/v1"},api:{matcher:"https://matcher.wx.network",node:"https://nodes.wx.network",public:"https://api.wavesplatform.com/v0",private:"https://api.wx.network/v1",forward:"https://wx.network/api/v1/forward/matcher",market:"https://wx.network/api/v1/forward/marketdata/api/v1"},doc:["https://docs.wx.network","https://docs.waves.tech","https://api.wavesplatform.com/v0/docs/","https://nodes.wavesnodes.com/api-docs/index.html","https://matcher.waves.exchange/api-docs/index.html"],www:"https://wx.network"},api:{matcher:{get:["matcher","matcher/settings","matcher/settings/rates","matcher/balance/reserved/{publicKey}","matcher/debug/allSnashotOffsets","matcher/debug/currentOffset","matcher/debug/lastOffset","matcher/debug/oldestSnapshotOffset","matcher/debug/config","matcher/debug/address/{address}","matcher/debug/status","matcher/debug/address/{address}/check","matcher/orderbook","matcher/orderbook/{baseId}/{quoteId}","matcher/orderbook/{baseId}/{quoteId}/publicKey/{publicKey}","matcher/orderbook/{baseId}/{quoteId}/{orderId}","matcher/orderbook/{baseId}/{quoteId}/info","matcher/orderbook/{baseId}/{quoteId}/status","matcher/orderbook/{baseId}/{quoteId}/tradableBalance/{address}","matcher/orderbook/{publicKey}","matcher/orderbook/{publicKey}/{orderId}","matcher/orders/{address}","matcher/orders/{address}/{orderId}","matcher/transactions/{orderId}","api/v1/orderbook/{baseId}/{quoteId}"],post:["matcher/orderbook","matcher/orderbook/market","matcher/orderbook/cancel","matcher/orderbook/{baseId}/{quoteId}/cancel","matcher/orderbook/{baseId}/{quoteId}/calculateFee","matcher/orderbook/{baseId}/{quoteId}/delete","matcher/orderbook/{baseId}/{quoteId}/cancelAll","matcher/debug/saveSnapshots","matcher/orders/{address}/cancel","matcher/orders/cancel/{orderId}","matcher/orders/serialize"],delete:["matcher/orderbook/{baseId}/{quoteId}","matcher/settings/rates/{assetId}"],put:["matcher/settings/rates/{assetId}"]},node:{get:["addresses","addresses/balance/{address}","addresses/balance/{address}/{confirmations}","addresses/balance/details/{address}","addresses/data/{address}","addresses/data/{address}/{key}","addresses/effectiveBalance/{address}","addresses/effectiveBalance/{address}/{confirmations}","addresses/publicKey/{publicKey}","addresses/scriptInfo/{address}","addresses/scriptInfo/{address}/meta","addresses/seed/{address}","addresses/seq/{from}/{to}","addresses/validate/{address}","alias/by-address/{address}","alias/by-alias/{alias}","assets/{assetId}/distribution/{height}/{limit}","assets/balance/{address}","assets/balance/{address}/{assetId}","assets/details/{assetId}","assets/nft/{address}/limit/{limit}","blockchain/rewards","blockchain/rewards/height","blocks/address/{address}/{from}/{to}/","blocks/at/{height}","blocks/delay/{signature}/{blockNum}","blocks/first","blocks/headers/last","blocks/headers/seq/{from}/{to}","blocks/height","blocks/height/{signature}","blocks/last","blocks/seq/{from}/{to}","blocks/signature/{signature}","consensus/algo","consensus/basetarget","consensus/basetarget/{blockId}","consensus/{generatingbalance}/address","consensus/generationsignature","consensus/generationsignature/{blockId}","debug/balances/history/{address}","debug/blocks/{howMany}","debug/configInfo","debug/historyInfo","debug/info","debug/minerInfo","debug/portfolios/{address}","debug/state","debug/stateChanges/address/{address}","debug/stateChanges/info/{id}","debug/stateWaves/{height}","leasing/active/{address}","node/state","node/version","peers/all","peers/blacklisted","peers/connected","peers/suspended","transactions/address/{address}/limit/{limit}","transactions/info/{id}","transactions/status","transactions/unconfirmed","transactions/unconfirmed/info/{id}","transactions/unconfirmed/size","utils/seed","utils/seed/{length}","utils/time","wallet/seed"],post:["addresses","addresses/data/{address}","addresses/sign/{address}","addresses/signText/{address}","addresses/verify/{address}","addresses/verifyText/{address}","debug/blacklist","debug/print","debug/rollback","debug/validate","node/stop","peers/clearblacklist","peers/connect","transactions/broadcast","transactions/calculateFee","tranasctions/sign","transactions/sign/{signerAddress}","tranasctions/status","utils/hash/fast","utils/hash/secure","utils/script/compileCode","utils/script/compileWithImports","utils/script/decompile","utils/script/estimate","utils/sign/{privateKey}","utils/transactionsSerialize"],delete:["addresses/{address}","debug/rollback-to/{signature}"]},public:{get:["assets","pairs","candles/{baseId}/{quoteId}","transactions/exchange"]},private:{get:["deposit/addresses/{currency}","deposit/addresses/{currency}/{platform}","platforms","deposit/currencies","withdraw/currencies","withdraw/addresses/{currency}/{address}"],post:["oauth2/token"]},forward:{get:["matcher/orders/{address}","matcher/orders/{address}/{orderId}"],post:["matcher/orders/{wavesAddress}/cancel"]},market:{get:["tickers"]}},currencies:{WX:this.safeCurrencyStructure({id:"EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc",numericId:void 0,code:"WX",precision:this.parseNumber("1e-8")})},precisionMode:n.kb,options:{allowedCandles:1440,accessToken:void 0,createMarketBuyOrderRequiresPrice:!0,matcherPublicKey:void 0,quotes:void 0,createOrderDefaultExpiry:24192e5,wavesAddress:void 0,withdrawFeeUSDN:7420,withdrawFeeWAVES:1e5,wavesPrecision:1e-8,messagePrefix:"W",networks:{ERC20:"ETH",BEP20:"BSC"}},features:{spot:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!0},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!0,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchClosedOrders:{marginMode:!1,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{EGG:"Waves Ducks"},requiresEddsa:!0,exceptions:{3147270:r.InsufficientFunds,112:r.InsufficientFunds,4:r.ExchangeError,13:r.ExchangeNotAvailable,14:r.ExchangeNotAvailable,3145733:r.AccountSuspended,3148040:r.DuplicateOrderId,3148801:r.AuthenticationError,9440512:r.AuthenticationError,9440771:r.BadSymbol,9441026:r.InvalidOrder,9441282:r.InvalidOrder,9441286:r.InvalidOrder,9441295:r.InvalidOrder,9441540:r.InvalidOrder,9441542:r.InvalidOrder,106954752:r.AuthenticationError,106954769:r.AuthenticationError,106957828:r.AuthenticationError,106960131:r.AuthenticationError,106981137:r.AuthenticationError,9437184:r.BadRequest,9437193:r.OrderNotFound,1048577:r.BadRequest,1051904:r.AuthenticationError}})}setSandboxMode(e){this.options.messagePrefix=e?"T":"W",this.options.sandboxMode=e,super.setSandboxMode(e)}async getFeesForAsset(e,t,i,s,r={}){await this.loadMarkets();const a=this.market(e);i=this.toRealSymbolAmount(e,i),s=this.toRealSymbolPrice(e,s);const o=this.extend({baseId:a.baseId,quoteId:a.quoteId,orderType:t,amount:i,price:s},r);return await this.matcherPostMatcherOrderbookBaseIdQuoteIdCalculateFee(o)}async customCalculateFee(e,t,i,s,r,o="taker",n={}){const d=await this.getFeesForAsset(e,i,s,r);let h;h=this.safeBool(n,"isDiscountFee",!1)?this.safeValue(d,"discount"):this.safeValue(d,"base");const c=this.safeString(h,"matcherFee"),l=this.safeString(h,"feeAssetId"),u=this.safeCurrencyCode(l),f=this.fromRealCurrencyAmount(u,c),p=this.numberToString(s),m=this.numberToString(r),g=this.feeToPrecision(e,this.parseNumber(f)),v=a.Y.stringDiv(f,a.Y.stringMul(p,m));return{type:o,currency:u,rate:this.parseNumber(v),cost:this.parseNumber(g)}}async getQuotes(){let e=this.safeValue(this.options,"quotes");if(e)return e;{const t=await this.matcherGetMatcherSettings();e={};const i=this.safeValue(t,"priceAssets");for(let t=0;t<i.length;t++)e[i[t]]=!0;return this.options.quotes=e,e}}async fetchMarkets(e={}){const t=await this.marketGetTickers(),i=[];for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"amountAssetID"),a=this.safeString(s,"priceAssetID"),o=r+"/"+a,n=this.safeString(s,"symbol");let[d,h]=n.split("/");d=this.safeCurrencyCode(d),h=this.safeCurrencyCode(h);const c=d+"/"+h;i.push({id:o,symbol:c,base:d,quote:h,settle:void 0,baseId:r,quoteId:a,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(s,"amountAssetDecimals"))),price:this.parseNumber(this.parsePrecision(this.safeString(s,"priceAssetDecimals")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:void 0,max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:s})}return i}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r=this.extend({baseId:s.baseId,quoteId:s.quoteId},i),a=await this.matcherGetMatcherOrderbookBaseIdQuoteId(r),o=this.safeInteger(a,"timestamp");return{symbol:e,bids:this.parseOrderBookSide(this.safeValue(a,"bids"),s,t),asks:this.parseOrderBookSide(this.safeValue(a,"asks"),s,t),timestamp:o,datetime:this.iso8601(o),nonce:void 0}}parseOrderBookSide(e,t=void 0,i=void 0){const s=t.precision,r=this.safeString(this.options,"wavesPrecision","1e-8"),o=this.safeString(s,"amount"),n=this.safeString(s,"price"),d=a.Y.stringDiv(o,n),h=a.Y.stringDiv(r,d),c=[];for(let t=0;t<e.length;t++){const s=e[t],r=this.safeString(s,"price","0"),n=this.safeString(s,"amount","0");let d,l;if(void 0!==h&&void 0!==r&&(d=a.Y.stringMul(r,h)),void 0!==o&&void 0!==n&&(l=a.Y.stringMul(n,o)),void 0!==i&&t>i)break;c.push([this.parseNumber(d),this.parseNumber(l)])}return c}checkRequiredKeys(){if(void 0===this.apiKey)throw new r.AuthenticationError(this.id+" requires apiKey credential");if(void 0===this.secret)throw new r.AuthenticationError(this.id+" requires secret credential");let e,t;try{e=this.base58ToBinary(this.apiKey)}catch(e){throw new r.AuthenticationError(this.id+" apiKey must be a base58 encoded public key")}try{t=this.base58ToBinary(this.secret)}catch(e){throw new r.AuthenticationError(this.id+" secret must be a base58 encoded private key")}const i=this.binaryToBase16(e),s=this.binaryToBase16(t);if(64!==i.length)throw new r.AuthenticationError(this.id+" apiKey must be a base58 encoded public key");if(64!==s.length)throw new r.AuthenticationError(this.id+" secret must be a base58 encoded private key");return!0}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),n="matcher/orders/{wavesAddress}/cancel"===e;e=this.implodeParams(e,s);let d=this.urls.api[t]+"/"+e,h=this.urlencodeWithArrayRepeat(o);if("private"===t||"forward"===t){r={Accept:"application/json"};const e=this.safeString(this.options,"accessToken");e&&(r.Authorization="Bearer "+e),r["content-type"]="POST"===i?"application/json":"application/x-www-form-urlencoded",n&&(a=this.json([o.orderId]),h=""),h.length>0&&(d+="?"+h)}else"matcher"===t?"POST"===i?(r={Accept:"application/json","Content-Type":"application/json"},a=this.json(o)):r=o:"POST"===i?(r={"content-type":"application/json"},a=this.json(o)):(r={"content-type":"application/x-www-form-urlencoded"},h.length>0&&(d+="?"+h));return{url:d,method:i,body:a,headers:r}}async signIn(e={}){if(!this.safeString(this.options,"accessToken")){const e="ffffff01",t=604800;let i=this.sum(this.seconds(),t);i=i.toString();const s="wx.network",r=this.safeString(this.options,"messagePrefix","W")+":"+s+":"+i,a=e+this.binaryToBase16(this.encode(r)),n=this.binaryToBase16(this.base58ToBinary(this.secret)),d=this.axolotl(a,n,o.ev),h={grant_type:"password",scope:"general",username:this.apiKey,password:i+":"+d,client_id:s},c=await this.privatePostOauth2Token(h);return this.options.accessToken=this.safeString(c,"access_token"),this.options.accessToken}}parseTicker(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString(e,"symbol"),r=(t=this.safeMarket(s,t,"/")).symbol,a=this.safeString2(e,"24h_close","lastPrice"),o=this.safeString2(e,"24h_low","low"),n=this.safeString2(e,"24h_high","high"),d=this.safeString2(e,"24h_vwap","weightedAveragePrice"),h=this.safeString2(e,"24h_volume","volume"),c=this.safeString2(e,"24h_priceVolume","quoteVolume"),l=this.safeString2(e,"24h_open","firstPrice");return this.safeTicker({symbol:r,timestamp:i,datetime:this.iso8601(i),high:n,low:o,bid:void 0,bidVolume:void 0,ask:void 0,askVolume:void 0,vwap:d,open:l,close:a,last:a,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:h,quoteVolume:c,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pairs:i.id},r=await this.publicGetPairs(this.extend(s,t)),a=this.safeValue(r,"data",[]),o=this.safeValue(a,0,{}),n=this.safeDict(o,"data",{});return this.parseTicker(n,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i=await this.marketGetTickers(t);return this.parseTickers(i,e)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={baseId:a.baseId,quoteId:a.quoteId,interval:this.safeString(this.timeframes,t,t)},n=this.safeInteger(this.options,"allowedCandles",1440),d=this.safeInteger(r,"until"),h=void 0!==d;void 0===s&&(s=n),s=Math.min(n,s);const c=1e3*this.parseTimeframe(t);if(void 0===i){const e=this.milliseconds(),t=h?d:e,i=this.parseToInt(t/c)*c-(s-1)*c;o.timeStart=i.toString(),h&&(o.timeEnd=d.toString())}else if(o.timeStart=i.toString(),h)o.timeEnd=d.toString();else{const e=this.sum(i,c*s);o.timeEnd=e.toString()}r=this.omit(r,"until");const l=await this.publicGetCandlesBaseIdQuoteId(this.extend(o,r)),u=this.safeValue(l,"data",[]);let f,p=this.parseOHLCVs(u,a,t,i,s);p=this.filterFutureCandles(p);const m=p.length;for(let e=0;e<p.length;e++){const t=m-e-1,i=p[t];void 0===i[1]&&(i[1]=f,i[2]=f,i[3]=f,i[4]=f,p[t]=i),f=i[4]}return p}filterFutureCandles(e){const t=[],i=this.milliseconds();for(let s=0;s<e.length&&!(e[s][0]>i);s++)t.push(e[s]);return t}parseOHLCV(e,t=void 0){const i=this.safeValue(e,"data",{});return[this.parse8601(this.safeString(i,"time")),this.safeNumber(i,"open"),this.safeNumber(i,"high"),this.safeNumber(i,"low"),this.safeNumber(i,"close"),this.safeNumber(i,"volume",0)]}async fetchDepositAddress(e,t={}){await this.signIn();const i=this.safeValue(this.options,"networks",{}),s=this.safeStringUpper(t,"network"),a=this.safeString(i,s,s);t=this.omit(t,["network"]);const o=await this.privateGetPlatforms(),n={},d={},h=this.safeValue(o,"items",[]);for(let e=0;e<h.length;e++){const t=h[e],i=this.safeString(t,"id"),s=this.safeValue(t,"currencies",[]);for(let e=0;e<s.length;e++){const t=this.safeString(s,e);n[t]=!0,t in d||(d[t]={}),d[t][i]=!0}}if(!(e in n)){const t=Object.keys(n);throw new r.ExchangeError(this.id+" fetchDepositAddress() "+e+" not supported. Currency code must be one of "+t.join(", "))}let c;if(void 0===a){const i={currency:e};c=await this.privateGetDepositAddressesCurrency(this.extend(i,t))}else{const i=d[e];if(!(a in i)){const t=Object.keys(i);throw new r.ExchangeError(this.id+" "+a+" network "+e+" deposit address not supported. Network must be one of "+t.join(", "))}if("WAVES"===a){const t={publicKey:this.apiKey};return{info:await this.nodeGetAddressesPublicKeyPublicKey(this.extend(t,t)),currency:e,network:a,address:this.safeString(c,"address"),tag:void 0}}{const i={currency:e,platform:a};c=await this.privateGetDepositAddressesCurrencyPlatform(this.extend(i,t))}}const l=this.safeValue(c,"currency"),u=this.safeString(l,"platform_id"),f=this.safeValue(this.options,"networkByIds",{}),p=this.safeString(f,u,u),m=this.safeValue(c,"deposit_addresses");return{info:c,currency:e,network:p,address:this.safeString(m,0),tag:void 0}}async getMatcherPublicKey(){const e=this.safeString(this.options,"matcherPublicKey");if(e)return e;{const e=await this.matcherGetMatcher();return this.options.matcherPublicKey=e.slice(1,e.length-1),this.options.matcherPublicKey}}getAssetBytes(e){return"WAVES"===e?this.numberToBE(0,1):this.binaryConcat(this.numberToBE(1,1),this.base58ToBinary(e))}getAssetId(e){return"WAVES"===e?"":e}toRealCurrencyAmount(e,t,i=void 0){const s=this.currency(e),r=a.Y.stringDiv(this.numberToString(t),this.safeString(s,"precision"));return parseInt(r)}fromRealCurrencyAmount(e,t){if(!(e in this.currencies))return t;const i=this.currency(e),s=this.safeString(i,"precision");return a.Y.stringMul(t,s)}toRealSymbolPrice(e,t){const i=this.market(e),s=a.Y.stringDiv(this.numberToString(t),this.safeString(i.precision,"price"));return parseInt(s)}fromRealSymbolPrice(e,t){const i=this.markets[e];return a.Y.stringMul(t,this.safeString(i.precision,"price"))}toRealSymbolAmount(e,t){const i=this.market(e),s=a.Y.stringDiv(this.numberToString(t),this.safeString(i.precision,"amount"));return parseInt(s)}fromRealSymbolAmount(e,t){const i=this.markets[e];return a.Y.stringMul(t,i.precision.amount)}safeGetDynamic(e){const t=this.safeValue(e,"orderFee");return"dynamic"in t?this.safeValue(t,"dynamic"):this.safeValue(t.composite.default,"dynamic")}safeGetRates(e){const t=this.safeValue(e,"rates");return void 0===t?{WAVES:1}:t}async createOrder(e,t,i,s,a=void 0,n={}){this.checkRequiredDependencies(),this.checkRequiredKeys(),await this.loadMarkets();const d=this.market(e),h=await this.getMatcherPublicKey(),c=this.getAssetId(d.baseId),l=this.getAssetId(d.quoteId),u="market"===t,f=this.safeFloat2(n,"triggerPrice","stopPrice"),p=void 0!==f;if(u&&void 0===a)throw new r.InvalidOrder(this.id+" createOrder() requires a price argument for "+t+" orders to determine the max price for buy and the min price for sell");const m=this.milliseconds();let g;[g,n]=this.handleOptionAndParams(n,"createOrder","defaultExpiry",this.safeInteger(this.options,"createOrderDefaultExpiry",24192e5));const v=this.sum(m,g),y=await this.getFeesForAsset(e,i,s,a),w=this.safeValue2(y,"base","discount"),b=this.safeString(w,"feeAssetId"),k=this.safeCurrencyCode(b),S=this.safeString(w,"matcherFee"),O=this.safeValue(y,"discount"),T=this.safeString(O,"feeAssetId"),P=this.safeCurrencyCode(T),I=this.safeString(O,"matcherFee");let M,x;if("feeAsset"in n||"feeAsset"in this.options){const e=this.safeString(n,"feeAsset",this.safeString(this.options,"feeAsset")),t=this.currency(e);M=this.safeString(t,"id")}const A=await this.fetchBalance();if(void 0!==M){if(b!==M&&T!==M)throw new r.InvalidOrder(this.id+" asset fee must be "+k+" or "+P);const e=this.safeCurrencyCode(M),t=M===b?S:I,i=parseFloat(this.fromRealCurrencyAmount(e,t));if(!(e in A&&A[e].free>=i))throw new r.InsufficientFunds(this.id+" not enough funds of the selected asset fee");x=parseInt(t)}const C=this.fromRealCurrencyAmount(k,S),B=this.fromRealCurrencyAmount(P,I);if(void 0===M&&(k in A&&A[k].free>=parseFloat(C)?(M=b,x=parseInt(S)):P in A&&A[P].free>=parseFloat(B)&&(M=T,x=parseInt(I))),void 0===M)throw new r.InsufficientFunds(this.id+" not enough funds on none of the eligible asset fees: "+k+" "+C+" or "+P+" "+B);s=this.toRealSymbolAmount(e,s),a=this.toRealSymbolPrice(e,a);const _={amountAsset:c,priceAsset:l},E=this.safeBool(this.options,"sandboxMode",!1)?84:87,N={senderPublicKey:this.apiKey,matcherPublicKey:h,assetPair:_,orderType:i,price:a,amount:s,timestamp:m,expiration:v,matcherFee:parseInt(x),priceMode:"assetDecimals",version:4,chainId:E};if(p){const t={v:1,c:{t:"sp",v:{p:this.toRealSymbolPrice(e,f)}}};N.attachment=this.binaryToBase58(this.encode(JSON.stringify(t)))}"WAVES"!==M&&(N.matcherFeeAssetId=M);let R=await this.matcherPostMatcherOrdersSerialize(N);'"'===R[0]&&'"'===R[R.length-1]&&(R=R.slice(1,R.length-1));const L=this.axolotl(this.binaryToBase16(this.base58ToBinary(R)),this.binaryToBase16(this.base58ToBinary(this.secret)),o.ev);if(N.signature=L,u){const e=await this.matcherPostMatcherOrderbookMarket(this.extend(N,n)),t=this.safeDict(e,"message");return this.parseOrder(t,d)}{const e=await this.matcherPostMatcherOrderbook(this.extend(N,n)),t=this.safeDict(e,"message");return this.parseOrder(t,d)}}async cancelOrder(e,t=void 0,i={}){this.checkRequiredDependencies(),this.checkRequiredKeys(),await this.signIn();const s=await this.getWavesAddress(),r=await this.forwardPostMatcherOrdersWavesAddressCancel({wavesAddress:s,orderId:e}),a=this.safeValue(r,"message"),o=this.safeValue(a,0),n=this.safeValue(o,0),d=this.safeString(n,"orderId");return this.safeOrder({info:r,id:d,clientOrderId:void 0,timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,symbol:t,type:void 0,side:void 0,price:void 0,amount:void 0,cost:void 0,average:void 0,filled:void 0,remaining:void 0,status:void 0,fee:void 0,trades:void 0})}async fetchOrder(e,t=void 0,i={}){let s;this.checkRequiredDependencies(),this.checkRequiredKeys(),await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r=this.milliseconds(),a=[this.base58ToBinary(this.apiKey),this.numberToBE(r,8)],n=this.binaryConcatArray(a),d=this.binaryToBase16(this.base58ToBinary(this.secret)),h=this.axolotl(this.binaryToBase16(n),d,o.ev),c={Timestamp:r.toString(),Signature:h,publicKey:this.apiKey,orderId:e},l=await this.matcherGetMatcherOrderbookPublicKeyOrderId(this.extend(c,i));return this.parseOrder(l,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){if(this.checkRequiredDependencies(),this.checkRequiredKeys(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOrders() requires a symbol argument");await this.loadMarkets();const a=this.market(e),n=this.milliseconds(),d=[this.base58ToBinary(this.apiKey),this.numberToBE(n,8)],h=this.binaryConcatArray(d),c=this.binaryToBase16(this.base58ToBinary(this.secret)),l=this.axolotl(this.binaryToBase16(h),c,o.ev),u={Accept:"application/json",Timestamp:n.toString(),Signature:l,publicKey:this.apiKey,baseId:a.baseId,quoteId:a.quoteId},f=await this.matcherGetMatcherOrderbookBaseIdQuoteIdPublicKeyPublicKey(this.extend(u,s));return this.parseOrders(f,a,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),await this.signIn(),void 0!==e&&(r=this.market(e));const a={address:await this.getWavesAddress(),activeOnly:!0},o=await this.forwardGetMatcherOrdersAddress(a);return this.parseOrders(o,r,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets(),await this.signIn(),void 0!==e&&(r=this.market(e));const a={address:await this.getWavesAddress(),closedOnly:!0},o=await this.forwardGetMatcherOrdersAddress(a);return this.parseOrders(o,r,t,i)}parseOrderStatus(e){return this.safeString({Cancelled:"canceled",Accepted:"open",Filled:"closed",PartiallyFilled:"open"},e,e)}getSymbolFromAssetPair(e){const t=this.safeString(e,"amountAsset","WAVES"),i=this.safeString(e,"priceAsset","WAVES");return this.safeCurrencyCode(t)+"/"+this.safeCurrencyCode(i)}parseOrder(e,t=void 0){const i=this.safeInteger(e,"timestamp"),s=this.safeString2(e,"type","orderType");let r="limit";"type"in e&&(r=this.safeString(e,"orderType",r));const a=this.safeString(e,"id"),o=this.safeString(e,"filled"),n=this.safeString(e,"price"),d=this.safeString(e,"amount"),h=this.safeValue(e,"assetPair");let c;void 0!==h?c=this.getSymbolFromAssetPair(h):void 0!==t&&(c=t.symbol);const l=this.safeCurrencyCode(this.safeString(h,"amountAsset","WAVES")),u=this.fromRealSymbolPrice(c,n),f=this.fromRealCurrencyAmount(l,d),p=this.fromRealCurrencyAmount(l,o),m=this.fromRealSymbolPrice(c,this.safeString(e,"avgWeighedPrice")),g=this.parseOrderStatus(this.safeString(e,"status"));let v,y;if("type"in e){const t=this.safeCurrencyCode(this.safeString(e,"feeAsset"));v={currency:t,fee:this.parseNumber(this.fromRealCurrencyAmount(t,this.safeString(e,"filledFee")))}}else{const t=this.safeCurrencyCode(this.safeString(e,"matcherFeeAssetId","WAVES"));v={currency:t,fee:this.parseNumber(this.fromRealCurrencyAmount(t,this.safeString(e,"matcherFee")))}}const w=this.safeString(e,"attachment");if(void 0!==w){const e=this.parseJson(this.decode(this.base58ToBinary(w)));if(void 0!==e){const t=this.safeValue(e,"c");if(void 0!==t){const e=this.safeValue(t,"v");void 0!==e&&(y=this.safeString(e,"p"))}}}return this.safeOrder({info:e,id:a,clientOrderId:void 0,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,symbol:c,type:r,timeInForce:void 0,postOnly:void 0,side:s,price:u,triggerPrice:y,amount:f,cost:void 0,average:m,filled:p,remaining:void 0,status:g,fee:v,trades:void 0},t)}async getWavesAddress(){const e=this.safeString(this.options,"wavesAddress");if(void 0===e){const e={publicKey:this.apiKey},t=await this.nodeGetAddressesPublicKeyPublicKey(e);return this.options.wavesAddress=this.safeString(t,"address"),this.options.wavesAddress}return e}async fetchBalance(e={}){this.checkRequiredDependencies(),this.checkRequiredKeys(),await this.loadMarkets();const t=await this.getWavesAddress(),i={address:t},s=await this.nodeGetAssetsBalanceAddress(i),r=this.safeValue(s,"balances",[]);let n,d={};const h=[],c=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeInteger(t,"timestamp");n=void 0===n?i:Math.max(n,i);const s=this.safeValue(t,"issueTransaction"),a=this.safeString(t,"assetId"),o=this.safeString(t,"balance");if(a in this.currencies_by_id){const e=this.safeCurrencyCode(a);d[e]=this.account(),d[e].total=this.fromRealCurrencyAmount(e,o)}else void 0===s&&(h.push(a),c.push(o))}if(h.length){const e={ids:h},t=await this.publicGetAssets(e),i=this.safeValue(t,"data",[]);for(let e=0;e<i.length;e++){const t=i[e],s=c[e],r=this.safeValue(t,"data"),o=this.parsePrecision(this.safeString(r,"precision")),n=this.safeString(r,"ticker"),h=this.safeCurrencyCode(n);d[h]=this.account(),d[h].total=a.Y.stringMul(s,o)}}const l=this.milliseconds(),u=[this.base58ToBinary(this.apiKey),this.numberToBE(l,8)],f=this.binaryConcatArray(u),p=this.binaryToBase16(this.base58ToBinary(this.secret)),m=this.axolotl(this.binaryToBase16(f),p,o.ev),g={publicKey:this.apiKey,signature:m,timestamp:l.toString()},v=await this.matcherGetMatcherBalanceReservedPublicKey(g),y=Object.keys(v);for(let e=0;e<y.length;e++){const t=y[e],i=this.safeCurrencyCode(t);i in d||(d[i]=this.account());const s=this.safeString(v,t);d[i].used=this.fromRealCurrencyAmount(i,s)}const w={address:t},b=await this.nodeGetAddressesBalanceAddress(w);return d.WAVES=this.safeValue(d,"WAVES",this.account()),d.WAVES.total=this.fromRealCurrencyAmount("WAVES",this.safeString(b,"balance")),d=this.setUndefinedBalancesToZero(d),d.timestamp=n,d.datetime=this.iso8601(n),this.safeBalance(d)}setUndefinedBalancesToZero(e,t="used"){const i=Object.keys(e);for(let s=0;s<i.length;s++){const r=i[s];void 0===this.safeValue(e[r],"used")&&(e[r][t]="0")}return e}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={sender:await this.getWavesAddress()};let a;void 0!==e&&(a=this.market(e),r.amountAsset=a.baseId,r.priceAsset=a.quoteId);const o=await this.publicGetTransactionsExchange(r),n=this.safeValue(o,"data");return this.parseTrades(n,a,t,i)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={amountAsset:r.baseId,priceAsset:r.quoteId};void 0!==i&&(a.limit=Math.min(i,100)),void 0!==t&&(a.timeStart=t);const o=await this.publicGetTransactionsExchange(a),n=this.safeValue(o,"data");return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i=this.safeValue(e,"data"),s=this.safeString(i,"timestamp"),r=this.parse8601(s),a=this.safeString(i,"id"),o=this.safeString(i,"price"),n=this.safeString(i,"amount"),d=this.safeValue(i,"order1"),h=this.safeValue(i,"order2");let c,l;c=this.safeString(d,"senderPublicKey")===this.apiKey?d:h;const u=this.safeValue(c,"assetPair");void 0!==u?l=this.getSymbolFromAssetPair(u):void 0!==t&&(l=t.symbol);const f=this.safeString(c,"orderType"),p=this.safeString(c,"id"),m={cost:this.safeString(c,"matcherFee"),currency:this.safeCurrencyCode(this.safeString(c,"matcherFeeAssetId","WAVES"))};return this.safeTrade({info:e,timestamp:r,datetime:s,symbol:l,id:a,order:p,type:void 0,side:f,takerOrMaker:void 0,price:o,amount:n,cost:void 0,fee:m},t)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={};t=this.marketCodes(t);for(let r=0;r<e.length;r++){const a=e[r],o=this.safeString(a,i),n=this.safeValue(this.currencies_by_id,o),d=this.safeString(n,"code",o);if(void 0===t||this.inArray(d,t)){let e=this.safeValue(s,d);void 0===e?e={info:[a],withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0},networks:{}}:(e=s[d],e.info=this.arrayConcat(e.info,[a]));const t=this.safeString(a,"platform_id"),i=this.safeString(n,"code"),r=this.networkIdToCode(t,i);let o=this.safeValue(e.networks,r);void 0===o&&(o={withdraw:{fee:void 0,percentage:void 0},deposit:{fee:void 0,percentage:void 0}});const h=this.safeString(a,"type"),c=this.safeValue(a,"fees");let l="deposit";"withdrawal_currency"===h&&(l="withdraw"),o[l]={fee:this.safeNumber(c,"flat"),percentage:!1},e.networks[r]=o,s[d]=e}}const r=Object.keys(s);for(let e=0;e<r.length;e++){const t=r[e],i=s[t],a=this.safeValue(i,"networks"),o=Object.keys(a);if(1===o.length){const e=this.safeValue(a,o[0]);s[t].withdraw=this.safeValue(e,"withdraw"),s[t].deposit=this.safeValue(e,"deposit")}}return s}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();let i=[],s=[];s.push(this.privateGetDepositCurrencies(t)),s.push(this.privateGetWithdrawCurrencies(t)),s=await Promise.all(s);for(let e=0;e<s.length;e++){const t=this.safeValue(s[e],"items");i=this.arrayConcat(i,t)}return this.parseDepositWithdrawFees(i,e,"id")}handleErrors(e,t,i,s,a,o,n,d,h){const c=this.safeString(n,"error"),l=this.safeBool(n,"success",!0),u=this.safeValue(this.exceptions,c);if(void 0!==u){const e=this.safeString(n,"message");throw new u(this.id+" "+e)}if("Validation Error"===this.safeString(n,"message"))throw new r.BadRequest(this.id+" "+o);if(!l)throw new r.ExchangeError(this.id+" "+o)}async withdraw(e,t,i,s=void 0,a={}){if([s,a]=this.handleWithdrawTagAndParams(s,a),"WAVES"!==e){const t=await this.privateGetWithdrawCurrencies(),i={},s=this.safeValue(t,"items",[]);for(let e=0;e<s.length;e++){const t=s[e];i[this.safeString(t,"id")]=!0}if(!(e in i)){const t=Object.keys(i);throw new r.ExchangeError(this.id+" withdraw() "+e+" not supported. Currency code must be one of "+t.toString())}}await this.loadMarkets();const n=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],d={};for(let e=0;e<n.length;e++){d[n[e]]=!0}let h=!0;const c=this.remove0xPrefix(i).toLowerCase(),l=1*c.length;for(let e=0;e<l;e++){if(!(c[e]in d)){h=!1;break}}let u;if(await this.signIn(),"WAVES"!==e||h){const s={address:i,currency:e},a=await this.privateGetWithdrawAddressesCurrencyAddress(s),o=this.safeValue(a,"currency"),n=this.safeValue(o,"allowed_amount"),d=this.safeNumber(n,"min");if(t<=d)throw new r.BadRequest(this.id+" "+e+" withdraw failed, amount "+t.toString()+" must be greater than the minimum allowed amount of "+d.toString());const h=this.safeValue(a,"proxy_addresses",[]);u=this.safeString(h,0)}else u=i;const f=this.safeInteger(this.options,"withdrawFeeWAVES",1e5),p="WAVES",m=this.toRealCurrencyAmount(e,t),g=this.currency(e),v=this.milliseconds(),y=[this.numberToBE(4,1),this.numberToBE(2,1),this.base58ToBinary(this.apiKey),this.getAssetBytes(g.id),this.getAssetBytes(p),this.numberToBE(v,8),this.numberToBE(m,8),this.numberToBE(f,8),this.base58ToBinary(u),this.numberToBE(0,2)],w=this.binaryConcatArray(y),b=this.binaryToBase16(this.base58ToBinary(this.secret)),k=this.axolotl(this.binaryToBase16(w),b,o.ev),S={senderPublicKey:this.apiKey,amount:m,fee:f,type:4,version:2,attachment:"",feeAssetId:this.getAssetId(p),proofs:[k],assetId:this.getAssetId(g.id),recipient:u,timestamp:v,signature:k},O=await this.nodePostTransactionsBroadcast(S);return this.parseTransaction(O,g)}parseTransaction(e,t=void 0){const i=(t=this.safeCurrency(void 0,t)).code,s="4"===this.safeString(e,"type")?"withdraw":"deposit",r=this.parseNumber(this.fromRealCurrencyAmount(i,this.safeString(e,"amount"))),a=this.safeString(e,"fee"),o=this.safeString(e,"feeAssetId","WAVES"),n=this.safeCurrencyCode(o),d=this.parseNumber(this.fromRealCurrencyAmount(n,a)),h=this.safeInteger(e,"timestamp");return{id:this.safeString(e,"id"),txid:void 0,timestamp:h,datetime:this.iso8601(h),network:void 0,addressFrom:this.safeString(e,"sender"),address:void 0,addressTo:this.safeString(e,"recipient"),amount:r,type:s,currency:t.code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:{currency:n,cost:d},info:e}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"whitebit",name:"WhiteBit",version:"v4",countries:["EE"],rateLimit:50,pro:!0,has:{CORS:void 0,spot:!0,margin:!0,swap:!1,future:!1,option:!1,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelOrders:!1,createConvertTrade:!0,createMarketBuyOrderWithCost:!0,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createStopLimitOrder:!0,createStopMarketOrder:!0,createStopOrder:!0,editOrder:!1,fetchBalance:!0,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchClosedOrders:!0,fetchConvertQuote:!0,fetchConvertTrade:!1,fetchConvertTradeHistory:!0,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchCurrencies:!0,fetchDeposit:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchDepositWithdrawFee:"emulated",fetchDepositWithdrawFees:!0,fetchFundingHistory:!0,fetchFundingRate:!0,fetchFundingRateHistory:!1,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrderBook:!0,fetchOrderTrades:!0,fetchPositionMode:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactionFees:!0,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","3m":"3m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","12h":"12h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},urls:{logo:"https://user-images.githubusercontent.com/1294454/66732963-8eb7dd00-ee66-11e9-849b-10d9282bb9e0.jpg",api:{v1:{public:"https://whitebit.com/api/v1/public",private:"https://whitebit.com/api/v1"},v2:{public:"https://whitebit.com/api/v2/public"},v4:{public:"https://whitebit.com/api/v4/public",private:"https://whitebit.com/api/v4"}},www:"https://www.whitebit.com",doc:"https://github.com/whitebit-exchange/api-docs",fees:"https://whitebit.com/fee-schedule",referral:"https://whitebit.com/referral/d9bdf40e-28f2-4b52-b2f9-cd1415d82963"},api:{web:{get:["v1/healthcheck"]},v1:{public:{get:["markets","tickers","ticker","symbols","depth/result","history","kline"]},private:{post:["account/balance","order/new","order/cancel","orders","account/order_history","account/executed_history","account/executed_history/all","account/order"]}},v2:{public:{get:["markets","ticker","assets","fee","depth/{market}","trades/{market}"]}},v4:{public:{get:["assets","collateral/markets","fee","orderbook/depth/{market}","orderbook/{market}","ticker","trades/{market}","time","ping","markets","futures","platform/status","mining-pool"]},private:{post:["collateral-account/balance","collateral-account/balance-summary","collateral-account/positions/history","collateral-account/leverage","collateral-account/positions/open","collateral-account/summary","collateral-account/funding-history","main-account/address","main-account/balance","main-account/create-new-address","main-account/codes","main-account/codes/apply","main-account/codes/my","main-account/codes/history","main-account/fiat-deposit-url","main-account/history","main-account/withdraw","main-account/withdraw-pay","main-account/transfer","main-account/smart/plans","main-account/smart/investment","main-account/smart/investment/close","main-account/smart/investments","main-account/fee","main-account/smart/interest-payment-history","trade-account/balance","trade-account/executed-history","trade-account/order","trade-account/order/history","order/collateral/limit","order/collateral/market","order/collateral/stop-limit","order/collateral/trigger-market","order/collateral/bulk","order/new","order/market","order/stock_market","order/stop_limit","order/stop_market","order/cancel","order/cancel/all","order/kill-switch","order/kill-switch/status","order/bulk","order/modify","order/conditional-cancel","orders","oco-orders","order/collateral/oco","order/oco-cancel","order/oto-cancel","profile/websocket_token","convert/estimate","convert/confirm","convert/history","sub-account/create","sub-account/delete","sub-account/edit","sub-account/list","sub-account/transfer","sub-account/block","sub-account/unblock","sub-account/balances","sub-account/transfer/history","sub-account/api-key/create","sub-account/api-key/edit","sub-account/api-key/delete","sub-account/api-key/list","sub-account/api-key/reset","sub-account/api-key/ip-address/list","sub-account/api-key/ip-address/create","sub-account/api-key/ip-address/delete","mining/rewards","market/fee","conditional-orders"]}}},fees:{trading:{tierBased:!1,percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0.001")}},options:{timeDifference:0,adjustForTimeDifference:!1,fiatCurrencies:["EUR","USD","RUB","UAH"],fetchBalance:{account:"spot"},accountsByType:{funding:"main",main:"main",spot:"spot",margin:"collateral",trade:"spot"},networksById:{BEP20:"BSC"},defaultType:"spot",brokerId:"ccxt"},features:{default:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!1,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:100,daysBack:void 0,untilDays:void 0,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:100,daysBack:void 0,daysBackCanceled:void 0,untilDays:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1440}},spot:{extends:"default"},swap:{linear:{extends:"default"},inverse:{extends:"default"}},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"Unauthorized request.":r.AuthenticationError,"The market format is invalid.":r.BadSymbol,"Market is not available":r.BadSymbol,"Invalid payload.":r.BadRequest,"Amount must be greater than 0":r.InvalidOrder,"Not enough balance.":r.InsufficientFunds,"The order id field is required.":r.InvalidOrder,"Not enough balance":r.InsufficientFunds,"This action is unauthorized.":r.PermissionDenied,"This API Key is not authorized to perform this action.":r.PermissionDenied,"Unexecuted order was not found.":r.OrderNotFound,"The selected from is invalid.":r.BadRequest,503:r.ExchangeNotAvailable,422:r.OrderNotFound},broad:{"This action is unauthorized":r.PermissionDenied,"Given amount is less than min amount":r.InvalidOrder,"Min amount step":r.InvalidOrder,"Total is less than":r.InvalidOrder,"fee must be no less than":r.InvalidOrder,"Enable your key in API settings":r.PermissionDenied,"You don't have such amount for transfer":r.InsufficientFunds}}})}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=await this.v4PublicGetMarkets();return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"name"),i=this.safeString(e,"stock");let s=this.safeString(e,"money");s="PERP"===s?"USDT":s;const r=this.safeCurrencyCode(i),o=this.safeCurrencyCode(s),n=this.safeValue(e,"tradesEnabled"),d=this.safeValue(e,"isCollateral");let h,c,l,u=r+"/"+o;const f="futures"===this.safeString(e,"type"),p=d&&!f;let m=!1;const g=this.parseNumber(this.parsePrecision(this.safeString(e,"stockPrec"))),v=g;let y,w;f?(l=s,c=this.safeCurrencyCode(l),u=u+":"+c,h="swap",m=!0,y=!0,w=!1):h="spot";const b=this.safeString(e,"takerFee"),k=a.Y.stringDiv(b,"100"),S=this.safeString(e,"makerFee"),O=a.Y.stringDiv(S,"100");return{id:t,symbol:u,base:r,quote:o,settle:c,baseId:i,quoteId:s,settleId:l,type:h,spot:!f,margin:p,swap:f,future:!1,option:!1,active:n,contract:m,linear:y,inverse:w,taker:this.parseNumber(k),maker:this.parseNumber(O),contractSize:v,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:g,price:this.parseNumber(this.parsePrecision(this.safeString(e,"moneyPrec")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"minAmount"),max:void 0},price:{min:void 0,max:void 0},cost:{min:this.safeNumber(e,"minTotal"),max:this.safeNumber(e,"maxTotal")}},created:void 0,info:e}}async fetchCurrencies(e={}){const t=await this.v4PublicGetAssets(e),i=Object.keys(t),s={};for(let e=0;e<i.length;e++){const r=i[e],a=t[r],o=this.safeBool(a,"can_deposit",!0),n=this.safeBool(a,"can_withdraw",!0),d=o&&n,h=this.safeCurrencyCode(r);s[h]={id:r,code:h,info:a,name:void 0,active:d,deposit:o,withdraw:n,fee:void 0,precision:void 0,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.safeNumber(a,"min_withdraw"),max:this.safeNumber(a,"max_withdraw")}}}}return s}async fetchTransactionFees(e=void 0,t={}){await this.loadMarkets();const i=await this.v4PublicGetFee(t),s=Object.keys(i),r={},a={};for(let e=0;e<s.length;e++){const t=s[e],o=i[t],n=this.safeCurrencyCode(t),d=this.safeValue(o,"withdraw",{});r[n]=this.safeString(d,"fixed");const h=this.safeValue(o,"deposit",{});a[n]=this.safeString(h,"fixed")}return{withdraw:r,deposit:a,info:i}}async fetchDepositWithdrawFees(e=void 0,t={}){await this.loadMarkets();const i=await this.v4PublicGetFee(t);return this.parseDepositWithdrawFees(i,e)}parseDepositWithdrawFees(e,t=void 0,i=void 0){const s={};t=this.marketCodes(t);const r=Object.keys(e);for(let i=0;i<r.length;i++){const a=r[i],o=a.split(" "),n=o[0],d=e[a],h=this.safeCurrencyCode(n);if(void 0===t||this.inArray(h,t)){void 0===this.safeValue(s,h)&&(s[h]=this.depositWithdrawFee({})),s[h].info[a]=d;let e=this.safeString(o,1);const t=this.safeValue(d,"withdraw"),i=this.safeValue(d,"deposit"),r=this.safeNumber(t,"fixed"),n=this.safeNumber(i,"fixed"),c={fee:r,percentage:void 0===r&&void 0},l={fee:n,percentage:void 0===n&&void 0};if(void 0!==e){const t=e.length;e=e.slice(1,t-1);const i=this.networkIdToCode(e);s[h].networks[i]={withdraw:c,deposit:l}}else s[h].withdraw=c,s[h].deposit=l}}const a=Object.keys(s);for(let e=0;e<a.length;e++){const t=a[e],i=this.currency(t);s[t]=this.assignDefaultDepositWithdrawFees(s[t],i)}return s}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.v4PublicGetAssets(e),i={};for(let e=0;e<this.symbols.length;e++){const s=this.symbols[e],r=this.market(s),o=this.safeValue(t,r.baseId,{});let n=this.safeString(o,"maker_fee"),d=this.safeString(o,"taker_fee");n=a.Y.stringDiv(n,"100"),d=a.Y.stringDiv(d,"100"),i[s]={info:o,symbol:r.symbol,percentage:!0,tierBased:!1,maker:this.parseNumber(n),taker:this.parseNumber(d)}}return i}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={market:i.id},r=await this.v1PublicGetTicker(this.extend(s,t)),a=this.safeDict(r,"result",{});return this.parseTicker(a,i)}parseTicker(e,t=void 0){const i=this.safeString(e,"tradingPairs");t=this.safeMarket(i,t);const s=this.safeStringN(e,["last","last_price","lastPrice"]),r=this.safeString(e,"close",s);return this.safeTicker({symbol:t.symbol,timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString2(e,"bid","highestBid"),bidVolume:void 0,ask:this.safeString2(e,"ask","lowestAsk"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"open"),close:r,last:s,previousClose:void 0,change:void 0,percentage:this.safeString(e,"change"),average:void 0,baseVolume:this.safeStringN(e,["base_volume","volume","baseVolume24h"]),quoteVolume:this.safeStringN(e,["quote_volume","deal","quoteVolume24h"]),info:e},t)}async fetchTickers(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);let i,s="v4PublicGetTicker";[s,t]=this.handleOptionAndParams(t,"fetchTickers","method",s),i="v4PublicGetTicker"===s?await this.v4PublicGetTicker(t):await this.v2PublicGetTicker(t);const r=this.safeList(i,"result");if(void 0!==r)return this.parseTickers(r,e);const a=Object.keys(i),o={};for(let e=0;e<a.length;e++){const t=a[e],s=this.safeMarket(t),r=this.parseTicker(i[t],s);o[r.symbol]=r}return this.filterByArrayTickers(o,"symbol",e)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={market:this.market(e).id};void 0!==t&&(s.limit=t);const r=await this.v4PublicGetOrderbookMarket(this.extend(s,i)),a=this.safeTimestamp(r,"timestamp");return this.parseOrderBook(r,e,a)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={market:r.id},o=await this.v4PublicGetTradesMarket(this.extend(a,s));return this.parseTrades(o,r,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.market=r.id);const o=await this.v4PrivatePostTradeAccountExecutedHistory(this.extend(a,s));if(Array.isArray(o))return this.parseTrades(o,r,t,i);{let e=[];const s=Object.keys(o);for(let r=0;r<s.length;r++){const a=s[r],n=this.safeMarket(a,void 0,"_"),d=this.safeValue(o,a,[]),h=this.parseTrades(d,n,t,i);e=this.arrayConcat(e,h)}return e=this.sortBy2(e,"timestamp","id"),this.filterBySinceLimit(e,t,i,"timestamp")}}parseTrade(e,t=void 0){t=this.safeMarket(void 0,t);const i=this.safeTimestamp2(e,"time","trade_timestamp"),s=this.safeString2(e,"dealOrderId","orderId"),r=this.safeString(e,"deal"),a=this.safeString(e,"price"),o=this.safeString2(e,"amount","quote_volume"),n=this.safeString2(e,"id","tradeID"),d=this.safeString2(e,"type","side"),h=t.symbol,c=this.safeInteger(e,"role");let l,u;void 0!==c&&(l=1===c?"maker":"taker");const f=this.safeString(e,"fee");return void 0!==f&&(u={cost:f,currency:this.safeCurrencyCode(this.safeString(e,"feeAsset"))}),this.safeTrade({info:e,timestamp:i,datetime:this.iso8601(i),symbol:h,id:n,order:s,type:void 0,takerOrMaker:l,side:d,price:a,amount:o,cost:r,fee:u},t)}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={market:a.id,interval:this.safeString(this.timeframes,t,t)};if(void 0!==i){const e=1440;void 0===s&&(s=e),s=Math.min(s,e);const t=this.parseToInt(i/1e3);o.start=t}void 0!==s&&(o.limit=Math.min(s,1440));const n=await this.v1PublicGetKline(this.extend(o,r)),d=this.safeList(n,"result",[]);return this.parseOHLCVs(d,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeTimestamp(e,0),this.safeNumber(e,1),this.safeNumber(e,3),this.safeNumber(e,4),this.safeNumber(e,2),this.safeNumber(e,5)]}async fetchStatus(e={}){const t=await this.v4PublicGetPing(e),i=this.safeString(t,0);return{status:"pong"===i?"ok":i,updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTime(e={}){const t=await this.v4PublicGetTime(e);return this.safeInteger(t,"time")}async createMarketOrderWithCost(e,t,i,s={}){return s.cost=i,await this.createOrder(e,"market",t,0,void 0,s)}async createMarketBuyOrderWithCost(e,t,i={}){return await this.createMarketOrderWithCost(e,"buy",t,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d={market:n.id,side:i};let h;if([h,o]=this.handleParamString(o,"cost"),void 0!==h){if("buy"!==i||"market"!==t)throw new r.InvalidOrder(this.id+" createOrder() cost is only supported for market buy orders");d.amount=this.costToPrecision(e,h)}else d.amount=this.amountToPrecision(e,s);const c=this.safeString2(o,"clOrdId","clientOrderId");if(void 0===c){const e=this.safeString(this.options,"brokerId");void 0!==e&&(d.clientOrderId=e+this.uuid16())}else d.clientOrderId=c,o=this.omit(o,["clientOrderId"]);const l=this.safeString(n,"type"),u="limit"===t,f="market"===t,p=this.safeNumberN(o,["triggerPrice","stopPrice","activation_price"]),m=void 0!==p,g=this.isPostOnly(f,!1,o),[v,y]=this.handleMarginModeAndParams("createOrder",o);if(g&&(d.postOnly=!0),void 0!==v&&"cross"!==v)throw new r.NotSupported(this.id+" createOrder() is only available for cross margin");o=this.omit(y,["postOnly","triggerPrice","stopPrice"]);const w=void 0!==v||"swap"===l;let b;return m?(d.activation_price=this.priceToPrecision(e,p),u?(d.price=this.priceToPrecision(e,a),b=await this.v4PrivatePostOrderStopLimit(this.extend(d,o))):b=w?await this.v4PrivatePostOrderCollateralTriggerMarket(this.extend(d,o)):await this.v4PrivatePostOrderStopMarket(this.extend(d,o))):u?(d.price=this.priceToPrecision(e,a),b=w?await this.v4PrivatePostOrderCollateralLimit(this.extend(d,o)):await this.v4PrivatePostOrderNew(this.extend(d,o))):b=w?await this.v4PrivatePostOrderCollateralMarket(this.extend(d,o)):void 0!==h?await this.v4PrivatePostOrderMarket(this.extend(d,o)):await this.v4PrivatePostOrderStockMarket(this.extend(d,o)),this.parseOrder(b)}async editOrder(e,t,i,s,a=void 0,o=void 0,n={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" editOrder() requires a id argument");if(void 0===t)throw new r.ArgumentsRequired(this.id+" editOrder() requires a symbol argument");await this.loadMarkets();const d={orderId:e,market:this.market(t).id},h=this.safeString2(n,"clOrdId","clientOrderId");void 0!==h&&(d.clientOrderId=h);const c="limit"===i,l=this.safeNumberN(n,["triggerPrice","stopPrice","activation_price"]),u=void 0!==l;n=this.omit(n,["clOrdId","clientOrderId","triggerPrice","stopPrice"]),u?(d.activation_price=this.priceToPrecision(t,l),c?(d.amount=this.amountToPrecision(t,a),d.price=this.priceToPrecision(t,o)):"buy"===s?d.total=this.amountToPrecision(t,a):d.amount=this.amountToPrecision(t,a)):(d.amount=this.amountToPrecision(t,a),c&&(d.price=this.priceToPrecision(t,o)));const f=await this.v4PrivatePostOrderModify(this.extend(d,n));return this.parseOrder(f)}async cancelOrder(e,t=void 0,i={}){if(void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");await this.loadMarkets();const s={market:this.market(t).id,orderId:parseInt(e)},a=await this.v4PrivatePostOrderCancel(this.extend(s,i));return this.parseOrder(a)}async cancelAllOrders(e=void 0,t={}){let i;await this.loadMarkets();const s={};let a;void 0!==e&&(i=this.market(e),s.market=i.id),[a,t]=this.handleMarketTypeAndParams("cancelAllOrders",i,t);const o=[];if("spot"===a){let e;[e,t]=this.handleOptionAndParams(t,"cancelAllOrders","isMargin",!1),e?o.push("margin"):o.push("spot")}else{if("swap"!==a)throw new r.NotSupported(this.id+" cancelAllOrders() does not support "+a+" type");o.push("futures")}s.type=o;const n=await this.v4PrivatePostOrderCancelAll(this.extend(s,t));return this.parseOrders(n,i)}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i=this.safeString(t,"symbol");if(void 0===i)throw new r.ArgumentsRequired(this.id+" cancelAllOrdersAfter() requires a symbol argument in params");const s=this.market(i);t=this.omit(t,"symbol");const a=e>0,o={market:s.id};o.timeout=a?this.numberToString(e/1e3):"null";return await this.v4PrivatePostOrderKillSwitch(this.extend(o,t))}parseBalance(e){const t=Object.keys(e),i={};for(let s=0;s<t.length;s++){const r=t[s],a=this.safeCurrencyCode(r),o=e[r];if("object"==typeof o&&void 0!==o){const e=this.account();e.free=this.safeString2(o,"available","main_balance"),e.used=this.safeString(o,"freeze"),e.total=this.safeString(o,"main_balance"),i[a]=e}else{const e=this.account();e.total=o,i[a]=e}}return this.safeBalance(i)}async fetchBalance(e={}){let t,i;if(await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),"swap"===t)i=await this.v4PrivatePostCollateralAccountBalance(e);else{const t=this.safeValue(this.options,"fetchBalance",{}),s=this.safeString(t,"account"),r=this.safeString2(e,"account","type",s);e=this.omit(e,["account","type"]),i="main"===r||"funding"===r?await this.v4PrivatePostMainAccountBalance(e):await this.v4PrivatePostTradeAccountBalance(e)}return this.parseBalance(i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.market=r.id),void 0!==i&&(a.limit=Math.min(i,100));const o=await this.v4PrivatePostOrders(this.extend(a,s));return this.parseOrders(o,r,t,i,{status:"open"})}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.market(e),e=a.symbol,r.market=a.id),void 0!==i&&(r.limit=Math.min(i,100));const o=await this.v4PrivatePostTradeAccountOrderHistory(this.extend(r,s)),n=Object.keys(o);let d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeMarket(t,void 0,"_"),s=o[t];for(let e=0;e<s.length;e++){const t=this.parseOrder(s[e],i);d.push(this.extend(t,{status:"closed"}))}}return d=this.sortBy(d,"timestamp"),d=this.filterBySymbolSinceLimit(d,e,t,i),d}parseOrderType(e){return this.safeString({limit:"limit",market:"market","stop market":"market","stop limit":"limit","stock market":"market","margin limit":"limit","margin market":"market"},e,e)}parseOrder(e,t=void 0){const i=this.safeString(e,"market"),s=(t=this.safeMarket(i,t,"_")).symbol,r=this.safeString(e,"side"),a=this.safeString(e,"dealStock");let o=this.safeString(e,"left"),n=this.safeString(e,"clientOrderId");""===n&&(n=void 0);const d=this.safeString(e,"price"),h=this.safeNumber(e,"activation_price"),c=this.safeString2(e,"orderId","id"),l=this.safeString(e,"type"),u=this.parseOrderType(l);"market"===u&&(o=void 0);let f=this.safeString(e,"amount");const p=this.safeString(e,"dealMoney");"buy"!==r||"market"!==l&&"stop market"!==l||(f=a);const m=this.safeString(e,"dealFee");let g;void 0!==m&&(g={cost:this.parseNumber(m),currency:t.quote});const v=this.safeTimestamp2(e,"ctime","timestamp"),y=this.safeTimestamp(e,"ftime");return this.safeOrder({info:e,id:c,symbol:s,clientOrderId:n,timestamp:v,datetime:this.iso8601(v),lastTradeTimestamp:y,timeInForce:void 0,postOnly:void 0,status:void 0,side:r,price:d,type:u,triggerPrice:h,amount:f,filled:a,remaining:o,average:void 0,cost:p,fee:g,trades:void 0},t)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={orderId:parseInt(e)};let o;void 0!==t&&(o=this.market(t),a.market=o.id),void 0!==s&&(a.limit=Math.min(s,100));const n=await this.v4PrivatePostTradeAccountOrder(this.extend(a,r)),d=this.safeList(n,"records",[]);return this.parseTrades(d,o)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i={ticker:this.currency(e).id};let s;if(this.isFiat(e)){const e=this.safeString(t,"provider");if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchDepositAddress() requires a provider when the ticker is fiat");i.provider=e;const a=this.safeNumber(t,"amount");if(void 0===a)throw new r.ArgumentsRequired(this.id+" fetchDepositAddress() requires an amount when the ticker is fiat");i.amount=a;if(void 0===this.safeValue(t,"uniqueId"))throw new r.ArgumentsRequired(this.id+" fetchDepositAddress() requires an uniqueId when the ticker is fiat");s=await this.v4PrivatePostMainAccountFiatDepositUrl(this.extend(i,t))}else s=await this.v4PrivatePostMainAccountAddress(this.extend(i,t));const a=this.safeString(s,"url"),o=this.safeValue(s,"account",{}),n=this.safeString(o,"address",a),d=this.safeString(o,"memo");return this.checkAddress(n),{info:s,currency:e,network:void 0,address:n,tag:d}}async setLeverage(e,t=void 0,i={}){if(await this.loadMarkets(),void 0!==t)throw new r.NotSupported(this.id+" setLeverage() does not allow to set per symbol");if(e<1||e>20)throw new r.BadRequest(this.id+" setLeverage() leverage should be between 1 and 20");const s={leverage:e};return await this.v4PrivatePostCollateralAccountLeverage(this.extend(s,i))}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsByType"),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.currencyToPrecision(e,t),c={ticker:a.id,amount:h,from:n,to:d},l=await this.v4PrivatePostMainAccountTransfer(this.extend(c,r));return this.parseTransfer(l,a)}parseTransfer(e,t=void 0){return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0}}async withdraw(e,t,i,s=void 0,a={}){await this.loadMarkets();const o=this.currency(e),n={ticker:o.id,amount:this.currencyToPrecision(e,t),address:i};let d=this.safeValue(a,"uniqueId");if(void 0===d&&(d=this.uuid22()),n.uniqueId=d,void 0!==s&&(n.memo=s),this.isFiat(e)){const e=this.safeValue(a,"provider");if(void 0===e)throw new r.ArgumentsRequired(this.id+" withdraw() requires a provider when the ticker is fiat");n.provider=e}const h=await this.v4PrivatePostMainAccountWithdraw(this.extend(n,a));return this.extend({id:d},this.parseTransaction(h,o))}parseTransaction(e,t=void 0){t=this.safeCurrency(void 0,t);const i=this.safeString(e,"address"),s=this.safeTimestamp(e,"createdAt"),r=this.safeString(e,"ticker"),a=this.safeString(e,"status"),o=this.safeString(e,"method");return{id:this.safeString(e,"uniqueId"),txid:this.safeString(e,"transactionId"),timestamp:s,datetime:this.iso8601(s),network:this.safeString(e,"network"),addressFrom:"1"===o?i:void 0,address:i,addressTo:"2"===o?i:void 0,amount:this.safeNumber(e,"amount"),type:"1"===o?"deposit":"withdrawal",currency:this.safeCurrencyCode(r,t),status:this.parseTransactionStatus(a),updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:this.safeString(e,"description"),internal:void 0,fee:{cost:this.safeNumber(e,"fee"),currency:this.safeCurrencyCode(r,t)},info:e}}parseTransactionStatus(e){return this.safeString({1:"pending",2:"pending",3:"ok",4:"canceled",5:"pending",6:"pending",7:"ok",9:"canceled",10:"pending",11:"pending",12:"pending",13:"pending",14:"pending",15:"pending",16:"pending",17:"pending"},e,e)}async fetchDeposit(e,t=void 0,i={}){let s;await this.loadMarkets();const r={transactionMethod:1,uniqueId:e,limit:1,offset:0};void 0!==t&&(s=this.currency(t),r.ticker=s.id);const a=await this.v4PrivatePostMainAccountHistory(this.extend(r,i)),o=this.safeValue(a,"records",[]),n=this.safeDict(o,0,{});return this.parseTransaction(n,s)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={transactionMethod:1,limit:100,offset:0};void 0!==e&&(r=this.currency(e),a.ticker=r.id),void 0!==i&&(a.limit=Math.min(i,100));const o=await this.v4PrivatePostMainAccountHistory(this.extend(a,s)),n=this.safeList(o,"records",[]);return this.parseTransactions(n,r,t,i)}async fetchBorrowInterest(e=void 0,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o;void 0!==t&&(o=this.market(t),a.market=o.id);const n=await this.v4PrivatePostCollateralAccountPositionsOpen(this.extend(a,r)),d=this.parseBorrowInterests(n,o);return this.filterByCurrencySinceLimit(d,e,i,s)}parseBorrowInterest(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeSymbol(i,t,"_"),r=this.safeTimestamp(e,"modifyDate");return{info:e,symbol:s,currency:"USDT",interest:this.safeNumber(e,"unrealizedFunding"),interestRate:98e-5,amountBorrowed:this.safeNumber(e,"amount"),marginMode:"cross",timestamp:r,datetime:this.iso8601(r)}}async fetchFundingRate(e,t={}){await this.loadMarkets(),e=this.symbol(e);const i=await this.fetchFundingRates([e],t);return this.safeValue(i,e)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v4PublicGetFutures(t),s=this.safeList(i,"result",[]);return this.parseFundingRates(s,e)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"ticker_id"),s=this.safeSymbol(i,t),r=this.safeNumber(e,"markPrice"),a=this.safeNumber(e,"indexPrice"),o=this.safeNumber(e,"interestRate"),n=this.safeNumber(e,"funding_rate"),d=this.safeInteger(e,"next_funding_rate_timestamp");return{info:e,symbol:s,markPrice:r,indexPrice:a,interestRate:o,timestamp:void 0,datetime:void 0,fundingRate:n,fundingTimestamp:d,fundingDatetime:this.iso8601(d),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:void 0}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){if(await this.loadMarkets(),void 0===e)throw new r.ArgumentsRequired(this.id+" fetchFundingHistory() requires a symbol argument");const a=this.market(e);let o={market:a.id};void 0!==t&&(o.startDate=t),void 0!==i&&(o.limit=t),[o,s]=this.handleUntilOption("endDate",o,s);const n=await this.v4PrivatePostCollateralAccountFundingHistory(o),d=this.safeList(n,"records",[]);return this.parseFundingHistories(d,a,t,i)}parseFundingHistory(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeInteger(e,"fundingTime");return{info:e,symbol:this.safeSymbol(i,t,void 0,"swap"),code:void 0,timestamp:s,datetime:this.iso8601(s),id:void 0,amount:this.safeNumber(e,"fundingAmount")}}parseFundingHistories(e,t=void 0,i=void 0,s=void 0){const r=[];for(let i=0;i<e.length;i++){const s=e[i];r.push(this.parseFundingHistory(s,t))}const a=this.sortBy(r,"timestamp");return this.filterBySinceLimit(a,i,s)}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.ticker=a.id),void 0!==i&&(r.limit=i);const o=await this.v4PrivatePostMainAccountHistory(this.extend(r,s)),n=this.safeList(o,"records");return this.parseTransactions(n,a,t,i)}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r=this.currency(e),a=this.currency(t),o={from:e,to:t,amount:this.numberToString(i),direction:"from"},n=await this.v4PrivatePostConvertEstimate(this.extend(o,s));return this.parseConversion(n,r,a)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a=this.currency(t),o=this.currency(i),n={quoteId:e},d=await this.v4PrivatePostConvertConfirm(this.extend(n,r));return this.parseConversion(d,a,o)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={};if(void 0!==e&&(r.fromTicker=e),void 0!==t){const e=this.parseToInt(t/1e3);r.from=this.numberToString(e)}void 0!==i&&(r.limit=i),[r,s]=this.handleUntilOption("to",r,s,.001);const a=await this.v4PrivatePostConvertHistory(this.extend(r,s)),o=this.safeList(a,"records",[]);return this.parseConversions(o,e,"fromCurrency","toCurrency",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeList(e,"path",[]),r=this.safeDict(s,0,{}),a=this.safeString(r,"from"),o=this.safeString(r,"to"),n=this.safeTimestamp2(e,"date","expireAt"),d=this.safeString(e,"from",a),h=this.safeCurrencyCode(d,t),c=this.safeString(e,"to",o),l=this.safeCurrencyCode(c,i);return{info:e,timestamp:n,datetime:this.iso8601(n),id:this.safeString(e,"id"),fromCurrency:h,fromAmount:this.safeNumber2(e,"give","finalGive"),toCurrency:l,toAmount:this.safeNumber2(e,"receive","finalReceive"),price:this.safeNumber(e,"rate"),fee:void 0}}isFiat(e){const t=this.safeValue(this.options,"fiatCurrencies",[]);return this.inArray(e,t)}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=this.omit(s,this.extractParams(e)),d=this.safeValue(t,0),h=this.safeValue(t,1),c="/"+this.implodeParams(e,s);let l=this.urls.api[d][h]+c;if("public"===h&&Object.keys(o).length&&(l+="?"+this.urlencode(o)),"private"===h){this.checkRequiredCredentials();const e=this.nonce().toString(),t=this.encode(this.secret),i="/api/"+d+c;a=this.json(this.extend({request:i,nonce:e},s));const o=this.stringToBase64(a),h=this.hmac(this.encode(o),t,n.Zf);r={"Content-Type":"application/json","X-TXC-APIKEY":this.apiKey,"X-TXC-PAYLOAD":o,"X-TXC-SIGNATURE":h}}return{url:l,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(418===e||429===e)throw new r.DDoSProtection(this.id+" "+e.toString()+" "+t+" "+o);if(404===e)throw new r.ExchangeError(this.id+" "+e.toString()+" endpoint not found");if(void 0!==n){const e=this.safeString(n,"status"),t=this.safeValue(n,"errors"),i=this.safeString(n,"message"),s=this.safeInteger(n,"code"),a=void 0!==e&&"200"!==e&&void 0!==t;if(a||void 0!==s){const t=this.id+" "+o;let s=i;if(a)s=e;else{const e=this.safeDict(n,"errors",{}),t=Object.keys(e);if(t.length>0){const i=t[0],r=this.safeValue(e,i,[]);s=r.length>0?r[0]:o}}throw this.throwExactlyMatchedException(this.exceptions.exact,s,t),this.throwBroadlyMatchedException(this.exceptions.broad,o,t),new r.ExchangeError(t)}}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"woo",name:"WOO X",countries:["KY"],rateLimit:100,version:"v1",certified:!0,pro:!0,hostname:"woox.io",has:{CORS:void 0,spot:!0,margin:!0,swap:!0,future:!1,option:!1,addMargin:!0,cancelAllOrders:!0,cancelAllOrdersAfter:!0,cancelOrder:!0,cancelWithdraw:!1,closeAllPositions:!1,closePosition:!1,createConvertTrade:!0,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketOrder:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!0,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!1,createStopLossOrder:!0,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!0,createTrailingAmountOrder:!0,createTrailingPercentOrder:!0,createTriggerOrder:!0,fetchAccounts:!0,fetchBalance:!0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchConvertCurrencies:!0,fetchConvertQuote:!0,fetchConvertTrade:!0,fetchConvertTradeHistory:!0,fetchCurrencies:!0,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!0,fetchPositionsHistory:!1,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!1,fetchTickers:!1,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:"emulated",fetchTransfers:!0,fetchWithdrawals:!0,reduceMargin:!1,sandbox:!0,setLeverage:!0,setMargin:!1,setPositionMode:!0,transfer:!0,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","12h":"12h","1d":"1d","1w":"1w","1M":"1mon","1y":"1y"},urls:{logo:"https://user-images.githubusercontent.com/1294454/150730761-1a00e5e0-d28c-480f-9e65-089ce3e6ef3b.jpg",api:{pub:"https://api-pub.woox.io",public:"https://api.{hostname}",private:"https://api.{hostname}"},test:{pub:"https://api-pub.staging.woox.io",public:"https://api.staging.woox.io",private:"https://api.staging.woox.io"},www:"https://woox.io/",doc:["https://docs.woox.io/"],fees:["https://support.woox.io/hc/en-001/articles/4404611795353--Trading-Fees"],referral:{url:"https://woox.io/register?ref=DIJT0CNL",discount:.35}},api:{v1:{pub:{get:{"hist/kline":10,"hist/trades":10}},public:{get:{info:1,"info/{symbol}":1,system_info:1,market_trades:1,token:1,token_network:1,funding_rates:1,"funding_rate/{symbol}":1,funding_rate_history:1,futures:1,"futures/{symbol}":1,"orderbook/{symbol}":1,kline:1}},private:{get:{"client/token":1,"order/{oid}":1,"client/order/{client_order_id}":1,orders:1,"client/trade/{tid}":1,"order/{oid}/trades":1,"client/trades":1,"client/hist_trades":1,"staking/yield_history":1,"client/holding":1,"asset/deposit":10,"asset/history":60,"sub_account/all":60,"sub_account/assets":60,"sub_account/asset_detail":60,"sub_account/ip_restriction":10,"asset/main_sub_transfer_history":30,token_interest:60,"token_interest/{token}":60,"interest/history":60,"interest/repay":60,"funding_fee/history":30,positions:3.33,"position/{symbol}":3.33,"client/transaction_history":60,"client/futures_leverage":60},post:{order:1,"order/cancel_all_after":1,"asset/main_sub_transfer":30,"asset/ltv":30,"asset/withdraw":30,"asset/internal_withdraw":30,"interest/repay":60,"client/account_mode":120,"client/position_mode":5,"client/leverage":120,"client/futures_leverage":30,"client/isolated_margin":30},delete:{order:1,"client/order":1,orders:1,"asset/withdraw":120}}},v2:{private:{get:{"client/holding":1}}},v3:{public:{get:{insuranceFund:3}},private:{get:{"algo/order/{oid}":1,"algo/orders":1,balances:1,accountinfo:60,positions:3.33,buypower:1,referrals:60,referral_rewards:60,"convert/exchangeInfo":1,"convert/assetInfo":1,"convert/rfq":60,"convert/trade":1,"convert/trades":1},post:{"algo/order":5,"convert/rft":60},put:{"order/{oid}":2,"order/client/{client_order_id}":2,"algo/order/{oid}":2,"algo/order/client/{client_order_id}":2},delete:{"algo/order/{order_id}":1,"algo/orders/pending":1,"algo/orders/pending/{symbol}":1,"orders/pending":1}}}},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.0002"),taker:this.parseNumber("0.0005")}},options:{timeDifference:0,adjustForTimeDifference:!1,sandboxMode:!1,createMarketBuyOrderRequiresPrice:!0,"network-aliases-for-tokens":{HT:"ERC20",OMG:"ERC20",UATOM:"ATOM",ZRX:"ZRX"},networks:{TRX:"TRON",TRC20:"TRON",ERC20:"ETH",BEP20:"BSC"},defaultNetworkCodeForCurrencies:{},transfer:{fillResponseFromRequest:!0},brokerId:"bc830de7-50f3-460b-9ee0-f430f83f9dad"},features:{default:{sandbox:!0,createOrder:{marginMode:!0,triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!1},triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!0},hedged:!1,trailing:!0,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:500,daysBack:90,untilDays:1e4,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!0,trailing:!0,symbolRequired:!1},fetchOrders:{marginMode:!1,limit:500,daysBack:void 0,untilDays:1e5,trigger:!0,trailing:!0,symbolRequired:!1},fetchClosedOrders:{marginMode:!1,limit:500,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e5,trigger:!0,trailing:!0,symbolRequired:!1},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forSwap:{extends:"default",createOrder:{hedged:!0}},swap:{linear:{extends:"forSwap"},inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{"-1000":r.OperationFailed,"-1001":r.AuthenticationError,"-1002":r.AuthenticationError,"-1003":r.RateLimitExceeded,"-1004":r.BadRequest,"-1005":r.BadRequest,"-1006":r.BadRequest,"-1007":r.BadRequest,"-1008":r.InvalidOrder,"-1009":r.BadRequest,"-1012":r.BadRequest,"-1101":r.InvalidOrder,"-1102":r.InvalidOrder,"-1103":r.InvalidOrder,"-1104":r.InvalidOrder,"-1105":r.InvalidOrder},broad:{"Can not place":r.ExchangeError,maintenance:r.OnMaintenance,"symbol must not be blank":r.BadRequest,"The token is not supported":r.BadRequest,"Your order and symbol are not valid or already canceled":r.BadRequest,"Insufficient WOO. Please enable margin trading for leverage trading":r.BadRequest}},precisionMode:o.kb})}async fetchStatus(e={}){const t=await this.v1PublicGetSystemInfo(e),i=this.safeDict(t,"data",{});let s=this.safeString(i,"status");return s=void 0===s?"error":"0"===s?"ok":"maintenance",{status:s,updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTime(e={}){const t=await this.v1PublicGetSystemInfo(e);return this.safeInteger(t,"timestamp")}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=await this.v1PublicGetInfo(e),i=this.safeList(t,"rows",[]);return this.parseMarkets(i)}parseMarket(e){const t=this.safeString(e,"symbol"),i=t.split("_"),s=this.safeString(i,0);let r,a=!1,o=!1;"SPOT"===s?(a=!0,r="spot"):"PERP"===s&&(o=!0,r="swap");const n=this.safeString(i,1),d=this.safeString(i,2),h=this.safeCurrencyCode(n),c=this.safeCurrencyCode(d);let l,u,f,p,m=h+"/"+c,g=!0;const v=o;return v&&(g=!1,l=this.safeString(i,2),u=this.safeCurrencyCode(l),m=h+"/"+c+":"+u,f=this.parseNumber("1"),p=!0),{id:t,symbol:m,base:h,quote:c,settle:u,baseId:n,quoteId:d,settleId:l,type:r,spot:a,margin:g,swap:o,future:!1,option:!1,active:"1"===this.safeString(e,"is_trading"),contract:v,linear:p,inverse:void 0,contractSize:f,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"base_tick"),price:this.safeNumber(e,"quote_tick")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"base_min"),max:this.safeNumber(e,"base_max")},price:{min:this.safeNumber(e,"quote_min"),max:this.safeNumber(e,"quote_max")},cost:{min:this.safeNumber(e,"min_notional"),max:void 0}},created:this.safeTimestamp(e,"created_time"),info:e}}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit=i);const o=await this.v1PublicGetMarketTrades(this.extend(a,s)),n=this.safeList(o,"rows",[]);return this.parseTrades(n,r,t,i)}parseTrade(e,t=void 0){const i="id"in e,s=this.safeTimestamp(e,"executed_timestamp"),r=this.safeString(e,"symbol"),o=(t=this.safeMarket(r,t)).symbol,n=this.safeString(e,"executed_price"),d=this.safeString(e,"executed_quantity"),h=this.safeString(e,"order_id"),c=this.parseTokenAndFeeTemp(e,"fee_asset","fee"),l=this.safeString(c,"cost");void 0!==l&&(c.cost=l);const u=a.Y.stringMul(n,d),f=this.safeStringLower(e,"side"),p=this.safeString(e,"id");let m;if(i){m="1"===this.safeString(e,"is_maker")?"maker":"taker"}return this.safeTrade({id:p,timestamp:s,datetime:this.iso8601(s),symbol:o,side:f,price:n,amount:d,cost:u,order:h,takerOrMaker:m,type:void 0,fee:c,info:e},t)}parseTokenAndFeeTemp(e,t,i){const s=this.safeString(e,i);let r;if(void 0!==s){const i=this.safeString(e,t);r={cost:s,currency:this.safeCurrencyCode(i)}}return r}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.v3PrivateGetAccountinfo(e),i=this.safeDict(t,"data",{}),s=this.safeString(i,"makerFeeRate"),r=this.safeString(i,"takerFeeRate"),o={};for(let e=0;e<this.symbols.length;e++){const i=this.symbols[e];o[i]={info:t,symbol:i,maker:this.parseNumber(a.Y.stringDiv(s,"10000")),taker:this.parseNumber(a.Y.stringDiv(r,"10000")),percentage:!0,tierBased:!0}}return o}async fetchCurrencies(e={}){const t={},i=await this.v1PublicGetToken(e),s=this.safeList(i,"rows",[]),r=this.groupBy(s,"balance_token"),o=Object.keys(r);for(let e=0;e<o.length;e++){const i=o[e],s=r[i],n=this.safeCurrencyCode(i);let d,h;const c={};for(let e=0;e<s.length;e++){const t=s[e];d=this.safeString(t,"fullname");const i=this.safeString(t,"token"),r=i.split("_")[0],o=this.parsePrecision(this.safeString(t,"decimals"));void 0!==o&&(h=void 0===h?o:a.Y.stringMin(o,h)),c[r]={id:i,network:r,limits:{withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:this.parseNumber(o),info:t}}t[n]={id:i,name:d,code:n,precision:this.parseNumber(h),active:void 0,fee:void 0,networks:c,deposit:void 0,withdraw:void 0,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0}},info:s}}return t}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","buy",t,1,i)}async createMarketSellOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new r.NotSupported(this.id+" createMarketSellOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","sell",t,1,i)}async createTrailingAmountOrder(e,t,i,s,a=void 0,o=void 0,n=void 0,d={}){if(void 0===o)throw new r.ArgumentsRequired(this.id+" createTrailingAmountOrder() requires a trailingAmount argument");if(void 0===n)throw new r.ArgumentsRequired(this.id+" createTrailingAmountOrder() requires a trailingTriggerPrice argument");return d.trailingAmount=o,d.trailingTriggerPrice=n,await this.createOrder(e,t,i,s,a,d)}async createTrailingPercentOrder(e,t,i,s,a=void 0,o=void 0,n=void 0,d={}){if(void 0===o)throw new r.ArgumentsRequired(this.id+" createTrailingPercentOrder() requires a trailingPercent argument");if(void 0===n)throw new r.ArgumentsRequired(this.id+" createTrailingPercentOrder() requires a trailingTriggerPrice argument");return d.trailingPercent=o,d.trailingTriggerPrice=n,await this.createOrder(e,t,i,s,a,d)}async createOrder(e,t,i,s,o=void 0,n={}){const d=this.safeBool2(n,"reduceOnly","reduce_only");n=this.omit(n,["reduceOnly","reduce_only"]);const h=t.toUpperCase();await this.loadMarkets();const c=this.market(e),l=i.toUpperCase(),u={symbol:c.id,side:l};let f;[f,n]=this.handleMarginModeAndParams("createOrder",n),void 0!==f&&(u.margin_mode=this.encodeMarginMode(f));const p=this.safeString2(n,"triggerPrice","stopPrice"),m=this.safeValue(n,"stopLoss"),g=this.safeValue(n,"takeProfit"),v=this.safeString(n,"algoType"),y=this.safeString2(n,"trailingTriggerPrice","activatedPrice",this.numberToString(o)),w=this.safeString2(n,"trailingAmount","callbackValue"),b=this.safeString2(n,"trailingPercent","callbackRate"),k=void 0!==w,S=void 0!==b,O=k||S,T=O||void 0!==p||void 0!==m||void 0!==g||void 0!==this.safeValue(n,"childOrders"),P="MARKET"===h,I=this.safeStringLower(n,"timeInForce"),M=this.isPostOnly(P,void 0,n),x=T?"reduceOnly":"reduce_only",A=T?"clientOrderId":"client_order_id",C=T?"quantity":"order_quantity",B=T?"price":"order_price";if(u[T?"type":"order_type"]=h,T||(M?u.order_type="POST_ONLY":"fok"===I?u.order_type="FOK":"ioc"===I&&(u.order_type="IOC")),d&&(u[x]=d),P||void 0===o||(u[B]=this.priceToPrecision(e,o)),P&&!T){const t=this.safeString2(n,"cost","order_amount");n=this.omit(n,["cost","order_amount"]);const i=void 0!==o;if(c.spot&&(i||void 0!==t)){let i;if(void 0!==t)i=this.costToPrecision(e,t);else{const t=this.numberToString(s),r=this.numberToString(o),n=a.Y.stringMul(t,r);i=this.costToPrecision(e,n)}u.order_amount=i}else u.order_quantity=this.amountToPrecision(e,s)}else"POSITIONAL_TP_SL"!==v&&(u[C]=this.amountToPrecision(e,s));const _=this.safeStringN(n,["clOrdID","clientOrderId","client_order_id"]);if(void 0!==_&&(u[A]=_),O){if(void 0===y)throw new r.ArgumentsRequired(this.id+" createOrder() requires a trailingTriggerPrice parameter for trailing orders");if(u.activatedPrice=this.priceToPrecision(e,y),u.algoType="TRAILING_STOP",k)u.callbackValue=w;else if(S){const e=a.Y.stringDiv(b,"100");u.callbackRate=e}}else if(void 0!==p)"TRAILING_STOP"!==v&&(u.triggerPrice=this.priceToPrecision(e,p),u.algoType="STOP");else if(void 0!==m||void 0!==g){u.algoType="BRACKET";const t={symbol:c.id,reduceOnly:!1,algoType:"POSITIONAL_TP_SL",childOrders:[]},i=t.childOrders,s="BUY"===l?"SELL":"BUY";if(void 0!==m){const t=this.safeString(m,"triggerPrice",m),r={side:s,algoType:"STOP_LOSS",triggerPrice:this.priceToPrecision(e,t),type:"CLOSE_POSITION",reduceOnly:!0};i.push(r)}if(void 0!==g){const t=this.safeString(g,"triggerPrice",g),r={side:s,algoType:"TAKE_PROFIT",triggerPrice:this.priceToPrecision(e,t),type:"CLOSE_POSITION",reduceOnly:!0};i.push(r)}u.childOrders=[t]}let E;n=this.omit(n,["clOrdID","clientOrderId","client_order_id","postOnly","timeInForce","stopPrice","triggerPrice","stopLoss","takeProfit","trailingPercent","trailingAmount","trailingTriggerPrice"]),E=T?await this.v3PrivatePostAlgoOrder(this.extend(u,n)):await this.v1PrivatePostOrder(this.extend(u,n));const N=this.safeDict(E,"data");if(void 0!==N){const e=this.safeList(N,"rows",[]);return this.parseOrder(e[0],c)}const R=this.parseOrder(E,c);return R.type=t,R}encodeMarginMode(e){return this.safeString({cross:"CROSS",isolated:"ISOLATED"},e,e)}async editOrder(e,t,i,s,r=void 0,o=void 0,n={}){await this.loadMarkets();const d=this.market(t),h={};void 0!==o&&(h.price=this.priceToPrecision(t,o)),void 0!==r&&(h.quantity=this.amountToPrecision(t,r));const c=this.safeString2(n,"clOrdID","clientOrderId"),l=this.safeString(n,"client_order_id",c),u=void 0!==l,f=this.safeNumberN(n,["triggerPrice","stopPrice","takeProfitPrice","stopLossPrice"]);void 0!==f&&(h.triggerPrice=this.priceToPrecision(t,f));const p=this.safeString2(n,"trailingTriggerPrice","activatedPrice",this.numberToString(o)),m=this.safeString2(n,"trailingAmount","callbackValue"),g=this.safeString2(n,"trailingPercent","callbackRate"),v=void 0!==m,y=void 0!==g,w=v||y;if(w)if(void 0!==p&&(h.activatedPrice=this.priceToPrecision(t,p)),v)h.callbackValue=m;else if(y){const e=a.Y.stringDiv(g,"100");h.callbackRate=e}n=this.omit(n,["clOrdID","clientOrderId","client_order_id","stopPrice","triggerPrice","takeProfitPrice","stopLossPrice","trailingTriggerPrice","trailingAmount","trailingPercent"]);const b=w||void 0!==f||void 0!==this.safeValue(n,"childOrders");let k;u?(h.client_order_id=l,k=b?await this.v3PrivatePutAlgoOrderClientClientOrderId(this.extend(h,n)):await this.v3PrivatePutOrderClientClientOrderId(this.extend(h,n))):(h.oid=e,k=b?await this.v3PrivatePutAlgoOrderOid(this.extend(h,n)):await this.v3PrivatePutOrderOid(this.extend(h,n)));const S=this.safeDict(k,"data",{});return this.parseOrder(S,d)}async cancelOrder(e,t=void 0,i={}){const s=this.safeBool2(i,"trigger","stop",!1);if(i=this.omit(i,["trigger","stop"]),!s&&void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={},n=this.safeString2(i,"clOrdID","clientOrderId"),d=this.safeString(i,"client_order_id",n),h=void 0!==d;let c;s?(o.order_id=e,c=await this.v3PrivateDeleteAlgoOrderOrderId(this.extend(o,i))):(o.symbol=a.id,h?(o.client_order_id=d,i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]),c=await this.v1PrivateDeleteClientOrder(this.extend(o,i))):(o.order_id=e,c=await this.v1PrivateDeleteOrder(this.extend(o,i))));const l={symbol:t};return h?l.client_order_id=d:l.id=e,this.extend(this.parseOrder(c),l)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=this.safeBool2(t,"stop","trigger");if(t=this.omit(t,["stop","trigger"]),i)return await this.v3PrivateDeleteAlgoOrdersPending(t);if(void 0===e)throw new r.ArgumentsRequired(this.id+" cancelOrders() requires a symbol argument");const s={symbol:this.market(e).id},a=await this.v1PrivateDeleteOrders(this.extend(s,t));return[this.safeOrder(a)]}async cancelAllOrdersAfter(e,t={}){await this.loadMarkets();const i={trigger_after:e>0?e:0},s=await this.v1PrivatePostOrderCancelAllAfter(this.extend(i,t));return[this.safeOrder(s)]}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s=void 0!==t?this.market(t):void 0,r=this.safeBool2(i,"stop","trigger");i=this.omit(i,["stop","trigger"]);const a={},o=this.safeString2(i,"clOrdID","clientOrderId");let n;r?(a.oid=e,n=await this.v3PrivateGetAlgoOrderOid(this.extend(a,i))):o?(a.client_order_id=o,n=await this.v1PrivateGetClientOrderClientOrderId(this.extend(a,i))):(a.oid=e,n=await this.v1PrivateGetOrderOid(this.extend(a,i)));const d=this.safeDict(n,"data",n);return this.parseOrder(d,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchOrders",e,t,i,s,"page",500);const a={};let o;const n=this.safeBool2(s,"stop","trigger"),d=this.safeBool(s,"trailing",!1);let h;s=this.omit(s,["stop","trailing","trigger"]),void 0!==e&&(o=this.market(e),a.symbol=o.id),void 0!==t&&(n||d?a.createdTimeStart=t:a.start_t=t),a.size=void 0!==i?i:500,n?a.algoType="stop":d&&(a.algoType="TRAILING_STOP"),h=n||d?await this.v3PrivateGetAlgoOrders(this.extend(a,s)):await this.v1PrivateGetOrders(this.extend(a,s));const c=this.safeValue(h,"data",h),l=this.safeList(c,"rows");return this.parseOrders(l,o,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"INCOMPLETE"});return await this.fetchOrders(e,t,i,r)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"COMPLETED"});return await this.fetchOrders(e,t,i,r)}parseTimeInForce(e){return this.safeString({ioc:"IOC",fok:"FOK",post_only:"PO"},e,void 0)}parseOrder(e,t=void 0){const i=this.safeTimestampN(e,["timestamp","created_time","createdTime"]),s=this.safeStringN(e,["order_id","orderId","algoOrderId"]),r=this.omitZero(this.safeString2(e,"client_order_id","clientOrderId")),a=this.safeString(e,"symbol"),o=(t=this.safeMarket(a,t)).symbol,n=this.safeString2(e,"order_price","price"),d=this.safeString2(e,"order_quantity","quantity"),h=this.safeString2(e,"order_amount","amount"),c=this.safeStringLower2(e,"order_type","type"),l=this.safeValue2(e,"status","algoStatus"),u=this.safeStringLower(e,"side"),f=this.omitZero(this.safeValue2(e,"executed","totalExecutedQuantity")),p=this.omitZero(this.safeString2(e,"average_executed_price","averageExecutedPrice")),m=this.safeNumber2(e,"total_fee","totalFee"),g=this.safeString2(e,"fee_asset","feeAsset"),v=this.safeValue(e,"Transactions"),y=this.safeNumber(e,"triggerPrice");let w,b;const k=this.safeValue(e,"childOrders");if(void 0!==k){const e=this.safeValue(k,0),t=this.safeValue(e,"childOrders",[]);if(t.length>0){const e=this.safeValue(t,0),i=this.safeValue(t,1);w=this.safeNumber(e,"triggerPrice"),b=this.safeNumber(i,"triggerPrice")}}const S=this.safeTimestamp2(e,"updatedTime","updated_time");return this.safeOrder({id:s,clientOrderId:r,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,lastUpdateTimestamp:S,status:this.parseOrderStatus(l),symbol:o,type:c,timeInForce:this.parseTimeInForce(c),postOnly:void 0,reduceOnly:this.safeBool(e,"reduce_only"),side:u,price:n,triggerPrice:y,takeProfitPrice:w,stopLossPrice:b,average:p,amount:d,filled:f,remaining:void 0,cost:h,trades:v,fee:{cost:m,currency:g},info:e},t)}parseOrderStatus(e){if(void 0!==e){const t={NEW:"open",FILLED:"closed",CANCEL_SENT:"canceled",CANCEL_ALL_SENT:"canceled",CANCELLED:"canceled",PARTIAL_FILLED:"open",REJECTED:"rejected",INCOMPLETE:"open",COMPLETED:"closed"};return this.safeString(t,e,e)}return e}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(t=Math.min(t,1e3),s.max_level=t);const r=await this.v1PublicGetOrderbookSymbol(this.extend(s,i)),a=this.safeInteger(r,"timestamp");return this.parseOrderBook(r,e,a,"bids","asks","price","quantity")}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,type:this.safeString(this.timeframes,t,t)};let n,d=void 0!==i;if(void 0!==s&&void 0!==i){const e=1e3*this.parseTimeframe(t)*999;d=i<this.milliseconds()-e}d?o.start_time=i:void 0!==s&&(o.limit=Math.min(s,1e3)),d?(n=await this.v1PubGetHistKline(this.extend(o,r)),n=this.safeDict(n,"data")):n=await this.v1PublicGetKline(this.extend(o,r));const h=this.safeList(n,"rows",[]);return this.parseOHLCVs(h,a,t,i,s)}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"start_timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={oid:e},n=await this.v1PrivateGetOrderOidTrades(this.extend(o,r)),d=this.safeList(n,"rows",[]);return this.parseTrades(d,a,i,s,r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchMyTrades",e,t,i,s,"page",500);let a,o={};void 0!==e&&(a=this.market(e),o.symbol=a.id),void 0!==t&&(o.start_t=t),[o,s]=this.handleUntilOption("end_t",o,s),o.size=void 0!==i?i:500;const n=await this.v1PrivateGetClientTrades(this.extend(o,s)),d=this.safeList(n,"rows",[]);return this.parseTrades(d,a,t,i,s)}async fetchAccounts(e={}){const t=await this.v1PrivateGetSubAccountAssets(e),i=this.safeList(t,"rows",[]);return this.parseAccounts(i,e)}parseAccount(e){const t=this.safeString(e,"account");return{info:e,id:this.safeString(e,"application_id"),name:t,code:void 0,type:"Main"===t?"main":"subaccount"}}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v3PrivateGetBalances(e),i=this.safeDict(t,"data");return this.parseBalance(i)}parseBalance(e){const t={info:e},i=this.safeList(e,"holding",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeCurrencyCode(this.safeString(s,"token")),a=this.account();a.total=this.safeString(s,"holding"),a.free=this.safeString(s,"availableBalance"),t[r]=a}return this.safeBalance(t)}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s=this.defaultNetworkCodeForCurrency(e),r=this.safeString(t,"network",s);t=this.omit(t,"network");const a={token:r+"_"+i.code},o=await this.v1PrivateGetAssetDeposit(this.extend(a,t)),n=this.safeString(o,"extra"),d=this.safeString(o,"address");return this.checkAddress(d),{info:o,currency:e,network:r,address:d,tag:n}}async getAssetHistoryRows(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.balance_token=a.id),void 0!==t&&(r.start_t=t),void 0!==i&&(r.pageSize=i);const o=this.safeString(s,"type");s=this.omit(s,"type"),void 0!==o&&(r.type=o);const n=await this.v1PrivateGetAssetHistory(this.extend(r,s));return[a,this.safeList(n,"rows",[])]}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const r=await this.getAssetHistoryRows(e,t,i,s),a=this.safeValue(r,0),o=this.safeList(r,1);return this.parseLedger(o,a,t,i,s)}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"token"),s=this.getCurrencyFromChaincode(i,t).code;t=this.safeCurrency(s,t);const r=this.safeNumber(e,"amount"),a="DEPOSIT"===this.safeString(e,"token_side")?"in":"out",o=this.safeTimestamp(e,"created_time"),n=this.parseTokenAndFeeTemp(e,"fee_token","fee_amount");return this.safeLedgerEntry({info:e,id:this.safeString(e,"id"),currency:s,account:this.safeString(e,"account"),referenceAccount:void 0,referenceId:this.safeString(e,"tx_id"),status:this.parseTransactionStatus(this.safeString(e,"status")),amount:r,before:void 0,after:void 0,direction:a,timestamp:o,datetime:this.iso8601(o),type:this.parseLedgerEntryType(this.safeString(e,"type")),fee:n},t)}parseLedgerEntryType(e){return this.safeString({BALANCE:"transaction",COLLATERAL:"transfer"},e,e)}getCurrencyFromChaincode(e,t){if(void 0!==t)return t;{const i=e.split("_"),s=i.length,r=this.safeString(i,0);let a=this.safeString(i,1,r);s>2&&(a+="_"+this.safeString(i,2)),t=this.safeCurrency(a)}return t}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({token_side:"DEPOSIT"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({token_side:"WITHDRAW"},s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){const r=await this.getAssetHistoryRows(e,t,i,this.extend({type:"BALANCE"},s)),a=this.safeValue(r,0),o=this.safeList(r,1);return this.parseTransactions(o,a,t,i,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"token"),s=this.getCurrencyFromChaincode(i,t).code;let r=this.safeStringLower(e,"token_side");"withdraw"===r&&(r="withdrawal");const a=this.parseTokenAndFeeTemp(e,"fee_token","fee_amount"),o=this.safeString(e,"target_address"),n=this.safeString(e,"source_address"),d=this.safeTimestamp(e,"created_time");return{info:e,id:this.safeString2(e,"id","withdraw_id"),txid:this.safeString(e,"tx_id"),timestamp:d,datetime:this.iso8601(d),address:void 0,addressFrom:n,addressTo:o,tag:this.safeString(e,"extra"),tagFrom:void 0,tagTo:void 0,type:r,amount:this.safeNumber(e,"amount"),currency:s,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:this.safeTimestamp(e,"updated_time"),comment:void 0,internal:void 0,fee:a,network:void 0}}parseTransactionStatus(e){return this.safeString({NEW:"pending",CONFIRMING:"pending",PROCESSING:"pending",COMPLETED:"ok",CANCELED:"canceled"},e,e)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={token:a.id,amount:this.parseToNumeric(t),from_application_id:i,to_application_id:s},n=await this.v1PrivatePostAssetMainSubTransfer(this.extend(o,r)),d=this.parseTransfer(n,a),h=this.safeDict(this.options,"transfer",{});return this.safeBool(h,"fillResponseFromRequest",!0)&&(d.amount=t,d.fromAccount=i,d.toAccount=s),d}async fetchTransfers(e=void 0,t=void 0,i=void 0,s={}){const r={};void 0!==i&&(r.size=i),void 0!==t&&(r.start_t=t);const a=this.safeInteger(s,"until");s=this.omit(s,["until"]),void 0!==a&&(r.end_t=a);const o=await this.v1PrivateGetAssetMainSubTransferHistory(this.extend(r,s)),n=this.safeList(o,"rows",[]);return this.parseTransfers(n,void 0,t,i,s)}parseTransfer(e,t=void 0){const i=this.safeString(e,"token"),s=this.getCurrencyFromChaincode(i,t).code,r=this.safeTimestamp(e,"created_time"),a=this.safeBool(e,"success");let o;return void 0!==a&&(o=a?"ok":"failed"),{id:this.safeString(e,"id"),timestamp:r,datetime:this.iso8601(r),currency:s,amount:this.safeNumber(e,"amount"),fromAccount:this.safeString(e,"from_application_id"),toAccount:this.safeString(e,"to_application_id"),status:this.parseTransferStatus(this.safeString(e,"status",o)),info:e}}parseTransferStatus(e){return this.safeString({NEW:"pending",CONFIRMING:"pending",PROCESSING:"pending",COMPLETED:"ok",CANCELED:"canceled"},e,e)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),await this.loadMarkets(),this.checkAddress(i);const o=this.currency(e),n={amount:t,address:i};void 0!==s&&(n.extra=s);const d=this.safeDict(this.options,"networks",{}),h=this.safeDict(o,"networks",{}),c=this.safeStringUpper(a,"network"),l=this.safeString(d,c,c),u=this.safeDict(h,l,{}),f=this.safeString(u,"id");if(void 0===f)throw new r.BadRequest(this.id+" withdraw() require network parameter");n.token=f;const p=await this.v1PrivatePostAssetWithdraw(this.extend(n,a));return this.parseTransaction(p,o)}async repayMargin(e,t,i=void 0,s={}){let r;await this.loadMarkets(),void 0!==i&&(r=this.market(i),i=r.symbol);const a=this.currency(e),o={token:a.id,amount:this.currencyToPrecision(e,t)},n=await this.v1PrivatePostInterestRepay(this.extend(o,s)),d=this.parseMarginLoan(n,a);return this.extend(d,{amount:t,symbol:i})}parseMarginLoan(e,t=void 0){return{id:void 0,currency:this.safeCurrencyCode(void 0,t),amount:void 0,symbol:void 0,timestamp:void 0,datetime:void 0,info:e}}nonce(){return this.milliseconds()-this.options.timeDifference}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=t[0],d=t[1],h=this.implodeParams(e,s);let c=this.implodeHostname(this.urls.api[d]);if(c+="/"+o+"/",s=this.omit(s,this.extractParams(e)),s=this.keysort(s),"public"===d)c+=d+"/"+h,Object.keys(s).length&&(c+="?"+this.urlencode(s));else if("pub"===d)c+=h,Object.keys(s).length&&(c+="?"+this.urlencode(s));else{if(this.checkRequiredCredentials(),"POST"===i&&("algo/order"===e||"order"===e)){if(!this.safeBool(this.options,"sandboxMode",!1)){const t="bc830de7-50f3-460b-9ee0-f430f83f9dad",i=this.safeString(this.options,"brokerId",t);e.indexOf("algo")>-1?s.brokerId=i:s.broker_id=i}s=this.keysort(s)}let t="";const d=this.nonce().toString();if(c+=h,r={"x-api-key":this.apiKey,"x-api-timestamp":d},"v3"===o){if(t=d+i+"/"+o+"/"+h,"POST"===i||"PUT"===i||"DELETE"===i)t+=a=this.json(s);else if(Object.keys(s).length){const e=this.urlencode(s);c+="?"+e,t+="?"+e}r["content-type"]="application/json"}else t=this.urlencode(s),"POST"===i||"PUT"===i||"DELETE"===i?a=t:Object.keys(s).length&&(c+="?"+t),t+="|"+d,r["content-type"]="application/x-www-form-urlencoded";r["x-api-signature"]=this.hmac(this.encode(t),this.encode(this.secret),n.s)}return{url:c,method:i,body:a,headers:r}}handleErrors(e,t,i,s,r,a,o,n,d){if(!o)return;const h=this.safeBool(o,"success"),c=this.safeString(o,"code");if(!h){const e=this.id+" "+this.json(o);this.throwBroadlyMatchedException(this.exceptions.broad,a,e),this.throwExactlyMatchedException(this.exceptions.exact,c,e)}}parseIncome(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t);let r=this.safeString(e,"funding_fee");const o=this.safeCurrencyCode("USD"),n=this.safeString(e,"id"),d=this.safeTimestamp(e,"updated_time"),h=this.safeNumber(e,"funding_rate");return r="Pay"===this.safeString(e,"payment_type")?a.Y.stringNeg(r):r,{info:e,symbol:s,code:o,timestamp:d,datetime:this.iso8601(d),id:n,amount:this.parseNumber(r),rate:h}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingHistory","paginate"),r)return await this.fetchPaginatedCallCursor("fetchFundingHistory",e,t,i,s,"page","page",1,500);const a={};let o;void 0!==e&&(o=this.market(e),a.symbol=o.id),void 0!==t&&(a.start_t=t),a.size=void 0!==i?i:5e3;const n=await this.v1PrivateGetFundingFeeHistory(this.extend(a,s)),d=this.safeDict(n,"meta",{}),h=this.safeInteger(d,"current_page"),c=this.safeList(n,"rows",[]),l=c.length;if(l>0){const e=c[l-1];e.page=h,c[l-1]=e}return this.parseIncomes(c,o,t,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol");t=this.market(i);const s=this.safeInteger(e,"next_funding_time"),r=this.safeInteger(e,"est_funding_rate_timestamp"),a=this.safeInteger(e,"last_funding_rate_timestamp"),o=this.safeString(e,"est_funding_rate_interval");return{info:e,symbol:t.symbol,markPrice:void 0,indexPrice:void 0,interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:r,datetime:this.iso8601(r),fundingRate:this.safeNumber(e,"est_funding_rate"),fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:this.safeNumber(e,"last_funding_rate"),previousFundingTimestamp:a,previousFundingDatetime:this.iso8601(a),interval:o+"h"}}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetFundingRateSymbol(this.extend(s,t));return this.parseFundingRate(r,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v1PublicGetFundingRates(t),s=this.safeList(i,"rows",[]);return this.parseFundingRates(s,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchFundingRateHistory",e,t,i,s,"page",25);let a={};if(void 0!==e){const t=this.market(e);e=t.symbol,a.symbol=t.id}void 0!==t&&(a.start_t=this.parseToInt(t/1e3)),[a,s]=this.handleUntilOption("end_t",a,s,.001);const o=await this.v1PublicGetFundingRateHistory(this.extend(a,s)),n=this.safeList(o,"rows"),d=[];for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"symbol"),s=this.safeInteger(t,"funding_rate_timestamp");d.push({info:t,symbol:this.safeSymbol(i),fundingRate:this.safeNumber(t,"funding_rate"),timestamp:s,datetime:this.iso8601(s)})}const h=this.sortBy(d,"timestamp");return this.filterBySymbolSinceLimit(h,e,t,i)}async setPositionMode(e,t=void 0,i={}){let s;s=e?"HEDGE_MODE":"ONE_WAY";const r={position_mode:s};return await this.v1PrivatePostClientPositionMode(this.extend(r,i))}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e);let s;if(i.spot)s=await this.v3PrivateGetAccountinfo(t);else{if(!i.swap)throw new r.NotSupported(this.id+" fetchLeverage() is not supported for "+i.type+" markets");{const e={symbol:i.id};let r;[r,t]=this.handleMarginModeAndParams("fetchLeverage",t,"cross"),e.margin_mode=this.encodeMarginMode(r),s=await this.v1PrivateGetClientFuturesLeverage(this.extend(e,t))}}const a=this.safeDict(s,"data",{});return this.parseLeverage(a,i)}parseLeverage(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);const s=this.safeStringLower(e,"default_margin_mode"),r=this.safeInteger(e,"leverage");let a=r,o=r;const n=this.safeList(e,"details",[]);for(let e=0;e<n.length;e++){const t=this.safeDict(n,e,{}),i=this.safeInteger(t,"leverage"),s=this.safeString(t,"position_side");"BOTH"===s?(a=i,o=i):"LONG"===s?a=i:"SHORT"===s&&(o=i)}return{info:e,symbol:t.symbol,marginMode:s,longLeverage:a,shortLeverage:o}}async setLeverage(e,t=void 0,i={}){await this.loadMarkets();const s={leverage:e};let a;if(void 0!==t&&(a=this.market(t)),void 0===t||a.spot)return await this.v1PrivatePostClientLeverage(this.extend(s,i));if(a.swap){let e;return s.symbol=a.id,[e,i]=this.handleMarginModeAndParams("fetchLeverage",i,"cross"),s.margin_mode=this.encodeMarginMode(e),await this.v1PrivatePostClientFuturesLeverage(this.extend(s,i))}throw new r.NotSupported(this.id+" fetchLeverage() is not supported for "+a.type+" markets")}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"ADD",i)}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"REDUCE",i)}async modifyMarginHelper(e,t,i,s={}){await this.loadMarkets();const r={symbol:this.market(e).id,adjust_token:"USDT",adjust_amount:t,action:i};return await this.v1PrivatePostClientIsolatedMargin(this.extend(r,s))}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PrivateGetPositionSymbol(this.extend(s,t));return this.parsePosition(r,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.v3PrivateGetPositions(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"positions",[]);return this.parsePositions(r,e)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);let s,r=this.safeString(e,"holding");s=a.Y.stringGt(r,"0")?"long":"short";const o=this.safeString(t,"contractSize"),n=this.safeString2(e,"markPrice","mark_price"),d=this.safeTimestamp(e,"timestamp"),h=this.safeString2(e,"averageOpenPrice","average_open_price"),c=a.Y.stringSub(n,h),l=a.Y.stringMul(c,r);r=a.Y.stringAbs(r);const u=a.Y.stringMul(r,n),f=this.safeString(e,"positionSide");return this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:d,datetime:this.iso8601(d),lastUpdateTimestamp:void 0,initialMargin:void 0,initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,entryPrice:this.parseNumber(h),notional:this.parseNumber(u),leverage:this.safeNumber(e,"leverage"),unrealizedPnl:this.parseNumber(l),contracts:this.parseNumber(r),contractSize:this.parseNumber(o),marginRatio:void 0,liquidationPrice:this.safeNumber2(e,"estLiqPrice","est_liq_price"),markPrice:this.parseNumber(n),lastPrice:void 0,collateral:void 0,marginMode:this.safeStringLower2(e,"marginMode","margin_mode"),side:s,percentage:void 0,hedged:"BOTH"!==f,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchConvertQuote(e,t,i=void 0,s={}){await this.loadMarkets();const r={sellToken:e.toUpperCase(),buyToken:t.toUpperCase(),sellQuantity:this.numberToString(i)},a=await this.v3PrivateGetConvertRfq(this.extend(r,s)),o=this.safeDict(a,"data",{}),n=this.safeString(o,"sellToken",e),d=this.currency(n),h=this.safeString(o,"buyToken",t),c=this.currency(h);return this.parseConversion(o,d,c)}async createConvertTrade(e,t,i,s=void 0,r={}){await this.loadMarkets();const a={quoteId:e},o=await this.v3PrivatePostConvertRft(this.extend(a,r)),n=this.safeDict(o,"data",{});return this.parseConversion(n)}async fetchConvertTrade(e,t=void 0,i={}){await this.loadMarkets();const s={quoteId:e},r=await this.v3PrivateGetConvertTrade(this.extend(s,i)),a=this.safeDict(r,"data",{}),o=this.safeString(a,"sellAsset"),n=this.safeString(a,"buyAsset");let d,h;return void 0!==o&&(d=this.currency(o)),void 0!==n&&(h=this.currency(n)),this.parseConversion(a,d,h)}async fetchConvertTradeHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r={};[r,s]=this.handleUntilOption("endTime",r,s),void 0!==t&&(r.startTime=t),void 0!==i&&(r.size=i);const a=await this.v3PrivateGetConvertTrades(this.extend(r,s)),o=this.safeDict(a,"data",{}),n=this.safeList(o,"tradeVos",[]);return this.parseConversions(n,e,"sellAsset","buyAsset",t,i)}parseConversion(e,t=void 0,i=void 0){const s=this.safeInteger2(e,"expireTimestamp","createdTime"),r=this.safeString2(e,"sellToken","buyAsset"),a=this.safeCurrencyCode(r,t),o=this.safeString2(e,"buyToken","sellAsset"),n=this.safeCurrencyCode(o,i);return{info:e,timestamp:s,datetime:this.iso8601(s),id:this.safeString(e,"quoteId"),fromCurrency:a,fromAmount:this.safeNumber2(e,"sellQuantity","sellAmount"),toCurrency:n,toAmount:this.safeNumber2(e,"buyQuantity","buyAmount"),price:this.safeNumber(e,"buyPrice"),fee:void 0}}async fetchConvertCurrencies(e={}){await this.loadMarkets();const t=await this.v3PrivateGetConvertAssetInfo(e),i={},s=this.safeList(t,"rows",[]);for(let e=0;e<s.length;e++){const t=s[e],r=this.safeString(t,"token"),a=this.safeCurrencyCode(r);i[a]={info:t,id:r,code:a,networks:void 0,type:void 0,name:void 0,active:void 0,deposit:void 0,withdraw:void 0,fee:void 0,precision:this.safeNumber(t,"tick"),limits:{amount:{min:void 0,max:void 0},withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},created:this.safeTimestamp(t,"createdTime")}}return i}defaultNetworkCodeForCurrency(e){const t=this.currency(e).networks,i=Object.keys(t);for(let e=0;e<i.length;e++){const t=i[e];if("ETH"===t)return t}return this.safeValue(i,0)}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}}
class l extends s.A{describe(){return this.deepExtend(super.describe(),{id:"woofipro",name:"WOOFI PRO",countries:["KY"],rateLimit:100,version:"v1",certified:!0,pro:!0,dex:!0,hostname:"dex.woo.org",has:{CORS:void 0,spot:!1,margin:!1,swap:!0,future:!1,option:!1,addMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,cancelWithdraw:!1,closeAllPositions:!1,closePosition:!1,createConvertTrade:!1,createDepositAddress:!1,createMarketBuyOrderWithCost:!1,createMarketOrder:!1,createMarketOrderWithCost:!1,createMarketSellOrderWithCost:!1,createOrder:!0,createOrderWithTakeProfitAndStopLoss:!0,createReduceOnlyOrder:!0,createStopLimitOrder:!1,createStopLossOrder:!0,createStopMarketOrder:!1,createStopOrder:!1,createTakeProfitOrder:!0,createTrailingAmountOrder:!1,createTrailingPercentOrder:!1,createTriggerOrder:!0,fetchAccounts:!1,fetchBalance:!0,fetchCanceledOrders:!1,fetchClosedOrder:!1,fetchClosedOrders:!0,fetchConvertCurrencies:!1,fetchConvertQuote:!1,fetchCurrencies:!0,fetchDepositAddress:!1,fetchDeposits:!0,fetchDepositsWithdrawals:!0,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!0,fetchIndexOHLCV:!1,fetchLedger:!0,fetchLeverage:!0,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrders:!0,fetchOrderTrades:!0,fetchPosition:!0,fetchPositionMode:!1,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchStatus:!0,fetchTicker:!1,fetchTickers:!1,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:"emulated",fetchTransfers:!1,fetchWithdrawals:!0,reduceMargin:!1,setLeverage:!0,setMargin:!1,setPositionMode:!1,transfer:!1,withdraw:!0},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","4h":"4h","12h":"12h","1d":"1d","1w":"1w","1M":"1mon","1y":"1y"},urls:{logo:"https://github.com/user-attachments/assets/9ba21b8a-a9c7-4770-b7f1-ce3bcbde68c1",api:{public:"https://api-evm.orderly.org",private:"https://api-evm.orderly.org"},test:{public:"https://testnet-api-evm.orderly.org",private:"https://testnet-api-evm.orderly.org"},www:"https://dex.woo.org",doc:["https://orderly.network/docs/build-on-evm/building-on-evm"],fees:["https://dex.woo.org/en/orderly"],referral:{url:"https://dex.woo.org/en/trade?ref=CCXT",discount:.05}},api:{v1:{public:{get:{"public/volume/stats":1,"public/broker/name":1,"public/chain_info/{broker_id}":1,"public/system_info":1,"public/vault_balance":1,"public/insurancefund":1,"public/chain_info":1,"faucet/usdc":1,"public/account":1,get_account:1,registration_nonce:1,get_orderly_key:1,"public/liquidation":1,"public/liquidated_positions":1,"public/config":1,"public/campaign/ranking":10,"public/campaign/stats":10,"public/campaign/user":10,"public/campaign/stats/details":10,"public/campaigns":10,"public/points/leaderboard":1,"client/points":1,"public/points/epoch":1,"public/points/epoch_dates":1,"public/referral/check_ref_code":1,"public/referral/verify_ref_code":1,"referral/admin_info":1,"referral/info":1,"referral/referee_info":1,"referral/referee_rebate_summary":1,"referral/referee_history":1,"referral/referral_history":1,"referral/rebate_summary":1,"client/distribution_history":1,"tv/config":1,"tv/history":1,"tv/symbol_info":1,"public/funding_rate_history":1,"public/funding_rate/{symbol}":.33,"public/funding_rates":1,"public/info":1,"public/info/{symbol}":1,"public/market_trades":1,"public/token":1,"public/futures":1,"public/futures/{symbol}":1},post:{register_account:1}},private:{get:{"client/key_info":6,"client/orderly_key_ip_restriction":6,"order/{oid}":1,"client/order/{client_order_id}":1,"algo/order/{oid}":1,"algo/client/order/{client_order_id}":1,orders:1,"algo/orders":1,"trade/{tid}":1,trades:1,"order/{oid}/trades":1,"client/liquidator_liquidations":1,liquidations:1,"asset/history":60,"client/holding":1,withdraw_nonce:1,settle_nonce:1,"pnl_settlement/history":1,"volume/user/daily":60,"volume/user/stats":60,"client/statistics":60,"client/info":60,"client/statistics/daily":60,positions:3.33,"position/{symbol}":3.33,"funding_fee/history":30,"notification/inbox/notifications":60,"notification/inbox/unread":60,"volume/broker/daily":60,"broker/fee_rate/default":10,"broker/user_info":10,"orderbook/{symbol}":1,kline:1},post:{orderly_key:1,"client/set_orderly_key_ip_restriction":6,"client/reset_orderly_key_ip_restriction":6,order:1,"batch-order":10,"algo/order":1,liquidation:1,claim_insurance_fund:1,withdraw_request:1,settle_pnl:1,"notification/inbox/mark_read":60,"notification/inbox/mark_read_all":60,"client/leverage":120,"client/maintenance_config":60,delegate_signer:10,delegate_orderly_key:10,delegate_settle_pnl:10,delegate_withdraw_request:10,"broker/fee_rate/set":10,"broker/fee_rate/set_default":10,"broker/fee_rate/default":10,"referral/create":10,"referral/update":10,"referral/bind":10,"referral/edit_split":10},put:{order:1,"algo/order":1},delete:{order:1,"algo/order":1,"client/order":1,"algo/client/order":1,"algo/orders":1,orders:1,"batch-order":1,"client/batch-order":1}}}},requiredCredentials:{apiKey:!0,secret:!0,accountId:!0,privateKey:!1},fees:{trading:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.0002"),taker:this.parseNumber("0.0005")}},options:{sandboxMode:!1,brokerId:"CCXT",verifyingContractAddress:"0x6F7a338F2aA472838dEFD3283eB360d4Dff5D203"},features:{default:{sandbox:!0,createOrder:{marginMode:!1,triggerPrice:!0,triggerPriceType:void 0,triggerDirection:!1,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!0,leverage:!0,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!0},createOrders:{max:10},fetchMyTrades:{marginMode:!1,limit:500,daysBack:void 0,untilDays:1e5,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:500,trigger:!0,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!1,limit:500,daysBack:void 0,daysBackCanceled:void 0,untilDays:1e5,trigger:!0,trailing:!1,symbolRequired:!1},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{triggerPriceType:void 0,attachedStopLossTakeProfit:{triggerPriceType:void 0,price:!1}}},swap:{linear:{extends:"forDerivatives"},inverse:void 0},future:{linear:void 0,inverse:void 0}},commonCurrencies:{},exceptions:{exact:{"-1000":r.ExchangeError,"-1001":r.AuthenticationError,"-1002":r.AuthenticationError,"-1003":r.RateLimitExceeded,"-1004":r.BadRequest,"-1005":r.BadRequest,"-1006":r.InvalidOrder,"-1007":r.BadRequest,"-1008":r.InvalidOrder,"-1009":r.InsufficientFunds,"-1011":r.NetworkError,"-1012":r.BadRequest,"-1101":r.InsufficientFunds,"-1102":r.InvalidOrder,"-1103":r.InvalidOrder,"-1104":r.InvalidOrder,"-1105":r.InvalidOrder,"-1201":r.BadRequest,"-1202":r.BadRequest,29:r.BadRequest,9:r.AuthenticationError,3:r.AuthenticationError,2:r.BadRequest,15:r.BadRequest},broad:{}},precisionMode:a.kb})}setSandboxMode(e){super.setSandboxMode(e),this.options.sandboxMode=e}async fetchStatus(e={}){const t=await this.v1PublicGetPublicSystemInfo(e),i=this.safeDict(t,"data",{});let s=this.safeString(i,"status");return s=void 0===s?"error":"0"===s?"ok":"maintenance",{status:s,updated:void 0,eta:void 0,url:void 0,info:t}}async fetchTime(e={}){const t=await this.v1PublicGetPublicSystemInfo(e);return this.safeInteger(t,"timestamp")}parseMarket(e){const t=this.safeString(e,"symbol"),i=t.split("_"),s=this.safeString(i,1),r=this.safeString(i,2),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r),n=this.safeString(i,2),d=this.safeCurrencyCode(n);return{id:t,symbol:a+"/"+o+":"+d,base:a,quote:o,settle:d,baseId:s,quoteId:r,settleId:n,type:"swap",spot:!1,margin:!1,swap:!0,future:!1,option:!1,active:void 0,contract:!0,linear:!0,inverse:void 0,contractSize:this.parseNumber("1"),expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"base_tick"),price:this.safeNumber(e,"quote_tick")},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"base_min"),max:this.safeNumber(e,"base_max")},price:{min:this.safeNumber(e,"quote_min"),max:this.safeNumber(e,"quote_max")},cost:{min:this.safeNumber(e,"min_notional"),max:void 0}},created:this.safeInteger(e,"created_time"),info:e}}async fetchMarkets(e={}){const t=await this.v1PublicGetPublicInfo(e),i=this.safeDict(t,"data",{}),s=this.safeList(i,"rows",[]);return this.parseMarkets(s)}async fetchCurrencies(e={}){const t={},i=await this.v1PublicGetPublicToken(e),s=this.safeDict(i,"data",{}),r=this.safeList(s,"rows",[]);for(let e=0;e<r.length;e++){const i=r[e],s=this.safeString(i,"token"),a=this.safeList(i,"chain_details"),n=this.safeCurrencyCode(s);let d;const h={};for(let e=0;e<a.length;e++){const t=a[e],i=this.safeString(t,"chain_id"),s=this.parsePrecision(this.safeString(t,"decimals"));void 0!==s&&(d=void 0===d?s:o.Y.stringMin(s,d)),h[i]={id:i,network:i,limits:{withdraw:{min:void 0,max:void 0},deposit:{min:void 0,max:void 0}},active:void 0,deposit:void 0,withdraw:void 0,fee:this.safeNumber(t,"withdrawal_fee"),precision:this.parseNumber(s),info:t}}t[n]={id:s,name:s,code:n,precision:this.parseNumber(d),active:void 0,fee:void 0,networks:h,deposit:void 0,withdraw:void 0,limits:{deposit:{min:void 0,max:void 0},withdraw:{min:this.safeNumber(i,"minimum_withdraw_amount"),max:void 0}},info:i}}return t}parseTokenAndFeeTemp(e,t,i){const s=this.safeString(e,i);let r;if(void 0!==s){const i=this.safeString(e,t);r={cost:s,currency:this.safeCurrencyCode(i)}}return r}parseTrade(e,t=void 0){const i="id"in e,s=this.safeInteger(e,"executed_timestamp"),r=this.safeString(e,"symbol"),a=(t=this.safeMarket(r,t)).symbol,n=this.safeString(e,"executed_price"),d=this.safeString(e,"executed_quantity"),h=this.safeString(e,"order_id"),c=this.parseTokenAndFeeTemp(e,"fee_asset","fee"),l=this.safeString(c,"cost");void 0!==l&&(c.cost=l);const u=o.Y.stringMul(n,d),f=this.safeStringLower(e,"side"),p=this.safeString(e,"id");let m;if(i){m="1"===this.safeString(e,"is_maker")?"maker":"taker"}return this.safeTrade({id:p,timestamp:s,datetime:this.iso8601(s),symbol:a,side:f,price:n,amount:d,cost:u,order:h,takerOrMaker:m,type:void 0,fee:c,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};void 0!==i&&(a.limit=i);const o=await this.v1PublicGetPublicMarketTrades(this.extend(a,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"rows",[]);return this.parseTrades(d,r,t,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol");t=this.market(i);const s=this.safeInteger(e,"next_funding_time"),r=this.safeInteger(e,"est_funding_rate_timestamp"),a=this.safeInteger(e,"last_funding_rate_timestamp"),n=this.safeString(e,"last_funding_rate_timestamp"),d=this.safeString(e,"next_funding_time"),h=o.Y.stringSub(d,n);return{info:e,symbol:t.symbol,markPrice:void 0,indexPrice:void 0,interestRate:this.parseNumber("0"),estimatedSettlePrice:void 0,timestamp:r,datetime:this.iso8601(r),fundingRate:this.safeNumber(e,"est_funding_rate"),fundingTimestamp:s,fundingDatetime:this.iso8601(s),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:this.safeNumber(e,"last_funding_rate"),previousFundingTimestamp:a,previousFundingDatetime:this.iso8601(a),interval:this.parseFundingInterval(h)}}parseFundingInterval(e){return this.safeString({36e5:"1h",144e5:"4h",288e5:"8h",576e5:"16h",864e5:"24h"},e,e)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PublicGetPublicFundingRateSymbol(this.extend(s,t)),a=this.safeDict(r,"data",{});return this.parseFundingRate(a,i)}async fetchFundingRates(e=void 0,t={}){await this.loadMarkets(),e=this.marketSymbols(e);const i=await this.v1PublicGetPublicFundingRates(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"rows",[]);return this.parseFundingRates(r,e)}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchFundingRateHistory","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchFundingRateHistory",e,t,i,s,"page",25);let a={};if(void 0!==e){const t=this.market(e);e=t.symbol,a.symbol=t.id}void 0!==t&&(a.start_t=t),[a,s]=this.handleUntilOption("end_t",a,s,.001);const o=await this.v1PublicGetPublicFundingRateHistory(this.extend(a,s)),n=this.safeDict(o,"data",{}),d=this.safeList(n,"rows",[]),h=[];for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"symbol"),s=this.safeInteger(t,"funding_rate_timestamp");h.push({info:t,symbol:this.safeSymbol(i),fundingRate:this.safeNumber(t,"funding_rate"),timestamp:s,datetime:this.iso8601(s)})}const c=this.sortBy(h,"timestamp");return this.filterBySymbolSinceLimit(c,e,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.v1PrivateGetClientInfo(e),i=this.safeDict(t,"data",{}),s=this.safeString(i,"futures_maker_fee_rate"),r=this.safeString(i,"futures_taker_fee_rate"),a={};for(let e=0;e<this.symbols.length;e++){const i=this.symbols[e];a[i]={info:t,symbol:i,maker:this.parseNumber(o.Y.stringDiv(s,"10000")),taker:this.parseNumber(o.Y.stringDiv(r,"10000")),percentage:!0,tierBased:!0}}return a}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s={symbol:this.market(e).id};void 0!==t&&(t=Math.min(t,1e3),s.max_level=t);const r=await this.v1PrivateGetOrderbookSymbol(this.extend(s,i)),a=this.safeDict(r,"data",{}),o=this.safeInteger(a,"timestamp");return this.parseOrderBook(a,e,o,"bids","asks","price","quantity")}parseOHLCV(e,t=void 0){return[this.safeInteger(e,"start_timestamp"),this.safeNumber(e,"open"),this.safeNumber(e,"high"),this.safeNumber(e,"low"),this.safeNumber(e,"close"),this.safeNumber(e,"volume")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.id,type:this.safeString(this.timeframes,t,t)};void 0!==s&&(o.limit=Math.min(s,1e3));const n=await this.v1PrivateGetKline(this.extend(o,r)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"rows",[]);return this.parseOHLCVs(h,a,t,i,s)}parseOrder(e,t=void 0){const i=this.safeIntegerN(e,["timestamp","created_time","createdTime"]),s=this.safeStringN(e,["order_id","orderId","algoOrderId"]),r=this.omitZero(this.safeString2(e,"client_order_id","clientOrderId")),a=this.safeString(e,"symbol"),n=(t=this.safeMarket(a,t)).symbol,d=this.safeString2(e,"order_price","price"),h=this.safeString2(e,"order_quantity","quantity"),c=this.safeString2(e,"order_amount","amount"),l=this.safeStringLower2(e,"order_type","type");let u=this.safeValue2(e,"status","algoStatus");const f=this.safeBool(e,"success");void 0!==f&&(u=f?"NEW":"REJECTED");const p=this.safeStringLower(e,"side"),m=this.omitZero(this.safeValue2(e,"executed","totalExecutedQuantity")),g=this.omitZero(this.safeString2(e,"average_executed_price","averageExecutedPrice")),v=o.Y.stringSub(c,m),y=this.safeValue2(e,"total_fee","totalFee"),w=this.safeString2(e,"fee_asset","feeAsset"),b=this.safeValue(e,"Transactions"),k=this.safeNumber(e,"triggerPrice");let S,O;const T=this.safeValue(e,"childOrders");if(void 0!==T){const e=this.safeValue(T,0),t=this.safeValue(e,"childOrders",[]);if(t.length>0){const e=this.safeValue(t,0),i=this.safeValue(t,1);S=this.safeNumber(e,"triggerPrice"),O=this.safeNumber(i,"triggerPrice")}}const P=this.safeInteger2(e,"updatedTime","updated_time");return this.safeOrder({id:s,clientOrderId:r,timestamp:i,datetime:this.iso8601(i),lastTradeTimestamp:void 0,lastUpdateTimestamp:P,status:this.parseOrderStatus(u),symbol:n,type:this.parseOrderType(l),timeInForce:this.parseTimeInForce(l),postOnly:void 0,reduceOnly:this.safeBool(e,"reduce_only"),side:p,price:d,triggerPrice:k,takeProfitPrice:S,stopLossPrice:O,average:g,amount:h,filled:m,remaining:v,cost:c,trades:b,fee:{cost:y,currency:w},info:e},t)}parseTimeInForce(e){return this.safeString({ioc:"IOC",fok:"FOK",post_only:"PO"},e,void 0)}parseOrderStatus(e){if(void 0!==e){const t={NEW:"open",FILLED:"closed",CANCEL_SENT:"canceled",CANCEL_ALL_SENT:"canceled",CANCELLED:"canceled",PARTIAL_FILLED:"open",REJECTED:"rejected",INCOMPLETE:"open",COMPLETED:"closed"};return this.safeString(t,e,e)}return e}parseOrderType(e){return this.safeStringLower({LIMIT:"limit",MARKET:"market",POST_ONLY:"limit"},e,e)}createOrderRequest(e,t,i,s,r=void 0,a={}){const o=this.safeBool2(a,"reduceOnly","reduce_only"),n=t.toUpperCase(),d=this.market(e),h=i.toUpperCase(),c={symbol:d.id,side:h},l=this.safeString2(a,"triggerPrice","stopPrice"),u=this.safeValue(a,"stopLoss"),f=this.safeValue(a,"takeProfit"),p=this.safeString(a,"algoType"),m=void 0!==l||void 0!==u||void 0!==f||void 0!==this.safeValue(a,"childOrders"),g="MARKET"===n,v=this.safeStringLower(a,"timeInForce"),y=this.isPostOnly(g,void 0,a),w=m?"quantity":"order_quantity",b=m?"price":"order_price";c[m?"type":"order_type"]=n,m||(y?c.order_type="POST_ONLY":"fok"===v?c.order_type="FOK":"ioc"===v&&(c.order_type="IOC")),o&&(c.reduce_only=o),void 0!==r&&(c[b]=this.priceToPrecision(e,r)),(g&&!m||"POSITIONAL_TP_SL"!==p)&&(c[w]=this.amountToPrecision(e,s));const k=this.safeStringN(a,["clOrdID","clientOrderId","client_order_id"]);if(void 0!==k&&(c.client_order_id=k),void 0!==l)c.trigger_price=this.priceToPrecision(e,l),c.algo_type="STOP";else if(void 0!==u||void 0!==f){c.algo_type="TP_SL";const t={symbol:d.id,reduce_only:!1,algo_type:"POSITIONAL_TP_SL",child_orders:[]},i=t.child_orders,s="BUY"===h?"SELL":"BUY";if(void 0!==u){const t=this.safeNumber2(u,"triggerPrice","price",u),r={side:s,algo_type:"TP_SL",trigger_price:this.priceToPrecision(e,t),type:"LIMIT",reduce_only:!0};i.push(r)}if(void 0!==f){const i=this.safeNumber2(f,"triggerPrice","price",f),r={side:s,algo_type:"TP_SL",trigger_price:this.priceToPrecision(e,i),type:"LIMIT",reduce_only:!0};t.push(r)}c.child_orders=[t]}return a=this.omit(a,["reduceOnly","reduce_only","clOrdID","clientOrderId","client_order_id","postOnly","timeInForce","stopPrice","triggerPrice","stopLoss","takeProfit"]),this.extend(c,a)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n=this.createOrderRequest(e,t,i,s,r,a),d=this.safeString2(a,"triggerPrice","stopPrice"),h=this.safeValue(a,"stopLoss"),c=this.safeValue(a,"takeProfit");let l;l=void 0!==d||void 0!==h||void 0!==c||void 0!==this.safeValue(a,"childOrders")?await this.v1PrivatePostAlgoOrder(n):await this.v1PrivatePostOrder(n);const u=this.safeDict(l,"data");u.timestamp=this.safeInteger(l,"timestamp");const f=this.parseOrder(u,o);return f.type=t,f}async createOrders(e,t={}){await this.loadMarkets();const i=[];for(let t=0;t<e.length;t++){const s=e[t],a=this.safeString(s,"symbol"),o=this.safeString(s,"type"),n=this.safeString(s,"side"),d=this.safeValue(s,"amount"),h=this.safeValue(s,"price"),c=this.safeDict(s,"params",{}),l=this.safeString2(c,"triggerPrice","stopPrice"),u=this.safeValue(c,"stopLoss"),f=this.safeValue(c,"takeProfit");if(void 0!==l||void 0!==u||void 0!==f||void 0!==this.safeValue(c,"childOrders"))throw new r.NotSupported(this.id+" createOrders() only support non-stop order");const p=this.createOrderRequest(a,o,n,d,h,c);i.push(p)}const s={orders:i},a=await this.v1PrivatePostBatchOrder(this.extend(s,t)),o=this.safeDict(a,"data",{}),n=this.safeList(o,"rows",[]);return this.parseOrders(n)}async editOrder(e,t,i,s,r=void 0,a=void 0,o={}){await this.loadMarkets();const n=this.market(t),d={order_id:e},h=this.safeStringN(o,["triggerPrice","stopPrice","takeProfitPrice","stopLossPrice"]);void 0!==h&&(d.triggerPrice=this.priceToPrecision(t,h));const c=void 0!==h||void 0!==this.safeValue(o,"childOrders"),l=c?"quantity":"order_quantity";let u;if(void 0!==a&&(d[c?"price":"order_price"]=this.priceToPrecision(t,a)),void 0!==r&&(d[l]=this.amountToPrecision(t,r)),o=this.omit(o,["stopPrice","triggerPrice","takeProfitPrice","stopLossPrice","trailingTriggerPrice","trailingAmount","trailingPercent"]),c)u=await this.v1PrivatePutAlgoOrder(this.extend(d,o));else{d.symbol=n.id,d.side=s.toUpperCase();const e=i.toUpperCase(),t=this.safeStringLower(o,"timeInForce"),r="MARKET"===e,a=this.isPostOnly(r,void 0,o);d.order_type=a?"POST_ONLY":"fok"===t?"FOK":"ioc"===t?"IOC":e;const h=this.safeStringN(o,["clOrdID","clientOrderId","client_order_id"]);o=this.omit(o,["clOrdID","clientOrderId","client_order_id","postOnly","timeInForce"]),void 0!==h&&(d.client_order_id=h),u=await this.v1PrivatePutOrder(this.extend(d,o))}const f=this.safeDict(u,"data",{});return f.timestamp=this.safeInteger(u,"timestamp"),this.parseOrder(f,n)}async cancelOrder(e,t=void 0,i={}){const s=this.safeBool2(i,"stop","trigger",!1);if(i=this.omit(i,["stop","trigger"]),!s&&void 0===t)throw new r.ArgumentsRequired(this.id+" cancelOrder() requires a symbol argument");let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={symbol:a.id},n=this.safeString2(i,"clOrdID","clientOrderId"),d=this.safeString(i,"client_order_id",n),h=void 0!==d;let c;s?h?(o.client_order_id=d,i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]),c=await this.v1PrivateDeleteAlgoClientOrder(this.extend(o,i))):(o.order_id=e,c=await this.v1PrivateDeleteAlgoOrder(this.extend(o,i))):h?(o.client_order_id=d,i=this.omit(i,["clOrdID","clientOrderId","client_order_id"]),c=await this.v1PrivateDeleteClientOrder(this.extend(o,i))):(o.order_id=e,c=await this.v1PrivateDeleteOrder(this.extend(o,i)));const l={symbol:t};if(h?l.client_order_id=d:l.id=e,s)return this.extend(this.parseOrder(c),l);const u=this.safeDict(c,"data",{});return this.extend(this.parseOrder(u),l)}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s=this.safeListN(i,["clOrdIDs","clientOrderIds","client_order_ids"]);i=this.omit(i,["clOrdIDs","clientOrderIds","client_order_ids"]);const r={};let a;return s?(r.client_order_ids=s.join(","),a=await this.v1PrivateDeleteClientBatchOrder(this.extend(r,i))):(r.order_ids=e.join(","),a=await this.v1PrivateDeleteBatchOrder(this.extend(r,i))),[this.safeOrder({info:a})]}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i=this.safeBool2(t,"stop","trigger");t=this.omit(t,["stop","trigger"]);const s={};if(void 0!==e){const t=this.market(e);s.symbol=t.id}let r;return r=i?await this.v1PrivateDeleteAlgoOrders(this.extend(s,t)):await this.v1PrivateDeleteOrders(this.extend(s,t)),[{info:r}]}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r=this.safeBool2(i,"stop","trigger",!1),a={},o=this.safeStringN(i,["clOrdID","clientOrderId","client_order_id"]);let n;i=this.omit(i,["stop","trigger","clOrdID","clientOrderId","client_order_id"]),r?o?(a.client_order_id=o,n=await this.v1PrivateGetAlgoClientOrderClientOrderId(this.extend(a,i))):(a.oid=e,n=await this.v1PrivateGetAlgoOrderOid(this.extend(a,i))):o?(a.client_order_id=o,n=await this.v1PrivateGetClientOrderClientOrderId(this.extend(a,i))):(a.oid=e,n=await this.v1PrivateGetOrderOid(this.extend(a,i)));const d=this.safeDict(n,"data",n);return this.parseOrder(d,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;const a=this.safeBool2(s,"stop","trigger",!1),o=a?100:500;if([r,s]=this.handleOptionAndParams(s,"fetchOrders","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchOrders",e,t,i,s,"page",o);let n,d,h={};s=this.omit(s,["stop","trigger"]),void 0!==e&&(n=this.market(e),h.symbol=n.id),void 0!==t&&(h.start_t=t),h.size=void 0!==i?i:o,a&&(h.algo_type="STOP"),[h,s]=this.handleUntilOption("end_t",h,s),d=a?await this.v1PrivateGetAlgoOrders(this.extend(h,s)):await this.v1PrivateGetOrders(this.extend(h,s));const c=this.safeValue(d,"data",d),l=this.safeList(c,"rows");return this.parseOrders(l,n,t,i)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"INCOMPLETE"});return await this.fetchOrders(e,t,i,r)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.extend(s,{status:"COMPLETED"});return await this.fetchOrders(e,t,i,r)}async fetchOrderTrades(e,t=void 0,i=void 0,s=void 0,r={}){let a;await this.loadMarkets(),void 0!==t&&(a=this.market(t));const o={oid:e},n=await this.v1PrivateGetOrderOidTrades(this.extend(o,r)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"rows",[]);return this.parseTrades(h,a,i,s,r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();let r=!1;if([r,s]=this.handleOptionAndParams(s,"fetchMyTrades","paginate"),r)return await this.fetchPaginatedCallIncremental("fetchMyTrades",e,t,i,s,"page",500);let a,o={};void 0!==e&&(a=this.market(e),o.symbol=a.id),void 0!==t&&(o.start_t=t),o.size=void 0!==i?i:500,[o,s]=this.handleUntilOption("end_t",o,s);const n=await this.v1PrivateGetTrades(this.extend(o,s)),d=this.safeDict(n,"data",{}),h=this.safeList(d,"rows",[]);return this.parseTrades(h,a,t,i,s)}parseBalance(e){const t={info:e},i=this.safeList(e,"holding",[]);for(let e=0;e<i.length;e++){const s=i[e],r=this.safeCurrencyCode(this.safeString(s,"token")),a=this.account();a.total=this.safeString(s,"holding"),a.frozen=this.safeString(s,"frozen"),t[r]=a}return this.safeBalance(t)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v1PrivateGetClientHolding(e),i=this.safeDict(t,"data");return this.parseBalance(i)}async getAssetHistoryRows(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.balance_token=a.id),void 0!==t&&(r.start_t=t),void 0!==i&&(r.pageSize=i);const o=this.safeString(s,"type");s=this.omit(s,"type"),void 0!==o&&(r.type=o);const n=await this.v1PrivateGetAssetHistory(this.extend(r,s)),d=this.safeDict(n,"data",{});return[a,this.safeList(d,"rows",[])]}parseLedgerEntry(e,t=void 0){const i=this.safeString(e,"token"),s=this.safeCurrencyCode(i,t);t=this.safeCurrency(i,t);const r=this.safeNumber(e,"amount"),a="DEPOSIT"===this.safeString(e,"token_side")?"in":"out",o=this.safeInteger(e,"created_time"),n=this.parseTokenAndFeeTemp(e,"fee_token","fee_amount");return this.safeLedgerEntry({id:this.safeString(e,"id"),currency:s,account:this.safeString(e,"account"),referenceAccount:void 0,referenceId:this.safeString(e,"tx_id"),status:this.parseTransactionStatus(this.safeString(e,"status")),amount:r,before:void 0,after:void 0,fee:n,direction:a,timestamp:o,datetime:this.iso8601(o),type:this.parseLedgerEntryType(this.safeString(e,"type")),info:e},t)}parseLedgerEntryType(e){return this.safeString({BALANCE:"transaction",COLLATERAL:"transfer"},e,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const r=await this.getAssetHistoryRows(e,t,i,s),a=this.safeValue(r,0),o=this.safeList(r,1);return this.parseLedger(o,a,t,i,s)}parseTransaction(e,t=void 0){const i=this.safeString(e,"token");let s=this.safeStringLower(e,"token_side");"withdraw"===s&&(s="withdrawal");const r=this.parseTokenAndFeeTemp(e,"fee_token","fee_amount"),a=this.safeString(e,"target_address"),o=this.safeString(e,"source_address"),n=this.safeInteger(e,"created_time");return{info:e,id:this.safeString2(e,"id","withdraw_id"),txid:this.safeString(e,"tx_id"),timestamp:n,datetime:this.iso8601(n),address:void 0,addressFrom:o,addressTo:a,tag:this.safeString(e,"extra"),tagFrom:void 0,tagTo:void 0,type:s,amount:this.safeNumber(e,"amount"),currency:i,status:this.parseTransactionStatus(this.safeString(e,"status")),updated:this.safeInteger(e,"updated_time"),comment:void 0,internal:void 0,fee:r,network:void 0}}parseTransactionStatus(e){return this.safeString({NEW:"pending",CONFIRMING:"pending",PROCESSING:"pending",COMPLETED:"ok",CANCELED:"canceled"},e,e)}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({side:"DEPOSIT"},s))}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchDepositsWithdrawals(e,t,i,this.extend({side:"WITHDRAW"},s))}async fetchDepositsWithdrawals(e=void 0,t=void 0,i=void 0,s={}){const r=await this.getAssetHistoryRows(e,t,i,this.extend({},s)),a=this.safeValue(r,0),o=this.safeList(r,1);return this.parseTransactions(o,a,t,i,s)}async getWithdrawNonce(e={}){const t=await this.v1PrivateGetWithdrawNonce(e),i=this.safeDict(t,"data",{});return this.safeNumber(i,"withdraw_nonce")}hashMessage(e){return"0x"+this.hash(e,h.lY,"hex")}signHash(e,t){const i=(0,n.h1)(e.slice(-64),t.slice(-64),c.bI,void 0),s=i.r,r=i.s,a=this.intToBase16(this.sum(27,i.v));return"0x"+s.padStart(64,"0")+r.padStart(64,"0")+a}signMessage(e,t){return this.signHash(this.hashMessage(e),t.slice(-64))}async withdraw(e,t,i,s=void 0,a={}){if(await this.loadMarkets(),this.checkAddress(i),void 0!==e&&"USDC"!==(e=e.toUpperCase()))throw new r.NotSupported(this.id+" withdraw() only support USDC");const o=this.currency(e),n=this.safeString(this.options,"verifyingContractAddress"),d=this.safeString(a,"chainId"),h=this.safeDict(o,"networks",{}),c=this.safeDict(h,d,{});if(void 0===this.safeNumber(c,"id"))throw new r.BadRequest(this.id+" withdraw() require chainId parameter");const l=await this.getWithdrawNonce(a),u=this.nonce(),f={chainId:d,name:"Orderly",verifyingContract:n,version:"1"},p={brokerId:this.safeString(this.options,"keyBrokerId","woofi_pro"),chainId:this.parseToInt(d),receiver:i,token:e,amount:t.toString(),withdrawNonce:l,timestamp:u},m=this.ethEncodeStructuredData(f,{Withdraw:[{name:"brokerId",type:"string"},{name:"chainId",type:"uint256"},{name:"receiver",type:"address"},{name:"token",type:"string"},{name:"amount",type:"uint256"},{name:"withdrawNonce",type:"uint64"},{name:"timestamp",type:"uint64"}]},p),g={signature:this.signMessage(m,this.privateKey),userAddress:i,verifyingContract:n,message:p};a=this.omit(a,"chainId");const v=await this.v1PrivatePostWithdrawRequest(this.extend(g,a)),y=this.safeDict(v,"data",{});return this.parseTransaction(y,o)}parseLeverage(e,t=void 0){const i=this.safeInteger(e,"max_leverage");return{info:e,symbol:t.symbol,marginMode:void 0,longLeverage:i,shortLeverage:i}}async fetchLeverage(e,t={}){await this.loadMarkets();const i=this.market(e),s=await this.v1PrivateGetClientInfo(t),r=this.safeDict(s,"data",{});return this.parseLeverage(r,i)}async setLeverage(e,t=void 0,i={}){if(await this.loadMarkets(),e<1||e>50)throw new r.BadRequest(this.id+" leverage should be between 1 and 50");const s={leverage:e};return await this.v1PrivatePostClientLeverage(this.extend(s,i))}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t);let s,r=this.safeString(e,"position_qty");s=o.Y.stringGt(r,"0")?"long":"short";const a=this.safeString(t,"contractSize"),n=this.safeString(e,"mark_price"),d=this.safeInteger(e,"timestamp"),h=this.safeString(e,"average_open_price"),c=this.safeString(e,"unsettled_pnl");r=o.Y.stringAbs(r);const l=o.Y.stringMul(r,n);return this.safePosition({info:e,id:void 0,symbol:this.safeString(t,"symbol"),timestamp:d,datetime:this.iso8601(d),lastUpdateTimestamp:void 0,initialMargin:void 0,initialMarginPercentage:void 0,maintenanceMargin:void 0,maintenanceMarginPercentage:void 0,entryPrice:this.parseNumber(h),notional:this.parseNumber(l),leverage:void 0,unrealizedPnl:this.parseNumber(c),contracts:this.parseNumber(r),contractSize:this.parseNumber(a),marginRatio:void 0,liquidationPrice:this.safeNumber(e,"est_liq_price"),markPrice:this.parseNumber(n),lastPrice:void 0,collateral:void 0,marginMode:"cross",marginType:void 0,side:s,percentage:void 0,hedged:void 0,stopLossPrice:void 0,takeProfitPrice:void 0})}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},r=await this.v1PrivateGetPositionSymbol(this.extend(s,t)),a=this.safeDict(r,"data");return this.parsePosition(a,i)}async fetchPositions(e=void 0,t={}){await this.loadMarkets();const i=await this.v1PrivateGetPositions(t),s=this.safeDict(i,"data",{}),r=this.safeList(s,"rows",[]);return this.parsePositions(r,e)}nonce(){return this.milliseconds()}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){const o=t[0],h=t[1],c=this.implodeParams(e,s);let l=this.implodeHostname(this.urls.api[h]);if(l+="/"+o+"/",s=this.omit(s,this.extractParams(e)),s=this.keysort(s),"public"===h)l+=c,Object.keys(s).length&&(l+="?"+this.urlencode(s));else{if(this.checkRequiredCredentials(),!("POST"!==i&&"PUT"!==i||"algo/order"!==e&&"order"!==e&&"batch-order"!==e)){if(!this.safeBool(this.options,"sandboxMode",!1)){const t=this.safeString(this.options,"brokerId","CCXT");if("batch-order"===e){const e=this.safeList(s,"orders",[]);for(let i=0;i<e.length;i++)s.orders[i].order_tag=t}else s.order_tag=t}s=this.keysort(s)}let t="";const h=this.nonce().toString();l+=c;let u=this.apiKey;u.indexOf("ed25519:")<0&&(u="ed25519:"+u),r={"orderly-account-id":this.accountId,"orderly-key":u,"orderly-timestamp":h},t=h+i+"/"+o+"/"+c,"POST"===i||"PUT"===i?(t+=a=this.json(s),r["content-type"]="application/json"):(Object.keys(s).length&&(l+="?"+this.urlencode(s),t+="?"+this.rawencode(s)),r["content-type"]="application/x-www-form-urlencoded","DELETE"===i&&(a=""));let f=this.secret;if(f.indexOf("ed25519:")>=0){const e=f.split("ed25519:");f=e[1]}const p=(0,n.q4)(this.encode(t),this.base58ToBinary(f),d.ev);r["orderly-signature"]=this.urlencodeBase64(this.base64ToBinary(p))}return{url:l,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(!n)return;const c=this.safeBool(n,"success"),l=this.safeString(n,"code");if(!c){const e=this.id+" "+this.json(n);throw this.throwBroadlyMatchedException(this.exceptions.broad,o,e),this.throwExactlyMatchedException(this.exceptions.exact,l,e),new r.ExchangeError(e)}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"xt",name:"XT",countries:["SC"],rateLimit:100,version:"v4",certified:!1,pro:!0,has:{CORS:!1,spot:!0,margin:!0,swap:!0,future:!0,option:!1,addMargin:!0,borrowMargin:!1,cancelAllOrders:!0,cancelOrder:!0,cancelOrders:!0,createDepositAddress:!1,createMarketBuyOrderWithCost:!0,createMarketSellOrderWithCost:!1,createOrder:!0,createPostOnlyOrder:!1,createReduceOnlyOrder:!0,editOrder:!1,fetchAccounts:!1,fetchBalance:!0,fetchBidsAsks:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRatesPerSymbol:!1,fetchCanceledOrders:!0,fetchClosedOrders:!0,fetchCurrencies:!0,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!0,fetchDepositWithdrawals:!1,fetchDepositWithdrawFee:!1,fetchDepositWithdrawFees:!1,fetchFundingHistory:!0,fetchFundingInterval:!0,fetchFundingIntervals:!1,fetchFundingRate:!0,fetchFundingRateHistory:!0,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchL3OrderBook:!1,fetchLedger:!0,fetchLedgerEntry:!1,fetchLeverage:!1,fetchLeverageTiers:!0,fetchMarketLeverageTiers:!0,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!1,fetchOrders:!0,fetchOrdersByStatus:!0,fetchOrderTrades:!1,fetchPosition:!0,fetchPositions:!0,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!1,fetchStatus:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTradingLimits:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchWithdrawal:!1,fetchWithdrawals:!0,fetchWithdrawalWhitelist:!1,reduceMargin:!0,repayMargin:!1,setLeverage:!0,setMargin:!1,setMarginMode:!0,setPositionMode:!1,signIn:!1,transfer:!0,withdraw:!0},precisionMode:a.kb,urls:{logo:"https://user-images.githubusercontent.com/14319357/232636712-466df2fc-560a-4ca4-aab2-b1d954a58e24.jpg",api:{spot:"https://sapi.xt.com",linear:"https://fapi.xt.com",inverse:"https://dapi.xt.com",user:"https://api.xt.com"},www:"https://xt.com",referral:"https://www.xt.com/en/accounts/register?ref=9PTM9VW",doc:["https://doc.xt.com/","https://github.com/xtpub/api-doc"],fees:"https://www.xt.com/en/rate"},api:{public:{spot:{get:{currencies:1,depth:10,kline:1,symbol:1,ticker:1,"ticker/book":1,"ticker/price":1,"ticker/24h":1,time:1,"trade/history":1,"trade/recent":1,"wallet/support/currency":1}},linear:{get:{"future/market/v1/public/contract/risk-balance":1,"future/market/v1/public/contract/open-interest":1,"future/market/v1/public/leverage/bracket/detail":1,"future/market/v1/public/leverage/bracket/list":1,"future/market/v1/public/q/agg-ticker":1,"future/market/v1/public/q/agg-tickers":1,"future/market/v1/public/q/deal":1,"future/market/v1/public/q/depth":1,"future/market/v1/public/q/funding-rate":1,"future/market/v1/public/q/funding-rate-record":1,"future/market/v1/public/q/index-price":1,"future/market/v1/public/q/kline":1,"future/market/v1/public/q/mark-price":1,"future/market/v1/public/q/symbol-index-price":1,"future/market/v1/public/q/symbol-mark-price":1,"future/market/v1/public/q/ticker":1,"future/market/v1/public/q/tickers":1,"future/market/v1/public/symbol/coins":3.33,"future/market/v1/public/symbol/detail":3.33,"future/market/v1/public/symbol/list":1}},inverse:{get:{"future/market/v1/public/contract/risk-balance":1,"future/market/v1/public/contract/open-interest":1,"future/market/v1/public/leverage/bracket/detail":1,"future/market/v1/public/leverage/bracket/list":1,"future/market/v1/public/q/agg-ticker":1,"future/market/v1/public/q/agg-tickers":1,"future/market/v1/public/q/deal":1,"future/market/v1/public/q/depth":1,"future/market/v1/public/q/funding-rate":1,"future/market/v1/public/q/funding-rate-record":1,"future/market/v1/public/q/index-price":1,"future/market/v1/public/q/kline":1,"future/market/v1/public/q/mark-price":1,"future/market/v1/public/q/symbol-index-price":1,"future/market/v1/public/q/symbol-mark-price":1,"future/market/v1/public/q/ticker":1,"future/market/v1/public/q/tickers":1,"future/market/v1/public/symbol/coins":3.33,"future/market/v1/public/symbol/detail":3.33,"future/market/v1/public/symbol/list":1}}},private:{spot:{get:{balance:1,balances:1,"batch-order":1,"deposit/address":1,"deposit/history":1,"history-order":1,"open-order":1,order:1,"order/{orderId}":1,trade:1,"withdraw/history":1},post:{order:.2,withdraw:10,"balance/transfer":1,"balance/account/transfer":1,"ws-token":1},delete:{"batch-order":1,"open-order":1,"order/{orderId}":1}},linear:{get:{"future/trade/v1/entrust/plan-detail":1,"future/trade/v1/entrust/plan-list":1,"future/trade/v1/entrust/plan-list-history":1,"future/trade/v1/entrust/profit-detail":1,"future/trade/v1/entrust/profit-list":1,"future/trade/v1/order/detail":1,"future/trade/v1/order/list":1,"future/trade/v1/order/list-history":1,"future/trade/v1/order/trade-list":1,"future/user/v1/account/info":1,"future/user/v1/balance/bills":1,"future/user/v1/balance/detail":1,"future/user/v1/balance/funding-rate-list":1,"future/user/v1/balance/list":1,"future/user/v1/position/adl":1,"future/user/v1/position/list":1,"future/user/v1/user/collection/list":1,"future/user/v1/user/listen-key":1},post:{"future/trade/v1/entrust/cancel-all-plan":1,"future/trade/v1/entrust/cancel-all-profit-stop":1,"future/trade/v1/entrust/cancel-plan":1,"future/trade/v1/entrust/cancel-profit-stop":1,"future/trade/v1/entrust/create-plan":1,"future/trade/v1/entrust/create-profit":1,"future/trade/v1/entrust/update-profit-stop":1,"future/trade/v1/order/cancel":1,"future/trade/v1/order/cancel-all":1,"future/trade/v1/order/create":1,"future/trade/v1/order/create-batch":1,"future/user/v1/account/open":1,"future/user/v1/position/adjust-leverage":1,"future/user/v1/position/auto-margin":1,"future/user/v1/position/close-all":1,"future/user/v1/position/margin":1,"future/user/v1/user/collection/add":1,"future/user/v1/user/collection/cancel":1,"future/user/v1/position/change-type":1}},inverse:{get:{"future/trade/v1/entrust/plan-detail":1,"future/trade/v1/entrust/plan-list":1,"future/trade/v1/entrust/plan-list-history":1,"future/trade/v1/entrust/profit-detail":1,"future/trade/v1/entrust/profit-list":1,"future/trade/v1/order/detail":1,"future/trade/v1/order/list":1,"future/trade/v1/order/list-history":1,"future/trade/v1/order/trade-list":1,"future/user/v1/account/info":1,"future/user/v1/balance/bills":1,"future/user/v1/balance/detail":1,"future/user/v1/balance/funding-rate-list":1,"future/user/v1/balance/list":1,"future/user/v1/position/adl":1,"future/user/v1/position/list":1,"future/user/v1/user/collection/list":1,"future/user/v1/user/listen-key":1},post:{"future/trade/v1/entrust/cancel-all-plan":1,"future/trade/v1/entrust/cancel-all-profit-stop":1,"future/trade/v1/entrust/cancel-plan":1,"future/trade/v1/entrust/cancel-profit-stop":1,"future/trade/v1/entrust/create-plan":1,"future/trade/v1/entrust/create-profit":1,"future/trade/v1/entrust/update-profit-stop":1,"future/trade/v1/order/cancel":1,"future/trade/v1/order/cancel-all":1,"future/trade/v1/order/create":1,"future/trade/v1/order/create-batch":1,"future/user/v1/account/open":1,"future/user/v1/position/adjust-leverage":1,"future/user/v1/position/auto-margin":1,"future/user/v1/position/close-all":1,"future/user/v1/position/margin":1,"future/user/v1/user/collection/add":1,"future/user/v1/user/collection/cancel":1}},user:{get:{"user/account":1,"user/account/api-key":1},post:{"user/account":1,"user/account/api-key":1},put:{"user/account/api-key":1},delete:{"user/account/{apikeyId}":1}}}},fees:{spot:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.002"),taker:this.parseNumber("0.002"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("5000"),this.parseNumber("0.0018")],[this.parseNumber("10000"),this.parseNumber("0.0016")],[this.parseNumber("20000"),this.parseNumber("0.0014")],[this.parseNumber("50000"),this.parseNumber("0.0012")],[this.parseNumber("150000"),this.parseNumber("0.0010")],[this.parseNumber("300000"),this.parseNumber("0.0008")],[this.parseNumber("600000"),this.parseNumber("0.0007")],[this.parseNumber("1200000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0005")],[this.parseNumber("6000000"),this.parseNumber("0.0004")],[this.parseNumber("15000000"),this.parseNumber("0.0003")],[this.parseNumber("30000000"),this.parseNumber("0.0002")]],taker:[[this.parseNumber("0"),this.parseNumber("0.002")],[this.parseNumber("5000"),this.parseNumber("0.0018")],[this.parseNumber("10000"),this.parseNumber("0.0016")],[this.parseNumber("20000"),this.parseNumber("0.0014")],[this.parseNumber("50000"),this.parseNumber("0.0012")],[this.parseNumber("150000"),this.parseNumber("0.0010")],[this.parseNumber("300000"),this.parseNumber("0.0008")],[this.parseNumber("600000"),this.parseNumber("0.0007")],[this.parseNumber("1200000"),this.parseNumber("0.0006")],[this.parseNumber("2500000"),this.parseNumber("0.0005")],[this.parseNumber("6000000"),this.parseNumber("0.0004")],[this.parseNumber("15000000"),this.parseNumber("0.0003")],[this.parseNumber("30000000"),this.parseNumber("0.0002")]]}},contract:{tierBased:!0,percentage:!0,maker:this.parseNumber("0.0004"),taker:this.parseNumber("0.0006"),tiers:{maker:[[this.parseNumber("0"),this.parseNumber("0.0004")],[this.parseNumber("200000"),this.parseNumber("0.00038")],[this.parseNumber("1000000"),this.parseNumber("0.00036")],[this.parseNumber("5000000"),this.parseNumber("0.00034")],[this.parseNumber("10000000"),this.parseNumber("0.00032")],[this.parseNumber("15000000"),this.parseNumber("0.00028")],[this.parseNumber("30000000"),this.parseNumber("0.00024")],[this.parseNumber("50000000"),this.parseNumber("0.0002")],[this.parseNumber("100000000"),this.parseNumber("0.00016")],[this.parseNumber("300000000"),this.parseNumber("0.00012")],[this.parseNumber("500000000"),this.parseNumber("0.00008")]],taker:[[this.parseNumber("0"),this.parseNumber("0.0006")],[this.parseNumber("200000"),this.parseNumber("0.000588")],[this.parseNumber("1000000"),this.parseNumber("0.00057")],[this.parseNumber("5000000"),this.parseNumber("0.00054")],[this.parseNumber("10000000"),this.parseNumber("0.00051")],[this.parseNumber("15000000"),this.parseNumber("0.00048")],[this.parseNumber("30000000"),this.parseNumber("0.00045")],[this.parseNumber("50000000"),this.parseNumber("0.00045")],[this.parseNumber("100000000"),this.parseNumber("0.00036")],[this.parseNumber("300000000"),this.parseNumber("0.00033")],[this.parseNumber("500000000"),this.parseNumber("0.0003")]]}}},exceptions:{exact:{400:o.NetworkError,404:o.ExchangeError,429:o.RateLimitExceeded,500:o.ExchangeError,502:o.ExchangeError,503:o.OnMaintenance,AUTH_001:o.AuthenticationError,AUTH_002:o.AuthenticationError,AUTH_003:o.AuthenticationError,AUTH_004:o.AuthenticationError,AUTH_005:o.AuthenticationError,AUTH_006:o.AuthenticationError,AUTH_007:o.AuthenticationError,AUTH_101:o.AuthenticationError,AUTH_102:o.AuthenticationError,AUTH_103:o.AuthenticationError,AUTH_104:o.AuthenticationError,AUTH_105:o.AuthenticationError,AUTH_106:o.PermissionDenied,SYMBOL_001:o.BadSymbol,SYMBOL_002:o.BadSymbol,SYMBOL_003:o.BadSymbol,SYMBOL_004:o.BadSymbol,SYMBOL_005:o.BadSymbol,ORDER_001:o.InvalidOrder,ORDER_002:o.InsufficientFunds,ORDER_003:o.InvalidOrder,ORDER_004:o.InvalidOrder,ORDER_005:o.InvalidOrder,ORDER_006:o.InvalidOrder,ORDER_007:o.PermissionDenied,ORDER_F0101:o.InvalidOrder,ORDER_F0102:o.InvalidOrder,ORDER_F0103:o.InvalidOrder,ORDER_F0201:o.InvalidOrder,ORDER_F0202:o.InvalidOrder,ORDER_F0203:o.InvalidOrder,ORDER_F0301:o.InvalidOrder,ORDER_F0401:o.InvalidOrder,ORDER_F0501:o.InvalidOrder,ORDER_F0502:o.InvalidOrder,ORDER_F0601:o.InvalidOrder,COMMON_001:o.ExchangeError,COMMON_002:o.ExchangeError,COMMON_003:o.BadRequest,CURRENCY_001:o.BadRequest,DEPOSIT_001:o.BadRequest,DEPOSIT_002:o.PermissionDenied,DEPOSIT_003:o.BadRequest,DEPOSIT_004:o.BadRequest,DEPOSIT_005:o.BadRequest,DEPOSIT_006:o.BadRequest,DEPOSIT_007:o.BadRequest,DEPOSIT_008:o.BadRequest,WITHDRAW_001:o.BadRequest,WITHDRAW_002:o.BadRequest,WITHDRAW_003:o.PermissionDenied,WITHDRAW_004:o.BadRequest,WITHDRAW_005:o.BadRequest,WITHDRAW_006:o.BadRequest,WITHDRAW_008:o.PermissionDenied,WITHDRAW_009:o.PermissionDenied,WITHDRAW_010:o.BadRequest,WITHDRAW_011:o.InsufficientFunds,WITHDRAW_012:o.PermissionDenied,WITHDRAW_013:o.PermissionDenied,WITHDRAW_014:o.BadRequest,WITHDRAW_015:o.BadRequest,WITHDRAW_016:o.BadRequest,WITHDRAW_017:o.BadRequest,WITHDRAW_018:o.BadRequest,WITHDRAW_019:o.BadRequest,WITHDRAW_020:o.PermissionDenied,WITHDRAW_021:o.PermissionDenied,WITHDRAW_022:o.BadRequest,WITHDRAW_023:o.BadRequest,WITHDRAW_024:o.BadRequest,WITHDRAW_025:o.BadRequest,FUND_001:o.BadRequest,FUND_002:o.InsufficientFunds,FUND_003:o.BadRequest,FUND_004:o.ExchangeError,FUND_005:o.PermissionDenied,FUND_014:o.BadRequest,FUND_015:o.BadRequest,FUND_016:o.BadRequest,FUND_017:o.BadRequest,FUND_018:o.BadRequest,FUND_019:o.BadRequest,FUND_020:o.BadRequest,FUND_021:o.BadRequest,FUND_022:o.BadRequest,FUND_044:o.BadRequest,TRANSFER_001:o.BadRequest,TRANSFER_002:o.InsufficientFunds,TRANSFER_003:o.BadRequest,TRANSFER_004:o.PermissionDenied,TRANSFER_005:o.PermissionDenied,TRANSFER_006:o.PermissionDenied,TRANSFER_007:o.RequestTimeout,TRANSFER_008:o.BadRequest,TRANSFER_009:o.BadRequest,TRANSFER_010:o.PermissionDenied,TRANSFER_011:o.PermissionDenied,TRANSFER_012:o.PermissionDenied,symbol_not_support_trading_via_api:o.BadSymbol,open_order_min_nominal_value_limit:o.InvalidOrder,insufficient_balance:o.InsufficientFunds},broad:{"The symbol does not support trading via API":o.BadSymbol,"Exceeds the minimum notional value of a single order":o.InvalidOrder,"insufficient balance":o.InsufficientFunds}},timeframes:{"1m":"1m","5m":"5m","15m":"15m","30m":"30m","1h":"1h","2h":"2h","4h":"4h","6h":"6h","8h":"8h","1d":"1d","3d":"3d","1w":"1w","1M":"1M"},commonCurrencies:{},options:{adjustForTimeDifference:!1,timeDifference:0,accountsById:{spot:"SPOT",leverage:"LEVER",finance:"FINANCE",swap:"FUTURES_U",future:"FUTURES_U",linear:"FUTURES_U",inverse:"FUTURES_C"},networks:{ERC20:"Ethereum",TRC20:"Tron",BEP20:"BNB Smart Chain",BEP2:"BNB-BEP2",ETH:"Ethereum",TRON:"Tron",BNB:"BNB Smart Chain",AVAX:"AVAX C-Chain",GAL:"GAL(FT)",ALEO:"ALEO(IOU)",BTC:"Bitcoin",XT:"XT Smart Chain",ETC:"Ethereum Classic",MATIC:"Polygon",LTC:"Litecoin",BTS:"BitShares",XRP:"Ripple",XLM:"Stellar Network",ADA:"Cardano",XWC:"XWC-XWC",DOGE:"dogecoin",DCR:"Decred",SC:"Siacoin",XTZ:"Tezos",ZEC:"Zcash",XMR:"Monero",LSK:"Lisk",ATOM:"Cosmos",ONT:"Ontology",ALGO:"Algorand",SOL:"SOL-SOL",DOT:"Polkadot",ZEN:"Horizen",FIL:"Filecoin",CHZ:"chz",ICP:"Internet Computer",KSM:"Kusama",LUNA:"Terra",THETA:"Theta Token",FTM:"Fantom",VET:"VeChain",NEAR:"NEAR Protocol",ONE:"Harmony",KLAY:"Klaytn",AR:"Arweave",CELT:"OKT",EGLD:"Elrond eGold",CRO:"CRO-CRONOS",BCH:"Bitcoin Cash",GLMR:"Moonbeam",LOOP:"LOOP-LRC",REI:"REI Network",ASTR:"Astar Network",OP:"OPT",MMT:"MMT-MMT",TBC:"TBC-TBC",OMAX:"OMAX-OMAX CHAIN",GMMT:"GMMT chain",ZIL:"Zilliqa"},networksById:{Ethereum:"ERC20",Tron:"TRC20","BNB Smart Chain":"BEP20","BNB-BEP2":"BEP2",Bitcoin:"BTC","XT Smart Chain":"XT","Ethereum Classic":"ETC",Polygon:"MATIC",Litecoin:"LTC",BitShares:"BTS",Ripple:"XRP","Stellar Network":"XLM",Cardano:"ADA","XWC-XWC":"XWC",dogecoin:"DOGE",Decred:"DCR",Siacoin:"SC",Tezos:"XTZ",Zcash:"ZEC",Monero:"XMR",Lisk:"LSK",Cosmos:"ATOM",Ontology:"ONT",Algorand:"ALGO","SOL-SOL":"SOL",Polkadot:"DOT",Horizen:"ZEN",Filecoin:"FIL",chz:"CHZ","Internet Computer":"ICP",Kusama:"KSM",Terra:"LUNA","Theta Token":"THETA",Fantom:"FTM",VeChain:"VET","AVAX C-Chain":"AVAX","NEAR Protocol":"NEAR",Harmony:"ONE",Klaytn:"KLAY",Arweave:"AR",OKT:"CELT","Elrond eGold":"EGLD","CRO-CRONOS":"CRO","Bitcoin Cash":"BCH",Moonbeam:"GLMR","LOOP-LRC":"LOOP","REI Network":"REI","Astar Network":"ASTR","GAL(FT)":"GAL","ALEO(IOU)":"ALEO",OPT:"OP","MMT-MMT":"MMT","TBC-TBC":"TBC","OMAX-OMAX CHAIN":"OMAX","GMMT chain":"GMMT",Zilliqa:"ZIL"},createMarketBuyOrderRequiresPrice:!0,recvWindow:"5000"},features:{default:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!0,limit:100,daysBack:1e5,untilDays:1e5,marketType:!0,subType:!0,symbolRequired:!1},fetchOrder:{marginMode:!1,trigger:!0,trailing:!1,marketType:!0,subType:!0,symbolRequired:!1},fetchOpenOrders:{marginMode:!0,limit:100,trigger:!0,trailing:!1,marketType:!0,subType:!0,symbolRequired:!1},fetchOrders:{marginMode:!0,limit:100,daysBack:1e5,untilDays:1e5,trigger:!0,trailing:!1,marketType:!0,subType:!0,symbolRequired:!1},fetchClosedOrders:{marginMode:!0,limit:100,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!0,trailing:!1,marketType:!0,subType:!0,symbolRequired:!1},fetchOHLCV:{limit:1e3}},spot:{extends:"default"},forDerivatives:{extends:"default",createOrder:{triggerPrice:!0,triggerPriceType:{last:!0,mark:!0,index:!0},stopLossPrice:!0,takeProfitPrice:!0},fetchMyTrades:{daysBack:void 0,untilDays:void 0}},swap:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}},future:{linear:{extends:"forDerivatives"},inverse:{extends:"forDerivatives"}}}})}nonce(){return this.milliseconds()-this.options.timeDifference}async fetchTime(e={}){const t=await this.publicSpotGetTime(e),i=this.safeValue(t,"result");return this.safeInteger(i,"serverTime")}async fetchCurrencies(e={}){const t=[this.publicSpotGetWalletSupportCurrency(e),this.publicSpotGetCurrencies(e)],[i,s]=await Promise.all(t),a=this.safeValue(i,"result",[]),o=this.safeValue(s,"result",[]),n=this.safeValue(o,"currencies",[]),d=this.indexBy(a,"currency"),h={};for(let e=0;e<n.length;e++){const t=n[e],i=this.safeString(t,"currency"),s=this.safeCurrencyCode(i),a=this.parseNumber(this.parsePrecision(this.safeString(t,"maxPrecision"))),o=this.safeValue(d,i,{}),c=this.safeValue(o,"supportChains",[]),l={};let u,f,p=!1,m=!1,g=!1;for(let e=0;e<c.length;e++){const t=c[e],i=this.safeString(t,"chain"),s=this.networkIdToCode(i),o=this.safeValue(t,"depositEnabled");m=o||m;const n=this.safeValue(t,"withdrawEnabled");g=n||g;const d=o&&n;p=d||p;const h=this.safeString(t,"withdrawFeeAmount");void 0!==h&&(f=void 0===f?h:r.Y.stringMin(h,f));const v=this.safeString(t,"withdrawMinAmount");void 0!==v&&(u=void 0===u?v:r.Y.stringMin(v,u)),l[s]={info:t,id:i,network:s,name:void 0,active:d,fee:this.parseNumber(h),precision:a,deposit:o,withdraw:n,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(v),max:void 0},deposit:{min:void 0,max:void 0}}}}h[s]={info:t,id:i,code:s,name:this.safeString(t,"fullName"),active:p,fee:this.parseNumber(f),precision:a,deposit:m,withdraw:g,networks:l,limits:{amount:{min:void 0,max:void 0},withdraw:{min:this.parseNumber(u),max:void 0},deposit:{min:void 0,max:void 0}}}}return h}async fetchMarkets(e={}){this.options.adjustForTimeDifference&&await this.loadTimeDifference();const t=[this.fetchSpotMarkets(e),this.fetchSwapAndFutureMarkets(e)],i=await Promise.all(t),s=i[0],r=i[1];return this.arrayConcat(s,r)}async fetchSpotMarkets(e={}){const t=await this.publicSpotGetSymbol(e),i=this.safeValue(t,"result",{}),s=this.safeValue(i,"symbols",[]);return this.parseMarkets(s)}async fetchSwapAndFutureMarkets(e={}){const t=await Promise.all([this.publicLinearGetFutureMarketV1PublicSymbolList(e),this.publicInverseGetFutureMarketV1PublicSymbolList(e)]),i=this.arrayConcat(this.safeValue(t[0],"result",[]),this.safeValue(t[1],"result",[]));return this.parseMarkets(i)}parseMarkets(e){const t=[];for(let i=0;i<e.length;i++)t.push(this.parseMarket(e[i]));return t}parseMarket(e){const t=this.safeString(e,"symbol"),i=this.safeString2(e,"baseCurrency","baseCoin"),s=this.safeString2(e,"quoteCurrency","quoteCoin"),r=this.safeCurrencyCode(i),a=this.safeCurrencyCode(s),o=this.safeString(e,"state");let n=r+"/"+a;const d=this.safeValue(e,"filters",[]);let h,c,l,u,f,p,m;for(let e=0;e<d.length;e++){const t=d[e],i=this.safeString(t,"filter");"QUANTITY"===i&&(h=this.safeNumber(t,"min"),c=this.safeNumber(t,"max"),m=this.safeNumber(t,"tickSize")),"QUOTE_QTY"===i&&(l=this.safeNumber(t,"min")),"PRICE"===i&&(f=this.safeNumber(t,"min"),p=this.safeNumber(t,"max"))}void 0===m&&(m=this.parseNumber(this.parsePrecision(this.safeString(e,"quantityPrecision"))));const g=this.safeString(e,"underlyingType");let v,y,w,b,k,S=!1,O=!1,T=!1,P=!0,I="spot";if("U_BASED"===g?(n=n+":"+a,w=i,b=a,v=!0,y=!1):"COIN_BASED"===g&&(n=n+":"+r,w=i,b=r,v=!1,y=!0),void 0!==g){k=this.safeInteger(e,"deliveryDate");"perpetual"!==this.safeString(e,"productType")?(n=n+"-"+this.yymmdd(k),I="future",S=!0):(I="swap",O=!0),h=this.safeNumber(e,"minQty"),l=this.safeNumber(e,"minNotional"),u=this.safeNumber(e,"maxNotional"),f=this.safeNumber(e,"minPrice"),p=this.safeNumber(e,"maxPrice"),T=!0,P=!1}let M=!1;return T?M=this.safeValue(e,"isOpenApi",!1):"ONLINE"===o&&this.safeValue(e,"tradingEnabled")&&this.safeValue(e,"openapiEnabled")&&(M=!0),this.safeMarketStructure({id:t,symbol:n,base:r,quote:a,settle:b,baseId:i,quoteId:s,settleId:w,type:I,spot:P,margin:void 0,swap:O,future:S,option:!1,active:M,contract:T,linear:v,inverse:y,taker:this.safeNumber(e,"takerFee"),maker:this.safeNumber(e,"makerFee"),contractSize:this.safeNumber(e,"contractSize"),expiry:k,expiryDatetime:this.iso8601(k),strike:void 0,optionType:void 0,precision:{price:this.parseNumber(this.parsePrecision(this.safeString(e,"pricePrecision"))),amount:m,base:this.parseNumber(this.parsePrecision(this.safeString(e,"baseCoinPrecision"))),quote:this.parseNumber(this.parsePrecision(this.safeString(e,"quoteCoinPrecision")))},limits:{leverage:{min:this.parseNumber("1"),max:void 0},amount:{min:h,max:c},price:{min:f,max:p},cost:{min:l,max:u}},info:e})}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();let a=!1;if([a,r]=this.handleOptionAndParams(r,"fetchOHLCV","paginate",!1),a)return await this.fetchPaginatedCallDeterministic("fetchOHLCV",e,i,s,t,r,1e3);const o=this.market(e),n={symbol:o.id,interval:this.safeString(this.timeframes,t,t)};void 0!==i&&(n.startTime=i),n.limit=void 0!==s?s:1e3;const d=this.safeInteger(r,"until");let h;r=this.omit(r,["until"]),void 0!==d&&(n.endTime=d),h=o.linear?await this.publicLinearGetFutureMarketV1PublicQKline(this.extend(n,r)):o.inverse?await this.publicInverseGetFutureMarketV1PublicQKline(this.extend(n,r)):await this.publicSpotGetKline(this.extend(n,r));const c=this.safeValue(h,"result",[]);return this.parseOHLCVs(c,o,t,i,s)}parseOHLCV(e,t=void 0){const i=t.inverse?"v":"a";return[this.safeInteger(e,"t"),this.safeNumber(e,"o"),this.safeNumber(e,"h"),this.safeNumber(e,"l"),this.safeNumber(e,"c"),this.safeNumber2(e,"q",i)]}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id};let a;s.spot?(void 0!==t&&(r.limit=Math.min(t,500)),a=await this.publicSpotGetDepth(this.extend(r,i))):(r.level=void 0!==t?Math.min(t,50):50,s.linear?a=await this.publicLinearGetFutureMarketV1PublicQDepth(this.extend(r,i)):s.inverse&&(a=await this.publicInverseGetFutureMarketV1PublicQDepth(this.extend(r,i))));const o=this.safeValue(a,"result",{}),n=this.safeInteger2(o,"timestamp","t");if(s.spot){const t=this.parseOrderBook(o,e,n);return t.nonce=this.safeInteger(o,"lastUpdateId"),t}const d=this.parseOrderBook(o,e,n,"b","a");return d.nonce=this.safeInteger2(o,"u","lastUpdateId"),d}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r;r=i.linear?await this.publicLinearGetFutureMarketV1PublicQAggTicker(this.extend(s,t)):i.inverse?await this.publicInverseGetFutureMarketV1PublicQAggTicker(this.extend(s,t)):await this.publicSpotGetTicker24h(this.extend(s,t));const a=this.safeValue(r,"result");return i.spot?this.parseTicker(a[0],i):this.parseTicker(a,i)}async fetchTickers(e=void 0,t={}){let i;await this.loadMarkets(),void 0!==e&&(e=this.marketSymbols(e),i=this.market(e[0]));const s={};let r,a,o;[r,t]=this.handleMarketTypeAndParams("fetchTickers",i,t),[a,t]=this.handleSubTypeAndParams("fetchTickers",i,t),o="inverse"===a?await this.publicInverseGetFutureMarketV1PublicQAggTickers(this.extend(s,t)):"linear"===a||"swap"===r||"future"===r?await this.publicLinearGetFutureMarketV1PublicQAggTickers(this.extend(s,t)):await this.publicSpotGetTicker24h(this.extend(s,t));const n=this.safeValue(o,"result",[]),d={};for(let e=0;e<n.length;e++){const t=this.parseTicker(n[e],i);d[t.symbol]=t}return this.filterByArray(d,"symbol",e)}async fetchBidsAsks(e=void 0,t={}){await this.loadMarkets();let i,s;if(void 0!==(e=this.marketSymbols(e))&&(i=this.market(e[0])),[s,t]=this.handleSubTypeAndParams("fetchBidsAsks",i,t),void 0!==s)throw new o.NotSupported(this.id+" fetchBidsAsks() is not available for swap and future markets, only spot markets are supported");const r=await this.publicSpotGetTickerBook(this.extend({},t)),a=this.safeValue(r,"result",[]);return this.parseTickers(a,e)}parseTicker(e,t=void 0){const i=this.safeString(e,"s");let s=void 0!==t?t.type:void 0;void 0===s&&(s="cv"in e||"aq"in e?"spot":"contract");const a=(t=this.safeMarket(i,t,"_",s)).symbol,o=this.safeInteger(e,"t");let n=this.safeString2(e,"cr","r");return void 0!==n&&(n=r.Y.stringMul(n,"100")),this.safeTicker({symbol:a,timestamp:o,datetime:this.iso8601(o),high:this.safeNumber(e,"h"),low:this.safeNumber(e,"l"),bid:this.safeNumber(e,"bp"),bidVolume:this.safeNumber(e,"bq"),ask:this.safeNumber(e,"ap"),askVolume:this.safeNumber(e,"aq"),vwap:void 0,open:this.safeString(e,"o"),close:this.safeString(e,"c"),last:this.safeString(e,"c"),previousClose:void 0,change:this.safeNumber(e,"cv"),percentage:this.parseNumber(n),average:void 0,baseVolume:void 0,quoteVolume:this.safeNumber2(e,"a","v"),info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.id};let o;r.spot?(void 0!==i&&(a.limit=i),o=await this.publicSpotGetTradeRecent(this.extend(a,s))):(void 0!==i&&(a.num=i),r.linear?o=await this.publicLinearGetFutureMarketV1PublicQDeal(this.extend(a,s)):r.inverse&&(o=await this.publicInverseGetFutureMarketV1PublicQDeal(this.extend(a,s))));const n=this.safeValue(o,"result",[]);return this.parseTrades(n,r)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o,n,d;if(void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==t&&(r.startTime=t),[o,s]=this.handleMarketTypeAndParams("fetchMyTrades",a,s),[n,s]=this.handleSubTypeAndParams("fetchMyTrades",a,s),void 0!==n||"swap"===o||"future"===o)void 0!==i&&(r.size=i),d="inverse"===n?await this.privateInverseGetFutureTradeV1OrderTradeList(this.extend(r,s)):await this.privateLinearGetFutureTradeV1OrderTradeList(this.extend(r,s));else{let e;[e,s]=this.handleMarginModeAndParams("fetchMyTrades",s);const t=void 0!==e?"LEVER":"SPOT";r.bizType=t,void 0!==i&&(r.limit=i),d=await this.privateSpotGetTrade(this.extend(r,s))}const h=this.safeValue(d,"result",{}),c=this.safeValue(h,"items",[]);return this.parseTrades(c,a,t,i)}parseTrade(e,t=void 0){const i=this.safeString2(e,"s","symbol");let s=void 0!==t?t.type:void 0;let a,o;void 0===s&&(s="b"in e||"bizType"in e||"oi"in e?"spot":"contract"),t=this.safeMarket(i,t,"_",s);const n=this.safeBool(e,"b");if(void 0!==n)a=n?"sell":"buy",o="taker";else{const t=this.safeStringLower(e,"takerMaker");if(void 0!==t)o=t;else{const t=this.safeBool(e,"isMaker");void 0!==t&&(o=t?"maker":"taker")}const i=this.safeStringLower(e,"orderSide");if(void 0!==i)a=i;else{const t=this.safeString(e,"m");void 0!==t&&(a="BID"===t?"buy":"sell")}}const d=this.safeIntegerN(e,["t","time","timestamp"]),h=this.safeString2(e,"q","quantity");let c;return c="spot"===s?h:void 0===h?r.Y.stringMul(this.safeString(e,"a"),this.numberToString(t.contractSize)):r.Y.stringMul(h,this.numberToString(t.contractSize)),this.safeTrade({info:e,id:this.safeStringN(e,["i","tradeId","execId"]),timestamp:d,datetime:this.iso8601(d),symbol:t.symbol,order:this.safeString2(e,"orderId","oi"),type:this.safeStringLower(e,"orderType"),side:a,takerOrMaker:o,price:this.safeString2(e,"p","price"),amount:c,cost:void 0,fee:{currency:this.safeCurrencyCode(this.safeString2(e,"feeCurrency","feeCoin")),cost:this.safeString(e,"fee")}},t)}async fetchBalance(e={}){let t,i,s;await this.loadMarkets(),[t,e]=this.handleMarketTypeAndParams("fetchBalance",void 0,e),[i,e]=this.handleSubTypeAndParams("fetchBalance",void 0,e);const r="swap"===t||"future"===t;let a;if(s="inverse"===i?await this.privateInverseGetFutureUserV1BalanceList(e):"linear"===i||r?await this.privateLinearGetFutureUserV1BalanceList(e):await this.privateSpotGetBalances(e),void 0!==i||r)a=this.safeValue(s,"result",[]);else{const e=this.safeValue(s,"result",{});a=this.safeValue(e,"assets",[])}return this.parseBalance(a)}parseBalance(e){const t={info:e};for(let i=0;i<e.length;i++){const s=e[i],a=this.safeString2(s,"currency","coin"),o=this.safeCurrencyCode(a),n=this.account(),d=this.safeString2(s,"availableAmount","availableBalance");let h=this.safeString(s,"frozenAmount");const c=this.safeString2(s,"totalAmount","walletBalance");if(void 0===h){const e=r.Y.stringAdd(this.safeString(s,"crossedMargin"),this.safeString(s,"isolatedMargin"));h=r.Y.stringAdd(this.safeString(s,"openOrderMarginFrozen"),e)}n.free=d,n.used=h,n.total=c,t[o]=n}return this.safeBalance(t)}async createMarketBuyOrderWithCost(e,t,i={}){await this.loadMarkets();if(!this.market(e).spot)throw new o.NotSupported(this.id+" createMarketBuyOrderWithCost() supports spot orders only");return await this.createOrder(e,"market","buy",t,1,i)}async createOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e);return e=o.symbol,o.spot?await this.createSpotOrder(e,t,i,s,r,a):await this.createContractOrder(e,t,i,s,r,a)}async createSpotOrder(e,t,i,s,a=void 0,n={}){await this.loadMarkets();const d=this.market(e),h={symbol:d.id,side:i.toUpperCase(),type:t.toUpperCase()};let c,l;[l,n]=this.handleMarginModeAndParams("createOrder",n);const u=void 0!==l?"LEVER":"SPOT";if(h.bizType=u,"market"===t){if(c=this.safeStringUpper(n,"timeInForce","FOK"),"buy"===i){const t=this.safeString(n,"cost");n=this.omit(n,"cost");if(this.safeBool(this.options,"createMarketBuyOrderRequiresPrice",!0)){if(void 0===a&&void 0===t)throw new o.InvalidOrder(this.id+" createOrder() requires a price argument or cost in params for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option to false and pass in the cost to spend into the amount parameter");{const i=this.numberToString(s),o=this.numberToString(a);let n;n=void 0!==a?r.Y.stringMul(i,o):t,h.quoteQty=this.costToPrecision(e,n)}}else{const i=void 0!==t?t:s;h.quoteQty=this.costToPrecision(e,i)}}}else c=this.safeStringUpper(n,"timeInForce","GTC"),h.price=this.priceToPrecision(e,a);"sell"!==i&&"limit"!==t||(h.quantity=this.amountToPrecision(e,s)),h.timeInForce=c;const f=await this.privateSpotPostOrder(this.extend(h,n)),p=this.safeValue(f,"result",{});return this.parseOrder(p,d)}async createContractOrder(e,t,i,s,r=void 0,a={}){await this.loadMarkets();const o=this.market(e),n={symbol:o.id,origQty:this.amountToPrecision(e,s)},d=this.safeStringUpper(a,"timeInForce");void 0!==d&&(n.timeInForce=d);const h=this.safeValue(a,"reduceOnly",!1);if("buy"===i){const e=h?"SHORT":"LONG";n.positionSide=e}else{const e=h?"LONG":"SHORT";n.positionSide=e}let c;const l=this.safeNumber2(a,"triggerPrice","stopPrice"),u=this.safeNumber2(a,"stopLoss","triggerStopPrice"),f=this.safeNumber2(a,"takeProfit","triggerProfitPrice"),p=void 0!==l,m=void 0!==u,g=void 0!==f;if(void 0!==r&&(m||g||(n.price=this.priceToPrecision(e,r))),p){n.timeInForce=this.safeStringUpper(a,"timeInForce","GTC"),n.triggerPriceType=this.safeString(a,"triggerPriceType","LATEST_PRICE"),n.orderSide=i.toUpperCase(),n.stopPrice=this.priceToPrecision(e,l);const s="market"===t?"STOP_MARKET":"STOP";n.entrustType=s,a=this.omit(a,"triggerPrice"),o.linear?c=await this.privateLinearPostFutureTradeV1EntrustCreatePlan(this.extend(n,a)):o.inverse&&(c=await this.privateInversePostFutureTradeV1EntrustCreatePlan(this.extend(n,a)))}else m||g?(m?n.triggerStopPrice=this.priceToPrecision(e,u):n.triggerProfitPrice=this.priceToPrecision(e,f),a=this.omit(a,["stopLoss","takeProfit"]),o.linear?c=await this.privateLinearPostFutureTradeV1EntrustCreateProfit(this.extend(n,a)):o.inverse&&(c=await this.privateInversePostFutureTradeV1EntrustCreateProfit(this.extend(n,a)))):(n.orderSide=i.toUpperCase(),n.orderType=t.toUpperCase(),o.linear?c=await this.privateLinearPostFutureTradeV1OrderCreate(this.extend(n,a)):o.inverse&&(c=await this.privateInversePostFutureTradeV1OrderCreate(this.extend(n,a))));return this.parseOrder(c,o)}async fetchOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={};let a,o,n;[a,i]=this.handleMarketTypeAndParams("fetchOrder",s,i),[o,i]=this.handleSubTypeAndParams("fetchOrder",s,i);const d=this.safeValue(i,"stop"),h=this.safeValue(i,"stopLossTakeProfit");d?r.entrustId=e:h?r.profitId=e:r.orderId=e,d?(i=this.omit(i,"stop"),n="inverse"===o?await this.privateInverseGetFutureTradeV1EntrustPlanDetail(this.extend(r,i)):await this.privateLinearGetFutureTradeV1EntrustPlanDetail(this.extend(r,i))):h?(i=this.omit(i,"stopLossTakeProfit"),n="inverse"===o?await this.privateInverseGetFutureTradeV1EntrustProfitDetail(this.extend(r,i)):await this.privateLinearGetFutureTradeV1EntrustProfitDetail(this.extend(r,i))):n="inverse"===o?await this.privateInverseGetFutureTradeV1OrderDetail(this.extend(r,i)):"linear"===o||"swap"===a||"future"===a?await this.privateLinearGetFutureTradeV1OrderDetail(this.extend(r,i)):await this.privateSpotGetOrderOrderId(this.extend(r,i));const c=this.safeValue(n,"result",{});return this.parseOrder(c,s)}async fetchOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,o,n,d;void 0!==e&&(a=this.market(e),r.symbol=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[o,s]=this.handleMarketTypeAndParams("fetchOrders",a,s),[n,s]=this.handleSubTypeAndParams("fetchOrders",a,s);if(this.safeValue2(s,"trigger","stop"))s=this.omit(s,["trigger","stop"]),d="inverse"===n?await this.privateInverseGetFutureTradeV1EntrustPlanListHistory(this.extend(r,s)):await this.privateLinearGetFutureTradeV1EntrustPlanListHistory(this.extend(r,s));else if("inverse"===n)d=await this.privateInverseGetFutureTradeV1OrderListHistory(this.extend(r,s));else if("linear"===n||"swap"===o||"future"===o)d=await this.privateLinearGetFutureTradeV1OrderListHistory(this.extend(r,s));else{let e;[e,s]=this.handleMarginModeAndParams("fetchOrders",s);const t=void 0!==e?"LEVER":"SPOT";r.bizType=t,d=await this.privateSpotGetHistoryOrder(this.extend(r,s))}const h=this.safeValue(d,"result",{}),c=this.safeValue(h,"items",[]);return this.parseOrders(c,a,t,i)}async fetchOrdersByStatus(e,t=void 0,i=void 0,s=void 0,r={}){await this.loadMarkets();const a={};let o,n,d,h;void 0!==t&&(o=this.market(t),a.symbol=o.id),[n,r]=this.handleMarketTypeAndParams("fetchOrdersByStatus",o,r),[d,r]=this.handleSubTypeAndParams("fetchOrdersByStatus",o,r);const c=this.safeValue(r,"stop"),l=this.safeValue(r,"stopLossTakeProfit");if("open"===e?c||l?a.state="NOT_TRIGGERED":void 0!==d&&(a.state="NEW"):a.state="closed"===e?c||l?"TRIGGERED":"FILLED":"canceled"===e?c||l?"USER_REVOCATION":"CANCELED":e,(c||l||void 0!==d||"swap"===n||"future"===n)&&(void 0!==i&&(a.startTime=i),void 0!==s&&(a.size=s)),c)r=this.omit(r,"stop"),h="inverse"===d?await this.privateInverseGetFutureTradeV1EntrustPlanList(this.extend(a,r)):await this.privateLinearGetFutureTradeV1EntrustPlanList(this.extend(a,r));else if(l)r=this.omit(r,"stopLossTakeProfit"),h="inverse"===d?await this.privateInverseGetFutureTradeV1EntrustProfitList(this.extend(a,r)):await this.privateLinearGetFutureTradeV1EntrustProfitList(this.extend(a,r));else if(void 0!==d||"swap"===n||"future"===n)h="inverse"===d?await this.privateInverseGetFutureTradeV1OrderList(this.extend(a,r)):await this.privateLinearGetFutureTradeV1OrderList(this.extend(a,r));else{let t;[t,r]=this.handleMarginModeAndParams("fetchOrdersByStatus",r);const o=void 0!==t?"LEVER":"SPOT";a.bizType=o,"open"!==e?(void 0!==i&&(a.startTime=i),void 0!==s&&(a.limit=s),h=await this.privateSpotGetHistoryOrder(this.extend(a,r))):h=await this.privateSpotGetOpenOrder(this.extend(a,r))}const u="open"===e&&void 0===d,f=this.safeValue(h,"result",{}),p=u?this.safeValue(h,"result",[]):this.safeValue(f,"items",[]);return this.parseOrders(p,o,i,s)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("open",e,t,i,s)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("closed",e,t,i,s)}async fetchCanceledOrders(e=void 0,t=void 0,i=void 0,s={}){return await this.fetchOrdersByStatus("canceled",e,t,i,s)}async cancelOrder(e,t=void 0,i={}){let s;await this.loadMarkets(),void 0!==t&&(s=this.market(t));const r={};let a,o,n;[a,i]=this.handleMarketTypeAndParams("cancelOrder",s,i),[o,i]=this.handleSubTypeAndParams("cancelOrder",s,i);const d=this.safeValue2(i,"trigger","stop"),h=this.safeValue(i,"stopLossTakeProfit");d?r.entrustId=e:h?r.profitId=e:r.orderId=e,d?(i=this.omit(i,["trigger","stop"]),n="inverse"===o?await this.privateInversePostFutureTradeV1EntrustCancelPlan(this.extend(r,i)):await this.privateLinearPostFutureTradeV1EntrustCancelPlan(this.extend(r,i))):h?(i=this.omit(i,"stopLossTakeProfit"),n="inverse"===o?await this.privateInversePostFutureTradeV1EntrustCancelProfitStop(this.extend(r,i)):await this.privateLinearPostFutureTradeV1EntrustCancelProfitStop(this.extend(r,i))):n="inverse"===o?await this.privateInversePostFutureTradeV1OrderCancel(this.extend(r,i)):"linear"===o||"swap"===a||"future"===a?await this.privateLinearPostFutureTradeV1OrderCancel(this.extend(r,i)):await this.privateSpotDeleteOrderOrderId(this.extend(r,i));const c=void 0!==o||"swap"===a||"future"===a?n:this.safeValue(n,"result",{});return this.parseOrder(c,s)}async cancelAllOrders(e=void 0,t={}){await this.loadMarkets();const i={};let s,r,a,o;void 0!==e&&(s=this.market(e),i.symbol=s.id),[r,t]=this.handleMarketTypeAndParams("cancelAllOrders",s,t),[a,t]=this.handleSubTypeAndParams("cancelAllOrders",s,t);const n=this.safeValue2(t,"trigger","stop"),d=this.safeValue(t,"stopLossTakeProfit");if(n)t=this.omit(t,["trigger","stop"]),o="inverse"===a?await this.privateInversePostFutureTradeV1EntrustCancelAllPlan(this.extend(i,t)):await this.privateLinearPostFutureTradeV1EntrustCancelAllPlan(this.extend(i,t));else if(d)t=this.omit(t,"stopLossTakeProfit"),o="inverse"===a?await this.privateInversePostFutureTradeV1EntrustCancelAllProfitStop(this.extend(i,t)):await this.privateLinearPostFutureTradeV1EntrustCancelAllProfitStop(this.extend(i,t));else if("inverse"===a)o=await this.privateInversePostFutureTradeV1OrderCancelAll(this.extend(i,t));else if("linear"===a||"swap"===r||"future"===r)o=await this.privateLinearPostFutureTradeV1OrderCancelAll(this.extend(i,t));else{let e;[e,t]=this.handleMarginModeAndParams("cancelAllOrders",t);const s=void 0!==e?"LEVER":"SPOT";i.bizType=s,o=await this.privateSpotDeleteOpenOrder(this.extend(i,t))}return[this.safeOrder(o)]}async cancelOrders(e,t=void 0,i={}){await this.loadMarkets();const s={orderIds:e};let r,a;if(void 0!==t&&(r=this.market(t)),[a,i]=this.handleSubTypeAndParams("cancelOrders",r,i),void 0!==a)throw new o.NotSupported(this.id+" cancelOrders() does not support swap and future orders, only spot orders are accepted");const n=await this.privateSpotDeleteBatchOrder(this.extend(s,i));return[this.safeOrder(n)]}parseOrder(e,t=void 0){const i=this.safeString(e,"symbol"),s="result"in e||"positionSide"in e?"contract":"spot";t=this.safeMarket(i,t,void 0,s);const a=this.safeSymbol(i,t,void 0,s),o=this.safeInteger2(e,"time","createdTime"),n=this.safeNumber(e,"origQty"),d="spot"===s?n:r.Y.stringMul(this.numberToString(n),this.numberToString(t.contractSize)),h=this.safeNumber(e,"executedQty"),c="spot"===s?h:r.Y.stringMul(this.numberToString(h),this.numberToString(t.contractSize)),l=this.safeInteger(e,"updatedTime");return this.safeOrder({info:e,id:this.safeStringN(e,["orderId","result","cancelId","entrustId","profitId"]),clientOrderId:this.safeString(e,"clientOrderId"),timestamp:o,datetime:this.iso8601(o),lastTradeTimestamp:l,lastUpdateTimestamp:l,symbol:a,type:this.safeStringLower2(e,"type","orderType"),timeInForce:this.safeString(e,"timeInForce"),postOnly:void 0,side:this.safeStringLower2(e,"side","orderSide"),price:this.safeNumber(e,"price"),triggerPrice:this.safeNumber(e,"stopPrice"),stopLoss:this.safeNumber(e,"triggerStopPrice"),takeProfit:this.safeNumber(e,"triggerProfitPrice"),amount:d,filled:c,remaining:this.safeNumber(e,"leavingQty"),cost:void 0,average:this.safeNumber(e,"avgPrice"),status:this.parseOrderStatus(this.safeString(e,"state")),fee:{currency:this.safeCurrencyCode(this.safeString(e,"feeCurrency")),cost:this.safeNumber(e,"fee")},trades:void 0},t)}parseOrderStatus(e){return this.safeString({NEW:"open",PARTIALLY_FILLED:"open",FILLED:"closed",CANCELED:"canceled",REJECTED:"rejected",EXPIRED:"expired",UNFINISHED:"open",NOT_TRIGGERED:"open",TRIGGERING:"open",TRIGGERED:"closed",USER_REVOCATION:"canceled",PLATFORM_REVOCATION:"rejected",HISTORY:"expired"},e,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a,n,d,h;if(void 0!==e&&(a=this.currency(e)),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i),[n,s]=this.handleMarketTypeAndParams("fetchLedger",void 0,s),[d,s]=this.handleSubTypeAndParams("fetchLedger",void 0,s),"inverse"===d)h=await this.privateInverseGetFutureUserV1BalanceBills(this.extend(r,s));else{if("linear"!==d&&"swap"!==n&&"future"!==n)throw new o.NotSupported(this.id+" fetchLedger() does not support spot transactions, only swap and future wallet transactions are supported");h=await this.privateLinearGetFutureUserV1BalanceBills(this.extend(r,s))}const c=this.safeValue(h,"result",{}),l=this.safeValue(c,"items",[]);return this.parseLedger(l,a,t,i)}parseLedgerEntry(e,t=void 0){const i="ADD"===this.safeString(e,"side")?"in":"out",s=this.safeString(e,"coin");t=this.safeCurrency(s,t);const r=this.safeInteger(e,"createdTime");return this.safeLedgerEntry({info:e,id:this.safeString(e,"id"),direction:i,account:void 0,referenceId:void 0,referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:this.safeCurrencyCode(s,t),amount:this.safeNumber(e,"amount"),timestamp:r,datetime:this.iso8601(r),before:void 0,after:this.safeNumber(e,"afterAmount"),status:void 0,fee:{currency:void 0,cost:void 0}},t)}parseLedgerEntryType(e){return this.safeString({EXCHANGE:"transfer",CLOSE_POSITION:"trade",TAKE_OVER:"trade",MERGE:"trade",QIANG_PING_MANAGER:"fee",FUND:"fee",FEE:"fee",ADL:"auto-deleveraging"},e,e)}async fetchDepositAddress(e,t={}){let i;await this.loadMarkets(),[i,t]=this.handleNetworkCodeAndParams(t);const s=this.currency(e),r=this.networkCodeToId(i,e);this.checkRequiredArgument("fetchDepositAddress",r,"network");const a={currency:s.id,chain:r},o=await this.privateSpotGetDepositAddress(this.extend(a,t)),n=this.safeValue(o,"result",{});return this.parseDepositAddress(n,s)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"address");return this.checkAddress(i),{info:e,currency:this.safeCurrencyCode(void 0,t),network:void 0,address:i,tag:this.safeString(e,"memo")}}async fetchDeposits(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=await this.privateSpotGetDepositHistory(this.extend(r,s)),n=this.safeValue(o,"result",{}),d=this.safeValue(n,"items",[]);return this.parseTransactions(d,a,t,i,s)}async fetchWithdrawals(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};let a;void 0!==e&&(a=this.currency(e),r.currency=a.id),void 0!==t&&(r.startTime=t),void 0!==i&&(r.limit=i);const o=await this.privateSpotGetWithdrawHistory(this.extend(r,s)),n=this.safeValue(o,"result",{}),d=this.safeValue(n,"items",[]);return this.parseTransactions(d,a,t,i,s)}async withdraw(e,t,i,s=void 0,r={}){this.checkAddress(i),await this.loadMarkets();const a=this.currency(e);let o;[s,r]=this.handleWithdrawTagAndParams(s,r),[o,r]=this.handleNetworkCodeAndParams(r);const n=this.safeValue(this.options,"networks",{}),d=this.safeString2(n,o,e,e),h={currency:a.id,chain:d,amount:this.currencyToPrecision(e,t),address:i};void 0!==s&&(h.memo=s);const c=await this.privateSpotPostWithdraw(this.extend(h,r)),l=this.safeValue(c,"result",{});return this.parseTransaction(l,a)}parseTransaction(e,t=void 0){const i="fromAddr"in e?"deposit":"withdraw",s=this.safeInteger(e,"createdTime"),r=this.safeString(e,"address"),a=this.safeString(e,"memo"),o=this.safeCurrencyCode(this.safeString(e,"currency"),t),n=this.safeNumber(e,"fee"),d=void 0!==n?o:void 0,h=this.safeString(e,"chain");return{info:e,id:this.safeString(e,"id"),txid:this.safeString(e,"transactionId"),timestamp:s,datetime:this.iso8601(s),updated:void 0,addressFrom:this.safeString(e,"fromAddr"),addressTo:r,address:r,tagFrom:void 0,tagTo:void 0,tag:a,type:i,amount:this.safeNumber(e,"amount"),currency:o,network:this.networkIdToCode(h,o),status:this.parseTransactionStatus(this.safeString(e,"status")),comment:a,fee:{currency:d,cost:n,rate:void 0},internal:void 0}}parseTransactionStatus(e){return this.safeString({SUBMIT:"pending",REVIEW:"pending",AUDITED:"pending",PENDING:"pending",CANCEL:"canceled",FAIL:"failed",SUCCESS:"ok"},e,e)}async setLeverage(e,t=void 0,i={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" setLeverage() requires a symbol argument");const s=this.safeString(i,"positionSide");if(this.checkRequiredArgument("setLeverage",s,"positionSide",["LONG","SHORT"]),e<1||e>125)throw new o.BadRequest(this.id+" setLeverage() leverage should be between 1 and 125");await this.loadMarkets();const r=this.market(t);if(!r.contract)throw new o.BadSymbol(this.id+" setLeverage() supports contract markets only");const a={symbol:r.id,positionSide:s,leverage:e};let n,d;return[n,i]=this.handleSubTypeAndParams("setLeverage",r,i),d="inverse"===n?await this.privateInversePostFutureUserV1PositionAdjustLeverage(this.extend(a,i)):await this.privateLinearPostFutureUserV1PositionAdjustLeverage(this.extend(a,i)),d}async addMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"ADD",i)}async reduceMargin(e,t,i={}){return await this.modifyMarginHelper(e,t,"SUB",i)}async modifyMarginHelper(e,t,i,s={}){const r=this.safeString(s,"positionSide");this.checkRequiredArgument("setLeverage",r,"positionSide",["LONG","SHORT"]),await this.loadMarkets();const a=this.market(e),o={symbol:a.id,margin:t,type:i,positionSide:r};let n,d;return[n,s]=this.handleSubTypeAndParams("modifyMarginHelper",a,s),d="inverse"===n?await this.privateInversePostFutureUserV1PositionMargin(this.extend(o,s)):await this.privateLinearPostFutureUserV1PositionMargin(this.extend(o,s)),this.parseMarginModification(d,a)}parseMarginModification(e,t=void 0){return{info:e,type:void 0,amount:void 0,code:void 0,symbol:this.safeSymbol(void 0,t),status:void 0,marginMode:void 0,total:void 0,timestamp:void 0,datetime:void 0}}async fetchLeverageTiers(e=void 0,t={}){let i,s;await this.loadMarkets(),[i,t]=this.handleSubTypeAndParams("fetchLeverageTiers",void 0,t),s="inverse"===i?await this.publicInverseGetFutureMarketV1PublicLeverageBracketList(t):await this.publicLinearGetFutureMarketV1PublicLeverageBracketList(t);const r=this.safeValue(s,"result",[]);return e=this.marketSymbols(e),this.parseLeverageTiers(r,e,"symbol")}parseLeverageTiers(e,t=void 0,i=void 0){const s={};for(let i=0;i<e.length;i++){const r=e[i],a=this.safeString(r,"symbol"),o=this.safeMarket(a,void 0,"_","contract"),n=this.safeSymbol(a,o);void 0!==t?this.inArray(n,t)&&(s[n]=this.parseMarketLeverageTiers(r,o)):s[n]=this.parseMarketLeverageTiers(e[i],o)}return s}async fetchMarketLeverageTiers(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a;[r,t]=this.handleSubTypeAndParams("fetchMarketLeverageTiers",i,t),a="inverse"===r?await this.publicInverseGetFutureMarketV1PublicLeverageBracketDetail(this.extend(s,t)):await this.publicLinearGetFutureMarketV1PublicLeverageBracketDetail(this.extend(s,t));const o=this.safeValue(a,"result",{});return this.parseMarketLeverageTiers(o,i)}parseMarketLeverageTiers(e,t=void 0){const i=[],s=this.safeValue(e,"leverageBrackets",[]);for(let r=0;r<s.length;r++){const a=s[r],o=this.safeString(e,"symbol");t=this.safeMarket(o,t,"_","contract"),i.push({tier:this.safeInteger(a,"bracket"),symbol:this.safeSymbol(o,t,"_","contract"),currency:t.settle,minNotional:this.safeNumber(s[r-1],"maxNominalValue",0),maxNotional:this.safeNumber(a,"maxNominalValue"),maintenanceMarginRate:this.safeNumber(a,"maintMarginRate"),maxLeverage:this.safeNumber(a,"maxLeverage"),info:a})}return i}async fetchFundingRateHistory(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new o.ArgumentsRequired(this.id+" fetchFundingRateHistory() requires a symbol argument");await this.loadMarkets();const r=this.market(e);if(!r.swap)throw new o.BadSymbol(this.id+" fetchFundingRateHistory() supports swap contracts only");const a={symbol:r.id};let n,d;void 0!==i&&(a.limit=i),[n,s]=this.handleSubTypeAndParams("fetchFundingRateHistory",r,s),d="inverse"===n?await this.publicInverseGetFutureMarketV1PublicQFundingRateRecord(this.extend(a,s)):await this.publicLinearGetFutureMarketV1PublicQFundingRateRecord(this.extend(a,s));const h=this.safeValue(d,"result",{}),c=this.safeValue(h,"items",[]),l=[];for(let e=0;e<c.length;e++){const t=c[e],i=this.safeString(t,"symbol"),s=this.safeSymbol(i,r),a=this.safeInteger(t,"createdTime");l.push({info:t,symbol:s,fundingRate:this.safeNumber(t,"fundingRate"),timestamp:a,datetime:this.iso8601(a)})}const u=this.sortBy(l,"timestamp");return this.filterBySymbolSinceLimit(u,r.symbol,t,i)}async fetchFundingInterval(e,t={}){return await this.fetchFundingRate(e,t)}async fetchFundingRate(e,t={}){await this.loadMarkets();const i=this.market(e);if(!i.swap)throw new o.BadSymbol(this.id+" fetchFundingRate() supports swap contracts only");const s={symbol:i.id};let r,a;[r,t]=this.handleSubTypeAndParams("fetchFundingRate",i,t),a="inverse"===r?await this.publicInverseGetFutureMarketV1PublicQFundingRate(this.extend(s,t)):await this.publicLinearGetFutureMarketV1PublicQFundingRate(this.extend(s,t));const n=this.safeValue(a,"result",{});return this.parseFundingRate(n,i)}parseFundingRate(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,"_","swap"),r=this.safeInteger(e,"nextCollectionTime");let a=this.safeString(e,"collectionInternal");return void 0!==a&&(a+="h"),{info:e,symbol:s,markPrice:void 0,indexPrice:void 0,interestRate:void 0,estimatedSettlePrice:void 0,timestamp:void 0,datetime:void 0,fundingRate:this.safeNumber(e,"fundingRate"),fundingTimestamp:r,fundingDatetime:this.iso8601(r),nextFundingRate:void 0,nextFundingTimestamp:void 0,nextFundingDatetime:void 0,previousFundingRate:void 0,previousFundingTimestamp:void 0,previousFundingDatetime:void 0,interval:a}}async fetchFundingHistory(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e);if(!r.swap)throw new o.BadSymbol(this.id+" fetchFundingHistory() supports swap contracts only");const a={symbol:r.id};let n,d;void 0!==t&&(a.startTime=t),void 0!==i&&(a.limit=i),[n,s]=this.handleSubTypeAndParams("fetchFundingHistory",r,s),d="inverse"===n?await this.privateInverseGetFutureUserV1BalanceFundingRateList(this.extend(a,s)):await this.privateLinearGetFutureUserV1BalanceFundingRateList(this.extend(a,s));const h=this.safeValue(d,"result",{}),c=this.safeValue(h,"items",[]),l=[];for(let e=0;e<c.length;e++){const t=c[e];l.push(this.parseFundingHistory(t,r))}const u=this.sortBy(l,"timestamp");return this.filterBySinceLimit(u,t,i)}parseFundingHistory(e,t=void 0){const i=this.safeString(e,"symbol"),s=this.safeSymbol(i,t,"_","swap"),r=this.safeString(e,"coin"),a=this.safeCurrencyCode(r),o=this.safeInteger(e,"createdTime");return{info:e,symbol:s,code:a,timestamp:o,datetime:this.iso8601(o),id:this.safeString(e,"id"),amount:this.safeNumber(e,"cast")}}async fetchPosition(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id};let r,a;[r,t]=this.handleSubTypeAndParams("fetchPosition",i,t),a="inverse"===r?await this.privateInverseGetFutureUserV1PositionList(this.extend(s,t)):await this.privateLinearGetFutureUserV1PositionList(this.extend(s,t));const o=this.safeValue(a,"result",[]);for(let e=0;e<o.length;e++){const t=o[e],i=this.safeString(t,"symbol"),s=this.safeMarket(i,void 0,void 0,"contract");if("0"!==this.safeString(t,"positionSize"))return this.parsePosition(t,s)}}async fetchPositions(e=void 0,t={}){let i,s;await this.loadMarkets(),[i,t]=this.handleSubTypeAndParams("fetchPositions",void 0,t),s="inverse"===i?await this.privateInverseGetFutureUserV1PositionList(t):await this.privateLinearGetFutureUserV1PositionList(t);const r=this.safeValue(s,"result",[]),a=[];for(let e=0;e<r.length;e++){const t=r[e],i=this.safeString(t,"symbol"),s=this.safeMarket(i,void 0,void 0,"contract");a.push(this.parsePosition(t,s))}return this.filterByArrayPositions(a,"symbol",e,!1)}parsePosition(e,t=void 0){const i=this.safeString(e,"symbol");t=this.safeMarket(i,t,void 0,"contract");const s=this.safeSymbol(i,t,void 0,"contract"),r="CROSSED"===this.safeString(e,"positionType")?"cross":"isolated",a=this.safeNumber(e,"isolatedMargin");return this.safePosition({info:e,id:void 0,symbol:s,timestamp:void 0,datetime:void 0,hedged:void 0,side:this.safeStringLower(e,"positionSide"),contracts:this.safeNumber(e,"positionSize"),contractSize:t.contractSize,entryPrice:this.safeNumber(e,"entryPrice"),markPrice:void 0,notional:void 0,leverage:this.safeInteger(e,"leverage"),collateral:a,initialMargin:a,maintenanceMargin:void 0,initialMarginPercentage:void 0,maintenanceMarginPercentage:void 0,unrealizedPnl:void 0,liquidationPrice:void 0,marginMode:r,percentage:void 0,marginRatio:void 0})}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o=this.safeValue(this.options,"accountsById"),n=this.safeString(o,i,i),d=this.safeString(o,s,s),h=this.currencyToPrecision(e,t),c={bizId:this.uuid(),currency:a.id,amount:h,from:n,to:d},l=await this.privateSpotPostBalanceTransfer(this.extend(c,r));return this.parseTransfer(l,a)}parseTransfer(e,t=void 0){return{info:e,id:this.safeString(e,"result"),timestamp:void 0,datetime:void 0,currency:void 0,amount:void 0,fromAccount:void 0,toAccount:void 0,status:void 0}}async setMarginMode(e,t=void 0,i={}){if(void 0===t)throw new o.ArgumentsRequired(this.id+" setMarginMode() requires a symbol argument");await this.loadMarkets();const s=this.market(t);if(s.spot)throw new o.BadSymbol(this.id+" setMarginMode() supports contract markets only");if("isolated"!==(e=e.toLowerCase())&&"cross"!==e)throw new o.BadRequest(this.id+" setMarginMode() marginMode argument should be isolated or cross");e="cross"===e?"CROSSED":"ISOLATED";const r=this.safeStringUpper(i,"positionSide");if(void 0===r)throw new o.ArgumentsRequired(this.id+' setMarginMode() requires a positionSide parameter, either "LONG" or "SHORT"');const a={positionType:e,positionSide:r,symbol:s.id};return await this.privateLinearPostFutureUserV1PositionChangeType(this.extend(a,i))}handleErrors(e,t,i,s,r,a,n,d,h){const c=this.safeStringUpper2(n,"msgInfo","mc");if(void 0!==c&&"SUCCESS"!==c){const e=this.id+" "+a,t=this.safeValue(n,"error",{}),i=this.safeString(n,"mc"),s=this.safeString(t,"code",i),r=this.safeString(n,"msgInfo"),d=this.safeString(t,"msg",r);throw this.throwExactlyMatchedException(this.exceptions.exact,s,e),this.throwBroadlyMatchedException(this.exceptions.broad,d,e),new o.ExchangeError(e)}}sign(e,t=[],i="GET",s={},r=void 0,a=void 0){const o="private"===t[0],d=t[1],h="/"+this.implodeParams(e,s);let c;c="spot"===d||"user"===d?o?"/"+this.version+h:"/"+this.version+"/public"+h:h;let l=this.urls.api[d]+c;const u=this.omit(s,this.extractParams(e)),f=this.urlencode(this.keysort(u));if(r={"Content-Type":"application/json"},o){this.checkRequiredCredentials();const t=this.safeString(this.options,"recvWindow"),s=this.safeString(u,"recvWindow",t),o=this.numberToString(this.nonce());if(a=u,"/v4/order"===c||"/future/trade/v1/order/create"===c||"/future/trade/v1/entrust/create-plan"===c||"/future/trade/v1/entrust/create-profit"===c||"/future/trade/v1/order/create-batch"===c){const e="CCXT";c.indexOf("future")>-1?a.clientMedia=e:a.media=e}const h="GET"===i||"order/{orderId}"===e||"ws-token"===e;let p;a=h?void 0:this.json(a),"spot"===d||"user"===d?(p="xt-validate-algorithms=HmacSHA256&xt-validate-appkey="+this.apiKey+"&xt-validate-recvwindow="+s+"&xt-validate-timestamp="+o,h?f?(l+="?"+f,p+="#"+i+"#"+c+"#"+this.rawencode(this.keysort(u))):p+="#"+i+"#"+c:p+="#"+i+"#"+c+"#"+a,r["xt-validate-algorithms"]="HmacSHA256",r["xt-validate-recvwindow"]=s):(p="xt-validate-appkey="+this.apiKey+"&xt-validate-timestamp="+o,"GET"===i?f?(l+="?"+f,p+="#"+c+"#"+f):p+="#"+c:p+="#"+c+"#"+a);const m=this.hmac(this.encode(p),this.encode(this.secret),n.s);r["xt-validate-appkey"]=this.apiKey,r["xt-validate-timestamp"]=o,r["xt-validate-signature"]=m}else f&&(l+="?"+f);return{url:l,method:i,body:a,headers:r}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"yobit",name:"YoBit",countries:["RU"],rateLimit:2e3,version:"3",pro:!1,has:{CORS:void 0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelOrder:!0,closeAllPositions:!1,closePosition:!1,createDepositAddress:!0,createMarketOrder:!1,createOrder:!0,createReduceOnlyOrder:!1,createStopLimitOrder:!1,createStopMarketOrder:!1,createStopOrder:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDepositAddress:!0,fetchDepositAddresses:!1,fetchDepositAddressesByNetwork:!1,fetchDeposits:!1,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchGreeks:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchLeverage:!1,fetchLeverages:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarginModes:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrices:!1,fetchMyLiquidations:!1,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOption:!1,fetchOptionChain:!1,fetchOrder:!0,fetchOrderBook:!0,fetchOrderBooks:!0,fetchPosition:!1,fetchPositionHistory:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsForSymbol:!1,fetchPositionsHistory:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!1,fetchTicker:!0,fetchTickers:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!0,fetchTransactions:!1,fetchTransfer:!1,fetchTransfers:!1,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawals:!1,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!1,withdraw:!0,ws:!1},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766910-cdcbfdae-5eea-11e7-9859-03fea873272d.jpg",api:{public:"https://yobit.net/api",private:"https://yobit.net/tapi"},www:"https://www.yobit.net",doc:"https://www.yobit.net/en/api/",fees:"https://www.yobit.net/en/fees/"},api:{public:{get:{"depth/{pair}":1,info:1,"ticker/{pair}":1,"trades/{pair}":1}},private:{post:{ActiveOrders:1,CancelOrder:1,GetDepositAddress:1,getInfo:1,OrderInfo:1,Trade:1,TradeHistory:1,WithdrawCoinsToAddress:1}}},fees:{trading:{maker:.002,taker:.002},funding:{withdraw:{}}},commonCurrencies:{AIR:"AirCoin",ANI:"ANICoin",ANT:"AntsCoin",ATMCHA:"ATM",ASN:"Ascension",AST:"Astral",ATM:"Autumncoin",AUR:"AuroraCoin",BAB:"Babel",BAN:"BANcoin",BCC:"BCH",BCS:"BitcoinStake",BITS:"Bitstar",BLN:"Bulleon",BNS:"Benefit Bonus Coin",BOT:"BOTcoin",BON:"BONES",BPC:"BitcoinPremium",BST:"BitStone",BTS:"Bitshares2",CAT:"BitClave",CBC:"CryptoBossCoin",CMT:"CometCoin",COIN:"Coin.com",COV:"Coven Coin",COVX:"COV",CPC:"Capricoin",CREDIT:"Creditbit",CS:"CryptoSpots",DCT:"Discount",DFT:"DraftCoin",DGD:"DarkGoldCoin",DIRT:"DIRTY",DROP:"FaucetCoin",DSH:"DASH",EGC:"EverGreenCoin",EGG:"EggCoin",EKO:"EkoCoin",ENTER:"ENTRC",EPC:"ExperienceCoin",ESC:"EdwardSnowden",EUROPE:"EUROP",EXT:"LifeExtension",FUND:"FUNDChains",FUNK:"FUNKCoin",FX:"FCoin",GCC:"GlobalCryptocurrency",GEN:"Genstake",GENE:"Genesiscoin",GMR:"Gimmer",GOLD:"GoldMint",GOT:"Giotto Coin",GSX:"GlowShares",GT:"GTcoin",HTML5:"HTML",HYPERX:"HYPER",ICN:"iCoin",INSANE:"INSN",JNT:"JointCoin",JPC:"JupiterCoin",JWL:"Jewels",KNC:"KingN Coin",LBTCX:"LiteBitcoin",LIZI:"LiZi",LOC:"LocoCoin",LOCX:"LOC",LUNYR:"LUN",LUN:"LunarCoin",LUNA:"Luna Coin",MASK:"Yobit MASK",MDT:"Midnight",MEME:"Memez Token",MIS:"MIScoin",MM:"MasterMint",NAV:"NavajoCoin",NBT:"NiceBytes",OMG:"OMGame",ONX:"Onix",PAC:"$PAC",PLAY:"PlayCoin",PIVX:"Darknet",PURE:"PurePOS",PUTIN:"PutinCoin",SPACE:"Spacecoin",STK:"StakeCoin",SUB:"Subscriptio",PAY:"EPAY",PLC:"Platin Coin",RAI:"RaiderCoin",RCN:"RCoin",REP:"Republicoin",RUR:"RUB",SBTC:"Super Bitcoin",SMC:"SmartCoin",SOLO:"SoloCoin",SOUL:"SoulCoin",STAR:"StarCoin",SUPER:"SuperCoin",TNS:"Transcodium",TTC:"TittieCoin",UNI:"Universe",UST:"Uservice",VOL:"VolumeCoin",XIN:"XINCoin",XMT:"SummitCoin",XRA:"Ratecoin",BCHN:"BSV"},options:{maxUrlLength:2048,fetchOrdersRequiresSymbol:!0,networks:{ETH:"ERC20",TRX:"TRC20",BSC:"BEP20"}},precisionMode:o.kb,exceptions:{exact:{803:r.InvalidOrder,804:r.InvalidOrder,805:r.InvalidOrder,806:r.InvalidOrder,807:r.InvalidOrder,831:r.InsufficientFunds,832:r.InsufficientFunds,833:r.OrderNotFound},broad:{"Invalid pair name":r.ExchangeError,"invalid api key":r.AuthenticationError,"invalid sign":r.AuthenticationError,"api key dont have trade permission":r.AuthenticationError,"invalid parameter":r.InvalidOrder,"invalid order":r.InvalidOrder,"The given order has already been cancelled":r.InvalidOrder,"Requests too often":r.DDoSProtection,"not available":r.ExchangeNotAvailable,"data unavailable":r.ExchangeNotAvailable,"external service unavailable":r.ExchangeNotAvailable,"Total transaction amount":r.InvalidOrder,"The given order has already been closed and cannot be cancelled":r.InvalidOrder,"Insufficient funds":r.InsufficientFunds,"invalid key":r.AuthenticationError,"invalid nonce":r.InvalidNonce,"Total order amount is less than minimal amount":r.InvalidOrder,"Rate Limited":r.RateLimitExceeded}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!1,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:1e3,daysBack:1e5,untilDays:1e5,symbolRequired:!0},fetchOrder:{marginMode:!1,trigger:!1,trailing:!1,symbolRequired:!1},fetchOpenOrders:{marginMode:!1,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!0},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},orders:{}})}parseBalance(e){const t=this.safeDict(e,"return",{}),i=this.safeInteger(t,"server_time"),s={info:e,timestamp:i,datetime:this.iso8601(i)},r=this.safeDict(t,"funds",{}),a=this.safeDict(t,"funds_incl_orders",{}),o=Object.keys(this.extend(r,a));for(let e=0;e<o.length;e++){const t=o[e],i=this.safeCurrencyCode(t),n=this.account();n.free=this.safeString(r,t),n.total=this.safeString(a,t),s[i]=n}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGetInfo(e);return this.parseBalance(t)}async fetchMarkets(e={}){const t=await this.publicGetInfo(e),i=this.safeDict(t,"pairs",{}),s=Object.keys(i),r=[];for(let e=0;e<s.length;e++){const t=s[e],o=i[t],[n,d]=t.split("_");let h=n.toUpperCase(),c=d.toUpperCase();h=this.safeCurrencyCode(h),c=this.safeCurrencyCode(c);const l=this.safeInteger(o,"hidden");let u=this.safeString(o,"fee");u=a.Y.stringDiv(u,"100"),r.push({id:t,symbol:h+"/"+c,base:h,quote:c,settle:void 0,baseId:n,quoteId:d,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:0===l,contract:!1,linear:void 0,inverse:void 0,taker:this.parseNumber(u),maker:this.parseNumber(u),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(o,"decimal_places"))),price:this.parseNumber(this.parsePrecision(this.safeString(o,"decimal_places")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(o,"min_amount"),max:this.safeNumber(o,"max_amount")},price:{min:this.safeNumber(o,"min_price"),max:this.safeNumber(o,"max_price")},cost:{min:this.safeNumber(o,"min_total"),max:void 0}},created:void 0,info:o})}return r}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),a={pair:s.id};void 0!==t&&(a.limit=t);const o=await this.publicGetDepthPair(this.extend(a,i));if(!(s.id in o))throw new r.ExchangeError(this.id+" "+s.symbol+" order book is empty or not available");const n=o[s.id];return this.parseOrderBook(n,e)}async fetchOrderBooks(e=void 0,t=void 0,i={}){let s;if(await this.loadMarkets(),void 0===e){if(s=this.ids.join("-"),s.length>2048){const e=this.ids.length;throw new r.ExchangeError(this.id+" fetchOrderBooks() has "+e.toString()+" symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchOrderBooks")}}else s=this.marketIds(e),s=s.join("-");const a={pair:s};void 0!==t&&(a.limit=t);const o=await this.publicGetDepthPair(this.extend(a,i)),n={};s=Object.keys(o);for(let e=0;e<s.length;e++){const t=s[e],i=this.safeSymbol(t);n[i]=this.parseOrderBook(o[t],i)}return n}parseTicker(e,t=void 0){const i=this.safeTimestamp(e,"updated"),s=this.safeString(e,"last");return this.safeTicker({symbol:this.safeSymbol(void 0,t),timestamp:i,datetime:this.iso8601(i),high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"buy"),bidVolume:void 0,ask:this.safeString(e,"sell"),askVolume:void 0,vwap:void 0,open:void 0,close:s,last:s,previousClose:void 0,change:void 0,percentage:void 0,average:this.safeString(e,"avg"),baseVolume:this.safeString(e,"vol_cur"),quoteVolume:this.safeString(e,"vol"),info:e},t)}async fetchTickersHelper(e,t={}){const i={pair:e},s=await this.publicGetTickerPair(this.extend(i,t)),r={},a=Object.keys(s);for(let e=0;e<a.length;e++){const t=a[e],i=s[t],o=this.safeMarket(t);r[o.symbol]=this.parseTicker(i,o)}return r}async fetchTickers(e=void 0,t={}){let i;if([i,t]=this.handleParamBool(t,"all",!1),void 0===e&&!i)throw new r.ArgumentsRequired(this.id+' fetchTickers() requires "symbols" argument or use `params["all"] = true` to send multiple requests for all markets');await this.loadMarkets();const s=[],a=this.safeInteger(this.options,"maxUrlLength",2048);if(i){e=this.symbols;let i="";for(let e=0;e<this.ids.length;e++){i+=(""===i?"":"-")+this.ids[e],i.length>a&&(s.push(this.fetchTickersHelper(i,t)),i="")}""!==i&&s.push(this.fetchTickersHelper(i,t))}else{e=this.marketSymbols(e);const i=this.marketIds(e),o=i.length,n=i.join("-"),d=n.length+40;if(d>a)throw new r.ArgumentsRequired(this.id+" fetchTickers() is being requested for "+o.toString()+" markets (which has an URL length of "+d.toString()+" characters), but it exceedes max URL length ("+a.toString()+"), please pass limisted symbols array to fetchTickers to fit in one request");s.push(this.fetchTickersHelper(n,t))}const o=await Promise.all(s);let n={};for(let t=0;t<o.length;t++){const i=this.filterByArrayTickers(o[t],"symbol",e);n=this.extend(n,i)}return n}async fetchTicker(e,t={}){return(await this.fetchTickers([e],t))[e]}parseTrade(e,t=void 0){const i=this.safeTimestamp(e,"timestamp");let s=this.safeString(e,"type");"ask"===s?s="sell":"bid"===s&&(s="buy");const r=this.safeString2(e,"rate","price"),a=this.safeString2(e,"trade_id","tid"),o=this.safeString(e,"order_id"),n=this.safeString(e,"pair"),d=this.safeSymbol(n,t),h=this.safeString(e,"amount"),c=this.parseNumber(r),l=this.parseNumber(h),u="limit";let f;const p=this.safeNumber(e,"commission");if(void 0!==p){const t=this.safeString(e,"commissionCurrency");f={cost:p,currency:this.safeCurrencyCode(t)}}if(void 0!==this.safeString(e,"is_your_order")&&void 0===f){const e=this.calculateFee(d,u,s,l,c,"taker");f={currency:this.safeString(e,"currency"),cost:this.safeString(e,"cost"),rate:this.safeString(e,"rate")}}return this.safeTrade({id:a,order:o,timestamp:i,datetime:this.iso8601(i),symbol:d,type:u,side:s,takerOrMaker:void 0,price:r,amount:h,cost:void 0,fee:f,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};void 0!==i&&(a.limit=i);const o=await this.publicGetTradesPair(this.extend(a,s));if(Array.isArray(o)){if(0===o.length)return[]}const n=this.safeList(o,r.id,[]);return this.parseTrades(n,r,t,i)}async fetchTradingFees(e={}){await this.loadMarkets();const t=await this.publicGetInfo(e),i=this.safeDict(t,"pairs",{}),s=Object.keys(i),r={};for(let e=0;e<s.length;e++){const t=s[e],o=this.safeDict(i,t,{}),n=this.safeSymbol(t,void 0,"_"),d=this.safeString(o,"fee_buyer"),h=this.safeString(o,"fee_seller"),c=this.parseNumber(a.Y.stringDiv(d,"100")),l=this.parseNumber(a.Y.stringDiv(h,"100"));r[n]={info:o,symbol:n,taker:c,maker:l,percentage:!0,tierBased:!1}}return r}async createOrder(e,t,i,s,a=void 0,o={}){if("market"===t)throw new r.ExchangeError(this.id+" createOrder() allows limit orders only");await this.loadMarkets();const n=this.market(e),d={pair:n.id,type:i,amount:this.amountToPrecision(e,s),rate:this.priceToPrecision(e,a)},h=await this.privatePostTrade(this.extend(d,o)),c=this.safeDict(h,"return");return this.parseOrder(c,n)}async cancelOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:parseInt(e)},r=await this.privatePostCancelOrder(this.extend(s,i)),a=this.safeDict(r,"return",{});return this.parseOrder(a)}parseOrderStatus(e){return this.safeString({0:"open",1:"closed",2:"canceled",3:"open"},e,e)}parseOrder(e,t=void 0){let i=this.safeString2(e,"id","order_id"),s=this.parseOrderStatus(this.safeString(e,"status","open"));"0"===i&&(i=this.safeString(e,"init_order_id"),s="closed");const r=this.safeTimestamp2(e,"timestamp_created","server_time"),a=this.safeString(e,"pair"),o=this.safeSymbol(a,t),n=this.safeString(e,"start_amount"),d=this.safeString2(e,"amount","remains"),h=this.safeString(e,"received","0.0"),c=this.safeString(e,"rate"),l=this.safeString(e,"type");return this.safeOrder({info:e,id:i,clientOrderId:void 0,symbol:o,timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,type:"limit",timeInForce:void 0,postOnly:void 0,side:l,price:c,triggerPrice:void 0,cost:void 0,amount:n,remaining:d,filled:h,status:s,fee:undefined,average:void 0,trades:void 0},t)}async fetchOrder(e,t=void 0,i={}){await this.loadMarkets();const s={order_id:parseInt(e)},r=await this.privatePostOrderInfo(this.extend(s,i));e=e.toString();const a=this.safeDict(r,"return",{});return this.parseOrder(this.extend({id:e},a[e]))}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchOpenOrders() requires a symbol argument");await this.loadMarkets();const a={};if(void 0!==e){const t=this.market(e);a.pair=t.id}const o=await this.privatePostActiveOrders(this.extend(a,s)),n=this.safeDict(o,"return",{});return this.parseOrders(n,undefined,t,i)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){if(void 0===e)throw new r.ArgumentsRequired(this.id+" fetchMyTrades() requires a symbol argument");await this.loadMarkets();const a=this.market(e),o={pair:a.id};void 0!==i&&(o.count=i),void 0!==t&&(o.since=this.parseToInt(t/1e3));const n=await this.privatePostTradeHistory(this.extend(o,s)),d=this.safeDict(n,"return",{}),h=Object.keys(d),c=[];for(let e=0;e<h.length;e++){const t=this.safeString(h,e),i=this.parseTrade(this.extend(d[t],{trade_id:t}),a);c.push(i)}return this.filterBySymbolSinceLimit(c,a.symbol,t,i)}async createDepositAddress(e,t={}){const i=await this.fetchDepositAddress(e,this.extend({need_new:1},t)),s=this.safeString(i,"address");return this.checkAddress(s),{currency:e,address:s,tag:void 0,info:i.info}}async fetchDepositAddress(e,t={}){await this.loadMarkets();let i=this.currency(e).id;const s=this.safeDict(this.options,"networks",{});let r=this.safeStringUpper(t,"network");r=this.safeString(s,r,r),void 0!==r&&("ERC20"!==r&&(i+=r.toLowerCase()),t=this.omit(t,"network"));const a={coinName:i,need_new:0},o=await this.privatePostGetDepositAddress(this.extend(a,t)),n=this.safeString(o.return,"address");return this.checkAddress(n),{info:o,currency:e,network:void 0,address:n,tag:void 0}}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o={coinName:this.currency(e).id,amount:t,address:i};if(void 0!==s)throw new r.ExchangeError(this.id+" withdraw() does not support the tag argument yet due to a lack of docs on withdrawing with tag/memo on behalf of the exchange.");return{info:await this.privatePostWithdrawCoinsToAddress(this.extend(o,a)),id:void 0,txid:void 0,type:void 0,currency:void 0,network:void 0,amount:void 0,status:void 0,timestamp:void 0,datetime:void 0,address:void 0,addressFrom:void 0,addressTo:void 0,tag:void 0,tagFrom:void 0,tagTo:void 0,updated:void 0,comment:void 0,fee:{currency:void 0,cost:void 0,rate:void 0}}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api[t];const d=this.omit(s,this.extractParams(e));if("private"===t){this.checkRequiredCredentials();const t=this.nonce();a=this.urlencode(this.extend({nonce:t,method:e},d));const i=this.hmac(this.encode(a),this.encode(this.secret),n.Zf);r={"Content-Type":"application/x-www-form-urlencoded",Key:this.apiKey,Sign:i}}else"public"===t?(o+="/"+this.version+"/"+this.implodeParams(e,s),Object.keys(d).length&&(o+="?"+this.urlencode(d))):(o+="/"+this.implodeParams(e,s),"GET"===i?Object.keys(d).length&&(o+="?"+this.urlencode(d)):Object.keys(d).length&&(a=this.json(d),r={"Content-Type":"application/json"}));return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n&&"success"in n){let e=this.safeValue(n,"success");if("string"==typeof e&&(e="true"===e||"1"===e),!e){const e=this.safeString(n,"code"),t=this.safeString(n,"error"),i=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions.exact,e,i),this.throwExactlyMatchedException(this.exceptions.exact,t,i),this.throwBroadlyMatchedException(this.exceptions.broad,t,i),new r.ExchangeError(i)}}}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"zaif",name:"Zaif",countries:["JP"],rateLimit:100,version:"1",has:{CORS:void 0,spot:!0,margin:void 0,swap:!1,future:!1,option:!1,cancelOrder:!0,createMarketOrder:!1,createOrder:!0,fetchBalance:!0,fetchClosedOrders:!0,fetchFundingHistory:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchIndexOHLCV:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchOpenInterestHistory:!1,fetchOpenOrders:!0,fetchOrderBook:!0,fetchPremiumIndexOHLCV:!1,fetchTicker:!0,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,withdraw:!0},urls:{logo:"https://user-images.githubusercontent.com/1294454/27766927-39ca2ada-5eeb-11e7-972f-1b4199518ca6.jpg",api:{rest:"https://api.zaif.jp"},www:"https://zaif.jp",doc:["https://techbureau-api-document.readthedocs.io/ja/latest/index.html","https://corp.zaif.jp/api-docs","https://corp.zaif.jp/api-docs/api_links","https://www.npmjs.com/package/zaif.jp","https://github.com/you21979/node-zaif"],fees:"https://zaif.jp/fee?lang=en"},fees:{trading:{percentage:!0,taker:this.parseNumber("0.001"),maker:this.parseNumber("0")}},api:{public:{get:{"depth/{pair}":1,"currencies/{pair}":1,"currencies/all":1,"currency_pairs/{pair}":1,"currency_pairs/all":1,"last_price/{pair}":1,"ticker/{pair}":1,"trades/{pair}":1}},private:{post:{active_orders:5,cancel_order:5,deposit_history:5,get_id_info:5,get_info:10,get_info2:5,get_personal_info:5,trade:5,trade_history:50,withdraw:5,withdraw_history:5}},ecapi:{post:{createInvoice:1,getInvoice:1,getInvoiceIdsByOrderNumber:1,cancelInvoice:1}},tlapi:{post:{get_positions:66,position_history:66,active_positions:5,create_position:33,change_position:33,cancel_position:33}},fapi:{get:{"groups/{group_id}":1,"last_price/{group_id}/{pair}":1,"ticker/{group_id}/{pair}":1,"trades/{group_id}/{pair}":1,"depth/{group_id}/{pair}":1}}},options:{},features:{spot:{sandbox:!1,createOrder:{marginMode:!0,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!1,FOK:!1,PO:!1,GTD:!1},hedged:!1,trailing:!1,leverage:!0,marketBuyByCost:!1,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:void 0,fetchOrder:void 0,fetchOpenOrders:{marginMode:!0,limit:void 0,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:{marginMode:!0,limit:1e3,daysBack:1e5,daysBackCanceled:1,untilDays:1e5,trigger:!1,trailing:!1,symbolRequired:!1},fetchOHLCV:void 0},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:o.kb,exceptions:{exact:{"unsupported currency_pair":r.BadRequest},broad:{}}})}async fetchMarkets(e={}){const t=await this.publicGetCurrencyPairsAll(e);return this.parseMarkets(t)}parseMarket(e){const t=this.safeString(e,"currency_pair"),i=this.safeString(e,"name"),[s,r]=i.split("/"),a=this.safeCurrencyCode(s),o=this.safeCurrencyCode(r);return{id:t,symbol:a+"/"+o,base:a,quote:o,settle:void 0,baseId:s,quoteId:r,settleId:void 0,type:"spot",spot:!0,margin:void 0,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,contractSize:void 0,expiry:void 0,expiryDatetime:void 0,strike:void 0,optionType:void 0,precision:{amount:this.safeNumber(e,"item_unit_step"),price:this.parseNumber(this.parsePrecision(this.safeString(e,"aux_unit_point")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(e,"item_unit_min"),max:void 0},price:{min:this.safeNumber(e,"aux_unit_min"),max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}parseBalance(e){const t=this.safeValue(e,"return",{}),i=this.safeValue(t,"deposit"),s={info:e,timestamp:void 0,datetime:void 0},r=this.safeValue(t,"funds",{}),a=Object.keys(r);for(let e=0;e<a.length;e++){const t=a[e],o=this.safeCurrencyCode(t),n=this.safeString(r,t),d=this.account();d.free=n,d.total=n,void 0!==i&&t in i&&(d.total=this.safeString(i,t)),s[o]=d}return this.safeBalance(s)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.privatePostGetInfo(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={pair:s.id},a=await this.publicGetDepthPair(this.extend(r,i));return this.parseOrderBook(a,s.symbol)}parseTicker(e,t=void 0){const i=this.safeSymbol(void 0,t),s=this.safeString(e,"vwap"),r=this.safeString(e,"volume"),o=a.Y.stringMul(r,s),n=this.safeString(e,"last");return this.safeTicker({symbol:i,timestamp:void 0,datetime:void 0,high:this.safeString(e,"high"),low:this.safeString(e,"low"),bid:this.safeString(e,"bid"),bidVolume:void 0,ask:this.safeString(e,"ask"),askVolume:void 0,vwap:s,open:void 0,close:n,last:n,previousClose:void 0,change:void 0,percentage:void 0,average:void 0,baseVolume:r,quoteVolume:o,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={pair:i.id},r=await this.publicGetTickerPair(this.extend(s,t));return this.parseTicker(r,i)}parseTrade(e,t=void 0){let i=this.safeString(e,"trade_type");i="bid"===i?"buy":"sell";const s=this.safeTimestamp(e,"date"),r=this.safeString2(e,"id","tid"),a=this.safeString(e,"price"),o=this.safeString(e,"amount"),n=this.safeString(e,"currency_pair"),d=this.safeSymbol(n,t,"_");return this.safeTrade({id:r,info:e,timestamp:s,datetime:this.iso8601(s),symbol:d,type:void 0,side:i,order:void 0,takerOrMaker:void 0,price:a,amount:o,cost:void 0,fee:void 0},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={pair:r.id};let o=await this.publicGetTradesPair(this.extend(a,s));if(1===o.length){const e=o[0];Object.keys(e).length||(o=[])}return this.parseTrades(o,r,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){if(await this.loadMarkets(),"limit"!==t)throw new r.ExchangeError(this.id+" createOrder() allows limit orders only");const n=this.market(e),d={currency_pair:n.id,action:"buy"===i?"bid":"ask",amount:s,price:a},h=await this.privatePostTrade(this.extend(d,o));return this.safeOrder({info:h,id:h.return.order_id.toString()},n)}async cancelOrder(e,t=void 0,i={}){const s={order_id:e},r=await this.privatePostCancelOrder(this.extend(s,i)),a=this.safeDict(r,"return");return this.parseOrder(a)}parseOrder(e,t=void 0){let i=this.safeString(e,"action");i="bid"===i?"buy":"sell";const s=this.safeTimestamp(e,"timestamp"),r=this.safeString(e,"currency_pair"),a=this.safeSymbol(r,t,"_"),o=this.safeString(e,"price"),n=this.safeString(e,"amount"),d=this.safeString2(e,"id","order_id");return this.safeOrder({id:d,clientOrderId:void 0,timestamp:s,datetime:this.iso8601(s),lastTradeTimestamp:void 0,status:"open",symbol:a,type:"limit",timeInForce:void 0,postOnly:void 0,side:i,price:o,triggerPrice:void 0,cost:void 0,amount:n,filled:void 0,remaining:void 0,trades:void 0,fee:void 0,info:e,average:void 0},t)}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.currency_pair=r.id);const o=await this.privatePostActiveOrders(this.extend(a,s));return this.parseOrders(o.return,r,t,i)}async fetchClosedOrders(e=void 0,t=void 0,i=void 0,s={}){let r;await this.loadMarkets();const a={};void 0!==e&&(r=this.market(e),a.currency_pair=r.id);const o=await this.privatePostTradeHistory(this.extend(a,s));return this.parseOrders(o.return,r,t,i)}async withdraw(e,t,i,s=void 0,a={}){[s,a]=this.handleWithdrawTagAndParams(s,a),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e);if("JPY"===e)throw new r.ExchangeError(this.id+" withdraw() does not allow "+e+" withdrawals");const n={currency:o.id,amount:t,address:i};void 0!==s&&(n.message=s);const d=await this.privatePostWithdraw(this.extend(n,a)),h=this.safeDict(d,"return");return this.parseTransaction(h,o)}parseTransaction(e,t=void 0){let i;t=this.safeCurrency(void 0,t);const s=this.safeValue(e,"fee");return void 0!==s&&(i={cost:s,currency:t.code}),{id:this.safeString(e,"id"),txid:this.safeString(e,"txid"),timestamp:void 0,datetime:void 0,network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,amount:void 0,type:void 0,currency:t.code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:i,info:e}}customNonce(){const e=this.numberToString(this.milliseconds()/1e3);return parseFloat(e).toFixed(8)}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.urls.api.rest+"/";if("public"===t)o+="api/"+this.version+"/"+this.implodeParams(e,s);else if("fapi"===t)o+="fapi/"+this.version+"/"+this.implodeParams(e,s);else{this.checkRequiredCredentials(),o+="ecapi"===t?"ecapi":"tlapi"===t?"tlapi":"tapi";const i=this.customNonce();a=this.urlencode(this.extend({method:e,nonce:i},s)),r={"Content-Type":"application/x-www-form-urlencoded",Key:this.apiKey,Sign:this.hmac(this.encode(a),this.encode(this.secret),n.Zf)}}return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0===n)return;const c=this.id+" "+o,l=this.safeString(n,"error");if(void 0!==l)throw this.throwExactlyMatchedException(this.exceptions.exact,l,c),this.throwBroadlyMatchedException(this.exceptions.broad,l,c),new r.ExchangeError(c);if(!this.safeBool(n,"success",!0))throw new r.ExchangeError(c)}}
class d extends s.A{describe(){return this.deepExtend(super.describe(),{id:"zonda",name:"Zonda",countries:["EE"],rateLimit:1e3,has:{CORS:!0,spot:!0,margin:!1,swap:!1,future:!1,option:!1,addMargin:!1,cancelAllOrders:!1,cancelOrder:!0,cancelOrders:!1,closeAllPositions:!1,closePosition:!1,createDepositAddress:!1,createOrder:!0,createReduceOnlyOrder:!1,fetchBalance:!0,fetchBorrowInterest:!1,fetchBorrowRate:!1,fetchBorrowRateHistories:!1,fetchBorrowRateHistory:!1,fetchBorrowRates:!1,fetchBorrowRatesPerSymbol:!1,fetchCrossBorrowRate:!1,fetchCrossBorrowRates:!1,fetchDeposit:!1,fetchDepositAddress:!0,fetchDepositAddresses:!0,fetchDepositAddressesByNetwork:!1,fetchDeposits:void 0,fetchFundingHistory:!1,fetchFundingInterval:!1,fetchFundingIntervals:!1,fetchFundingRate:!1,fetchFundingRateHistory:!1,fetchFundingRates:!1,fetchGreeks:!1,fetchIndexOHLCV:!1,fetchIsolatedBorrowRate:!1,fetchIsolatedBorrowRates:!1,fetchIsolatedPositions:!1,fetchLedger:!0,fetchLeverage:!1,fetchLeverages:!1,fetchLeverageTiers:!1,fetchLiquidations:!1,fetchMarginAdjustmentHistory:!1,fetchMarginMode:!1,fetchMarginModes:!1,fetchMarketLeverageTiers:!1,fetchMarkets:!0,fetchMarkOHLCV:!1,fetchMarkPrices:!1,fetchMyLiquidations:!1,fetchMySettlementHistory:!1,fetchMyTrades:!0,fetchOHLCV:!0,fetchOpenInterest:!1,fetchOpenInterestHistory:!1,fetchOpenOrder:!1,fetchOpenOrders:!0,fetchOption:!1,fetchOptionChain:!1,fetchOrderBook:!0,fetchOrderBooks:!1,fetchPosition:!1,fetchPositionMode:!1,fetchPositions:!1,fetchPositionsRisk:!1,fetchPremiumIndexOHLCV:!1,fetchSettlementHistory:!1,fetchTicker:!0,fetchTickers:!0,fetchTime:!1,fetchTrades:!0,fetchTradingFee:!1,fetchTradingFees:!1,fetchTransactionFee:!1,fetchTransactionFees:!1,fetchTransactions:void 0,fetchTransfer:!1,fetchUnderlyingAssets:!1,fetchVolatilityHistory:!1,fetchWithdrawal:!1,fetchWithdrawals:void 0,reduceMargin:!1,repayCrossMargin:!1,repayIsolatedMargin:!1,setLeverage:!1,setMargin:!1,setMarginMode:!1,setPositionMode:!1,transfer:!0,withdraw:!0},timeframes:{"1m":"60","3m":"180","5m":"300","15m":"900","30m":"1800","1h":"3600","2h":"7200","4h":"14400","6h":"21600","12h":"43200","1d":"86400","3d":"259200","1w":"604800"},hostname:"zondacrypto.exchange",urls:{referral:"https://auth.zondaglobal.com/ref/jHlbB4mIkdS1",logo:"https://user-images.githubusercontent.com/1294454/159202310-a0e38007-5e7c-4ba9-a32f-c8263a0291fe.jpg",www:"https://zondaglobal.com",api:{public:"https://{hostname}/API/Public",private:"https://{hostname}/API/Trading/tradingApi.php",v1_01Public:"https://api.{hostname}/rest",v1_01Private:"https://api.{hostname}/rest"},doc:["https://docs.zondacrypto.exchange/","https://github.com/BitBayNet/API"],support:"https://zondaglobal.com/en/helpdesk/zonda-exchange",fees:"https://zondaglobal.com/legal/zonda-exchange/fees"},api:{public:{get:["{id}/all","{id}/market","{id}/orderbook","{id}/ticker","{id}/trades"]},private:{post:["info","trade","cancel","orderbook","orders","transfer","withdraw","history","transactions"]},v1_01Public:{get:["trading/ticker","trading/ticker/{symbol}","trading/stats","trading/stats/{symbol}","trading/orderbook/{symbol}","trading/transactions/{symbol}","trading/candle/history/{symbol}/{resolution}"]},v1_01Private:{get:["api_payments/deposits/crypto/addresses","payments/withdrawal/{detailId}","payments/deposit/{detailId}","trading/offer","trading/stop/offer","trading/config/{symbol}","trading/history/transactions","balances/BITBAY/history","balances/BITBAY/balance","fiat_cantor/rate/{baseId}/{quoteId}","fiat_cantor/history","client_payments/v2/customer/crypto/{currency}/channels/deposit","client_payments/v2/customer/crypto/{currency}/channels/withdrawal","client_payments/v2/customer/crypto/deposit/fee","client_payments/v2/customer/crypto/withdrawal/fee"],post:["trading/offer/{symbol}","trading/stop/offer/{symbol}","trading/config/{symbol}","balances/BITBAY/balance","balances/BITBAY/balance/transfer/{source}/{destination}","fiat_cantor/exchange","api_payments/withdrawals/crypto","api_payments/withdrawals/fiat","client_payments/v2/customer/crypto/deposit","client_payments/v2/customer/crypto/withdrawal"],delete:["trading/offer/{symbol}/{id}/{side}/{price}","trading/stop/offer/{symbol}/{id}/{side}/{price}"],put:["balances/BITBAY/balance/{id}"]}},fees:{trading:{maker:this.parseNumber("0.0"),taker:this.parseNumber("0.001"),percentage:!0,tierBased:!1},fiat:{maker:this.parseNumber("0.0030"),taker:this.parseNumber("0.0043"),percentage:!0,tierBased:!0,tiers:{taker:[[this.parseNumber("0.0043"),this.parseNumber("0")],[this.parseNumber("0.0042"),this.parseNumber("1250")],[this.parseNumber("0.0041"),this.parseNumber("3750")],[this.parseNumber("0.0040"),this.parseNumber("7500")],[this.parseNumber("0.0039"),this.parseNumber("10000")],[this.parseNumber("0.0038"),this.parseNumber("15000")],[this.parseNumber("0.0037"),this.parseNumber("20000")],[this.parseNumber("0.0036"),this.parseNumber("25000")],[this.parseNumber("0.0035"),this.parseNumber("37500")],[this.parseNumber("0.0034"),this.parseNumber("50000")],[this.parseNumber("0.0033"),this.parseNumber("75000")],[this.parseNumber("0.0032"),this.parseNumber("100000")],[this.parseNumber("0.0031"),this.parseNumber("150000")],[this.parseNumber("0.0030"),this.parseNumber("200000")],[this.parseNumber("0.0029"),this.parseNumber("250000")],[this.parseNumber("0.0028"),this.parseNumber("375000")],[this.parseNumber("0.0027"),this.parseNumber("500000")],[this.parseNumber("0.0026"),this.parseNumber("625000")],[this.parseNumber("0.0025"),this.parseNumber("875000")]],maker:[[this.parseNumber("0.0030"),this.parseNumber("0")],[this.parseNumber("0.0029"),this.parseNumber("1250")],[this.parseNumber("0.0028"),this.parseNumber("3750")],[this.parseNumber("0.0028"),this.parseNumber("7500")],[this.parseNumber("0.0027"),this.parseNumber("10000")],[this.parseNumber("0.0026"),this.parseNumber("15000")],[this.parseNumber("0.0025"),this.parseNumber("20000")],[this.parseNumber("0.0025"),this.parseNumber("25000")],[this.parseNumber("0.0024"),this.parseNumber("37500")],[this.parseNumber("0.0023"),this.parseNumber("50000")],[this.parseNumber("0.0023"),this.parseNumber("75000")],[this.parseNumber("0.0022"),this.parseNumber("100000")],[this.parseNumber("0.0021"),this.parseNumber("150000")],[this.parseNumber("0.0021"),this.parseNumber("200000")],[this.parseNumber("0.0020"),this.parseNumber("250000")],[this.parseNumber("0.0019"),this.parseNumber("375000")],[this.parseNumber("0.0018"),this.parseNumber("500000")],[this.parseNumber("0.0018"),this.parseNumber("625000")],[this.parseNumber("0.0017"),this.parseNumber("875000")]]}},funding:{withdraw:{}}},options:{fetchTickerMethod:"v1_01PublicGetTradingTickerSymbol",fetchTickersMethod:"v1_01PublicGetTradingTicker",fiatCurrencies:["EUR","USD","GBP","PLN"],transfer:{fillResponseFromRequest:!0}},features:{spot:{sandbox:!1,createOrder:{marginMode:!1,triggerPrice:!0,triggerDirection:!1,triggerPriceType:void 0,stopLossPrice:!1,takeProfitPrice:!1,attachedStopLossTakeProfit:void 0,timeInForce:{IOC:!0,FOK:!0,PO:!0,GTD:!1},hedged:!1,trailing:!1,leverage:!1,marketBuyByCost:!0,marketBuyRequiresPrice:!1,selfTradePrevention:!1,iceberg:!1},createOrders:void 0,fetchMyTrades:{marginMode:!1,limit:void 0,daysBack:1e5,untilDays:1e5,symbolRequired:!1},fetchOrder:void 0,fetchOpenOrders:{marginMode:!1,limit:100,trigger:!1,trailing:!1,symbolRequired:!1},fetchOrders:void 0,fetchClosedOrders:void 0,fetchOHLCV:{limit:void 0}},swap:{linear:void 0,inverse:void 0},future:{linear:void 0,inverse:void 0}},precisionMode:a.kb,exceptions:{400:r.ExchangeError,401:r.InvalidOrder,402:r.InvalidOrder,403:r.InvalidOrder,404:r.InvalidOrder,405:r.InvalidOrder,406:r.InsufficientFunds,408:r.InvalidOrder,501:r.AuthenticationError,502:r.AuthenticationError,503:r.InvalidNonce,504:r.ExchangeError,505:r.AuthenticationError,506:r.AccountSuspended,509:r.ExchangeError,510:r.BadSymbol,FUNDS_NOT_SUFFICIENT:r.InsufficientFunds,OFFER_FUNDS_NOT_EXCEEDING_MINIMUMS:r.InvalidOrder,OFFER_NOT_FOUND:r.OrderNotFound,OFFER_WOULD_HAVE_BEEN_PARTIALLY_FILLED:r.OrderImmediatelyFillable,ACTION_LIMIT_EXCEEDED:r.RateLimitExceeded,UNDER_MAINTENANCE:r.OnMaintenance,REQUEST_TIMESTAMP_TOO_OLD:r.InvalidNonce,PERMISSIONS_NOT_SUFFICIENT:r.PermissionDenied,INVALID_STOP_RATE:r.InvalidOrder,TIMEOUT:r.ExchangeError,RESPONSE_TIMEOUT:r.ExchangeError,ACTION_BLOCKED:r.PermissionDenied,INVALID_HASH_SIGNATURE:r.AuthenticationError},commonCurrencies:{GGC:"Global Game Coin"}})}async fetchMarkets(e={}){const t=await this.v1_01PublicGetTradingTicker(e),i=this.safeValue(t,"items",{}),s=Object.values(i);return this.parseMarkets(s)}parseMarket(e){const t=this.safeValue(e,"market",{}),i=this.safeString(t,"code"),s=this.safeValue(t,"first",{}),r=this.safeValue(t,"second",{}),a=this.safeString(s,"currency"),o=this.safeString(r,"currency"),n=this.safeCurrencyCode(a),d=this.safeCurrencyCode(o);let h=this.safeValue(this.fees,"trading",{});const c=this.safeValue(this.options,"fiatCurrencies",[]);return(this.inArray(n,c)||this.inArray(d,c))&&(h=this.safeValue(this.fees,"fiat",{})),{id:i,symbol:n+"/"+d,base:n,quote:d,settle:void 0,baseId:a,quoteId:o,settleId:void 0,type:"spot",spot:!0,margin:!1,swap:!1,future:!1,option:!1,active:void 0,contract:!1,linear:void 0,inverse:void 0,taker:this.safeNumber(h,"taker"),maker:this.safeNumber(h,"maker"),contractSize:void 0,expiry:void 0,expiryDatetime:void 0,optionType:void 0,strike:void 0,precision:{amount:this.parseNumber(this.parsePrecision(this.safeString(s,"scale"))),price:this.parseNumber(this.parsePrecision(this.safeString(r,"scale")))},limits:{leverage:{min:void 0,max:void 0},amount:{min:this.safeNumber(s,"minOffer"),max:void 0},price:{min:void 0,max:void 0},cost:{min:void 0,max:void 0}},created:void 0,info:e}}async fetchOpenOrders(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=await this.v1_01PrivateGetTradingOffer(this.extend({},s)),a=this.safeList(r,"items",[]);return this.parseOrders(a,void 0,t,i,{status:"open"})}parseOrder(e,t=void 0){const i=this.safeString(e,"market"),s=this.safeSymbol(i,t,"-"),r=this.safeInteger(e,"time"),a=this.safeString(e,"startAmount"),o=this.safeString(e,"currentAmount"),n=this.safeValue(e,"postOnly");return this.safeOrder({id:this.safeString(e,"id"),clientOrderId:void 0,info:e,timestamp:r,datetime:this.iso8601(r),lastTradeTimestamp:void 0,status:void 0,symbol:s,type:this.safeString(e,"mode"),timeInForce:void 0,postOnly:n,side:this.safeStringLower(e,"offerType"),price:this.safeString(e,"rate"),triggerPrice:void 0,amount:a,cost:void 0,filled:void 0,remaining:o,average:void 0,fee:void 0,trades:void 0},t)}async fetchMyTrades(e=void 0,t=void 0,i=void 0,s={}){await this.loadMarkets();const r={};if(e){const t=[this.marketId(e)];e=this.symbol(e),r.markets=t}const a={query:this.json(this.extend(r,s))},o=await this.v1_01PrivateGetTradingHistoryTransactions(a),n=this.safeValue(o,"items"),d=this.parseTrades(n,void 0,t,i);return void 0===e?d:this.filterBySymbol(d,e)}parseBalance(e){const t=this.safeValue(e,"balances");if(void 0===t)throw new r.ExchangeError(this.id+" empty balance response "+this.json(e));const i={info:e};for(let e=0;e<t.length;e++){const s=t[e],r=this.safeString(s,"currency"),a=this.safeCurrencyCode(r),o=this.account();o.used=this.safeString(s,"lockedFunds"),o.free=this.safeString(s,"availableFunds"),i[a]=o}return this.safeBalance(i)}async fetchBalance(e={}){await this.loadMarkets();const t=await this.v1_01PrivateGetBalancesBITBAYBalance(e);return this.parseBalance(t)}async fetchOrderBook(e,t=void 0,i={}){await this.loadMarkets();const s=this.market(e),r={symbol:s.id},a=await this.v1_01PublicGetTradingOrderbookSymbol(this.extend(r,i)),o=this.safeValue(a,"buy",[]),n=this.safeValue(a,"sell",[]),d=this.safeInteger(a,"timestamp");return{symbol:s.symbol,bids:this.parseBidsAsks(o,"ra","ca"),asks:this.parseBidsAsks(n,"ra","ca"),timestamp:d,datetime:this.iso8601(d),nonce:this.safeInteger(a,"seqNo")}}parseTicker(e,t=void 0){const i=this.safeValue(e,"market"),s=this.safeString2(i,"code","m");t=this.safeMarket(s,t);const r=this.safeInteger(e,"time"),a=this.safeValue(e,"rate");return this.safeTicker({symbol:this.safeSymbol(s,t),timestamp:r,datetime:this.iso8601(r),high:this.safeString(e,"h"),low:this.safeString(e,"l"),bid:this.safeNumber(e,"highestBid"),bidVolume:void 0,ask:this.safeNumber(e,"lowestAsk"),askVolume:void 0,vwap:void 0,open:this.safeString(e,"r24h"),close:a,last:a,previousClose:this.safeValue(e,"previousRate"),change:void 0,percentage:void 0,average:void 0,baseVolume:this.safeString(e,"v"),quoteVolume:void 0,info:e},t)}async fetchTicker(e,t={}){await this.loadMarkets();const i=this.market(e),s={symbol:i.id},a="v1_01PublicGetTradingTickerSymbol",o=this.safeString(this.options,"fetchTickerMethod",a),n=this.safeString2(t,"method","fetchTickerMethod",o);let d;if(n===a)d=await this.v1_01PublicGetTradingTickerSymbol(this.extend(s,t));else{if("v1_01PublicGetTradingStatsSymbol"!==n)throw new r.BadRequest(this.id+' fetchTicker params["method"] must be "v1_01PublicGetTradingTickerSymbol" or "v1_01PublicGetTradingStatsSymbol"');d=await this.v1_01PublicGetTradingStatsSymbol(this.extend(s,t))}const h=this.safeValue2(d,"ticker","stats");return this.parseTicker(h,i)}async fetchTickers(e=void 0,t={}){await this.loadMarkets();const i="v1_01PublicGetTradingTicker",s=this.safeString(this.options,"fetchTickersMethod",i),a=this.safeString2(t,"method","fetchTickersMethod",s);let o;if(a===i)o=await this.v1_01PublicGetTradingTicker(t);else{if("v1_01PublicGetTradingStats"!==a)throw new r.BadRequest(this.id+' fetchTickers params["method"] must be "v1_01PublicGetTradingTicker" or "v1_01PublicGetTradingStats"');o=await this.v1_01PublicGetTradingStats(t)}const n=this.safeDict(o,"items");return this.parseTickers(n,e)}async fetchLedger(e=void 0,t=void 0,i=void 0,s={}){const r=[];if(void 0!==e){const t=this.currency(e);r.push(t.id)}let a={balanceCurrencies:r};void 0!==t&&(a.fromTime=t),void 0!==i&&(a.limit=i),a=this.extend(a,s);const o=(await this.v1_01PrivateGetBalancesBITBAYHistory({query:this.json(a)})).items;return this.parseLedger(o,void 0,t,i)}parseLedgerEntry(e,t=void 0){const i=this.safeInteger(e,"time"),s=this.safeValue(e,"balance",{}),r=this.safeString(s,"currency");t=this.safeCurrency(r,t);const a=this.safeValue(e,"change",{});let n=this.safeString(a,"total"),d="in";o.Y.stringLt(n,"0")&&(d="out",n=o.Y.stringNeg(n));const h=this.safeValue(e,"fundsBefore",{}),c=this.safeValue(e,"fundsAfter",{});return this.safeLedgerEntry({info:e,id:this.safeString(e,"historyId"),direction:d,account:void 0,referenceId:this.safeString(e,"detailId"),referenceAccount:void 0,type:this.parseLedgerEntryType(this.safeString(e,"type")),currency:this.safeCurrencyCode(r),amount:this.parseNumber(n),before:this.safeNumber(h,"total"),after:this.safeNumber(c,"total"),status:"ok",timestamp:i,datetime:this.iso8601(i),fee:void 0},t)}parseLedgerEntryType(e){return this.safeString({ADD_FUNDS:"transaction",BITCOIN_GOLD_FORK:"transaction",CREATE_BALANCE:"transaction",FUNDS_MIGRATION:"transaction",WITHDRAWAL_LOCK_FUNDS:"transaction",WITHDRAWAL_SUBTRACT_FUNDS:"transaction",WITHDRAWAL_UNLOCK_FUNDS:"transaction",TRANSACTION_COMMISSION_OUTCOME:"fee",TRANSACTION_COMMISSION_RETURN:"fee",TRANSACTION_OFFER_ABORTED_RETURN:"trade",TRANSACTION_OFFER_COMPLETED_RETURN:"trade",TRANSACTION_POST_INCOME:"trade",TRANSACTION_POST_OUTCOME:"trade",TRANSACTION_PRE_LOCKING:"trade"},e,e)}parseOHLCV(e,t=void 0){const i=this.safeValue(e,1,{});return[this.safeInteger(e,0),this.safeNumber(i,"o"),this.safeNumber(i,"h"),this.safeNumber(i,"l"),this.safeNumber(i,"c"),this.safeNumber(i,"v")]}async fetchOHLCV(e,t="1m",i=void 0,s=void 0,r={}){await this.loadMarkets();const a=this.market(e),o={symbol:a.baseId+"-"+a.quoteId,resolution:this.safeString(this.timeframes,t,t)},n=(s=void 0===s?100:Math.min(s,11e3))*this.parseTimeframe(t)*1e3;void 0===i?(o.to=this.milliseconds(),o.from=o.to-n):(o.from=i,o.to=this.sum(o.from,n));const d=await this.v1_01PublicGetTradingCandleHistorySymbolResolution(this.extend(o,r)),h=this.safeList(d,"items",[]);return this.parseOHLCVs(h,a,t,i,s)}parseTrade(e,t=void 0){const i=this.safeInteger2(e,"time","t"),s=this.safeStringLower2(e,"userAction","ty"),r=this.safeValue(e,"wasTaker");let a;void 0!==r&&(a=r?"taker":"maker");const o=this.safeString2(e,"rate","r"),n=this.safeString2(e,"amount","a"),d=this.safeString(e,"commissionValue"),h=this.safeString(e,"market"),c=(t=this.safeMarket(h,t,"-")).symbol;let l;if(void 0!==d){l={currency:"buy"===s?t.base:t.quote,cost:d}}const u=this.safeString(e,"offerId");let f;return void 0!==u&&(f=u?"limit":"market"),this.safeTrade({id:this.safeString(e,"id"),order:u,timestamp:i,datetime:this.iso8601(i),symbol:c,type:f,side:s,price:o,amount:n,cost:void 0,takerOrMaker:a,fee:l,info:e},t)}async fetchTrades(e,t=void 0,i=void 0,s={}){await this.loadMarkets();const r=this.market(e),a={symbol:r.baseId+"-"+r.quoteId};void 0!==t&&(a.fromTime=t-1),void 0!==i&&(a.limit=i);const o=await this.v1_01PublicGetTradingTransactionsSymbol(this.extend(a,s)),n=this.safeList(o,"items");return this.parseTrades(n,r,t,i)}async createOrder(e,t,i,s,a=void 0,o={}){await this.loadMarkets();const n=this.market(e),d=n.baseId+"-"+n.quoteId;s=parseFloat(this.amountToPrecision(e,s));const h={symbol:d,offerType:i.toUpperCase(),amount:s},c=this.safeValue2(o,"stopPrice","stopLossPrice"),l=void 0!==c,u="limit"===t,f="market"===t,p="stop-limit"===t||u&&l,m="stop-market"===t||f&&l,g=p||m;if(u||p)h.rate=this.priceToPrecision(e,a),h.mode=p?"stop-limit":"limit";else{if(!f&&!m)throw new r.ExchangeError(this.id+" createOrder() invalid type");h.mode=m?"stop-market":"market"}let v;if(o=this.omit(o,["stopPrice","stopLossPrice"]),g){if(!l)throw new r.ExchangeError(this.id+" createOrder() zonda requires `triggerPrice` parameter for stop-limit or stop-market orders");h.stopRate=this.priceToPrecision(e,c),v=await this.v1_01PrivatePostTradingStopOfferSymbol(this.extend(h,o))}else v=await this.v1_01PrivatePostTradingOfferSymbol(this.extend(h,o));const y=this.safeString2(v,"offerId","stopOfferId"),w=this.safeBool(v,"completed",!1)?"closed":"open",b=this.safeValue(v,"transactions");return this.safeOrder({id:y,info:v,timestamp:void 0,datetime:void 0,lastTradeTimestamp:void 0,status:w,symbol:e,type:t,side:i,price:a,amount:s,cost:void 0,filled:void 0,remaining:void 0,average:void 0,fee:void 0,trades:b,clientOrderId:void 0})}async cancelOrder(e,t=void 0,i={}){const s=this.safeString(i,"side");if(void 0===s)throw new r.ExchangeError(this.id+' cancelOrder() requires a `side` parameter ("buy" or "sell")');const a=this.safeValue(i,"price");if(void 0===a)throw new r.ExchangeError(this.id+" cancelOrder() requires a `price` parameter (float or string)");await this.loadMarkets();const o=this.market(t),n={symbol:o.baseId+"-"+o.quoteId,id:e,side:s,price:a},d=await this.v1_01PrivateDeleteTradingOfferSymbolIdSidePrice(this.extend(n,i));return this.parseOrder(d)}isFiat(e){return this.safeBool({USD:!0,EUR:!0,PLN:!0},e,!1)}parseDepositAddress(e,t=void 0){const i=this.safeString(e,"currency"),s=this.safeString(e,"address");return this.checkAddress(s),{info:e,currency:this.safeCurrencyCode(i,t),network:void 0,address:s,tag:this.safeString(e,"tag")}}async fetchDepositAddress(e,t={}){await this.loadMarkets();const i=this.currency(e),s={currency:i.id},r=await this.v1_01PrivateGetApiPaymentsDepositsCryptoAddresses(this.extend(s,t)),a=this.safeValue(r,"data"),o=this.safeDict(a,0);return this.parseDepositAddress(o,i)}async fetchDepositAddresses(e=void 0,t={}){await this.loadMarkets();const i=await this.v1_01PrivateGetApiPaymentsDepositsCryptoAddresses(t),s=this.safeList(i,"data");return this.parseDepositAddresses(s,e)}async transfer(e,t,i,s,r={}){await this.loadMarkets();const a=this.currency(e),o={source:i,destination:s,currency:e,funds:this.currencyToPrecision(e,t)},n=await this.v1_01PrivatePostBalancesBITBAYBalanceTransferSourceDestination(this.extend(o,r)),d=this.parseTransfer(n,a),h=this.safeValue(this.options,"transfer",{});return this.safeBool(h,"fillResponseFromRequest",!0)&&(d.amount=t),d}parseTransfer(e,t=void 0){const i=this.safeString(e,"status"),s=this.safeValue(e,"from",{}),r=this.safeString(s,"id"),a=this.safeValue(e,"to",{}),o=this.safeString(a,"id"),n=this.safeString(s,"currency");return{info:e,id:void 0,timestamp:void 0,datetime:void 0,currency:this.safeCurrencyCode(n,t),amount:void 0,fromAccount:r,toAccount:o,status:this.parseTransferStatus(i)}}parseTransferStatus(e){return this.safeString({Ok:"ok",Fail:"failed"},e,e)}async withdraw(e,t,i,s=void 0,r={}){let a;[s,r]=this.handleWithdrawTagAndParams(s,r),this.checkAddress(i),await this.loadMarkets();const o=this.currency(e),n={currency:o.id,amount:t,address:i};this.isFiat(e)?a=await this.v1_01PrivatePostApiPaymentsWithdrawalsFiat(this.extend(n,r)):(void 0!==s&&(n.tag=s),a=await this.v1_01PrivatePostApiPaymentsWithdrawalsCrypto(this.extend(n,r)));const d=this.safeDict(a,"data");return this.parseTransaction(d,o)}parseTransaction(e,t=void 0){return t=this.safeCurrency(void 0,t),{id:this.safeString(e,"id"),txid:void 0,timestamp:void 0,datetime:void 0,network:void 0,addressFrom:void 0,address:void 0,addressTo:void 0,amount:void 0,type:void 0,currency:t.code,status:void 0,updated:void 0,tagFrom:void 0,tag:void 0,tagTo:void 0,comment:void 0,internal:void 0,fee:void 0,info:e}}sign(e,t="public",i="GET",s={},r=void 0,a=void 0){let o=this.implodeHostname(this.urls.api[t]);if("public"===t){const t=this.omit(s,this.extractParams(e));o+="/"+this.implodeParams(e,s)+".json",Object.keys(t).length&&(o+="?"+this.urlencode(t))}else if("v1_01Public"===t){const t=this.omit(s,this.extractParams(e));o+="/"+this.implodeParams(e,s),Object.keys(t).length&&(o+="?"+this.urlencode(t))}else if("v1_01Private"===t){this.checkRequiredCredentials();const t=this.omit(s,this.extractParams(e));o+="/"+this.implodeParams(e,s);const d=this.milliseconds().toString();let h;"POST"!==i?(Object.keys(t).length&&(o+="?"+this.urlencode(t)),h=this.apiKey+d):void 0===a&&(a=this.json(t),h=this.apiKey+d+a),r={"Request-Timestamp":d,"Operation-Id":this.uuid(),"API-Key":this.apiKey,"API-Hash":this.hmac(this.encode(h),this.encode(this.secret),n.Zf),"Content-Type":"application/json"}}else this.checkRequiredCredentials(),a=this.urlencode(this.extend({method:e,moment:this.nonce()},s)),r={"Content-Type":"application/x-www-form-urlencoded","API-Key":this.apiKey,"API-Hash":this.hmac(this.encode(a),this.encode(this.secret),n.Zf)};return{url:o,method:i,body:a,headers:r}}handleErrors(e,t,i,s,a,o,n,d,h){if(void 0!==n){if("code"in n){const e=this.safeString(n,"code"),t=this.id+" "+o;throw this.throwExactlyMatchedException(this.exceptions,e,t),new r.ExchangeError(t)}if("status"in n){if("Fail"===this.safeString(n,"status")){const e=this.safeValue(n,"errors"),t=this.id+" "+o;for(let i=0;i<e.length;i++){const s=e[i];this.throwExactlyMatchedException(this.exceptions,s,t)}throw new r.ExchangeError(t)}}}}}
Loading...
Holy-Kocoin
Current BTC price over Binance WebSocket
BTC Price is
0
Show Exchanges
Buy Amount 0