ccxt 4.5.18 → 4.5.19
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 +7 -6
- package/dist/ccxt.browser.min.js +40 -16
- package/dist/cjs/_virtual/index.cjs.js +1459 -9
- package/dist/cjs/ccxt.js +8 -2
- package/dist/cjs/src/abstract/alpaca.js +1 -1
- package/dist/cjs/src/abstract/apex.js +1 -1
- package/dist/cjs/src/abstract/arkham.js +1 -1
- package/dist/cjs/src/abstract/ascendex.js +1 -1
- package/dist/cjs/src/abstract/backpack.js +1 -1
- package/dist/cjs/src/abstract/bigone.js +1 -1
- package/dist/cjs/src/abstract/binance.js +1 -1
- package/dist/cjs/src/abstract/bingx.js +1 -1
- package/dist/cjs/src/abstract/bit2c.js +1 -1
- package/dist/cjs/src/abstract/bitbank.js +1 -1
- package/dist/cjs/src/abstract/bitbns.js +1 -1
- package/dist/cjs/src/abstract/bitfinex.js +1 -1
- package/dist/cjs/src/abstract/bitflyer.js +1 -1
- package/dist/cjs/src/abstract/bitget.js +1 -1
- package/dist/cjs/src/abstract/bithumb.js +1 -1
- package/dist/cjs/src/abstract/bitmart.js +1 -1
- package/dist/cjs/src/abstract/bitmex.js +1 -1
- package/dist/cjs/src/abstract/bitopro.js +1 -1
- package/dist/cjs/src/abstract/bitrue.js +1 -1
- package/dist/cjs/src/abstract/bitso.js +1 -1
- package/dist/cjs/src/abstract/bitstamp.js +1 -1
- package/dist/cjs/src/abstract/bitteam.js +1 -1
- package/dist/cjs/src/abstract/bittrade.js +1 -1
- package/dist/cjs/src/abstract/bitvavo.js +1 -1
- package/dist/cjs/src/abstract/blockchaincom.js +1 -1
- package/dist/cjs/src/abstract/blofin.js +1 -1
- package/dist/cjs/src/abstract/btcalpha.js +1 -1
- package/dist/cjs/src/abstract/btcbox.js +1 -1
- package/dist/cjs/src/abstract/btcmarkets.js +1 -1
- package/dist/cjs/src/abstract/btcturk.js +1 -1
- package/dist/cjs/src/abstract/bybit.js +1 -1
- package/dist/cjs/src/abstract/cex.js +1 -1
- package/dist/cjs/src/abstract/coinbase.js +1 -1
- package/dist/cjs/src/abstract/coinbaseexchange.js +1 -1
- package/dist/cjs/src/abstract/coinbaseinternational.js +1 -1
- package/dist/cjs/src/abstract/coincatch.js +1 -1
- package/dist/cjs/src/abstract/coincheck.js +1 -1
- package/dist/cjs/src/abstract/coinex.js +1 -1
- package/dist/cjs/src/abstract/coinmate.js +1 -1
- package/dist/cjs/src/abstract/coinmetro.js +1 -1
- package/dist/cjs/src/abstract/coinone.js +1 -1
- package/dist/cjs/src/abstract/coinsph.js +1 -1
- package/dist/cjs/src/abstract/coinspot.js +1 -1
- package/dist/cjs/src/abstract/cryptocom.js +1 -1
- package/dist/cjs/src/abstract/cryptomus.js +1 -1
- package/dist/cjs/src/abstract/deepcoin.js +1 -1
- package/dist/cjs/src/abstract/defx.js +1 -1
- package/dist/cjs/src/abstract/delta.js +1 -1
- package/dist/cjs/src/abstract/deribit.js +1 -1
- package/dist/cjs/src/abstract/derive.js +1 -1
- package/dist/cjs/src/abstract/digifinex.js +1 -1
- package/dist/cjs/src/abstract/dydx.js +11 -0
- package/dist/cjs/src/abstract/exmo.js +1 -1
- package/dist/cjs/src/abstract/foxbit.js +1 -1
- package/dist/cjs/src/abstract/gate.js +1 -1
- package/dist/cjs/src/abstract/gemini.js +1 -1
- package/dist/cjs/src/abstract/hashkey.js +1 -1
- package/dist/cjs/src/abstract/hibachi.js +1 -1
- package/dist/cjs/src/abstract/hitbtc.js +1 -1
- package/dist/cjs/src/abstract/hollaex.js +1 -1
- package/dist/cjs/src/abstract/htx.js +1 -1
- package/dist/cjs/src/abstract/hyperliquid.js +1 -1
- package/dist/cjs/src/abstract/independentreserve.js +1 -1
- package/dist/cjs/src/abstract/indodax.js +1 -1
- package/dist/cjs/src/abstract/kraken.js +1 -1
- package/dist/cjs/src/abstract/krakenfutures.js +1 -1
- package/dist/cjs/src/abstract/kucoin.js +1 -1
- package/dist/cjs/src/abstract/kucoinfutures.js +1 -1
- package/dist/cjs/src/abstract/latoken.js +1 -1
- package/dist/cjs/src/abstract/lbank.js +1 -1
- package/dist/cjs/src/abstract/luno.js +1 -1
- package/dist/cjs/src/abstract/mercado.js +1 -1
- package/dist/cjs/src/abstract/mexc.js +1 -1
- package/dist/cjs/src/abstract/modetrade.js +1 -1
- package/dist/cjs/src/abstract/ndax.js +1 -1
- package/dist/cjs/src/abstract/novadax.js +1 -1
- package/dist/cjs/src/abstract/oceanex.js +1 -1
- package/dist/cjs/src/abstract/okx.js +1 -1
- package/dist/cjs/src/abstract/onetrading.js +1 -1
- package/dist/cjs/src/abstract/oxfun.js +1 -1
- package/dist/cjs/src/abstract/p2b.js +1 -1
- package/dist/cjs/src/abstract/paradex.js +1 -1
- package/dist/cjs/src/abstract/paymium.js +1 -1
- package/dist/cjs/src/abstract/phemex.js +1 -1
- package/dist/cjs/src/abstract/poloniex.js +1 -1
- package/dist/cjs/src/abstract/probit.js +1 -1
- package/dist/cjs/src/abstract/timex.js +1 -1
- package/dist/cjs/src/abstract/tokocrypto.js +1 -1
- package/dist/cjs/src/abstract/toobit.js +1 -1
- package/dist/cjs/src/abstract/upbit.js +1 -1
- package/dist/cjs/src/abstract/wavesexchange.js +1 -1
- package/dist/cjs/src/abstract/whitebit.js +1 -1
- package/dist/cjs/src/abstract/woo.js +1 -1
- package/dist/cjs/src/abstract/woofipro.js +1 -1
- package/dist/cjs/src/abstract/xt.js +1 -1
- package/dist/cjs/src/abstract/yobit.js +1 -1
- package/dist/cjs/src/abstract/zaif.js +1 -1
- package/dist/cjs/src/abstract/zonda.js +1 -1
- package/dist/cjs/src/alpaca.js +1 -1
- package/dist/cjs/src/apex.js +1 -1
- package/dist/cjs/src/arkham.js +1 -1
- package/dist/cjs/src/ascendex.js +1 -1
- package/dist/cjs/src/backpack.js +1 -1
- package/dist/cjs/src/base/Exchange.js +158 -1
- package/dist/cjs/src/base/Precise.js +0 -6
- package/dist/cjs/src/base/errors.js +0 -6
- package/dist/cjs/src/base/functions/crypto.js +1 -1
- package/dist/cjs/src/base/functions/encode.js +1 -1
- package/dist/cjs/src/base/functions/misc.js +0 -1
- package/dist/cjs/src/base/functions/number.js +0 -6
- package/dist/cjs/src/base/functions/platform.js +0 -6
- package/dist/cjs/src/base/functions/rsa.js +0 -1
- package/dist/cjs/src/base/functions/string.js +0 -6
- package/dist/cjs/src/base/functions/throttle.js +1 -1
- package/dist/cjs/src/base/functions/time.js +0 -6
- package/dist/cjs/src/base/functions/totp.js +0 -1
- package/dist/cjs/src/base/functions/type.js +0 -6
- package/dist/cjs/src/base/functions.js +1 -1
- package/dist/cjs/src/base/ws/Cache.js +0 -6
- package/dist/cjs/src/base/ws/Client.js +0 -1
- package/dist/cjs/src/base/ws/Future.js +1 -1
- package/dist/cjs/src/base/ws/OrderBook.js +1 -1
- package/dist/cjs/src/base/ws/OrderBookSide.js +0 -6
- package/dist/cjs/src/base/ws/WsClient.js +1 -1
- package/dist/cjs/src/bequant.js +1 -1
- package/dist/cjs/src/bigone.js +1 -1
- package/dist/cjs/src/binance.js +1 -1
- package/dist/cjs/src/binancecoinm.js +1 -1
- package/dist/cjs/src/binanceus.js +1 -1
- package/dist/cjs/src/binanceusdm.js +1 -1
- package/dist/cjs/src/bingx.js +21 -1
- package/dist/cjs/src/bit2c.js +1 -1
- package/dist/cjs/src/bitbank.js +1 -1
- package/dist/cjs/src/bitbns.js +1 -1
- package/dist/cjs/src/bitfinex.js +1 -1
- package/dist/cjs/src/bitflyer.js +1 -1
- package/dist/cjs/src/bitget.js +44 -42
- package/dist/cjs/src/bithumb.js +1 -1
- package/dist/cjs/src/bitmart.js +1 -1
- package/dist/cjs/src/bitmex.js +1 -1
- package/dist/cjs/src/bitopro.js +1 -1
- package/dist/cjs/src/bitrue.js +1 -1
- package/dist/cjs/src/bitso.js +1 -1
- package/dist/cjs/src/bitstamp.js +1 -1
- package/dist/cjs/src/bitteam.js +1 -1
- package/dist/cjs/src/bittrade.js +1 -1
- package/dist/cjs/src/blockchaincom.js +1 -1
- package/dist/cjs/src/blofin.js +1 -1
- package/dist/cjs/src/btcalpha.js +1 -1
- package/dist/cjs/src/btcbox.js +1 -1
- package/dist/cjs/src/btcmarkets.js +1 -1
- package/dist/cjs/src/btcturk.js +1 -1
- package/dist/cjs/src/bybit.js +1 -1
- package/dist/cjs/src/cex.js +1 -1
- package/dist/cjs/src/coinbaseadvanced.js +1 -1
- package/dist/cjs/src/coincatch.js +1 -1
- package/dist/cjs/src/coincheck.js +1 -1
- package/dist/cjs/src/coinex.js +1 -1
- package/dist/cjs/src/coinmate.js +1 -1
- package/dist/cjs/src/coinmetro.js +1 -1
- package/dist/cjs/src/coinone.js +1 -1
- package/dist/cjs/src/coinsph.js +0 -1
- package/dist/cjs/src/coinspot.js +1 -1
- package/dist/cjs/src/cryptocom.js +1 -1
- package/dist/cjs/src/cryptomus.js +1 -1
- package/dist/cjs/src/deepcoin.js +1 -1
- package/dist/cjs/src/defx.js +1 -1
- package/dist/cjs/src/delta.js +1 -1
- package/dist/cjs/src/deribit.js +7 -1
- package/dist/cjs/src/derive.js +1 -1
- package/dist/cjs/src/digifinex.js +1 -1
- package/dist/cjs/src/dydx.js +2453 -0
- package/dist/cjs/src/exmo.js +1 -1
- package/dist/cjs/src/fmfwio.js +1 -1
- package/dist/cjs/src/foxbit.js +1 -1
- package/dist/cjs/src/gate.js +1 -1
- package/dist/cjs/src/gateio.js +1 -1
- package/dist/cjs/src/gemini.js +1 -1
- package/dist/cjs/src/hashkey.js +1 -1
- package/dist/cjs/src/hibachi.js +2 -2
- package/dist/cjs/src/hitbtc.js +0 -1
- package/dist/cjs/src/hollaex.js +1 -1
- package/dist/cjs/src/htx.js +1 -1
- package/dist/cjs/src/huobi.js +1 -1
- package/dist/cjs/src/hyperliquid.js +1 -1
- package/dist/cjs/src/independentreserve.js +1 -1
- package/dist/cjs/src/indodax.js +1 -1
- package/dist/cjs/src/kraken.js +1 -1
- package/dist/cjs/src/krakenfutures.js +1 -1
- package/dist/cjs/src/kucoin.js +712 -110
- package/dist/cjs/src/kucoinfutures.js +1 -1
- package/dist/cjs/src/latoken.js +1 -1
- package/dist/cjs/src/lbank.js +1 -1
- package/dist/cjs/src/luno.js +1 -1
- package/dist/cjs/src/mercado.js +1 -1
- package/dist/cjs/src/mexc.js +1 -1
- package/dist/cjs/src/modetrade.js +1 -1
- package/dist/cjs/src/myokx.js +1 -1
- package/dist/cjs/src/ndax.js +1 -1
- package/dist/cjs/src/novadax.js +1 -1
- package/dist/cjs/src/oceanex.js +1 -1
- package/dist/cjs/src/okx.js +1 -1
- package/dist/cjs/src/okxus.js +1 -1
- package/dist/cjs/src/onetrading.js +1 -1
- package/dist/cjs/src/oxfun.js +1 -1
- package/dist/cjs/src/p2b.js +1 -1
- package/dist/cjs/src/paradex.js +1 -1
- package/dist/cjs/src/paymium.js +1 -1
- package/dist/cjs/src/poloniex.js +1 -1
- package/dist/cjs/src/pro/alpaca.js +1 -1
- package/dist/cjs/src/pro/apex.js +1 -1
- package/dist/cjs/src/pro/arkham.js +1 -1
- package/dist/cjs/src/pro/ascendex.js +1 -1
- package/dist/cjs/src/pro/backpack.js +1 -1
- package/dist/cjs/src/pro/bequant.js +1 -1
- package/dist/cjs/src/pro/binance.js +59 -144
- package/dist/cjs/src/pro/binancecoinm.js +1 -1
- package/dist/cjs/src/pro/binanceus.js +1 -1
- package/dist/cjs/src/pro/binanceusdm.js +1 -1
- package/dist/cjs/src/pro/bingx.js +1 -1
- package/dist/cjs/src/pro/bitfinex.js +1 -1
- package/dist/cjs/src/pro/bitget.js +1 -1
- package/dist/cjs/src/pro/bithumb.js +1 -1
- package/dist/cjs/src/pro/bitmart.js +1 -1
- package/dist/cjs/src/pro/bitmex.js +1 -1
- package/dist/cjs/src/pro/bitrue.js +1 -1
- package/dist/cjs/src/pro/bitstamp.js +1 -1
- package/dist/cjs/src/pro/bitvavo.js +1 -1
- package/dist/cjs/src/pro/blockchaincom.js +1 -1
- package/dist/cjs/src/pro/blofin.js +1 -1
- package/dist/cjs/src/pro/bybit.js +1 -1
- package/dist/cjs/src/pro/cex.js +1 -1
- package/dist/cjs/src/pro/coinbase.js +1 -1
- package/dist/cjs/src/pro/coinbaseadvanced.js +1 -1
- package/dist/cjs/src/pro/coinbaseexchange.js +1 -1
- package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
- package/dist/cjs/src/pro/coincatch.js +1 -1
- package/dist/cjs/src/pro/coincheck.js +1 -1
- package/dist/cjs/src/pro/coinex.js +1 -1
- package/dist/cjs/src/pro/coinone.js +1 -1
- package/dist/cjs/src/pro/cryptocom.js +1 -1
- package/dist/cjs/src/pro/deepcoin.js +1 -1
- package/dist/cjs/src/pro/defx.js +1 -1
- package/dist/cjs/src/pro/deribit.js +1 -1
- package/dist/cjs/src/pro/dydx.js +418 -0
- package/dist/cjs/src/pro/exmo.js +1 -1
- package/dist/cjs/src/pro/gate.js +1 -1
- package/dist/cjs/src/pro/gateio.js +1 -1
- package/dist/cjs/src/pro/gemini.js +1 -1
- package/dist/cjs/src/pro/hashkey.js +1 -1
- package/dist/cjs/src/pro/hitbtc.js +1 -1
- package/dist/cjs/src/pro/hollaex.js +1 -1
- package/dist/cjs/src/pro/htx.js +1 -1
- package/dist/cjs/src/pro/huobi.js +1 -1
- package/dist/cjs/src/pro/hyperliquid.js +1 -1
- package/dist/cjs/src/pro/independentreserve.js +1 -1
- package/dist/cjs/src/pro/kraken.js +5 -4
- package/dist/cjs/src/pro/krakenfutures.js +1 -1
- package/dist/cjs/src/pro/kucoin.js +1 -1
- package/dist/cjs/src/pro/kucoinfutures.js +1 -1
- package/dist/cjs/src/pro/lbank.js +0 -1
- package/dist/cjs/src/pro/luno.js +1 -1
- package/dist/cjs/src/pro/mexc.js +1 -1
- package/dist/cjs/src/pro/myokx.js +1 -1
- package/dist/cjs/src/pro/ndax.js +1 -1
- package/dist/cjs/src/pro/okx.js +1 -1
- package/dist/cjs/src/pro/okxus.js +1 -1
- package/dist/cjs/src/pro/onetrading.js +1 -1
- package/dist/cjs/src/pro/oxfun.js +1 -1
- package/dist/cjs/src/pro/p2b.js +1 -1
- package/dist/cjs/src/pro/paradex.js +1 -1
- package/dist/cjs/src/pro/phemex.js +1 -1
- package/dist/cjs/src/pro/poloniex.js +1 -1
- package/dist/cjs/src/pro/probit.js +1 -1
- package/dist/cjs/src/pro/toobit.js +1 -1
- package/dist/cjs/src/pro/upbit.js +1 -1
- package/dist/cjs/src/pro/whitebit.js +1 -1
- package/dist/cjs/src/pro/xt.js +218 -5
- package/dist/cjs/src/probit.js +1 -1
- package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +2 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +55 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +55 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +47 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +342 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +716 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +59 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +44 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +379 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +71 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +210 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +194 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +48 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +56 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +55 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +37 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/long/index.cjs.js +9 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +58 -0
- package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +38 -0
- package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/coders/address.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/anonymous.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/array.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/boolean.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/null.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/number.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/string.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/coders/tuple.js +0 -1
- package/dist/cjs/src/static_dependencies/ethers/fragments.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/hash/typed-data.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/index.js +10 -1
- package/dist/cjs/src/static_dependencies/ethers/interface.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/typed.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/utils/base58.js +13 -1
- package/dist/cjs/src/static_dependencies/ethers/utils/data.js +6 -1
- package/dist/cjs/src/static_dependencies/ethers/utils/errors.js +9 -1
- package/dist/cjs/src/static_dependencies/ethers/utils/events.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/utils/fixednumber.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/utils/index.js +7 -1
- package/dist/cjs/src/static_dependencies/ethers/utils/maths.js +5 -1
- package/dist/cjs/src/static_dependencies/ethers/utils/properties.js +0 -6
- package/dist/cjs/src/static_dependencies/ethers/utils/utf8.js +8 -1
- package/dist/cjs/src/static_dependencies/fflake/browser.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -6
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -6
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -6
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -6
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -6
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1 -1
- package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -6
- package/dist/cjs/src/static_dependencies/messagepack/msgpack.js +0 -6
- package/dist/cjs/src/static_dependencies/noble-curves/_shortw_utils.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/curve.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/modular.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/montgomery.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/utils.js +0 -6
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/ed25519.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/p256.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/secp256k1.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/_assert.js +0 -6
- package/dist/cjs/src/static_dependencies/noble-hashes/_sha2.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/_u64.js +0 -6
- package/dist/cjs/src/static_dependencies/noble-hashes/crypto.js +0 -6
- package/dist/cjs/src/static_dependencies/noble-hashes/hmac.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/md5.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +68 -0
- package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +107 -0
- package/dist/cjs/src/static_dependencies/noble-hashes/sha1.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/sha256.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/sha3.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/sha512.js +0 -1
- package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +51 -2
- package/dist/cjs/src/static_dependencies/node-fetch/body.js +5 -1
- package/dist/cjs/src/static_dependencies/node-fetch/errors/abort-error.js +0 -1
- package/dist/cjs/src/static_dependencies/node-fetch/errors/base.js +0 -6
- package/dist/cjs/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -1
- package/dist/cjs/src/static_dependencies/node-fetch/headers.js +5 -1
- package/dist/cjs/src/static_dependencies/node-fetch/index.js +7 -1
- package/dist/cjs/src/static_dependencies/node-fetch/request.js +7 -1
- package/dist/cjs/src/static_dependencies/node-fetch/response.js +5 -1
- package/dist/cjs/src/static_dependencies/node-fetch/utils/get-search.js +0 -6
- package/dist/cjs/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -6
- package/dist/cjs/src/static_dependencies/node-fetch/utils/is.js +0 -6
- package/dist/cjs/src/static_dependencies/node-fetch/utils/referrer.js +0 -1
- package/dist/cjs/src/static_dependencies/proxies/agent-base/index.js +0 -1
- package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -1
- package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -1
- package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -6
- package/dist/cjs/src/static_dependencies/qs/formats.js +0 -6
- package/dist/cjs/src/static_dependencies/qs/index.js +0 -1
- package/dist/cjs/src/static_dependencies/qs/parse.js +0 -1
- package/dist/cjs/src/static_dependencies/qs/stringify.js +0 -1
- package/dist/cjs/src/static_dependencies/qs/utils.js +0 -6
- package/dist/cjs/src/static_dependencies/scure-base/index.js +29 -6
- package/dist/cjs/src/static_dependencies/scure-bip32/index.js +296 -0
- package/dist/cjs/src/static_dependencies/scure-bip39/index.js +97 -0
- package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +2054 -0
- package/dist/cjs/src/static_dependencies/scure-starknet/index.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/constants.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +0 -6
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +1 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +4 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +3 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/num.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +0 -1
- package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +1 -1
- package/dist/cjs/src/static_dependencies/watchable/src/unpromise.js +0 -6
- package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +1 -5
- package/dist/cjs/src/timex.js +0 -1
- package/dist/cjs/src/tokocrypto.js +1 -1
- package/dist/cjs/src/toobit.js +3 -2
- package/dist/cjs/src/upbit.js +1 -1
- package/dist/cjs/src/wavesexchange.js +1 -1
- package/dist/cjs/src/whitebit.js +1 -1
- package/dist/cjs/src/woo.js +1 -1
- package/dist/cjs/src/woofipro.js +1 -1
- package/dist/cjs/src/xt.js +1 -1
- package/dist/cjs/src/yobit.js +1 -1
- package/dist/cjs/src/zaif.js +1 -1
- package/dist/cjs/src/zonda.js +1 -1
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -8
- package/js/src/abstract/alpaca.js +0 -6
- package/js/src/abstract/apex.js +0 -6
- package/js/src/abstract/arkham.js +0 -6
- package/js/src/abstract/ascendex.js +0 -6
- package/js/src/abstract/backpack.js +0 -6
- package/js/src/abstract/bequant.js +0 -6
- package/js/src/abstract/bigone.js +0 -6
- package/js/src/abstract/binance.js +0 -6
- package/js/src/abstract/binancecoinm.js +0 -6
- package/js/src/abstract/binanceus.js +0 -6
- package/js/src/abstract/binanceusdm.js +0 -6
- package/js/src/abstract/bingx.js +0 -6
- package/js/src/abstract/bit2c.js +0 -6
- package/js/src/abstract/bitbank.js +0 -6
- package/js/src/abstract/bitbns.js +0 -6
- package/js/src/abstract/bitfinex.js +0 -6
- package/js/src/abstract/bitflyer.js +0 -6
- package/js/src/abstract/bitget.d.ts +1 -0
- package/js/src/abstract/bitget.js +0 -6
- package/js/src/abstract/bithumb.js +0 -6
- package/js/src/abstract/bitmart.js +0 -6
- package/js/src/abstract/bitmex.js +0 -6
- package/js/src/abstract/bitopro.js +0 -6
- package/js/src/abstract/bitrue.js +0 -6
- package/js/src/abstract/bitso.js +0 -6
- package/js/src/abstract/bitstamp.js +0 -6
- package/js/src/abstract/bitteam.js +0 -6
- package/js/src/abstract/bittrade.js +0 -6
- package/js/src/abstract/bitvavo.js +0 -6
- package/js/src/abstract/blockchaincom.js +0 -6
- package/js/src/abstract/blofin.js +0 -6
- package/js/src/abstract/btcalpha.js +0 -6
- package/js/src/abstract/btcbox.js +0 -6
- package/js/src/abstract/btcmarkets.js +0 -6
- package/js/src/abstract/btcturk.js +0 -6
- package/js/src/abstract/bybit.js +0 -6
- package/js/src/abstract/cex.js +0 -6
- package/js/src/abstract/coinbase.js +0 -6
- package/js/src/abstract/coinbaseadvanced.js +0 -6
- package/js/src/abstract/coinbaseexchange.js +0 -6
- package/js/src/abstract/coinbaseinternational.js +0 -6
- package/js/src/abstract/coincatch.js +0 -6
- package/js/src/abstract/coincheck.js +0 -6
- package/js/src/abstract/coinex.js +0 -6
- package/js/src/abstract/coinmate.js +0 -6
- package/js/src/abstract/coinmetro.js +0 -6
- package/js/src/abstract/coinone.js +0 -6
- package/js/src/abstract/coinsph.js +0 -6
- package/js/src/abstract/coinspot.js +0 -6
- package/js/src/abstract/cryptocom.js +0 -6
- package/js/src/abstract/cryptomus.js +0 -6
- package/js/src/abstract/deepcoin.js +0 -6
- package/js/src/abstract/defx.js +0 -6
- package/js/src/abstract/delta.js +0 -6
- package/js/src/abstract/deribit.js +0 -6
- package/js/src/abstract/derive.js +0 -6
- package/js/src/abstract/digifinex.js +0 -6
- package/js/src/abstract/dydx.d.ts +61 -0
- package/js/src/abstract/dydx.js +5 -0
- package/js/src/abstract/exmo.js +0 -6
- package/js/src/abstract/fmfwio.js +0 -6
- package/js/src/abstract/foxbit.js +0 -6
- package/js/src/abstract/gate.js +0 -6
- package/js/src/abstract/gateio.js +0 -6
- package/js/src/abstract/gemini.js +0 -6
- package/js/src/abstract/hashkey.js +0 -6
- package/js/src/abstract/hibachi.js +0 -6
- package/js/src/abstract/hitbtc.js +0 -6
- package/js/src/abstract/hollaex.js +0 -6
- package/js/src/abstract/htx.js +0 -6
- package/js/src/abstract/huobi.js +0 -6
- package/js/src/abstract/hyperliquid.js +0 -6
- package/js/src/abstract/independentreserve.js +0 -6
- package/js/src/abstract/indodax.js +0 -6
- package/js/src/abstract/kraken.js +0 -6
- package/js/src/abstract/krakenfutures.js +0 -6
- package/js/src/abstract/kucoin.d.ts +1 -1
- package/js/src/abstract/kucoin.js +0 -6
- package/js/src/abstract/kucoinfutures.d.ts +1 -1
- package/js/src/abstract/kucoinfutures.js +0 -6
- package/js/src/abstract/latoken.js +0 -6
- package/js/src/abstract/lbank.js +0 -6
- package/js/src/abstract/luno.js +0 -6
- package/js/src/abstract/mercado.js +0 -6
- package/js/src/abstract/mexc.js +0 -6
- package/js/src/abstract/modetrade.js +0 -6
- package/js/src/abstract/myokx.js +0 -6
- package/js/src/abstract/ndax.js +0 -6
- package/js/src/abstract/novadax.js +0 -6
- package/js/src/abstract/oceanex.js +0 -6
- package/js/src/abstract/okx.js +0 -6
- package/js/src/abstract/okxus.js +0 -6
- package/js/src/abstract/onetrading.js +0 -6
- package/js/src/abstract/oxfun.js +0 -6
- package/js/src/abstract/p2b.js +0 -6
- package/js/src/abstract/paradex.js +0 -6
- package/js/src/abstract/paymium.js +0 -6
- package/js/src/abstract/phemex.js +0 -6
- package/js/src/abstract/poloniex.js +0 -6
- package/js/src/abstract/probit.js +0 -6
- package/js/src/abstract/timex.js +0 -6
- package/js/src/abstract/tokocrypto.js +0 -6
- package/js/src/abstract/toobit.js +0 -6
- package/js/src/abstract/upbit.js +0 -6
- package/js/src/abstract/wavesexchange.js +0 -6
- package/js/src/abstract/whitebit.js +0 -6
- package/js/src/abstract/woo.js +0 -6
- package/js/src/abstract/woofipro.js +0 -6
- package/js/src/abstract/xt.js +0 -6
- package/js/src/abstract/yobit.js +0 -6
- package/js/src/abstract/zaif.js +0 -6
- package/js/src/abstract/zonda.js +0 -6
- package/js/src/alpaca.js +0 -6
- package/js/src/apex.js +0 -6
- package/js/src/arkham.js +0 -6
- package/js/src/ascendex.js +0 -6
- package/js/src/backpack.js +0 -6
- package/js/src/base/Exchange.d.ts +7 -0
- package/js/src/base/Exchange.js +157 -7
- package/js/src/base/Precise.js +0 -6
- package/js/src/base/errorHierarchy.js +0 -6
- package/js/src/base/errors.js +0 -6
- package/js/src/base/functions/crypto.js +0 -6
- package/js/src/base/functions/encode.js +0 -6
- package/js/src/base/functions/generic.js +0 -6
- package/js/src/base/functions/misc.js +0 -6
- package/js/src/base/functions/number.js +0 -6
- package/js/src/base/functions/platform.js +0 -6
- package/js/src/base/functions/rsa.js +0 -6
- package/js/src/base/functions/string.js +0 -6
- package/js/src/base/functions/throttle.js +0 -6
- package/js/src/base/functions/time.js +0 -6
- package/js/src/base/functions/totp.js +0 -6
- package/js/src/base/functions/type.js +0 -6
- package/js/src/base/functions.js +0 -6
- package/js/src/base/types.js +0 -6
- package/js/src/base/ws/Cache.js +0 -6
- package/js/src/base/ws/Client.js +0 -6
- package/js/src/base/ws/Future.js +0 -6
- package/js/src/base/ws/OrderBook.js +0 -6
- package/js/src/base/ws/OrderBookSide.js +0 -6
- package/js/src/base/ws/WsClient.js +0 -6
- package/js/src/base/ws/functions.js +0 -6
- package/js/src/bequant.js +0 -6
- package/js/src/bigone.js +0 -6
- package/js/src/binance.js +0 -6
- package/js/src/binancecoinm.js +0 -6
- package/js/src/binanceus.js +0 -6
- package/js/src/binanceusdm.js +0 -6
- package/js/src/bingx.js +20 -6
- package/js/src/bit2c.js +0 -6
- package/js/src/bitbank.js +0 -6
- package/js/src/bitbns.js +0 -6
- package/js/src/bitfinex.js +0 -6
- package/js/src/bitflyer.js +0 -6
- package/js/src/bitget.d.ts +3 -3
- package/js/src/bitget.js +43 -47
- package/js/src/bithumb.js +0 -6
- package/js/src/bitmart.js +0 -6
- package/js/src/bitmex.js +0 -6
- package/js/src/bitopro.js +0 -6
- package/js/src/bitrue.js +0 -6
- package/js/src/bitso.js +0 -6
- package/js/src/bitstamp.js +0 -6
- package/js/src/bitteam.js +0 -6
- package/js/src/bittrade.js +0 -6
- package/js/src/bitvavo.js +0 -6
- package/js/src/blockchaincom.js +0 -6
- package/js/src/blofin.js +0 -6
- package/js/src/btcalpha.js +0 -6
- package/js/src/btcbox.js +0 -6
- package/js/src/btcmarkets.js +0 -6
- package/js/src/btcturk.js +0 -6
- package/js/src/bybit.js +0 -6
- package/js/src/cex.js +0 -6
- package/js/src/coinbase.js +0 -6
- package/js/src/coinbaseadvanced.js +0 -6
- package/js/src/coinbaseexchange.js +0 -6
- package/js/src/coinbaseinternational.js +0 -6
- package/js/src/coincatch.js +0 -6
- package/js/src/coincheck.js +0 -6
- package/js/src/coinex.js +0 -6
- package/js/src/coinmate.js +0 -6
- package/js/src/coinmetro.js +0 -6
- package/js/src/coinone.js +0 -6
- package/js/src/coinsph.js +0 -6
- package/js/src/coinspot.js +0 -6
- package/js/src/cryptocom.js +0 -6
- package/js/src/cryptomus.js +0 -6
- package/js/src/deepcoin.js +0 -6
- package/js/src/defx.js +0 -6
- package/js/src/delta.js +0 -6
- package/js/src/deribit.js +6 -6
- package/js/src/derive.js +0 -6
- package/js/src/digifinex.js +0 -6
- package/js/src/dydx.d.ts +364 -0
- package/js/src/dydx.js +2446 -0
- package/js/src/exmo.js +0 -6
- package/js/src/fmfwio.js +0 -6
- package/js/src/foxbit.js +0 -6
- package/js/src/gate.js +0 -6
- package/js/src/gateio.js +0 -6
- package/js/src/gemini.js +0 -6
- package/js/src/hashkey.js +0 -6
- package/js/src/hibachi.js +1 -7
- package/js/src/hitbtc.js +0 -6
- package/js/src/hollaex.js +0 -6
- package/js/src/htx.js +0 -6
- package/js/src/huobi.js +0 -6
- package/js/src/hyperliquid.js +0 -6
- package/js/src/independentreserve.js +0 -6
- package/js/src/indodax.js +0 -6
- package/js/src/kraken.js +0 -6
- package/js/src/krakenfutures.js +0 -6
- package/js/src/kucoin.d.ts +48 -1
- package/js/src/kucoin.js +711 -115
- package/js/src/kucoinfutures.js +0 -6
- package/js/src/latoken.js +0 -6
- package/js/src/lbank.js +0 -6
- package/js/src/luno.js +0 -6
- package/js/src/mercado.js +0 -6
- package/js/src/mexc.js +0 -6
- package/js/src/modetrade.js +0 -6
- package/js/src/myokx.js +0 -6
- package/js/src/ndax.js +0 -6
- package/js/src/novadax.js +0 -6
- package/js/src/oceanex.js +0 -6
- package/js/src/okx.js +0 -6
- package/js/src/okxus.js +0 -6
- package/js/src/onetrading.js +0 -6
- package/js/src/oxfun.js +0 -6
- package/js/src/p2b.js +0 -6
- package/js/src/paradex.js +0 -6
- package/js/src/paymium.js +0 -6
- package/js/src/phemex.js +0 -6
- package/js/src/poloniex.js +0 -6
- package/js/src/pro/alpaca.js +0 -6
- package/js/src/pro/apex.js +0 -6
- package/js/src/pro/arkham.js +0 -6
- package/js/src/pro/ascendex.js +0 -6
- package/js/src/pro/backpack.js +0 -6
- package/js/src/pro/bequant.js +0 -6
- package/js/src/pro/binance.d.ts +2 -2
- package/js/src/pro/binance.js +59 -150
- package/js/src/pro/binancecoinm.js +0 -6
- package/js/src/pro/binanceus.js +0 -6
- package/js/src/pro/binanceusdm.js +0 -6
- package/js/src/pro/bingx.js +0 -6
- package/js/src/pro/bitfinex.js +0 -6
- package/js/src/pro/bitget.js +0 -6
- package/js/src/pro/bithumb.js +0 -6
- package/js/src/pro/bitmart.js +0 -6
- package/js/src/pro/bitmex.js +0 -6
- package/js/src/pro/bitopro.js +0 -6
- package/js/src/pro/bitrue.js +0 -6
- package/js/src/pro/bitstamp.js +0 -6
- package/js/src/pro/bittrade.js +0 -6
- package/js/src/pro/bitvavo.js +0 -6
- package/js/src/pro/blockchaincom.js +0 -6
- package/js/src/pro/blofin.js +0 -6
- package/js/src/pro/bybit.js +0 -6
- package/js/src/pro/cex.js +0 -6
- package/js/src/pro/coinbase.js +0 -6
- package/js/src/pro/coinbaseadvanced.js +0 -6
- package/js/src/pro/coinbaseexchange.js +0 -6
- package/js/src/pro/coinbaseinternational.js +0 -6
- package/js/src/pro/coincatch.js +0 -6
- package/js/src/pro/coincheck.js +0 -6
- package/js/src/pro/coinex.js +0 -6
- package/js/src/pro/coinone.js +0 -6
- package/js/src/pro/cryptocom.js +0 -6
- package/js/src/pro/deepcoin.js +0 -6
- package/js/src/pro/defx.js +0 -6
- package/js/src/pro/deribit.js +0 -6
- package/js/src/pro/derive.js +0 -6
- package/js/src/pro/dydx.d.ts +81 -0
- package/js/src/pro/dydx.js +411 -0
- package/js/src/pro/exmo.js +0 -6
- package/js/src/pro/gate.js +0 -6
- package/js/src/pro/gateio.js +0 -6
- package/js/src/pro/gemini.js +0 -6
- package/js/src/pro/hashkey.js +0 -6
- package/js/src/pro/hitbtc.js +0 -6
- package/js/src/pro/hollaex.js +0 -6
- package/js/src/pro/htx.js +0 -6
- package/js/src/pro/huobi.js +0 -6
- package/js/src/pro/hyperliquid.js +0 -6
- package/js/src/pro/independentreserve.js +0 -6
- package/js/src/pro/kraken.js +4 -9
- package/js/src/pro/krakenfutures.js +0 -6
- package/js/src/pro/kucoin.js +0 -6
- package/js/src/pro/kucoinfutures.js +0 -6
- package/js/src/pro/lbank.js +0 -6
- package/js/src/pro/luno.js +0 -6
- package/js/src/pro/mexc.js +0 -6
- package/js/src/pro/modetrade.js +0 -6
- package/js/src/pro/myokx.js +0 -6
- package/js/src/pro/ndax.js +0 -6
- package/js/src/pro/okx.js +0 -6
- package/js/src/pro/okxus.js +0 -6
- package/js/src/pro/onetrading.js +0 -6
- package/js/src/pro/oxfun.js +0 -6
- package/js/src/pro/p2b.js +0 -6
- package/js/src/pro/paradex.js +0 -6
- package/js/src/pro/phemex.js +0 -6
- package/js/src/pro/poloniex.js +0 -6
- package/js/src/pro/probit.js +0 -6
- package/js/src/pro/toobit.js +0 -6
- package/js/src/pro/upbit.js +0 -6
- package/js/src/pro/whitebit.js +0 -6
- package/js/src/pro/woo.js +0 -6
- package/js/src/pro/woofipro.js +0 -6
- package/js/src/pro/xt.d.ts +85 -2
- package/js/src/pro/xt.js +217 -10
- package/js/src/probit.js +0 -6
- package/js/src/protobuf/mexc/compiled.cjs +0 -6
- package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.d.ts +90 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +157 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.d.ts +26 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +45 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.d.ts +48 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +79 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.d.ts +40 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +71 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.d.ts +162 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +323 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.d.ts +460 -0
- package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +692 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.d.ts +127 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +280 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.d.ts +66 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +103 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.d.ts +127 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +251 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.d.ts +48 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +87 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.d.ts +23 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +37 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.d.ts +92 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +158 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.d.ts +124 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +190 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.d.ts +159 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +318 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.d.ts +546 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +866 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.d.ts +84 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +175 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.d.ts +397 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +751 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.d.ts +120 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +240 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.d.ts +79 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +141 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.d.ts +32 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +53 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.d.ts +34 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +60 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.d.ts +62 -0
- package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +105 -0
- package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.d.ts +207 -0
- package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +44 -0
- package/js/src/static_dependencies/dydx-v4-client/helpers.d.ts +82 -0
- package/js/src/static_dependencies/dydx-v4-client/helpers.js +144 -0
- package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +1467 -0
- package/js/src/static_dependencies/dydx-v4-client/long/index.d.cts +2 -0
- package/js/src/static_dependencies/dydx-v4-client/onboarding.d.ts +35 -0
- package/js/src/static_dependencies/dydx-v4-client/onboarding.js +50 -0
- package/js/src/static_dependencies/dydx-v4-client/registry.d.ts +7 -0
- package/js/src/static_dependencies/dydx-v4-client/registry.js +30 -0
- package/js/src/static_dependencies/ethers/abi-coder.js +0 -6
- package/js/src/static_dependencies/ethers/address/address.js +0 -6
- package/js/src/static_dependencies/ethers/address/checks.js +0 -6
- package/js/src/static_dependencies/ethers/address/contract-address.js +0 -6
- package/js/src/static_dependencies/ethers/address/index.js +0 -6
- package/js/src/static_dependencies/ethers/bytes32.js +0 -6
- package/js/src/static_dependencies/ethers/coders/abstract-coder.js +0 -6
- package/js/src/static_dependencies/ethers/coders/address.js +0 -6
- package/js/src/static_dependencies/ethers/coders/anonymous.js +0 -6
- package/js/src/static_dependencies/ethers/coders/array.js +0 -6
- package/js/src/static_dependencies/ethers/coders/boolean.js +0 -6
- package/js/src/static_dependencies/ethers/coders/bytes.js +0 -6
- package/js/src/static_dependencies/ethers/coders/fixed-bytes.js +0 -6
- package/js/src/static_dependencies/ethers/coders/null.js +0 -6
- package/js/src/static_dependencies/ethers/coders/number.js +0 -6
- package/js/src/static_dependencies/ethers/coders/string.js +0 -6
- package/js/src/static_dependencies/ethers/coders/tuple.js +0 -6
- package/js/src/static_dependencies/ethers/fragments.js +0 -6
- package/js/src/static_dependencies/ethers/hash/index.js +0 -6
- package/js/src/static_dependencies/ethers/hash/solidity.js +0 -6
- package/js/src/static_dependencies/ethers/hash/typed-data.js +0 -6
- package/js/src/static_dependencies/ethers/index.js +0 -6
- package/js/src/static_dependencies/ethers/interface.js +0 -6
- package/js/src/static_dependencies/ethers/typed.js +0 -6
- package/js/src/static_dependencies/ethers/utils/base58.js +0 -6
- package/js/src/static_dependencies/ethers/utils/base64-browser.js +0 -6
- package/js/src/static_dependencies/ethers/utils/base64.js +0 -6
- package/js/src/static_dependencies/ethers/utils/data.js +0 -6
- package/js/src/static_dependencies/ethers/utils/errors.js +0 -6
- package/js/src/static_dependencies/ethers/utils/events.js +0 -6
- package/js/src/static_dependencies/ethers/utils/fixednumber.js +0 -6
- package/js/src/static_dependencies/ethers/utils/index.js +0 -6
- package/js/src/static_dependencies/ethers/utils/maths.js +0 -6
- package/js/src/static_dependencies/ethers/utils/properties.js +0 -6
- package/js/src/static_dependencies/ethers/utils/rlp-decode.js +0 -6
- package/js/src/static_dependencies/ethers/utils/rlp-encode.js +0 -6
- package/js/src/static_dependencies/ethers/utils/rlp.js +0 -6
- package/js/src/static_dependencies/ethers/utils/units.js +0 -6
- package/js/src/static_dependencies/ethers/utils/utf8.js +0 -6
- package/js/src/static_dependencies/ethers/utils/uuid.js +0 -6
- package/js/src/static_dependencies/fflake/browser.js +0 -6
- package/js/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -6
- package/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -6
- package/js/src/static_dependencies/jsencrypt/index.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/asn1js/oids.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +0 -6
- package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -6
- package/js/src/static_dependencies/messagepack/msgpack.js +0 -6
- package/js/src/static_dependencies/noble-curves/_shortw_utils.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/curve.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/edwards.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/modular.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/montgomery.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/poseidon.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/utils.js +0 -6
- package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +0 -6
- package/js/src/static_dependencies/noble-curves/bn.js +0 -6
- package/js/src/static_dependencies/noble-curves/ed25519.js +0 -6
- package/js/src/static_dependencies/noble-curves/ed448.js +0 -6
- package/js/src/static_dependencies/noble-curves/index.js +0 -6
- package/js/src/static_dependencies/noble-curves/jubjub.js +0 -6
- package/js/src/static_dependencies/noble-curves/p256.js +0 -6
- package/js/src/static_dependencies/noble-curves/p384.js +0 -6
- package/js/src/static_dependencies/noble-curves/p521.js +0 -6
- package/js/src/static_dependencies/noble-curves/pasta.js +0 -6
- package/js/src/static_dependencies/noble-curves/secp256k1.js +0 -6
- package/js/src/static_dependencies/noble-hashes/_assert.js +0 -6
- package/js/src/static_dependencies/noble-hashes/_blake2.js +0 -6
- package/js/src/static_dependencies/noble-hashes/_sha2.js +0 -6
- package/js/src/static_dependencies/noble-hashes/_u64.js +0 -6
- package/js/src/static_dependencies/noble-hashes/argon2.js +0 -6
- package/js/src/static_dependencies/noble-hashes/blake2b.js +0 -6
- package/js/src/static_dependencies/noble-hashes/blake2s.js +0 -6
- package/js/src/static_dependencies/noble-hashes/blake3.js +0 -6
- package/js/src/static_dependencies/noble-hashes/crypto.js +0 -6
- package/js/src/static_dependencies/noble-hashes/cryptoNode.js +0 -6
- package/js/src/static_dependencies/noble-hashes/eskdf.js +0 -6
- package/js/src/static_dependencies/noble-hashes/hkdf.js +0 -6
- package/js/src/static_dependencies/noble-hashes/hmac.js +0 -6
- package/js/src/static_dependencies/noble-hashes/index.js +0 -6
- package/js/src/static_dependencies/noble-hashes/md5.js +0 -6
- package/js/src/static_dependencies/noble-hashes/pbkdf2.js +0 -6
- package/js/src/static_dependencies/noble-hashes/ripemd160.js +0 -6
- package/js/src/static_dependencies/noble-hashes/scrypt.js +0 -6
- package/js/src/static_dependencies/noble-hashes/sha1.js +0 -6
- package/js/src/static_dependencies/noble-hashes/sha256.js +0 -6
- package/js/src/static_dependencies/noble-hashes/sha3-addons.js +0 -6
- package/js/src/static_dependencies/noble-hashes/sha3.js +0 -6
- package/js/src/static_dependencies/noble-hashes/sha512.js +0 -6
- package/js/src/static_dependencies/noble-hashes/utils.d.ts +1 -0
- package/js/src/static_dependencies/noble-hashes/utils.js +4 -6
- package/js/src/static_dependencies/node-fetch/body.js +0 -6
- package/js/src/static_dependencies/node-fetch/errors/abort-error.js +0 -6
- package/js/src/static_dependencies/node-fetch/errors/base.js +0 -6
- package/js/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -6
- package/js/src/static_dependencies/node-fetch/headers.js +0 -6
- package/js/src/static_dependencies/node-fetch/index.js +0 -6
- package/js/src/static_dependencies/node-fetch/request.js +0 -6
- package/js/src/static_dependencies/node-fetch/response.js +0 -6
- package/js/src/static_dependencies/node-fetch/utils/get-search.js +0 -6
- package/js/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -6
- package/js/src/static_dependencies/node-fetch/utils/is.js +0 -6
- package/js/src/static_dependencies/node-fetch/utils/referrer.js +0 -6
- package/js/src/static_dependencies/proxies/agent-base/helpers.js +0 -6
- package/js/src/static_dependencies/proxies/agent-base/index.js +0 -6
- package/js/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -6
- package/js/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -6
- package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -6
- package/js/src/static_dependencies/qs/formats.js +0 -6
- package/js/src/static_dependencies/qs/index.js +0 -6
- package/js/src/static_dependencies/qs/parse.js +0 -6
- package/js/src/static_dependencies/qs/stringify.js +0 -6
- package/js/src/static_dependencies/qs/utils.js +0 -6
- package/js/src/static_dependencies/scure-base/index.js +0 -6
- package/js/src/static_dependencies/scure-bip32/index.d.ts +49 -0
- package/js/src/static_dependencies/scure-bip32/index.js +289 -0
- package/js/src/static_dependencies/scure-bip39/index.d.ts +54 -0
- package/js/src/static_dependencies/scure-bip39/index.js +134 -0
- package/js/src/static_dependencies/scure-bip39/wordlists/english.d.ts +1 -0
- package/js/src/static_dependencies/scure-bip39/wordlists/english.js +2048 -0
- package/js/src/static_dependencies/scure-starknet/index.js +0 -6
- package/js/src/static_dependencies/starknet/constants.js +0 -6
- package/js/src/static_dependencies/starknet/index.js +0 -6
- package/js/src/static_dependencies/starknet/types/cairoEnum.js +0 -6
- package/js/src/static_dependencies/starknet/types/calldata.js +0 -6
- package/js/src/static_dependencies/starknet/types/index.js +0 -6
- package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +0 -6
- package/js/src/static_dependencies/starknet/types/lib/contract/index.js +0 -6
- package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +0 -6
- package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +0 -6
- package/js/src/static_dependencies/starknet/types/lib/index.js +0 -6
- package/js/src/static_dependencies/starknet/types/typedData.js +0 -6
- package/js/src/static_dependencies/starknet/utils/address.js +0 -6
- package/js/src/static_dependencies/starknet/utils/assert.js +0 -6
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +0 -6
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +0 -6
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/index.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +0 -6
- package/js/src/static_dependencies/starknet/utils/calldata/validate.js +0 -6
- package/js/src/static_dependencies/starknet/utils/encode.js +0 -6
- package/js/src/static_dependencies/starknet/utils/hash/classHash.js +0 -6
- package/js/src/static_dependencies/starknet/utils/hash/index.js +0 -6
- package/js/src/static_dependencies/starknet/utils/merkle.js +0 -6
- package/js/src/static_dependencies/starknet/utils/num.js +0 -6
- package/js/src/static_dependencies/starknet/utils/selector.js +0 -6
- package/js/src/static_dependencies/starknet/utils/shortString.js +0 -6
- package/js/src/static_dependencies/starknet/utils/starknetId.js +0 -6
- package/js/src/static_dependencies/starknet/utils/typedData.js +0 -6
- package/js/src/static_dependencies/starknet/utils/uint256.js +0 -6
- package/js/src/static_dependencies/starknet/utils/url.js +0 -6
- package/js/src/static_dependencies/watchable/src/index.js +0 -6
- package/js/src/static_dependencies/watchable/src/types.js +0 -6
- package/js/src/static_dependencies/watchable/src/unpromise.js +0 -6
- package/js/src/static_dependencies/zklink/zklink-sdk-web.js +0 -6
- package/js/src/timex.js +0 -6
- package/js/src/tokocrypto.js +0 -6
- package/js/src/toobit.js +2 -7
- package/js/src/upbit.js +0 -6
- package/js/src/wavesexchange.js +0 -6
- package/js/src/whitebit.js +0 -6
- package/js/src/woo.js +0 -6
- package/js/src/woofipro.js +0 -6
- package/js/src/xt.js +0 -6
- package/js/src/yobit.js +0 -6
- package/js/src/zaif.js +0 -6
- package/js/src/zonda.js +0 -6
- package/package.json +9 -3
|
@@ -0,0 +1,2453 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var dydx$1 = require('./abstract/dydx.js');
|
|
6
|
+
var errors = require('./base/errors.js');
|
|
7
|
+
var number = require('./base/functions/number.js');
|
|
8
|
+
var Precise = require('./base/Precise.js');
|
|
9
|
+
var sha3 = require('./static_dependencies/noble-hashes/sha3.js');
|
|
10
|
+
var secp256k1 = require('./static_dependencies/noble-curves/secp256k1.js');
|
|
11
|
+
var crypto = require('./base/functions/crypto.js');
|
|
12
|
+
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* @class dydx
|
|
17
|
+
* @augments Exchange
|
|
18
|
+
*/
|
|
19
|
+
class dydx extends dydx$1["default"] {
|
|
20
|
+
describe() {
|
|
21
|
+
return this.deepExtend(super.describe(), {
|
|
22
|
+
'id': 'dydx',
|
|
23
|
+
'name': 'dYdX',
|
|
24
|
+
'countries': ['US'],
|
|
25
|
+
'rateLimit': 100,
|
|
26
|
+
'version': 'v4',
|
|
27
|
+
'certified': false,
|
|
28
|
+
'pro': true,
|
|
29
|
+
'has': {
|
|
30
|
+
'CORS': undefined,
|
|
31
|
+
'spot': false,
|
|
32
|
+
'margin': false,
|
|
33
|
+
'swap': true,
|
|
34
|
+
'future': false,
|
|
35
|
+
'option': false,
|
|
36
|
+
'addMargin': false,
|
|
37
|
+
'cancelAllOrders': false,
|
|
38
|
+
'cancelAllOrdersAfter': false,
|
|
39
|
+
'cancelOrder': true,
|
|
40
|
+
'cancelOrders': true,
|
|
41
|
+
'cancelWithdraw': false,
|
|
42
|
+
'closeAllPositions': false,
|
|
43
|
+
'closePosition': false,
|
|
44
|
+
'createConvertTrade': false,
|
|
45
|
+
'createDepositAddress': false,
|
|
46
|
+
'createMarketBuyOrderWithCost': false,
|
|
47
|
+
'createMarketOrder': false,
|
|
48
|
+
'createMarketOrderWithCost': false,
|
|
49
|
+
'createMarketSellOrderWithCost': false,
|
|
50
|
+
'createOrder': true,
|
|
51
|
+
'createOrderWithTakeProfitAndStopLoss': false,
|
|
52
|
+
'createReduceOnlyOrder': false,
|
|
53
|
+
'createStopLimitOrder': false,
|
|
54
|
+
'createStopLossOrder': false,
|
|
55
|
+
'createStopMarketOrder': false,
|
|
56
|
+
'createStopOrder': false,
|
|
57
|
+
'createTakeProfitOrder': false,
|
|
58
|
+
'createTrailingAmountOrder': false,
|
|
59
|
+
'createTrailingPercentOrder': false,
|
|
60
|
+
'createTriggerOrder': false,
|
|
61
|
+
'fetchAccounts': true,
|
|
62
|
+
'fetchBalance': true,
|
|
63
|
+
'fetchCanceledOrders': false,
|
|
64
|
+
'fetchClosedOrder': false,
|
|
65
|
+
'fetchClosedOrders': true,
|
|
66
|
+
'fetchConvertCurrencies': false,
|
|
67
|
+
'fetchConvertQuote': false,
|
|
68
|
+
'fetchConvertTrade': false,
|
|
69
|
+
'fetchConvertTradeHistory': false,
|
|
70
|
+
'fetchCurrencies': false,
|
|
71
|
+
'fetchDepositAddress': false,
|
|
72
|
+
'fetchDepositAddresses': false,
|
|
73
|
+
'fetchDepositAddressesByNetwork': false,
|
|
74
|
+
'fetchDeposits': true,
|
|
75
|
+
'fetchDepositsWithdrawals': true,
|
|
76
|
+
'fetchFundingHistory': false,
|
|
77
|
+
'fetchFundingInterval': false,
|
|
78
|
+
'fetchFundingIntervals': false,
|
|
79
|
+
'fetchFundingRate': false,
|
|
80
|
+
'fetchFundingRateHistory': true,
|
|
81
|
+
'fetchFundingRates': false,
|
|
82
|
+
'fetchIndexOHLCV': false,
|
|
83
|
+
'fetchLedger': true,
|
|
84
|
+
'fetchLeverage': false,
|
|
85
|
+
'fetchMarginAdjustmentHistory': false,
|
|
86
|
+
'fetchMarginMode': false,
|
|
87
|
+
'fetchMarkets': true,
|
|
88
|
+
'fetchMarkOHLCV': false,
|
|
89
|
+
'fetchMyTrades': false,
|
|
90
|
+
'fetchOHLCV': true,
|
|
91
|
+
'fetchOpenInterestHistory': false,
|
|
92
|
+
'fetchOpenOrder': false,
|
|
93
|
+
'fetchOpenOrders': true,
|
|
94
|
+
'fetchOrder': true,
|
|
95
|
+
'fetchOrderBook': true,
|
|
96
|
+
'fetchOrders': true,
|
|
97
|
+
'fetchOrderTrades': false,
|
|
98
|
+
'fetchPosition': true,
|
|
99
|
+
'fetchPositionHistory': false,
|
|
100
|
+
'fetchPositionMode': false,
|
|
101
|
+
'fetchPositions': true,
|
|
102
|
+
'fetchPositionsHistory': false,
|
|
103
|
+
'fetchPremiumIndexOHLCV': false,
|
|
104
|
+
'fetchStatus': false,
|
|
105
|
+
'fetchTicker': false,
|
|
106
|
+
'fetchTickers': false,
|
|
107
|
+
'fetchTime': true,
|
|
108
|
+
'fetchTrades': true,
|
|
109
|
+
'fetchTradingFee': false,
|
|
110
|
+
'fetchTradingFees': false,
|
|
111
|
+
'fetchTransactions': false,
|
|
112
|
+
'fetchTransfers': true,
|
|
113
|
+
'fetchWithdrawals': true,
|
|
114
|
+
'reduceMargin': false,
|
|
115
|
+
'sandbox': false,
|
|
116
|
+
'setLeverage': false,
|
|
117
|
+
'setMargin': false,
|
|
118
|
+
'setPositionMode': false,
|
|
119
|
+
'transfer': true,
|
|
120
|
+
'withdraw': true,
|
|
121
|
+
},
|
|
122
|
+
'timeframes': {
|
|
123
|
+
'1m': '1MIN',
|
|
124
|
+
'5m': '5MINS',
|
|
125
|
+
'15m': '15MINS',
|
|
126
|
+
'30m': '30MINS',
|
|
127
|
+
'1h': '1HOUR',
|
|
128
|
+
'4h': '4HOURS',
|
|
129
|
+
'1d': '1DAY',
|
|
130
|
+
},
|
|
131
|
+
'urls': {
|
|
132
|
+
'logo': 'https://github.com/user-attachments/assets/617ea0c1-f05a-4d26-9fcb-a0d1d4091ae1',
|
|
133
|
+
'api': {
|
|
134
|
+
'indexer': 'https://indexer.dydx.trade/v4',
|
|
135
|
+
'nodeRpc': 'https://dydx-ops-rpc.kingnodes.com',
|
|
136
|
+
'nodeRest': 'https://dydx-rest.publicnode.com',
|
|
137
|
+
},
|
|
138
|
+
'test': {
|
|
139
|
+
'indexer': 'https://indexer.v4testnet.dydx.exchange/v4',
|
|
140
|
+
'nodeRpc': 'https://test-dydx-rpc.kingnodes.com',
|
|
141
|
+
'nodeRest': 'https://test-dydx-rest.kingnodes.com',
|
|
142
|
+
},
|
|
143
|
+
'www': 'https://www.dydx.xyz',
|
|
144
|
+
'doc': [
|
|
145
|
+
'https://docs.dydx.xyz',
|
|
146
|
+
],
|
|
147
|
+
'fees': [
|
|
148
|
+
'https://docs.dydx.exchange/introduction-trading_fees',
|
|
149
|
+
],
|
|
150
|
+
'referral': 'dydx.trade?ref=ccxt',
|
|
151
|
+
},
|
|
152
|
+
'api': {
|
|
153
|
+
'indexer': {
|
|
154
|
+
'get': {
|
|
155
|
+
'addresses/{address}': 1,
|
|
156
|
+
'addresses/{address}/parentSubaccountNumber/{number}': 1,
|
|
157
|
+
'addresses/{address}/subaccountNumber/{subaccountNumber}': 1,
|
|
158
|
+
'assetPositions': 1,
|
|
159
|
+
'assetPositions/parentSubaccountNumber': 1,
|
|
160
|
+
'candles/perpetualMarkets/{market}': 1,
|
|
161
|
+
'compliance/screen/{address}': 1,
|
|
162
|
+
'fills': 1,
|
|
163
|
+
'fills/parentSubaccountNumber': 1,
|
|
164
|
+
'fundingPayments': 1,
|
|
165
|
+
'fundingPayments/parentSubaccount': 1,
|
|
166
|
+
'height': 0.1,
|
|
167
|
+
'historical-pnl': 1,
|
|
168
|
+
'historical-pnl/parentSubaccountNumber': 1,
|
|
169
|
+
'historicalBlockTradingRewards/{address}': 1,
|
|
170
|
+
'historicalFunding/{market}': 1,
|
|
171
|
+
'historicalTradingRewardAggregations/{address}': 1,
|
|
172
|
+
'orderbooks/perpetualMarket/{market}': 1,
|
|
173
|
+
'orders': 1,
|
|
174
|
+
'orders/parentSubaccountNumber': 1,
|
|
175
|
+
'orders/{orderId}': 1,
|
|
176
|
+
'perpetualMarkets': 1,
|
|
177
|
+
'perpetualPositions': 1,
|
|
178
|
+
'perpetualPositions/parentSubaccountNumber': 1,
|
|
179
|
+
'screen': 1,
|
|
180
|
+
'sparklines': 1,
|
|
181
|
+
'time': 1,
|
|
182
|
+
'trades/perpetualMarket/{market}': 1,
|
|
183
|
+
'transfers': 1,
|
|
184
|
+
'transfers/between': 1,
|
|
185
|
+
'transfers/parentSubaccountNumber': 1,
|
|
186
|
+
'vault/v1/megavault/historicalPnl': 1,
|
|
187
|
+
'vault/v1/megavault/positions': 1,
|
|
188
|
+
'vault/v1/vaults/historicalPnl': 1,
|
|
189
|
+
//
|
|
190
|
+
'perpetualMarketSparklines': 1,
|
|
191
|
+
'perpetualMarkets/{ticker}': 1,
|
|
192
|
+
'perpetualMarkets/{ticker}/orderbook': 1,
|
|
193
|
+
'trades/perpetualMarket/{ticker}': 1,
|
|
194
|
+
'historicalFunding/{ticker}': 1,
|
|
195
|
+
'candles/{ticker}/{resolution}': 1,
|
|
196
|
+
'addresses/{address}/subaccounts': 1,
|
|
197
|
+
'addresses/{address}/subaccountNumber/{subaccountNumber}/assetPositions': 1,
|
|
198
|
+
'addresses/{address}/subaccountNumber/{subaccountNumber}/perpetualPositions': 1,
|
|
199
|
+
'addresses/{address}/subaccountNumber/{subaccountNumber}/orders': 1,
|
|
200
|
+
'fills/parentSubaccount': 1,
|
|
201
|
+
'historical-pnl/parentSubaccount': 1,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
'nodeRpc': {
|
|
205
|
+
'get': {
|
|
206
|
+
'abci_info': 1,
|
|
207
|
+
'block': 1,
|
|
208
|
+
'broadcast_tx_async': 1,
|
|
209
|
+
'broadcast_tx_sync': 1,
|
|
210
|
+
'tx': 1,
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
'nodeRest': {
|
|
214
|
+
'get': {
|
|
215
|
+
'cosmos/auth/v1beta1/account_info/{dydxAddress}': 1,
|
|
216
|
+
},
|
|
217
|
+
'post': {
|
|
218
|
+
'cosmos/tx/v1beta1/encode': 1,
|
|
219
|
+
'cosmos/tx/v1beta1/simulate': 1,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
'fees': {
|
|
224
|
+
'trading': {
|
|
225
|
+
'tierBased': true,
|
|
226
|
+
'percentage': true,
|
|
227
|
+
'maker': this.parseNumber('0.0001'),
|
|
228
|
+
'taker': this.parseNumber('0.0005'),
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
'requiredCredentials': {
|
|
232
|
+
'apiKey': false,
|
|
233
|
+
'secret': false,
|
|
234
|
+
'privateKey': false,
|
|
235
|
+
},
|
|
236
|
+
'options': {
|
|
237
|
+
'mnemonic': undefined,
|
|
238
|
+
'chainName': 'dydx-mainnet-1',
|
|
239
|
+
'chainId': 1,
|
|
240
|
+
'sandboxMode': false,
|
|
241
|
+
'defaultFeeDenom': 'uusdc',
|
|
242
|
+
'defaultFeeMultiplier': '1.6',
|
|
243
|
+
'feeDenom': {
|
|
244
|
+
'USDC_DENOM': 'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
|
|
245
|
+
'USDC_GAS_DENOM': 'uusdc',
|
|
246
|
+
'USDC_DECIMALS': 6,
|
|
247
|
+
'USDC_GAS_PRICE': '0.025',
|
|
248
|
+
'CHAINTOKEN_DENOM': 'adydx',
|
|
249
|
+
'CHAINTOKEN_DECIMALS': 18,
|
|
250
|
+
'CHAINTOKEN_GAS_PRICE': '25000000000',
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
'features': {
|
|
254
|
+
'default': {
|
|
255
|
+
'sandbox': true,
|
|
256
|
+
'createOrder': {
|
|
257
|
+
'marginMode': false,
|
|
258
|
+
'triggerPrice': true,
|
|
259
|
+
'triggerPriceType': {
|
|
260
|
+
'last': true,
|
|
261
|
+
'mark': true,
|
|
262
|
+
'index': false,
|
|
263
|
+
},
|
|
264
|
+
'triggerDirection': false,
|
|
265
|
+
'stopLossPrice': false,
|
|
266
|
+
'takeProfitPrice': false,
|
|
267
|
+
'attachedStopLossTakeProfit': undefined,
|
|
268
|
+
'timeInForce': {
|
|
269
|
+
'IOC': true,
|
|
270
|
+
'FOK': true,
|
|
271
|
+
'PO': true,
|
|
272
|
+
'GTD': true,
|
|
273
|
+
},
|
|
274
|
+
'hedged': false,
|
|
275
|
+
'trailing': false,
|
|
276
|
+
'leverage': false,
|
|
277
|
+
'marketBuyByCost': false,
|
|
278
|
+
'marketBuyRequiresPrice': false,
|
|
279
|
+
'selfTradePrevention': false,
|
|
280
|
+
'iceberg': false,
|
|
281
|
+
},
|
|
282
|
+
'createOrders': undefined,
|
|
283
|
+
'fetchMyTrades': {
|
|
284
|
+
'marginMode': false,
|
|
285
|
+
'limit': 500,
|
|
286
|
+
'daysBack': 90,
|
|
287
|
+
'untilDays': 10000,
|
|
288
|
+
'symbolRequired': false,
|
|
289
|
+
},
|
|
290
|
+
'fetchOrder': {
|
|
291
|
+
'marginMode': false,
|
|
292
|
+
'trigger': true,
|
|
293
|
+
'trailing': false,
|
|
294
|
+
'symbolRequired': false,
|
|
295
|
+
},
|
|
296
|
+
'fetchOpenOrders': {
|
|
297
|
+
'marginMode': false,
|
|
298
|
+
'limit': 500,
|
|
299
|
+
'trigger': true,
|
|
300
|
+
'trailing': true,
|
|
301
|
+
'symbolRequired': false,
|
|
302
|
+
},
|
|
303
|
+
'fetchOrders': {
|
|
304
|
+
'marginMode': false,
|
|
305
|
+
'limit': 500,
|
|
306
|
+
'daysBack': undefined,
|
|
307
|
+
'untilDays': 100000,
|
|
308
|
+
'trigger': true,
|
|
309
|
+
'trailing': true,
|
|
310
|
+
'symbolRequired': false,
|
|
311
|
+
},
|
|
312
|
+
'fetchClosedOrders': {
|
|
313
|
+
'marginMode': false,
|
|
314
|
+
'limit': 500,
|
|
315
|
+
'daysBack': undefined,
|
|
316
|
+
'daysBackCanceled': undefined,
|
|
317
|
+
'untilDays': 100000,
|
|
318
|
+
'trigger': true,
|
|
319
|
+
'trailing': true,
|
|
320
|
+
'symbolRequired': false,
|
|
321
|
+
},
|
|
322
|
+
'fetchOHLCV': {
|
|
323
|
+
'limit': 1000,
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
'forSwap': {
|
|
327
|
+
'extends': 'default',
|
|
328
|
+
'createOrder': {
|
|
329
|
+
'hedged': true,
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
'swap': {
|
|
333
|
+
'linear': {
|
|
334
|
+
'extends': 'forSwap',
|
|
335
|
+
},
|
|
336
|
+
'inverse': undefined,
|
|
337
|
+
},
|
|
338
|
+
'future': {
|
|
339
|
+
'linear': undefined,
|
|
340
|
+
'inverse': undefined,
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
'commonCurrencies': {},
|
|
344
|
+
'exceptions': {
|
|
345
|
+
'exact': {
|
|
346
|
+
// error collision for clob and sending modules from 2 - 8
|
|
347
|
+
// https://github.com/dydxprotocol/v4-chain/blob/5f9f6c9b95cc87d732e23de764909703b81a6e8b/protocol/x/clob/types/errors.go#L320
|
|
348
|
+
// https://github.com/dydxprotocol/v4-chain/blob/5f9f6c9b95cc87d732e23de764909703b81a6e8b/protocol/x/sending/types/errors.go
|
|
349
|
+
'9': errors.InvalidOrder,
|
|
350
|
+
'10': errors.InvalidOrder,
|
|
351
|
+
'11': errors.InvalidOrder,
|
|
352
|
+
'12': errors.InvalidOrder,
|
|
353
|
+
'13': errors.InvalidOrder,
|
|
354
|
+
'14': errors.InvalidOrder,
|
|
355
|
+
'15': errors.InvalidOrder,
|
|
356
|
+
'16': errors.InvalidOrder,
|
|
357
|
+
'17': errors.InvalidOrder,
|
|
358
|
+
'18': errors.InvalidOrder,
|
|
359
|
+
'19': errors.InvalidOrder,
|
|
360
|
+
'20': errors.InvalidOrder,
|
|
361
|
+
'21': errors.InvalidOrder,
|
|
362
|
+
'22': errors.InvalidOrder,
|
|
363
|
+
'23': errors.InvalidOrder,
|
|
364
|
+
'24': errors.InvalidOrder,
|
|
365
|
+
'25': errors.InvalidOrder,
|
|
366
|
+
'26': errors.InvalidOrder,
|
|
367
|
+
'27': errors.InvalidOrder,
|
|
368
|
+
'28': errors.InvalidOrder,
|
|
369
|
+
'29': errors.InvalidOrder,
|
|
370
|
+
'30': errors.InvalidOrder,
|
|
371
|
+
'31': errors.InvalidOrder,
|
|
372
|
+
'32': errors.InvalidOrder,
|
|
373
|
+
'33': errors.InvalidOrder,
|
|
374
|
+
'34': errors.InvalidOrder,
|
|
375
|
+
'35': errors.InvalidOrder,
|
|
376
|
+
'36': errors.InvalidOrder,
|
|
377
|
+
'37': errors.InvalidOrder,
|
|
378
|
+
'39': errors.InvalidOrder,
|
|
379
|
+
'40': errors.InvalidOrder,
|
|
380
|
+
'41': errors.InvalidOrder,
|
|
381
|
+
'42': errors.InvalidOrder,
|
|
382
|
+
'43': errors.InvalidOrder,
|
|
383
|
+
'44': errors.InvalidOrder,
|
|
384
|
+
'45': errors.InvalidOrder,
|
|
385
|
+
'46': errors.InvalidOrder,
|
|
386
|
+
'47': errors.InvalidOrder,
|
|
387
|
+
'48': errors.InvalidOrder,
|
|
388
|
+
'49': errors.InvalidOrder,
|
|
389
|
+
'50': errors.InvalidOrder,
|
|
390
|
+
'1000': errors.BadRequest,
|
|
391
|
+
'1001': errors.BadRequest,
|
|
392
|
+
'1002': errors.BadRequest,
|
|
393
|
+
'1003': errors.InvalidOrder,
|
|
394
|
+
'1004': errors.InvalidOrder,
|
|
395
|
+
'1005': errors.InvalidOrder,
|
|
396
|
+
'1006': errors.InvalidOrder,
|
|
397
|
+
'1007': errors.InvalidOrder,
|
|
398
|
+
'1008': errors.InvalidOrder,
|
|
399
|
+
'1009': errors.InvalidOrder,
|
|
400
|
+
'1010': errors.InvalidOrder,
|
|
401
|
+
'1011': errors.InvalidOrder,
|
|
402
|
+
'1012': errors.InvalidOrder,
|
|
403
|
+
'1013': errors.InvalidOrder,
|
|
404
|
+
'1014': errors.InvalidOrder,
|
|
405
|
+
'1015': errors.InvalidOrder,
|
|
406
|
+
'1017': errors.InvalidOrder,
|
|
407
|
+
'1018': errors.InvalidOrder,
|
|
408
|
+
'1019': errors.InvalidOrder,
|
|
409
|
+
'1020': errors.InvalidOrder,
|
|
410
|
+
'1021': errors.InvalidOrder,
|
|
411
|
+
'1022': errors.InvalidOrder,
|
|
412
|
+
'2000': errors.InvalidOrder,
|
|
413
|
+
'2001': errors.InvalidOrder,
|
|
414
|
+
'2002': errors.InvalidOrder,
|
|
415
|
+
'2003': errors.InvalidOrder,
|
|
416
|
+
'2004': errors.InvalidOrder,
|
|
417
|
+
'2005': errors.InvalidOrder,
|
|
418
|
+
'3000': errors.InvalidOrder,
|
|
419
|
+
'3001': errors.InvalidOrder,
|
|
420
|
+
'3002': errors.InvalidOrder,
|
|
421
|
+
'3003': errors.InvalidOrder,
|
|
422
|
+
'3004': errors.InvalidOrder,
|
|
423
|
+
'3005': errors.InvalidOrder,
|
|
424
|
+
'3006': errors.InvalidOrder,
|
|
425
|
+
'3007': errors.InvalidOrder,
|
|
426
|
+
'3008': errors.InvalidOrder,
|
|
427
|
+
'3009': errors.InvalidOrder,
|
|
428
|
+
'3010': errors.InvalidOrder,
|
|
429
|
+
'4000': errors.InvalidOrder,
|
|
430
|
+
'4001': errors.InvalidOrder,
|
|
431
|
+
'4002': errors.InvalidOrder,
|
|
432
|
+
'4003': errors.InvalidOrder,
|
|
433
|
+
'4004': errors.InvalidOrder,
|
|
434
|
+
'4005': errors.InvalidOrder,
|
|
435
|
+
'4006': errors.InvalidOrder,
|
|
436
|
+
'4007': errors.InvalidOrder,
|
|
437
|
+
'4008': errors.InvalidOrder,
|
|
438
|
+
'5000': errors.InvalidOrder,
|
|
439
|
+
'5001': errors.InvalidOrder,
|
|
440
|
+
'6000': errors.InvalidOrder,
|
|
441
|
+
'6001': errors.InvalidOrder,
|
|
442
|
+
'6002': errors.InvalidOrder,
|
|
443
|
+
'9000': errors.InvalidOrder,
|
|
444
|
+
'9001': errors.InvalidOrder,
|
|
445
|
+
'9002': errors.InvalidOrder,
|
|
446
|
+
'9003': errors.InvalidOrder,
|
|
447
|
+
'10000': errors.InvalidOrder,
|
|
448
|
+
'10001': errors.InvalidOrder,
|
|
449
|
+
'11000': errors.InvalidOrder, // Invalid order router address
|
|
450
|
+
},
|
|
451
|
+
'broad': {
|
|
452
|
+
'insufficient funds': errors.InsufficientFunds,
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
'precisionMode': number.TICK_SIZE,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* @method
|
|
460
|
+
* @name dydx#fetchTime
|
|
461
|
+
* @description fetches the current integer timestamp in milliseconds from the exchange server
|
|
462
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-time
|
|
463
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
464
|
+
* @returns {int} the current integer timestamp in milliseconds from the exchange server
|
|
465
|
+
*/
|
|
466
|
+
async fetchTime(params = {}) {
|
|
467
|
+
const response = await this.indexerGetTime(params);
|
|
468
|
+
//
|
|
469
|
+
// {
|
|
470
|
+
// "iso": "2025-07-20T15:12:13.466Z",
|
|
471
|
+
// "epoch": 1753024333.466
|
|
472
|
+
// }
|
|
473
|
+
//
|
|
474
|
+
return this.safeInteger(response, 'epoch');
|
|
475
|
+
}
|
|
476
|
+
parseMarket(market) {
|
|
477
|
+
//
|
|
478
|
+
// {
|
|
479
|
+
// "clobPairId": "0",
|
|
480
|
+
// "ticker": "BTC-USD",
|
|
481
|
+
// "status": "ACTIVE",
|
|
482
|
+
// "oraclePrice": "118976.5376",
|
|
483
|
+
// "priceChange24H": "659.9736",
|
|
484
|
+
// "volume24H": "1292729.3605",
|
|
485
|
+
// "trades24H": 9387,
|
|
486
|
+
// "nextFundingRate": "0",
|
|
487
|
+
// "initialMarginFraction": "0.02",
|
|
488
|
+
// "maintenanceMarginFraction": "0.012",
|
|
489
|
+
// "openInterest": "52.0691",
|
|
490
|
+
// "atomicResolution": -10,
|
|
491
|
+
// "quantumConversionExponent": -9,
|
|
492
|
+
// "tickSize": "1",
|
|
493
|
+
// "stepSize": "0.0001",
|
|
494
|
+
// "stepBaseQuantums": 1000000,
|
|
495
|
+
// "subticksPerTick": 100000,
|
|
496
|
+
// "marketType": "CROSS",
|
|
497
|
+
// "openInterestLowerCap": "0",
|
|
498
|
+
// "openInterestUpperCap": "0",
|
|
499
|
+
// "baseOpenInterest": "50.3776",
|
|
500
|
+
// "defaultFundingRate1H": "0"
|
|
501
|
+
// }
|
|
502
|
+
//
|
|
503
|
+
const quoteId = 'USDC';
|
|
504
|
+
const marketId = this.safeString(market, 'ticker');
|
|
505
|
+
const parts = marketId.split('-');
|
|
506
|
+
const baseName = this.safeString(parts, 0);
|
|
507
|
+
const base = this.safeCurrencyCode(baseName);
|
|
508
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
509
|
+
const baseId = this.safeString(market, 'baseId');
|
|
510
|
+
const settleId = 'USDC';
|
|
511
|
+
const settle = this.safeCurrencyCode(settleId);
|
|
512
|
+
const symbol = base + '/' + quote + ':' + settle;
|
|
513
|
+
const contract = true;
|
|
514
|
+
const swap = true;
|
|
515
|
+
const amountPrecisionStr = this.safeString(market, 'stepSize');
|
|
516
|
+
const pricePrecisionStr = this.safeString(market, 'tickSize');
|
|
517
|
+
const status = this.safeString(market, 'status');
|
|
518
|
+
let active = true;
|
|
519
|
+
if (status !== 'ACTIVE') {
|
|
520
|
+
active = false;
|
|
521
|
+
}
|
|
522
|
+
return this.safeMarketStructure({
|
|
523
|
+
'id': this.safeString(market, 'ticker'),
|
|
524
|
+
'symbol': symbol,
|
|
525
|
+
'base': base,
|
|
526
|
+
'quote': quote,
|
|
527
|
+
'settle': settle,
|
|
528
|
+
'baseId': baseId,
|
|
529
|
+
'baseName': baseName,
|
|
530
|
+
'quoteId': quoteId,
|
|
531
|
+
'settleId': settleId,
|
|
532
|
+
'type': 'swap',
|
|
533
|
+
'spot': false,
|
|
534
|
+
'margin': undefined,
|
|
535
|
+
'swap': swap,
|
|
536
|
+
'future': false,
|
|
537
|
+
'option': false,
|
|
538
|
+
'active': active,
|
|
539
|
+
'contract': contract,
|
|
540
|
+
'linear': true,
|
|
541
|
+
'inverse': false,
|
|
542
|
+
'taker': undefined,
|
|
543
|
+
'maker': undefined,
|
|
544
|
+
'contractSize': undefined,
|
|
545
|
+
'expiry': undefined,
|
|
546
|
+
'expiryDatetime': undefined,
|
|
547
|
+
'strike': undefined,
|
|
548
|
+
'optionType': undefined,
|
|
549
|
+
'precision': {
|
|
550
|
+
'amount': this.parseNumber(amountPrecisionStr),
|
|
551
|
+
'price': this.parseNumber(pricePrecisionStr),
|
|
552
|
+
},
|
|
553
|
+
'limits': {
|
|
554
|
+
'leverage': {
|
|
555
|
+
'min': undefined,
|
|
556
|
+
'max': undefined,
|
|
557
|
+
},
|
|
558
|
+
'amount': {
|
|
559
|
+
'min': undefined,
|
|
560
|
+
'max': undefined,
|
|
561
|
+
},
|
|
562
|
+
'price': {
|
|
563
|
+
'min': undefined,
|
|
564
|
+
'max': undefined,
|
|
565
|
+
},
|
|
566
|
+
'cost': {
|
|
567
|
+
'min': undefined,
|
|
568
|
+
'max': undefined,
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
'created': undefined,
|
|
572
|
+
'info': market,
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* @method
|
|
577
|
+
* @name dydx#fetchMarkets
|
|
578
|
+
* @description retrieves data on all markets for hyperliquid
|
|
579
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-perpetual-markets
|
|
580
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
581
|
+
* @returns {object[]} an array of objects representing market data
|
|
582
|
+
*/
|
|
583
|
+
async fetchMarkets(params = {}) {
|
|
584
|
+
const request = {
|
|
585
|
+
// 'limit': 1000,
|
|
586
|
+
};
|
|
587
|
+
const response = await this.indexerGetPerpetualMarkets(this.extend(request, params));
|
|
588
|
+
//
|
|
589
|
+
// {
|
|
590
|
+
// "markets": {
|
|
591
|
+
// "BTC-USD": {
|
|
592
|
+
// "clobPairId": "0",
|
|
593
|
+
// "ticker": "BTC-USD",
|
|
594
|
+
// "status": "ACTIVE",
|
|
595
|
+
// "oraclePrice": "118976.5376",
|
|
596
|
+
// "priceChange24H": "659.9736",
|
|
597
|
+
// "volume24H": "1292729.3605",
|
|
598
|
+
// "trades24H": 9387,
|
|
599
|
+
// "nextFundingRate": "0",
|
|
600
|
+
// "initialMarginFraction": "0.02",
|
|
601
|
+
// "maintenanceMarginFraction": "0.012",
|
|
602
|
+
// "openInterest": "52.0691",
|
|
603
|
+
// "atomicResolution": -10,
|
|
604
|
+
// "quantumConversionExponent": -9,
|
|
605
|
+
// "tickSize": "1",
|
|
606
|
+
// "stepSize": "0.0001",
|
|
607
|
+
// "stepBaseQuantums": 1000000,
|
|
608
|
+
// "subticksPerTick": 100000,
|
|
609
|
+
// "marketType": "CROSS",
|
|
610
|
+
// "openInterestLowerCap": "0",
|
|
611
|
+
// "openInterestUpperCap": "0",
|
|
612
|
+
// "baseOpenInterest": "50.3776",
|
|
613
|
+
// "defaultFundingRate1H": "0"
|
|
614
|
+
// }
|
|
615
|
+
// }
|
|
616
|
+
// }
|
|
617
|
+
//
|
|
618
|
+
const data = this.safeDict(response, 'markets', {});
|
|
619
|
+
const markets = Object.values(data);
|
|
620
|
+
return this.parseMarkets(markets);
|
|
621
|
+
}
|
|
622
|
+
parseTrade(trade, market = undefined) {
|
|
623
|
+
//
|
|
624
|
+
// {
|
|
625
|
+
// "id": "02ac5b1f0000000200000002",
|
|
626
|
+
// "side": "BUY",
|
|
627
|
+
// "size": "0.0501",
|
|
628
|
+
// "price": "115732",
|
|
629
|
+
// "type": "LIMIT",
|
|
630
|
+
// "createdAt": "2025-07-25T05:11:09.800Z",
|
|
631
|
+
// "createdAtHeight": "44849951"
|
|
632
|
+
// }
|
|
633
|
+
//
|
|
634
|
+
const timestamp = this.parse8601(this.safeString(trade, 'createdAt'));
|
|
635
|
+
const symbol = market['symbol'];
|
|
636
|
+
const price = this.safeString(trade, 'price');
|
|
637
|
+
const amount = this.safeString(trade, 'size');
|
|
638
|
+
const side = this.safeStringLower(trade, 'side');
|
|
639
|
+
const id = this.safeString(trade, 'id');
|
|
640
|
+
return this.safeTrade({
|
|
641
|
+
'id': id,
|
|
642
|
+
'timestamp': timestamp,
|
|
643
|
+
'datetime': this.iso8601(timestamp),
|
|
644
|
+
'symbol': symbol,
|
|
645
|
+
'side': side,
|
|
646
|
+
'price': price,
|
|
647
|
+
'amount': amount,
|
|
648
|
+
'cost': undefined,
|
|
649
|
+
'order': undefined,
|
|
650
|
+
'takerOrMaker': undefined,
|
|
651
|
+
'type': undefined,
|
|
652
|
+
'fee': undefined,
|
|
653
|
+
'info': trade,
|
|
654
|
+
}, market);
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* @method
|
|
658
|
+
* @name dydx#fetchTrades
|
|
659
|
+
* @description get the list of most recent trades for a particular symbol
|
|
660
|
+
* @see https://developer.woox.io/api-reference/endpoint/public_data/marketTrades
|
|
661
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
662
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
663
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
664
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
665
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
666
|
+
*/
|
|
667
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
668
|
+
await this.loadMarkets();
|
|
669
|
+
const market = this.market(symbol);
|
|
670
|
+
const request = {
|
|
671
|
+
'market': market['id'],
|
|
672
|
+
};
|
|
673
|
+
if (limit !== undefined) {
|
|
674
|
+
request['limit'] = limit;
|
|
675
|
+
}
|
|
676
|
+
const response = await this.indexerGetTradesPerpetualMarketMarket(this.extend(request, params));
|
|
677
|
+
//
|
|
678
|
+
// {
|
|
679
|
+
// "trades": [
|
|
680
|
+
// {
|
|
681
|
+
// "id": "02ac5b1f0000000200000002",
|
|
682
|
+
// "side": "BUY",
|
|
683
|
+
// "size": "0.0501",
|
|
684
|
+
// "price": "115732",
|
|
685
|
+
// "type": "LIMIT",
|
|
686
|
+
// "createdAt": "2025-07-25T05:11:09.800Z",
|
|
687
|
+
// "createdAtHeight": "44849951"
|
|
688
|
+
// }
|
|
689
|
+
// ]
|
|
690
|
+
// }
|
|
691
|
+
//
|
|
692
|
+
const rows = this.safeList(response, 'trades', []);
|
|
693
|
+
return this.parseTrades(rows, market, since, limit);
|
|
694
|
+
}
|
|
695
|
+
parseOHLCV(ohlcv, market = undefined) {
|
|
696
|
+
//
|
|
697
|
+
// {
|
|
698
|
+
// "startedAt": "2025-07-25T09:47:00.000Z",
|
|
699
|
+
// "ticker": "BTC-USD",
|
|
700
|
+
// "resolution": "1MIN",
|
|
701
|
+
// "low": "116099",
|
|
702
|
+
// "high": "116099",
|
|
703
|
+
// "open": "116099",
|
|
704
|
+
// "close": "116099",
|
|
705
|
+
// "baseTokenVolume": "0",
|
|
706
|
+
// "usdVolume": "0",
|
|
707
|
+
// "trades": 0,
|
|
708
|
+
// "startingOpenInterest": "54.0594",
|
|
709
|
+
// "orderbookMidPriceOpen": "115845.5",
|
|
710
|
+
// "orderbookMidPriceClose": "115845.5"
|
|
711
|
+
// }
|
|
712
|
+
//
|
|
713
|
+
return [
|
|
714
|
+
this.parse8601(this.safeString(ohlcv, 'startedAt')),
|
|
715
|
+
this.safeNumber(ohlcv, 'open'),
|
|
716
|
+
this.safeNumber(ohlcv, 'high'),
|
|
717
|
+
this.safeNumber(ohlcv, 'low'),
|
|
718
|
+
this.safeNumber(ohlcv, 'close'),
|
|
719
|
+
this.safeNumber(ohlcv, 'baseTokenVolume'),
|
|
720
|
+
];
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* @method
|
|
724
|
+
* @name dydx#fetchOHLCV
|
|
725
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-candles
|
|
726
|
+
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
727
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
728
|
+
* @param {string} timeframe the length of time each candle represents
|
|
729
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
730
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
731
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
732
|
+
* @param {int} [params.until] the latest time in ms to fetch entries for
|
|
733
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
734
|
+
*/
|
|
735
|
+
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
736
|
+
await this.loadMarkets();
|
|
737
|
+
const market = this.market(symbol);
|
|
738
|
+
const request = {
|
|
739
|
+
'market': market['id'],
|
|
740
|
+
'resolution': this.safeString(this.timeframes, timeframe, timeframe),
|
|
741
|
+
};
|
|
742
|
+
if (limit !== undefined) {
|
|
743
|
+
request['limit'] = Math.min(limit, 1000);
|
|
744
|
+
}
|
|
745
|
+
if (since !== undefined) {
|
|
746
|
+
request['fromIso'] = this.iso8601(since);
|
|
747
|
+
}
|
|
748
|
+
const until = this.safeInteger(params, 'until');
|
|
749
|
+
params = this.omit(params, 'until');
|
|
750
|
+
if (until !== undefined) {
|
|
751
|
+
request['toIso'] = this.iso8601(until);
|
|
752
|
+
}
|
|
753
|
+
const response = await this.indexerGetCandlesPerpetualMarketsMarket(this.extend(request, params));
|
|
754
|
+
//
|
|
755
|
+
// {
|
|
756
|
+
// "candles": [
|
|
757
|
+
// {
|
|
758
|
+
// "startedAt": "2025-07-25T09:47:00.000Z",
|
|
759
|
+
// "ticker": "BTC-USD",
|
|
760
|
+
// "resolution": "1MIN",
|
|
761
|
+
// "low": "116099",
|
|
762
|
+
// "high": "116099",
|
|
763
|
+
// "open": "116099",
|
|
764
|
+
// "close": "116099",
|
|
765
|
+
// "baseTokenVolume": "0",
|
|
766
|
+
// "usdVolume": "0",
|
|
767
|
+
// "trades": 0,
|
|
768
|
+
// "startingOpenInterest": "54.0594",
|
|
769
|
+
// "orderbookMidPriceOpen": "115845.5",
|
|
770
|
+
// "orderbookMidPriceClose": "115845.5"
|
|
771
|
+
// }
|
|
772
|
+
// ]
|
|
773
|
+
// }
|
|
774
|
+
//
|
|
775
|
+
const rows = this.safeList(response, 'candles', []);
|
|
776
|
+
return this.parseOHLCVs(rows, market, timeframe, since, limit);
|
|
777
|
+
}
|
|
778
|
+
/**
|
|
779
|
+
* @method
|
|
780
|
+
* @name dydx#fetchFundingRateHistory
|
|
781
|
+
* @description fetches historical funding rate prices
|
|
782
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-historical-funding
|
|
783
|
+
* @param {string} symbol unified symbol of the market to fetch the funding rate history for
|
|
784
|
+
* @param {int} [since] timestamp in ms of the earliest funding rate to fetch
|
|
785
|
+
* @param {int} [limit] the maximum amount of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure} to fetch
|
|
786
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
787
|
+
* @param {int} [params.until] timestamp in ms of the latest funding rate
|
|
788
|
+
* @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
|
|
789
|
+
*/
|
|
790
|
+
async fetchFundingRateHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
791
|
+
if (symbol === undefined) {
|
|
792
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchFundingRateHistory() requires a symbol argument');
|
|
793
|
+
}
|
|
794
|
+
await this.loadMarkets();
|
|
795
|
+
const market = this.market(symbol);
|
|
796
|
+
const request = {
|
|
797
|
+
'market': market['id'],
|
|
798
|
+
};
|
|
799
|
+
if (limit !== undefined) {
|
|
800
|
+
request['limit'] = limit;
|
|
801
|
+
}
|
|
802
|
+
const until = this.safeInteger(params, 'until');
|
|
803
|
+
if (until !== undefined) {
|
|
804
|
+
request['effectiveBeforeOrAt'] = this.iso8601(until);
|
|
805
|
+
}
|
|
806
|
+
const response = await this.indexerGetHistoricalFundingMarket(this.extend(request, params));
|
|
807
|
+
//
|
|
808
|
+
// {
|
|
809
|
+
// "historicalFunding": [
|
|
810
|
+
// {
|
|
811
|
+
// "ticker": "BTC-USD",
|
|
812
|
+
// "rate": "0",
|
|
813
|
+
// "price": "116302.62419",
|
|
814
|
+
// "effectiveAtHeight": "44865196",
|
|
815
|
+
// "effectiveAt": "2025-07-25T11:00:00.013Z"
|
|
816
|
+
// }
|
|
817
|
+
// ]
|
|
818
|
+
// }
|
|
819
|
+
//
|
|
820
|
+
const rates = [];
|
|
821
|
+
const rows = this.safeList(response, 'historicalFunding', []);
|
|
822
|
+
for (let i = 0; i < rows.length; i++) {
|
|
823
|
+
const entry = rows[i];
|
|
824
|
+
const timestamp = this.parse8601(this.safeString(entry, 'effectiveAt'));
|
|
825
|
+
const marketId = this.safeString(entry, 'ticker');
|
|
826
|
+
rates.push({
|
|
827
|
+
'info': entry,
|
|
828
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
829
|
+
'fundingRate': this.safeNumber(entry, 'rate'),
|
|
830
|
+
'timestamp': timestamp,
|
|
831
|
+
'datetime': this.iso8601(timestamp),
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
const sorted = this.sortBy(rates, 'timestamp');
|
|
835
|
+
return this.filterBySymbolSinceLimit(sorted, symbol, since, limit);
|
|
836
|
+
}
|
|
837
|
+
handlePublicAddress(methodName, params) {
|
|
838
|
+
let userAux = undefined;
|
|
839
|
+
[userAux, params] = this.handleOptionAndParams(params, methodName, 'user');
|
|
840
|
+
let user = userAux;
|
|
841
|
+
[user, params] = this.handleOptionAndParams(params, methodName, 'address', userAux);
|
|
842
|
+
if ((user !== undefined) && (user !== '')) {
|
|
843
|
+
return [user, params];
|
|
844
|
+
}
|
|
845
|
+
if ((this.walletAddress !== undefined) && (this.walletAddress !== '')) {
|
|
846
|
+
return [this.walletAddress, params];
|
|
847
|
+
}
|
|
848
|
+
throw new errors.ArgumentsRequired(this.id + ' ' + methodName + '() requires a user parameter inside \'params\' or the walletAddress set');
|
|
849
|
+
}
|
|
850
|
+
parseOrder(order, market = undefined) {
|
|
851
|
+
//
|
|
852
|
+
// {
|
|
853
|
+
// "id": "dad46410-3444-5566-a129-19a619300fb7",
|
|
854
|
+
// "subaccountId": "8586bcf6-1f58-5ec9-a0bc-e53db273e7b0",
|
|
855
|
+
// "clientId": "716238006",
|
|
856
|
+
// "clobPairId": "0",
|
|
857
|
+
// "side": "BUY",
|
|
858
|
+
// "size": "0.001",
|
|
859
|
+
// "totalFilled": "0.001",
|
|
860
|
+
// "price": "400000",
|
|
861
|
+
// "type": "LIMIT",
|
|
862
|
+
// "status": "FILLED",
|
|
863
|
+
// "timeInForce": "GTT",
|
|
864
|
+
// "reduceOnly": false,
|
|
865
|
+
// "orderFlags": "64",
|
|
866
|
+
// "goodTilBlockTime": "2025-07-28T12:07:33.000Z",
|
|
867
|
+
// "createdAtHeight": "45058325",
|
|
868
|
+
// "clientMetadata": "2",
|
|
869
|
+
// "updatedAt": "2025-07-28T12:06:35.330Z",
|
|
870
|
+
// "updatedAtHeight": "45058326",
|
|
871
|
+
// "postOnly": false,
|
|
872
|
+
// "ticker": "BTC-USD",
|
|
873
|
+
// "subaccountNumber": 0
|
|
874
|
+
// }
|
|
875
|
+
//
|
|
876
|
+
const status = this.parseOrderStatus(this.safeStringUpper(order, 'status'));
|
|
877
|
+
const marketId = this.safeString(order, 'ticker');
|
|
878
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
879
|
+
const filled = this.safeString(order, 'totalFilled');
|
|
880
|
+
const timestamp = this.parse8601(this.safeString(order, 'updatedAt'));
|
|
881
|
+
const price = this.safeString(order, 'price');
|
|
882
|
+
const amount = this.safeString(order, 'size');
|
|
883
|
+
const type = this.parseOrderType(this.safeStringUpper(order, 'type'));
|
|
884
|
+
const side = this.safeStringLower(order, 'side');
|
|
885
|
+
const timeInForce = this.safeStringUpper(order, 'timeInForce');
|
|
886
|
+
return this.safeOrder({
|
|
887
|
+
'info': order,
|
|
888
|
+
'id': this.safeString(order, 'id'),
|
|
889
|
+
'clientOrderId': this.safeString(order, 'clientId'),
|
|
890
|
+
'timestamp': timestamp,
|
|
891
|
+
'datetime': this.iso8601(timestamp),
|
|
892
|
+
'lastTradeTimestamp': undefined,
|
|
893
|
+
'lastUpdateTimestamp': timestamp,
|
|
894
|
+
'symbol': symbol,
|
|
895
|
+
'type': type,
|
|
896
|
+
'timeInForce': timeInForce,
|
|
897
|
+
'postOnly': this.safeBool(order, 'postOnly'),
|
|
898
|
+
'reduceOnly': this.safeBool(order, 'reduceOnly'),
|
|
899
|
+
'side': side,
|
|
900
|
+
'price': price,
|
|
901
|
+
'triggerPrice': undefined,
|
|
902
|
+
'amount': amount,
|
|
903
|
+
'cost': undefined,
|
|
904
|
+
'average': undefined,
|
|
905
|
+
'filled': filled,
|
|
906
|
+
'remaining': undefined,
|
|
907
|
+
'status': status,
|
|
908
|
+
'fee': undefined,
|
|
909
|
+
'trades': undefined,
|
|
910
|
+
}, market);
|
|
911
|
+
}
|
|
912
|
+
parseOrderStatus(status) {
|
|
913
|
+
const statuses = {
|
|
914
|
+
'UNTRIGGERED': 'open',
|
|
915
|
+
'OPEN': 'open',
|
|
916
|
+
'FILLED': 'closed',
|
|
917
|
+
'CANCELED': 'canceled',
|
|
918
|
+
'BEST_EFFORT_CANCELED': 'canceling',
|
|
919
|
+
};
|
|
920
|
+
return this.safeString(statuses, status, status);
|
|
921
|
+
}
|
|
922
|
+
parseOrderType(type) {
|
|
923
|
+
const types = {
|
|
924
|
+
'LIMIT': 'LIMIT',
|
|
925
|
+
'STOP_LIMIT': 'LIMIT',
|
|
926
|
+
'TAKE_PROFIT_LIMIT': 'LIMIT',
|
|
927
|
+
'MARKET': 'MARKET',
|
|
928
|
+
'STOP_MARKET': 'MARKET',
|
|
929
|
+
'TAKE_PROFIT_MARKET': 'MARKET',
|
|
930
|
+
'TRAILING_STOP': 'MARKET',
|
|
931
|
+
};
|
|
932
|
+
return this.safeStringUpper(types, type, type);
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* @method
|
|
936
|
+
* @name dydx#fetchOrder
|
|
937
|
+
* @description fetches information on an order made by the user
|
|
938
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-order
|
|
939
|
+
* @param {string} id the order id
|
|
940
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
941
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
942
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
943
|
+
*/
|
|
944
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
945
|
+
await this.loadMarkets();
|
|
946
|
+
const request = {
|
|
947
|
+
'orderId': id,
|
|
948
|
+
};
|
|
949
|
+
const order = await this.indexerGetOrdersOrderId(this.extend(request, params));
|
|
950
|
+
return this.parseOrder(order);
|
|
951
|
+
}
|
|
952
|
+
/**
|
|
953
|
+
* @method
|
|
954
|
+
* @name dydx#fetchOrders
|
|
955
|
+
* @description fetches information on multiple orders made by the user
|
|
956
|
+
* @see https://docs.dydx.xyz/indexer-client/http#list-orders
|
|
957
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
958
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
959
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
960
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
961
|
+
* @param {string} [params.address] wallet address that made trades
|
|
962
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
963
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
964
|
+
*/
|
|
965
|
+
async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
966
|
+
let userAddress = undefined;
|
|
967
|
+
let subAccountNumber = undefined;
|
|
968
|
+
[userAddress, params] = this.handlePublicAddress('fetchOrders', params);
|
|
969
|
+
[subAccountNumber, params] = this.handleOptionAndParams(params, 'fetchOrders', 'subAccountNumber', '0');
|
|
970
|
+
await this.loadMarkets();
|
|
971
|
+
const request = {
|
|
972
|
+
'address': userAddress,
|
|
973
|
+
'subaccountNumber': subAccountNumber,
|
|
974
|
+
};
|
|
975
|
+
let market = undefined;
|
|
976
|
+
if (symbol !== undefined) {
|
|
977
|
+
market = this.market(symbol);
|
|
978
|
+
request['ticker'] = market['id'];
|
|
979
|
+
}
|
|
980
|
+
if (limit !== undefined) {
|
|
981
|
+
request['limit'] = limit;
|
|
982
|
+
}
|
|
983
|
+
const response = await this.indexerGetOrders(this.extend(request, params));
|
|
984
|
+
//
|
|
985
|
+
// [
|
|
986
|
+
// {
|
|
987
|
+
// "id": "dad46410-3444-5566-a129-19a619300fb7",
|
|
988
|
+
// "subaccountId": "8586bcf6-1f58-5ec9-a0bc-e53db273e7b0",
|
|
989
|
+
// "clientId": "716238006",
|
|
990
|
+
// "clobPairId": "0",
|
|
991
|
+
// "side": "BUY",
|
|
992
|
+
// "size": "0.001",
|
|
993
|
+
// "totalFilled": "0.001",
|
|
994
|
+
// "price": "400000",
|
|
995
|
+
// "type": "LIMIT",
|
|
996
|
+
// "status": "FILLED",
|
|
997
|
+
// "timeInForce": "GTT",
|
|
998
|
+
// "reduceOnly": false,
|
|
999
|
+
// "orderFlags": "64",
|
|
1000
|
+
// "goodTilBlockTime": "2025-07-28T12:07:33.000Z",
|
|
1001
|
+
// "createdAtHeight": "45058325",
|
|
1002
|
+
// "clientMetadata": "2",
|
|
1003
|
+
// "updatedAt": "2025-07-28T12:06:35.330Z",
|
|
1004
|
+
// "updatedAtHeight": "45058326",
|
|
1005
|
+
// "postOnly": false,
|
|
1006
|
+
// "ticker": "BTC-USD",
|
|
1007
|
+
// "subaccountNumber": 0
|
|
1008
|
+
// }
|
|
1009
|
+
// ]
|
|
1010
|
+
//
|
|
1011
|
+
return this.parseOrders(response, market, since, limit);
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* @method
|
|
1015
|
+
* @name dydx#fetchOpenOrders
|
|
1016
|
+
* @description fetch all unfilled currently open orders
|
|
1017
|
+
* @see https://docs.dydx.xyz/indexer-client/http#list-orders
|
|
1018
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
1019
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
1020
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
1021
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1022
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1023
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1024
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1025
|
+
*/
|
|
1026
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1027
|
+
const request = {
|
|
1028
|
+
'status': 'OPEN', // ['OPEN', 'FILLED', 'CANCELED', 'BEST_EFFORT_CANCELED', 'UNTRIGGERED', 'BEST_EFFORT_OPENED']
|
|
1029
|
+
};
|
|
1030
|
+
return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* @method
|
|
1034
|
+
* @name dydx#fetchClosedOrders
|
|
1035
|
+
* @description fetches information on multiple closed orders made by the user
|
|
1036
|
+
* @see https://docs.dydx.xyz/indexer-client/http#list-orders
|
|
1037
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
1038
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
1039
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
1040
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1041
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1042
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1043
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1044
|
+
*/
|
|
1045
|
+
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1046
|
+
const request = {
|
|
1047
|
+
'status': 'FILLED', // ['OPEN', 'FILLED', 'CANCELED', 'BEST_EFFORT_CANCELED', 'UNTRIGGERED', 'BEST_EFFORT_OPENED']
|
|
1048
|
+
};
|
|
1049
|
+
return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
|
|
1050
|
+
}
|
|
1051
|
+
parsePosition(position, market = undefined) {
|
|
1052
|
+
//
|
|
1053
|
+
// {
|
|
1054
|
+
// "market": "BTC-USD",
|
|
1055
|
+
// "status": "OPEN",
|
|
1056
|
+
// "side": "SHORT",
|
|
1057
|
+
// "size": "-0.407",
|
|
1058
|
+
// "maxSize": "-0.009",
|
|
1059
|
+
// "entryPrice": "118692.04840909090909090909",
|
|
1060
|
+
// "exitPrice": "119526.565625",
|
|
1061
|
+
// "realizedPnl": "476.42665909090909090909088",
|
|
1062
|
+
// "unrealizedPnl": "-57.26681734000000000000037",
|
|
1063
|
+
// "createdAt": "2025-07-14T07:53:55.631Z",
|
|
1064
|
+
// "createdAtHeight": "44140908",
|
|
1065
|
+
// "closedAt": null,
|
|
1066
|
+
// "sumOpen": "0.44",
|
|
1067
|
+
// "sumClose": "0.032",
|
|
1068
|
+
// "netFunding": "503.13121",
|
|
1069
|
+
// "subaccountNumber": 0
|
|
1070
|
+
// }
|
|
1071
|
+
//
|
|
1072
|
+
const marketId = this.safeString(position, 'market');
|
|
1073
|
+
market = this.safeMarket(marketId, market);
|
|
1074
|
+
const symbol = market['symbol'];
|
|
1075
|
+
const side = this.safeStringLower(position, 'side');
|
|
1076
|
+
let quantity = this.safeString(position, 'size');
|
|
1077
|
+
if (side !== 'long') {
|
|
1078
|
+
quantity = Precise["default"].stringMul('-1', quantity);
|
|
1079
|
+
}
|
|
1080
|
+
const timestamp = this.parse8601(this.safeString(position, 'createdAt'));
|
|
1081
|
+
return this.safePosition({
|
|
1082
|
+
'info': position,
|
|
1083
|
+
'id': undefined,
|
|
1084
|
+
'symbol': symbol,
|
|
1085
|
+
'entryPrice': this.safeNumber(position, 'entryPrice'),
|
|
1086
|
+
'markPrice': undefined,
|
|
1087
|
+
'notional': undefined,
|
|
1088
|
+
'collateral': undefined,
|
|
1089
|
+
'unrealizedPnl': this.safeNumber(position, 'unrealizedPnl'),
|
|
1090
|
+
'side': side,
|
|
1091
|
+
'contracts': this.parseNumber(quantity),
|
|
1092
|
+
'contractSize': undefined,
|
|
1093
|
+
'timestamp': timestamp,
|
|
1094
|
+
'datetime': this.iso8601(timestamp),
|
|
1095
|
+
'hedged': undefined,
|
|
1096
|
+
'maintenanceMargin': undefined,
|
|
1097
|
+
'maintenanceMarginPercentage': undefined,
|
|
1098
|
+
'initialMargin': undefined,
|
|
1099
|
+
'initialMarginPercentage': undefined,
|
|
1100
|
+
'leverage': undefined,
|
|
1101
|
+
'liquidationPrice': undefined,
|
|
1102
|
+
'marginRatio': undefined,
|
|
1103
|
+
'marginMode': undefined,
|
|
1104
|
+
'percentage': undefined,
|
|
1105
|
+
});
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* @method
|
|
1109
|
+
* @name dydx#fetchPosition
|
|
1110
|
+
* @description fetch data on an open position
|
|
1111
|
+
* @see https://docs.dydx.xyz/indexer-client/http#list-positions
|
|
1112
|
+
* @param {string} symbol unified market symbol of the market the position is held in
|
|
1113
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1114
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1115
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1116
|
+
* @returns {object} a [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
|
|
1117
|
+
*/
|
|
1118
|
+
async fetchPosition(symbol, params = {}) {
|
|
1119
|
+
const positions = await this.fetchPositions([symbol], params);
|
|
1120
|
+
return this.safeDict(positions, 0, {});
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* @method
|
|
1124
|
+
* @name dydx#fetchPositions
|
|
1125
|
+
* @description fetch all open positions
|
|
1126
|
+
* @see https://docs.dydx.xyz/indexer-client/http#list-positions
|
|
1127
|
+
* @param {string[]} [symbols] list of unified market symbols
|
|
1128
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1129
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1130
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1131
|
+
* @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
|
|
1132
|
+
*/
|
|
1133
|
+
async fetchPositions(symbols = undefined, params = {}) {
|
|
1134
|
+
let userAddress = undefined;
|
|
1135
|
+
let subAccountNumber = undefined;
|
|
1136
|
+
[userAddress, params] = this.handlePublicAddress('fetchPositions', params);
|
|
1137
|
+
[subAccountNumber, params] = this.handleOptionAndParams(params, 'fetchOrders', 'subAccountNumber', '0');
|
|
1138
|
+
await this.loadMarkets();
|
|
1139
|
+
const request = {
|
|
1140
|
+
'address': userAddress,
|
|
1141
|
+
'subaccountNumber': subAccountNumber,
|
|
1142
|
+
'status': 'OPEN', // ['OPEN', 'CLOSED', 'LIQUIDATED']
|
|
1143
|
+
};
|
|
1144
|
+
const response = await this.indexerGetPerpetualPositions(this.extend(request, params));
|
|
1145
|
+
//
|
|
1146
|
+
// {
|
|
1147
|
+
// "positions": [
|
|
1148
|
+
// {
|
|
1149
|
+
// "market": "BTC-USD",
|
|
1150
|
+
// "status": "OPEN",
|
|
1151
|
+
// "side": "SHORT",
|
|
1152
|
+
// "size": "-0.407",
|
|
1153
|
+
// "maxSize": "-0.009",
|
|
1154
|
+
// "entryPrice": "118692.04840909090909090909",
|
|
1155
|
+
// "exitPrice": "119526.565625",
|
|
1156
|
+
// "realizedPnl": "476.42665909090909090909088",
|
|
1157
|
+
// "unrealizedPnl": "-57.26681734000000000000037",
|
|
1158
|
+
// "createdAt": "2025-07-14T07:53:55.631Z",
|
|
1159
|
+
// "createdAtHeight": "44140908",
|
|
1160
|
+
// "closedAt": null,
|
|
1161
|
+
// "sumOpen": "0.44",
|
|
1162
|
+
// "sumClose": "0.032",
|
|
1163
|
+
// "netFunding": "503.13121",
|
|
1164
|
+
// "subaccountNumber": 0
|
|
1165
|
+
// }
|
|
1166
|
+
// ]
|
|
1167
|
+
// }
|
|
1168
|
+
//
|
|
1169
|
+
const rows = this.safeList(response, 'positions', []);
|
|
1170
|
+
return this.parsePositions(rows, symbols);
|
|
1171
|
+
}
|
|
1172
|
+
hashMessage(message) {
|
|
1173
|
+
return this.hash(message, sha3.keccak_256, 'hex');
|
|
1174
|
+
}
|
|
1175
|
+
signHash(hash, privateKey) {
|
|
1176
|
+
const signature = crypto.ecdsa(hash.slice(-64), privateKey.slice(-64), secp256k1.secp256k1, undefined);
|
|
1177
|
+
const r = signature['r'];
|
|
1178
|
+
const s = signature['s'];
|
|
1179
|
+
return {
|
|
1180
|
+
'r': r.padStart(64, '0'),
|
|
1181
|
+
's': s.padStart(64, '0'),
|
|
1182
|
+
'v': this.sum(27, signature['v']),
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
signMessage(message, privateKey) {
|
|
1186
|
+
return this.signHash(this.hashMessage(message), privateKey.slice(-64));
|
|
1187
|
+
}
|
|
1188
|
+
signOnboardingAction() {
|
|
1189
|
+
const message = { 'action': 'dYdX Chain Onboarding' };
|
|
1190
|
+
const chainId = this.options['chainId'];
|
|
1191
|
+
const domain = {
|
|
1192
|
+
'chainId': chainId,
|
|
1193
|
+
'name': 'dYdX Chain',
|
|
1194
|
+
};
|
|
1195
|
+
const messageTypes = {
|
|
1196
|
+
'dYdX': [
|
|
1197
|
+
{ 'name': 'action', 'type': 'string' },
|
|
1198
|
+
],
|
|
1199
|
+
};
|
|
1200
|
+
const msg = this.ethEncodeStructuredData(domain, messageTypes, message);
|
|
1201
|
+
if (this.privateKey === undefined || this.privateKey === '') {
|
|
1202
|
+
throw new errors.ArgumentsRequired(this.id + ' signOnboardingAction() requires a privateKey to be set.');
|
|
1203
|
+
}
|
|
1204
|
+
const signature = this.signMessage(msg, this.privateKey);
|
|
1205
|
+
return signature;
|
|
1206
|
+
}
|
|
1207
|
+
signDydxTx(privateKey, message, memo, chainId, account, authenticators, fee = undefined) {
|
|
1208
|
+
const [encodedTx, signDoc] = this.encodeDydxTxForSigning(message, memo, chainId, account, authenticators, fee);
|
|
1209
|
+
const signature = this.signHash(encodedTx, privateKey);
|
|
1210
|
+
return this.encodeDydxTxRaw(signDoc, signature['r'] + signature['s']);
|
|
1211
|
+
}
|
|
1212
|
+
retrieveCredentials() {
|
|
1213
|
+
let credentials = this.safeDict(this.options, 'dydxCredentials');
|
|
1214
|
+
if (credentials !== undefined) {
|
|
1215
|
+
return credentials;
|
|
1216
|
+
}
|
|
1217
|
+
let entropy = this.safeString(this.options, 'mnemonic');
|
|
1218
|
+
if (entropy === undefined) {
|
|
1219
|
+
const signature = this.signOnboardingAction();
|
|
1220
|
+
entropy = this.hashMessage(this.base16ToBinary(signature['r'] + signature['s']));
|
|
1221
|
+
}
|
|
1222
|
+
credentials = this.retrieveDydxCredentials(entropy);
|
|
1223
|
+
credentials['privateKey'] = this.binaryToBase16(credentials['privateKey']);
|
|
1224
|
+
credentials['publicKey'] = this.binaryToBase16(credentials['publicKey']);
|
|
1225
|
+
this.options['dydxCredentials'] = credentials;
|
|
1226
|
+
return credentials;
|
|
1227
|
+
}
|
|
1228
|
+
async fetchDydxAccount() {
|
|
1229
|
+
// required in js
|
|
1230
|
+
await this.loadDydxProtos();
|
|
1231
|
+
const dydxAccount = this.safeDict(this.options, 'dydxAccount');
|
|
1232
|
+
if (dydxAccount !== undefined) {
|
|
1233
|
+
return dydxAccount;
|
|
1234
|
+
}
|
|
1235
|
+
if (this.walletAddress === undefined) {
|
|
1236
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchDydxAccount() requires the walletAddress to be set using the dydx chain address eg: dydx1cpb4tedmwq304c2kc9pwzjwq0sc6z2a4tasxrz');
|
|
1237
|
+
}
|
|
1238
|
+
if (!this.walletAddress.startsWith('dydx')) {
|
|
1239
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchDydxAccount() requires a valid dydx chain address, starting with dydx, not the l1 address.');
|
|
1240
|
+
}
|
|
1241
|
+
const request = {
|
|
1242
|
+
'dydxAddress': this.walletAddress,
|
|
1243
|
+
};
|
|
1244
|
+
//
|
|
1245
|
+
// {
|
|
1246
|
+
// "info": {
|
|
1247
|
+
// "address": "string",
|
|
1248
|
+
// "pub_key": {
|
|
1249
|
+
// "type_url": "string",
|
|
1250
|
+
// "key": "string"
|
|
1251
|
+
// },
|
|
1252
|
+
// "account_number": "string",
|
|
1253
|
+
// "sequence": "string"
|
|
1254
|
+
// }
|
|
1255
|
+
// }
|
|
1256
|
+
//
|
|
1257
|
+
const response = await this.nodeRestGetCosmosAuthV1beta1AccountInfoDydxAddress(request);
|
|
1258
|
+
const account = this.safeDict(response, 'info');
|
|
1259
|
+
account['pub_key'] = {
|
|
1260
|
+
// encode with binary key would fail in python
|
|
1261
|
+
'key': account['pub_key']['key'],
|
|
1262
|
+
};
|
|
1263
|
+
this.options['dydxAccount'] = account;
|
|
1264
|
+
return account;
|
|
1265
|
+
}
|
|
1266
|
+
pow(n, m) {
|
|
1267
|
+
let r = Precise["default"].stringMul(n, '1');
|
|
1268
|
+
const c = this.parseToInt(m);
|
|
1269
|
+
// TODO: cap
|
|
1270
|
+
for (let i = 1; i < c; i++) {
|
|
1271
|
+
r = Precise["default"].stringMul(r, n);
|
|
1272
|
+
}
|
|
1273
|
+
return r;
|
|
1274
|
+
}
|
|
1275
|
+
createOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
|
|
1276
|
+
const reduceOnly = this.safeBool2(params, 'reduceOnly', 'reduce_only', false);
|
|
1277
|
+
const orderType = type.toUpperCase();
|
|
1278
|
+
const market = this.market(symbol);
|
|
1279
|
+
const orderSide = side.toUpperCase();
|
|
1280
|
+
let subaccountId = 0;
|
|
1281
|
+
[subaccountId, params] = this.handleOptionAndParams(params, 'createOrder', 'subAccountId', subaccountId);
|
|
1282
|
+
const triggerPrice = this.safeString2(params, 'triggerPrice', 'stopPrice');
|
|
1283
|
+
const stopLossPrice = this.safeValue(params, 'stopLossPrice', triggerPrice);
|
|
1284
|
+
const takeProfitPrice = this.safeValue(params, 'takeProfitPrice');
|
|
1285
|
+
const isConditional = triggerPrice !== undefined || stopLossPrice !== undefined || takeProfitPrice !== undefined;
|
|
1286
|
+
const isMarket = orderType === 'MARKET';
|
|
1287
|
+
const timeInForce = this.safeStringUpper(params, 'timeInForce', 'GTT');
|
|
1288
|
+
const postOnly = this.isPostOnly(isMarket, undefined, params);
|
|
1289
|
+
const amountStr = this.amountToPrecision(symbol, amount);
|
|
1290
|
+
const priceStr = this.priceToPrecision(symbol, price);
|
|
1291
|
+
const marketInfo = this.safeDict(market, 'info');
|
|
1292
|
+
const atomicResolution = marketInfo['atomicResolution'];
|
|
1293
|
+
const quantumScale = this.pow('10', Precise["default"].stringNeg(atomicResolution));
|
|
1294
|
+
const quantums = Precise["default"].stringMul(amountStr, quantumScale);
|
|
1295
|
+
const quantumConversionExponent = marketInfo['quantumConversionExponent'];
|
|
1296
|
+
const priceScale = this.pow('10', Precise["default"].stringSub(Precise["default"].stringSub(atomicResolution, quantumConversionExponent), '-6'));
|
|
1297
|
+
const subticks = Precise["default"].stringMul(priceStr, priceScale);
|
|
1298
|
+
let clientMetadata = 0;
|
|
1299
|
+
let conditionalType = 0;
|
|
1300
|
+
let conditionalOrderTriggerSubticks = '0';
|
|
1301
|
+
let orderFlag = undefined;
|
|
1302
|
+
let timeInForceNumber = undefined;
|
|
1303
|
+
if (timeInForce === 'FOK') {
|
|
1304
|
+
throw new errors.InvalidOrder(this.id + ' timeInForce fok has been deprecated');
|
|
1305
|
+
}
|
|
1306
|
+
if (orderType === 'MARKET') {
|
|
1307
|
+
// short-term
|
|
1308
|
+
orderFlag = 0;
|
|
1309
|
+
clientMetadata = 1; // STOP_MARKET / TAKE_PROFIT_MARKET
|
|
1310
|
+
if (timeInForce !== undefined) {
|
|
1311
|
+
// default is ioc
|
|
1312
|
+
timeInForceNumber = 1;
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
else if (orderType === 'LIMIT') {
|
|
1316
|
+
if (timeInForce === 'GTT') {
|
|
1317
|
+
// long-term
|
|
1318
|
+
orderFlag = 64;
|
|
1319
|
+
if (postOnly) {
|
|
1320
|
+
timeInForceNumber = 2;
|
|
1321
|
+
}
|
|
1322
|
+
else {
|
|
1323
|
+
timeInForceNumber = 0;
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
else {
|
|
1327
|
+
orderFlag = 0;
|
|
1328
|
+
if (timeInForce === 'IOC') {
|
|
1329
|
+
timeInForceNumber = 1;
|
|
1330
|
+
}
|
|
1331
|
+
else {
|
|
1332
|
+
throw new errors.InvalidOrder('unexpected code path: timeInForce');
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
if (isConditional) {
|
|
1337
|
+
// conditional
|
|
1338
|
+
orderFlag = 32;
|
|
1339
|
+
if (stopLossPrice !== undefined) {
|
|
1340
|
+
conditionalType = 1;
|
|
1341
|
+
conditionalOrderTriggerSubticks = this.priceToPrecision(symbol, stopLossPrice);
|
|
1342
|
+
}
|
|
1343
|
+
else if (takeProfitPrice !== undefined) {
|
|
1344
|
+
conditionalType = 2;
|
|
1345
|
+
conditionalOrderTriggerSubticks = this.priceToPrecision(symbol, takeProfitPrice);
|
|
1346
|
+
}
|
|
1347
|
+
conditionalOrderTriggerSubticks = Precise["default"].stringMul(conditionalOrderTriggerSubticks, priceScale);
|
|
1348
|
+
}
|
|
1349
|
+
const latestBlockHeight = this.safeInteger(params, 'latestBlockHeight');
|
|
1350
|
+
let goodTillBlock = this.safeInteger(params, 'goodTillBlock');
|
|
1351
|
+
let goodTillBlockTime = undefined;
|
|
1352
|
+
let goodTillBlockTimeInSeconds = 2592000;
|
|
1353
|
+
[goodTillBlockTimeInSeconds, params] = this.handleOptionAndParams(params, 'createOrder', 'goodTillBlockTimeInSeconds', goodTillBlockTimeInSeconds); // default is 30 days
|
|
1354
|
+
if (orderFlag === 0) {
|
|
1355
|
+
if (goodTillBlock === undefined) {
|
|
1356
|
+
// short term order
|
|
1357
|
+
goodTillBlock = latestBlockHeight + 20;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
else {
|
|
1361
|
+
if (goodTillBlockTimeInSeconds === undefined) {
|
|
1362
|
+
throw new errors.ArgumentsRequired('goodTillBlockTimeInSeconds is required.');
|
|
1363
|
+
}
|
|
1364
|
+
goodTillBlockTime = this.seconds() + goodTillBlockTimeInSeconds;
|
|
1365
|
+
}
|
|
1366
|
+
const sideNumber = (orderSide === 'BUY') ? 1 : 2;
|
|
1367
|
+
const defaultClientOrderId = this.randNumber(9); // 2**32 - 1 is 10 digits, but it may overflow with 10
|
|
1368
|
+
const clientOrderId = this.safeInteger(params, 'clientOrderId', defaultClientOrderId);
|
|
1369
|
+
const orderPayload = {
|
|
1370
|
+
'order': {
|
|
1371
|
+
'orderId': {
|
|
1372
|
+
'subaccountId': {
|
|
1373
|
+
'owner': this.getWalletAddress(),
|
|
1374
|
+
'number': subaccountId,
|
|
1375
|
+
},
|
|
1376
|
+
'clientId': clientOrderId,
|
|
1377
|
+
'orderFlags': orderFlag,
|
|
1378
|
+
'clobPairId': marketInfo['clobPairId'],
|
|
1379
|
+
},
|
|
1380
|
+
'side': sideNumber,
|
|
1381
|
+
'quantums': this.toDydxLong(quantums),
|
|
1382
|
+
'subticks': this.toDydxLong(subticks),
|
|
1383
|
+
'goodTilBlock': goodTillBlock,
|
|
1384
|
+
'goodTilBlockTime': goodTillBlockTime,
|
|
1385
|
+
'timeInForce': timeInForceNumber,
|
|
1386
|
+
'reduceOnly': reduceOnly,
|
|
1387
|
+
'clientMetadata': clientMetadata,
|
|
1388
|
+
'conditionType': conditionalType,
|
|
1389
|
+
'conditionalOrderTriggerSubticks': this.toDydxLong(conditionalOrderTriggerSubticks),
|
|
1390
|
+
'orderRouterAddress': this.safeString(this.options, 'routerAddress', 'dydx165sfn2k3vucvq7gklauy2r3agyjw4c3m60ascn'),
|
|
1391
|
+
},
|
|
1392
|
+
};
|
|
1393
|
+
const signingPayload = {
|
|
1394
|
+
'typeUrl': '/dydxprotocol.clob.MsgPlaceOrder',
|
|
1395
|
+
'value': orderPayload,
|
|
1396
|
+
};
|
|
1397
|
+
params = this.omit(params, ['reduceOnly', 'reduce_only', 'clientOrderId', 'postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stopLoss', 'takeProfit', 'latestBlockHeight', 'goodTillBlock', 'goodTillBlockTimeInSeconds', 'subaccountId']);
|
|
1398
|
+
const orderId = this.createOrderIdFromParts(this.getWalletAddress(), subaccountId, clientOrderId, orderFlag, marketInfo['clobPairId']);
|
|
1399
|
+
return [orderId, this.extend(signingPayload, params)];
|
|
1400
|
+
}
|
|
1401
|
+
createOrderIdFromParts(address, subAccountNumber, clientOrderId, orderFlags, clobPairId) {
|
|
1402
|
+
const nameSp = this.safeString(this.options, 'namespace', '0f9da948-a6fb-4c45-9edc-4685c3f3317d');
|
|
1403
|
+
const prefixAddress = address + '-' + subAccountNumber.toString();
|
|
1404
|
+
const prefix = this.uuid5(nameSp, prefixAddress);
|
|
1405
|
+
const orderInfo = prefix + '-' + this.numberToString(clientOrderId) + '-' + this.numberToString(clobPairId) + '-' + this.numberToString(orderFlags);
|
|
1406
|
+
return this.uuid5(nameSp, orderInfo);
|
|
1407
|
+
}
|
|
1408
|
+
async fetchLatestBlockHeight(params = {}) {
|
|
1409
|
+
const response = await this.nodeRpcGetAbciInfo(params);
|
|
1410
|
+
//
|
|
1411
|
+
// {
|
|
1412
|
+
// "jsonrpc": "2.0",
|
|
1413
|
+
// "id": -1,
|
|
1414
|
+
// "result": {
|
|
1415
|
+
// "response": {
|
|
1416
|
+
// "data": "dydxprotocol",
|
|
1417
|
+
// "version": "9.1.0-rc0",
|
|
1418
|
+
// "last_block_height": "49157714",
|
|
1419
|
+
// "last_block_app_hash": "9LHAcDDI5zmWiC6bGiiGtxuWPlKJV+/fTBZk/WQ/Y4U="
|
|
1420
|
+
// }
|
|
1421
|
+
// }
|
|
1422
|
+
// }
|
|
1423
|
+
//
|
|
1424
|
+
const result = this.safeDict(response, 'result');
|
|
1425
|
+
const info = this.safeDict(result, 'response');
|
|
1426
|
+
return this.safeInteger(info, 'last_block_height');
|
|
1427
|
+
}
|
|
1428
|
+
/**
|
|
1429
|
+
* @method
|
|
1430
|
+
* @name dydx#createOrder
|
|
1431
|
+
* @see https://docs.dydx.xyz/interaction/trading#place-an-order
|
|
1432
|
+
* @description create a trade order
|
|
1433
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
1434
|
+
* @param {string} type 'market' or 'limit'
|
|
1435
|
+
* @param {string} side 'buy' or 'sell'
|
|
1436
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
1437
|
+
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
1438
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1439
|
+
* @param {string} [params.timeInForce] "GTT", "IOC", or "PO"
|
|
1440
|
+
* @param {float} [params.triggerPrice] The price a trigger order is triggered at
|
|
1441
|
+
* @param {float} [params.stopLossPrice] price for a stoploss order
|
|
1442
|
+
* @param {float} [params.takeProfitPrice] price for a takeprofit order
|
|
1443
|
+
* @param {string} [params.clientOrderId] a unique id for the order
|
|
1444
|
+
* @param {bool} [params.postOnly] true or false whether the order is post-only
|
|
1445
|
+
* @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
|
|
1446
|
+
* @param {float} [params.goodTillBlock] expired block number for the order, required for market order and non limit GTT order, default value is latestBlockHeight + 20
|
|
1447
|
+
* @param {float} [params.goodTillBlockTimeInSeconds] expired time elapsed for the order, required for limit GTT order and conditional, default value is 30 days
|
|
1448
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1449
|
+
*/
|
|
1450
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
1451
|
+
await this.loadMarkets();
|
|
1452
|
+
const credentials = this.retrieveCredentials();
|
|
1453
|
+
const account = await this.fetchDydxAccount();
|
|
1454
|
+
const lastBlockHeight = await this.fetchLatestBlockHeight();
|
|
1455
|
+
// params['latestBlockHeight'] = lastBlockHeight;
|
|
1456
|
+
const newParams = this.extend(params, { 'latestBlockHeight': lastBlockHeight });
|
|
1457
|
+
const orderRequestRes = this.createOrderRequest(symbol, type, side, amount, price, newParams);
|
|
1458
|
+
const orderId = orderRequestRes[0];
|
|
1459
|
+
const orderRequest = orderRequestRes[1];
|
|
1460
|
+
const chainName = this.options['chainName'];
|
|
1461
|
+
const signedTx = this.signDydxTx(credentials['privateKey'], orderRequest, '', chainName, account, undefined);
|
|
1462
|
+
const request = {
|
|
1463
|
+
'tx': signedTx,
|
|
1464
|
+
};
|
|
1465
|
+
// nodeRpcGetBroadcastTxAsync
|
|
1466
|
+
const response = await this.nodeRpcGetBroadcastTxSync(request);
|
|
1467
|
+
//
|
|
1468
|
+
// {
|
|
1469
|
+
// "jsonrpc": "2.0",
|
|
1470
|
+
// "id": -1,
|
|
1471
|
+
// "result": {
|
|
1472
|
+
// "code": 0,
|
|
1473
|
+
// "data": "",
|
|
1474
|
+
// "log": "[]",
|
|
1475
|
+
// "codespace": "",
|
|
1476
|
+
// "hash": "CBEDB0603E57E5CE21FA6954770A9403D2A81BED02E608C860356152D0AA1A81"
|
|
1477
|
+
// }
|
|
1478
|
+
// }
|
|
1479
|
+
//
|
|
1480
|
+
const result = this.safeDict(response, 'result');
|
|
1481
|
+
return this.safeOrder({
|
|
1482
|
+
'info': result,
|
|
1483
|
+
'id': orderId,
|
|
1484
|
+
'clientOrderId': orderRequest['value']['order']['orderId']['clientId'],
|
|
1485
|
+
});
|
|
1486
|
+
}
|
|
1487
|
+
/**
|
|
1488
|
+
* @method
|
|
1489
|
+
* @name dydx#cancelOrder
|
|
1490
|
+
* @description cancels an open order
|
|
1491
|
+
* @see https://docs.dydx.xyz/interaction/trading/#cancel-an-order
|
|
1492
|
+
* @param {string} id it should be the clientOrderId in this case
|
|
1493
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
1494
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1495
|
+
* @param {string} [params.clientOrderId] client order id used when creating the order
|
|
1496
|
+
* @param {boolean} [params.trigger] whether the order is a trigger/algo order
|
|
1497
|
+
* @param {float} [params.orderFlags] default is 64, orderFlags for the order, market order and non limit GTT order is 0, limit GTT order is 64 and conditional order is 32
|
|
1498
|
+
* @param {float} [params.goodTillBlock] expired block number for the order, required for market order and non limit GTT order (orderFlags = 0), default value is latestBlockHeight + 20
|
|
1499
|
+
* @param {float} [params.goodTillBlockTimeInSeconds] expired time elapsed for the order, required for limit GTT order and conditional (orderFlagss > 0), default value is 30 days
|
|
1500
|
+
* @param {int} [params.subAccountId] sub account id, default is 0
|
|
1501
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1502
|
+
*/
|
|
1503
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
1504
|
+
const isTrigger = this.safeBool2(params, 'trigger', 'stop', false);
|
|
1505
|
+
params = this.omit(params, ['trigger', 'stop']);
|
|
1506
|
+
if (!isTrigger && (symbol === undefined)) {
|
|
1507
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
|
|
1508
|
+
}
|
|
1509
|
+
await this.loadMarkets();
|
|
1510
|
+
const market = this.market(symbol);
|
|
1511
|
+
const clientOrderId = this.safeString2(params, 'clientOrderId', 'clientId', id);
|
|
1512
|
+
if (clientOrderId === undefined) {
|
|
1513
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a clientOrderId parameter, cancelling using id is not currently supported.');
|
|
1514
|
+
}
|
|
1515
|
+
const idString = id.toString();
|
|
1516
|
+
if (id !== undefined && idString.indexOf('-') > -1) {
|
|
1517
|
+
throw new errors.NotSupported(this.id + ' cancelOrder() cancelling using id is not currently supported, please use provide the clientOrderId parameter.');
|
|
1518
|
+
}
|
|
1519
|
+
let goodTillBlock = this.safeInteger(params, 'goodTillBlock');
|
|
1520
|
+
let goodTillBlockTimeInSeconds = 2592000;
|
|
1521
|
+
[goodTillBlockTimeInSeconds, params] = this.handleOptionAndParams(params, 'cancelOrder', 'goodTillBlockTimeInSeconds', goodTillBlockTimeInSeconds); // default is 30 days
|
|
1522
|
+
let goodTillBlockTime = undefined;
|
|
1523
|
+
const defaultOrderFlags = (isTrigger) ? 32 : 64;
|
|
1524
|
+
const orderFlags = this.safeInteger(params, 'orderFlags', defaultOrderFlags);
|
|
1525
|
+
let subAccountId = 0;
|
|
1526
|
+
[subAccountId, params] = this.handleOptionAndParams(params, 'cancelOrder', 'subAccountId', subAccountId);
|
|
1527
|
+
params = this.omit(params, ['clientOrderId', 'orderFlags', 'goodTillBlock', 'goodTillBlockTime', 'goodTillBlockTimeInSeconds', 'subaccountId', 'clientId']);
|
|
1528
|
+
if (orderFlags !== 0 && orderFlags !== 64 && orderFlags !== 32) {
|
|
1529
|
+
throw new errors.InvalidOrder(this.id + ' invalid orderFlags, allowed values are (0, 64, 32).');
|
|
1530
|
+
}
|
|
1531
|
+
if (orderFlags > 0) {
|
|
1532
|
+
if (goodTillBlockTimeInSeconds === undefined) {
|
|
1533
|
+
throw new errors.ArgumentsRequired(this.id + ' goodTillBlockTimeInSeconds is required in params for long term or conditional order.');
|
|
1534
|
+
}
|
|
1535
|
+
if (goodTillBlock !== undefined && goodTillBlock > 0) {
|
|
1536
|
+
throw new errors.InvalidOrder(this.id + ' goodTillBlock should be 0 for long term or conditional order.');
|
|
1537
|
+
}
|
|
1538
|
+
goodTillBlockTime = this.seconds() + goodTillBlockTimeInSeconds;
|
|
1539
|
+
}
|
|
1540
|
+
else {
|
|
1541
|
+
if (goodTillBlock === undefined) {
|
|
1542
|
+
const latestBlockHeight = await this.fetchLatestBlockHeight();
|
|
1543
|
+
goodTillBlock = latestBlockHeight + 20;
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
const credentials = this.retrieveCredentials();
|
|
1547
|
+
const account = await this.fetchDydxAccount();
|
|
1548
|
+
const cancelPayload = {
|
|
1549
|
+
'orderId': {
|
|
1550
|
+
'subaccountId': {
|
|
1551
|
+
'owner': this.getWalletAddress(),
|
|
1552
|
+
'number': subAccountId,
|
|
1553
|
+
},
|
|
1554
|
+
'clientId': clientOrderId,
|
|
1555
|
+
'orderFlags': orderFlags,
|
|
1556
|
+
'clobPairId': market['info']['clobPairId'],
|
|
1557
|
+
},
|
|
1558
|
+
'goodTilBlock': goodTillBlock,
|
|
1559
|
+
'goodTilBlockTime': goodTillBlockTime,
|
|
1560
|
+
};
|
|
1561
|
+
const signingPayload = {
|
|
1562
|
+
'typeUrl': '/dydxprotocol.clob.MsgCancelOrder',
|
|
1563
|
+
'value': cancelPayload,
|
|
1564
|
+
};
|
|
1565
|
+
const chainName = this.options['chainName'];
|
|
1566
|
+
const signedTx = this.signDydxTx(credentials['privateKey'], signingPayload, '', chainName, account, undefined);
|
|
1567
|
+
const request = {
|
|
1568
|
+
'tx': signedTx,
|
|
1569
|
+
};
|
|
1570
|
+
// nodeRpcGetBroadcastTxAsync
|
|
1571
|
+
const response = await this.nodeRpcGetBroadcastTxSync(request);
|
|
1572
|
+
//
|
|
1573
|
+
// {
|
|
1574
|
+
// "jsonrpc": "2.0",
|
|
1575
|
+
// "id": -1,
|
|
1576
|
+
// "result": {
|
|
1577
|
+
// "code": 0,
|
|
1578
|
+
// "data": "",
|
|
1579
|
+
// "log": "[]",
|
|
1580
|
+
// "codespace": "",
|
|
1581
|
+
// "hash": "CBEDB0603E57E5CE21FA6954770A9403D2A81BED02E608C860356152D0AA1A81"
|
|
1582
|
+
// }
|
|
1583
|
+
// }
|
|
1584
|
+
//
|
|
1585
|
+
const result = this.safeDict(response, 'result');
|
|
1586
|
+
return this.safeOrder({
|
|
1587
|
+
'info': result,
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
/**
|
|
1591
|
+
* @method
|
|
1592
|
+
* @name dydx#cancelOrders
|
|
1593
|
+
* @description cancel multiple orders
|
|
1594
|
+
* @param {string[]} ids order ids
|
|
1595
|
+
* @param {string} [symbol] unified market symbol
|
|
1596
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1597
|
+
* @param {string[]} [params.clientOrderIds] max length 10 e.g. ["my_id_1","my_id_2"], encode the double quotes. No space after comma
|
|
1598
|
+
* @param {int} [params.subAccountId] sub account id, default is 0
|
|
1599
|
+
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1600
|
+
*/
|
|
1601
|
+
async cancelOrders(ids, symbol = undefined, params = {}) {
|
|
1602
|
+
await this.loadMarkets();
|
|
1603
|
+
const market = this.market(symbol);
|
|
1604
|
+
const clientOrderIds = this.safeList(params, 'clientOrderIds');
|
|
1605
|
+
if (!clientOrderIds) {
|
|
1606
|
+
throw new errors.NotSupported(this.id + ' cancelOrders only support clientOrderIds.');
|
|
1607
|
+
}
|
|
1608
|
+
let subAccountId = 0;
|
|
1609
|
+
[subAccountId, params] = this.handleOptionAndParams(params, 'cancelOrders', 'subAccountId', subAccountId);
|
|
1610
|
+
let goodTillBlock = this.safeInteger(params, 'goodTillBlock');
|
|
1611
|
+
if (goodTillBlock === undefined) {
|
|
1612
|
+
const latestBlockHeight = await this.fetchLatestBlockHeight();
|
|
1613
|
+
goodTillBlock = latestBlockHeight + 20;
|
|
1614
|
+
}
|
|
1615
|
+
params = this.omit(params, ['clientOrderIds', 'goodTillBlock', 'subaccountId']);
|
|
1616
|
+
const credentials = this.retrieveCredentials();
|
|
1617
|
+
const account = await this.fetchDydxAccount();
|
|
1618
|
+
const cancelOrders = {
|
|
1619
|
+
'clientIds': clientOrderIds,
|
|
1620
|
+
'clobPairId': market['info']['clobPairId'],
|
|
1621
|
+
};
|
|
1622
|
+
const cancelPayload = {
|
|
1623
|
+
'subaccountId': {
|
|
1624
|
+
'owner': this.getWalletAddress(),
|
|
1625
|
+
'number': subAccountId,
|
|
1626
|
+
},
|
|
1627
|
+
'shortTermCancels': [cancelOrders],
|
|
1628
|
+
'goodTilBlock': goodTillBlock,
|
|
1629
|
+
};
|
|
1630
|
+
const signingPayload = {
|
|
1631
|
+
'typeUrl': '/dydxprotocol.clob.MsgBatchCancel',
|
|
1632
|
+
'value': cancelPayload,
|
|
1633
|
+
};
|
|
1634
|
+
const chainName = this.options['chainName'];
|
|
1635
|
+
const signedTx = this.signDydxTx(credentials['privateKey'], signingPayload, '', chainName, account, undefined);
|
|
1636
|
+
const request = {
|
|
1637
|
+
'tx': signedTx,
|
|
1638
|
+
};
|
|
1639
|
+
// nodeRpcGetBroadcastTxAsync
|
|
1640
|
+
const response = await this.nodeRpcGetBroadcastTxSync(request);
|
|
1641
|
+
//
|
|
1642
|
+
// {
|
|
1643
|
+
// "jsonrpc": "2.0",
|
|
1644
|
+
// "id": -1,
|
|
1645
|
+
// "result": {
|
|
1646
|
+
// "code": 0,
|
|
1647
|
+
// "data": "",
|
|
1648
|
+
// "log": "[]",
|
|
1649
|
+
// "codespace": "",
|
|
1650
|
+
// "hash": "CBEDB0603E57E5CE21FA6954770A9403D2A81BED02E608C860356152D0AA1A81"
|
|
1651
|
+
// }
|
|
1652
|
+
// }
|
|
1653
|
+
//
|
|
1654
|
+
const result = this.safeDict(response, 'result');
|
|
1655
|
+
return [this.safeOrder({
|
|
1656
|
+
'info': result,
|
|
1657
|
+
})];
|
|
1658
|
+
}
|
|
1659
|
+
/**
|
|
1660
|
+
* @method
|
|
1661
|
+
* @name dydx#fetchOrderBook
|
|
1662
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1663
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-perpetual-market-orderbook
|
|
1664
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
1665
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
1666
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1667
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1668
|
+
*/
|
|
1669
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
1670
|
+
await this.loadMarkets();
|
|
1671
|
+
const market = this.market(symbol);
|
|
1672
|
+
const request = {
|
|
1673
|
+
'market': market['id'],
|
|
1674
|
+
};
|
|
1675
|
+
const response = await this.indexerGetOrderbooksPerpetualMarketMarket(this.extend(request, params));
|
|
1676
|
+
//
|
|
1677
|
+
// {
|
|
1678
|
+
// "bids": [
|
|
1679
|
+
// {
|
|
1680
|
+
// "price": "118267",
|
|
1681
|
+
// "size": "0.3182"
|
|
1682
|
+
// }
|
|
1683
|
+
// ],
|
|
1684
|
+
// "asks": [
|
|
1685
|
+
// {
|
|
1686
|
+
// "price": "118485",
|
|
1687
|
+
// "size": "0.0001"
|
|
1688
|
+
// }
|
|
1689
|
+
// ]
|
|
1690
|
+
// }
|
|
1691
|
+
//
|
|
1692
|
+
return this.parseOrderBook(response, market['symbol'], undefined, 'bids', 'asks', 'price', 'size');
|
|
1693
|
+
}
|
|
1694
|
+
parseLedgerEntry(item, currency = undefined) {
|
|
1695
|
+
//
|
|
1696
|
+
// {
|
|
1697
|
+
// "id": "6a6075bc-7183-5fd9-bc9d-894e238aa527",
|
|
1698
|
+
// "sender": {
|
|
1699
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
1700
|
+
// "subaccountNumber": 0
|
|
1701
|
+
// },
|
|
1702
|
+
// "recipient": {
|
|
1703
|
+
// "address": "dydx1slanxj8x9ntk9knwa6cvfv2tzlsq5gk3dshml0",
|
|
1704
|
+
// "subaccountNumber": 1
|
|
1705
|
+
// },
|
|
1706
|
+
// "size": "0.000001",
|
|
1707
|
+
// "createdAt": "2025-07-29T09:43:02.105Z",
|
|
1708
|
+
// "createdAtHeight": "45116125",
|
|
1709
|
+
// "symbol": "USDC",
|
|
1710
|
+
// "type": "TRANSFER_OUT",
|
|
1711
|
+
// "transactionHash": "92B4744BA1B783CF37C79A50BEBC47FFD59C8D5197D62A8485D3DCCE9AF220AF"
|
|
1712
|
+
// }
|
|
1713
|
+
//
|
|
1714
|
+
const currencyId = this.safeString(item, 'symbol');
|
|
1715
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
1716
|
+
currency = this.safeCurrency(currencyId, currency);
|
|
1717
|
+
const type = this.safeStringUpper(item, 'type');
|
|
1718
|
+
let direction = undefined;
|
|
1719
|
+
if (type !== undefined) {
|
|
1720
|
+
if (type === 'TRANSFER_IN' || type === 'DEPOSIT') {
|
|
1721
|
+
direction = 'in';
|
|
1722
|
+
}
|
|
1723
|
+
else if (type === 'TRANSFER_OUT' || type === 'WITHDRAWAL') {
|
|
1724
|
+
direction = 'out';
|
|
1725
|
+
}
|
|
1726
|
+
}
|
|
1727
|
+
const amount = this.safeString(item, 'size');
|
|
1728
|
+
const timestamp = this.parse8601(this.safeString(item, 'createdAt'));
|
|
1729
|
+
const sender = this.safeDict(item, 'sender');
|
|
1730
|
+
const recipient = this.safeDict(item, 'recipient');
|
|
1731
|
+
return this.safeLedgerEntry({
|
|
1732
|
+
'info': item,
|
|
1733
|
+
'id': this.safeString(item, 'id'),
|
|
1734
|
+
'direction': direction,
|
|
1735
|
+
'account': this.safeString(sender, 'address'),
|
|
1736
|
+
'referenceAccount': this.safeString(recipient, 'address'),
|
|
1737
|
+
'referenceId': this.safeString(item, 'transactionHash'),
|
|
1738
|
+
'type': this.parseLedgerEntryType(type),
|
|
1739
|
+
'currency': code,
|
|
1740
|
+
'amount': this.parseNumber(amount),
|
|
1741
|
+
'timestamp': timestamp,
|
|
1742
|
+
'datetime': this.iso8601(timestamp),
|
|
1743
|
+
'before': undefined,
|
|
1744
|
+
'after': undefined,
|
|
1745
|
+
'status': undefined,
|
|
1746
|
+
'fee': undefined,
|
|
1747
|
+
}, currency);
|
|
1748
|
+
}
|
|
1749
|
+
parseLedgerEntryType(type) {
|
|
1750
|
+
const ledgerType = {
|
|
1751
|
+
'TRANSFER_IN': 'transfer',
|
|
1752
|
+
'TRANSFER_OUT': 'transfer',
|
|
1753
|
+
'DEPOSIT': 'deposit',
|
|
1754
|
+
'WITHDRAWAL': 'withdrawal',
|
|
1755
|
+
};
|
|
1756
|
+
return this.safeString(ledgerType, type, type);
|
|
1757
|
+
}
|
|
1758
|
+
/**
|
|
1759
|
+
* @method
|
|
1760
|
+
* @name dydx#fetchLedger
|
|
1761
|
+
* @description fetch the history of changes, actions done by the user or operations that altered balance of the user
|
|
1762
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-transfers
|
|
1763
|
+
* @param {string} [code] unified currency code, default is undefined
|
|
1764
|
+
* @param {int} [since] timestamp in ms of the earliest ledger entry, default is undefined
|
|
1765
|
+
* @param {int} [limit] max number of ledger entries to return, default is undefined
|
|
1766
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1767
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1768
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1769
|
+
* @returns {object} a [ledger structure]{@link https://docs.ccxt.com/#/?id=ledger}
|
|
1770
|
+
*/
|
|
1771
|
+
async fetchLedger(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1772
|
+
await this.loadMarkets();
|
|
1773
|
+
let currency = undefined;
|
|
1774
|
+
if (code !== undefined) {
|
|
1775
|
+
currency = this.currency(code);
|
|
1776
|
+
}
|
|
1777
|
+
const response = await this.fetchTransactionsHelper(code, since, limit, this.extend(params, { 'methodName': 'fetchLedger' }));
|
|
1778
|
+
return this.parseLedger(response, currency, since, limit);
|
|
1779
|
+
}
|
|
1780
|
+
async estimateTxFee(message, memo, account) {
|
|
1781
|
+
const txBytes = this.encodeDydxTxForSimulation(message, memo, account['sequence'], account['pub_key']);
|
|
1782
|
+
const request = {
|
|
1783
|
+
'txBytes': txBytes,
|
|
1784
|
+
};
|
|
1785
|
+
const response = await this.nodeRestPostCosmosTxV1beta1Simulate(request);
|
|
1786
|
+
//
|
|
1787
|
+
// {
|
|
1788
|
+
// gas_info: { gas_wanted: '18446744073709551615', gas_used: '86055' },
|
|
1789
|
+
// result: {
|
|
1790
|
+
// ...
|
|
1791
|
+
// }
|
|
1792
|
+
// }
|
|
1793
|
+
//
|
|
1794
|
+
const gasInfo = this.safeDict(response, 'gas_info');
|
|
1795
|
+
if (gasInfo === undefined) {
|
|
1796
|
+
throw new errors.ExchangeError(this.id + ' failed to simulate transaction.');
|
|
1797
|
+
}
|
|
1798
|
+
const gasUsed = this.safeString(gasInfo, 'gas_used');
|
|
1799
|
+
if (gasUsed === undefined) {
|
|
1800
|
+
throw new errors.ExchangeError(this.id + ' failed to simulate transaction.');
|
|
1801
|
+
}
|
|
1802
|
+
const defaultFeeDenom = this.safeString(this.options, 'defaultFeeDenom');
|
|
1803
|
+
const defaultFeeMultiplier = this.safeString(this.options, 'defaultFeeMultiplier');
|
|
1804
|
+
const feeDenom = this.safeDict(this.options, 'feeDenom');
|
|
1805
|
+
let gasPrice = undefined;
|
|
1806
|
+
let denom = undefined;
|
|
1807
|
+
if (defaultFeeDenom === 'uusdc') {
|
|
1808
|
+
gasPrice = feeDenom['USDC_GAS_PRICE'];
|
|
1809
|
+
denom = feeDenom['USDC_DENOM'];
|
|
1810
|
+
}
|
|
1811
|
+
else {
|
|
1812
|
+
gasPrice = feeDenom['CHAINTOKEN_GAS_PRICE'];
|
|
1813
|
+
denom = feeDenom['CHAINTOKEN_DENOM'];
|
|
1814
|
+
}
|
|
1815
|
+
const gasLimit = Math.ceil(this.parseToNumeric(Precise["default"].stringMul(gasUsed, defaultFeeMultiplier)));
|
|
1816
|
+
let feeAmount = Precise["default"].stringMul(this.numberToString(gasLimit), gasPrice);
|
|
1817
|
+
if (feeAmount.indexOf('.') >= 0) {
|
|
1818
|
+
feeAmount = this.numberToString(Math.ceil(this.parseToNumeric(feeAmount)));
|
|
1819
|
+
}
|
|
1820
|
+
const feeObj = {
|
|
1821
|
+
'amount': feeAmount,
|
|
1822
|
+
'denom': denom,
|
|
1823
|
+
};
|
|
1824
|
+
return {
|
|
1825
|
+
'amount': [feeObj],
|
|
1826
|
+
'gasLimit': gasLimit,
|
|
1827
|
+
};
|
|
1828
|
+
}
|
|
1829
|
+
/**
|
|
1830
|
+
* @method
|
|
1831
|
+
* @name dydx#transfer
|
|
1832
|
+
* @description transfer currency internally between wallets on the same account
|
|
1833
|
+
* @param {string} code unified currency code
|
|
1834
|
+
* @param {float} amount amount to transfer
|
|
1835
|
+
* @param {string} fromAccount account to transfer from *main, subaccount*
|
|
1836
|
+
* @param {string} toAccount account to transfer to *subaccount, address*
|
|
1837
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1838
|
+
* @param {string} [params.vaultAddress] the vault address for order
|
|
1839
|
+
* @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
|
|
1840
|
+
*/
|
|
1841
|
+
async transfer(code, amount, fromAccount, toAccount, params = {}) {
|
|
1842
|
+
if (code !== 'USDC') {
|
|
1843
|
+
throw new errors.NotSupported(this.id + ' transfer() only support USDC');
|
|
1844
|
+
}
|
|
1845
|
+
await this.loadMarkets();
|
|
1846
|
+
const fromSubaccountId = this.safeInteger(params, 'fromSubaccountId');
|
|
1847
|
+
const toSubaccountId = this.safeInteger(params, 'toSubaccountId');
|
|
1848
|
+
if (fromAccount !== 'main') {
|
|
1849
|
+
// throw error if from subaccount id is undefind
|
|
1850
|
+
if (fromAccount === undefined) {
|
|
1851
|
+
throw new errors.NotSupported(this.id + ' transfer only support main > subaccount and subaccount <> subaccount.');
|
|
1852
|
+
}
|
|
1853
|
+
if (fromSubaccountId === undefined || toSubaccountId === undefined) {
|
|
1854
|
+
throw new errors.ArgumentsRequired(this.id + ' transfer requires fromSubaccountId and toSubaccountId.');
|
|
1855
|
+
}
|
|
1856
|
+
}
|
|
1857
|
+
params = this.omit(params, ['fromSubaccountId', 'toSubaccountId']);
|
|
1858
|
+
const credentials = this.retrieveCredentials();
|
|
1859
|
+
const account = await this.fetchDydxAccount();
|
|
1860
|
+
const usd = this.parseToInt(Precise["default"].stringMul(this.numberToString(amount), '1000000'));
|
|
1861
|
+
let payload = undefined;
|
|
1862
|
+
let signingPayload = undefined;
|
|
1863
|
+
if (fromAccount === 'main') {
|
|
1864
|
+
// deposit to subaccount
|
|
1865
|
+
if (toSubaccountId === undefined) {
|
|
1866
|
+
throw new errors.ArgumentsRequired(this.id + ' transfer() requeire toSubaccoutnId.');
|
|
1867
|
+
}
|
|
1868
|
+
payload = {
|
|
1869
|
+
'sender': this.getWalletAddress(),
|
|
1870
|
+
'recipient': {
|
|
1871
|
+
'owner': this.getWalletAddress(),
|
|
1872
|
+
'number': toSubaccountId,
|
|
1873
|
+
},
|
|
1874
|
+
'assetId': 0,
|
|
1875
|
+
'quantums': usd,
|
|
1876
|
+
};
|
|
1877
|
+
signingPayload = {
|
|
1878
|
+
'typeUrl': '/dydxprotocol.sending.MsgDepositToSubaccount',
|
|
1879
|
+
'value': payload,
|
|
1880
|
+
};
|
|
1881
|
+
}
|
|
1882
|
+
else {
|
|
1883
|
+
payload = {
|
|
1884
|
+
'transfer': {
|
|
1885
|
+
'sender': {
|
|
1886
|
+
'owner': fromAccount,
|
|
1887
|
+
'number': fromSubaccountId,
|
|
1888
|
+
},
|
|
1889
|
+
'recipient': {
|
|
1890
|
+
'owner': toAccount,
|
|
1891
|
+
'number': toSubaccountId,
|
|
1892
|
+
},
|
|
1893
|
+
'assetId': 0,
|
|
1894
|
+
'amount': usd,
|
|
1895
|
+
},
|
|
1896
|
+
};
|
|
1897
|
+
signingPayload = {
|
|
1898
|
+
'typeUrl': '/dydxprotocol.sending.MsgCreateTransfer',
|
|
1899
|
+
'value': payload,
|
|
1900
|
+
};
|
|
1901
|
+
}
|
|
1902
|
+
const txFee = await this.estimateTxFee(signingPayload, '', account);
|
|
1903
|
+
const chainName = this.options['chainName'];
|
|
1904
|
+
const signedTx = this.signDydxTx(credentials['privateKey'], signingPayload, '', chainName, account, undefined, txFee);
|
|
1905
|
+
const request = {
|
|
1906
|
+
'tx': signedTx,
|
|
1907
|
+
};
|
|
1908
|
+
// nodeRpcGetBroadcastTxAsync
|
|
1909
|
+
const response = await this.nodeRpcGetBroadcastTxSync(request);
|
|
1910
|
+
//
|
|
1911
|
+
// {
|
|
1912
|
+
// "jsonrpc": "2.0",
|
|
1913
|
+
// "id": -1,
|
|
1914
|
+
// "result": {
|
|
1915
|
+
// "code": 0,
|
|
1916
|
+
// "data": "",
|
|
1917
|
+
// "log": "[]",
|
|
1918
|
+
// "codespace": "",
|
|
1919
|
+
// "hash": "CBEDB0603E57E5CE21FA6954770A9403D2A81BED02E608C860356152D0AA1A81"
|
|
1920
|
+
// }
|
|
1921
|
+
// }
|
|
1922
|
+
//
|
|
1923
|
+
return this.parseTransfer(response);
|
|
1924
|
+
}
|
|
1925
|
+
parseTransfer(transfer, currency = undefined) {
|
|
1926
|
+
//
|
|
1927
|
+
// {
|
|
1928
|
+
// "id": "6a6075bc-7183-5fd9-bc9d-894e238aa527",
|
|
1929
|
+
// "sender": {
|
|
1930
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
1931
|
+
// "subaccountNumber": 0
|
|
1932
|
+
// },
|
|
1933
|
+
// "recipient": {
|
|
1934
|
+
// "address": "dydx1slanxj8x9ntk9knwa6cvfv2tzlsq5gk3dshml0",
|
|
1935
|
+
// "subaccountNumber": 1
|
|
1936
|
+
// },
|
|
1937
|
+
// "size": "0.000001",
|
|
1938
|
+
// "createdAt": "2025-07-29T09:43:02.105Z",
|
|
1939
|
+
// "createdAtHeight": "45116125",
|
|
1940
|
+
// "symbol": "USDC",
|
|
1941
|
+
// "type": "TRANSFER_OUT",
|
|
1942
|
+
// "transactionHash": "92B4744BA1B783CF37C79A50BEBC47FFD59C8D5197D62A8485D3DCCE9AF220AF"
|
|
1943
|
+
// }
|
|
1944
|
+
//
|
|
1945
|
+
const id = this.safeString(transfer, 'id');
|
|
1946
|
+
const currencyId = this.safeString(transfer, 'symbol');
|
|
1947
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
1948
|
+
const amount = this.safeNumber(transfer, 'size');
|
|
1949
|
+
const sender = this.safeDict(transfer, 'sender');
|
|
1950
|
+
const recipient = this.safeDict(transfer, 'recipient');
|
|
1951
|
+
const fromAccount = this.safeString(sender, 'address');
|
|
1952
|
+
const toAccount = this.safeString(recipient, 'address');
|
|
1953
|
+
const timestamp = this.parse8601(this.safeString(transfer, 'createdAt'));
|
|
1954
|
+
return {
|
|
1955
|
+
'info': transfer,
|
|
1956
|
+
'id': id,
|
|
1957
|
+
'timestamp': timestamp,
|
|
1958
|
+
'datetime': this.iso8601(timestamp),
|
|
1959
|
+
'currency': code,
|
|
1960
|
+
'amount': amount,
|
|
1961
|
+
'fromAccount': fromAccount,
|
|
1962
|
+
'toAccount': toAccount,
|
|
1963
|
+
'status': undefined,
|
|
1964
|
+
};
|
|
1965
|
+
}
|
|
1966
|
+
/**
|
|
1967
|
+
* @method
|
|
1968
|
+
* @name dydx#fetchTransfers
|
|
1969
|
+
* @description fetch a history of internal transfers made on an account
|
|
1970
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-transfers
|
|
1971
|
+
* @param {string} code unified currency code of the currency transferred
|
|
1972
|
+
* @param {int} [since] the earliest time in ms to fetch transfers for
|
|
1973
|
+
* @param {int} [limit] the maximum number of transfers structures to retrieve
|
|
1974
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1975
|
+
* @param {string} [params.address] wallet address that made trades
|
|
1976
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
1977
|
+
* @returns {object[]} a list of [transfer structures]{@link https://docs.ccxt.com/#/?id=transfer-structure}
|
|
1978
|
+
*/
|
|
1979
|
+
async fetchTransfers(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1980
|
+
await this.loadMarkets();
|
|
1981
|
+
let currency = undefined;
|
|
1982
|
+
if (code !== undefined) {
|
|
1983
|
+
currency = this.currency(code);
|
|
1984
|
+
}
|
|
1985
|
+
const response = await this.fetchTransactionsHelper(code, since, limit, this.extend(params, { 'methodName': 'fetchTransfers' }));
|
|
1986
|
+
const transferIn = this.filterBy(response, 'type', 'TRANSFER_IN');
|
|
1987
|
+
const transferOut = this.filterBy(response, 'type', 'TRANSFER_OUT');
|
|
1988
|
+
const rows = this.arrayConcat(transferIn, transferOut);
|
|
1989
|
+
return this.parseTransfers(rows, currency, since, limit);
|
|
1990
|
+
}
|
|
1991
|
+
parseTransaction(transaction, currency = undefined) {
|
|
1992
|
+
//
|
|
1993
|
+
// {
|
|
1994
|
+
// "id": "6a6075bc-7183-5fd9-bc9d-894e238aa527",
|
|
1995
|
+
// "sender": {
|
|
1996
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
1997
|
+
// "subaccountNumber": 0
|
|
1998
|
+
// },
|
|
1999
|
+
// "recipient": {
|
|
2000
|
+
// "address": "dydx1slanxj8x9ntk9knwa6cvfv2tzlsq5gk3dshml0",
|
|
2001
|
+
// "subaccountNumber": 1
|
|
2002
|
+
// },
|
|
2003
|
+
// "size": "0.000001",
|
|
2004
|
+
// "createdAt": "2025-07-29T09:43:02.105Z",
|
|
2005
|
+
// "createdAtHeight": "45116125",
|
|
2006
|
+
// "symbol": "USDC",
|
|
2007
|
+
// "type": "TRANSFER_OUT",
|
|
2008
|
+
// "transactionHash": "92B4744BA1B783CF37C79A50BEBC47FFD59C8D5197D62A8485D3DCCE9AF220AF"
|
|
2009
|
+
// }
|
|
2010
|
+
//
|
|
2011
|
+
const id = this.safeString(transaction, 'id');
|
|
2012
|
+
const sender = this.safeDict(transaction, 'sender');
|
|
2013
|
+
const recipient = this.safeDict(transaction, 'recipient');
|
|
2014
|
+
const addressTo = this.safeString(recipient, 'address');
|
|
2015
|
+
const addressFrom = this.safeString(sender, 'address');
|
|
2016
|
+
const txid = this.safeString(transaction, 'transactionHash');
|
|
2017
|
+
const currencyId = this.safeString(transaction, 'symbol');
|
|
2018
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
2019
|
+
const timestamp = this.parse8601(this.safeString(transaction, 'createdAt'));
|
|
2020
|
+
const amount = this.safeNumber(transaction, 'size');
|
|
2021
|
+
return {
|
|
2022
|
+
'info': transaction,
|
|
2023
|
+
'id': id,
|
|
2024
|
+
'txid': txid,
|
|
2025
|
+
'timestamp': timestamp,
|
|
2026
|
+
'datetime': this.iso8601(timestamp),
|
|
2027
|
+
'network': undefined,
|
|
2028
|
+
'address': addressTo,
|
|
2029
|
+
'addressTo': addressTo,
|
|
2030
|
+
'addressFrom': addressFrom,
|
|
2031
|
+
'tag': undefined,
|
|
2032
|
+
'tagTo': undefined,
|
|
2033
|
+
'tagFrom': undefined,
|
|
2034
|
+
'type': this.safeStringLower(transaction, 'type'),
|
|
2035
|
+
'amount': amount,
|
|
2036
|
+
'currency': code,
|
|
2037
|
+
'status': undefined,
|
|
2038
|
+
'updated': undefined,
|
|
2039
|
+
'internal': undefined,
|
|
2040
|
+
'comment': undefined,
|
|
2041
|
+
'fee': undefined,
|
|
2042
|
+
};
|
|
2043
|
+
}
|
|
2044
|
+
/**
|
|
2045
|
+
* @method
|
|
2046
|
+
* @name dydx#withdraw
|
|
2047
|
+
* @description make a withdrawal
|
|
2048
|
+
* @param {string} code unified currency code
|
|
2049
|
+
* @param {float} amount the amount to withdraw
|
|
2050
|
+
* @param {string} address the address to withdraw to
|
|
2051
|
+
* @param {string} tag
|
|
2052
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2053
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2054
|
+
*/
|
|
2055
|
+
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
2056
|
+
if (code !== 'USDC') {
|
|
2057
|
+
throw new errors.NotSupported(this.id + ' withdraw() only support USDC');
|
|
2058
|
+
}
|
|
2059
|
+
await this.loadMarkets();
|
|
2060
|
+
this.checkAddress(address);
|
|
2061
|
+
const subaccountId = this.safeInteger(params, 'subaccountId');
|
|
2062
|
+
if (subaccountId === undefined) {
|
|
2063
|
+
throw new errors.ArgumentsRequired(this.id + ' withdraw requires subaccountId.');
|
|
2064
|
+
}
|
|
2065
|
+
params = this.omit(params, ['subaccountId']);
|
|
2066
|
+
const currency = this.currency(code);
|
|
2067
|
+
const credentials = this.retrieveCredentials();
|
|
2068
|
+
const account = await this.fetchDydxAccount();
|
|
2069
|
+
const usd = this.parseToInt(Precise["default"].stringMul(this.numberToString(amount), '1000000'));
|
|
2070
|
+
const payload = {
|
|
2071
|
+
'sender': {
|
|
2072
|
+
'owner': this.getWalletAddress(),
|
|
2073
|
+
'number': subaccountId,
|
|
2074
|
+
},
|
|
2075
|
+
'recipient': address,
|
|
2076
|
+
'assetId': 0,
|
|
2077
|
+
'quantums': usd,
|
|
2078
|
+
};
|
|
2079
|
+
const signingPayload = {
|
|
2080
|
+
'typeUrl': '/dydxprotocol.sending.MsgWithdrawFromSubaccount',
|
|
2081
|
+
'value': payload,
|
|
2082
|
+
};
|
|
2083
|
+
const txFee = await this.estimateTxFee(signingPayload, tag, account);
|
|
2084
|
+
const chainName = this.options['chainName'];
|
|
2085
|
+
const signedTx = this.signDydxTx(credentials['privateKey'], signingPayload, tag, chainName, account, undefined, txFee);
|
|
2086
|
+
const request = {
|
|
2087
|
+
'tx': signedTx,
|
|
2088
|
+
};
|
|
2089
|
+
// nodeRpcGetBroadcastTxAsync
|
|
2090
|
+
const response = await this.nodeRpcGetBroadcastTxSync(request);
|
|
2091
|
+
//
|
|
2092
|
+
// {
|
|
2093
|
+
// "jsonrpc": "2.0",
|
|
2094
|
+
// "id": -1,
|
|
2095
|
+
// "result": {
|
|
2096
|
+
// "code": 0,
|
|
2097
|
+
// "data": "",
|
|
2098
|
+
// "log": "[]",
|
|
2099
|
+
// "codespace": "",
|
|
2100
|
+
// "hash": "CBEDB0603E57E5CE21FA6954770A9403D2A81BED02E608C860356152D0AA1A81"
|
|
2101
|
+
// }
|
|
2102
|
+
// }
|
|
2103
|
+
//
|
|
2104
|
+
const data = this.safeDict(response, 'result', {});
|
|
2105
|
+
return this.parseTransaction(data, currency);
|
|
2106
|
+
}
|
|
2107
|
+
/**
|
|
2108
|
+
* @method
|
|
2109
|
+
* @name dydx#fetchWithdrawals
|
|
2110
|
+
* @description fetch all withdrawals made from an account
|
|
2111
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-transfers
|
|
2112
|
+
* @param {string} code unified currency code
|
|
2113
|
+
* @param {int} [since] the earliest time in ms to fetch withdrawals for
|
|
2114
|
+
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
|
|
2115
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2116
|
+
* @param {string} [params.address] wallet address that made trades
|
|
2117
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
2118
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2119
|
+
*/
|
|
2120
|
+
async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2121
|
+
await this.loadMarkets();
|
|
2122
|
+
let currency = undefined;
|
|
2123
|
+
if (code !== undefined) {
|
|
2124
|
+
currency = this.currency(code);
|
|
2125
|
+
}
|
|
2126
|
+
const response = await this.fetchTransactionsHelper(code, since, limit, this.extend(params, { 'methodName': 'fetchWithdrawals' }));
|
|
2127
|
+
const rows = this.filterBy(response, 'type', 'WITHDRAWAL');
|
|
2128
|
+
return this.parseTransactions(rows, currency, since, limit);
|
|
2129
|
+
}
|
|
2130
|
+
/**
|
|
2131
|
+
* @method
|
|
2132
|
+
* @name dydx#fetchDeposits
|
|
2133
|
+
* @description fetch all deposits made to an account
|
|
2134
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-transfers
|
|
2135
|
+
* @param {string} code unified currency code
|
|
2136
|
+
* @param {int} [since] the earliest time in ms to fetch deposits for
|
|
2137
|
+
* @param {int} [limit] the maximum number of deposits structures to retrieve
|
|
2138
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2139
|
+
* @param {string} [params.address] wallet address that made trades
|
|
2140
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
2141
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2142
|
+
*/
|
|
2143
|
+
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2144
|
+
await this.loadMarkets();
|
|
2145
|
+
let currency = undefined;
|
|
2146
|
+
if (code !== undefined) {
|
|
2147
|
+
currency = this.currency(code);
|
|
2148
|
+
}
|
|
2149
|
+
const response = await this.fetchTransactionsHelper(code, since, limit, this.extend(params, { 'methodName': 'fetchDeposits' }));
|
|
2150
|
+
const rows = this.filterBy(response, 'type', 'DEPOSIT');
|
|
2151
|
+
return this.parseTransactions(rows, currency, since, limit);
|
|
2152
|
+
}
|
|
2153
|
+
/**
|
|
2154
|
+
* @method
|
|
2155
|
+
* @name dydx#fetchDepositsWithdrawals
|
|
2156
|
+
* @description fetch history of deposits and withdrawals
|
|
2157
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-transfers
|
|
2158
|
+
* @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
|
|
2159
|
+
* @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
|
|
2160
|
+
* @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
|
|
2161
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2162
|
+
* @param {string} [params.address] wallet address that made trades
|
|
2163
|
+
* @param {string} [params.subAccountNumber] sub account number
|
|
2164
|
+
* @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2165
|
+
*/
|
|
2166
|
+
async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2167
|
+
await this.loadMarkets();
|
|
2168
|
+
let currency = undefined;
|
|
2169
|
+
if (code !== undefined) {
|
|
2170
|
+
currency = this.currency(code);
|
|
2171
|
+
}
|
|
2172
|
+
const response = await this.fetchTransactionsHelper(code, since, limit, this.extend(params, { 'methodName': 'fetchDepositsWithdrawals' }));
|
|
2173
|
+
const withdrawals = this.filterBy(response, 'type', 'WITHDRAWAL');
|
|
2174
|
+
const deposits = this.filterBy(response, 'type', 'DEPOSIT');
|
|
2175
|
+
const rows = this.arrayConcat(withdrawals, deposits);
|
|
2176
|
+
return this.parseTransactions(rows, currency, since, limit);
|
|
2177
|
+
}
|
|
2178
|
+
async fetchTransactionsHelper(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2179
|
+
const methodName = this.safeString(params, 'methodName');
|
|
2180
|
+
params = this.omit(params, 'methodName');
|
|
2181
|
+
let userAddress = undefined;
|
|
2182
|
+
let subAccountNumber = undefined;
|
|
2183
|
+
[userAddress, params] = this.handlePublicAddress(methodName, params);
|
|
2184
|
+
[subAccountNumber, params] = this.handleOptionAndParams(params, methodName, 'subAccountNumber', '0');
|
|
2185
|
+
const request = {
|
|
2186
|
+
'address': userAddress,
|
|
2187
|
+
'subaccountNumber': subAccountNumber,
|
|
2188
|
+
};
|
|
2189
|
+
const response = await this.indexerGetTransfers(this.extend(request, params));
|
|
2190
|
+
//
|
|
2191
|
+
// {
|
|
2192
|
+
// "transfers": [
|
|
2193
|
+
// {
|
|
2194
|
+
// "id": "6a6075bc-7183-5fd9-bc9d-894e238aa527",
|
|
2195
|
+
// "sender": {
|
|
2196
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
2197
|
+
// "subaccountNumber": 0
|
|
2198
|
+
// },
|
|
2199
|
+
// "recipient": {
|
|
2200
|
+
// "address": "dydx1slanxj8x9ntk9knwa6cvfv2tzlsq5gk3dshml0",
|
|
2201
|
+
// "subaccountNumber": 1
|
|
2202
|
+
// },
|
|
2203
|
+
// "size": "0.000001",
|
|
2204
|
+
// "createdAt": "2025-07-29T09:43:02.105Z",
|
|
2205
|
+
// "createdAtHeight": "45116125",
|
|
2206
|
+
// "symbol": "USDC",
|
|
2207
|
+
// "type": "TRANSFER_OUT",
|
|
2208
|
+
// "transactionHash": "92B4744BA1B783CF37C79A50BEBC47FFD59C8D5197D62A8485D3DCCE9AF220AF"
|
|
2209
|
+
// }
|
|
2210
|
+
// ]
|
|
2211
|
+
// }
|
|
2212
|
+
//
|
|
2213
|
+
return this.safeList(response, 'transfers', []);
|
|
2214
|
+
}
|
|
2215
|
+
/**
|
|
2216
|
+
* @method
|
|
2217
|
+
* @name dydx#fetchAccounts
|
|
2218
|
+
* @description fetch all the accounts associated with a profile
|
|
2219
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-subaccounts
|
|
2220
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2221
|
+
* @param {string} [params.address] wallet address that made trades
|
|
2222
|
+
* @returns {object} a dictionary of [account structures]{@link https://docs.ccxt.com/#/?id=account-structure} indexed by the account type
|
|
2223
|
+
*/
|
|
2224
|
+
async fetchAccounts(params = {}) {
|
|
2225
|
+
let userAddress = undefined;
|
|
2226
|
+
[userAddress, params] = this.handlePublicAddress('fetchAccounts', params);
|
|
2227
|
+
const request = {
|
|
2228
|
+
'address': userAddress,
|
|
2229
|
+
};
|
|
2230
|
+
const response = await this.indexerGetAddressesAddress(this.extend(request, params));
|
|
2231
|
+
//
|
|
2232
|
+
// {
|
|
2233
|
+
// "subaccounts": [
|
|
2234
|
+
// {
|
|
2235
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
2236
|
+
// "subaccountNumber": 0,
|
|
2237
|
+
// "equity": "25346.73993597",
|
|
2238
|
+
// "freeCollateral": "24207.8530595294",
|
|
2239
|
+
// "openPerpetualPositions": {
|
|
2240
|
+
// "BTC-USD": {
|
|
2241
|
+
// "market": "BTC-USD",
|
|
2242
|
+
// "status": "OPEN",
|
|
2243
|
+
// "side": "SHORT",
|
|
2244
|
+
// "size": "-0.491",
|
|
2245
|
+
// "maxSize": "-0.009",
|
|
2246
|
+
// "entryPrice": "118703.60811320754716981132",
|
|
2247
|
+
// "exitPrice": "119655.95",
|
|
2248
|
+
// "realizedPnl": "3075.17994830188679245283016",
|
|
2249
|
+
// "unrealizedPnl": "1339.12776155490566037735812",
|
|
2250
|
+
// "createdAt": "2025-07-14T07:53:55.631Z",
|
|
2251
|
+
// "createdAtHeight": "44140908",
|
|
2252
|
+
// "closedAt": null,
|
|
2253
|
+
// "sumOpen": "0.53",
|
|
2254
|
+
// "sumClose": "0.038",
|
|
2255
|
+
// "netFunding": "3111.36894",
|
|
2256
|
+
// "subaccountNumber": 0
|
|
2257
|
+
// }
|
|
2258
|
+
// },
|
|
2259
|
+
// "assetPositions": {
|
|
2260
|
+
// "USDC": {
|
|
2261
|
+
// "size": "82291.083758",
|
|
2262
|
+
// "symbol": "USDC",
|
|
2263
|
+
// "side": "LONG",
|
|
2264
|
+
// "assetId": "0",
|
|
2265
|
+
// "subaccountNumber": 0
|
|
2266
|
+
// }
|
|
2267
|
+
// },
|
|
2268
|
+
// "marginEnabled": true,
|
|
2269
|
+
// "updatedAtHeight": "45234659",
|
|
2270
|
+
// "latestProcessedBlockHeight": "45293477"
|
|
2271
|
+
// }
|
|
2272
|
+
// ]
|
|
2273
|
+
// }
|
|
2274
|
+
//
|
|
2275
|
+
const rows = this.safeList(response, 'subaccounts', []);
|
|
2276
|
+
const result = [];
|
|
2277
|
+
for (let i = 0; i < rows.length; i++) {
|
|
2278
|
+
const account = rows[i];
|
|
2279
|
+
const accountId = this.safeString(account, 'subaccountNumber');
|
|
2280
|
+
result.push({
|
|
2281
|
+
'id': accountId,
|
|
2282
|
+
'type': undefined,
|
|
2283
|
+
'currency': undefined,
|
|
2284
|
+
'info': account,
|
|
2285
|
+
'code': undefined,
|
|
2286
|
+
});
|
|
2287
|
+
}
|
|
2288
|
+
return result;
|
|
2289
|
+
}
|
|
2290
|
+
/**
|
|
2291
|
+
* @method
|
|
2292
|
+
* @name dydx#fetchBalance
|
|
2293
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
2294
|
+
* @see https://docs.dydx.xyz/indexer-client/http#get-subaccount
|
|
2295
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2296
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
2297
|
+
*/
|
|
2298
|
+
async fetchBalance(params = {}) {
|
|
2299
|
+
await this.loadMarkets();
|
|
2300
|
+
let userAddress = undefined;
|
|
2301
|
+
[userAddress, params] = this.handlePublicAddress('fetchAccounts', params);
|
|
2302
|
+
let subaccountNumber = undefined;
|
|
2303
|
+
[subaccountNumber, params] = this.handleOptionAndParams(params, 'fetchAccounts', 'subaccountNumber', 0);
|
|
2304
|
+
const request = {
|
|
2305
|
+
'address': userAddress,
|
|
2306
|
+
'subaccountNumber': subaccountNumber,
|
|
2307
|
+
};
|
|
2308
|
+
const response = await this.indexerGetAddressesAddressSubaccountNumberSubaccountNumber(this.extend(request, params));
|
|
2309
|
+
//
|
|
2310
|
+
// {
|
|
2311
|
+
// "subaccount": {
|
|
2312
|
+
// "address": "dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art",
|
|
2313
|
+
// "subaccountNumber": 0,
|
|
2314
|
+
// "equity": "161451.040416029",
|
|
2315
|
+
// "freeCollateral": "152508.28819133578",
|
|
2316
|
+
// "openPerpetualPositions": {
|
|
2317
|
+
// "ETH-USD": {
|
|
2318
|
+
// "market": "ETH-USD",
|
|
2319
|
+
// "status": "OPEN",
|
|
2320
|
+
// "side": "LONG",
|
|
2321
|
+
// "size": "0.001",
|
|
2322
|
+
// "maxSize": "0.002",
|
|
2323
|
+
// "entryPrice": "3894.7",
|
|
2324
|
+
// "exitPrice": "3864.5",
|
|
2325
|
+
// "realizedPnl": "-0.034847",
|
|
2326
|
+
// "unrealizedPnl": "-0.044675155",
|
|
2327
|
+
// "createdAt": "2025-10-22T08:34:05.883Z",
|
|
2328
|
+
// "createdAtHeight": "52228825",
|
|
2329
|
+
// "closedAt": null,
|
|
2330
|
+
// "sumOpen": "0.002",
|
|
2331
|
+
// "sumClose": "0.001",
|
|
2332
|
+
// "netFunding": "-0.004647",
|
|
2333
|
+
// "subaccountNumber": 0
|
|
2334
|
+
// },
|
|
2335
|
+
// "BTC-USD": {
|
|
2336
|
+
// "market": "BTC-USD",
|
|
2337
|
+
// "status": "OPEN",
|
|
2338
|
+
// "side": "SHORT",
|
|
2339
|
+
// "size": "-4.1368",
|
|
2340
|
+
// "maxSize": "-0.009",
|
|
2341
|
+
// "entryPrice": "112196.87848803433219017636",
|
|
2342
|
+
// "exitPrice": "113885.21872652924977050823",
|
|
2343
|
+
// "realizedPnl": "-15180.426770788459736511679821",
|
|
2344
|
+
// "unrealizedPnl": "17002.285719484425404321566048",
|
|
2345
|
+
// "createdAt": "2025-07-14T07:53:55.631Z",
|
|
2346
|
+
// "createdAtHeight": "44140908",
|
|
2347
|
+
// "closedAt": null,
|
|
2348
|
+
// "sumOpen": "5.3361",
|
|
2349
|
+
// "sumClose": "1.1983",
|
|
2350
|
+
// "netFunding": "-13157.288663",
|
|
2351
|
+
// "subaccountNumber": 0
|
|
2352
|
+
// }
|
|
2353
|
+
// },
|
|
2354
|
+
// "assetPositions": {
|
|
2355
|
+
// "USDC": {
|
|
2356
|
+
// "size": "608580.951601",
|
|
2357
|
+
// "symbol": "USDC",
|
|
2358
|
+
// "side": "LONG",
|
|
2359
|
+
// "assetId": "0",
|
|
2360
|
+
// "subaccountNumber": 0
|
|
2361
|
+
// }
|
|
2362
|
+
// },
|
|
2363
|
+
// "marginEnabled": true,
|
|
2364
|
+
// "updatedAtHeight": "52228833",
|
|
2365
|
+
// "latestProcessedBlockHeight": "52246761"
|
|
2366
|
+
// }
|
|
2367
|
+
// }
|
|
2368
|
+
//
|
|
2369
|
+
const data = this.safeDict(response, 'subaccount');
|
|
2370
|
+
return this.parseBalance(data);
|
|
2371
|
+
}
|
|
2372
|
+
parseBalance(response) {
|
|
2373
|
+
const account = this.account();
|
|
2374
|
+
account['free'] = this.safeString(response, 'freeCollateral');
|
|
2375
|
+
const result = {
|
|
2376
|
+
'info': response,
|
|
2377
|
+
'USDC': account,
|
|
2378
|
+
};
|
|
2379
|
+
return this.safeBalance(result);
|
|
2380
|
+
}
|
|
2381
|
+
nonce() {
|
|
2382
|
+
return this.milliseconds() - this.options['timeDifference'];
|
|
2383
|
+
}
|
|
2384
|
+
getWalletAddress() {
|
|
2385
|
+
if (this.walletAddress !== undefined && this.walletAddress !== '') {
|
|
2386
|
+
return this.walletAddress;
|
|
2387
|
+
}
|
|
2388
|
+
const dydxAccount = this.safeDict(this.options, 'dydxAccount');
|
|
2389
|
+
if (dydxAccount !== undefined) {
|
|
2390
|
+
// return dydxAccount;
|
|
2391
|
+
const wallet = this.safeString(dydxAccount, 'address');
|
|
2392
|
+
if (wallet !== undefined) {
|
|
2393
|
+
return wallet;
|
|
2394
|
+
}
|
|
2395
|
+
}
|
|
2396
|
+
throw new errors.ArgumentsRequired(this.id + ' getWalletAddress() requires a wallet address. Set `walletAddress` or `dydxAccount` in exchange options.');
|
|
2397
|
+
}
|
|
2398
|
+
sign(path, section = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
2399
|
+
const pathWithParams = this.implodeParams(path, params);
|
|
2400
|
+
let url = this.implodeHostname(this.urls['api'][section]);
|
|
2401
|
+
params = this.omit(params, this.extractParams(path));
|
|
2402
|
+
params = this.keysort(params);
|
|
2403
|
+
url += '/' + pathWithParams;
|
|
2404
|
+
if (method === 'GET') {
|
|
2405
|
+
if (Object.keys(params).length) {
|
|
2406
|
+
url += '?' + this.urlencode(params);
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2409
|
+
else {
|
|
2410
|
+
body = this.json(params);
|
|
2411
|
+
headers = {
|
|
2412
|
+
'Content-type': 'application/json',
|
|
2413
|
+
};
|
|
2414
|
+
}
|
|
2415
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
2416
|
+
}
|
|
2417
|
+
handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
2418
|
+
if (!response) {
|
|
2419
|
+
return undefined; // fallback to default error handler
|
|
2420
|
+
}
|
|
2421
|
+
//
|
|
2422
|
+
// abci response
|
|
2423
|
+
// { "result": { "code": 0 } }
|
|
2424
|
+
//
|
|
2425
|
+
// rest response
|
|
2426
|
+
// { "code": 123 }
|
|
2427
|
+
//
|
|
2428
|
+
const result = this.safeDict(response, 'result');
|
|
2429
|
+
let errorCode = this.safeString(result, 'code');
|
|
2430
|
+
if (!errorCode) {
|
|
2431
|
+
errorCode = this.safeString(response, 'code');
|
|
2432
|
+
}
|
|
2433
|
+
if (errorCode) {
|
|
2434
|
+
const errorCodeNum = this.parseToNumeric(errorCode);
|
|
2435
|
+
if (errorCodeNum > 0) {
|
|
2436
|
+
const feedback = this.id + ' ' + this.json(response);
|
|
2437
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
2438
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], body, feedback);
|
|
2439
|
+
throw new errors.ExchangeError(feedback);
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
return undefined;
|
|
2443
|
+
}
|
|
2444
|
+
setSandboxMode(enable) {
|
|
2445
|
+
super.setSandboxMode(enable);
|
|
2446
|
+
// rewrite testnet parameters
|
|
2447
|
+
this.options['chainName'] = 'dydx-testnet-4';
|
|
2448
|
+
this.options['chainId'] = 11155111;
|
|
2449
|
+
this.options['feeDenom']['CHAINTOKEN_DENOM'] = 'adv4tnt';
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
exports["default"] = dydx;
|