ccxt-ir 4.9.32 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +7 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/abstract/asretether.js +11 -0
- package/dist/cjs/src/abstract/bidarz.js +11 -0
- package/dist/cjs/src/asretether.js +325 -0
- package/dist/cjs/src/bidarz.js +337 -0
- package/dist/cjs/src/bit24.js +4 -3
- package/dist/cjs/src/raastin.js +144 -16
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/asretether.d.ts +8 -0
- package/js/src/abstract/asretether.js +11 -0
- package/js/src/abstract/bidarz.d.ts +9 -0
- package/js/src/abstract/bidarz.js +11 -0
- package/js/src/abstract/raastin.d.ts +1 -0
- package/js/src/asretether.d.ts +21 -0
- package/js/src/asretether.js +324 -0
- package/js/src/bidarz.d.ts +22 -0
- package/js/src/bidarz.js +336 -0
- package/js/src/bit24.js +4 -3
- package/js/src/raastin.d.ts +2 -0
- package/js/src/raastin.js +144 -16
- package/js/src/src/abantether.d.ts +21 -0
- package/js/src/src/abantether.js +353 -0
- package/js/src/src/abstract/abantether.d.ts +8 -0
- package/js/src/src/abstract/abantether.js +11 -0
- package/js/src/src/abstract/afratether.d.ts +9 -0
- package/js/src/src/abstract/afratether.js +11 -0
- package/js/src/src/abstract/alpaca.d.ts +77 -0
- package/js/src/src/abstract/alpaca.js +11 -0
- package/js/src/src/abstract/apex.d.ts +34 -0
- package/js/src/src/abstract/apex.js +11 -0
- package/js/src/src/abstract/arzinja.d.ts +8 -0
- package/js/src/src/abstract/arzinja.js +11 -0
- package/js/src/src/abstract/arzplus.d.ts +11 -0
- package/js/src/src/abstract/arzplus.js +11 -0
- package/js/src/src/abstract/ascendex.d.ts +80 -0
- package/js/src/src/abstract/ascendex.js +11 -0
- package/js/src/src/abstract/asretether.d.ts +8 -0
- package/js/src/src/abstract/asretether.js +11 -0
- package/js/src/src/abstract/bidarz.d.ts +9 -0
- package/js/src/src/abstract/bidarz.js +11 -0
- package/js/src/src/abstract/bigone.d.ts +48 -0
- package/js/src/src/abstract/bigone.js +11 -0
- package/js/src/src/abstract/binance.d.ts +773 -0
- package/js/src/src/abstract/binance.js +11 -0
- package/js/src/src/abstract/bingx.d.ts +165 -0
- package/js/src/src/abstract/bingx.js +11 -0
- package/js/src/src/abstract/bit24.d.ts +9 -0
- package/js/src/src/abstract/bit24.js +11 -0
- package/js/src/src/abstract/bit2c.d.ts +30 -0
- package/js/src/src/abstract/bit2c.js +11 -0
- package/js/src/src/abstract/bitbank.d.ts +35 -0
- package/js/src/src/abstract/bitbank.js +11 -0
- package/js/src/src/abstract/bitbarg.d.ts +8 -0
- package/js/src/src/abstract/bitbarg.js +11 -0
- package/js/src/src/abstract/bitbns.d.ts +43 -0
- package/js/src/src/abstract/bitbns.js +11 -0
- package/js/src/src/abstract/bitfinex.d.ts +143 -0
- package/js/src/src/abstract/bitfinex.js +11 -0
- package/js/src/src/abstract/bitflyer.d.ts +42 -0
- package/js/src/src/abstract/bitflyer.js +11 -0
- package/js/src/src/abstract/bitget.d.ts +578 -0
- package/js/src/src/abstract/bitget.js +11 -0
- package/js/src/src/abstract/bithumb.d.ts +35 -0
- package/js/src/src/abstract/bithumb.js +11 -0
- package/js/src/src/abstract/bitimen.d.ts +10 -0
- package/js/src/src/abstract/bitimen.js +11 -0
- package/js/src/src/abstract/bitir.d.ts +10 -0
- package/js/src/src/abstract/bitir.js +11 -0
- package/js/src/src/abstract/bitmart.d.ts +120 -0
- package/js/src/src/abstract/bitmart.js +11 -0
- package/js/src/src/abstract/bitmex.d.ts +100 -0
- package/js/src/src/abstract/bitmex.js +11 -0
- package/js/src/src/abstract/bitopro.d.ts +33 -0
- package/js/src/src/abstract/bitopro.js +11 -0
- package/js/src/src/abstract/bitpin.d.ts +11 -0
- package/js/src/src/abstract/bitpin.js +11 -0
- package/js/src/src/abstract/bitrue.d.ts +75 -0
- package/js/src/src/abstract/bitrue.js +11 -0
- package/js/src/src/abstract/bitso.d.ts +46 -0
- package/js/src/src/abstract/bitso.js +11 -0
- package/js/src/src/abstract/bitstamp.d.ts +262 -0
- package/js/src/src/abstract/bitstamp.js +11 -0
- package/js/src/src/abstract/bitteam.d.ts +32 -0
- package/js/src/src/abstract/bitteam.js +11 -0
- package/js/src/src/abstract/bittrade.d.ts +117 -0
- package/js/src/src/abstract/bittrade.js +11 -0
- package/js/src/src/abstract/bitunix.d.ts +9 -0
- package/js/src/src/abstract/bitunix.js +11 -0
- package/js/src/src/abstract/bitvavo.d.ts +30 -0
- package/js/src/src/abstract/bitvavo.js +11 -0
- package/js/src/src/abstract/blockchaincom.d.ts +31 -0
- package/js/src/src/abstract/blockchaincom.js +11 -0
- package/js/src/src/abstract/blofin.d.ts +70 -0
- package/js/src/src/abstract/blofin.js +11 -0
- package/js/src/src/abstract/btcalpha.d.ts +21 -0
- package/js/src/src/abstract/btcalpha.js +11 -0
- package/js/src/src/abstract/btcbox.d.ts +18 -0
- package/js/src/src/abstract/btcbox.js +11 -0
- package/js/src/src/abstract/btcmarkets.d.ts +42 -0
- package/js/src/src/abstract/btcmarkets.js +11 -0
- package/js/src/src/abstract/btcturk.d.ts +23 -0
- package/js/src/src/abstract/btcturk.js +11 -0
- package/js/src/src/abstract/bybit.d.ts +316 -0
- package/js/src/src/abstract/bybit.js +11 -0
- package/js/src/src/abstract/bydfi.d.ts +11 -0
- package/js/src/src/abstract/bydfi.js +11 -0
- package/js/src/src/abstract/cafearz.d.ts +8 -0
- package/js/src/src/abstract/cafearz.js +11 -0
- package/js/src/src/abstract/cex.d.ts +35 -0
- package/js/src/src/abstract/cex.js +11 -0
- package/js/src/src/abstract/coinbase.d.ts +97 -0
- package/js/src/src/abstract/coinbase.js +11 -0
- package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
- package/js/src/src/abstract/coinbaseexchange.js +11 -0
- package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
- package/js/src/src/abstract/coinbaseinternational.js +11 -0
- package/js/src/src/abstract/coincatch.d.ts +97 -0
- package/js/src/src/abstract/coincatch.js +11 -0
- package/js/src/src/abstract/coincheck.d.ts +36 -0
- package/js/src/src/abstract/coincheck.js +11 -0
- package/js/src/src/abstract/coinex.d.ts +240 -0
- package/js/src/src/abstract/coinex.js +11 -0
- package/js/src/src/abstract/coinmate.d.ts +65 -0
- package/js/src/src/abstract/coinmate.js +11 -0
- package/js/src/src/abstract/coinmetro.d.ts +37 -0
- package/js/src/src/abstract/coinmetro.js +11 -0
- package/js/src/src/abstract/coinone.d.ts +70 -0
- package/js/src/src/abstract/coinone.js +11 -0
- package/js/src/src/abstract/coinsph.d.ts +57 -0
- package/js/src/src/abstract/coinsph.js +11 -0
- package/js/src/src/abstract/coinspot.d.ts +31 -0
- package/js/src/src/abstract/coinspot.js +11 -0
- package/js/src/src/abstract/cryptocom.d.ts +126 -0
- package/js/src/src/abstract/cryptocom.js +11 -0
- package/js/src/src/abstract/cryptomus.d.ts +23 -0
- package/js/src/src/abstract/cryptomus.js +11 -0
- package/js/src/src/abstract/defx.d.ts +72 -0
- package/js/src/src/abstract/defx.js +11 -0
- package/js/src/src/abstract/delta.d.ts +53 -0
- package/js/src/src/abstract/delta.js +11 -0
- package/js/src/src/abstract/deribit.d.ts +129 -0
- package/js/src/src/abstract/deribit.js +11 -0
- package/js/src/src/abstract/derive.d.ts +120 -0
- package/js/src/src/abstract/derive.js +11 -0
- package/js/src/src/abstract/digifinex.d.ts +95 -0
- package/js/src/src/abstract/digifinex.js +11 -0
- package/js/src/src/abstract/ellipx.d.ts +28 -0
- package/js/src/src/abstract/ellipx.js +11 -0
- package/js/src/src/abstract/eterex.d.ts +8 -0
- package/js/src/src/abstract/eterex.js +11 -0
- package/js/src/src/abstract/excoino.d.ts +10 -0
- package/js/src/src/abstract/excoino.js +11 -0
- package/js/src/src/abstract/exir.d.ts +11 -0
- package/js/src/src/abstract/exir.js +11 -0
- package/js/src/src/abstract/exmo.d.ts +58 -0
- package/js/src/src/abstract/exmo.js +11 -0
- package/js/src/src/abstract/exnovin.d.ts +9 -0
- package/js/src/src/abstract/exnovin.js +11 -0
- package/js/src/src/abstract/farhadexchange.d.ts +8 -0
- package/js/src/src/abstract/farhadexchange.js +11 -0
- package/js/src/src/abstract/foxbit.d.ts +29 -0
- package/js/src/src/abstract/foxbit.js +11 -0
- package/js/src/src/abstract/gate.d.ts +287 -0
- package/js/src/src/abstract/gate.js +11 -0
- package/js/src/src/abstract/gemini.d.ts +62 -0
- package/js/src/src/abstract/gemini.js +11 -0
- package/js/src/src/abstract/hamtapay.d.ts +9 -0
- package/js/src/src/abstract/hamtapay.js +11 -0
- package/js/src/src/abstract/hashkey.d.ts +70 -0
- package/js/src/src/abstract/hashkey.js +11 -0
- package/js/src/src/abstract/hibachi.d.ts +29 -0
- package/js/src/src/abstract/hibachi.js +11 -0
- package/js/src/src/abstract/hitbtc.d.ts +118 -0
- package/js/src/src/abstract/hitbtc.js +11 -0
- package/js/src/src/abstract/hitobit.d.ts +11 -0
- package/js/src/src/abstract/hitobit.js +11 -0
- package/js/src/src/abstract/hollaex.d.ts +36 -0
- package/js/src/src/abstract/hollaex.js +11 -0
- package/js/src/src/abstract/htx.d.ts +551 -0
- package/js/src/src/abstract/htx.js +11 -0
- package/js/src/src/abstract/hyperliquid.d.ts +9 -0
- package/js/src/src/abstract/hyperliquid.js +11 -0
- package/js/src/src/abstract/independentreserve.d.ts +46 -0
- package/js/src/src/abstract/independentreserve.js +11 -0
- package/js/src/src/abstract/indodax.d.ts +29 -0
- package/js/src/src/abstract/indodax.js +11 -0
- package/js/src/src/abstract/iranexchange.d.ts +9 -0
- package/js/src/src/abstract/iranexchange.js +11 -0
- package/js/src/src/abstract/jibitex.d.ts +10 -0
- package/js/src/src/abstract/jibitex.js +11 -0
- package/js/src/src/abstract/kcex.d.ts +10 -0
- package/js/src/src/abstract/kcex.js +11 -0
- package/js/src/src/abstract/kifpoolme.d.ts +9 -0
- package/js/src/src/abstract/kifpoolme.js +11 -0
- package/js/src/src/abstract/kraken.d.ts +61 -0
- package/js/src/src/abstract/kraken.js +11 -0
- package/js/src/src/abstract/krakenfutures.d.ts +45 -0
- package/js/src/src/abstract/krakenfutures.js +11 -0
- package/js/src/src/abstract/kucoin.d.ts +227 -0
- package/js/src/src/abstract/kucoin.js +11 -0
- package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
- package/js/src/src/abstract/kucoinfutures.js +11 -0
- package/js/src/src/abstract/latoken.d.ts +59 -0
- package/js/src/src/abstract/latoken.js +11 -0
- package/js/src/src/abstract/lbank.d.ts +65 -0
- package/js/src/src/abstract/lbank.js +11 -0
- package/js/src/src/abstract/luno.d.ts +41 -0
- package/js/src/src/abstract/luno.js +11 -0
- package/js/src/src/abstract/mazdax.d.ts +11 -0
- package/js/src/src/abstract/mazdax.js +11 -0
- package/js/src/src/abstract/mercado.d.ts +28 -0
- package/js/src/src/abstract/mercado.js +11 -0
- package/js/src/src/abstract/mexc.d.ts +183 -0
- package/js/src/src/abstract/mexc.js +11 -0
- package/js/src/src/abstract/modetrade.d.ts +122 -0
- package/js/src/src/abstract/modetrade.js +11 -0
- package/js/src/src/abstract/ndax.d.ts +100 -0
- package/js/src/src/abstract/ndax.js +11 -0
- package/js/src/src/abstract/nobitex.d.ts +10 -0
- package/js/src/src/abstract/nobitex.js +11 -0
- package/js/src/src/abstract/novadax.d.ts +32 -0
- package/js/src/src/abstract/novadax.js +11 -0
- package/js/src/src/abstract/oceanex.d.ts +30 -0
- package/js/src/src/abstract/oceanex.js +11 -0
- package/js/src/src/abstract/okcoin.d.ts +77 -0
- package/js/src/src/abstract/okcoin.js +11 -0
- package/js/src/src/abstract/okexchange.d.ts +11 -0
- package/js/src/src/abstract/okexchange.js +11 -0
- package/js/src/src/abstract/okx.d.ts +352 -0
- package/js/src/src/abstract/okx.js +11 -0
- package/js/src/src/abstract/ompfinex.d.ts +10 -0
- package/js/src/src/abstract/ompfinex.js +11 -0
- package/js/src/src/abstract/onetrading.d.ts +26 -0
- package/js/src/src/abstract/onetrading.js +11 -0
- package/js/src/src/abstract/oxfun.d.ts +37 -0
- package/js/src/src/abstract/oxfun.js +11 -0
- package/js/src/src/abstract/p2b.d.ts +25 -0
- package/js/src/src/abstract/p2b.js +11 -0
- package/js/src/src/abstract/paradex.d.ts +66 -0
- package/js/src/src/abstract/paradex.js +11 -0
- package/js/src/src/abstract/paymium.d.ts +31 -0
- package/js/src/src/abstract/paymium.js +11 -0
- package/js/src/src/abstract/phemex.d.ts +120 -0
- package/js/src/src/abstract/phemex.js +11 -0
- package/js/src/src/abstract/pingi.d.ts +9 -0
- package/js/src/src/abstract/pingi.js +11 -0
- package/js/src/src/abstract/poloniex.d.ts +108 -0
- package/js/src/src/abstract/poloniex.js +11 -0
- package/js/src/src/abstract/pooleno.d.ts +8 -0
- package/js/src/src/abstract/pooleno.js +11 -0
- package/js/src/src/abstract/probit.d.ts +26 -0
- package/js/src/src/abstract/probit.js +11 -0
- package/js/src/src/abstract/raastin.d.ts +11 -0
- package/js/src/src/abstract/raastin.js +11 -0
- package/js/src/src/abstract/ramzinex.d.ts +10 -0
- package/js/src/src/abstract/ramzinex.js +11 -0
- package/js/src/src/abstract/sarmayex.d.ts +8 -0
- package/js/src/src/abstract/sarmayex.js +11 -0
- package/js/src/src/abstract/sarrafex.d.ts +10 -0
- package/js/src/src/abstract/sarrafex.js +11 -0
- package/js/src/src/abstract/tabdeal.d.ts +10 -0
- package/js/src/src/abstract/tabdeal.js +11 -0
- package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
- package/js/src/src/abstract/tehran_exchange.js +11 -0
- package/js/src/src/abstract/tetherland.d.ts +8 -0
- package/js/src/src/abstract/tetherland.js +11 -0
- package/js/src/src/abstract/timex.d.ts +65 -0
- package/js/src/src/abstract/timex.js +11 -0
- package/js/src/src/abstract/tokocrypto.d.ts +40 -0
- package/js/src/src/abstract/tokocrypto.js +11 -0
- package/js/src/src/abstract/toobit.d.ts +10 -0
- package/js/src/src/abstract/toobit.js +11 -0
- package/js/src/src/abstract/tradeogre.d.ts +21 -0
- package/js/src/src/abstract/tradeogre.js +11 -0
- package/js/src/src/abstract/twox.d.ts +8 -0
- package/js/src/src/abstract/twox.js +11 -0
- package/js/src/src/abstract/ubitex.d.ts +10 -0
- package/js/src/src/abstract/ubitex.js +11 -0
- package/js/src/src/abstract/upbit.d.ts +58 -0
- package/js/src/src/abstract/upbit.js +11 -0
- package/js/src/src/abstract/vertex.d.ts +22 -0
- package/js/src/src/abstract/vertex.js +11 -0
- package/js/src/src/abstract/wallex.d.ts +11 -0
- package/js/src/src/abstract/wallex.js +11 -0
- package/js/src/src/abstract/wavesexchange.d.ts +157 -0
- package/js/src/src/abstract/wavesexchange.js +11 -0
- package/js/src/src/abstract/whitebit.d.ts +117 -0
- package/js/src/src/abstract/whitebit.js +11 -0
- package/js/src/src/abstract/woo.d.ts +144 -0
- package/js/src/src/abstract/woo.js +11 -0
- package/js/src/src/abstract/woofipro.d.ts +122 -0
- package/js/src/src/abstract/woofipro.js +11 -0
- package/js/src/src/abstract/xt.d.ts +160 -0
- package/js/src/src/abstract/xt.js +11 -0
- package/js/src/src/abstract/yobit.d.ts +19 -0
- package/js/src/src/abstract/yobit.js +11 -0
- package/js/src/src/abstract/zaif.d.ts +41 -0
- package/js/src/src/abstract/zaif.js +11 -0
- package/js/src/src/abstract/zonda.d.ts +56 -0
- package/js/src/src/abstract/zonda.js +11 -0
- package/js/src/src/afratether.d.ts +21 -0
- package/js/src/src/afratether.js +356 -0
- package/js/src/src/alpaca.d.ts +332 -0
- package/js/src/src/alpaca.js +1908 -0
- package/js/src/src/apex.d.ts +333 -0
- package/js/src/src/apex.js +1942 -0
- package/js/src/src/arzinja.d.ts +21 -0
- package/js/src/src/arzinja.js +298 -0
- package/js/src/src/arzplus.d.ts +26 -0
- package/js/src/src/arzplus.js +581 -0
- package/js/src/src/ascendex.d.ts +424 -0
- package/js/src/src/ascendex.js +3699 -0
- package/js/src/src/asretether.d.ts +21 -0
- package/js/src/src/asretether.js +324 -0
- package/js/src/src/base/Exchange.d.ts +926 -0
- package/js/src/src/base/Exchange.js +7399 -0
- package/js/src/src/base/Precise.d.ts +42 -0
- package/js/src/src/base/Precise.js +275 -0
- package/js/src/src/base/errors.d.ts +168 -0
- package/js/src/src/base/errors.js +255 -0
- package/js/src/src/base/functions/crypto.d.ts +16 -0
- package/js/src/src/base/functions/crypto.js +131 -0
- package/js/src/src/base/functions/encode.d.ts +4 -0
- package/js/src/src/base/functions/encode.js +32 -0
- package/js/src/src/base/functions/generic.d.ts +29 -0
- package/js/src/src/base/functions/generic.js +203 -0
- package/js/src/src/base/functions/misc.d.ts +9 -0
- package/js/src/src/base/functions/misc.js +101 -0
- package/js/src/src/base/functions/number.d.ts +27 -0
- package/js/src/src/base/functions/number.js +313 -0
- package/js/src/src/base/functions/platform.d.ts +7 -0
- package/js/src/src/base/functions/platform.js +27 -0
- package/js/src/src/base/functions/rsa.d.ts +5 -0
- package/js/src/src/base/functions/rsa.js +49 -0
- package/js/src/src/base/functions/string.d.ts +7 -0
- package/js/src/src/base/functions/string.js +44 -0
- package/js/src/src/base/functions/throttle.d.ts +6 -0
- package/js/src/src/base/functions/throttle.js +67 -0
- package/js/src/src/base/functions/time.d.ts +21 -0
- package/js/src/src/base/functions/time.js +171 -0
- package/js/src/src/base/functions/totp.d.ts +3 -0
- package/js/src/src/base/functions/totp.js +25 -0
- package/js/src/src/base/functions/type.d.ts +37 -0
- package/js/src/src/base/functions/type.js +179 -0
- package/js/src/src/base/functions.d.ts +10 -0
- package/js/src/src/base/functions.js +18 -0
- package/js/src/src/base/types.d.ts +586 -0
- package/js/src/src/base/types.js +7 -0
- package/js/src/src/base/ws/Cache.d.ts +27 -0
- package/js/src/src/base/ws/Cache.js +260 -0
- package/js/src/src/base/ws/Client.d.ts +53 -0
- package/js/src/src/base/ws/Client.js +307 -0
- package/js/src/src/base/ws/Future.d.ts +8 -0
- package/js/src/src/base/ws/Future.js +35 -0
- package/js/src/src/base/ws/OrderBook.d.ts +25 -0
- package/js/src/src/base/ws/OrderBook.js +130 -0
- package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
- package/js/src/src/base/ws/OrderBookSide.js +286 -0
- package/js/src/src/base/ws/WsClient.d.ts +11 -0
- package/js/src/src/base/ws/WsClient.js +69 -0
- package/js/src/src/bequant.d.ts +4 -0
- package/js/src/src/bequant.js +35 -0
- package/js/src/src/bidarz.d.ts +16 -0
- package/js/src/src/bidarz.js +327 -0
- package/js/src/src/bigone.d.ts +296 -0
- package/js/src/src/bigone.js +2340 -0
- package/js/src/src/binance.d.ts +1667 -0
- package/js/src/src/binance.js +14400 -0
- package/js/src/src/binancecoinm.d.ts +6 -0
- package/js/src/src/binancecoinm.js +51 -0
- package/js/src/src/binanceus.d.ts +4 -0
- package/js/src/src/binanceus.js +225 -0
- package/js/src/src/binanceusdm.d.ts +6 -0
- package/js/src/src/binanceusdm.js +63 -0
- package/js/src/src/bingx.d.ts +778 -0
- package/js/src/src/bingx.js +6705 -0
- package/js/src/src/bit24.d.ts +24 -0
- package/js/src/src/bit24.js +520 -0
- package/js/src/src/bit2c.d.ts +146 -0
- package/js/src/src/bit2c.js +1029 -0
- package/js/src/src/bitbank.d.ts +181 -0
- package/js/src/src/bitbank.js +1146 -0
- package/js/src/src/bitbarg.d.ts +21 -0
- package/js/src/src/bitbarg.js +312 -0
- package/js/src/src/bitbns.d.ts +184 -0
- package/js/src/src/bitbns.js +1288 -0
- package/js/src/src/bitfinex.d.ts +516 -0
- package/js/src/src/bitfinex.js +3951 -0
- package/js/src/src/bitflyer.d.ts +229 -0
- package/js/src/src/bitflyer.js +1209 -0
- package/js/src/src/bitget.d.ts +1109 -0
- package/js/src/src/bitget.js +11033 -0
- package/js/src/src/bithumb.d.ts +165 -0
- package/js/src/src/bithumb.js +1257 -0
- package/js/src/src/bitimen.d.ts +23 -0
- package/js/src/src/bitimen.js +424 -0
- package/js/src/src/bitir.d.ts +23 -0
- package/js/src/src/bitir.js +521 -0
- package/js/src/src/bitmart.d.ts +736 -0
- package/js/src/src/bitmart.js +5639 -0
- package/js/src/src/bitmex.d.ts +395 -0
- package/js/src/src/bitmex.js +3088 -0
- package/js/src/src/bitopro.d.ts +295 -0
- package/js/src/src/bitopro.js +1892 -0
- package/js/src/src/bitpin.d.ts +23 -0
- package/js/src/src/bitpin.js +487 -0
- package/js/src/src/bitrue.d.ts +384 -0
- package/js/src/src/bitrue.js +3382 -0
- package/js/src/src/bitso.d.ts +270 -0
- package/js/src/src/bitso.js +1881 -0
- package/js/src/src/bitstamp.d.ts +355 -0
- package/js/src/src/bitstamp.js +2445 -0
- package/js/src/src/bitteam.d.ts +229 -0
- package/js/src/src/bitteam.js +2420 -0
- package/js/src/src/bittrade.d.ts +298 -0
- package/js/src/src/bittrade.js +2050 -0
- package/js/src/src/bitunix.d.ts +21 -0
- package/js/src/src/bitunix.js +326 -0
- package/js/src/src/bitvavo.d.ts +311 -0
- package/js/src/src/bitvavo.js +2204 -0
- package/js/src/src/blockchaincom.d.ts +256 -0
- package/js/src/src/blockchaincom.js +1259 -0
- package/js/src/src/blofin.d.ts +439 -0
- package/js/src/src/blofin.js +2576 -0
- package/js/src/src/btcalpha.d.ts +209 -0
- package/js/src/src/btcalpha.js +1056 -0
- package/js/src/src/btcbox.d.ts +144 -0
- package/js/src/src/btcbox.js +834 -0
- package/js/src/src/btcmarkets.d.ts +253 -0
- package/js/src/src/btcmarkets.js +1418 -0
- package/js/src/src/btcturk.d.ts +161 -0
- package/js/src/src/btcturk.js +1058 -0
- package/js/src/src/bybit.d.ts +1097 -0
- package/js/src/src/bybit.js +9382 -0
- package/js/src/src/bydfi.d.ts +23 -0
- package/js/src/src/bydfi.js +434 -0
- package/js/src/src/cafearz.d.ts +21 -0
- package/js/src/src/cafearz.js +346 -0
- package/js/src/src/cex.d.ts +286 -0
- package/js/src/src/cex.js +1799 -0
- package/js/src/src/coinbase.d.ts +623 -0
- package/js/src/src/coinbase.js +5220 -0
- package/js/src/src/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/coinbaseadvanced.js +18 -0
- package/js/src/src/coinbaseexchange.d.ts +334 -0
- package/js/src/src/coinbaseexchange.js +2127 -0
- package/js/src/src/coinbaseinternational.d.ts +443 -0
- package/js/src/src/coinbaseinternational.js +2336 -0
- package/js/src/src/coincatch.d.ts +786 -0
- package/js/src/src/coincatch.js +5492 -0
- package/js/src/src/coincheck.d.ts +147 -0
- package/js/src/src/coincheck.js +962 -0
- package/js/src/src/coinex.d.ts +719 -0
- package/js/src/src/coinex.js +6166 -0
- package/js/src/src/coinmate.d.ts +202 -0
- package/js/src/src/coinmate.js +1215 -0
- package/js/src/src/coinmetro.d.ts +244 -0
- package/js/src/src/coinmetro.js +2024 -0
- package/js/src/src/coinone.d.ts +158 -0
- package/js/src/src/coinone.js +1278 -0
- package/js/src/src/coinsph.d.ts +310 -0
- package/js/src/src/coinsph.js +2203 -0
- package/js/src/src/coinspot.d.ts +108 -0
- package/js/src/src/coinspot.js +653 -0
- package/js/src/src/cryptocom.d.ts +463 -0
- package/js/src/src/cryptocom.js +3549 -0
- package/js/src/src/cryptomus.d.ts +158 -0
- package/js/src/src/cryptomus.js +1169 -0
- package/js/src/src/defx.d.ts +348 -0
- package/js/src/src/defx.js +2139 -0
- package/js/src/src/delta.d.ts +407 -0
- package/js/src/src/delta.js +3654 -0
- package/js/src/src/deribit.d.ts +516 -0
- package/js/src/src/deribit.js +3790 -0
- package/js/src/src/derive.d.ts +324 -0
- package/js/src/src/derive.js +2655 -0
- package/js/src/src/digifinex.d.ts +544 -0
- package/js/src/src/digifinex.js +4453 -0
- package/js/src/src/ellipx.d.ts +237 -0
- package/js/src/src/ellipx.js +2071 -0
- package/js/src/src/eterex.d.ts +21 -0
- package/js/src/src/eterex.js +299 -0
- package/js/src/src/excoino.d.ts +23 -0
- package/js/src/src/excoino.js +426 -0
- package/js/src/src/exir.d.ts +23 -0
- package/js/src/src/exir.js +403 -0
- package/js/src/src/exmo.d.ts +426 -0
- package/js/src/src/exmo.js +2825 -0
- package/js/src/src/exnovin.d.ts +22 -0
- package/js/src/src/exnovin.js +378 -0
- package/js/src/src/farhadexchange.d.ts +21 -0
- package/js/src/src/farhadexchange.js +280 -0
- package/js/src/src/fmfwio.d.ts +4 -0
- package/js/src/src/fmfwio.js +35 -0
- package/js/src/src/foxbit.d.ts +352 -0
- package/js/src/src/foxbit.js +2016 -0
- package/js/src/src/gate.d.ts +1071 -0
- package/js/src/src/gate.js +8282 -0
- package/js/src/src/gateio.d.ts +4 -0
- package/js/src/src/gateio.js +17 -0
- package/js/src/src/gemini.d.ts +257 -0
- package/js/src/src/gemini.js +2006 -0
- package/js/src/src/hamtapay.d.ts +21 -0
- package/js/src/src/hamtapay.js +303 -0
- package/js/src/src/hashkey.d.ts +628 -0
- package/js/src/src/hashkey.js +4363 -0
- package/js/src/src/hibachi.d.ts +346 -0
- package/js/src/src/hibachi.js +2137 -0
- package/js/src/src/hitbtc.d.ts +558 -0
- package/js/src/src/hitbtc.js +3847 -0
- package/js/src/src/hitobit.d.ts +23 -0
- package/js/src/src/hitobit.js +412 -0
- package/js/src/src/hollaex.d.ts +305 -0
- package/js/src/src/hollaex.js +2046 -0
- package/js/src/src/htx.d.ts +961 -0
- package/js/src/src/htx.js +9668 -0
- package/js/src/src/huobi.d.ts +4 -0
- package/js/src/src/huobi.js +17 -0
- package/js/src/src/hyperliquid.d.ts +651 -0
- package/js/src/src/hyperliquid.js +3937 -0
- package/js/src/src/independentreserve.d.ts +169 -0
- package/js/src/src/independentreserve.js +1115 -0
- package/js/src/src/indodax.d.ts +217 -0
- package/js/src/src/indodax.js +1454 -0
- package/js/src/src/iranexchange.d.ts +21 -0
- package/js/src/src/iranexchange.js +399 -0
- package/js/src/src/jibitex.d.ts +23 -0
- package/js/src/src/jibitex.js +416 -0
- package/js/src/src/kcex.d.ts +21 -0
- package/js/src/src/kcex.js +335 -0
- package/js/src/src/kifpoolme.d.ts +23 -0
- package/js/src/src/kifpoolme.js +410 -0
- package/js/src/src/kraken.d.ts +484 -0
- package/js/src/src/kraken.js +3518 -0
- package/js/src/src/krakenfutures.d.ts +362 -0
- package/js/src/src/krakenfutures.js +2885 -0
- package/js/src/src/kucoin.d.ts +759 -0
- package/js/src/src/kucoin.js +5153 -0
- package/js/src/src/kucoinfutures.d.ts +521 -0
- package/js/src/src/kucoinfutures.js +3381 -0
- package/js/src/src/latoken.d.ts +274 -0
- package/js/src/src/latoken.js +1824 -0
- package/js/src/src/lbank.d.ts +350 -0
- package/js/src/src/lbank.js +3146 -0
- package/js/src/src/luno.d.ts +252 -0
- package/js/src/src/luno.js +1479 -0
- package/js/src/src/mazdax.d.ts +23 -0
- package/js/src/src/mazdax.js +534 -0
- package/js/src/src/mercado.d.ts +160 -0
- package/js/src/src/mercado.js +1011 -0
- package/js/src/src/mexc.d.ts +768 -0
- package/js/src/src/mexc.js +6102 -0
- package/js/src/src/modetrade.d.ts +496 -0
- package/js/src/src/modetrade.js +2936 -0
- package/js/src/src/myokx.d.ts +4 -0
- package/js/src/src/myokx.js +54 -0
- package/js/src/src/ndax.d.ts +285 -0
- package/js/src/src/ndax.js +2598 -0
- package/js/src/src/nobitex.d.ts +23 -0
- package/js/src/src/nobitex.js +454 -0
- package/js/src/src/novadax.d.ts +279 -0
- package/js/src/src/novadax.js +1676 -0
- package/js/src/src/oceanex.d.ts +231 -0
- package/js/src/src/oceanex.js +1123 -0
- package/js/src/src/okcoin.d.ts +346 -0
- package/js/src/src/okcoin.js +3211 -0
- package/js/src/src/okexchange.d.ts +23 -0
- package/js/src/src/okexchange.js +373 -0
- package/js/src/src/okx.d.ts +1125 -0
- package/js/src/src/okx.js +9009 -0
- package/js/src/src/okxus.d.ts +4 -0
- package/js/src/src/okxus.js +54 -0
- package/js/src/src/ompfinex.d.ts +23 -0
- package/js/src/src/ompfinex.js +510 -0
- package/js/src/src/onetrading.d.ts +228 -0
- package/js/src/src/onetrading.js +1769 -0
- package/js/src/src/oxfun.d.ts +442 -0
- package/js/src/src/oxfun.js +2920 -0
- package/js/src/src/p2b.d.ts +189 -0
- package/js/src/src/p2b.js +1344 -0
- package/js/src/src/paradex.d.ts +389 -0
- package/js/src/src/paradex.js +2607 -0
- package/js/src/src/paymium.d.ts +133 -0
- package/js/src/src/paymium.js +644 -0
- package/js/src/src/phemex.d.ts +497 -0
- package/js/src/src/phemex.js +5333 -0
- package/js/src/src/pingi.d.ts +22 -0
- package/js/src/src/pingi.js +446 -0
- package/js/src/src/poloniex.d.ts +441 -0
- package/js/src/src/poloniex.js +3681 -0
- package/js/src/src/pooleno.d.ts +21 -0
- package/js/src/src/pooleno.js +347 -0
- package/js/src/src/pro/alpaca.d.ts +95 -0
- package/js/src/src/pro/alpaca.js +724 -0
- package/js/src/src/pro/apex.d.ts +160 -0
- package/js/src/src/pro/apex.js +1044 -0
- package/js/src/src/pro/ascendex.d.ts +99 -0
- package/js/src/src/pro/ascendex.js +1012 -0
- package/js/src/src/pro/bequant.d.ts +4 -0
- package/js/src/src/pro/bequant.js +42 -0
- package/js/src/src/pro/binance.d.ts +796 -0
- package/js/src/src/pro/binance.js +4373 -0
- package/js/src/src/pro/binancecoinm.d.ts +4 -0
- package/js/src/src/pro/binancecoinm.js +32 -0
- package/js/src/src/pro/binanceus.d.ts +4 -0
- package/js/src/src/pro/binanceus.js +52 -0
- package/js/src/src/pro/binanceusdm.d.ts +4 -0
- package/js/src/src/pro/binanceusdm.js +37 -0
- package/js/src/src/pro/bingx.d.ts +151 -0
- package/js/src/src/pro/bingx.js +1568 -0
- package/js/src/src/pro/bitfinex.d.ts +99 -0
- package/js/src/src/pro/bitfinex.js +1165 -0
- package/js/src/src/pro/bitget.d.ts +257 -0
- package/js/src/src/pro/bitget.js +2327 -0
- package/js/src/src/pro/bithumb.d.ts +59 -0
- package/js/src/src/pro/bithumb.js +395 -0
- package/js/src/src/pro/bitmart.d.ts +168 -0
- package/js/src/src/pro/bitmart.js +1686 -0
- package/js/src/src/pro/bitmex.d.ts +170 -0
- package/js/src/src/pro/bitmex.js +1760 -0
- package/js/src/src/pro/bitopro.d.ts +69 -0
- package/js/src/src/pro/bitopro.js +477 -0
- package/js/src/src/pro/bitrue.d.ts +40 -0
- package/js/src/src/pro/bitrue.js +461 -0
- package/js/src/src/pro/bitstamp.d.ts +53 -0
- package/js/src/src/pro/bitstamp.js +587 -0
- package/js/src/src/pro/bittrade.d.ts +66 -0
- package/js/src/src/pro/bittrade.js +606 -0
- package/js/src/src/pro/bitvavo.d.ts +321 -0
- package/js/src/src/pro/bitvavo.js +1451 -0
- package/js/src/src/pro/blockchaincom.d.ts +89 -0
- package/js/src/src/pro/blockchaincom.js +777 -0
- package/js/src/src/pro/blofin.d.ts +174 -0
- package/js/src/src/pro/blofin.js +743 -0
- package/js/src/src/pro/bybit.d.ts +397 -0
- package/js/src/src/pro/bybit.js +2519 -0
- package/js/src/src/pro/cex.d.ts +220 -0
- package/js/src/src/pro/cex.js +1535 -0
- package/js/src/src/pro/coinbase.d.ts +119 -0
- package/js/src/src/pro/coinbase.js +736 -0
- package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/pro/coinbaseadvanced.js +18 -0
- package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
- package/js/src/src/pro/coinbaseexchange.js +969 -0
- package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
- package/js/src/src/pro/coinbaseinternational.js +804 -0
- package/js/src/src/pro/coincatch.d.ts +207 -0
- package/js/src/src/pro/coincatch.js +1562 -0
- package/js/src/src/pro/coincheck.d.ts +33 -0
- package/js/src/src/pro/coincheck.js +210 -0
- package/js/src/src/pro/coinex.d.ts +147 -0
- package/js/src/src/pro/coinex.js +1426 -0
- package/js/src/src/pro/coinone.d.ts +51 -0
- package/js/src/src/pro/coinone.js +413 -0
- package/js/src/src/pro/cryptocom.d.ts +300 -0
- package/js/src/src/pro/cryptocom.js +1414 -0
- package/js/src/src/pro/defx.d.ts +236 -0
- package/js/src/src/pro/defx.js +865 -0
- package/js/src/src/pro/deribit.d.ts +163 -0
- package/js/src/src/pro/deribit.js +1066 -0
- package/js/src/src/pro/derive.d.ts +100 -0
- package/js/src/src/pro/derive.js +753 -0
- package/js/src/src/pro/exmo.d.ts +97 -0
- package/js/src/src/pro/exmo.js +903 -0
- package/js/src/src/pro/gate.d.ts +360 -0
- package/js/src/src/pro/gate.js +2119 -0
- package/js/src/src/pro/gateio.d.ts +4 -0
- package/js/src/src/pro/gateio.js +17 -0
- package/js/src/src/pro/gemini.d.ts +106 -0
- package/js/src/src/pro/gemini.js +932 -0
- package/js/src/src/pro/hashkey.d.ts +121 -0
- package/js/src/src/pro/hashkey.js +843 -0
- package/js/src/src/pro/hitbtc.d.ts +235 -0
- package/js/src/src/pro/hitbtc.js +1400 -0
- package/js/src/src/pro/hollaex.d.ts +77 -0
- package/js/src/src/pro/hollaex.js +604 -0
- package/js/src/src/pro/htx.d.ts +141 -0
- package/js/src/src/pro/htx.js +2415 -0
- package/js/src/src/pro/huobi.d.ts +4 -0
- package/js/src/src/pro/huobi.js +17 -0
- package/js/src/src/pro/hyperliquid.d.ts +218 -0
- package/js/src/src/pro/hyperliquid.js +1126 -0
- package/js/src/src/pro/independentreserve.d.ts +36 -0
- package/js/src/src/pro/independentreserve.js +287 -0
- package/js/src/src/pro/kraken.d.ts +233 -0
- package/js/src/src/pro/kraken.js +1785 -0
- package/js/src/src/pro/krakenfutures.d.ts +178 -0
- package/js/src/src/pro/krakenfutures.js +1592 -0
- package/js/src/src/pro/kucoin.d.ts +221 -0
- package/js/src/src/pro/kucoin.js +1430 -0
- package/js/src/src/pro/kucoinfutures.d.ts +205 -0
- package/js/src/src/pro/kucoinfutures.js +1295 -0
- package/js/src/src/pro/lbank.d.ts +134 -0
- package/js/src/src/pro/lbank.js +950 -0
- package/js/src/src/pro/luno.d.ts +44 -0
- package/js/src/src/pro/luno.js +322 -0
- package/js/src/src/pro/mexc.d.ts +210 -0
- package/js/src/src/pro/mexc.js +2009 -0
- package/js/src/src/pro/modetrade.d.ts +155 -0
- package/js/src/src/pro/modetrade.js +1335 -0
- package/js/src/src/pro/myokx.d.ts +4 -0
- package/js/src/src/pro/myokx.js +39 -0
- package/js/src/src/pro/ndax.d.ts +60 -0
- package/js/src/src/pro/ndax.js +545 -0
- package/js/src/src/pro/okcoin.d.ts +91 -0
- package/js/src/src/pro/okcoin.js +763 -0
- package/js/src/src/pro/okx.d.ts +408 -0
- package/js/src/src/pro/okx.js +2479 -0
- package/js/src/src/pro/okxus.d.ts +4 -0
- package/js/src/src/pro/okxus.js +39 -0
- package/js/src/src/pro/onetrading.d.ts +107 -0
- package/js/src/src/pro/onetrading.js +1343 -0
- package/js/src/src/pro/oxfun.d.ts +234 -0
- package/js/src/src/pro/oxfun.js +1112 -0
- package/js/src/src/pro/p2b.d.ts +104 -0
- package/js/src/src/pro/p2b.js +506 -0
- package/js/src/src/pro/paradex.d.ts +54 -0
- package/js/src/src/pro/paradex.js +370 -0
- package/js/src/src/pro/phemex.d.ts +129 -0
- package/js/src/src/pro/phemex.js +1569 -0
- package/js/src/src/pro/poloniex.d.ts +214 -0
- package/js/src/src/pro/poloniex.js +1318 -0
- package/js/src/src/pro/probit.d.ts +91 -0
- package/js/src/src/pro/probit.js +593 -0
- package/js/src/src/pro/tradeogre.d.ts +49 -0
- package/js/src/src/pro/tradeogre.js +284 -0
- package/js/src/src/pro/upbit.d.ts +124 -0
- package/js/src/src/pro/upbit.js +689 -0
- package/js/src/src/pro/vertex.d.ts +104 -0
- package/js/src/src/pro/vertex.js +999 -0
- package/js/src/src/pro/whitebit.d.ts +123 -0
- package/js/src/src/pro/whitebit.js +971 -0
- package/js/src/src/pro/woo.d.ts +161 -0
- package/js/src/src/pro/woo.js +1351 -0
- package/js/src/src/pro/woofipro.d.ts +155 -0
- package/js/src/src/pro/woofipro.js +1335 -0
- package/js/src/src/pro/xt.d.ts +165 -0
- package/js/src/src/pro/xt.js +1230 -0
- package/js/src/src/probit.d.ts +283 -0
- package/js/src/src/probit.js +1935 -0
- package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
- package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
- package/js/src/src/raastin.d.ts +24 -0
- package/js/src/src/raastin.js +494 -0
- package/js/src/src/ramzinex.d.ts +23 -0
- package/js/src/src/ramzinex.js +510 -0
- package/js/src/src/sarmayex.d.ts +21 -0
- package/js/src/src/sarmayex.js +376 -0
- package/js/src/src/sarrafex.d.ts +23 -0
- package/js/src/src/sarrafex.js +501 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
- package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
- package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
- package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
- package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
- package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
- package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
- package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
- package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
- package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
- package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
- package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
- package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
- package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
- package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
- package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
- package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
- package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
- package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
- package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
- package/js/src/src/static_dependencies/ethers/index.js +22 -0
- package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
- package/js/src/src/static_dependencies/ethers/interface.js +990 -0
- package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
- package/js/src/src/static_dependencies/ethers/typed.js +608 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
- package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
- package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
- package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
- package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
- package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
- package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
- package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
- package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
- package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
- package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
- package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
- package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
- package/js/src/src/static_dependencies/qs/index.cjs +15 -0
- package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
- package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
- package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
- package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
- package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
- package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
- package/js/src/src/static_dependencies/scure-base/index.js +420 -0
- package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
- package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
- package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
- package/js/src/src/static_dependencies/starknet/constants.js +67 -0
- package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
- package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
- package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
- package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
- package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
- package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
- package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
- package/js/src/src/tabdeal.d.ts +23 -0
- package/js/src/src/tabdeal.js +387 -0
- package/js/src/src/tehran_exchange.d.ts +21 -0
- package/js/src/src/tehran_exchange.js +333 -0
- package/js/src/src/tetherland.d.ts +21 -0
- package/js/src/src/tetherland.js +367 -0
- package/js/src/src/timex.d.ts +247 -0
- package/js/src/src/timex.js +1792 -0
- package/js/src/src/tokocrypto.d.ts +261 -0
- package/js/src/src/tokocrypto.js +2641 -0
- package/js/src/src/toobit.d.ts +22 -0
- package/js/src/src/toobit.js +445 -0
- package/js/src/src/tradeogre.d.ts +149 -0
- package/js/src/src/tradeogre.js +878 -0
- package/js/src/src/twox.d.ts +21 -0
- package/js/src/src/twox.js +371 -0
- package/js/src/src/ubitex.d.ts +23 -0
- package/js/src/src/ubitex.js +433 -0
- package/js/src/src/upbit.d.ts +377 -0
- package/js/src/src/upbit.js +2340 -0
- package/js/src/src/vertex.d.ts +346 -0
- package/js/src/src/vertex.js +3146 -0
- package/js/src/src/wallex.d.ts +23 -0
- package/js/src/src/wallex.js +467 -0
- package/js/src/src/wavesexchange.d.ts +244 -0
- package/js/src/src/wavesexchange.js +2747 -0
- package/js/src/src/whitebit.d.ts +571 -0
- package/js/src/src/whitebit.js +3437 -0
- package/js/src/src/woo.d.ts +727 -0
- package/js/src/src/woo.js +4183 -0
- package/js/src/src/woofipro.d.ts +497 -0
- package/js/src/src/woofipro.js +2941 -0
- package/js/src/src/xt.d.ts +568 -0
- package/js/src/src/xt.js +5184 -0
- package/js/src/src/yobit.d.ts +197 -0
- package/js/src/src/yobit.js +1453 -0
- package/js/src/src/zaif.d.ts +136 -0
- package/js/src/src/zaif.js +821 -0
- package/js/src/src/zonda.d.ts +214 -0
- package/js/src/src/zonda.js +1984 -0
- package/js/test.d.ts +1 -1
- package/js/test.js +33 -33
- package/package.json +1 -1
|
@@ -0,0 +1,2825 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
import Exchange from './abstract/exmo.js';
|
|
9
|
+
import { ArgumentsRequired, ExchangeError, OrderNotFound, AuthenticationError, InsufficientFunds, InvalidOrder, InvalidNonce, OnMaintenance, RateLimitExceeded, BadRequest, PermissionDenied } from './base/errors.js';
|
|
10
|
+
import { Precise } from './base/Precise.js';
|
|
11
|
+
import { TICK_SIZE } from './base/functions/number.js';
|
|
12
|
+
import { sha512 } from './static_dependencies/noble-hashes/sha512.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* @class exmo
|
|
16
|
+
* @augments Exchange
|
|
17
|
+
*/
|
|
18
|
+
export default class exmo extends Exchange {
|
|
19
|
+
describe() {
|
|
20
|
+
return this.deepExtend(super.describe(), {
|
|
21
|
+
'id': 'exmo',
|
|
22
|
+
'name': 'EXMO',
|
|
23
|
+
'countries': ['LT'],
|
|
24
|
+
'rateLimit': 100,
|
|
25
|
+
'version': 'v1.1',
|
|
26
|
+
'has': {
|
|
27
|
+
'CORS': undefined,
|
|
28
|
+
'spot': true,
|
|
29
|
+
'margin': true,
|
|
30
|
+
'swap': false,
|
|
31
|
+
'future': false,
|
|
32
|
+
'option': false,
|
|
33
|
+
'addMargin': true,
|
|
34
|
+
'cancelOrder': true,
|
|
35
|
+
'cancelOrders': false,
|
|
36
|
+
'createDepositAddress': false,
|
|
37
|
+
'createMarketBuyOrder': true,
|
|
38
|
+
'createMarketBuyOrderWithCost': true,
|
|
39
|
+
'createMarketOrderWithCost': true,
|
|
40
|
+
'createOrder': true,
|
|
41
|
+
'createStopLimitOrder': true,
|
|
42
|
+
'createStopMarketOrder': true,
|
|
43
|
+
'createStopOrder': true,
|
|
44
|
+
'editOrder': true,
|
|
45
|
+
'fetchAccounts': false,
|
|
46
|
+
'fetchBalance': true,
|
|
47
|
+
'fetchCanceledOrders': true,
|
|
48
|
+
'fetchCurrencies': true,
|
|
49
|
+
'fetchDeposit': true,
|
|
50
|
+
'fetchDepositAddress': true,
|
|
51
|
+
'fetchDepositAddresses': false,
|
|
52
|
+
'fetchDepositAddressesByNetwork': false,
|
|
53
|
+
'fetchDeposits': true,
|
|
54
|
+
'fetchDepositsWithdrawals': true,
|
|
55
|
+
'fetchDepositWithdrawFee': 'emulated',
|
|
56
|
+
'fetchDepositWithdrawFees': true,
|
|
57
|
+
'fetchFundingHistory': false,
|
|
58
|
+
'fetchFundingRate': false,
|
|
59
|
+
'fetchFundingRateHistory': false,
|
|
60
|
+
'fetchFundingRates': false,
|
|
61
|
+
'fetchIndexOHLCV': false,
|
|
62
|
+
'fetchMarginMode': false,
|
|
63
|
+
'fetchMarkets': true,
|
|
64
|
+
'fetchMarkOHLCV': false,
|
|
65
|
+
'fetchMyTrades': true,
|
|
66
|
+
'fetchOHLCV': true,
|
|
67
|
+
'fetchOpenInterestHistory': false,
|
|
68
|
+
'fetchOpenOrders': true,
|
|
69
|
+
'fetchOrder': 'emulated',
|
|
70
|
+
'fetchOrderBook': true,
|
|
71
|
+
'fetchOrderBooks': true,
|
|
72
|
+
'fetchOrderTrades': true,
|
|
73
|
+
'fetchPosition': false,
|
|
74
|
+
'fetchPositionHistory': false,
|
|
75
|
+
'fetchPositionMode': false,
|
|
76
|
+
'fetchPositions': false,
|
|
77
|
+
'fetchPositionsHistory': false,
|
|
78
|
+
'fetchPositionsRisk': false,
|
|
79
|
+
'fetchPremiumIndexOHLCV': false,
|
|
80
|
+
'fetchTicker': true,
|
|
81
|
+
'fetchTickers': true,
|
|
82
|
+
'fetchTrades': true,
|
|
83
|
+
'fetchTradingFee': false,
|
|
84
|
+
'fetchTradingFees': true,
|
|
85
|
+
'fetchTransactionFees': true,
|
|
86
|
+
'fetchTransactions': 'emulated',
|
|
87
|
+
'fetchTransfer': false,
|
|
88
|
+
'fetchTransfers': false,
|
|
89
|
+
'fetchWithdrawal': true,
|
|
90
|
+
'fetchWithdrawals': true,
|
|
91
|
+
'reduceMargin': true,
|
|
92
|
+
'setMargin': false,
|
|
93
|
+
'transfer': false,
|
|
94
|
+
'withdraw': true,
|
|
95
|
+
},
|
|
96
|
+
'timeframes': {
|
|
97
|
+
'1m': '1',
|
|
98
|
+
'5m': '5',
|
|
99
|
+
'15m': '15',
|
|
100
|
+
'30m': '30',
|
|
101
|
+
'45m': '45',
|
|
102
|
+
'1h': '60',
|
|
103
|
+
'2h': '120',
|
|
104
|
+
'3h': '180',
|
|
105
|
+
'4h': '240',
|
|
106
|
+
'1d': 'D',
|
|
107
|
+
'1w': 'W',
|
|
108
|
+
'1M': 'M',
|
|
109
|
+
},
|
|
110
|
+
'urls': {
|
|
111
|
+
'logo': 'https://user-images.githubusercontent.com/1294454/27766491-1b0ea956-5eda-11e7-9225-40d67b481b8d.jpg',
|
|
112
|
+
'api': {
|
|
113
|
+
'public': 'https://api.exmo.com',
|
|
114
|
+
'private': 'https://api.exmo.com',
|
|
115
|
+
'web': 'https://exmo.me',
|
|
116
|
+
},
|
|
117
|
+
'www': 'https://exmo.me',
|
|
118
|
+
'referral': 'https://exmo.me/?ref=131685',
|
|
119
|
+
'doc': [
|
|
120
|
+
'https://exmo.me/en/api_doc?ref=131685',
|
|
121
|
+
],
|
|
122
|
+
'fees': 'https://exmo.com/en/docs/fees',
|
|
123
|
+
},
|
|
124
|
+
'api': {
|
|
125
|
+
'web': {
|
|
126
|
+
'get': [
|
|
127
|
+
'ctrl/feesAndLimits',
|
|
128
|
+
'en/docs/fees',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
'public': {
|
|
132
|
+
'get': [
|
|
133
|
+
'currency',
|
|
134
|
+
'currency/list/extended',
|
|
135
|
+
'order_book',
|
|
136
|
+
'pair_settings',
|
|
137
|
+
'ticker',
|
|
138
|
+
'trades',
|
|
139
|
+
'candles_history',
|
|
140
|
+
'required_amount',
|
|
141
|
+
'payments/providers/crypto/list',
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
'private': {
|
|
145
|
+
'post': [
|
|
146
|
+
'user_info',
|
|
147
|
+
'order_create',
|
|
148
|
+
'order_cancel',
|
|
149
|
+
'stop_market_order_create',
|
|
150
|
+
'stop_market_order_cancel',
|
|
151
|
+
'user_open_orders',
|
|
152
|
+
'user_trades',
|
|
153
|
+
'user_cancelled_orders',
|
|
154
|
+
'order_trades',
|
|
155
|
+
'deposit_address',
|
|
156
|
+
'withdraw_crypt',
|
|
157
|
+
'withdraw_get_txid',
|
|
158
|
+
'excode_create',
|
|
159
|
+
'excode_load',
|
|
160
|
+
'code_check',
|
|
161
|
+
'wallet_history',
|
|
162
|
+
'wallet_operations',
|
|
163
|
+
'margin/user/order/create',
|
|
164
|
+
'margin/user/order/update',
|
|
165
|
+
'margin/user/order/cancel',
|
|
166
|
+
'margin/user/position/close',
|
|
167
|
+
'margin/user/position/margin_add',
|
|
168
|
+
'margin/user/position/margin_remove',
|
|
169
|
+
'margin/currency/list',
|
|
170
|
+
'margin/pair/list',
|
|
171
|
+
'margin/settings',
|
|
172
|
+
'margin/funding/list',
|
|
173
|
+
'margin/user/info',
|
|
174
|
+
'margin/user/order/list',
|
|
175
|
+
'margin/user/order/history',
|
|
176
|
+
'margin/user/order/trades',
|
|
177
|
+
'margin/user/order/max_quantity',
|
|
178
|
+
'margin/user/position/list',
|
|
179
|
+
'margin/user/position/margin_remove_info',
|
|
180
|
+
'margin/user/position/margin_add_info',
|
|
181
|
+
'margin/user/wallet/list',
|
|
182
|
+
'margin/user/wallet/history',
|
|
183
|
+
'margin/user/trade/list',
|
|
184
|
+
'margin/trades',
|
|
185
|
+
'margin/liquidation/feed',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
'fees': {
|
|
190
|
+
'trading': {
|
|
191
|
+
'feeSide': 'get',
|
|
192
|
+
'tierBased': true,
|
|
193
|
+
'percentage': true,
|
|
194
|
+
'maker': this.parseNumber('0.004'),
|
|
195
|
+
'taker': this.parseNumber('0.004'),
|
|
196
|
+
},
|
|
197
|
+
'transaction': {
|
|
198
|
+
'tierBased': false,
|
|
199
|
+
'percentage': false, // fixed transaction fees for crypto, see fetchDepositWithdrawFees below
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
'options': {
|
|
203
|
+
'networks': {
|
|
204
|
+
'ETH': 'ERC20',
|
|
205
|
+
'TRX': 'TRC20',
|
|
206
|
+
},
|
|
207
|
+
'fetchTradingFees': {
|
|
208
|
+
'method': 'fetchPrivateTradingFees', // or 'fetchPublicTradingFees'
|
|
209
|
+
},
|
|
210
|
+
'margin': {
|
|
211
|
+
'fillResponseFromRequest': true,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
'features': {
|
|
215
|
+
'spot': {
|
|
216
|
+
'sandbox': false,
|
|
217
|
+
'createOrder': {
|
|
218
|
+
'marginMode': true,
|
|
219
|
+
'triggerPrice': true,
|
|
220
|
+
'triggerPriceType': undefined,
|
|
221
|
+
'triggerDirection': false,
|
|
222
|
+
'stopLossPrice': false,
|
|
223
|
+
'takeProfitPrice': false,
|
|
224
|
+
'attachedStopLossTakeProfit': undefined,
|
|
225
|
+
'timeInForce': {
|
|
226
|
+
'IOC': true,
|
|
227
|
+
'FOK': true,
|
|
228
|
+
'PO': true,
|
|
229
|
+
'GTD': true,
|
|
230
|
+
},
|
|
231
|
+
'hedged': false,
|
|
232
|
+
'selfTradePrevention': false,
|
|
233
|
+
'trailing': false,
|
|
234
|
+
'leverage': true,
|
|
235
|
+
'marketBuyByCost': true,
|
|
236
|
+
'marketBuyRequiresPrice': false,
|
|
237
|
+
'iceberg': false,
|
|
238
|
+
},
|
|
239
|
+
'createOrders': undefined,
|
|
240
|
+
'fetchMyTrades': {
|
|
241
|
+
'marginMode': true,
|
|
242
|
+
'limit': 100,
|
|
243
|
+
'daysBack': undefined,
|
|
244
|
+
'untilDays': undefined,
|
|
245
|
+
'symbolRequired': true,
|
|
246
|
+
},
|
|
247
|
+
'fetchOrder': {
|
|
248
|
+
'marginMode': false,
|
|
249
|
+
'trigger': false,
|
|
250
|
+
'trailing': false,
|
|
251
|
+
'symbolRequired': false,
|
|
252
|
+
},
|
|
253
|
+
'fetchOpenOrders': {
|
|
254
|
+
'marginMode': false,
|
|
255
|
+
'limit': undefined,
|
|
256
|
+
'trigger': false,
|
|
257
|
+
'trailing': false,
|
|
258
|
+
'symbolRequired': false,
|
|
259
|
+
},
|
|
260
|
+
'fetchOrders': undefined,
|
|
261
|
+
'fetchClosedOrders': undefined,
|
|
262
|
+
'fetchOHLCV': {
|
|
263
|
+
'limit': 1000, // todo, not in request
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
'swap': {
|
|
267
|
+
'linear': undefined,
|
|
268
|
+
'inverse': undefined,
|
|
269
|
+
},
|
|
270
|
+
'future': {
|
|
271
|
+
'linear': undefined,
|
|
272
|
+
'inverse': undefined,
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
'commonCurrencies': {
|
|
276
|
+
'GMT': 'GMT Token',
|
|
277
|
+
},
|
|
278
|
+
'precisionMode': TICK_SIZE,
|
|
279
|
+
'exceptions': {
|
|
280
|
+
'exact': {
|
|
281
|
+
'140333': InvalidOrder,
|
|
282
|
+
'140434': BadRequest,
|
|
283
|
+
'40005': AuthenticationError,
|
|
284
|
+
'40009': InvalidNonce,
|
|
285
|
+
'40015': ExchangeError,
|
|
286
|
+
'40016': OnMaintenance,
|
|
287
|
+
'40017': AuthenticationError,
|
|
288
|
+
'40032': PermissionDenied,
|
|
289
|
+
'40033': PermissionDenied,
|
|
290
|
+
'40034': RateLimitExceeded,
|
|
291
|
+
'50052': InsufficientFunds,
|
|
292
|
+
'50054': InsufficientFunds,
|
|
293
|
+
'50304': OrderNotFound,
|
|
294
|
+
'50173': OrderNotFound,
|
|
295
|
+
'50277': InvalidOrder,
|
|
296
|
+
'50319': InvalidOrder,
|
|
297
|
+
'50321': InvalidOrder,
|
|
298
|
+
'50381': InvalidOrder, // {"result":false,"error":"Error 50381: More than 2 decimal places are not permitted for pair BTC_USD"}
|
|
299
|
+
},
|
|
300
|
+
'broad': {
|
|
301
|
+
'range period is too long': BadRequest,
|
|
302
|
+
'invalid syntax': BadRequest,
|
|
303
|
+
'API rate limit exceeded': RateLimitExceeded, // {"result":false,"error":"API rate limit exceeded for x.x.x.x. Retry after 60 sec.","history":[],"begin":1579392000,"end":1579478400}
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async modifyMarginHelper(symbol, amount, type, params = {}) {
|
|
309
|
+
await this.loadMarkets();
|
|
310
|
+
const market = this.market(symbol);
|
|
311
|
+
const request = {
|
|
312
|
+
'position_id': market['id'],
|
|
313
|
+
'quantity': amount,
|
|
314
|
+
};
|
|
315
|
+
let response = undefined;
|
|
316
|
+
if (type === 'add') {
|
|
317
|
+
response = await this.privatePostMarginUserPositionMarginAdd(this.extend(request, params));
|
|
318
|
+
}
|
|
319
|
+
else if (type === 'reduce') {
|
|
320
|
+
response = await this.privatePostMarginUserPositionMarginRemove(this.extend(request, params));
|
|
321
|
+
}
|
|
322
|
+
//
|
|
323
|
+
// {}
|
|
324
|
+
//
|
|
325
|
+
const margin = this.parseMarginModification(response, market);
|
|
326
|
+
const options = this.safeValue(this.options, 'margin', {});
|
|
327
|
+
const fillResponseFromRequest = this.safeBool(options, 'fillResponseFromRequest', true);
|
|
328
|
+
if (fillResponseFromRequest) {
|
|
329
|
+
margin['type'] = type;
|
|
330
|
+
margin['amount'] = amount;
|
|
331
|
+
}
|
|
332
|
+
return margin;
|
|
333
|
+
}
|
|
334
|
+
parseMarginModification(data, market = undefined) {
|
|
335
|
+
//
|
|
336
|
+
// {}
|
|
337
|
+
//
|
|
338
|
+
return {
|
|
339
|
+
'info': data,
|
|
340
|
+
'symbol': this.safeSymbol(undefined, market),
|
|
341
|
+
'type': undefined,
|
|
342
|
+
'marginMode': 'isolated',
|
|
343
|
+
'amount': undefined,
|
|
344
|
+
'total': undefined,
|
|
345
|
+
'code': this.safeValue(market, 'quote'),
|
|
346
|
+
'status': 'ok',
|
|
347
|
+
'timestamp': undefined,
|
|
348
|
+
'datetime': undefined,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* @method
|
|
353
|
+
* @name exmo#reduceMargin
|
|
354
|
+
* @description remove margin from a position
|
|
355
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#eebf9f25-0289-4946-9482-89872c738449
|
|
356
|
+
* @param {string} symbol unified market symbol
|
|
357
|
+
* @param {float} amount the amount of margin to remove
|
|
358
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
359
|
+
* @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=reduce-margin-structure}
|
|
360
|
+
*/
|
|
361
|
+
async reduceMargin(symbol, amount, params = {}) {
|
|
362
|
+
return await this.modifyMarginHelper(symbol, amount, 'reduce', params);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* @method
|
|
366
|
+
* @name exmo#addMargin
|
|
367
|
+
* @description add margin
|
|
368
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#143ef808-79ca-4e49-9e79-a60ea4d8c0e3
|
|
369
|
+
* @param {string} symbol unified market symbol
|
|
370
|
+
* @param {float} amount amount of margin to add
|
|
371
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
372
|
+
* @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=add-margin-structure}
|
|
373
|
+
*/
|
|
374
|
+
async addMargin(symbol, amount, params = {}) {
|
|
375
|
+
return await this.modifyMarginHelper(symbol, amount, 'add', params);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* @method
|
|
379
|
+
* @name exmo#fetchTradingFees
|
|
380
|
+
* @description fetch the trading fees for multiple markets
|
|
381
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#90927062-256c-4b03-900f-2b99131f9a54
|
|
382
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
|
|
383
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
384
|
+
* @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
|
|
385
|
+
*/
|
|
386
|
+
async fetchTradingFees(params = {}) {
|
|
387
|
+
const options = this.safeValue(this.options, 'fetchTradingFees', {});
|
|
388
|
+
const defaultMethod = this.safeString(options, 'method', 'fetchPrivateTradingFees');
|
|
389
|
+
const method = this.safeString(params, 'method', defaultMethod);
|
|
390
|
+
params = this.omit(params, 'method');
|
|
391
|
+
if (method === 'fetchPrivateTradingFees') {
|
|
392
|
+
return await this.fetchPrivateTradingFees(params);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
return await this.fetchPublicTradingFees(params);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
async fetchPrivateTradingFees(params = {}) {
|
|
399
|
+
await this.loadMarkets();
|
|
400
|
+
const response = await this.privatePostMarginPairList(params);
|
|
401
|
+
//
|
|
402
|
+
// {
|
|
403
|
+
// "pairs": [{
|
|
404
|
+
// "name": "EXM_USD",
|
|
405
|
+
// "buy_price": "0.02728391",
|
|
406
|
+
// "sell_price": "0.0276",
|
|
407
|
+
// "last_trade_price": "0.0276",
|
|
408
|
+
// "ticker_updated": "1646956050056696046",
|
|
409
|
+
// "is_fair_price": true,
|
|
410
|
+
// "max_price_precision": "8",
|
|
411
|
+
// "min_order_quantity": "1",
|
|
412
|
+
// "max_order_quantity": "50000",
|
|
413
|
+
// "min_order_price": "0.00000001",
|
|
414
|
+
// "max_order_price": "1000",
|
|
415
|
+
// "max_position_quantity": "50000",
|
|
416
|
+
// "trade_taker_fee": "0.05",
|
|
417
|
+
// "trade_maker_fee": "0",
|
|
418
|
+
// "liquidation_fee": "0.5",
|
|
419
|
+
// "max_leverage": "3",
|
|
420
|
+
// "default_leverage": "3",
|
|
421
|
+
// "liquidation_level": "5",
|
|
422
|
+
// "margin_call_level": "7.5",
|
|
423
|
+
// "position": "1",
|
|
424
|
+
// "updated": "1638976144797807397"
|
|
425
|
+
// }
|
|
426
|
+
// ...
|
|
427
|
+
// ]
|
|
428
|
+
// }
|
|
429
|
+
//
|
|
430
|
+
const pairs = this.safeValue(response, 'pairs', []);
|
|
431
|
+
const result = {};
|
|
432
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
433
|
+
const pair = pairs[i];
|
|
434
|
+
const marketId = this.safeString(pair, 'name');
|
|
435
|
+
const symbol = this.safeSymbol(marketId, undefined, '_');
|
|
436
|
+
const makerString = this.safeString(pair, 'trade_maker_fee');
|
|
437
|
+
const takerString = this.safeString(pair, 'trade_taker_fee');
|
|
438
|
+
const maker = this.parseNumber(Precise.stringDiv(makerString, '100'));
|
|
439
|
+
const taker = this.parseNumber(Precise.stringDiv(takerString, '100'));
|
|
440
|
+
result[symbol] = {
|
|
441
|
+
'info': pair,
|
|
442
|
+
'symbol': symbol,
|
|
443
|
+
'maker': maker,
|
|
444
|
+
'taker': taker,
|
|
445
|
+
'percentage': true,
|
|
446
|
+
'tierBased': true,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
return result;
|
|
450
|
+
}
|
|
451
|
+
async fetchPublicTradingFees(params = {}) {
|
|
452
|
+
await this.loadMarkets();
|
|
453
|
+
const response = await this.publicGetPairSettings(params);
|
|
454
|
+
//
|
|
455
|
+
// {
|
|
456
|
+
// "BTC_USD": {
|
|
457
|
+
// "min_quantity": "0.00002",
|
|
458
|
+
// "max_quantity": "1000",
|
|
459
|
+
// "min_price": "1",
|
|
460
|
+
// "max_price": "150000",
|
|
461
|
+
// "max_amount": "500000",
|
|
462
|
+
// "min_amount": "1",
|
|
463
|
+
// "price_precision": "2",
|
|
464
|
+
// "commission_taker_percent": "0.3",
|
|
465
|
+
// "commission_maker_percent": "0.3"
|
|
466
|
+
// },
|
|
467
|
+
// }
|
|
468
|
+
//
|
|
469
|
+
const result = {};
|
|
470
|
+
for (let i = 0; i < this.symbols.length; i++) {
|
|
471
|
+
const symbol = this.symbols[i];
|
|
472
|
+
const market = this.market(symbol);
|
|
473
|
+
const fee = this.safeValue(response, market['id'], {});
|
|
474
|
+
const makerString = this.safeString(fee, 'commission_maker_percent');
|
|
475
|
+
const takerString = this.safeString(fee, 'commission_taker_percent');
|
|
476
|
+
const maker = this.parseNumber(Precise.stringDiv(makerString, '100'));
|
|
477
|
+
const taker = this.parseNumber(Precise.stringDiv(takerString, '100'));
|
|
478
|
+
result[symbol] = {
|
|
479
|
+
'info': fee,
|
|
480
|
+
'symbol': symbol,
|
|
481
|
+
'maker': maker,
|
|
482
|
+
'taker': taker,
|
|
483
|
+
'percentage': true,
|
|
484
|
+
'tierBased': true,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
return result;
|
|
488
|
+
}
|
|
489
|
+
parseFixedFloatValue(input) {
|
|
490
|
+
if ((input === undefined) || (input === '-')) {
|
|
491
|
+
return undefined;
|
|
492
|
+
}
|
|
493
|
+
if (input === '') {
|
|
494
|
+
return 0;
|
|
495
|
+
}
|
|
496
|
+
const isPercentage = (input.indexOf('%') >= 0);
|
|
497
|
+
const parts = input.split(' ');
|
|
498
|
+
const value = parts[0].replace('%', '');
|
|
499
|
+
const result = parseFloat(value);
|
|
500
|
+
if ((result > 0) && isPercentage) {
|
|
501
|
+
throw new ExchangeError(this.id + ' parseFixedFloatValue() detected an unsupported non-zero percentage-based fee ' + input);
|
|
502
|
+
}
|
|
503
|
+
return result;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* @method
|
|
507
|
+
* @name exmo#fetchTransactionFees
|
|
508
|
+
* @deprecated
|
|
509
|
+
* @description please use fetchDepositWithdrawFees instead
|
|
510
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
|
|
511
|
+
* @param {string[]|undefined} codes list of unified currency codes
|
|
512
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
513
|
+
* @returns {object} a list of [transaction fees structures]{@link https://docs.ccxt.com/#/?id=fees-structure}
|
|
514
|
+
*/
|
|
515
|
+
async fetchTransactionFees(codes = undefined, params = {}) {
|
|
516
|
+
await this.loadMarkets();
|
|
517
|
+
const cryptoList = await this.publicGetPaymentsProvidersCryptoList(params);
|
|
518
|
+
//
|
|
519
|
+
// {
|
|
520
|
+
// "BTC":[
|
|
521
|
+
// { "type":"deposit", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
|
|
522
|
+
// { "type":"withdraw", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"350", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.0005 BTC", "currency_confirmations":6 }
|
|
523
|
+
// ],
|
|
524
|
+
// "ETH":[
|
|
525
|
+
// { "type":"withdraw", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"500", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.004 ETH", "currency_confirmations":4 },
|
|
526
|
+
// { "type":"deposit", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.01 ETH. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 }
|
|
527
|
+
// ],
|
|
528
|
+
// "USDT":[
|
|
529
|
+
// { "type":"deposit", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":false,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
|
|
530
|
+
// { "type":"withdraw", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":false,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"5 USDT", "currency_confirmations":6 },
|
|
531
|
+
// { "type":"deposit", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
|
|
532
|
+
// {
|
|
533
|
+
// "type":"withdraw",
|
|
534
|
+
// "name":"USDT (ERC20)",
|
|
535
|
+
// "currency_name":"USDT",
|
|
536
|
+
// "min":"55",
|
|
537
|
+
// "max":"200000",
|
|
538
|
+
// "enabled":true,
|
|
539
|
+
// "comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Recommendation: Due to the high load of ERC20 network, using TRC20 address for withdrawal is recommended.",
|
|
540
|
+
// "commission_desc":"10 USDT",
|
|
541
|
+
// "currency_confirmations":6
|
|
542
|
+
// },
|
|
543
|
+
// { "type":"deposit", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":true,"comment":"Minimum deposit amount is 10 USDT. Only TRON main network supported", "commission_desc":"0%", "currency_confirmations":2 },
|
|
544
|
+
// { "type":"withdraw", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"150000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Only TRON main network supported.", "commission_desc":"1 USDT", "currency_confirmations":6 }
|
|
545
|
+
// ],
|
|
546
|
+
// "XLM":[
|
|
547
|
+
// { "type":"deposit", "name":"XLM", "currency_name":"XLM", "min":"1", "max":"1000000", "enabled":true,"comment":"Attention! A deposit without memo(invoice) will not be credited. Minimum deposit amount is 1 XLM. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
|
|
548
|
+
// { "type":"withdraw", "name":"XLM", "currency_name":"XLM", "min":"21", "max":"1000000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales.", "commission_desc":"0.01 XLM", "currency_confirmations":1 }
|
|
549
|
+
// ],
|
|
550
|
+
// }
|
|
551
|
+
//
|
|
552
|
+
const result = {};
|
|
553
|
+
const cryptoListKeys = Object.keys(cryptoList);
|
|
554
|
+
for (let i = 0; i < cryptoListKeys.length; i++) {
|
|
555
|
+
const code = cryptoListKeys[i];
|
|
556
|
+
if (codes !== undefined && !this.inArray(code, codes)) {
|
|
557
|
+
continue;
|
|
558
|
+
}
|
|
559
|
+
result[code] = {
|
|
560
|
+
'deposit': undefined,
|
|
561
|
+
'withdraw': undefined,
|
|
562
|
+
};
|
|
563
|
+
const currency = this.currency(code);
|
|
564
|
+
const currencyId = this.safeString(currency, 'id');
|
|
565
|
+
const providers = this.safeValue(cryptoList, currencyId, []);
|
|
566
|
+
for (let j = 0; j < providers.length; j++) {
|
|
567
|
+
const provider = providers[j];
|
|
568
|
+
const typeInner = this.safeString(provider, 'type');
|
|
569
|
+
const commissionDesc = this.safeString(provider, 'commission_desc');
|
|
570
|
+
const fee = this.parseFixedFloatValue(commissionDesc);
|
|
571
|
+
result[code][typeInner] = fee;
|
|
572
|
+
}
|
|
573
|
+
result[code]['info'] = providers;
|
|
574
|
+
}
|
|
575
|
+
// cache them for later use
|
|
576
|
+
this.options['transactionFees'] = result;
|
|
577
|
+
return result;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* @method
|
|
581
|
+
* @name exmo#fetchDepositWithdrawFees
|
|
582
|
+
* @description fetch deposit and withdraw fees
|
|
583
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
|
|
584
|
+
* @param {string[]|undefined} codes list of unified currency codes
|
|
585
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
586
|
+
* @returns {object} a list of [transaction fees structures]{@link https://docs.ccxt.com/#/?id=fees-structure}
|
|
587
|
+
*/
|
|
588
|
+
async fetchDepositWithdrawFees(codes = undefined, params = {}) {
|
|
589
|
+
await this.loadMarkets();
|
|
590
|
+
const response = await this.publicGetPaymentsProvidersCryptoList(params);
|
|
591
|
+
//
|
|
592
|
+
// {
|
|
593
|
+
// "USDT": [
|
|
594
|
+
// {
|
|
595
|
+
// "type": "deposit", // or "withdraw"
|
|
596
|
+
// "name": "USDT (ERC20)",
|
|
597
|
+
// "currency_name": "USDT",
|
|
598
|
+
// "min": "10",
|
|
599
|
+
// "max": "0",
|
|
600
|
+
// "enabled": true,
|
|
601
|
+
// "comment": "Minimum deposit amount is 10 USDT",
|
|
602
|
+
// "commission_desc": "0%",
|
|
603
|
+
// "currency_confirmations": 2
|
|
604
|
+
// },
|
|
605
|
+
// ...
|
|
606
|
+
// ],
|
|
607
|
+
// ...
|
|
608
|
+
// }
|
|
609
|
+
//
|
|
610
|
+
const result = this.parseDepositWithdrawFees(response, codes);
|
|
611
|
+
// cache them for later use
|
|
612
|
+
this.options['transactionFees'] = result;
|
|
613
|
+
return result;
|
|
614
|
+
}
|
|
615
|
+
parseDepositWithdrawFee(fee, currency = undefined) {
|
|
616
|
+
//
|
|
617
|
+
// [
|
|
618
|
+
// {
|
|
619
|
+
// "type": "deposit", // or "withdraw"
|
|
620
|
+
// "name": "BTC",
|
|
621
|
+
// "currency_name": "BTC",
|
|
622
|
+
// "min": "0.001",
|
|
623
|
+
// "max": "0",
|
|
624
|
+
// "enabled": true,
|
|
625
|
+
// "comment": "Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds",
|
|
626
|
+
// "commission_desc": "0%",
|
|
627
|
+
// "currency_confirmations": 1
|
|
628
|
+
// },
|
|
629
|
+
// ...
|
|
630
|
+
// ]
|
|
631
|
+
//
|
|
632
|
+
const result = this.depositWithdrawFee(fee);
|
|
633
|
+
for (let i = 0; i < fee.length; i++) {
|
|
634
|
+
const provider = fee[i];
|
|
635
|
+
const type = this.safeString(provider, 'type');
|
|
636
|
+
const networkId = this.safeString(provider, 'name');
|
|
637
|
+
const networkCode = this.networkIdToCode(networkId, this.safeString(currency, 'code'));
|
|
638
|
+
const commissionDesc = this.safeString(provider, 'commission_desc');
|
|
639
|
+
let splitCommissionDesc = [];
|
|
640
|
+
let percentage = undefined;
|
|
641
|
+
if (commissionDesc !== undefined) {
|
|
642
|
+
splitCommissionDesc = commissionDesc.split('%');
|
|
643
|
+
const splitCommissionDescLength = splitCommissionDesc.length;
|
|
644
|
+
percentage = splitCommissionDescLength >= 2;
|
|
645
|
+
}
|
|
646
|
+
const network = this.safeValue(result['networks'], networkCode);
|
|
647
|
+
if (network === undefined) {
|
|
648
|
+
result['networks'][networkCode] = {
|
|
649
|
+
'withdraw': {
|
|
650
|
+
'fee': undefined,
|
|
651
|
+
'percentage': undefined,
|
|
652
|
+
},
|
|
653
|
+
'deposit': {
|
|
654
|
+
'fee': undefined,
|
|
655
|
+
'percentage': undefined,
|
|
656
|
+
},
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
result['networks'][networkCode][type] = {
|
|
660
|
+
'fee': this.parseFixedFloatValue(this.safeString(splitCommissionDesc, 0)),
|
|
661
|
+
'percentage': percentage,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
return this.assignDefaultDepositWithdrawFees(result);
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* @method
|
|
668
|
+
* @name exmo#fetchCurrencies
|
|
669
|
+
* @description fetches all available currencies on an exchange
|
|
670
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7cdf0ca8-9ff6-4cf3-aa33-bcec83155c49
|
|
671
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
|
|
672
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
673
|
+
* @returns {object} an associative dictionary of currencies
|
|
674
|
+
*/
|
|
675
|
+
async fetchCurrencies(params = {}) {
|
|
676
|
+
const promises = [];
|
|
677
|
+
//
|
|
678
|
+
promises.push(this.publicGetCurrencyListExtended(params));
|
|
679
|
+
//
|
|
680
|
+
// [
|
|
681
|
+
// {"name":"VLX","description":"Velas"},
|
|
682
|
+
// {"name":"RUB","description":"Russian Ruble"},
|
|
683
|
+
// {"name":"BTC","description":"Bitcoin"},
|
|
684
|
+
// {"name":"USD","description":"US Dollar"}
|
|
685
|
+
// ]
|
|
686
|
+
//
|
|
687
|
+
promises.push(this.publicGetPaymentsProvidersCryptoList(params));
|
|
688
|
+
//
|
|
689
|
+
// {
|
|
690
|
+
// "BTC":[
|
|
691
|
+
// { "type":"deposit", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
|
|
692
|
+
// { "type":"withdraw", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"350", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.0005 BTC", "currency_confirmations":6 }
|
|
693
|
+
// ],
|
|
694
|
+
// "ETH":[
|
|
695
|
+
// { "type":"withdraw", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"500", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.004 ETH", "currency_confirmations":4 },
|
|
696
|
+
// { "type":"deposit", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.01 ETH. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 }
|
|
697
|
+
// ],
|
|
698
|
+
// "USDT":[
|
|
699
|
+
// { "type":"deposit", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":false,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
|
|
700
|
+
// { "type":"withdraw", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":false,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"5 USDT", "currency_confirmations":6 },
|
|
701
|
+
// { "type":"deposit", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
|
|
702
|
+
// { "type":"withdraw", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"55", "max":"200000", "enabled":true, "comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Recommendation: Due to the high load of ERC20 network, using TRC20 address for withdrawal is recommended.", "commission_desc":"10 USDT", "currency_confirmations":6 },
|
|
703
|
+
// { "type":"deposit", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":true,"comment":"Minimum deposit amount is 10 USDT. Only TRON main network supported", "commission_desc":"0%", "currency_confirmations":2 },
|
|
704
|
+
// { "type":"withdraw", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"150000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Only TRON main network supported.", "commission_desc":"1 USDT", "currency_confirmations":6 }
|
|
705
|
+
// ],
|
|
706
|
+
// "XLM":[
|
|
707
|
+
// { "type":"deposit", "name":"XLM", "currency_name":"XLM", "min":"1", "max":"1000000", "enabled":true,"comment":"Attention! A deposit without memo(invoice) will not be credited. Minimum deposit amount is 1 XLM. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
|
|
708
|
+
// { "type":"withdraw", "name":"XLM", "currency_name":"XLM", "min":"21", "max":"1000000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales.", "commission_desc":"0.01 XLM", "currency_confirmations":1 }
|
|
709
|
+
// ],
|
|
710
|
+
// }
|
|
711
|
+
//
|
|
712
|
+
const responses = await Promise.all(promises);
|
|
713
|
+
const currencyList = responses[0];
|
|
714
|
+
const cryptoList = responses[1];
|
|
715
|
+
const result = {};
|
|
716
|
+
for (let i = 0; i < currencyList.length; i++) {
|
|
717
|
+
const currency = currencyList[i];
|
|
718
|
+
const currencyId = this.safeString(currency, 'name');
|
|
719
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
720
|
+
let type = 'crypto';
|
|
721
|
+
const networks = {};
|
|
722
|
+
const providers = this.safeList(cryptoList, currencyId);
|
|
723
|
+
if (providers === undefined) {
|
|
724
|
+
type = 'fiat';
|
|
725
|
+
}
|
|
726
|
+
else {
|
|
727
|
+
for (let j = 0; j < providers.length; j++) {
|
|
728
|
+
const provider = providers[j];
|
|
729
|
+
const name = this.safeString(provider, 'name');
|
|
730
|
+
// get network-id by removing extra things
|
|
731
|
+
let networkId = name.replace(currencyId + ' ', '');
|
|
732
|
+
networkId = networkId.replace('(', '');
|
|
733
|
+
const replaceChar = ')'; // transpiler trick
|
|
734
|
+
networkId = networkId.replace(replaceChar, '');
|
|
735
|
+
const networkCode = this.networkIdToCode(networkId);
|
|
736
|
+
if (!(networkCode in networks)) {
|
|
737
|
+
networks[networkCode] = {
|
|
738
|
+
'id': networkId,
|
|
739
|
+
'network': networkCode,
|
|
740
|
+
'active': undefined,
|
|
741
|
+
'deposit': undefined,
|
|
742
|
+
'withdraw': undefined,
|
|
743
|
+
'fee': undefined,
|
|
744
|
+
'limits': {
|
|
745
|
+
'withdraw': {
|
|
746
|
+
'min': undefined,
|
|
747
|
+
'max': undefined,
|
|
748
|
+
},
|
|
749
|
+
'deposit': {
|
|
750
|
+
'min': undefined,
|
|
751
|
+
'max': undefined,
|
|
752
|
+
},
|
|
753
|
+
},
|
|
754
|
+
'info': [], // set as array, because of multiple network sub-entries
|
|
755
|
+
};
|
|
756
|
+
}
|
|
757
|
+
const typeInner = this.safeString(provider, 'type');
|
|
758
|
+
const minValue = this.safeString(provider, 'min');
|
|
759
|
+
const maxValue = this.safeString(provider, 'max');
|
|
760
|
+
const activeProvider = this.safeBool(provider, 'enabled');
|
|
761
|
+
const networkEntry = networks[networkCode];
|
|
762
|
+
if (typeInner === 'deposit') {
|
|
763
|
+
networkEntry['deposit'] = activeProvider;
|
|
764
|
+
networkEntry['limits']['deposit']['min'] = minValue;
|
|
765
|
+
networkEntry['limits']['deposit']['max'] = maxValue;
|
|
766
|
+
}
|
|
767
|
+
else if (typeInner === 'withdraw') {
|
|
768
|
+
networkEntry['withdraw'] = activeProvider;
|
|
769
|
+
networkEntry['limits']['withdraw']['min'] = minValue;
|
|
770
|
+
networkEntry['limits']['withdraw']['max'] = maxValue;
|
|
771
|
+
}
|
|
772
|
+
const info = this.safeList(networkEntry, 'info');
|
|
773
|
+
info.push(provider);
|
|
774
|
+
networkEntry['info'] = info;
|
|
775
|
+
networks[networkCode] = networkEntry;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
result[code] = this.safeCurrencyStructure({
|
|
779
|
+
'id': currencyId,
|
|
780
|
+
'code': code,
|
|
781
|
+
'name': this.safeString(currency, 'description'),
|
|
782
|
+
'type': type,
|
|
783
|
+
'active': undefined,
|
|
784
|
+
'deposit': undefined,
|
|
785
|
+
'withdraw': undefined,
|
|
786
|
+
'fee': undefined,
|
|
787
|
+
'precision': this.parseNumber('1e-8'),
|
|
788
|
+
'limits': {
|
|
789
|
+
'withdraw': {
|
|
790
|
+
'min': undefined,
|
|
791
|
+
'max': undefined,
|
|
792
|
+
},
|
|
793
|
+
'deposit': {
|
|
794
|
+
'min': undefined,
|
|
795
|
+
'max': undefined,
|
|
796
|
+
},
|
|
797
|
+
},
|
|
798
|
+
'info': {
|
|
799
|
+
'currency': currency,
|
|
800
|
+
'providers': providers,
|
|
801
|
+
},
|
|
802
|
+
'networks': networks,
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
return result;
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* @method
|
|
809
|
+
* @name exmo#fetchMarkets
|
|
810
|
+
* @description retrieves data on all markets for exmo
|
|
811
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
|
|
812
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
813
|
+
* @returns {object[]} an array of objects representing market data
|
|
814
|
+
*/
|
|
815
|
+
async fetchMarkets(params = {}) {
|
|
816
|
+
const promises = [];
|
|
817
|
+
promises.push(this.publicGetPairSettings(params));
|
|
818
|
+
//
|
|
819
|
+
// {
|
|
820
|
+
// "BTC_USD":{
|
|
821
|
+
// "min_quantity":"0.0001",
|
|
822
|
+
// "max_quantity":"1000",
|
|
823
|
+
// "min_price":"1",
|
|
824
|
+
// "max_price":"30000",
|
|
825
|
+
// "max_amount":"500000",
|
|
826
|
+
// "min_amount":"1",
|
|
827
|
+
// "price_precision":8,
|
|
828
|
+
// "commission_taker_percent":"0.4",
|
|
829
|
+
// "commission_maker_percent":"0.4"
|
|
830
|
+
// },
|
|
831
|
+
// }
|
|
832
|
+
//
|
|
833
|
+
let marginPairsDict = {};
|
|
834
|
+
const fetchMargin = this.checkRequiredCredentials(false);
|
|
835
|
+
if (fetchMargin) {
|
|
836
|
+
promises.push(this.privatePostMarginPairList(params));
|
|
837
|
+
//
|
|
838
|
+
// {
|
|
839
|
+
// "pairs": [
|
|
840
|
+
// {
|
|
841
|
+
// "buy_price": "55978.85",
|
|
842
|
+
// "default_leverage": "3",
|
|
843
|
+
// "is_fair_price": true,
|
|
844
|
+
// "last_trade_price": "55999.23",
|
|
845
|
+
// "liquidation_fee": "2",
|
|
846
|
+
// "liquidation_level": "10",
|
|
847
|
+
// "margin_call_level": "15",
|
|
848
|
+
// "max_leverage": "3",
|
|
849
|
+
// "max_order_price": "150000",
|
|
850
|
+
// "max_order_quantity": "1",
|
|
851
|
+
// "max_position_quantity": "1",
|
|
852
|
+
// "max_price_precision": 2,
|
|
853
|
+
// "min_order_price": "1",
|
|
854
|
+
// "min_order_quantity": "0.00002",
|
|
855
|
+
// "name": "BTC_USD",
|
|
856
|
+
// "position": 1,
|
|
857
|
+
// "sell_price": "55985.51",
|
|
858
|
+
// "ticker_updated": "1619019818936107989",
|
|
859
|
+
// "trade_maker_fee": "0",
|
|
860
|
+
// "trade_taker_fee": "0.05",
|
|
861
|
+
// "updated": "1619008608955599013"
|
|
862
|
+
// }
|
|
863
|
+
// ]
|
|
864
|
+
// }
|
|
865
|
+
//
|
|
866
|
+
}
|
|
867
|
+
const responses = await Promise.all(promises);
|
|
868
|
+
const spotResponse = responses[0];
|
|
869
|
+
if (fetchMargin) {
|
|
870
|
+
const marginPairs = responses[1];
|
|
871
|
+
const pairs = this.safeList(marginPairs, 'pairs');
|
|
872
|
+
marginPairsDict = this.indexBy(pairs, 'name');
|
|
873
|
+
}
|
|
874
|
+
const keys = Object.keys(spotResponse);
|
|
875
|
+
const result = [];
|
|
876
|
+
for (let i = 0; i < keys.length; i++) {
|
|
877
|
+
const id = keys[i];
|
|
878
|
+
const market = spotResponse[id];
|
|
879
|
+
const marginMarket = this.safeDict(marginPairsDict, id);
|
|
880
|
+
const symbol = id.replace('_', '/');
|
|
881
|
+
const [baseId, quoteId] = symbol.split('/');
|
|
882
|
+
const base = this.safeCurrencyCode(baseId);
|
|
883
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
884
|
+
const takerString = this.safeString(market, 'commission_taker_percent');
|
|
885
|
+
const makerString = this.safeString(market, 'commission_maker_percent');
|
|
886
|
+
const maxQuantity = this.safeString(market, 'max_quantity');
|
|
887
|
+
const marginMaxQuantity = this.safeString(marginMarket, 'max_order_quantity');
|
|
888
|
+
result.push({
|
|
889
|
+
'id': id,
|
|
890
|
+
'symbol': symbol,
|
|
891
|
+
'base': base,
|
|
892
|
+
'quote': quote,
|
|
893
|
+
'settle': undefined,
|
|
894
|
+
'baseId': baseId,
|
|
895
|
+
'quoteId': quoteId,
|
|
896
|
+
'settleId': undefined,
|
|
897
|
+
'type': 'spot',
|
|
898
|
+
'spot': true,
|
|
899
|
+
'margin': marginMarket !== undefined,
|
|
900
|
+
'swap': false,
|
|
901
|
+
'future': false,
|
|
902
|
+
'option': false,
|
|
903
|
+
'active': undefined,
|
|
904
|
+
'contract': false,
|
|
905
|
+
'linear': undefined,
|
|
906
|
+
'inverse': undefined,
|
|
907
|
+
'taker': this.parseNumber(Precise.stringDiv(takerString, '100')),
|
|
908
|
+
'maker': this.parseNumber(Precise.stringDiv(makerString, '100')),
|
|
909
|
+
'contractSize': undefined,
|
|
910
|
+
'expiry': undefined,
|
|
911
|
+
'expiryDatetime': undefined,
|
|
912
|
+
'strike': undefined,
|
|
913
|
+
'optionType': undefined,
|
|
914
|
+
'precision': {
|
|
915
|
+
'amount': this.parseNumber('1e-8'),
|
|
916
|
+
'price': this.parseNumber(this.parsePrecision(this.safeString(market, 'price_precision'))),
|
|
917
|
+
},
|
|
918
|
+
'limits': {
|
|
919
|
+
'leverage': {
|
|
920
|
+
'min': undefined,
|
|
921
|
+
'max': this.safeNumber(market, 'leverage'),
|
|
922
|
+
},
|
|
923
|
+
'amount': {
|
|
924
|
+
'min': this.safeNumber(market, 'min_quantity'),
|
|
925
|
+
'max': this.parseNumber(Precise.stringMax(maxQuantity, marginMaxQuantity)),
|
|
926
|
+
},
|
|
927
|
+
'price': {
|
|
928
|
+
'min': this.safeNumber(market, 'min_price'),
|
|
929
|
+
'max': this.safeNumber(market, 'max_price'),
|
|
930
|
+
},
|
|
931
|
+
'cost': {
|
|
932
|
+
'min': this.safeNumber(market, 'min_amount'),
|
|
933
|
+
'max': this.safeNumber(market, 'max_amount'),
|
|
934
|
+
},
|
|
935
|
+
},
|
|
936
|
+
'created': undefined,
|
|
937
|
+
'info': market,
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
return result;
|
|
941
|
+
}
|
|
942
|
+
/**
|
|
943
|
+
* @method
|
|
944
|
+
* @name exmo#fetchOHLCV
|
|
945
|
+
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
946
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#65eeb949-74e5-4631-9184-c38387fe53e8
|
|
947
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
948
|
+
* @param {string} timeframe the length of time each candle represents
|
|
949
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
950
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
951
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
952
|
+
* @param {int} [params.until] timestamp in ms of the latest candle to fetch
|
|
953
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
954
|
+
*/
|
|
955
|
+
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
956
|
+
await this.loadMarkets();
|
|
957
|
+
const market = this.market(symbol);
|
|
958
|
+
const until = this.safeIntegerProduct(params, 'until', 0.001);
|
|
959
|
+
const untilIsDefined = (until !== undefined);
|
|
960
|
+
const request = {
|
|
961
|
+
'symbol': market['id'],
|
|
962
|
+
'resolution': this.safeString(this.timeframes, timeframe, timeframe),
|
|
963
|
+
};
|
|
964
|
+
const maxLimit = 3000;
|
|
965
|
+
const duration = this.parseTimeframe(timeframe);
|
|
966
|
+
const now = this.parseToInt(this.milliseconds() / 1000);
|
|
967
|
+
if (since === undefined) {
|
|
968
|
+
const to = untilIsDefined ? Math.min(until, now) : now;
|
|
969
|
+
if (limit === undefined) {
|
|
970
|
+
limit = 1000; // cap default at generous amount
|
|
971
|
+
}
|
|
972
|
+
else {
|
|
973
|
+
limit = Math.min(limit, maxLimit);
|
|
974
|
+
}
|
|
975
|
+
request['from'] = to - (limit * duration) - 1;
|
|
976
|
+
request['to'] = to;
|
|
977
|
+
}
|
|
978
|
+
else {
|
|
979
|
+
request['from'] = this.parseToInt(since / 1000);
|
|
980
|
+
if (untilIsDefined) {
|
|
981
|
+
request['to'] = Math.min(until, now);
|
|
982
|
+
}
|
|
983
|
+
else {
|
|
984
|
+
if (limit === undefined) {
|
|
985
|
+
limit = maxLimit;
|
|
986
|
+
}
|
|
987
|
+
else {
|
|
988
|
+
limit = Math.min(limit, maxLimit);
|
|
989
|
+
}
|
|
990
|
+
const to = this.sum(since, limit * duration);
|
|
991
|
+
request['to'] = Math.min(to, now);
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
params = this.omit(params, 'until');
|
|
995
|
+
const response = await this.publicGetCandlesHistory(this.extend(request, params));
|
|
996
|
+
//
|
|
997
|
+
// {
|
|
998
|
+
// "candles":[
|
|
999
|
+
// {"t":1584057600000,"o":0.02235144,"c":0.02400233,"h":0.025171,"l":0.02221,"v":5988.34031761},
|
|
1000
|
+
// {"t":1584144000000,"o":0.0240373,"c":0.02367413,"h":0.024399,"l":0.0235,"v":2027.82522329},
|
|
1001
|
+
// {"t":1584230400000,"o":0.02363458,"c":0.02319242,"h":0.0237948,"l":0.02223196,"v":1707.96944997},
|
|
1002
|
+
// ]
|
|
1003
|
+
// }
|
|
1004
|
+
//
|
|
1005
|
+
const candles = this.safeList(response, 'candles', []);
|
|
1006
|
+
return this.parseOHLCVs(candles, market, timeframe, since, limit);
|
|
1007
|
+
}
|
|
1008
|
+
parseOHLCV(ohlcv, market = undefined) {
|
|
1009
|
+
//
|
|
1010
|
+
// {
|
|
1011
|
+
// "t":1584057600000,
|
|
1012
|
+
// "o":0.02235144,
|
|
1013
|
+
// "c":0.02400233,
|
|
1014
|
+
// "h":0.025171,
|
|
1015
|
+
// "l":0.02221,
|
|
1016
|
+
// "v":5988.34031761
|
|
1017
|
+
// }
|
|
1018
|
+
//
|
|
1019
|
+
return [
|
|
1020
|
+
this.safeInteger(ohlcv, 't'),
|
|
1021
|
+
this.safeNumber(ohlcv, 'o'),
|
|
1022
|
+
this.safeNumber(ohlcv, 'h'),
|
|
1023
|
+
this.safeNumber(ohlcv, 'l'),
|
|
1024
|
+
this.safeNumber(ohlcv, 'c'),
|
|
1025
|
+
this.safeNumber(ohlcv, 'v'),
|
|
1026
|
+
];
|
|
1027
|
+
}
|
|
1028
|
+
parseBalance(response) {
|
|
1029
|
+
const result = { 'info': response };
|
|
1030
|
+
const wallets = this.safeValue(response, 'wallets');
|
|
1031
|
+
if (wallets !== undefined) {
|
|
1032
|
+
const currencyIds = Object.keys(wallets);
|
|
1033
|
+
for (let i = 0; i < currencyIds.length; i++) {
|
|
1034
|
+
const currencyId = currencyIds[i];
|
|
1035
|
+
const item = wallets[currencyId];
|
|
1036
|
+
const currency = this.safeCurrencyCode(currencyId);
|
|
1037
|
+
const account = this.account();
|
|
1038
|
+
account['used'] = this.safeString(item, 'used');
|
|
1039
|
+
account['free'] = this.safeString(item, 'free');
|
|
1040
|
+
account['total'] = this.safeString(item, 'balance');
|
|
1041
|
+
result[currency] = account;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
else {
|
|
1045
|
+
const free = this.safeValue(response, 'balances', {});
|
|
1046
|
+
const used = this.safeValue(response, 'reserved', {});
|
|
1047
|
+
const currencyIds = Object.keys(free);
|
|
1048
|
+
for (let i = 0; i < currencyIds.length; i++) {
|
|
1049
|
+
const currencyId = currencyIds[i];
|
|
1050
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
1051
|
+
const account = this.account();
|
|
1052
|
+
if (currencyId in free) {
|
|
1053
|
+
account['free'] = this.safeString(free, currencyId);
|
|
1054
|
+
}
|
|
1055
|
+
if (currencyId in used) {
|
|
1056
|
+
account['used'] = this.safeString(used, currencyId);
|
|
1057
|
+
}
|
|
1058
|
+
result[code] = account;
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
return this.safeBalance(result);
|
|
1062
|
+
}
|
|
1063
|
+
/**
|
|
1064
|
+
* @method
|
|
1065
|
+
* @name exmo#fetchBalance
|
|
1066
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
1067
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#59c5160f-27a1-4d9a-8cfb-7979c7ffaac6
|
|
1068
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8388df7-1f9f-4d41-81c4-5a387d171dc6
|
|
1069
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1070
|
+
* @param {string} [params.marginMode] *isolated* fetches the isolated margin balance
|
|
1071
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
1072
|
+
*/
|
|
1073
|
+
async fetchBalance(params = {}) {
|
|
1074
|
+
await this.loadMarkets();
|
|
1075
|
+
let marginMode = undefined;
|
|
1076
|
+
[marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
|
|
1077
|
+
if (marginMode === 'cross') {
|
|
1078
|
+
throw new BadRequest(this.id + ' does not support cross margin');
|
|
1079
|
+
}
|
|
1080
|
+
let response = undefined;
|
|
1081
|
+
if (marginMode === 'isolated') {
|
|
1082
|
+
response = await this.privatePostMarginUserWalletList(params);
|
|
1083
|
+
//
|
|
1084
|
+
// {
|
|
1085
|
+
// "wallets": {
|
|
1086
|
+
// "USD": {
|
|
1087
|
+
// "balance": "1000",
|
|
1088
|
+
// "free": "600",
|
|
1089
|
+
// "used": "400"
|
|
1090
|
+
// }
|
|
1091
|
+
// }
|
|
1092
|
+
// }
|
|
1093
|
+
//
|
|
1094
|
+
}
|
|
1095
|
+
else {
|
|
1096
|
+
response = await this.privatePostUserInfo(params);
|
|
1097
|
+
//
|
|
1098
|
+
// {
|
|
1099
|
+
// "uid":131685,
|
|
1100
|
+
// "server_date":1628999600,
|
|
1101
|
+
// "balances":{
|
|
1102
|
+
// "EXM":"0",
|
|
1103
|
+
// "USD":"0",
|
|
1104
|
+
// "EUR":"0",
|
|
1105
|
+
// "GBP":"0",
|
|
1106
|
+
// },
|
|
1107
|
+
// }
|
|
1108
|
+
//
|
|
1109
|
+
}
|
|
1110
|
+
return this.parseBalance(response);
|
|
1111
|
+
}
|
|
1112
|
+
/**
|
|
1113
|
+
* @method
|
|
1114
|
+
* @name exmo#fetchOrderBook
|
|
1115
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1116
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
|
|
1117
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
1118
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
1119
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1120
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1121
|
+
*/
|
|
1122
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
1123
|
+
await this.loadMarkets();
|
|
1124
|
+
const market = this.market(symbol);
|
|
1125
|
+
const request = {
|
|
1126
|
+
'pair': market['id'],
|
|
1127
|
+
};
|
|
1128
|
+
if (limit !== undefined) {
|
|
1129
|
+
request['limit'] = limit;
|
|
1130
|
+
}
|
|
1131
|
+
const response = await this.publicGetOrderBook(this.extend(request, params));
|
|
1132
|
+
const result = this.safeDict(response, market['id']);
|
|
1133
|
+
return this.parseOrderBook(result, market['symbol'], undefined, 'bid', 'ask');
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* @method
|
|
1137
|
+
* @name exmo#fetchOrderBooks
|
|
1138
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data for multiple markets
|
|
1139
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
|
|
1140
|
+
* @param {string[]|undefined} symbols list of unified market symbols, all symbols fetched if undefined, default is undefined
|
|
1141
|
+
* @param {int} [limit] max number of entries per orderbook to return, default is undefined
|
|
1142
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1143
|
+
* @returns {object} a dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbol
|
|
1144
|
+
*/
|
|
1145
|
+
async fetchOrderBooks(symbols = undefined, limit = undefined, params = {}) {
|
|
1146
|
+
await this.loadMarkets();
|
|
1147
|
+
let ids = undefined;
|
|
1148
|
+
if (symbols === undefined) {
|
|
1149
|
+
ids = this.ids.join(',');
|
|
1150
|
+
// max URL length is 2083 symbols, including http schema, hostname, tld, etc...
|
|
1151
|
+
if (ids.length > 2048) {
|
|
1152
|
+
const numIds = this.ids.length;
|
|
1153
|
+
throw new ExchangeError(this.id + ' fetchOrderBooks() has ' + numIds.toString() + ' symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchOrderBooks');
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
else {
|
|
1157
|
+
ids = this.marketIds(symbols);
|
|
1158
|
+
ids = ids.join(',');
|
|
1159
|
+
}
|
|
1160
|
+
const request = {
|
|
1161
|
+
'pair': ids,
|
|
1162
|
+
};
|
|
1163
|
+
if (limit !== undefined) {
|
|
1164
|
+
request['limit'] = limit;
|
|
1165
|
+
}
|
|
1166
|
+
const response = await this.publicGetOrderBook(this.extend(request, params));
|
|
1167
|
+
const result = {};
|
|
1168
|
+
const marketIds = Object.keys(response);
|
|
1169
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
1170
|
+
const marketId = marketIds[i];
|
|
1171
|
+
const symbol = this.safeSymbol(marketId);
|
|
1172
|
+
result[symbol] = this.parseOrderBook(response[marketId], symbol, undefined, 'bid', 'ask');
|
|
1173
|
+
}
|
|
1174
|
+
return result;
|
|
1175
|
+
}
|
|
1176
|
+
parseTicker(ticker, market = undefined) {
|
|
1177
|
+
//
|
|
1178
|
+
// {
|
|
1179
|
+
// "buy_price":"0.00002996",
|
|
1180
|
+
// "sell_price":"0.00003002",
|
|
1181
|
+
// "last_trade":"0.00002992",
|
|
1182
|
+
// "high":"0.00003028",
|
|
1183
|
+
// "low":"0.00002935",
|
|
1184
|
+
// "avg":"0.00002963",
|
|
1185
|
+
// "vol":"1196546.3163222",
|
|
1186
|
+
// "vol_curr":"35.80066578",
|
|
1187
|
+
// "updated":1642291733
|
|
1188
|
+
// }
|
|
1189
|
+
//
|
|
1190
|
+
const timestamp = this.safeTimestamp(ticker, 'updated');
|
|
1191
|
+
market = this.safeMarket(undefined, market);
|
|
1192
|
+
const last = this.safeString(ticker, 'last_trade');
|
|
1193
|
+
return this.safeTicker({
|
|
1194
|
+
'symbol': market['symbol'],
|
|
1195
|
+
'timestamp': timestamp,
|
|
1196
|
+
'datetime': this.iso8601(timestamp),
|
|
1197
|
+
'high': this.safeString(ticker, 'high'),
|
|
1198
|
+
'low': this.safeString(ticker, 'low'),
|
|
1199
|
+
'bid': this.safeString(ticker, 'buy_price'),
|
|
1200
|
+
'bidVolume': undefined,
|
|
1201
|
+
'ask': this.safeString(ticker, 'sell_price'),
|
|
1202
|
+
'askVolume': undefined,
|
|
1203
|
+
'vwap': undefined,
|
|
1204
|
+
'open': undefined,
|
|
1205
|
+
'close': last,
|
|
1206
|
+
'last': last,
|
|
1207
|
+
'previousClose': undefined,
|
|
1208
|
+
'change': undefined,
|
|
1209
|
+
'percentage': undefined,
|
|
1210
|
+
'average': this.safeString(ticker, 'avg'),
|
|
1211
|
+
'baseVolume': this.safeString(ticker, 'vol'),
|
|
1212
|
+
'quoteVolume': this.safeString(ticker, 'vol_curr'),
|
|
1213
|
+
'info': ticker,
|
|
1214
|
+
}, market);
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* @method
|
|
1218
|
+
* @name exmo#fetchTickers
|
|
1219
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
1220
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
|
|
1221
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
1222
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1223
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
1224
|
+
*/
|
|
1225
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
1226
|
+
await this.loadMarkets();
|
|
1227
|
+
symbols = this.marketSymbols(symbols);
|
|
1228
|
+
const response = await this.publicGetTicker(params);
|
|
1229
|
+
//
|
|
1230
|
+
// {
|
|
1231
|
+
// "ADA_BTC":{
|
|
1232
|
+
// "buy_price":"0.00002996",
|
|
1233
|
+
// "sell_price":"0.00003002",
|
|
1234
|
+
// "last_trade":"0.00002992",
|
|
1235
|
+
// "high":"0.00003028",
|
|
1236
|
+
// "low":"0.00002935",
|
|
1237
|
+
// "avg":"0.00002963",
|
|
1238
|
+
// "vol":"1196546.3163222",
|
|
1239
|
+
// "vol_curr":"35.80066578",
|
|
1240
|
+
// "updated":1642291733
|
|
1241
|
+
// }
|
|
1242
|
+
// }
|
|
1243
|
+
//
|
|
1244
|
+
const result = {};
|
|
1245
|
+
const marketIds = Object.keys(response);
|
|
1246
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
1247
|
+
const marketId = marketIds[i];
|
|
1248
|
+
const market = this.safeMarket(marketId, undefined, '_');
|
|
1249
|
+
const symbol = market['symbol'];
|
|
1250
|
+
const ticker = this.safeValue(response, marketId);
|
|
1251
|
+
result[symbol] = this.parseTicker(ticker, market);
|
|
1252
|
+
}
|
|
1253
|
+
return this.filterByArrayTickers(result, 'symbol', symbols);
|
|
1254
|
+
}
|
|
1255
|
+
/**
|
|
1256
|
+
* @method
|
|
1257
|
+
* @name exmo#fetchTicker
|
|
1258
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
1259
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
|
|
1260
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
1261
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1262
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
1263
|
+
*/
|
|
1264
|
+
async fetchTicker(symbol, params = {}) {
|
|
1265
|
+
await this.loadMarkets();
|
|
1266
|
+
const response = await this.publicGetTicker(params);
|
|
1267
|
+
const market = this.market(symbol);
|
|
1268
|
+
return this.parseTicker(response[market['id']], market);
|
|
1269
|
+
}
|
|
1270
|
+
parseTrade(trade, market = undefined) {
|
|
1271
|
+
//
|
|
1272
|
+
// fetchTrades (public)
|
|
1273
|
+
//
|
|
1274
|
+
// {
|
|
1275
|
+
// "trade_id":165087520,
|
|
1276
|
+
// "date":1587470005,
|
|
1277
|
+
// "type":"buy",
|
|
1278
|
+
// "quantity":"1.004",
|
|
1279
|
+
// "price":"0.02491461",
|
|
1280
|
+
// "amount":"0.02501426"
|
|
1281
|
+
// },
|
|
1282
|
+
//
|
|
1283
|
+
// fetchMyTrades, fetchOrderTrades
|
|
1284
|
+
//
|
|
1285
|
+
// {
|
|
1286
|
+
// "trade_id": 3,
|
|
1287
|
+
// "date": 1435488248,
|
|
1288
|
+
// "type": "buy",
|
|
1289
|
+
// "pair": "BTC_USD",
|
|
1290
|
+
// "order_id": 12345,
|
|
1291
|
+
// "quantity": 1,
|
|
1292
|
+
// "price": 100,
|
|
1293
|
+
// "amount": 100,
|
|
1294
|
+
// "exec_type": "taker",
|
|
1295
|
+
// "commission_amount": "0.02",
|
|
1296
|
+
// "commission_currency": "BTC",
|
|
1297
|
+
// "commission_percent": "0.2"
|
|
1298
|
+
// }
|
|
1299
|
+
//
|
|
1300
|
+
// fetchMyTrades (margin)
|
|
1301
|
+
//
|
|
1302
|
+
// {
|
|
1303
|
+
// "trade_id": "692861757015952517",
|
|
1304
|
+
// "trade_dt": "1693951853197811824",
|
|
1305
|
+
// "trade_type": "buy",
|
|
1306
|
+
// "pair": "ADA_USDT",
|
|
1307
|
+
// "quantity": "1.96607879",
|
|
1308
|
+
// "price": "0.2568",
|
|
1309
|
+
// "amount": "0.50488903"
|
|
1310
|
+
// }
|
|
1311
|
+
//
|
|
1312
|
+
const timestamp = this.safeTimestamp(trade, 'date');
|
|
1313
|
+
const id = this.safeString(trade, 'trade_id');
|
|
1314
|
+
const orderId = this.safeString(trade, 'order_id');
|
|
1315
|
+
const priceString = this.safeString(trade, 'price');
|
|
1316
|
+
const amountString = this.safeString(trade, 'quantity');
|
|
1317
|
+
const costString = this.safeString(trade, 'amount');
|
|
1318
|
+
const side = this.safeString2(trade, 'type', 'trade_type');
|
|
1319
|
+
const type = undefined;
|
|
1320
|
+
const marketId = this.safeString(trade, 'pair');
|
|
1321
|
+
market = this.safeMarket(marketId, market, '_');
|
|
1322
|
+
const symbol = market['symbol'];
|
|
1323
|
+
const isMaker = this.safeValue(trade, 'is_maker');
|
|
1324
|
+
let takerOrMakerDefault = undefined;
|
|
1325
|
+
if (isMaker !== undefined) {
|
|
1326
|
+
takerOrMakerDefault = isMaker ? 'maker' : 'taker';
|
|
1327
|
+
}
|
|
1328
|
+
const takerOrMaker = this.safeString(trade, 'exec_type', takerOrMakerDefault);
|
|
1329
|
+
let fee = undefined;
|
|
1330
|
+
const feeCostString = this.safeString(trade, 'commission_amount');
|
|
1331
|
+
if (feeCostString !== undefined) {
|
|
1332
|
+
const feeCurrencyId = this.safeString(trade, 'commission_currency');
|
|
1333
|
+
const feeCurrencyCode = this.safeCurrencyCode(feeCurrencyId);
|
|
1334
|
+
let feeRateString = this.safeString(trade, 'commission_percent');
|
|
1335
|
+
if (feeRateString !== undefined) {
|
|
1336
|
+
feeRateString = Precise.stringDiv(feeRateString, '1000', 18);
|
|
1337
|
+
}
|
|
1338
|
+
fee = {
|
|
1339
|
+
'cost': feeCostString,
|
|
1340
|
+
'currency': feeCurrencyCode,
|
|
1341
|
+
'rate': feeRateString,
|
|
1342
|
+
};
|
|
1343
|
+
}
|
|
1344
|
+
return this.safeTrade({
|
|
1345
|
+
'id': id,
|
|
1346
|
+
'info': trade,
|
|
1347
|
+
'timestamp': timestamp,
|
|
1348
|
+
'datetime': this.iso8601(timestamp),
|
|
1349
|
+
'symbol': symbol,
|
|
1350
|
+
'order': orderId,
|
|
1351
|
+
'type': type,
|
|
1352
|
+
'side': side,
|
|
1353
|
+
'takerOrMaker': takerOrMaker,
|
|
1354
|
+
'price': priceString,
|
|
1355
|
+
'amount': amountString,
|
|
1356
|
+
'cost': costString,
|
|
1357
|
+
'fee': fee,
|
|
1358
|
+
}, market);
|
|
1359
|
+
}
|
|
1360
|
+
/**
|
|
1361
|
+
* @method
|
|
1362
|
+
* @name exmo#fetchTrades
|
|
1363
|
+
* @description get the list of most recent trades for a particular symbol
|
|
1364
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#5a5a9c0d-cf17-47f6-9d62-6d4404ebd5ac
|
|
1365
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
1366
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
1367
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
1368
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1369
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
1370
|
+
*/
|
|
1371
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
1372
|
+
await this.loadMarkets();
|
|
1373
|
+
const market = this.market(symbol);
|
|
1374
|
+
const request = {
|
|
1375
|
+
'pair': market['id'],
|
|
1376
|
+
};
|
|
1377
|
+
const response = await this.publicGetTrades(this.extend(request, params));
|
|
1378
|
+
//
|
|
1379
|
+
// {
|
|
1380
|
+
// "ETH_BTC":[
|
|
1381
|
+
// {
|
|
1382
|
+
// "trade_id":165087520,
|
|
1383
|
+
// "date":1587470005,
|
|
1384
|
+
// "type":"buy",
|
|
1385
|
+
// "quantity":"1.004",
|
|
1386
|
+
// "price":"0.02491461",
|
|
1387
|
+
// "amount":"0.02501426"
|
|
1388
|
+
// },
|
|
1389
|
+
// {
|
|
1390
|
+
// "trade_id":165087369,
|
|
1391
|
+
// "date":1587469938,
|
|
1392
|
+
// "type":"buy",
|
|
1393
|
+
// "quantity":"0.94",
|
|
1394
|
+
// "price":"0.02492348",
|
|
1395
|
+
// "amount":"0.02342807"
|
|
1396
|
+
// }
|
|
1397
|
+
// ]
|
|
1398
|
+
// }
|
|
1399
|
+
//
|
|
1400
|
+
const data = this.safeList(response, market['id'], []);
|
|
1401
|
+
return this.parseTrades(data, market, since, limit);
|
|
1402
|
+
}
|
|
1403
|
+
/**
|
|
1404
|
+
* @method
|
|
1405
|
+
* @name exmo#fetchMyTrades
|
|
1406
|
+
* @description fetch all trades made by the user
|
|
1407
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#b8d8d9af-4f46-46a1-939b-ad261d79f452 // spot
|
|
1408
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#f4b1aaf8-399f-403b-ab5e-4926d967a106 // margin
|
|
1409
|
+
* @param {string} symbol a symbol is required but it can be a single string, or a non-empty array
|
|
1410
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
1411
|
+
* @param {int} [limit] *required for margin orders* the maximum number of trades structures to retrieve
|
|
1412
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1413
|
+
*
|
|
1414
|
+
* EXCHANGE SPECIFIC PARAMETERS
|
|
1415
|
+
* @param {int} [params.offset] last deal offset, default = 0
|
|
1416
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
1417
|
+
*/
|
|
1418
|
+
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1419
|
+
if (symbol === undefined) {
|
|
1420
|
+
throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
|
|
1421
|
+
}
|
|
1422
|
+
let marginMode = undefined;
|
|
1423
|
+
[marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
|
|
1424
|
+
if (marginMode === 'cross') {
|
|
1425
|
+
throw new BadRequest(this.id + ' only isolated margin is supported');
|
|
1426
|
+
}
|
|
1427
|
+
await this.loadMarkets();
|
|
1428
|
+
const market = this.market(symbol);
|
|
1429
|
+
const pair = market['id'];
|
|
1430
|
+
const isSpot = marginMode !== 'isolated';
|
|
1431
|
+
if (limit === undefined) {
|
|
1432
|
+
limit = 100;
|
|
1433
|
+
}
|
|
1434
|
+
const request = {};
|
|
1435
|
+
if (isSpot) {
|
|
1436
|
+
request['pair'] = pair;
|
|
1437
|
+
}
|
|
1438
|
+
else {
|
|
1439
|
+
request['pair_name'] = pair;
|
|
1440
|
+
}
|
|
1441
|
+
if (limit !== undefined) {
|
|
1442
|
+
request['limit'] = limit;
|
|
1443
|
+
}
|
|
1444
|
+
const offset = this.safeInteger(params, 'offset', 0);
|
|
1445
|
+
request['offset'] = offset;
|
|
1446
|
+
let response = undefined;
|
|
1447
|
+
if (isSpot) {
|
|
1448
|
+
response = await this.privatePostUserTrades(this.extend(request, params));
|
|
1449
|
+
//
|
|
1450
|
+
// {
|
|
1451
|
+
// "BTC_USD": [
|
|
1452
|
+
// {
|
|
1453
|
+
// "trade_id": 20056872,
|
|
1454
|
+
// "client_id": 100500,
|
|
1455
|
+
// "date": 1435488248,
|
|
1456
|
+
// "type": "buy",
|
|
1457
|
+
// "pair": "BTC_USD",
|
|
1458
|
+
// "quantity": "1",
|
|
1459
|
+
// "price": "100",
|
|
1460
|
+
// "amount": "100",
|
|
1461
|
+
// "order_id": 7,
|
|
1462
|
+
// "parent_order_id": 117684023830293,
|
|
1463
|
+
// "exec_type": "taker",
|
|
1464
|
+
// "commission_amount": "0.02",
|
|
1465
|
+
// "commission_currency": "BTC",
|
|
1466
|
+
// "commission_percent": "0.2"
|
|
1467
|
+
// }
|
|
1468
|
+
// ],
|
|
1469
|
+
// ...
|
|
1470
|
+
// }
|
|
1471
|
+
//
|
|
1472
|
+
}
|
|
1473
|
+
else {
|
|
1474
|
+
const responseFromExchange = await this.privatePostMarginTrades(this.extend(request, params));
|
|
1475
|
+
//
|
|
1476
|
+
// {
|
|
1477
|
+
// "trades": {
|
|
1478
|
+
// "ADA_USDT": [
|
|
1479
|
+
// {
|
|
1480
|
+
// "trade_id": "692861757015952517",
|
|
1481
|
+
// "trade_dt": "1693951853197811824",
|
|
1482
|
+
// "trade_type": "buy",
|
|
1483
|
+
// "pair": "ADA_USDT",
|
|
1484
|
+
// "quantity": "1.96607879",
|
|
1485
|
+
// "price": "0.2568",
|
|
1486
|
+
// "amount": "0.50488903"
|
|
1487
|
+
// },
|
|
1488
|
+
// ]
|
|
1489
|
+
// ...
|
|
1490
|
+
// }
|
|
1491
|
+
// }
|
|
1492
|
+
//
|
|
1493
|
+
response = this.safeValue(responseFromExchange, 'trades');
|
|
1494
|
+
}
|
|
1495
|
+
let result = [];
|
|
1496
|
+
const marketIdsInner = Object.keys(response);
|
|
1497
|
+
for (let i = 0; i < marketIdsInner.length; i++) {
|
|
1498
|
+
const marketId = marketIdsInner[i];
|
|
1499
|
+
const resultMarket = this.safeMarket(marketId, undefined, '_');
|
|
1500
|
+
const items = response[marketId];
|
|
1501
|
+
const trades = this.parseTrades(items, resultMarket, since, limit);
|
|
1502
|
+
result = this.arrayConcat(result, trades);
|
|
1503
|
+
}
|
|
1504
|
+
return this.filterBySinceLimit(result, since, limit);
|
|
1505
|
+
}
|
|
1506
|
+
/**
|
|
1507
|
+
* @method
|
|
1508
|
+
* @name exmo#createMarketOrderWithCost
|
|
1509
|
+
* @description create a market order by providing the symbol, side and cost
|
|
1510
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
|
|
1511
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1512
|
+
* @param {string} side 'buy' or 'sell'
|
|
1513
|
+
* @param {float} cost how much you want to trade in units of the quote currency
|
|
1514
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1515
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1516
|
+
*/
|
|
1517
|
+
async createMarketOrderWithCost(symbol, side, cost, params = {}) {
|
|
1518
|
+
await this.loadMarkets();
|
|
1519
|
+
params = this.extend(params, { 'cost': cost });
|
|
1520
|
+
return await this.createOrder(symbol, 'market', side, cost, undefined, params);
|
|
1521
|
+
}
|
|
1522
|
+
/**
|
|
1523
|
+
* @method
|
|
1524
|
+
* @name exmo#createMarketBuyOrderWithCost
|
|
1525
|
+
* @description create a market buy order by providing the symbol and cost
|
|
1526
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
|
|
1527
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1528
|
+
* @param {float} cost how much you want to trade in units of the quote currency
|
|
1529
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1530
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1531
|
+
*/
|
|
1532
|
+
async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
|
|
1533
|
+
await this.loadMarkets();
|
|
1534
|
+
params = this.extend(params, { 'cost': cost });
|
|
1535
|
+
return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
|
|
1536
|
+
}
|
|
1537
|
+
/**
|
|
1538
|
+
* @method
|
|
1539
|
+
* @name exmo#createMarketSellOrderWithCost
|
|
1540
|
+
* @description create a market sell order by providing the symbol and cost
|
|
1541
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
|
|
1542
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1543
|
+
* @param {float} cost how much you want to trade in units of the quote currency
|
|
1544
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1545
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1546
|
+
*/
|
|
1547
|
+
async createMarketSellOrderWithCost(symbol, cost, params = {}) {
|
|
1548
|
+
await this.loadMarkets();
|
|
1549
|
+
params = this.extend(params, { 'cost': cost });
|
|
1550
|
+
return await this.createOrder(symbol, 'market', 'sell', cost, undefined, params);
|
|
1551
|
+
}
|
|
1552
|
+
/**
|
|
1553
|
+
* @method
|
|
1554
|
+
* @name exmo#createOrder
|
|
1555
|
+
* @description create a trade order
|
|
1556
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
|
|
1557
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#de6f4321-eeac-468c-87f7-c4ad7062e265 // stop market
|
|
1558
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#3561b86c-9ff1-436e-8e68-ac926b7eb523 // margin
|
|
1559
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1560
|
+
* @param {string} type 'market' or 'limit'
|
|
1561
|
+
* @param {string} side 'buy' or 'sell'
|
|
1562
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
1563
|
+
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
1564
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1565
|
+
* @param {float} [params.triggerPrice] the price at which a trigger order is triggered at
|
|
1566
|
+
* @param {string} [params.timeInForce] *spot only* 'fok', 'ioc' or 'post_only'
|
|
1567
|
+
* @param {boolean} [params.postOnly] *spot only* true for post only orders
|
|
1568
|
+
* @param {float} [params.cost] *spot only* *market orders only* the cost of the order in the quote currency for market orders
|
|
1569
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1570
|
+
*/
|
|
1571
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
1572
|
+
await this.loadMarkets();
|
|
1573
|
+
const market = this.market(symbol);
|
|
1574
|
+
const isMarket = (type === 'market') && (price === undefined);
|
|
1575
|
+
let marginMode = undefined;
|
|
1576
|
+
[marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
|
|
1577
|
+
if (marginMode === 'cross') {
|
|
1578
|
+
throw new BadRequest(this.id + ' only supports isolated margin');
|
|
1579
|
+
}
|
|
1580
|
+
const isSpot = (marginMode !== 'isolated');
|
|
1581
|
+
const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stopPrice', 'stop_price']);
|
|
1582
|
+
const cost = this.safeString(params, 'cost');
|
|
1583
|
+
const request = {
|
|
1584
|
+
'pair': market['id'],
|
|
1585
|
+
// 'leverage': 2,
|
|
1586
|
+
// 'quantity': this.amountToPrecision (market['symbol'], amount),
|
|
1587
|
+
// spot - buy, sell, market_buy, market_sell, market_buy_total, market_sell_total
|
|
1588
|
+
// margin - limit_buy, limit_sell, market_buy, market_sell, stop_buy, stop_sell, stop_limit_buy, stop_limit_sell, trailing_stop_buy, trailing_stop_sell
|
|
1589
|
+
// 'stop_price': this.priceToPrecision (symbol, stopPrice),
|
|
1590
|
+
// 'distance': 0, // distance for trailing stop orders
|
|
1591
|
+
// 'expire': 0, // expiration timestamp in UTC timezone for the order, unless expire is 0
|
|
1592
|
+
// 'client_id': 123, // optional, must be a positive integer
|
|
1593
|
+
// 'comment': '', // up to 50 latin symbols, whitespaces, underscores
|
|
1594
|
+
};
|
|
1595
|
+
if (cost === undefined) {
|
|
1596
|
+
request['quantity'] = this.amountToPrecision(market['symbol'], amount);
|
|
1597
|
+
}
|
|
1598
|
+
else {
|
|
1599
|
+
request['quantity'] = this.costToPrecision(market['symbol'], cost);
|
|
1600
|
+
}
|
|
1601
|
+
let clientOrderId = this.safeValue2(params, 'client_id', 'clientOrderId');
|
|
1602
|
+
if (clientOrderId !== undefined) {
|
|
1603
|
+
clientOrderId = this.safeInteger2(params, 'client_id', 'clientOrderId');
|
|
1604
|
+
if (clientOrderId === undefined) {
|
|
1605
|
+
throw new BadRequest(this.id + ' createOrder() client order id must be an integer / numeric literal');
|
|
1606
|
+
}
|
|
1607
|
+
else {
|
|
1608
|
+
request['client_id'] = clientOrderId;
|
|
1609
|
+
}
|
|
1610
|
+
}
|
|
1611
|
+
const leverage = this.safeNumber(params, 'leverage');
|
|
1612
|
+
if (!isSpot && (leverage === undefined)) {
|
|
1613
|
+
throw new ArgumentsRequired(this.id + ' createOrder requires an extra param params["leverage"] for margin orders');
|
|
1614
|
+
}
|
|
1615
|
+
params = this.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId', 'cost']);
|
|
1616
|
+
if (price !== undefined) {
|
|
1617
|
+
request['price'] = this.priceToPrecision(market['symbol'], price);
|
|
1618
|
+
}
|
|
1619
|
+
let response = undefined;
|
|
1620
|
+
if (isSpot) {
|
|
1621
|
+
if (triggerPrice !== undefined) {
|
|
1622
|
+
if (type === 'limit') {
|
|
1623
|
+
throw new BadRequest(this.id + ' createOrder () cannot create stop limit orders for spot, only stop market');
|
|
1624
|
+
}
|
|
1625
|
+
else {
|
|
1626
|
+
request['type'] = side;
|
|
1627
|
+
request['trigger_price'] = this.priceToPrecision(symbol, triggerPrice);
|
|
1628
|
+
}
|
|
1629
|
+
response = await this.privatePostStopMarketOrderCreate(this.extend(request, params));
|
|
1630
|
+
}
|
|
1631
|
+
else {
|
|
1632
|
+
const execType = this.safeString(params, 'exec_type');
|
|
1633
|
+
let isPostOnly = undefined;
|
|
1634
|
+
[isPostOnly, params] = this.handlePostOnly(type === 'market', execType === 'post_only', params);
|
|
1635
|
+
const timeInForce = this.safeString(params, 'timeInForce');
|
|
1636
|
+
request['price'] = isMarket ? 0 : this.priceToPrecision(market['symbol'], price);
|
|
1637
|
+
if (type === 'limit') {
|
|
1638
|
+
request['type'] = side;
|
|
1639
|
+
}
|
|
1640
|
+
else if (type === 'market') {
|
|
1641
|
+
const marketSuffix = (cost !== undefined) ? '_total' : '';
|
|
1642
|
+
request['type'] = 'market_' + side + marketSuffix;
|
|
1643
|
+
}
|
|
1644
|
+
if (isPostOnly) {
|
|
1645
|
+
request['exec_type'] = 'post_only';
|
|
1646
|
+
}
|
|
1647
|
+
else if (timeInForce !== undefined) {
|
|
1648
|
+
request['exec_type'] = timeInForce;
|
|
1649
|
+
}
|
|
1650
|
+
response = await this.privatePostOrderCreate(this.extend(request, params));
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
else {
|
|
1654
|
+
if (triggerPrice !== undefined) {
|
|
1655
|
+
request['stop_price'] = this.priceToPrecision(symbol, triggerPrice);
|
|
1656
|
+
if (type === 'limit') {
|
|
1657
|
+
request['type'] = 'stop_limit_' + side;
|
|
1658
|
+
}
|
|
1659
|
+
else if (type === 'market') {
|
|
1660
|
+
request['type'] = 'stop_' + side;
|
|
1661
|
+
}
|
|
1662
|
+
else {
|
|
1663
|
+
request['type'] = type;
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
else {
|
|
1667
|
+
if (type === 'limit' || type === 'market') {
|
|
1668
|
+
request['type'] = type + '_' + side;
|
|
1669
|
+
}
|
|
1670
|
+
else {
|
|
1671
|
+
request['type'] = type;
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
response = await this.privatePostMarginUserOrderCreate(this.extend(request, params));
|
|
1675
|
+
}
|
|
1676
|
+
return this.parseOrder(response, market);
|
|
1677
|
+
}
|
|
1678
|
+
/**
|
|
1679
|
+
* @method
|
|
1680
|
+
* @name exmo#cancelOrder
|
|
1681
|
+
* @description cancels an open order
|
|
1682
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#1f710d4b-75bc-4b65-ad68-006f863a3f26
|
|
1683
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a4d0aae8-28f7-41ac-94fd-c4030130453d // stop market
|
|
1684
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#705dfec5-2b35-4667-862b-faf54eca6209 // margin
|
|
1685
|
+
* @param {string} id order id
|
|
1686
|
+
* @param {string} symbol not used by exmo cancelOrder ()
|
|
1687
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1688
|
+
* @param {boolean} [params.trigger] true to cancel a trigger order
|
|
1689
|
+
* @param {string} [params.marginMode] set to 'cross' or 'isolated' to cancel a margin order
|
|
1690
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1691
|
+
*/
|
|
1692
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
1693
|
+
await this.loadMarkets();
|
|
1694
|
+
const request = {};
|
|
1695
|
+
const trigger = this.safeValue2(params, 'trigger', 'stop');
|
|
1696
|
+
params = this.omit(params, ['trigger', 'stop']);
|
|
1697
|
+
let marginMode = undefined;
|
|
1698
|
+
[marginMode, params] = this.handleMarginModeAndParams('cancelOrder', params);
|
|
1699
|
+
if (marginMode === 'cross') {
|
|
1700
|
+
throw new BadRequest(this.id + ' only supports isolated margin');
|
|
1701
|
+
}
|
|
1702
|
+
let response = undefined;
|
|
1703
|
+
if ((marginMode === 'isolated')) {
|
|
1704
|
+
request['order_id'] = id;
|
|
1705
|
+
response = await this.privatePostMarginUserOrderCancel(this.extend(request, params));
|
|
1706
|
+
//
|
|
1707
|
+
// {}
|
|
1708
|
+
//
|
|
1709
|
+
}
|
|
1710
|
+
else {
|
|
1711
|
+
if (trigger) {
|
|
1712
|
+
request['parent_order_id'] = id;
|
|
1713
|
+
response = await this.privatePostStopMarketOrderCancel(this.extend(request, params));
|
|
1714
|
+
//
|
|
1715
|
+
// {}
|
|
1716
|
+
//
|
|
1717
|
+
}
|
|
1718
|
+
else {
|
|
1719
|
+
request['order_id'] = id;
|
|
1720
|
+
response = await this.privatePostOrderCancel(this.extend(request, params));
|
|
1721
|
+
//
|
|
1722
|
+
// {
|
|
1723
|
+
// "error": '',
|
|
1724
|
+
// "result": True
|
|
1725
|
+
// }
|
|
1726
|
+
//
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
return this.parseOrder(response);
|
|
1730
|
+
}
|
|
1731
|
+
/**
|
|
1732
|
+
* @method
|
|
1733
|
+
* @name exmo#fetchOrder
|
|
1734
|
+
* @description *spot only* fetches information on an order made by the user
|
|
1735
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 // spot
|
|
1736
|
+
* @param {string} id order id
|
|
1737
|
+
* @param {string} symbol not used by exmo fetchOrder
|
|
1738
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1739
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1740
|
+
*/
|
|
1741
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
1742
|
+
await this.loadMarkets();
|
|
1743
|
+
const request = {
|
|
1744
|
+
'order_id': id.toString(),
|
|
1745
|
+
};
|
|
1746
|
+
const response = await this.privatePostOrderTrades(this.extend(request, params));
|
|
1747
|
+
//
|
|
1748
|
+
// {
|
|
1749
|
+
// "type": "buy",
|
|
1750
|
+
// "in_currency": "BTC",
|
|
1751
|
+
// "in_amount": "1",
|
|
1752
|
+
// "out_currency": "USD",
|
|
1753
|
+
// "out_amount": "100",
|
|
1754
|
+
// "trades": [
|
|
1755
|
+
// {
|
|
1756
|
+
// "trade_id": 3,
|
|
1757
|
+
// "date": 1435488248,
|
|
1758
|
+
// "type": "buy",
|
|
1759
|
+
// "pair": "BTC_USD",
|
|
1760
|
+
// "order_id": 12345,
|
|
1761
|
+
// "quantity": 1,
|
|
1762
|
+
// "price": 100,
|
|
1763
|
+
// "amount": 100
|
|
1764
|
+
// }
|
|
1765
|
+
// ]
|
|
1766
|
+
// }
|
|
1767
|
+
//
|
|
1768
|
+
const order = this.parseOrder(response);
|
|
1769
|
+
order['id'] = id.toString();
|
|
1770
|
+
return order;
|
|
1771
|
+
}
|
|
1772
|
+
/**
|
|
1773
|
+
* @method
|
|
1774
|
+
* @name exmo#fetchOrderTrades
|
|
1775
|
+
* @description fetch all the trades made from a single order
|
|
1776
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 // spot
|
|
1777
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#00810661-9119-46c5-aec5-55abe9cb42c7 // margin
|
|
1778
|
+
* @param {string} id order id
|
|
1779
|
+
* @param {string} symbol unified market symbol
|
|
1780
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
1781
|
+
* @param {int} [limit] the maximum number of trades to retrieve
|
|
1782
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1783
|
+
* @param {string} [params.marginMode] set to "isolated" to fetch trades for a margin order
|
|
1784
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
1785
|
+
*/
|
|
1786
|
+
async fetchOrderTrades(id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1787
|
+
let marginMode = undefined;
|
|
1788
|
+
[marginMode, params] = this.handleMarginModeAndParams('fetchOrderTrades', params);
|
|
1789
|
+
if (marginMode === 'cross') {
|
|
1790
|
+
throw new BadRequest(this.id + ' only supports isolated margin');
|
|
1791
|
+
}
|
|
1792
|
+
let market = undefined;
|
|
1793
|
+
if (symbol !== undefined) {
|
|
1794
|
+
market = this.market(symbol);
|
|
1795
|
+
}
|
|
1796
|
+
const request = {
|
|
1797
|
+
'order_id': id.toString(),
|
|
1798
|
+
};
|
|
1799
|
+
let response = undefined;
|
|
1800
|
+
if (marginMode === 'isolated') {
|
|
1801
|
+
response = await this.privatePostMarginUserOrderTrades(this.extend(request, params));
|
|
1802
|
+
//
|
|
1803
|
+
// {
|
|
1804
|
+
// "trades": [
|
|
1805
|
+
// {
|
|
1806
|
+
// "is_maker": false,
|
|
1807
|
+
// "order_id": "123",
|
|
1808
|
+
// "pair": "BTC_USD",
|
|
1809
|
+
// "price": "54122.25",
|
|
1810
|
+
// "quantity": "0.00069994",
|
|
1811
|
+
// "trade_dt": "1619069561718824428",
|
|
1812
|
+
// "trade_id": "692842802860135010",
|
|
1813
|
+
// "type": "sell"
|
|
1814
|
+
// }
|
|
1815
|
+
// ]
|
|
1816
|
+
// }
|
|
1817
|
+
//
|
|
1818
|
+
}
|
|
1819
|
+
else {
|
|
1820
|
+
response = await this.privatePostOrderTrades(this.extend(request, params));
|
|
1821
|
+
//
|
|
1822
|
+
// {
|
|
1823
|
+
// "type": "buy",
|
|
1824
|
+
// "in_currency": "BTC",
|
|
1825
|
+
// "in_amount": "1",
|
|
1826
|
+
// "out_currency": "USD",
|
|
1827
|
+
// "out_amount": "100",
|
|
1828
|
+
// "trades": [
|
|
1829
|
+
// {
|
|
1830
|
+
// "trade_id": 3,
|
|
1831
|
+
// "date": 1435488248,
|
|
1832
|
+
// "type": "buy",
|
|
1833
|
+
// "pair": "BTC_USD",
|
|
1834
|
+
// "order_id": 12345,
|
|
1835
|
+
// "quantity": 1,
|
|
1836
|
+
// "price": 100,
|
|
1837
|
+
// "amount": 100,
|
|
1838
|
+
// "exec_type": "taker",
|
|
1839
|
+
// "commission_amount": "0.02",
|
|
1840
|
+
// "commission_currency": "BTC",
|
|
1841
|
+
// "commission_percent": "0.2"
|
|
1842
|
+
// }
|
|
1843
|
+
// ]
|
|
1844
|
+
// }
|
|
1845
|
+
//
|
|
1846
|
+
}
|
|
1847
|
+
const trades = this.safeList(response, 'trades');
|
|
1848
|
+
return this.parseTrades(trades, market, since, limit);
|
|
1849
|
+
}
|
|
1850
|
+
/**
|
|
1851
|
+
* @method
|
|
1852
|
+
* @name exmo#fetchOpenOrders
|
|
1853
|
+
* @description fetch all unfilled currently open orders
|
|
1854
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#0e135370-daa4-4689-8acd-b6876dee9ba1 // spot open orders
|
|
1855
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a7cfd4f0-476e-4675-b33f-22a46902f245 // margin
|
|
1856
|
+
* @param {string} symbol unified market symbol
|
|
1857
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
1858
|
+
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
1859
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1860
|
+
* @param {string} [params.marginMode] set to "isolated" for margin orders
|
|
1861
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1862
|
+
*/
|
|
1863
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1864
|
+
await this.loadMarkets();
|
|
1865
|
+
let market = undefined;
|
|
1866
|
+
if (symbol !== undefined) {
|
|
1867
|
+
market = this.market(symbol);
|
|
1868
|
+
symbol = market['symbol'];
|
|
1869
|
+
}
|
|
1870
|
+
let marginMode = undefined;
|
|
1871
|
+
[marginMode, params] = this.handleMarginModeAndParams('fetchOpenOrders', params);
|
|
1872
|
+
const isMargin = ((marginMode === 'cross') || (marginMode === 'isolated'));
|
|
1873
|
+
let response = undefined;
|
|
1874
|
+
let orders = [];
|
|
1875
|
+
if (isMargin) {
|
|
1876
|
+
response = await this.privatePostMarginUserOrderList(params);
|
|
1877
|
+
//
|
|
1878
|
+
// {
|
|
1879
|
+
// "orders": [
|
|
1880
|
+
// {
|
|
1881
|
+
// "client_id": "0",
|
|
1882
|
+
// "comment": "",
|
|
1883
|
+
// "created": "1619068707985325495",
|
|
1884
|
+
// "distance": "0",
|
|
1885
|
+
// "expire": 0,
|
|
1886
|
+
// "funding_currency": "BTC",
|
|
1887
|
+
// "funding_quantity": "0.01",
|
|
1888
|
+
// "funding_rate": "0.02",
|
|
1889
|
+
// "leverage": "2",
|
|
1890
|
+
// "order_id": "123",
|
|
1891
|
+
// "pair": "BTC_USD",
|
|
1892
|
+
// "previous_type": "limit_sell",
|
|
1893
|
+
// "price": "58000",
|
|
1894
|
+
// "quantity": "0.01",
|
|
1895
|
+
// "src": 0,
|
|
1896
|
+
// "stop_price": "0",
|
|
1897
|
+
// "trigger_price": "58000",
|
|
1898
|
+
// "type": "limit_sell",
|
|
1899
|
+
// "updated": 1619068707989411800
|
|
1900
|
+
// }
|
|
1901
|
+
// ]
|
|
1902
|
+
// }
|
|
1903
|
+
//
|
|
1904
|
+
params = this.extend(params, {
|
|
1905
|
+
'status': 'open',
|
|
1906
|
+
});
|
|
1907
|
+
const responseOrders = this.safeValue(response, 'orders');
|
|
1908
|
+
orders = this.parseOrders(responseOrders, market, since, limit, params);
|
|
1909
|
+
}
|
|
1910
|
+
else {
|
|
1911
|
+
response = await this.privatePostUserOpenOrders(params);
|
|
1912
|
+
//
|
|
1913
|
+
// {
|
|
1914
|
+
// "USDT_USD": [
|
|
1915
|
+
// {
|
|
1916
|
+
// "parent_order_id": "507061384740151010",
|
|
1917
|
+
// "client_id": "100500",
|
|
1918
|
+
// "created": "1589547391",
|
|
1919
|
+
// "type": "stop_market_buy",
|
|
1920
|
+
// "pair": "USDT_USD",
|
|
1921
|
+
// "quantity": "1",
|
|
1922
|
+
// "trigger_price": "5",
|
|
1923
|
+
// "amount": "5"
|
|
1924
|
+
// }
|
|
1925
|
+
// ],
|
|
1926
|
+
// ...
|
|
1927
|
+
// }
|
|
1928
|
+
//
|
|
1929
|
+
const marketIds = Object.keys(response);
|
|
1930
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
1931
|
+
const marketId = marketIds[i];
|
|
1932
|
+
const marketInner = this.safeMarket(marketId);
|
|
1933
|
+
params = this.extend(params, {
|
|
1934
|
+
'status': 'open',
|
|
1935
|
+
});
|
|
1936
|
+
const parsedOrders = this.parseOrders(response[marketId], marketInner, since, limit, params);
|
|
1937
|
+
orders = this.arrayConcat(orders, parsedOrders);
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
return orders;
|
|
1941
|
+
}
|
|
1942
|
+
parseStatus(status) {
|
|
1943
|
+
if (status === undefined) {
|
|
1944
|
+
return undefined;
|
|
1945
|
+
}
|
|
1946
|
+
const statuses = {
|
|
1947
|
+
'cancel_started': 'canceled',
|
|
1948
|
+
};
|
|
1949
|
+
if (status.indexOf('cancel') >= 0) {
|
|
1950
|
+
status = 'canceled';
|
|
1951
|
+
}
|
|
1952
|
+
return this.safeString(statuses, status, status);
|
|
1953
|
+
}
|
|
1954
|
+
parseSide(orderType) {
|
|
1955
|
+
const side = {
|
|
1956
|
+
'limit_buy': 'buy',
|
|
1957
|
+
'limit_sell': 'sell',
|
|
1958
|
+
'market_buy': 'buy',
|
|
1959
|
+
'market_sell': 'sell',
|
|
1960
|
+
'stop_buy': 'buy',
|
|
1961
|
+
'stop_sell': 'sell',
|
|
1962
|
+
'stop_limit_buy': 'buy',
|
|
1963
|
+
'stop_limit_sell': 'sell',
|
|
1964
|
+
'trailing_stop_buy': 'buy',
|
|
1965
|
+
'trailing_stop_sell': 'sell',
|
|
1966
|
+
'stop_market_sell': 'sell',
|
|
1967
|
+
'stop_market_buy': 'buy',
|
|
1968
|
+
'buy': 'buy',
|
|
1969
|
+
'sell': 'sell',
|
|
1970
|
+
};
|
|
1971
|
+
return this.safeString(side, orderType, orderType);
|
|
1972
|
+
}
|
|
1973
|
+
parseOrder(order, market = undefined) {
|
|
1974
|
+
//
|
|
1975
|
+
// fetchOrders, fetchOpenOrders, fetchClosedOrders, fetchCanceledOrders
|
|
1976
|
+
//
|
|
1977
|
+
// {
|
|
1978
|
+
// "order_id": "14",
|
|
1979
|
+
// "created": "1435517311",
|
|
1980
|
+
// "type": "buy",
|
|
1981
|
+
// "pair": "BTC_USD",
|
|
1982
|
+
// "price": "100",
|
|
1983
|
+
// "quantity": "1",
|
|
1984
|
+
// "amount": "100"
|
|
1985
|
+
// }
|
|
1986
|
+
//
|
|
1987
|
+
// fetchOrder
|
|
1988
|
+
//
|
|
1989
|
+
// {
|
|
1990
|
+
// "type": "buy",
|
|
1991
|
+
// "in_currency": "BTC",
|
|
1992
|
+
// "in_amount": "1",
|
|
1993
|
+
// "out_currency": "USD",
|
|
1994
|
+
// "out_amount": "100",
|
|
1995
|
+
// "trades": [
|
|
1996
|
+
// {
|
|
1997
|
+
// "trade_id": 3,
|
|
1998
|
+
// "date": 1435488248,
|
|
1999
|
+
// "type": "buy",
|
|
2000
|
+
// "pair": "BTC_USD",
|
|
2001
|
+
// "order_id": 12345,
|
|
2002
|
+
// "quantity": 1,
|
|
2003
|
+
// "price": 100,
|
|
2004
|
+
// "amount": 100
|
|
2005
|
+
// }
|
|
2006
|
+
// ]
|
|
2007
|
+
// }
|
|
2008
|
+
//
|
|
2009
|
+
// Margin fetchOpenOrders
|
|
2010
|
+
//
|
|
2011
|
+
// {
|
|
2012
|
+
// "client_id": "0",
|
|
2013
|
+
// "comment": "",
|
|
2014
|
+
// "created": "1619068707985325495",
|
|
2015
|
+
// "distance": "0",
|
|
2016
|
+
// "expire": 0,
|
|
2017
|
+
// "funding_currency": "BTC",
|
|
2018
|
+
// "funding_quantity": "0.01",
|
|
2019
|
+
// "funding_rate": "0.02",
|
|
2020
|
+
// "leverage": "2",
|
|
2021
|
+
// "order_id": "123",
|
|
2022
|
+
// "pair": "BTC_USD",
|
|
2023
|
+
// "previous_type": "limit_sell",
|
|
2024
|
+
// "price": "58000",
|
|
2025
|
+
// "quantity": "0.01",
|
|
2026
|
+
// "src": 0,
|
|
2027
|
+
// "stop_price": "0",
|
|
2028
|
+
// "trigger_price": "58000",
|
|
2029
|
+
// "type": "limit_sell",
|
|
2030
|
+
// "updated": 1619068707989411800
|
|
2031
|
+
// }
|
|
2032
|
+
//
|
|
2033
|
+
// Margin fetchClosedOrders
|
|
2034
|
+
//
|
|
2035
|
+
// {
|
|
2036
|
+
// "distance": "0",
|
|
2037
|
+
// "event_id": "692842802860022508",
|
|
2038
|
+
// "event_time": "1619069531190173720",
|
|
2039
|
+
// "event_type": "OrderCancelStarted",
|
|
2040
|
+
// "order_id": "123",
|
|
2041
|
+
// "order_status": "cancel_started",
|
|
2042
|
+
// "order_type": "limit_sell",
|
|
2043
|
+
// "pair": "BTC_USD",
|
|
2044
|
+
// "price": "54115",
|
|
2045
|
+
// "quantity": "0.001",
|
|
2046
|
+
// "stop_price": "0",
|
|
2047
|
+
// "trade_id": "0",
|
|
2048
|
+
// "trade_price": "0",
|
|
2049
|
+
// "trade_quantity": "0",
|
|
2050
|
+
// "trade_type": ""
|
|
2051
|
+
// },
|
|
2052
|
+
//
|
|
2053
|
+
const id = this.safeString2(order, 'order_id', 'parent_order_id');
|
|
2054
|
+
const eventTime = this.safeIntegerProduct2(order, 'event_time', 'created', 0.000001);
|
|
2055
|
+
const timestamp = this.safeTimestamp(order, 'created', eventTime);
|
|
2056
|
+
const orderType = this.safeString2(order, 'type', 'order_type');
|
|
2057
|
+
const side = this.parseSide(orderType);
|
|
2058
|
+
let marketId = undefined;
|
|
2059
|
+
if ('pair' in order) {
|
|
2060
|
+
marketId = order['pair'];
|
|
2061
|
+
}
|
|
2062
|
+
else if (('in_currency' in order) && ('out_currency' in order)) {
|
|
2063
|
+
if (side === 'buy') {
|
|
2064
|
+
marketId = order['in_currency'] + '_' + order['out_currency'];
|
|
2065
|
+
}
|
|
2066
|
+
else {
|
|
2067
|
+
marketId = order['out_currency'] + '_' + order['in_currency'];
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
market = this.safeMarket(marketId, market);
|
|
2071
|
+
const symbol = market['symbol'];
|
|
2072
|
+
let amount = this.safeString(order, 'quantity');
|
|
2073
|
+
if (amount === undefined) {
|
|
2074
|
+
const amountField = (side === 'buy') ? 'in_amount' : 'out_amount';
|
|
2075
|
+
amount = this.safeString(order, amountField);
|
|
2076
|
+
}
|
|
2077
|
+
const price = this.safeString(order, 'price');
|
|
2078
|
+
const cost = this.safeString(order, 'amount');
|
|
2079
|
+
const transactions = this.safeValue(order, 'trades', []);
|
|
2080
|
+
const clientOrderId = this.safeInteger(order, 'client_id');
|
|
2081
|
+
let triggerPrice = this.safeString(order, 'stop_price');
|
|
2082
|
+
if (triggerPrice === '0') {
|
|
2083
|
+
triggerPrice = undefined;
|
|
2084
|
+
}
|
|
2085
|
+
let type = undefined;
|
|
2086
|
+
if ((orderType !== 'buy') && (orderType !== 'sell')) {
|
|
2087
|
+
type = orderType;
|
|
2088
|
+
}
|
|
2089
|
+
return this.safeOrder({
|
|
2090
|
+
'id': id,
|
|
2091
|
+
'clientOrderId': clientOrderId,
|
|
2092
|
+
'datetime': this.iso8601(timestamp),
|
|
2093
|
+
'timestamp': timestamp,
|
|
2094
|
+
'lastTradeTimestamp': this.safeIntegerProduct(order, 'updated', 0.000001),
|
|
2095
|
+
'status': this.parseStatus(this.safeString(order, 'order_status')),
|
|
2096
|
+
'symbol': symbol,
|
|
2097
|
+
'type': type,
|
|
2098
|
+
'timeInForce': undefined,
|
|
2099
|
+
'postOnly': undefined,
|
|
2100
|
+
'side': side,
|
|
2101
|
+
'price': price,
|
|
2102
|
+
'triggerPrice': triggerPrice,
|
|
2103
|
+
'cost': cost,
|
|
2104
|
+
'amount': amount,
|
|
2105
|
+
'filled': undefined,
|
|
2106
|
+
'remaining': undefined,
|
|
2107
|
+
'average': undefined,
|
|
2108
|
+
'trades': transactions,
|
|
2109
|
+
'fee': undefined,
|
|
2110
|
+
'info': order,
|
|
2111
|
+
}, market);
|
|
2112
|
+
}
|
|
2113
|
+
/**
|
|
2114
|
+
* @method
|
|
2115
|
+
* @name exmo#fetchCanceledOrders
|
|
2116
|
+
* @description fetches information on multiple canceled orders made by the user
|
|
2117
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#1d2524dd-ae6d-403a-a067-77b50d13fbe5 // margin
|
|
2118
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a51be1d0-af5f-44e4-99d7-f7b04c6067d0 // spot canceled orders
|
|
2119
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
2120
|
+
* @param {int} [since] timestamp in ms of the earliest order, default is undefined
|
|
2121
|
+
* @param {int} [limit] max number of orders to return, default is undefined
|
|
2122
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2123
|
+
* @param {string} [params.marginMode] set to "isolated" for margin orders
|
|
2124
|
+
* @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2125
|
+
*/
|
|
2126
|
+
async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2127
|
+
await this.loadMarkets();
|
|
2128
|
+
let marginMode = undefined;
|
|
2129
|
+
[marginMode, params] = this.handleMarginModeAndParams('fetchOrders', params);
|
|
2130
|
+
if (marginMode === 'cross') {
|
|
2131
|
+
throw new BadRequest(this.id + ' only supports isolated margin');
|
|
2132
|
+
}
|
|
2133
|
+
if (limit === undefined) {
|
|
2134
|
+
limit = 100;
|
|
2135
|
+
}
|
|
2136
|
+
const isSpot = (marginMode !== 'isolated');
|
|
2137
|
+
if (symbol !== undefined) {
|
|
2138
|
+
const marketInner = this.market(symbol);
|
|
2139
|
+
symbol = marketInner['symbol'];
|
|
2140
|
+
}
|
|
2141
|
+
const request = {
|
|
2142
|
+
'limit': limit,
|
|
2143
|
+
};
|
|
2144
|
+
request['offset'] = (since !== undefined) ? limit : 0;
|
|
2145
|
+
request['limit'] = limit;
|
|
2146
|
+
let market = undefined;
|
|
2147
|
+
if (symbol !== undefined) {
|
|
2148
|
+
market = this.market(symbol);
|
|
2149
|
+
}
|
|
2150
|
+
let response = undefined;
|
|
2151
|
+
if (isSpot) {
|
|
2152
|
+
response = await this.privatePostUserCancelledOrders(this.extend(request, params));
|
|
2153
|
+
//
|
|
2154
|
+
// [
|
|
2155
|
+
// {
|
|
2156
|
+
// "order_id": "27056153840",
|
|
2157
|
+
// "client_id": "0",
|
|
2158
|
+
// "created": "1653428646",
|
|
2159
|
+
// "type": "buy",
|
|
2160
|
+
// "pair": "BTC_USDT",
|
|
2161
|
+
// "quantity": "0.1",
|
|
2162
|
+
// "price": "10",
|
|
2163
|
+
// "amount": "1"
|
|
2164
|
+
// }
|
|
2165
|
+
// ]
|
|
2166
|
+
//
|
|
2167
|
+
params = this.extend(params, {
|
|
2168
|
+
'status': 'canceled',
|
|
2169
|
+
});
|
|
2170
|
+
return this.parseOrders(response, market, since, limit, params);
|
|
2171
|
+
}
|
|
2172
|
+
else {
|
|
2173
|
+
const responseSwap = await this.privatePostMarginUserOrderHistory(this.extend(request, params));
|
|
2174
|
+
//
|
|
2175
|
+
// {
|
|
2176
|
+
// "items": [
|
|
2177
|
+
// {
|
|
2178
|
+
// "event_id": "692862104574106858",
|
|
2179
|
+
// "event_time": "1694116400173489405",
|
|
2180
|
+
// "event_type": "OrderCancelStarted",
|
|
2181
|
+
// "order_id": "692862104561289319",
|
|
2182
|
+
// "order_type": "stop_limit_sell",
|
|
2183
|
+
// "order_status": "cancel_started",
|
|
2184
|
+
// "trade_id": "0",
|
|
2185
|
+
// "trade_type":"",
|
|
2186
|
+
// "trade_quantity": "0",
|
|
2187
|
+
// "trade_price": "0",
|
|
2188
|
+
// "pair": "ADA_USDT",
|
|
2189
|
+
// "quantity": "12",
|
|
2190
|
+
// "price": "0.23",
|
|
2191
|
+
// "stop_price": "0.22",
|
|
2192
|
+
// "distance": "0"
|
|
2193
|
+
// }
|
|
2194
|
+
// ...
|
|
2195
|
+
// ]
|
|
2196
|
+
// }
|
|
2197
|
+
//
|
|
2198
|
+
const items = this.safeValue(responseSwap, 'items');
|
|
2199
|
+
const orders = this.parseOrders(items, market, since, limit, params);
|
|
2200
|
+
const result = [];
|
|
2201
|
+
for (let i = 0; i < orders.length; i++) {
|
|
2202
|
+
const order = orders[i];
|
|
2203
|
+
if (order['status'] === 'canceled') {
|
|
2204
|
+
result.push(order);
|
|
2205
|
+
}
|
|
2206
|
+
}
|
|
2207
|
+
return result;
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
2210
|
+
/**
|
|
2211
|
+
* @method
|
|
2212
|
+
* @name exmo#editOrder
|
|
2213
|
+
* @description *margin only* edit a trade order
|
|
2214
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#f27ee040-c75f-4b59-b608-d05bd45b7899 // margin
|
|
2215
|
+
* @param {string} id order id
|
|
2216
|
+
* @param {string} symbol unified CCXT market symbol
|
|
2217
|
+
* @param {string} type not used by exmo editOrder
|
|
2218
|
+
* @param {string} side not used by exmo editOrder
|
|
2219
|
+
* @param {float} [amount] how much of the currency you want to trade in units of the base currency
|
|
2220
|
+
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
2221
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2222
|
+
* @param {float} [params.triggerPrice] stop price for stop-market and stop-limit orders
|
|
2223
|
+
* @param {string} params.marginMode must be set to isolated
|
|
2224
|
+
*
|
|
2225
|
+
* EXCHANGE SPECIFIC PARAMETERS
|
|
2226
|
+
* @param {int} [params.distance] distance for trailing stop orders
|
|
2227
|
+
* @param {int} [params.expire] expiration timestamp in UTC timezone for the order. order will not be expired if expire is 0
|
|
2228
|
+
* @param {string} [params.comment] optional comment for order. up to 50 latin symbols, whitespaces, underscores
|
|
2229
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2230
|
+
*/
|
|
2231
|
+
async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
|
|
2232
|
+
await this.loadMarkets();
|
|
2233
|
+
const market = this.market(symbol);
|
|
2234
|
+
let marginMode = undefined;
|
|
2235
|
+
[marginMode, params] = this.handleMarginModeAndParams('editOrder', params);
|
|
2236
|
+
if (marginMode !== 'isolated') {
|
|
2237
|
+
throw new BadRequest(this.id + ' editOrder() can only be used for isolated margin orders');
|
|
2238
|
+
}
|
|
2239
|
+
const triggerPrice = this.safeNumberN(params, ['triggerPrice', 'stopPrice', 'stop_price']);
|
|
2240
|
+
params = this.omit(params, ['triggerPrice', 'stopPrice']);
|
|
2241
|
+
const request = {
|
|
2242
|
+
'order_id': id, // id of the open order
|
|
2243
|
+
};
|
|
2244
|
+
if (amount !== undefined) {
|
|
2245
|
+
request['quantity'] = amount;
|
|
2246
|
+
}
|
|
2247
|
+
if (price !== undefined) {
|
|
2248
|
+
request['price'] = this.priceToPrecision(market['symbol'], price);
|
|
2249
|
+
}
|
|
2250
|
+
if (triggerPrice !== undefined) {
|
|
2251
|
+
request['stop_price'] = this.priceToPrecision(market['symbol'], triggerPrice);
|
|
2252
|
+
}
|
|
2253
|
+
const response = await this.privatePostMarginUserOrderUpdate(this.extend(request, params));
|
|
2254
|
+
return this.parseOrder(response);
|
|
2255
|
+
}
|
|
2256
|
+
/**
|
|
2257
|
+
* @method
|
|
2258
|
+
* @name exmo#fetchDepositAddress
|
|
2259
|
+
* @description fetch the deposit address for a currency associated with this account
|
|
2260
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8f9ced9-7ab6-4383-a6a4-bc54469ba60e
|
|
2261
|
+
* @param {string} code unified currency code
|
|
2262
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2263
|
+
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
|
|
2264
|
+
*/
|
|
2265
|
+
async fetchDepositAddress(code, params = {}) {
|
|
2266
|
+
await this.loadMarkets();
|
|
2267
|
+
const response = await this.privatePostDepositAddress(params);
|
|
2268
|
+
//
|
|
2269
|
+
// {
|
|
2270
|
+
// "TRX":"TBnwrf4ZdoYXE3C8L2KMs7YPSL3fg6q6V9",
|
|
2271
|
+
// "USDTTRC20":"TBnwrf4ZdoYXE3C8L2KMs7YPSL3fg6q6V9"
|
|
2272
|
+
// }
|
|
2273
|
+
//
|
|
2274
|
+
const depositAddress = this.safeString(response, code);
|
|
2275
|
+
let address = undefined;
|
|
2276
|
+
let tag = undefined;
|
|
2277
|
+
if (depositAddress) {
|
|
2278
|
+
const addressAndTag = depositAddress.split(',');
|
|
2279
|
+
address = addressAndTag[0];
|
|
2280
|
+
const numParts = addressAndTag.length;
|
|
2281
|
+
if (numParts > 1) {
|
|
2282
|
+
tag = addressAndTag[1];
|
|
2283
|
+
}
|
|
2284
|
+
}
|
|
2285
|
+
this.checkAddress(address);
|
|
2286
|
+
return {
|
|
2287
|
+
'info': response,
|
|
2288
|
+
'currency': code,
|
|
2289
|
+
'network': undefined,
|
|
2290
|
+
'address': address,
|
|
2291
|
+
'tag': tag,
|
|
2292
|
+
};
|
|
2293
|
+
}
|
|
2294
|
+
getMarketFromTrades(trades) {
|
|
2295
|
+
const tradesBySymbol = this.indexBy(trades, 'pair');
|
|
2296
|
+
const symbols = Object.keys(tradesBySymbol);
|
|
2297
|
+
const numSymbols = symbols.length;
|
|
2298
|
+
if (numSymbols === 1) {
|
|
2299
|
+
return this.markets[symbols[0]];
|
|
2300
|
+
}
|
|
2301
|
+
return undefined;
|
|
2302
|
+
}
|
|
2303
|
+
/**
|
|
2304
|
+
* @method
|
|
2305
|
+
* @name exmo#withdraw
|
|
2306
|
+
* @description make a withdrawal
|
|
2307
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#3ab9c34d-ad58-4f87-9c57-2e2ea88a8325
|
|
2308
|
+
* @param {string} code unified currency code
|
|
2309
|
+
* @param {float} amount the amount to withdraw
|
|
2310
|
+
* @param {string} address the address to withdraw to
|
|
2311
|
+
* @param {string} tag
|
|
2312
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2313
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2314
|
+
*/
|
|
2315
|
+
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
2316
|
+
[tag, params] = this.handleWithdrawTagAndParams(tag, params);
|
|
2317
|
+
await this.loadMarkets();
|
|
2318
|
+
const currency = this.currency(code);
|
|
2319
|
+
const request = {
|
|
2320
|
+
'amount': amount,
|
|
2321
|
+
'currency': currency['id'],
|
|
2322
|
+
'address': address,
|
|
2323
|
+
};
|
|
2324
|
+
if (tag !== undefined) {
|
|
2325
|
+
request['invoice'] = tag;
|
|
2326
|
+
}
|
|
2327
|
+
const networks = this.safeValue(this.options, 'networks', {});
|
|
2328
|
+
let network = this.safeStringUpper(params, 'network'); // this line allows the user to specify either ERC20 or ETH
|
|
2329
|
+
network = this.safeString(networks, network, network); // handle ERC20>ETH alias
|
|
2330
|
+
if (network !== undefined) {
|
|
2331
|
+
request['transport'] = network;
|
|
2332
|
+
params = this.omit(params, 'network');
|
|
2333
|
+
}
|
|
2334
|
+
const response = await this.privatePostWithdrawCrypt(this.extend(request, params));
|
|
2335
|
+
return this.parseTransaction(response, currency);
|
|
2336
|
+
}
|
|
2337
|
+
parseTransactionStatus(status) {
|
|
2338
|
+
const statuses = {
|
|
2339
|
+
'transferred': 'ok',
|
|
2340
|
+
'paid': 'ok',
|
|
2341
|
+
'pending': 'pending',
|
|
2342
|
+
'processing': 'pending',
|
|
2343
|
+
'verifying': 'pending',
|
|
2344
|
+
};
|
|
2345
|
+
return this.safeString(statuses, status, status);
|
|
2346
|
+
}
|
|
2347
|
+
parseTransaction(transaction, currency = undefined) {
|
|
2348
|
+
//
|
|
2349
|
+
// fetchDepositsWithdrawals
|
|
2350
|
+
//
|
|
2351
|
+
// {
|
|
2352
|
+
// "dt": 1461841192,
|
|
2353
|
+
// "type": "deposit",
|
|
2354
|
+
// "curr": "RUB",
|
|
2355
|
+
// "status": "processing",
|
|
2356
|
+
// "provider": "Qiwi (LA) [12345]",
|
|
2357
|
+
// "amount": "1",
|
|
2358
|
+
// "account": "",
|
|
2359
|
+
// "txid": "ec46f784ad976fd7f7539089d1a129fe46...",
|
|
2360
|
+
// }
|
|
2361
|
+
//
|
|
2362
|
+
// fetchWithdrawals
|
|
2363
|
+
//
|
|
2364
|
+
// {
|
|
2365
|
+
// "operation_id": 47412538520634344,
|
|
2366
|
+
// "created": 1573760013,
|
|
2367
|
+
// "updated": 1573760013,
|
|
2368
|
+
// "type": "withdraw",
|
|
2369
|
+
// "currency": "DOGE",
|
|
2370
|
+
// "status": "Paid",
|
|
2371
|
+
// "amount": "300",
|
|
2372
|
+
// "provider": "DOGE",
|
|
2373
|
+
// "commission": "0",
|
|
2374
|
+
// "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2375
|
+
// "order_id": 69670170,
|
|
2376
|
+
// "provider_type": "crypto",
|
|
2377
|
+
// "crypto_address": "DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2378
|
+
// "card_number": "",
|
|
2379
|
+
// "wallet_address": "",
|
|
2380
|
+
// "email": "",
|
|
2381
|
+
// "phone": "",
|
|
2382
|
+
// "extra": {
|
|
2383
|
+
// "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
|
|
2384
|
+
// "confirmations": null,
|
|
2385
|
+
// "excode": "",
|
|
2386
|
+
// "invoice": ""
|
|
2387
|
+
// },
|
|
2388
|
+
// "error": ""
|
|
2389
|
+
// }
|
|
2390
|
+
//
|
|
2391
|
+
// withdraw
|
|
2392
|
+
//
|
|
2393
|
+
// {
|
|
2394
|
+
// "result": true,
|
|
2395
|
+
// "error": "",
|
|
2396
|
+
// "task_id": 11775077
|
|
2397
|
+
// }
|
|
2398
|
+
//
|
|
2399
|
+
const timestamp = this.safeTimestamp2(transaction, 'dt', 'created');
|
|
2400
|
+
let amountString = this.safeString(transaction, 'amount');
|
|
2401
|
+
if (amountString !== undefined) {
|
|
2402
|
+
amountString = Precise.stringAbs(amountString);
|
|
2403
|
+
}
|
|
2404
|
+
let txid = this.safeString(transaction, 'txid');
|
|
2405
|
+
if (txid === undefined) {
|
|
2406
|
+
const extra = this.safeValue(transaction, 'extra', {});
|
|
2407
|
+
const extraTxid = this.safeString(extra, 'txid');
|
|
2408
|
+
if (extraTxid !== '') {
|
|
2409
|
+
txid = extraTxid;
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
const type = this.safeString(transaction, 'type');
|
|
2413
|
+
const currencyId = this.safeString2(transaction, 'curr', 'currency');
|
|
2414
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
2415
|
+
let address = undefined;
|
|
2416
|
+
let comment = undefined;
|
|
2417
|
+
const account = this.safeString(transaction, 'account');
|
|
2418
|
+
if (type === 'deposit') {
|
|
2419
|
+
comment = account;
|
|
2420
|
+
}
|
|
2421
|
+
else if (type === 'withdrawal') {
|
|
2422
|
+
address = account;
|
|
2423
|
+
if (address !== undefined) {
|
|
2424
|
+
const parts = address.split(':');
|
|
2425
|
+
const numParts = parts.length;
|
|
2426
|
+
if (numParts === 2) {
|
|
2427
|
+
address = this.safeString(parts, 1);
|
|
2428
|
+
address = address.replace(' ', '');
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
const fee = {
|
|
2433
|
+
'currency': undefined,
|
|
2434
|
+
'cost': undefined,
|
|
2435
|
+
'rate': undefined,
|
|
2436
|
+
};
|
|
2437
|
+
// fixed funding fees only (for now)
|
|
2438
|
+
if (!this.fees['transaction']['percentage']) {
|
|
2439
|
+
const key = (type === 'withdrawal') ? 'withdraw' : 'deposit';
|
|
2440
|
+
let feeCost = this.safeString(transaction, 'commission');
|
|
2441
|
+
if (feeCost === undefined) {
|
|
2442
|
+
const transactionFees = this.safeValue(this.options, 'transactionFees', {});
|
|
2443
|
+
const codeFees = this.safeValue(transactionFees, code, {});
|
|
2444
|
+
feeCost = this.safeString(codeFees, key);
|
|
2445
|
+
}
|
|
2446
|
+
// users don't pay for cashbacks, no fees for that
|
|
2447
|
+
const provider = this.safeString(transaction, 'provider');
|
|
2448
|
+
if (provider === 'cashback') {
|
|
2449
|
+
feeCost = '0';
|
|
2450
|
+
}
|
|
2451
|
+
if (feeCost !== undefined) {
|
|
2452
|
+
// withdrawal amount includes the fee
|
|
2453
|
+
if (type === 'withdrawal') {
|
|
2454
|
+
amountString = Precise.stringSub(amountString, feeCost);
|
|
2455
|
+
}
|
|
2456
|
+
fee['cost'] = this.parseNumber(feeCost);
|
|
2457
|
+
fee['currency'] = code;
|
|
2458
|
+
}
|
|
2459
|
+
}
|
|
2460
|
+
return {
|
|
2461
|
+
'info': transaction,
|
|
2462
|
+
'id': this.safeString2(transaction, 'order_id', 'task_id'),
|
|
2463
|
+
'txid': txid,
|
|
2464
|
+
'type': type,
|
|
2465
|
+
'currency': code,
|
|
2466
|
+
'network': this.safeString(transaction, 'provider'),
|
|
2467
|
+
'amount': this.parseNumber(amountString),
|
|
2468
|
+
'status': this.parseTransactionStatus(this.safeStringLower(transaction, 'status')),
|
|
2469
|
+
'timestamp': timestamp,
|
|
2470
|
+
'datetime': this.iso8601(timestamp),
|
|
2471
|
+
'address': address,
|
|
2472
|
+
'addressFrom': undefined,
|
|
2473
|
+
'addressTo': address,
|
|
2474
|
+
'tag': undefined,
|
|
2475
|
+
'tagFrom': undefined,
|
|
2476
|
+
'tagTo': undefined,
|
|
2477
|
+
'updated': this.safeTimestamp(transaction, 'updated'),
|
|
2478
|
+
'comment': comment,
|
|
2479
|
+
'internal': undefined,
|
|
2480
|
+
'fee': fee,
|
|
2481
|
+
};
|
|
2482
|
+
}
|
|
2483
|
+
/**
|
|
2484
|
+
* @method
|
|
2485
|
+
* @name exmo#fetchDepositsWithdrawals
|
|
2486
|
+
* @description fetch history of deposits and withdrawals
|
|
2487
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#31e69a33-4849-4e6a-b4b4-6d574238f6a7
|
|
2488
|
+
* @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
|
|
2489
|
+
* @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
|
|
2490
|
+
* @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
|
|
2491
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2492
|
+
* @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2493
|
+
*/
|
|
2494
|
+
async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2495
|
+
await this.loadMarkets();
|
|
2496
|
+
const request = {};
|
|
2497
|
+
if (since !== undefined) {
|
|
2498
|
+
request['date'] = this.parseToInt(since / 1000);
|
|
2499
|
+
}
|
|
2500
|
+
let currency = undefined;
|
|
2501
|
+
if (code !== undefined) {
|
|
2502
|
+
currency = this.currency(code);
|
|
2503
|
+
}
|
|
2504
|
+
const response = await this.privatePostWalletHistory(this.extend(request, params));
|
|
2505
|
+
//
|
|
2506
|
+
// {
|
|
2507
|
+
// "result": true,
|
|
2508
|
+
// "error": "",
|
|
2509
|
+
// "begin": "1493942400",
|
|
2510
|
+
// "end": "1494028800",
|
|
2511
|
+
// "history": [
|
|
2512
|
+
// {
|
|
2513
|
+
// "dt": 1461841192,
|
|
2514
|
+
// "type": "deposit",
|
|
2515
|
+
// "curr": "RUB",
|
|
2516
|
+
// "status": "processing",
|
|
2517
|
+
// "provider": "Qiwi (LA) [12345]",
|
|
2518
|
+
// "amount": "1",
|
|
2519
|
+
// "account": "",
|
|
2520
|
+
// "txid": "ec46f784ad976fd7f7539089d1a129fe46...",
|
|
2521
|
+
// },
|
|
2522
|
+
// {
|
|
2523
|
+
// "dt": 1463414785,
|
|
2524
|
+
// "type": "withdrawal",
|
|
2525
|
+
// "curr": "USD",
|
|
2526
|
+
// "status": "paid",
|
|
2527
|
+
// "provider": "EXCODE",
|
|
2528
|
+
// "amount": "-1",
|
|
2529
|
+
// "account": "EX-CODE_19371_USDda...",
|
|
2530
|
+
// "txid": "",
|
|
2531
|
+
// },
|
|
2532
|
+
// ],
|
|
2533
|
+
// }
|
|
2534
|
+
//
|
|
2535
|
+
return this.parseTransactions(response['history'], currency, since, limit);
|
|
2536
|
+
}
|
|
2537
|
+
/**
|
|
2538
|
+
* @method
|
|
2539
|
+
* @name exmo#fetchWithdrawals
|
|
2540
|
+
* @description fetch all withdrawals made from an account
|
|
2541
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
|
|
2542
|
+
* @param {string} code unified currency code
|
|
2543
|
+
* @param {int} [since] the earliest time in ms to fetch withdrawals for
|
|
2544
|
+
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
|
|
2545
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2546
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2547
|
+
*/
|
|
2548
|
+
async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2549
|
+
await this.loadMarkets();
|
|
2550
|
+
let currency = undefined;
|
|
2551
|
+
const request = {
|
|
2552
|
+
'type': 'withdraw',
|
|
2553
|
+
};
|
|
2554
|
+
if (limit !== undefined) {
|
|
2555
|
+
request['limit'] = limit; // default: 100, maximum: 100
|
|
2556
|
+
}
|
|
2557
|
+
if (code !== undefined) {
|
|
2558
|
+
currency = this.currency(code);
|
|
2559
|
+
request['currency'] = currency['id'];
|
|
2560
|
+
}
|
|
2561
|
+
const response = await this.privatePostWalletOperations(this.extend(request, params));
|
|
2562
|
+
//
|
|
2563
|
+
// {
|
|
2564
|
+
// "items": [
|
|
2565
|
+
// {
|
|
2566
|
+
// "operation_id": 47412538520634344,
|
|
2567
|
+
// "created": 1573760013,
|
|
2568
|
+
// "updated": 1573760013,
|
|
2569
|
+
// "type": "withdraw",
|
|
2570
|
+
// "currency": "DOGE",
|
|
2571
|
+
// "status": "Paid",
|
|
2572
|
+
// "amount": "300",
|
|
2573
|
+
// "provider": "DOGE",
|
|
2574
|
+
// "commission": "0",
|
|
2575
|
+
// "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2576
|
+
// "order_id": 69670170,
|
|
2577
|
+
// "extra": {
|
|
2578
|
+
// "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
|
|
2579
|
+
// "excode": "",
|
|
2580
|
+
// "invoice": ""
|
|
2581
|
+
// },
|
|
2582
|
+
// "error": ""
|
|
2583
|
+
// },
|
|
2584
|
+
// ],
|
|
2585
|
+
// "count": 23
|
|
2586
|
+
// }
|
|
2587
|
+
//
|
|
2588
|
+
const items = this.safeList(response, 'items', []);
|
|
2589
|
+
return this.parseTransactions(items, currency, since, limit);
|
|
2590
|
+
}
|
|
2591
|
+
/**
|
|
2592
|
+
* @method
|
|
2593
|
+
* @name exmo#fetchWithdrawal
|
|
2594
|
+
* @description fetch data on a currency withdrawal via the withdrawal id
|
|
2595
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
|
|
2596
|
+
* @param {string} id withdrawal id
|
|
2597
|
+
* @param {string} code unified currency code of the currency withdrawn, default is undefined
|
|
2598
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2599
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2600
|
+
*/
|
|
2601
|
+
async fetchWithdrawal(id, code = undefined, params = {}) {
|
|
2602
|
+
await this.loadMarkets();
|
|
2603
|
+
let currency = undefined;
|
|
2604
|
+
const request = {
|
|
2605
|
+
'order_id': id,
|
|
2606
|
+
'type': 'withdraw',
|
|
2607
|
+
};
|
|
2608
|
+
if (code !== undefined) {
|
|
2609
|
+
currency = this.currency(code);
|
|
2610
|
+
request['currency'] = currency['id'];
|
|
2611
|
+
}
|
|
2612
|
+
const response = await this.privatePostWalletOperations(this.extend(request, params));
|
|
2613
|
+
//
|
|
2614
|
+
// {
|
|
2615
|
+
// "items": [
|
|
2616
|
+
// {
|
|
2617
|
+
// "operation_id": 47412538520634344,
|
|
2618
|
+
// "created": 1573760013,
|
|
2619
|
+
// "updated": 1573760013,
|
|
2620
|
+
// "type": "deposit",
|
|
2621
|
+
// "currency": "DOGE",
|
|
2622
|
+
// "status": "Paid",
|
|
2623
|
+
// "amount": "300",
|
|
2624
|
+
// "provider": "DOGE",
|
|
2625
|
+
// "commission": "0",
|
|
2626
|
+
// "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2627
|
+
// "order_id": 69670170,
|
|
2628
|
+
// "extra": {
|
|
2629
|
+
// "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
|
|
2630
|
+
// "excode": "",
|
|
2631
|
+
// "invoice": ""
|
|
2632
|
+
// },
|
|
2633
|
+
// "error": ""
|
|
2634
|
+
// },
|
|
2635
|
+
// ],
|
|
2636
|
+
// "count": 23
|
|
2637
|
+
// }
|
|
2638
|
+
//
|
|
2639
|
+
const items = this.safeValue(response, 'items', []);
|
|
2640
|
+
const first = this.safeDict(items, 0, {});
|
|
2641
|
+
return this.parseTransaction(first, currency);
|
|
2642
|
+
}
|
|
2643
|
+
/**
|
|
2644
|
+
* @method
|
|
2645
|
+
* @name exmo#fetchDeposit
|
|
2646
|
+
* @description fetch information on a deposit
|
|
2647
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
|
|
2648
|
+
* @param {string} id deposit id
|
|
2649
|
+
* @param {string} code unified currency code, default is undefined
|
|
2650
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2651
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2652
|
+
*/
|
|
2653
|
+
async fetchDeposit(id, code = undefined, params = {}) {
|
|
2654
|
+
await this.loadMarkets();
|
|
2655
|
+
let currency = undefined;
|
|
2656
|
+
const request = {
|
|
2657
|
+
'order_id': id,
|
|
2658
|
+
'type': 'deposit',
|
|
2659
|
+
};
|
|
2660
|
+
if (code !== undefined) {
|
|
2661
|
+
currency = this.currency(code);
|
|
2662
|
+
request['currency'] = currency['id'];
|
|
2663
|
+
}
|
|
2664
|
+
const response = await this.privatePostWalletOperations(this.extend(request, params));
|
|
2665
|
+
//
|
|
2666
|
+
// {
|
|
2667
|
+
// "items": [
|
|
2668
|
+
// {
|
|
2669
|
+
// "operation_id": 47412538520634344,
|
|
2670
|
+
// "created": 1573760013,
|
|
2671
|
+
// "updated": 1573760013,
|
|
2672
|
+
// "type": "deposit",
|
|
2673
|
+
// "currency": "DOGE",
|
|
2674
|
+
// "status": "Paid",
|
|
2675
|
+
// "amount": "300",
|
|
2676
|
+
// "provider": "DOGE",
|
|
2677
|
+
// "commission": "0",
|
|
2678
|
+
// "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2679
|
+
// "order_id": 69670170,
|
|
2680
|
+
// "extra": {
|
|
2681
|
+
// "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
|
|
2682
|
+
// "excode": "",
|
|
2683
|
+
// "invoice": ""
|
|
2684
|
+
// },
|
|
2685
|
+
// "error": ""
|
|
2686
|
+
// },
|
|
2687
|
+
// ],
|
|
2688
|
+
// "count": 23
|
|
2689
|
+
// }
|
|
2690
|
+
//
|
|
2691
|
+
const items = this.safeValue(response, 'items', []);
|
|
2692
|
+
const first = this.safeDict(items, 0, {});
|
|
2693
|
+
return this.parseTransaction(first, currency);
|
|
2694
|
+
}
|
|
2695
|
+
/**
|
|
2696
|
+
* @method
|
|
2697
|
+
* @name exmo#fetchDeposits
|
|
2698
|
+
* @description fetch all deposits made to an account
|
|
2699
|
+
* @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
|
|
2700
|
+
* @param {string} code unified currency code
|
|
2701
|
+
* @param {int} [since] the earliest time in ms to fetch deposits for
|
|
2702
|
+
* @param {int} [limit] the maximum number of deposits structures to retrieve
|
|
2703
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2704
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2705
|
+
*/
|
|
2706
|
+
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2707
|
+
await this.loadMarkets();
|
|
2708
|
+
let currency = undefined;
|
|
2709
|
+
const request = {
|
|
2710
|
+
'type': 'deposit',
|
|
2711
|
+
};
|
|
2712
|
+
if (limit !== undefined) {
|
|
2713
|
+
request['limit'] = limit; // default: 100, maximum: 100
|
|
2714
|
+
}
|
|
2715
|
+
if (code !== undefined) {
|
|
2716
|
+
currency = this.currency(code);
|
|
2717
|
+
request['currency'] = currency['id'];
|
|
2718
|
+
}
|
|
2719
|
+
const response = await this.privatePostWalletOperations(this.extend(request, params));
|
|
2720
|
+
//
|
|
2721
|
+
// {
|
|
2722
|
+
// "items": [
|
|
2723
|
+
// {
|
|
2724
|
+
// "operation_id": 47412538520634344,
|
|
2725
|
+
// "created": 1573760013,
|
|
2726
|
+
// "updated": 1573760013,
|
|
2727
|
+
// "type": "deposit",
|
|
2728
|
+
// "currency": "DOGE",
|
|
2729
|
+
// "status": "Paid",
|
|
2730
|
+
// "amount": "300",
|
|
2731
|
+
// "provider": "DOGE",
|
|
2732
|
+
// "commission": "0",
|
|
2733
|
+
// "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
|
|
2734
|
+
// "order_id": 69670170,
|
|
2735
|
+
// "extra": {
|
|
2736
|
+
// "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
|
|
2737
|
+
// "excode": "",
|
|
2738
|
+
// "invoice": ""
|
|
2739
|
+
// },
|
|
2740
|
+
// "error": ""
|
|
2741
|
+
// },
|
|
2742
|
+
// ],
|
|
2743
|
+
// "count": 23
|
|
2744
|
+
// }
|
|
2745
|
+
//
|
|
2746
|
+
const items = this.safeList(response, 'items', []);
|
|
2747
|
+
return this.parseTransactions(items, currency, since, limit);
|
|
2748
|
+
}
|
|
2749
|
+
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
2750
|
+
let url = this.urls['api'][api] + '/';
|
|
2751
|
+
if (api !== 'web') {
|
|
2752
|
+
url += this.version + '/';
|
|
2753
|
+
}
|
|
2754
|
+
url += path;
|
|
2755
|
+
if ((api === 'public') || (api === 'web')) {
|
|
2756
|
+
if (Object.keys(params).length) {
|
|
2757
|
+
url += '?' + this.urlencode(params);
|
|
2758
|
+
}
|
|
2759
|
+
}
|
|
2760
|
+
else if (api === 'private') {
|
|
2761
|
+
this.checkRequiredCredentials();
|
|
2762
|
+
const nonce = this.nonce();
|
|
2763
|
+
body = this.urlencode(this.extend({ 'nonce': nonce }, params));
|
|
2764
|
+
headers = {
|
|
2765
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
2766
|
+
'Key': this.apiKey,
|
|
2767
|
+
'Sign': this.hmac(this.encode(body), this.encode(this.secret), sha512),
|
|
2768
|
+
};
|
|
2769
|
+
}
|
|
2770
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
2771
|
+
}
|
|
2772
|
+
nonce() {
|
|
2773
|
+
return this.milliseconds();
|
|
2774
|
+
}
|
|
2775
|
+
handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
2776
|
+
if (response === undefined) {
|
|
2777
|
+
return undefined; // fallback to default error handler
|
|
2778
|
+
}
|
|
2779
|
+
if (('error' in response) && !('result' in response)) {
|
|
2780
|
+
// error: {
|
|
2781
|
+
// "code": "140434",
|
|
2782
|
+
// "msg": "Your margin balance is not sufficient to place the order for '5 TON'. Please top up your margin wallet by "2.5 USDT"."
|
|
2783
|
+
// }
|
|
2784
|
+
//
|
|
2785
|
+
const errorCode = this.safeValue(response, 'error', {});
|
|
2786
|
+
const messageError = this.safeString(errorCode, 'msg');
|
|
2787
|
+
const code = this.safeString(errorCode, 'code');
|
|
2788
|
+
const feedback = this.id + ' ' + body;
|
|
2789
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
|
|
2790
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], messageError, feedback);
|
|
2791
|
+
throw new ExchangeError(feedback);
|
|
2792
|
+
}
|
|
2793
|
+
if (('result' in response) || ('errmsg' in response)) {
|
|
2794
|
+
//
|
|
2795
|
+
// {"result":false,"error":"Error 50052: Insufficient funds"}
|
|
2796
|
+
// {"s":"error","errmsg":"strconv.ParseInt: parsing \"\": invalid syntax"}
|
|
2797
|
+
//
|
|
2798
|
+
let success = this.safeBool(response, 'result', false);
|
|
2799
|
+
if (typeof success === 'string') {
|
|
2800
|
+
if ((success === 'true') || (success === '1')) {
|
|
2801
|
+
success = true;
|
|
2802
|
+
}
|
|
2803
|
+
else {
|
|
2804
|
+
success = false;
|
|
2805
|
+
}
|
|
2806
|
+
}
|
|
2807
|
+
if (!success) {
|
|
2808
|
+
let code = undefined;
|
|
2809
|
+
const message = this.safeString2(response, 'error', 'errmsg');
|
|
2810
|
+
const errorParts = message.split(':');
|
|
2811
|
+
const numParts = errorParts.length;
|
|
2812
|
+
if (numParts > 1) {
|
|
2813
|
+
const errorSubParts = errorParts[0].split(' ');
|
|
2814
|
+
const numSubParts = errorSubParts.length;
|
|
2815
|
+
code = (numSubParts > 1) ? errorSubParts[1] : errorSubParts[0];
|
|
2816
|
+
}
|
|
2817
|
+
const feedback = this.id + ' ' + body;
|
|
2818
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
|
|
2819
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
|
|
2820
|
+
throw new ExchangeError(feedback);
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
return undefined;
|
|
2824
|
+
}
|
|
2825
|
+
}
|