ccxt 4.5.22 → 4.5.24

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.
Files changed (992) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +6 -1
  4. package/dist/cjs/src/abstract/alpaca.js +1 -1
  5. package/dist/cjs/src/abstract/apex.js +1 -1
  6. package/dist/cjs/src/abstract/arkham.js +1 -1
  7. package/dist/cjs/src/abstract/ascendex.js +1 -1
  8. package/dist/cjs/src/abstract/backpack.js +1 -1
  9. package/dist/cjs/src/abstract/bigone.js +1 -1
  10. package/dist/cjs/src/abstract/binance.js +1 -1
  11. package/dist/cjs/src/abstract/bingx.js +1 -1
  12. package/dist/cjs/src/abstract/bit2c.js +1 -1
  13. package/dist/cjs/src/abstract/bitbank.js +1 -1
  14. package/dist/cjs/src/abstract/bitbns.js +1 -1
  15. package/dist/cjs/src/abstract/bitfinex.js +1 -1
  16. package/dist/cjs/src/abstract/bitflyer.js +1 -1
  17. package/dist/cjs/src/abstract/bitget.js +1 -1
  18. package/dist/cjs/src/abstract/bithumb.js +1 -1
  19. package/dist/cjs/src/abstract/bitmart.js +1 -1
  20. package/dist/cjs/src/abstract/bitmex.js +1 -1
  21. package/dist/cjs/src/abstract/bitopro.js +1 -1
  22. package/dist/cjs/src/abstract/bitrue.js +1 -1
  23. package/dist/cjs/src/abstract/bitso.js +1 -1
  24. package/dist/cjs/src/abstract/bitstamp.js +1 -1
  25. package/dist/cjs/src/abstract/bitteam.js +1 -1
  26. package/dist/cjs/src/abstract/bittrade.js +1 -1
  27. package/dist/cjs/src/abstract/bitvavo.js +1 -1
  28. package/dist/cjs/src/abstract/blockchaincom.js +1 -1
  29. package/dist/cjs/src/abstract/blofin.js +1 -1
  30. package/dist/cjs/src/abstract/btcalpha.js +1 -1
  31. package/dist/cjs/src/abstract/btcbox.js +1 -1
  32. package/dist/cjs/src/abstract/btcmarkets.js +1 -1
  33. package/dist/cjs/src/abstract/btcturk.js +1 -1
  34. package/dist/cjs/src/abstract/bullish.js +11 -0
  35. package/dist/cjs/src/abstract/bybit.js +1 -1
  36. package/dist/cjs/src/abstract/cex.js +1 -1
  37. package/dist/cjs/src/abstract/coinbase.js +1 -1
  38. package/dist/cjs/src/abstract/coinbaseexchange.js +1 -1
  39. package/dist/cjs/src/abstract/coinbaseinternational.js +1 -1
  40. package/dist/cjs/src/abstract/coincatch.js +1 -1
  41. package/dist/cjs/src/abstract/coincheck.js +1 -1
  42. package/dist/cjs/src/abstract/coinex.js +1 -1
  43. package/dist/cjs/src/abstract/coinmate.js +1 -1
  44. package/dist/cjs/src/abstract/coinmetro.js +1 -1
  45. package/dist/cjs/src/abstract/coinone.js +1 -1
  46. package/dist/cjs/src/abstract/coinsph.js +1 -1
  47. package/dist/cjs/src/abstract/coinspot.js +1 -1
  48. package/dist/cjs/src/abstract/cryptocom.js +1 -1
  49. package/dist/cjs/src/abstract/cryptomus.js +1 -1
  50. package/dist/cjs/src/abstract/deepcoin.js +1 -1
  51. package/dist/cjs/src/abstract/defx.js +1 -1
  52. package/dist/cjs/src/abstract/delta.js +1 -1
  53. package/dist/cjs/src/abstract/deribit.js +1 -1
  54. package/dist/cjs/src/abstract/derive.js +1 -1
  55. package/dist/cjs/src/abstract/digifinex.js +1 -1
  56. package/dist/cjs/src/abstract/dydx.js +1 -1
  57. package/dist/cjs/src/abstract/exmo.js +1 -1
  58. package/dist/cjs/src/abstract/foxbit.js +1 -1
  59. package/dist/cjs/src/abstract/gate.js +1 -1
  60. package/dist/cjs/src/abstract/gemini.js +1 -1
  61. package/dist/cjs/src/abstract/hashkey.js +1 -1
  62. package/dist/cjs/src/abstract/hibachi.js +1 -1
  63. package/dist/cjs/src/abstract/hitbtc.js +1 -1
  64. package/dist/cjs/src/abstract/hollaex.js +1 -1
  65. package/dist/cjs/src/abstract/htx.js +1 -1
  66. package/dist/cjs/src/abstract/hyperliquid.js +1 -1
  67. package/dist/cjs/src/abstract/independentreserve.js +1 -1
  68. package/dist/cjs/src/abstract/indodax.js +1 -1
  69. package/dist/cjs/src/abstract/kraken.js +1 -1
  70. package/dist/cjs/src/abstract/krakenfutures.js +1 -1
  71. package/dist/cjs/src/abstract/kucoin.js +1 -1
  72. package/dist/cjs/src/abstract/kucoinfutures.js +1 -1
  73. package/dist/cjs/src/abstract/latoken.js +1 -1
  74. package/dist/cjs/src/abstract/lbank.js +1 -1
  75. package/dist/cjs/src/abstract/luno.js +1 -1
  76. package/dist/cjs/src/abstract/mercado.js +1 -1
  77. package/dist/cjs/src/abstract/mexc.js +1 -1
  78. package/dist/cjs/src/abstract/modetrade.js +1 -1
  79. package/dist/cjs/src/abstract/ndax.js +1 -1
  80. package/dist/cjs/src/abstract/novadax.js +1 -1
  81. package/dist/cjs/src/abstract/oceanex.js +1 -1
  82. package/dist/cjs/src/abstract/okx.js +1 -1
  83. package/dist/cjs/src/abstract/onetrading.js +1 -1
  84. package/dist/cjs/src/abstract/oxfun.js +1 -1
  85. package/dist/cjs/src/abstract/p2b.js +1 -1
  86. package/dist/cjs/src/abstract/paradex.js +1 -1
  87. package/dist/cjs/src/abstract/paymium.js +1 -1
  88. package/dist/cjs/src/abstract/phemex.js +1 -1
  89. package/dist/cjs/src/abstract/poloniex.js +1 -1
  90. package/dist/cjs/src/abstract/probit.js +1 -1
  91. package/dist/cjs/src/abstract/timex.js +1 -1
  92. package/dist/cjs/src/abstract/tokocrypto.js +1 -1
  93. package/dist/cjs/src/abstract/toobit.js +1 -1
  94. package/dist/cjs/src/abstract/upbit.js +1 -1
  95. package/dist/cjs/src/abstract/wavesexchange.js +1 -1
  96. package/dist/cjs/src/abstract/whitebit.js +1 -1
  97. package/dist/cjs/src/abstract/woo.js +1 -1
  98. package/dist/cjs/src/abstract/woofipro.js +1 -1
  99. package/dist/cjs/src/abstract/xt.js +1 -1
  100. package/dist/cjs/src/abstract/yobit.js +1 -1
  101. package/dist/cjs/src/abstract/zaif.js +1 -1
  102. package/dist/cjs/src/abstract/zonda.js +1 -1
  103. package/dist/cjs/src/alpaca.js +1 -1
  104. package/dist/cjs/src/apex.js +1 -1
  105. package/dist/cjs/src/arkham.js +1 -1
  106. package/dist/cjs/src/ascendex.js +1 -1
  107. package/dist/cjs/src/backpack.js +1 -1
  108. package/dist/cjs/src/base/Exchange.js +5 -6
  109. package/dist/cjs/src/base/Precise.js +6 -0
  110. package/dist/cjs/src/base/errors.js +6 -0
  111. package/dist/cjs/src/base/functions/crypto.js +1 -1
  112. package/dist/cjs/src/base/functions/encode.js +1 -1
  113. package/dist/cjs/src/base/functions/misc.js +1 -0
  114. package/dist/cjs/src/base/functions/number.js +6 -0
  115. package/dist/cjs/src/base/functions/platform.js +6 -0
  116. package/dist/cjs/src/base/functions/rsa.js +1 -0
  117. package/dist/cjs/src/base/functions/string.js +6 -0
  118. package/dist/cjs/src/base/functions/throttle.js +1 -1
  119. package/dist/cjs/src/base/functions/time.js +6 -0
  120. package/dist/cjs/src/base/functions/totp.js +1 -0
  121. package/dist/cjs/src/base/functions/type.js +6 -0
  122. package/dist/cjs/src/base/functions.js +1 -1
  123. package/dist/cjs/src/base/ws/Cache.js +6 -0
  124. package/dist/cjs/src/base/ws/Client.js +1 -0
  125. package/dist/cjs/src/base/ws/Future.js +1 -1
  126. package/dist/cjs/src/base/ws/OrderBook.js +1 -1
  127. package/dist/cjs/src/base/ws/OrderBookSide.js +6 -0
  128. package/dist/cjs/src/base/ws/WsClient.js +16 -1
  129. package/dist/cjs/src/bequant.js +1 -1
  130. package/dist/cjs/src/bigone.js +1 -1
  131. package/dist/cjs/src/binance.js +162 -39
  132. package/dist/cjs/src/binancecoinm.js +1 -1
  133. package/dist/cjs/src/binanceus.js +1 -1
  134. package/dist/cjs/src/binanceusdm.js +1 -1
  135. package/dist/cjs/src/bingx.js +3 -2
  136. package/dist/cjs/src/bit2c.js +1 -1
  137. package/dist/cjs/src/bitbank.js +1 -1
  138. package/dist/cjs/src/bitbns.js +1 -1
  139. package/dist/cjs/src/bitfinex.js +1 -1
  140. package/dist/cjs/src/bitflyer.js +1 -1
  141. package/dist/cjs/src/bitget.js +1 -1
  142. package/dist/cjs/src/bithumb.js +1 -1
  143. package/dist/cjs/src/bitmart.js +2 -1
  144. package/dist/cjs/src/bitmex.js +1 -1
  145. package/dist/cjs/src/bitopro.js +1 -1
  146. package/dist/cjs/src/bitrue.js +1 -1
  147. package/dist/cjs/src/bitso.js +1 -1
  148. package/dist/cjs/src/bitstamp.js +1 -1
  149. package/dist/cjs/src/bitteam.js +1 -1
  150. package/dist/cjs/src/bittrade.js +1 -1
  151. package/dist/cjs/src/blockchaincom.js +1 -1
  152. package/dist/cjs/src/blofin.js +1 -1
  153. package/dist/cjs/src/btcalpha.js +1 -1
  154. package/dist/cjs/src/btcbox.js +1 -1
  155. package/dist/cjs/src/btcmarkets.js +1 -1
  156. package/dist/cjs/src/btcturk.js +1 -1
  157. package/dist/cjs/src/bullish.js +2919 -0
  158. package/dist/cjs/src/bybit.js +65 -38
  159. package/dist/cjs/src/cex.js +1 -1
  160. package/dist/cjs/src/coinbaseadvanced.js +1 -1
  161. package/dist/cjs/src/coincatch.js +1 -1
  162. package/dist/cjs/src/coincheck.js +1 -1
  163. package/dist/cjs/src/coinex.js +1 -1
  164. package/dist/cjs/src/coinmate.js +1 -1
  165. package/dist/cjs/src/coinmetro.js +1 -1
  166. package/dist/cjs/src/coinone.js +1 -1
  167. package/dist/cjs/src/coinsph.js +1 -0
  168. package/dist/cjs/src/coinspot.js +1 -1
  169. package/dist/cjs/src/cryptocom.js +1 -1
  170. package/dist/cjs/src/cryptomus.js +1 -1
  171. package/dist/cjs/src/deepcoin.js +2 -2
  172. package/dist/cjs/src/defx.js +1 -1
  173. package/dist/cjs/src/delta.js +1 -1
  174. package/dist/cjs/src/deribit.js +1 -1
  175. package/dist/cjs/src/derive.js +1 -1
  176. package/dist/cjs/src/digifinex.js +1 -1
  177. package/dist/cjs/src/dydx.js +1 -1
  178. package/dist/cjs/src/exmo.js +1 -1
  179. package/dist/cjs/src/fmfwio.js +1 -1
  180. package/dist/cjs/src/foxbit.js +1 -1
  181. package/dist/cjs/src/gate.js +3 -3
  182. package/dist/cjs/src/gateio.js +1 -1
  183. package/dist/cjs/src/gemini.js +1 -1
  184. package/dist/cjs/src/hashkey.js +1 -1
  185. package/dist/cjs/src/hibachi.js +1 -1
  186. package/dist/cjs/src/hitbtc.js +1 -0
  187. package/dist/cjs/src/hollaex.js +1 -1
  188. package/dist/cjs/src/htx.js +5 -2
  189. package/dist/cjs/src/huobi.js +1 -1
  190. package/dist/cjs/src/hyperliquid.js +119 -15
  191. package/dist/cjs/src/independentreserve.js +1 -1
  192. package/dist/cjs/src/indodax.js +1 -1
  193. package/dist/cjs/src/kraken.js +1 -1
  194. package/dist/cjs/src/krakenfutures.js +1 -1
  195. package/dist/cjs/src/kucoin.js +23 -4
  196. package/dist/cjs/src/kucoinfutures.js +1 -1
  197. package/dist/cjs/src/latoken.js +1 -1
  198. package/dist/cjs/src/lbank.js +1 -1
  199. package/dist/cjs/src/luno.js +1 -1
  200. package/dist/cjs/src/mercado.js +1 -1
  201. package/dist/cjs/src/mexc.js +8 -1
  202. package/dist/cjs/src/modetrade.js +1 -1
  203. package/dist/cjs/src/myokx.js +1 -1
  204. package/dist/cjs/src/ndax.js +1 -1
  205. package/dist/cjs/src/novadax.js +1 -1
  206. package/dist/cjs/src/oceanex.js +1 -1
  207. package/dist/cjs/src/okx.js +118 -64
  208. package/dist/cjs/src/okxus.js +1 -1
  209. package/dist/cjs/src/onetrading.js +1 -1
  210. package/dist/cjs/src/oxfun.js +1 -1
  211. package/dist/cjs/src/p2b.js +1 -1
  212. package/dist/cjs/src/paradex.js +79 -4
  213. package/dist/cjs/src/paymium.js +1 -1
  214. package/dist/cjs/src/poloniex.js +1 -1
  215. package/dist/cjs/src/pro/alpaca.js +1 -1
  216. package/dist/cjs/src/pro/apex.js +1 -1
  217. package/dist/cjs/src/pro/arkham.js +1 -1
  218. package/dist/cjs/src/pro/ascendex.js +1 -1
  219. package/dist/cjs/src/pro/backpack.js +1 -1
  220. package/dist/cjs/src/pro/bequant.js +1 -1
  221. package/dist/cjs/src/pro/binance.js +131 -29
  222. package/dist/cjs/src/pro/binancecoinm.js +1 -1
  223. package/dist/cjs/src/pro/binanceus.js +1 -1
  224. package/dist/cjs/src/pro/binanceusdm.js +1 -1
  225. package/dist/cjs/src/pro/bingx.js +1 -1
  226. package/dist/cjs/src/pro/bitfinex.js +1 -1
  227. package/dist/cjs/src/pro/bitget.js +1 -1
  228. package/dist/cjs/src/pro/bithumb.js +1 -1
  229. package/dist/cjs/src/pro/bitmart.js +1 -1
  230. package/dist/cjs/src/pro/bitmex.js +1 -1
  231. package/dist/cjs/src/pro/bitrue.js +1 -1
  232. package/dist/cjs/src/pro/bitstamp.js +1 -1
  233. package/dist/cjs/src/pro/bitvavo.js +1 -1
  234. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  235. package/dist/cjs/src/pro/blofin.js +1 -1
  236. package/dist/cjs/src/pro/bullish.js +781 -0
  237. package/dist/cjs/src/pro/bybit.js +1 -1
  238. package/dist/cjs/src/pro/cex.js +1 -1
  239. package/dist/cjs/src/pro/coinbase.js +3 -3
  240. package/dist/cjs/src/pro/coinbaseadvanced.js +1 -1
  241. package/dist/cjs/src/pro/coinbaseexchange.js +1 -1
  242. package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
  243. package/dist/cjs/src/pro/coincatch.js +1 -1
  244. package/dist/cjs/src/pro/coincheck.js +1 -1
  245. package/dist/cjs/src/pro/coinex.js +1 -1
  246. package/dist/cjs/src/pro/coinone.js +1 -1
  247. package/dist/cjs/src/pro/cryptocom.js +1 -1
  248. package/dist/cjs/src/pro/deepcoin.js +1 -1
  249. package/dist/cjs/src/pro/defx.js +1 -1
  250. package/dist/cjs/src/pro/deribit.js +1 -1
  251. package/dist/cjs/src/pro/dydx.js +1 -1
  252. package/dist/cjs/src/pro/exmo.js +1 -1
  253. package/dist/cjs/src/pro/gate.js +1 -1
  254. package/dist/cjs/src/pro/gateio.js +1 -1
  255. package/dist/cjs/src/pro/gemini.js +1 -1
  256. package/dist/cjs/src/pro/hashkey.js +1 -1
  257. package/dist/cjs/src/pro/hitbtc.js +1 -1
  258. package/dist/cjs/src/pro/hollaex.js +1 -1
  259. package/dist/cjs/src/pro/htx.js +1 -1
  260. package/dist/cjs/src/pro/huobi.js +1 -1
  261. package/dist/cjs/src/pro/hyperliquid.js +76 -16
  262. package/dist/cjs/src/pro/independentreserve.js +1 -1
  263. package/dist/cjs/src/pro/kraken.js +1 -1
  264. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  265. package/dist/cjs/src/pro/kucoin.js +1 -1
  266. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  267. package/dist/cjs/src/pro/lbank.js +1 -0
  268. package/dist/cjs/src/pro/luno.js +1 -1
  269. package/dist/cjs/src/pro/mexc.js +1 -1
  270. package/dist/cjs/src/pro/myokx.js +1 -1
  271. package/dist/cjs/src/pro/ndax.js +1 -1
  272. package/dist/cjs/src/pro/okx.js +1 -1
  273. package/dist/cjs/src/pro/okxus.js +1 -1
  274. package/dist/cjs/src/pro/onetrading.js +1 -1
  275. package/dist/cjs/src/pro/oxfun.js +1 -1
  276. package/dist/cjs/src/pro/p2b.js +1 -1
  277. package/dist/cjs/src/pro/paradex.js +1 -1
  278. package/dist/cjs/src/pro/phemex.js +1 -1
  279. package/dist/cjs/src/pro/poloniex.js +1 -1
  280. package/dist/cjs/src/pro/probit.js +1 -1
  281. package/dist/cjs/src/pro/toobit.js +1 -1
  282. package/dist/cjs/src/pro/upbit.js +29 -83
  283. package/dist/cjs/src/pro/whitebit.js +1 -1
  284. package/dist/cjs/src/pro/xt.js +1 -1
  285. package/dist/cjs/src/probit.js +1 -1
  286. package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +0 -1
  287. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +1 -0
  288. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +1 -0
  289. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +1 -0
  290. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +1 -0
  291. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +1 -0
  292. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +1 -0
  293. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +1 -0
  294. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +1 -0
  295. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +1 -0
  296. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +1 -0
  297. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +1 -0
  298. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +1 -0
  299. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +1 -0
  300. package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +1 -0
  301. package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +6 -0
  302. package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +1 -0
  303. package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +1 -0
  304. package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +6 -0
  305. package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -1
  306. package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +6 -0
  307. package/dist/cjs/src/static_dependencies/ethers/coders/address.js +1 -0
  308. package/dist/cjs/src/static_dependencies/ethers/coders/anonymous.js +1 -0
  309. package/dist/cjs/src/static_dependencies/ethers/coders/array.js +1 -0
  310. package/dist/cjs/src/static_dependencies/ethers/coders/boolean.js +1 -0
  311. package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +1 -0
  312. package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +1 -0
  313. package/dist/cjs/src/static_dependencies/ethers/coders/null.js +1 -0
  314. package/dist/cjs/src/static_dependencies/ethers/coders/number.js +1 -0
  315. package/dist/cjs/src/static_dependencies/ethers/coders/string.js +1 -0
  316. package/dist/cjs/src/static_dependencies/ethers/coders/tuple.js +1 -0
  317. package/dist/cjs/src/static_dependencies/ethers/fragments.js +6 -0
  318. package/dist/cjs/src/static_dependencies/ethers/hash/typed-data.js +6 -0
  319. package/dist/cjs/src/static_dependencies/ethers/index.js +1 -10
  320. package/dist/cjs/src/static_dependencies/ethers/interface.js +6 -0
  321. package/dist/cjs/src/static_dependencies/ethers/typed.js +6 -0
  322. package/dist/cjs/src/static_dependencies/ethers/utils/base58.js +1 -13
  323. package/dist/cjs/src/static_dependencies/ethers/utils/data.js +1 -6
  324. package/dist/cjs/src/static_dependencies/ethers/utils/errors.js +1 -9
  325. package/dist/cjs/src/static_dependencies/ethers/utils/events.js +6 -0
  326. package/dist/cjs/src/static_dependencies/ethers/utils/fixednumber.js +6 -0
  327. package/dist/cjs/src/static_dependencies/ethers/utils/index.js +1 -7
  328. package/dist/cjs/src/static_dependencies/ethers/utils/maths.js +1 -5
  329. package/dist/cjs/src/static_dependencies/ethers/utils/properties.js +6 -0
  330. package/dist/cjs/src/static_dependencies/ethers/utils/utf8.js +1 -8
  331. package/dist/cjs/src/static_dependencies/fflake/browser.js +1 -1
  332. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncrypt.js +1 -0
  333. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +1 -0
  334. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +1 -1
  335. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +6 -0
  336. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +6 -0
  337. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +6 -0
  338. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +1 -0
  339. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1 -1
  340. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +6 -0
  341. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +1 -1
  342. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +1 -1
  343. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/util.js +6 -0
  344. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1 -1
  345. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +6 -0
  346. package/dist/cjs/src/static_dependencies/messagepack/msgpack.js +6 -0
  347. package/dist/cjs/src/static_dependencies/noble-curves/_shortw_utils.js +1 -1
  348. package/dist/cjs/src/static_dependencies/noble-curves/abstract/curve.js +1 -1
  349. package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +1 -1
  350. package/dist/cjs/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +1 -0
  351. package/dist/cjs/src/static_dependencies/noble-curves/abstract/modular.js +1 -1
  352. package/dist/cjs/src/static_dependencies/noble-curves/abstract/montgomery.js +1 -1
  353. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +1 -1
  354. package/dist/cjs/src/static_dependencies/noble-curves/abstract/utils.js +6 -0
  355. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  356. package/dist/cjs/src/static_dependencies/noble-curves/ed25519.js +1 -1
  357. package/dist/cjs/src/static_dependencies/noble-curves/p256.js +1 -1
  358. package/dist/cjs/src/static_dependencies/noble-curves/secp256k1.js +1 -1
  359. package/dist/cjs/src/static_dependencies/noble-hashes/_assert.js +6 -0
  360. package/dist/cjs/src/static_dependencies/noble-hashes/_sha2.js +1 -0
  361. package/dist/cjs/src/static_dependencies/noble-hashes/_u64.js +6 -0
  362. package/dist/cjs/src/static_dependencies/noble-hashes/crypto.js +6 -0
  363. package/dist/cjs/src/static_dependencies/noble-hashes/hmac.js +1 -0
  364. package/dist/cjs/src/static_dependencies/noble-hashes/md5.js +1 -0
  365. package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +1 -0
  366. package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +1 -0
  367. package/dist/cjs/src/static_dependencies/noble-hashes/sha1.js +1 -0
  368. package/dist/cjs/src/static_dependencies/noble-hashes/sha256.js +1 -0
  369. package/dist/cjs/src/static_dependencies/noble-hashes/sha3.js +1 -0
  370. package/dist/cjs/src/static_dependencies/noble-hashes/sha512.js +1 -0
  371. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +1 -1
  372. package/dist/cjs/src/static_dependencies/node-fetch/body.js +1 -5
  373. package/dist/cjs/src/static_dependencies/node-fetch/errors/abort-error.js +1 -0
  374. package/dist/cjs/src/static_dependencies/node-fetch/errors/base.js +6 -0
  375. package/dist/cjs/src/static_dependencies/node-fetch/errors/fetch-error.js +1 -0
  376. package/dist/cjs/src/static_dependencies/node-fetch/headers.js +1 -5
  377. package/dist/cjs/src/static_dependencies/node-fetch/index.js +1 -7
  378. package/dist/cjs/src/static_dependencies/node-fetch/request.js +1 -7
  379. package/dist/cjs/src/static_dependencies/node-fetch/response.js +1 -5
  380. package/dist/cjs/src/static_dependencies/node-fetch/utils/get-search.js +6 -0
  381. package/dist/cjs/src/static_dependencies/node-fetch/utils/is-redirect.js +6 -0
  382. package/dist/cjs/src/static_dependencies/node-fetch/utils/is.js +6 -0
  383. package/dist/cjs/src/static_dependencies/node-fetch/utils/referrer.js +1 -0
  384. package/dist/cjs/src/static_dependencies/proxies/agent-base/index.js +1 -0
  385. package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +1 -0
  386. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +1 -0
  387. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +6 -0
  388. package/dist/cjs/src/static_dependencies/qs/formats.js +6 -0
  389. package/dist/cjs/src/static_dependencies/qs/index.js +1 -0
  390. package/dist/cjs/src/static_dependencies/qs/parse.js +1 -0
  391. package/dist/cjs/src/static_dependencies/qs/stringify.js +1 -0
  392. package/dist/cjs/src/static_dependencies/qs/utils.js +6 -0
  393. package/dist/cjs/src/static_dependencies/scure-base/index.js +6 -0
  394. package/dist/cjs/src/static_dependencies/scure-bip32/index.js +1 -19
  395. package/dist/cjs/src/static_dependencies/scure-bip39/index.js +1 -1
  396. package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +6 -0
  397. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +1 -1
  398. package/dist/cjs/src/static_dependencies/starknet/constants.js +1 -1
  399. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +6 -0
  400. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +6 -0
  401. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +6 -0
  402. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +6 -0
  403. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +6 -0
  404. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +6 -0
  405. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +1 -1
  406. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +1 -1
  407. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +1 -1
  408. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +1 -0
  409. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +1 -0
  410. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +6 -0
  411. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +6 -0
  412. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +6 -0
  413. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +1 -0
  414. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +1 -1
  415. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +1 -0
  416. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +1 -0
  417. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +6 -0
  418. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +1 -0
  419. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +1 -0
  420. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +1 -0
  421. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +1 -1
  422. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +1 -4
  423. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +1 -0
  424. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +1 -3
  425. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +1 -0
  426. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +1 -0
  427. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +1 -0
  428. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +1 -0
  429. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +1 -1
  430. package/dist/cjs/src/static_dependencies/watchable/src/unpromise.js +6 -0
  431. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +6 -0
  432. package/dist/cjs/src/timex.js +1 -0
  433. package/dist/cjs/src/tokocrypto.js +1 -1
  434. package/dist/cjs/src/toobit.js +1 -1
  435. package/dist/cjs/src/upbit.js +1 -1
  436. package/dist/cjs/src/wavesexchange.js +1 -1
  437. package/dist/cjs/src/whitebit.js +1 -1
  438. package/dist/cjs/src/woo.js +1 -1
  439. package/dist/cjs/src/woofipro.js +1 -1
  440. package/dist/cjs/src/xt.js +1 -1
  441. package/dist/cjs/src/yobit.js +1 -1
  442. package/dist/cjs/src/zaif.js +1 -1
  443. package/dist/cjs/src/zonda.js +1 -1
  444. package/js/ccxt.d.ts +8 -2
  445. package/js/ccxt.js +12 -2
  446. package/js/src/abstract/alpaca.js +6 -0
  447. package/js/src/abstract/apex.js +6 -0
  448. package/js/src/abstract/arkham.js +6 -0
  449. package/js/src/abstract/ascendex.js +6 -0
  450. package/js/src/abstract/backpack.js +6 -0
  451. package/js/src/abstract/bequant.js +6 -0
  452. package/js/src/abstract/bigone.js +6 -0
  453. package/js/src/abstract/binance.d.ts +1 -0
  454. package/js/src/abstract/binance.js +6 -0
  455. package/js/src/abstract/binancecoinm.d.ts +1 -0
  456. package/js/src/abstract/binancecoinm.js +6 -0
  457. package/js/src/abstract/binanceus.d.ts +1 -0
  458. package/js/src/abstract/binanceus.js +6 -0
  459. package/js/src/abstract/binanceusdm.d.ts +1 -0
  460. package/js/src/abstract/binanceusdm.js +6 -0
  461. package/js/src/abstract/bingx.d.ts +1 -0
  462. package/js/src/abstract/bingx.js +6 -0
  463. package/js/src/abstract/bit2c.js +6 -0
  464. package/js/src/abstract/bitbank.js +6 -0
  465. package/js/src/abstract/bitbns.js +6 -0
  466. package/js/src/abstract/bitfinex.js +6 -0
  467. package/js/src/abstract/bitflyer.js +6 -0
  468. package/js/src/abstract/bitget.js +6 -0
  469. package/js/src/abstract/bithumb.js +6 -0
  470. package/js/src/abstract/bitmart.js +6 -0
  471. package/js/src/abstract/bitmex.js +6 -0
  472. package/js/src/abstract/bitopro.js +6 -0
  473. package/js/src/abstract/bitrue.js +6 -0
  474. package/js/src/abstract/bitso.js +6 -0
  475. package/js/src/abstract/bitstamp.js +6 -0
  476. package/js/src/abstract/bitteam.js +6 -0
  477. package/js/src/abstract/bittrade.js +6 -0
  478. package/js/src/abstract/bitvavo.js +6 -0
  479. package/js/src/abstract/blockchaincom.js +6 -0
  480. package/js/src/abstract/blofin.js +6 -0
  481. package/js/src/abstract/btcalpha.js +6 -0
  482. package/js/src/abstract/btcbox.js +6 -0
  483. package/js/src/abstract/btcmarkets.js +6 -0
  484. package/js/src/abstract/btcturk.js +6 -0
  485. package/js/src/abstract/bullish.d.ts +65 -0
  486. package/js/src/abstract/bullish.js +11 -0
  487. package/js/src/abstract/bybit.d.ts +27 -0
  488. package/js/src/abstract/bybit.js +6 -0
  489. package/js/src/abstract/cex.js +6 -0
  490. package/js/src/abstract/coinbase.js +6 -0
  491. package/js/src/abstract/coinbaseadvanced.js +6 -0
  492. package/js/src/abstract/coinbaseexchange.js +6 -0
  493. package/js/src/abstract/coinbaseinternational.js +6 -0
  494. package/js/src/abstract/coincatch.js +6 -0
  495. package/js/src/abstract/coincheck.js +6 -0
  496. package/js/src/abstract/coinex.js +6 -0
  497. package/js/src/abstract/coinmate.js +6 -0
  498. package/js/src/abstract/coinmetro.js +6 -0
  499. package/js/src/abstract/coinone.js +6 -0
  500. package/js/src/abstract/coinsph.js +6 -0
  501. package/js/src/abstract/coinspot.js +6 -0
  502. package/js/src/abstract/cryptocom.js +6 -0
  503. package/js/src/abstract/cryptomus.js +6 -0
  504. package/js/src/abstract/deepcoin.js +6 -0
  505. package/js/src/abstract/defx.js +6 -0
  506. package/js/src/abstract/delta.js +6 -0
  507. package/js/src/abstract/deribit.js +6 -0
  508. package/js/src/abstract/derive.js +6 -0
  509. package/js/src/abstract/digifinex.js +6 -0
  510. package/js/src/abstract/dydx.js +6 -0
  511. package/js/src/abstract/exmo.js +6 -0
  512. package/js/src/abstract/fmfwio.js +6 -0
  513. package/js/src/abstract/foxbit.js +6 -0
  514. package/js/src/abstract/gate.js +6 -0
  515. package/js/src/abstract/gateio.js +6 -0
  516. package/js/src/abstract/gemini.js +6 -0
  517. package/js/src/abstract/hashkey.js +6 -0
  518. package/js/src/abstract/hibachi.js +6 -0
  519. package/js/src/abstract/hitbtc.js +6 -0
  520. package/js/src/abstract/hollaex.js +6 -0
  521. package/js/src/abstract/htx.js +6 -0
  522. package/js/src/abstract/huobi.js +6 -0
  523. package/js/src/abstract/hyperliquid.js +6 -0
  524. package/js/src/abstract/independentreserve.js +6 -0
  525. package/js/src/abstract/indodax.js +6 -0
  526. package/js/src/abstract/kraken.js +6 -0
  527. package/js/src/abstract/krakenfutures.js +6 -0
  528. package/js/src/abstract/kucoin.d.ts +15 -0
  529. package/js/src/abstract/kucoin.js +6 -0
  530. package/js/src/abstract/kucoinfutures.d.ts +15 -0
  531. package/js/src/abstract/kucoinfutures.js +6 -0
  532. package/js/src/abstract/latoken.js +6 -0
  533. package/js/src/abstract/lbank.js +6 -0
  534. package/js/src/abstract/luno.js +6 -0
  535. package/js/src/abstract/mercado.js +6 -0
  536. package/js/src/abstract/mexc.d.ts +7 -0
  537. package/js/src/abstract/mexc.js +6 -0
  538. package/js/src/abstract/modetrade.js +6 -0
  539. package/js/src/abstract/myokx.d.ts +90 -39
  540. package/js/src/abstract/myokx.js +6 -0
  541. package/js/src/abstract/ndax.js +6 -0
  542. package/js/src/abstract/novadax.js +6 -0
  543. package/js/src/abstract/oceanex.js +6 -0
  544. package/js/src/abstract/okx.d.ts +90 -39
  545. package/js/src/abstract/okx.js +6 -0
  546. package/js/src/abstract/okxus.d.ts +90 -39
  547. package/js/src/abstract/okxus.js +6 -0
  548. package/js/src/abstract/onetrading.js +6 -0
  549. package/js/src/abstract/oxfun.js +6 -0
  550. package/js/src/abstract/p2b.js +6 -0
  551. package/js/src/abstract/paradex.js +6 -0
  552. package/js/src/abstract/paymium.js +6 -0
  553. package/js/src/abstract/phemex.js +6 -0
  554. package/js/src/abstract/poloniex.js +6 -0
  555. package/js/src/abstract/probit.js +6 -0
  556. package/js/src/abstract/timex.js +6 -0
  557. package/js/src/abstract/tokocrypto.js +6 -0
  558. package/js/src/abstract/toobit.js +6 -0
  559. package/js/src/abstract/upbit.js +6 -0
  560. package/js/src/abstract/wavesexchange.js +6 -0
  561. package/js/src/abstract/whitebit.js +6 -0
  562. package/js/src/abstract/woo.js +6 -0
  563. package/js/src/abstract/woofipro.js +6 -0
  564. package/js/src/abstract/xt.js +6 -0
  565. package/js/src/abstract/yobit.js +6 -0
  566. package/js/src/abstract/zaif.js +6 -0
  567. package/js/src/abstract/zonda.js +6 -0
  568. package/js/src/alpaca.js +6 -0
  569. package/js/src/apex.js +6 -0
  570. package/js/src/arkham.js +6 -0
  571. package/js/src/ascendex.js +6 -0
  572. package/js/src/backpack.js +6 -0
  573. package/js/src/base/Exchange.d.ts +2 -2
  574. package/js/src/base/Exchange.js +11 -6
  575. package/js/src/base/Precise.js +6 -0
  576. package/js/src/base/errorHierarchy.js +6 -0
  577. package/js/src/base/errors.js +6 -0
  578. package/js/src/base/functions/crypto.js +6 -0
  579. package/js/src/base/functions/encode.js +6 -0
  580. package/js/src/base/functions/generic.js +6 -0
  581. package/js/src/base/functions/misc.js +6 -0
  582. package/js/src/base/functions/number.js +6 -0
  583. package/js/src/base/functions/platform.js +6 -0
  584. package/js/src/base/functions/rsa.js +6 -0
  585. package/js/src/base/functions/string.js +6 -0
  586. package/js/src/base/functions/throttle.js +6 -0
  587. package/js/src/base/functions/time.js +6 -0
  588. package/js/src/base/functions/totp.js +6 -0
  589. package/js/src/base/functions/type.js +6 -0
  590. package/js/src/base/functions.js +6 -0
  591. package/js/src/base/types.js +6 -0
  592. package/js/src/base/ws/Cache.js +6 -0
  593. package/js/src/base/ws/Client.d.ts +1 -0
  594. package/js/src/base/ws/Client.js +6 -0
  595. package/js/src/base/ws/Future.js +6 -0
  596. package/js/src/base/ws/OrderBook.js +6 -0
  597. package/js/src/base/ws/OrderBookSide.js +6 -0
  598. package/js/src/base/ws/WsClient.js +21 -0
  599. package/js/src/base/ws/functions.js +6 -0
  600. package/js/src/bequant.js +6 -0
  601. package/js/src/bigone.js +6 -0
  602. package/js/src/binance.d.ts +15 -33
  603. package/js/src/binance.js +167 -38
  604. package/js/src/binancecoinm.js +6 -0
  605. package/js/src/binanceus.js +6 -0
  606. package/js/src/binanceusdm.js +6 -0
  607. package/js/src/bingx.js +8 -1
  608. package/js/src/bit2c.js +6 -0
  609. package/js/src/bitbank.js +6 -0
  610. package/js/src/bitbns.js +6 -0
  611. package/js/src/bitfinex.js +6 -0
  612. package/js/src/bitflyer.js +6 -0
  613. package/js/src/bitget.js +6 -0
  614. package/js/src/bithumb.js +6 -0
  615. package/js/src/bitmart.js +7 -0
  616. package/js/src/bitmex.js +6 -0
  617. package/js/src/bitopro.js +6 -0
  618. package/js/src/bitrue.js +6 -0
  619. package/js/src/bitso.js +6 -0
  620. package/js/src/bitstamp.js +6 -0
  621. package/js/src/bitteam.js +6 -0
  622. package/js/src/bittrade.js +6 -0
  623. package/js/src/bitvavo.js +6 -0
  624. package/js/src/blockchaincom.js +6 -0
  625. package/js/src/blofin.js +6 -0
  626. package/js/src/btcalpha.js +6 -0
  627. package/js/src/btcbox.js +6 -0
  628. package/js/src/btcmarkets.js +6 -0
  629. package/js/src/btcturk.js +6 -0
  630. package/js/src/bullish.d.ts +446 -0
  631. package/js/src/bullish.js +2918 -0
  632. package/js/src/bybit.js +70 -37
  633. package/js/src/cex.js +6 -0
  634. package/js/src/coinbase.js +6 -0
  635. package/js/src/coinbaseadvanced.js +6 -0
  636. package/js/src/coinbaseexchange.js +6 -0
  637. package/js/src/coinbaseinternational.js +6 -0
  638. package/js/src/coincatch.js +6 -0
  639. package/js/src/coincheck.js +6 -0
  640. package/js/src/coinex.js +6 -0
  641. package/js/src/coinmate.js +6 -0
  642. package/js/src/coinmetro.js +6 -0
  643. package/js/src/coinone.js +6 -0
  644. package/js/src/coinsph.js +6 -0
  645. package/js/src/coinspot.js +6 -0
  646. package/js/src/cryptocom.js +6 -0
  647. package/js/src/cryptomus.js +6 -0
  648. package/js/src/deepcoin.js +7 -1
  649. package/js/src/defx.js +6 -0
  650. package/js/src/delta.js +6 -0
  651. package/js/src/deribit.js +6 -0
  652. package/js/src/derive.js +6 -0
  653. package/js/src/digifinex.js +6 -0
  654. package/js/src/dydx.js +6 -0
  655. package/js/src/exmo.js +6 -0
  656. package/js/src/fmfwio.js +6 -0
  657. package/js/src/foxbit.js +6 -0
  658. package/js/src/gate.js +8 -2
  659. package/js/src/gateio.js +6 -0
  660. package/js/src/gemini.js +6 -0
  661. package/js/src/hashkey.js +6 -0
  662. package/js/src/hibachi.js +6 -0
  663. package/js/src/hitbtc.js +6 -0
  664. package/js/src/hollaex.js +6 -0
  665. package/js/src/htx.js +10 -1
  666. package/js/src/huobi.js +6 -0
  667. package/js/src/hyperliquid.d.ts +24 -0
  668. package/js/src/hyperliquid.js +124 -14
  669. package/js/src/independentreserve.js +6 -0
  670. package/js/src/indodax.js +6 -0
  671. package/js/src/kraken.js +6 -0
  672. package/js/src/krakenfutures.js +6 -0
  673. package/js/src/kucoin.js +28 -3
  674. package/js/src/kucoinfutures.js +6 -0
  675. package/js/src/latoken.js +6 -0
  676. package/js/src/lbank.js +6 -0
  677. package/js/src/luno.js +6 -0
  678. package/js/src/mercado.js +6 -0
  679. package/js/src/mexc.js +13 -0
  680. package/js/src/modetrade.js +6 -0
  681. package/js/src/myokx.js +6 -0
  682. package/js/src/ndax.js +6 -0
  683. package/js/src/novadax.js +6 -0
  684. package/js/src/oceanex.js +6 -0
  685. package/js/src/okx.js +123 -63
  686. package/js/src/okxus.js +6 -0
  687. package/js/src/onetrading.js +6 -0
  688. package/js/src/oxfun.js +6 -0
  689. package/js/src/p2b.js +6 -0
  690. package/js/src/paradex.d.ts +15 -1
  691. package/js/src/paradex.js +84 -3
  692. package/js/src/paymium.js +6 -0
  693. package/js/src/phemex.js +6 -0
  694. package/js/src/poloniex.js +6 -0
  695. package/js/src/pro/alpaca.js +6 -0
  696. package/js/src/pro/apex.js +6 -0
  697. package/js/src/pro/arkham.js +6 -0
  698. package/js/src/pro/ascendex.js +6 -0
  699. package/js/src/pro/backpack.js +6 -0
  700. package/js/src/pro/bequant.js +6 -0
  701. package/js/src/pro/binance.d.ts +7 -0
  702. package/js/src/pro/binance.js +137 -29
  703. package/js/src/pro/binancecoinm.js +6 -0
  704. package/js/src/pro/binanceus.js +6 -0
  705. package/js/src/pro/binanceusdm.js +6 -0
  706. package/js/src/pro/bingx.js +6 -0
  707. package/js/src/pro/bitfinex.js +6 -0
  708. package/js/src/pro/bitget.js +6 -0
  709. package/js/src/pro/bithumb.js +6 -0
  710. package/js/src/pro/bitmart.js +6 -0
  711. package/js/src/pro/bitmex.js +6 -0
  712. package/js/src/pro/bitopro.js +6 -0
  713. package/js/src/pro/bitrue.js +6 -0
  714. package/js/src/pro/bitstamp.js +6 -0
  715. package/js/src/pro/bittrade.js +6 -0
  716. package/js/src/pro/bitvavo.js +6 -0
  717. package/js/src/pro/blockchaincom.js +6 -0
  718. package/js/src/pro/blofin.js +6 -0
  719. package/js/src/pro/bullish.d.ts +108 -0
  720. package/js/src/pro/bullish.js +780 -0
  721. package/js/src/pro/bybit.js +6 -0
  722. package/js/src/pro/cex.js +6 -0
  723. package/js/src/pro/coinbase.js +8 -2
  724. package/js/src/pro/coinbaseadvanced.js +6 -0
  725. package/js/src/pro/coinbaseexchange.js +6 -0
  726. package/js/src/pro/coinbaseinternational.js +6 -0
  727. package/js/src/pro/coincatch.js +6 -0
  728. package/js/src/pro/coincheck.js +6 -0
  729. package/js/src/pro/coinex.js +6 -0
  730. package/js/src/pro/coinone.js +6 -0
  731. package/js/src/pro/cryptocom.js +6 -0
  732. package/js/src/pro/deepcoin.js +6 -0
  733. package/js/src/pro/defx.js +6 -0
  734. package/js/src/pro/deribit.js +6 -0
  735. package/js/src/pro/derive.js +6 -0
  736. package/js/src/pro/dydx.js +6 -0
  737. package/js/src/pro/exmo.js +6 -0
  738. package/js/src/pro/gate.js +6 -0
  739. package/js/src/pro/gateio.js +6 -0
  740. package/js/src/pro/gemini.js +6 -0
  741. package/js/src/pro/hashkey.js +6 -0
  742. package/js/src/pro/hitbtc.js +6 -0
  743. package/js/src/pro/hollaex.js +6 -0
  744. package/js/src/pro/htx.js +6 -0
  745. package/js/src/pro/huobi.js +6 -0
  746. package/js/src/pro/hyperliquid.d.ts +13 -1
  747. package/js/src/pro/hyperliquid.js +81 -15
  748. package/js/src/pro/independentreserve.js +6 -0
  749. package/js/src/pro/kraken.js +6 -0
  750. package/js/src/pro/krakenfutures.js +6 -0
  751. package/js/src/pro/kucoin.js +6 -0
  752. package/js/src/pro/kucoinfutures.js +6 -0
  753. package/js/src/pro/lbank.js +6 -0
  754. package/js/src/pro/luno.js +6 -0
  755. package/js/src/pro/mexc.js +6 -0
  756. package/js/src/pro/modetrade.js +6 -0
  757. package/js/src/pro/myokx.js +6 -0
  758. package/js/src/pro/ndax.js +6 -0
  759. package/js/src/pro/okx.js +6 -0
  760. package/js/src/pro/okxus.js +6 -0
  761. package/js/src/pro/onetrading.js +6 -0
  762. package/js/src/pro/oxfun.js +6 -0
  763. package/js/src/pro/p2b.js +6 -0
  764. package/js/src/pro/paradex.js +6 -0
  765. package/js/src/pro/phemex.js +6 -0
  766. package/js/src/pro/poloniex.js +6 -0
  767. package/js/src/pro/probit.js +6 -0
  768. package/js/src/pro/toobit.js +6 -0
  769. package/js/src/pro/upbit.d.ts +0 -1
  770. package/js/src/pro/upbit.js +34 -82
  771. package/js/src/pro/whitebit.js +6 -0
  772. package/js/src/pro/woo.js +6 -0
  773. package/js/src/pro/woofipro.js +6 -0
  774. package/js/src/pro/xt.js +6 -0
  775. package/js/src/probit.js +6 -0
  776. package/js/src/protobuf/mexc/compiled.cjs +6 -0
  777. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +6 -0
  778. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +6 -0
  779. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +6 -0
  780. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +6 -0
  781. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +6 -0
  782. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +6 -0
  783. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +6 -0
  784. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +6 -0
  785. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +6 -0
  786. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +6 -0
  787. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +6 -0
  788. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +6 -0
  789. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +6 -0
  790. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +6 -0
  791. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +6 -0
  792. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +6 -0
  793. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +6 -0
  794. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +6 -0
  795. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +6 -0
  796. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +6 -0
  797. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +6 -0
  798. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +6 -0
  799. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +6 -0
  800. package/js/src/static_dependencies/dydx-v4-client/helpers.js +6 -0
  801. package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +6 -0
  802. package/js/src/static_dependencies/dydx-v4-client/onboarding.js +6 -0
  803. package/js/src/static_dependencies/dydx-v4-client/registry.js +6 -0
  804. package/js/src/static_dependencies/ethers/abi-coder.js +6 -0
  805. package/js/src/static_dependencies/ethers/address/address.js +6 -0
  806. package/js/src/static_dependencies/ethers/address/checks.js +6 -0
  807. package/js/src/static_dependencies/ethers/address/contract-address.js +6 -0
  808. package/js/src/static_dependencies/ethers/address/index.js +6 -0
  809. package/js/src/static_dependencies/ethers/bytes32.js +6 -0
  810. package/js/src/static_dependencies/ethers/coders/abstract-coder.js +6 -0
  811. package/js/src/static_dependencies/ethers/coders/address.js +6 -0
  812. package/js/src/static_dependencies/ethers/coders/anonymous.js +6 -0
  813. package/js/src/static_dependencies/ethers/coders/array.js +6 -0
  814. package/js/src/static_dependencies/ethers/coders/boolean.js +6 -0
  815. package/js/src/static_dependencies/ethers/coders/bytes.js +6 -0
  816. package/js/src/static_dependencies/ethers/coders/fixed-bytes.js +6 -0
  817. package/js/src/static_dependencies/ethers/coders/null.js +6 -0
  818. package/js/src/static_dependencies/ethers/coders/number.js +6 -0
  819. package/js/src/static_dependencies/ethers/coders/string.js +6 -0
  820. package/js/src/static_dependencies/ethers/coders/tuple.js +6 -0
  821. package/js/src/static_dependencies/ethers/fragments.js +6 -0
  822. package/js/src/static_dependencies/ethers/hash/index.js +6 -0
  823. package/js/src/static_dependencies/ethers/hash/solidity.js +6 -0
  824. package/js/src/static_dependencies/ethers/hash/typed-data.js +6 -0
  825. package/js/src/static_dependencies/ethers/index.js +6 -0
  826. package/js/src/static_dependencies/ethers/interface.js +6 -0
  827. package/js/src/static_dependencies/ethers/typed.js +6 -0
  828. package/js/src/static_dependencies/ethers/utils/base58.js +6 -0
  829. package/js/src/static_dependencies/ethers/utils/base64-browser.js +6 -0
  830. package/js/src/static_dependencies/ethers/utils/base64.js +6 -0
  831. package/js/src/static_dependencies/ethers/utils/data.js +6 -0
  832. package/js/src/static_dependencies/ethers/utils/errors.js +6 -0
  833. package/js/src/static_dependencies/ethers/utils/events.js +6 -0
  834. package/js/src/static_dependencies/ethers/utils/fixednumber.js +6 -0
  835. package/js/src/static_dependencies/ethers/utils/index.js +6 -0
  836. package/js/src/static_dependencies/ethers/utils/maths.js +6 -0
  837. package/js/src/static_dependencies/ethers/utils/properties.js +6 -0
  838. package/js/src/static_dependencies/ethers/utils/rlp-decode.js +6 -0
  839. package/js/src/static_dependencies/ethers/utils/rlp-encode.js +6 -0
  840. package/js/src/static_dependencies/ethers/utils/rlp.js +6 -0
  841. package/js/src/static_dependencies/ethers/utils/units.js +6 -0
  842. package/js/src/static_dependencies/ethers/utils/utf8.js +6 -0
  843. package/js/src/static_dependencies/ethers/utils/uuid.js +6 -0
  844. package/js/src/static_dependencies/fflake/browser.js +6 -0
  845. package/js/src/static_dependencies/jsencrypt/JSEncrypt.js +6 -0
  846. package/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +6 -0
  847. package/js/src/static_dependencies/jsencrypt/index.js +6 -0
  848. package/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +6 -0
  849. package/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +6 -0
  850. package/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +6 -0
  851. package/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +6 -0
  852. package/js/src/static_dependencies/jsencrypt/lib/asn1js/oids.js +6 -0
  853. package/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +6 -0
  854. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +6 -0
  855. package/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +6 -0
  856. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +6 -0
  857. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +6 -0
  858. package/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +6 -0
  859. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +6 -0
  860. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +6 -0
  861. package/js/src/static_dependencies/messagepack/msgpack.js +6 -0
  862. package/js/src/static_dependencies/noble-curves/_shortw_utils.js +6 -0
  863. package/js/src/static_dependencies/noble-curves/abstract/curve.js +6 -0
  864. package/js/src/static_dependencies/noble-curves/abstract/edwards.js +6 -0
  865. package/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +6 -0
  866. package/js/src/static_dependencies/noble-curves/abstract/modular.js +6 -0
  867. package/js/src/static_dependencies/noble-curves/abstract/montgomery.js +6 -0
  868. package/js/src/static_dependencies/noble-curves/abstract/poseidon.js +6 -0
  869. package/js/src/static_dependencies/noble-curves/abstract/utils.js +6 -0
  870. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +6 -0
  871. package/js/src/static_dependencies/noble-curves/bn.js +6 -0
  872. package/js/src/static_dependencies/noble-curves/ed25519.js +6 -0
  873. package/js/src/static_dependencies/noble-curves/ed448.js +6 -0
  874. package/js/src/static_dependencies/noble-curves/index.js +6 -0
  875. package/js/src/static_dependencies/noble-curves/jubjub.js +6 -0
  876. package/js/src/static_dependencies/noble-curves/p256.js +6 -0
  877. package/js/src/static_dependencies/noble-curves/p384.js +6 -0
  878. package/js/src/static_dependencies/noble-curves/p521.js +6 -0
  879. package/js/src/static_dependencies/noble-curves/pasta.js +6 -0
  880. package/js/src/static_dependencies/noble-curves/secp256k1.js +6 -0
  881. package/js/src/static_dependencies/noble-hashes/_assert.js +6 -0
  882. package/js/src/static_dependencies/noble-hashes/_blake2.js +6 -0
  883. package/js/src/static_dependencies/noble-hashes/_sha2.js +6 -0
  884. package/js/src/static_dependencies/noble-hashes/_u64.js +6 -0
  885. package/js/src/static_dependencies/noble-hashes/argon2.js +6 -0
  886. package/js/src/static_dependencies/noble-hashes/blake2b.js +6 -0
  887. package/js/src/static_dependencies/noble-hashes/blake2s.js +6 -0
  888. package/js/src/static_dependencies/noble-hashes/blake3.js +6 -0
  889. package/js/src/static_dependencies/noble-hashes/crypto.js +6 -0
  890. package/js/src/static_dependencies/noble-hashes/cryptoNode.js +6 -0
  891. package/js/src/static_dependencies/noble-hashes/eskdf.js +6 -0
  892. package/js/src/static_dependencies/noble-hashes/hkdf.js +6 -0
  893. package/js/src/static_dependencies/noble-hashes/hmac.js +6 -0
  894. package/js/src/static_dependencies/noble-hashes/index.js +6 -0
  895. package/js/src/static_dependencies/noble-hashes/md5.js +6 -0
  896. package/js/src/static_dependencies/noble-hashes/pbkdf2.js +6 -0
  897. package/js/src/static_dependencies/noble-hashes/ripemd160.js +6 -0
  898. package/js/src/static_dependencies/noble-hashes/scrypt.js +6 -0
  899. package/js/src/static_dependencies/noble-hashes/sha1.js +6 -0
  900. package/js/src/static_dependencies/noble-hashes/sha256.js +6 -0
  901. package/js/src/static_dependencies/noble-hashes/sha3-addons.js +6 -0
  902. package/js/src/static_dependencies/noble-hashes/sha3.js +6 -0
  903. package/js/src/static_dependencies/noble-hashes/sha512.js +6 -0
  904. package/js/src/static_dependencies/noble-hashes/utils.js +6 -0
  905. package/js/src/static_dependencies/node-fetch/body.js +6 -0
  906. package/js/src/static_dependencies/node-fetch/errors/abort-error.js +6 -0
  907. package/js/src/static_dependencies/node-fetch/errors/base.js +6 -0
  908. package/js/src/static_dependencies/node-fetch/errors/fetch-error.js +6 -0
  909. package/js/src/static_dependencies/node-fetch/headers.js +6 -0
  910. package/js/src/static_dependencies/node-fetch/index.js +6 -0
  911. package/js/src/static_dependencies/node-fetch/request.js +6 -0
  912. package/js/src/static_dependencies/node-fetch/response.js +6 -0
  913. package/js/src/static_dependencies/node-fetch/utils/get-search.js +6 -0
  914. package/js/src/static_dependencies/node-fetch/utils/is-redirect.js +6 -0
  915. package/js/src/static_dependencies/node-fetch/utils/is.js +6 -0
  916. package/js/src/static_dependencies/node-fetch/utils/referrer.js +6 -0
  917. package/js/src/static_dependencies/proxies/agent-base/helpers.js +6 -0
  918. package/js/src/static_dependencies/proxies/agent-base/index.js +6 -0
  919. package/js/src/static_dependencies/proxies/http-proxy-agent/index.js +6 -0
  920. package/js/src/static_dependencies/proxies/https-proxy-agent/index.js +6 -0
  921. package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +6 -0
  922. package/js/src/static_dependencies/qs/formats.js +6 -0
  923. package/js/src/static_dependencies/qs/index.js +6 -0
  924. package/js/src/static_dependencies/qs/parse.js +6 -0
  925. package/js/src/static_dependencies/qs/stringify.js +6 -0
  926. package/js/src/static_dependencies/qs/utils.js +6 -0
  927. package/js/src/static_dependencies/scure-base/index.js +6 -0
  928. package/js/src/static_dependencies/scure-bip32/index.js +6 -0
  929. package/js/src/static_dependencies/scure-bip39/index.js +6 -0
  930. package/js/src/static_dependencies/scure-bip39/wordlists/english.js +6 -0
  931. package/js/src/static_dependencies/scure-starknet/index.js +6 -0
  932. package/js/src/static_dependencies/starknet/constants.js +6 -0
  933. package/js/src/static_dependencies/starknet/index.js +6 -0
  934. package/js/src/static_dependencies/starknet/types/cairoEnum.js +6 -0
  935. package/js/src/static_dependencies/starknet/types/calldata.js +6 -0
  936. package/js/src/static_dependencies/starknet/types/index.js +6 -0
  937. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +6 -0
  938. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +6 -0
  939. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +6 -0
  940. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +6 -0
  941. package/js/src/static_dependencies/starknet/types/lib/index.js +6 -0
  942. package/js/src/static_dependencies/starknet/types/typedData.js +6 -0
  943. package/js/src/static_dependencies/starknet/utils/address.js +6 -0
  944. package/js/src/static_dependencies/starknet/utils/assert.js +6 -0
  945. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +6 -0
  946. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +6 -0
  947. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +6 -0
  948. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +6 -0
  949. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +6 -0
  950. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +6 -0
  951. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +6 -0
  952. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +6 -0
  953. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +6 -0
  954. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +6 -0
  955. package/js/src/static_dependencies/starknet/utils/calldata/index.js +6 -0
  956. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +6 -0
  957. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +6 -0
  958. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +6 -0
  959. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +6 -0
  960. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +6 -0
  961. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +6 -0
  962. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +6 -0
  963. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +6 -0
  964. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +6 -0
  965. package/js/src/static_dependencies/starknet/utils/encode.js +6 -0
  966. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +6 -0
  967. package/js/src/static_dependencies/starknet/utils/hash/index.js +6 -0
  968. package/js/src/static_dependencies/starknet/utils/merkle.js +6 -0
  969. package/js/src/static_dependencies/starknet/utils/num.js +6 -0
  970. package/js/src/static_dependencies/starknet/utils/selector.js +6 -0
  971. package/js/src/static_dependencies/starknet/utils/shortString.js +6 -0
  972. package/js/src/static_dependencies/starknet/utils/starknetId.js +6 -0
  973. package/js/src/static_dependencies/starknet/utils/typedData.js +6 -0
  974. package/js/src/static_dependencies/starknet/utils/uint256.js +6 -0
  975. package/js/src/static_dependencies/starknet/utils/url.js +6 -0
  976. package/js/src/static_dependencies/watchable/src/index.js +6 -0
  977. package/js/src/static_dependencies/watchable/src/types.js +6 -0
  978. package/js/src/static_dependencies/watchable/src/unpromise.js +6 -0
  979. package/js/src/static_dependencies/zklink/zklink-sdk-web.js +6 -0
  980. package/js/src/timex.js +6 -0
  981. package/js/src/tokocrypto.js +6 -0
  982. package/js/src/toobit.js +6 -0
  983. package/js/src/upbit.js +6 -0
  984. package/js/src/wavesexchange.js +6 -0
  985. package/js/src/whitebit.js +6 -0
  986. package/js/src/woo.js +6 -0
  987. package/js/src/woofipro.js +6 -0
  988. package/js/src/xt.js +6 -0
  989. package/js/src/yobit.js +6 -0
  990. package/js/src/zaif.js +6 -0
  991. package/js/src/zonda.js +6 -0
  992. package/package.json +2 -2
@@ -0,0 +1,2918 @@
1
+ // ----------------------------------------------------------------------------
2
+
3
+ // PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ // https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+ // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
+
7
+ // ---------------------------------------------------------------------------
8
+ import Exchange from './abstract/bullish.js';
9
+ import { AuthenticationError, ArgumentsRequired, BadRequest, BadSymbol, DuplicateOrderId, ExchangeError, InvalidAddress, InvalidNonce, InvalidOrder, InsufficientFunds, MarketClosed, NotSupported, OperationRejected, OrderNotFillable, OrderNotFound, PermissionDenied, RateLimitExceeded } from './base/errors.js';
10
+ import { TICK_SIZE } from './base/functions/number.js';
11
+ import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * @class bullish
15
+ * @augments Exchange
16
+ */
17
+ export default class bullish extends Exchange {
18
+ describe() {
19
+ return this.deepExtend(super.describe(), {
20
+ 'id': 'bullish',
21
+ 'name': 'Bullish',
22
+ 'countries': ['DE'],
23
+ 'version': 'v3',
24
+ 'rateLimit': 20,
25
+ 'pro': true,
26
+ 'has': {
27
+ 'CORS': undefined,
28
+ 'spot': true,
29
+ 'margin': false,
30
+ 'swap': false,
31
+ 'future': false,
32
+ 'option': false,
33
+ 'addMargin': false,
34
+ 'borrowMargin': false,
35
+ 'cancelAllOrders': true,
36
+ 'cancelOrder': true,
37
+ 'cancelOrders': false,
38
+ 'createDepositAddress': false,
39
+ 'createLimitBuyOrder': true,
40
+ 'createLimitOrder': true,
41
+ 'createLimitSellOrder': true,
42
+ 'createMarketBuyOrder': true,
43
+ 'createMarketOrder': true,
44
+ 'createMarketSellOrder': true,
45
+ 'createOrder': true,
46
+ 'createPostOnlyOrder': true,
47
+ 'createTriggerOrder': true,
48
+ 'deposit': false,
49
+ 'editOrder': true,
50
+ 'fetchAccounts': true,
51
+ 'fetchBalance': true,
52
+ 'fetchBidsAsks': false,
53
+ 'fetchBorrowInterest': false,
54
+ 'fetchBorrowRateHistories': false,
55
+ 'fetchBorrowRateHistory': true,
56
+ 'fetchCanceledAndClosedOrders': true,
57
+ 'fetchCanceledOrders': true,
58
+ 'fetchClosedOrder': false,
59
+ 'fetchClosedOrders': true,
60
+ 'fetchCrossBorrowRate': false,
61
+ 'fetchCrossBorrowRates': false,
62
+ 'fetchCurrencies': true,
63
+ 'fetchDeposit': false,
64
+ 'fetchDepositAddress': true,
65
+ 'fetchDepositAddresses': false,
66
+ 'fetchDepositAddressesByNetwork': false,
67
+ 'fetchDeposits': false,
68
+ 'fetchDepositsWithdrawals': true,
69
+ 'fetchDepositWithdrawFee': false,
70
+ 'fetchDepositWithdrawFees': false,
71
+ 'fetchFundingHistory': false,
72
+ 'fetchFundingRate': false,
73
+ 'fetchFundingRateHistory': true,
74
+ 'fetchFundingRates': false,
75
+ 'fetchIndexOHLCV': false,
76
+ 'fetchIsolatedBorrowRate': false,
77
+ 'fetchIsolatedBorrowRates': false,
78
+ 'fetchL3OrderBook': false,
79
+ 'fetchLedger': false,
80
+ 'fetchLeverage': false,
81
+ 'fetchLeverageTiers': false,
82
+ 'fetchMarketLeverageTiers': false,
83
+ 'fetchMarkets': true,
84
+ 'fetchMarkOHLCV': false,
85
+ 'fetchMyTrades': true,
86
+ 'fetchOHLCV': true,
87
+ 'fetchOpenInterestHistory': false,
88
+ 'fetchOpenOrder': false,
89
+ 'fetchOpenOrders': true,
90
+ 'fetchOrder': true,
91
+ 'fetchOrderBook': true,
92
+ 'fetchOrderBooks': false,
93
+ 'fetchOrders': true,
94
+ 'fetchOrderTrades': true,
95
+ 'fetchPosition': false,
96
+ 'fetchPositionHistory': false,
97
+ 'fetchPositionMode': false,
98
+ 'fetchPositions': true,
99
+ 'fetchPositionsForSymbol': false,
100
+ 'fetchPositionsHistory': false,
101
+ 'fetchPositionsRisk': false,
102
+ 'fetchPremiumIndexOHLCV': false,
103
+ 'fetchStatus': false,
104
+ 'fetchTicker': true,
105
+ 'fetchTickers': false,
106
+ 'fetchTime': true,
107
+ 'fetchTrades': true,
108
+ 'fetchTradingFee': false,
109
+ 'fetchTradingFees': false,
110
+ 'fetchTradingLimits': false,
111
+ 'fetchTransactionFee': false,
112
+ 'fetchTransactionFees': false,
113
+ 'fetchTransactions': false,
114
+ 'fetchTransfers': true,
115
+ 'fetchWithdrawal': false,
116
+ 'fetchWithdrawals': false,
117
+ 'fetchWithdrawalWhitelist': false,
118
+ 'reduceMargin': false,
119
+ 'repayMargin': false,
120
+ 'setLeverage': false,
121
+ 'setMargin': false,
122
+ 'setMarginMode': false,
123
+ 'setPositionMode': false,
124
+ 'signIn': true,
125
+ 'transfer': true,
126
+ 'withdraw': true,
127
+ 'ws': true,
128
+ },
129
+ 'timeframes': {
130
+ '1m': '1m',
131
+ '5m': '5m',
132
+ '30m': '30m',
133
+ '1h': '1h',
134
+ '6h': '6h',
135
+ '12h': '12h',
136
+ '1d': '1d',
137
+ },
138
+ 'urls': {
139
+ 'logo': 'https://github.com/user-attachments/assets/68f0686b-84f0-4da9-a751-f7089af3a9ed',
140
+ 'api': {
141
+ 'public': 'https://api.exchange.bullish.com/trading-api',
142
+ 'private': 'https://api.exchange.bullish.com/trading-api',
143
+ },
144
+ 'test': {
145
+ 'public': 'https://api.simnext.bullish-test.com/trading-api',
146
+ 'private': 'https://api.simnext.bullish-test.com/trading-api',
147
+ },
148
+ 'www': 'https://bullish.com/',
149
+ 'referral': '',
150
+ 'doc': [
151
+ 'https://api.exchange.bullish.com/docs/api/rest/',
152
+ ],
153
+ },
154
+ 'api': {
155
+ 'public': {
156
+ 'get': {
157
+ 'v1/nonce': 1,
158
+ 'v1/time': 1,
159
+ 'v1/assets': 1,
160
+ 'v1/assets/{symbol}': 1,
161
+ 'v1/markets': 1,
162
+ 'v1/markets/{symbol}': 1,
163
+ 'v1/history/markets/{symbol}': 1,
164
+ 'v1/markets/{symbol}/orderbook/hybrid': 1,
165
+ 'v1/markets/{symbol}/trades': 1,
166
+ 'v1/markets/{symbol}/tick': 1,
167
+ 'v1/markets/{symbol}/candle': 1,
168
+ 'v1/history/markets/{symbol}/trades': 1,
169
+ 'v1/history/markets/{symbol}/funding-rate': 1,
170
+ 'v1/index-prices': 1,
171
+ 'v1/index-prices/{assetSymbol}': 1,
172
+ 'v1/expiry-prices/{symbol}': 1,
173
+ 'v1/option-ladder': 1,
174
+ 'v1/option-ladder/{symbol}': 1,
175
+ },
176
+ },
177
+ 'private': {
178
+ 'get': {
179
+ 'v2/orders': 1,
180
+ 'v2/history/orders': 1,
181
+ 'v2/orders/{orderId}': 1,
182
+ 'v2/amm-instructions': 1,
183
+ 'v2/amm-instructions/{instructionId}': 1,
184
+ 'v1/wallets/transactions': 1,
185
+ 'v1/wallets/limits/{symbol}': 1,
186
+ 'v1/wallets/deposit-instructions/crypto/{symbol}': 1,
187
+ 'v1/wallets/withdrawal-instructions/crypto/{symbol}': 1,
188
+ 'v1/wallets/deposit-instructions/fiat/{symbol}': 1,
189
+ 'v1/wallets/withdrawal-instructions/fiat/{symbol}': 1,
190
+ 'v1/wallets/self-hosted/verification-attempts': 1,
191
+ 'v1/trades': 5,
192
+ 'v1/history/trades': 5,
193
+ 'v1/trades/{tradeId}': 5,
194
+ 'v1/trades/client-order-id/{clientOrderId}': 1,
195
+ 'v1/accounts/asset': 1,
196
+ 'v1/accounts/asset/{symbol}': 1,
197
+ 'v1/users/logout': 1,
198
+ 'v1/users/hmac/login': 1,
199
+ 'v1/accounts/trading-accounts': 1,
200
+ 'v1/accounts/trading-accounts/{tradingAccountId}': 1,
201
+ 'v1/derivatives-positions': 1,
202
+ 'v1/history/derivatives-settlement': 1,
203
+ 'v1/history/transfer': 1,
204
+ 'v1/history/borrow-interest': 1,
205
+ 'v2/mmp-configuration': 1,
206
+ 'v2/otc-trades': 1,
207
+ 'v2/otc-trades/{otcTradeId}': 1,
208
+ 'v2/otc-trades/unconfirmed-trade': 1,
209
+ },
210
+ 'post': {
211
+ 'v2/orders': 5,
212
+ 'v2/command': 5,
213
+ 'v2/amm-instructions': 1,
214
+ 'v1/wallets/withdrawal': 1,
215
+ 'v2/users/login': 1,
216
+ 'v1/simulate-portfolio-margin': 1,
217
+ 'v1/wallets/self-hosted/initiate': 1,
218
+ 'v2/mmp-configuration': 1,
219
+ 'v2/otc-trades': 1,
220
+ 'v2/otc-command': 1,
221
+ },
222
+ },
223
+ },
224
+ 'fees': {
225
+ 'trading': {
226
+ 'tierBased': false,
227
+ 'percentage': true,
228
+ // todo check fees
229
+ 'taker': this.parseNumber('0.001'),
230
+ 'maker': this.parseNumber('0.001'),
231
+ },
232
+ },
233
+ 'precisionMode': TICK_SIZE,
234
+ // exchange-specific options
235
+ 'options': {
236
+ 'timeDifference': 0,
237
+ 'adjustForTimeDifference': false,
238
+ 'networks': {
239
+ 'BTC': 'BTC',
240
+ 'EOS': 'EOS',
241
+ 'ERC20': 'ETH',
242
+ },
243
+ 'defaultNetwork': 'ERC20',
244
+ 'defaultNetworks': {
245
+ 'USDC': 'ERC20',
246
+ },
247
+ 'tradingAccountId': undefined,
248
+ },
249
+ 'features': {
250
+ 'default': {
251
+ 'sandbox': true,
252
+ 'createOrder': {
253
+ 'marginMode': false,
254
+ 'triggerPrice': true,
255
+ 'triggerPriceType': undefined,
256
+ 'triggerDirection': false,
257
+ 'stopLossPrice': false,
258
+ 'takeProfitPrice': false,
259
+ 'attachedStopLossTakeProfit': undefined,
260
+ 'timeInForce': {
261
+ 'IOC': true,
262
+ 'FOK': true,
263
+ 'PO': true,
264
+ 'GTD': false,
265
+ },
266
+ 'hedged': false,
267
+ 'trailing': false,
268
+ 'leverage': false,
269
+ 'marketBuyByCost': false,
270
+ 'marketBuyRequiresPrice': false,
271
+ 'selfTradePrevention': false,
272
+ 'iceberg': false,
273
+ },
274
+ 'createOrders': undefined,
275
+ 'fetchMyTrades': {
276
+ 'marginMode': false,
277
+ 'limit': 100,
278
+ 'daysBack': 90,
279
+ 'symbolRequired': false,
280
+ 'untilDays': 90,
281
+ },
282
+ 'fetchOrder': {
283
+ 'marginMode': false,
284
+ 'trigger': false,
285
+ 'trailing': false,
286
+ 'symbolRequired': false,
287
+ },
288
+ 'fetchOrders': {
289
+ 'marginMode': false,
290
+ 'limit': 100,
291
+ 'daysBack': 90,
292
+ 'untilDays': 90,
293
+ 'trigger': false,
294
+ 'trailing': false,
295
+ 'symbolRequired': false,
296
+ },
297
+ 'fetchOpenOrders': {
298
+ 'marginMode': false,
299
+ 'limit': 100,
300
+ 'daysBack': 90,
301
+ 'untilDays': 90,
302
+ 'trigger': false,
303
+ 'trailing': false,
304
+ 'symbolRequired': false,
305
+ },
306
+ 'fetchCanceledAndClosedOrders': {
307
+ 'marginMode': false,
308
+ 'limit': 100,
309
+ 'daysBack': 90,
310
+ 'untilDays': 90,
311
+ 'trigger': false,
312
+ 'trailing': false,
313
+ 'symbolRequired': false,
314
+ },
315
+ 'fetchClosedOrders': {
316
+ 'marginMode': false,
317
+ 'limit': 100,
318
+ 'daysBack': 1,
319
+ 'daysBackCanceled': 1,
320
+ 'untilDays': 1,
321
+ 'trigger': false,
322
+ 'trailing': false,
323
+ 'symbolRequired': false,
324
+ },
325
+ 'fetchCanceledOrders': {
326
+ 'marginMode': false,
327
+ 'limit': 100,
328
+ 'daysBack': 1,
329
+ 'untilDays': 1,
330
+ 'trigger': false,
331
+ 'trailing': false,
332
+ 'symbolRequired': false,
333
+ },
334
+ 'fetchOHLCV': {
335
+ 'limit': 1000,
336
+ },
337
+ },
338
+ 'spot': {
339
+ 'extends': 'default',
340
+ },
341
+ 'swap': {
342
+ 'linear': {
343
+ 'extends': 'default',
344
+ },
345
+ 'inverse': undefined,
346
+ },
347
+ 'future': {
348
+ 'linear': {
349
+ 'extends': 'default',
350
+ },
351
+ 'inverse': undefined,
352
+ },
353
+ },
354
+ 'exceptions': {
355
+ 'exact': {
356
+ '1': BadRequest,
357
+ '5': InvalidOrder,
358
+ '6': DuplicateOrderId,
359
+ '13': BadRequest,
360
+ '15': BadRequest,
361
+ '18': BadRequest,
362
+ '1002': BadRequest,
363
+ '2001': BadRequest,
364
+ '2002': BadRequest,
365
+ '2003': BadRequest,
366
+ '2004': BadRequest,
367
+ '2005': ExchangeError,
368
+ '2006': BadRequest,
369
+ '2007': BadRequest,
370
+ '2008': BadRequest,
371
+ '2009': BadSymbol,
372
+ '2010': AuthenticationError,
373
+ '2011': AuthenticationError,
374
+ '2012': BadRequest,
375
+ '2013': InvalidOrder,
376
+ '2015': OperationRejected,
377
+ '2016': BadRequest,
378
+ '2017': BadRequest,
379
+ '2018': BadRequest,
380
+ '2020': PermissionDenied,
381
+ '2021': OperationRejected,
382
+ '2029': InvalidNonce,
383
+ '2035': InvalidNonce,
384
+ '3001': InsufficientFunds,
385
+ '3002': OrderNotFound,
386
+ '3003': PermissionDenied,
387
+ '3004': InsufficientFunds,
388
+ '3005': InsufficientFunds,
389
+ '3006': InsufficientFunds,
390
+ '3007': DuplicateOrderId,
391
+ '3031': BadRequest,
392
+ '3032': BadRequest,
393
+ '3033': PermissionDenied,
394
+ '3034': RateLimitExceeded,
395
+ '3035': RateLimitExceeded,
396
+ '3047': OperationRejected,
397
+ '3048': OperationRejected,
398
+ '3049': OperationRejected,
399
+ '3051': InsufficientFunds,
400
+ '3052': InsufficientFunds,
401
+ '3063': BadRequest,
402
+ '3064': OrderNotFillable,
403
+ '3065': MarketClosed,
404
+ '3066': ExchangeError,
405
+ '3067': MarketClosed,
406
+ '6007': InvalidOrder,
407
+ '6011': InvalidOrder,
408
+ '6012': InvalidOrder,
409
+ '6013': InvalidOrder,
410
+ '8301': ExchangeError,
411
+ '8305': ExchangeError,
412
+ '8306': ExchangeError,
413
+ '8307': ExchangeError,
414
+ '8310': InvalidAddress,
415
+ '8311': BadRequest,
416
+ '8313': BadRequest,
417
+ '8315': OperationRejected,
418
+ '8316': OperationRejected,
419
+ '8317': OperationRejected,
420
+ '8318': NotSupported,
421
+ '8319': NotSupported,
422
+ '8320': InvalidAddress,
423
+ '8322': BadRequest,
424
+ '8327': AuthenticationError,
425
+ '8329': ExchangeError,
426
+ '8331': InvalidAddress,
427
+ '8332': BadRequest,
428
+ '8333': BadRequest,
429
+ '8334': BadRequest,
430
+ '8335': InvalidAddress,
431
+ '8336': InvalidAddress,
432
+ '8399': ExchangeError, // Unknown error
433
+ },
434
+ 'broad': {
435
+ 'HttpInvalidParameterException': BadRequest,
436
+ 'UNAUTHORIZED_COMMAND': AuthenticationError,
437
+ 'QUERY_FILTER_ERROR': BadRequest,
438
+ 'INVALID_SYMBOL': BadSymbol, // {"message":"Invalid symbol provided","errorCode":28004,"errorCodeName":"INVALID_SYMBOL"}
439
+ },
440
+ },
441
+ });
442
+ }
443
+ /**
444
+ * @method
445
+ * @name bullish#fetchTime
446
+ * @description fetches the current integer timestamp in milliseconds from the exchange server
447
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--time
448
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
449
+ * @returns {int} the current integer timestamp in milliseconds from the exchange server
450
+ */
451
+ async fetchTime(params = {}) {
452
+ const response = await this.publicGetV1Time(params);
453
+ //
454
+ // {
455
+ // "datetime": "2025-05-05T20:05:50.999Z",
456
+ // "timestamp": 1746475550999
457
+ // }
458
+ //
459
+ return this.safeInteger(response, 'timestamp');
460
+ }
461
+ /**
462
+ * @method
463
+ * @name bullish#fetchCurrencies
464
+ * @description fetches all available currencies on an exchange
465
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/assets
466
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
467
+ * @returns {object} an associative dictionary of currencies
468
+ */
469
+ async fetchCurrencies(params = {}) {
470
+ const response = await this.publicGetV1Assets(params);
471
+ //
472
+ // [
473
+ // {
474
+ // "assetId": "72",
475
+ // "symbol": "BTT1M",
476
+ // "name": "BitTorrent (millions)",
477
+ // "precision": "5",
478
+ // "minBalanceInterest": "0.00000",
479
+ // "apr": "10.00",
480
+ // "minFee": "0.00000",
481
+ // "maxBorrow": "0.00000",
482
+ // "totalOfferedLoanQuantity": "0.00000",
483
+ // "loanBorrowedQuantity": "0.00000",
484
+ // "collateralBands":
485
+ // [
486
+ // {
487
+ // "collateralPercentage": "90.00",
488
+ // "bandLimitUSD": "100000.0000"
489
+ // },
490
+ // {
491
+ // "collateralPercentage": "68.00",
492
+ // "bandLimitUSD": "300000.0000"
493
+ // },
494
+ // {
495
+ // "collateralPercentage": "25.00",
496
+ // "bandLimitUSD": "600000.0000"
497
+ // }
498
+ // ],
499
+ // "underlyingAsset":
500
+ // {
501
+ // "symbol": "BTT1M",
502
+ // "assetId": "72",
503
+ // "bpmMinReturnStart": "0.9200",
504
+ // "bpmMinReturnEnd": "0.9300",
505
+ // "bpmMaxReturnStart": "1.0800",
506
+ // "bpmMaxReturnEnd": "1.0800",
507
+ // "marketRiskFloorPctStart": "2.60",
508
+ // "marketRiskFloorPctEnd": "2.50",
509
+ // "bpmTransitionDateTimeStart": "2025-05-05T08:00:00.000Z",
510
+ // "bpmTransitionDateTimeEnd": "2025-05-08T08:00:00.000Z"
511
+ // }
512
+ // }, ...
513
+ // ]
514
+ //
515
+ const result = {};
516
+ for (let i = 0; i < response.length; i++) {
517
+ const currency = response[i];
518
+ const id = this.safeString(currency, 'symbol');
519
+ const code = this.safeCurrencyCode(id);
520
+ const name = this.safeString(currency, 'name');
521
+ const precision = this.safeString(currency, 'precision');
522
+ result[code] = {
523
+ 'id': id,
524
+ 'code': code,
525
+ 'name': name,
526
+ 'active': undefined,
527
+ 'deposit': undefined,
528
+ 'withdraw': undefined,
529
+ 'fee': this.safeNumber(currency, 'minFee'),
530
+ 'precision': this.parseNumber(this.parsePrecision(precision)),
531
+ 'limits': {
532
+ 'amount': { 'min': undefined, 'max': undefined },
533
+ 'withdraw': { 'min': undefined, 'max': undefined },
534
+ },
535
+ 'networks': {},
536
+ 'type': 'crypto',
537
+ 'info': currency,
538
+ };
539
+ }
540
+ return result;
541
+ }
542
+ /**
543
+ * @method
544
+ * @name bullish#fetchMarkets
545
+ * @description retrieves data on all markets for ace
546
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/markets
547
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
548
+ * @returns {object[]} an array of objects representing market data
549
+ */
550
+ async fetchMarkets(params = {}) {
551
+ if (this.options['adjustForTimeDifference']) {
552
+ await this.loadTimeDifference();
553
+ }
554
+ const response = await this.publicGetV1Markets(params);
555
+ return this.parseMarkets(response);
556
+ }
557
+ parseMarket(market) {
558
+ //
559
+ // {
560
+ // "marketId": "20069",
561
+ // "symbol": "BTC-USDC-20250516",
562
+ // "quoteAssetId": "5",
563
+ // "baseAssetId": "1",
564
+ // "quoteSymbol": "USDC",
565
+ // "baseSymbol": "BTC",
566
+ // "quotePrecision": "4",
567
+ // "basePrecision": "8",
568
+ // "pricePrecision": "4",
569
+ // "quantityPrecision": "8",
570
+ // "costPrecision": "4",
571
+ // "minQuantityLimit": "0.00050000",
572
+ // "maxQuantityLimit": "200.00000000",
573
+ // "maxPriceLimit": null,
574
+ // "minPriceLimit": null,
575
+ // "maxCostLimit": null,
576
+ // "minCostLimit": null,
577
+ // "timeZone": "Etc/UTC",
578
+ // "tickSize": "0.1000",
579
+ // "liquidityTickSize": "100.0000",
580
+ // "liquidityPrecision": "4",
581
+ // "makerFee": "0",
582
+ // "takerFee": "2",
583
+ // "roundingCorrectionFactor": "0.00000100",
584
+ // "makerMinLiquidityAddition": "1000000",
585
+ // "orderTypes":
586
+ // [
587
+ // "LMT",
588
+ // "MKT",
589
+ // "STOP_LIMIT",
590
+ // "POST_ONLY"
591
+ // ],
592
+ // "spotTradingEnabled": true,
593
+ // "marginTradingEnabled": true,
594
+ // "marketEnabled": true,
595
+ // "createOrderEnabled": true,
596
+ // "cancelOrderEnabled": true,
597
+ // "liquidityInvestEnabled": true,
598
+ // "liquidityWithdrawEnabled": true,
599
+ // "feeTiers":
600
+ // [
601
+ // {
602
+ // "feeTierId": "1",
603
+ // "staticSpreadFee": "0.00000000",
604
+ // "isDislocationEnabled": false
605
+ // },
606
+ // {
607
+ // "feeTierId": "10",
608
+ // "staticSpreadFee": "0.00100000",
609
+ // "isDislocationEnabled": true
610
+ // },
611
+ // {
612
+ // "feeTierId": "11",
613
+ // "staticSpreadFee": "0.00150000",
614
+ // "isDislocationEnabled": false
615
+ // },
616
+ // {
617
+ // "feeTierId": "12",
618
+ // "staticSpreadFee": "0.00150000",
619
+ // "isDislocationEnabled": true
620
+ // },
621
+ // {
622
+ // "feeTierId": "13",
623
+ // "staticSpreadFee": "0.00300000",
624
+ // "isDislocationEnabled": false
625
+ // },
626
+ // {
627
+ // "feeTierId": "14",
628
+ // "staticSpreadFee": "0.00300000",
629
+ // "isDislocationEnabled": true
630
+ // },
631
+ // {
632
+ // "feeTierId": "15",
633
+ // "staticSpreadFee": "0.00500000",
634
+ // "isDislocationEnabled": false
635
+ // },
636
+ // {
637
+ // "feeTierId": "16",
638
+ // "staticSpreadFee": "0.00500000",
639
+ // "isDislocationEnabled": true
640
+ // },
641
+ // {
642
+ // "feeTierId": "17",
643
+ // "staticSpreadFee": "0.01000000",
644
+ // "isDislocationEnabled": false
645
+ // },
646
+ // {
647
+ // "feeTierId": "18",
648
+ // "staticSpreadFee": "0.01000000",
649
+ // "isDislocationEnabled": true
650
+ // },
651
+ // {
652
+ // "feeTierId": "19",
653
+ // "staticSpreadFee": "0.01500000",
654
+ // "isDislocationEnabled": false
655
+ // },
656
+ // {
657
+ // "feeTierId": "2",
658
+ // "staticSpreadFee": "0.00000000",
659
+ // "isDislocationEnabled": true
660
+ // },
661
+ // {
662
+ // "feeTierId": "20",
663
+ // "staticSpreadFee": "0.01500000",
664
+ // "isDislocationEnabled": true
665
+ // },
666
+ // {
667
+ // "feeTierId": "21",
668
+ // "staticSpreadFee": "0.02000000",
669
+ // "isDislocationEnabled": false
670
+ // },
671
+ // {
672
+ // "feeTierId": "22",
673
+ // "staticSpreadFee": "0.02000000",
674
+ // "isDislocationEnabled": true
675
+ // },
676
+ // {
677
+ // "feeTierId": "3",
678
+ // "staticSpreadFee": "0.00010000",
679
+ // "isDislocationEnabled": false
680
+ // },
681
+ // {
682
+ // "feeTierId": "4",
683
+ // "staticSpreadFee": "0.00010000",
684
+ // "isDislocationEnabled": true
685
+ // },
686
+ // {
687
+ // "feeTierId": "5",
688
+ // "staticSpreadFee": "0.00020000",
689
+ // "isDislocationEnabled": false
690
+ // },
691
+ // {
692
+ // "feeTierId": "6",
693
+ // "staticSpreadFee": "0.00020000",
694
+ // "isDislocationEnabled": true
695
+ // },
696
+ // {
697
+ // "feeTierId": "7",
698
+ // "staticSpreadFee": "0.00060000",
699
+ // "isDislocationEnabled": false
700
+ // },
701
+ // {
702
+ // "feeTierId": "8",
703
+ // "staticSpreadFee": "0.00060000",
704
+ // "isDislocationEnabled": true
705
+ // },
706
+ // {
707
+ // "feeTierId": "9",
708
+ // "staticSpreadFee": "0.00100000",
709
+ // "isDislocationEnabled": false
710
+ // }
711
+ // ],
712
+ // "marketType": "DATED_FUTURE",
713
+ // "contractMultiplier": "1",
714
+ // "settlementAssetSymbol": "USDC",
715
+ // "underlyingQuoteSymbol": "USDC",
716
+ // "underlyingBaseSymbol": "BTC",
717
+ // "openInterestLimitUSD": "100000000.0000",
718
+ // "concentrationRiskPercentage": "100.00",
719
+ // "concentrationRiskThresholdUSD": "30000000.0000",
720
+ // "expiryDatetime": "2025-05-16T08:00:00.000Z",
721
+ // "priceBuffer": "0.1",
722
+ // "feeGroupId": "4"
723
+ // }
724
+ //
725
+ // option
726
+ // {
727
+ // "marketId": "20997",
728
+ // "symbol": "BTC-USDC-20260130-160000-P",
729
+ // "quoteAssetId": "5",
730
+ // "baseAssetId": "1",
731
+ // "quoteSymbol": "USDC",
732
+ // "baseSymbol": "BTC",
733
+ // "quotePrecision": "4",
734
+ // "basePrecision": "8",
735
+ // "pricePrecision": "4",
736
+ // "quantityPrecision": "8",
737
+ // "costPrecision": "4",
738
+ // "minQuantityLimit": "0.00050000",
739
+ // "maxQuantityLimit": "200.00000000",
740
+ // "maxPriceLimit": null,
741
+ // "minPriceLimit": null,
742
+ // "maxCostLimit": null,
743
+ // "minCostLimit": null,
744
+ // "timeZone": "Etc/UTC",
745
+ // "tickSize": "10.0000",
746
+ // "makerFee": "0",
747
+ // "takerFee": "2",
748
+ // "roundingCorrectionFactor": "0.00000100",
749
+ // "makerMinLiquidityAddition": "-1",
750
+ // "orderTypes": [ "LMT", "MKT", "STOP_LIMIT", "POST_ONLY" ],
751
+ // "spotTradingEnabled": true,
752
+ // "marginTradingEnabled": true,
753
+ // "marketEnabled": true,
754
+ // "createOrderEnabled": true,
755
+ // "cancelOrderEnabled": true,
756
+ // "amendOrderEnabled": true,
757
+ // "marketType": "OPTION",
758
+ // "contractMultiplier": "1",
759
+ // "settlementAssetSymbol": "USDC",
760
+ // "underlyingQuoteSymbol": "USDC",
761
+ // "underlyingBaseSymbol": "BTC",
762
+ // "openInterestLimitUSD": "100000000.0000",
763
+ // "concentrationRiskPercentage": "100.00",
764
+ // "concentrationRiskThresholdUSD": "30000000.0000",
765
+ // "expiryDatetime": "2026-01-30T08:00:00.000Z",
766
+ // "priceBuffer": "0",
767
+ // "feeGroupId": "10",
768
+ // "optionStrikePrice": "160000.0000",
769
+ // "optionType": "PUT",
770
+ // "premiumCapRatio": "0.1000"
771
+ // }
772
+ //
773
+ const id = this.safeString(market, 'symbol');
774
+ const baseId = this.safeString(market, 'baseSymbol');
775
+ const quoteId = this.safeString(market, 'quoteSymbol');
776
+ const base = this.safeCurrencyCode(baseId);
777
+ const quote = this.safeCurrencyCode(quoteId);
778
+ let symbol = base + '/' + quote;
779
+ const basePrecision = this.safeString(market, 'basePrecision');
780
+ const quotePrecision = this.safeString(market, 'quotePrecision');
781
+ const amountPrecision = this.safeString(market, 'quantityPrecision');
782
+ const pricePrecision = this.safeString(market, 'pricePrecision');
783
+ const costPrecision = this.safeString(market, 'costPrecision');
784
+ const minQuantityLimit = this.safeString(market, 'minQuantityLimit');
785
+ const maxQuantityLimit = this.safeString(market, 'maxQuantityLimit');
786
+ const minPriceLimit = this.safeString(market, 'minPriceLimit');
787
+ const maxPriceLimit = this.safeString(market, 'maxPriceLimit');
788
+ const minCostLimit = this.safeString(market, 'minCostLimit');
789
+ const maxCostLimit = this.safeString(market, 'maxCostLimit');
790
+ const settleId = this.safeString(market, 'settlementAssetSymbol');
791
+ const settle = this.safeCurrencyCode(settleId);
792
+ const type = this.parseMarketType(this.safeString(market, 'marketType'), 'spot');
793
+ let spot = false;
794
+ let swap = false;
795
+ let future = false;
796
+ let option = false;
797
+ let contract = true;
798
+ let linear = undefined;
799
+ let inverse = undefined;
800
+ let expiryDatetime = undefined;
801
+ let contractSize = undefined;
802
+ let optionType = undefined;
803
+ let strike = undefined;
804
+ let margin = false;
805
+ if (type === 'spot') {
806
+ spot = true;
807
+ contract = false;
808
+ margin = this.safeBool(market, 'marginTradingEnabled');
809
+ }
810
+ else {
811
+ contractSize = this.safeNumber(market, 'contractMultiplier');
812
+ symbol += ':' + settle;
813
+ linear = settle === quote;
814
+ inverse = !linear;
815
+ if (type === 'swap') {
816
+ swap = true;
817
+ }
818
+ else {
819
+ expiryDatetime = this.safeString(market, 'expiryDatetime');
820
+ const idParts = id.split('-');
821
+ const datePart = this.safeString(idParts, 2);
822
+ symbol += '-' + datePart;
823
+ if (type === 'future') {
824
+ future = true;
825
+ }
826
+ else if (type === 'option') {
827
+ option = true;
828
+ optionType = this.safeStringLower(market, 'optionType');
829
+ strike = this.parseToNumeric(this.safeString(market, 'optionStrikePrice'));
830
+ symbol += '-' + this.numberToString(strike) + '-' + this.safeString(idParts, 4);
831
+ }
832
+ }
833
+ }
834
+ return this.safeMarketStructure({
835
+ 'id': id,
836
+ 'symbol': symbol,
837
+ 'base': base,
838
+ 'baseId': baseId,
839
+ 'quote': quote,
840
+ 'quoteId': quoteId,
841
+ 'settle': settle,
842
+ 'settleId': settleId,
843
+ 'type': type,
844
+ 'spot': spot,
845
+ 'margin': margin,
846
+ 'swap': swap,
847
+ 'future': future,
848
+ 'option': option,
849
+ 'contract': contract,
850
+ 'linear': linear,
851
+ 'inverse': inverse,
852
+ 'taker': this.fees['trading']['taker'],
853
+ 'maker': this.fees['trading']['maker'],
854
+ 'contractSize': contractSize,
855
+ 'expiry': this.parse8601(expiryDatetime),
856
+ 'expiryDatetime': expiryDatetime,
857
+ 'strike': strike,
858
+ 'optionType': optionType,
859
+ 'limits': {
860
+ 'amount': {
861
+ 'min': this.parseNumber(minQuantityLimit),
862
+ 'max': this.parseNumber(maxQuantityLimit),
863
+ },
864
+ 'price': {
865
+ 'min': this.parseNumber(minPriceLimit),
866
+ 'max': this.parseNumber(maxPriceLimit),
867
+ },
868
+ 'cost': {
869
+ 'min': this.parseNumber(minCostLimit),
870
+ 'max': this.parseNumber(maxCostLimit),
871
+ },
872
+ 'leverage': {
873
+ 'min': undefined,
874
+ 'max': undefined,
875
+ },
876
+ },
877
+ 'precision': {
878
+ 'amount': this.parseNumber(this.parsePrecision(amountPrecision)),
879
+ 'price': this.parseNumber(this.parsePrecision(pricePrecision)),
880
+ 'cost': this.parseNumber(this.parsePrecision(costPrecision)),
881
+ 'base': this.parseNumber(this.parsePrecision(basePrecision)),
882
+ 'quote': this.parseNumber(this.parsePrecision(quotePrecision)),
883
+ },
884
+ 'active': this.safeBool(market, 'marketEnabled'),
885
+ 'created': undefined,
886
+ 'info': market,
887
+ });
888
+ }
889
+ parseMarketType(type, defaultType = undefined) {
890
+ const types = {
891
+ 'SPOT': 'spot',
892
+ 'PERPETUAL': 'swap',
893
+ 'DATED_FUTURE': 'future',
894
+ 'OPTION': 'option',
895
+ };
896
+ return this.safeString(types, type, defaultType);
897
+ }
898
+ /**
899
+ * @method
900
+ * @name bullish#fetchOrderBook
901
+ * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
902
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/markets/-symbol-/orderbook/hybrid
903
+ * @param {string} symbol unified symbol of the market to fetch the order book for
904
+ * @param {int} [limit] the maximum amount of order book entries to return (not used by bullish)
905
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
906
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
907
+ */
908
+ async fetchOrderBook(symbol, limit = undefined, params = {}) {
909
+ await this.loadMarkets();
910
+ const market = this.market(symbol);
911
+ const request = {
912
+ 'symbol': market['id'],
913
+ };
914
+ const response = await this.publicGetV1MarketsSymbolOrderbookHybrid(this.extend(request, params));
915
+ //
916
+ // {
917
+ // "bids": [
918
+ // {
919
+ // "price": "1.00000000",
920
+ // "priceLevelQuantity": "1.00000000"
921
+ // }
922
+ // ],
923
+ // "asks": [
924
+ // {
925
+ // "price": "1.00000000",
926
+ // "priceLevelQuantity": "1.00000000"
927
+ // }
928
+ // ],
929
+ // "datetime": "2021-05-20T01:01:01.000Z",
930
+ // "timestamp": "1621490985000",
931
+ // "sequenceNumber": 999
932
+ // }
933
+ //
934
+ const timestamp = this.safeInteger(response, 'timestamp');
935
+ return this.parseOrderBook(response, symbol, timestamp, 'bids', 'asks', 'price', 'priceLevelQuantity');
936
+ }
937
+ /**
938
+ * @method
939
+ * @name bullish#fetchTrades
940
+ * @description get the list of most recent trades for a particular symbol
941
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/markets/-symbol-/trades
942
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/markets/-symbol-/trades
943
+ * @param {string} symbol unified symbol of the market to fetch trades for
944
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
945
+ * @param {int} [limit] the maximum amount of trades to fetch (max 100)
946
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
947
+ * @param {int} [params.until] timestamp in ms of the latest trade to fetch
948
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
949
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
950
+ */
951
+ async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
952
+ await this.loadMarkets();
953
+ const maxLimit = 100;
954
+ let paginate = false;
955
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
956
+ if (paginate) {
957
+ params = this.handlePaginationParams('fetchTrades', since, params);
958
+ return await this.fetchPaginatedCallDynamic('fetchTrades', symbol, since, limit, params, maxLimit);
959
+ }
960
+ const market = this.market(symbol);
961
+ const request = {
962
+ 'symbol': market['id'],
963
+ };
964
+ params = this.handleSinceAndUntil(since, params);
965
+ if (limit !== undefined) {
966
+ request['_pageSize'] = this.getClosestLimit(limit);
967
+ }
968
+ const response = await this.publicGetV1HistoryMarketsSymbolTrades(this.extend(request, params));
969
+ //
970
+ // [
971
+ // {
972
+ // "tradeId": "100178000000367159",
973
+ // "symbol": "BTCUSDC",
974
+ // "price": "103891.8977",
975
+ // "quantity": "0.00029411",
976
+ // "quoteAmount": "30.5556",
977
+ // "side": "BUY",
978
+ // "isTaker": true,
979
+ // "createdAtTimestamp": "1747768055826",
980
+ // "createdAtDatetime": "2025-05-20T19:07:35.826Z"
981
+ // }, ...
982
+ // ]
983
+ //
984
+ return this.parseTrades(response, market, since, limit);
985
+ }
986
+ /**
987
+ * @method
988
+ * @name bullish#fetchMyTrades
989
+ * @description fetch all trades made by the user
990
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/trades
991
+ * @param {string} [symbol] unified market symbol
992
+ * @param {int} [since] the earliest time in ms to fetch trades for
993
+ * @param {int} [limit] the maximum number of trades structures to retrieve
994
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
995
+ * @param {int} [params.until] the latest time in ms to fetch trades for
996
+ * @param {string} [params.orderId] the order id to fetch trades for
997
+ * @param {string} [params.clientOrderId] the client order id to fetch trades for
998
+ * @param {string} [params.tradingAccountId] the trading account id to fetch trades for
999
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1000
+ */
1001
+ async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1002
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1003
+ const tradingAccountId = await this.loadAccount(params);
1004
+ const request = {
1005
+ 'tradingAccountId': tradingAccountId,
1006
+ };
1007
+ let market = undefined;
1008
+ if (symbol !== undefined) {
1009
+ market = this.market(symbol);
1010
+ request['symbol'] = market['id'];
1011
+ }
1012
+ const clientOrderId = this.safeString(params, 'clientOrderId');
1013
+ let response = undefined;
1014
+ if (clientOrderId !== undefined) {
1015
+ response = await this.privateGetV1TradesClientOrderIdClientOrderId(this.extend(request, params));
1016
+ }
1017
+ else {
1018
+ let paginate = false;
1019
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'paginate');
1020
+ if (paginate) {
1021
+ params = this.handlePaginationParams('fetchMyTrades', since, params);
1022
+ return await this.fetchPaginatedCallDynamic('fetchMyTrades', symbol, since, limit, params, 100);
1023
+ }
1024
+ params = this.handleSinceAndUntil(since, params);
1025
+ if (limit !== undefined) {
1026
+ request['_pageSize'] = this.getClosestLimit(limit);
1027
+ }
1028
+ //
1029
+ // [
1030
+ // {
1031
+ // "baseFee": "0.00000000",
1032
+ // "createdAtDatetime": "2025-05-18T15:57:28.132Z",
1033
+ // "createdAtTimestamp": "1747583848132",
1034
+ // "handle": null,
1035
+ // "isTaker": true,
1036
+ // "orderId": "844242293909618689",
1037
+ // "price": "103942.7048",
1038
+ // "publishedAtTimestamp": "1747769786131",
1039
+ // "quantity": "1.00000000",
1040
+ // "quoteAmount": "103942.7048",
1041
+ // "quoteFee": "0.0000",
1042
+ // "side": "BUY",
1043
+ // "symbol": "BTCUSDC",
1044
+ // "tradeId": "100178000000288892"
1045
+ // }, ...
1046
+ // ]
1047
+ //
1048
+ response = await this.privateGetV1HistoryTrades(this.extend(request, params));
1049
+ }
1050
+ return this.parseTrades(response, market, since, limit);
1051
+ }
1052
+ /**
1053
+ * @method
1054
+ * @name bullish#fetchOrderTrades
1055
+ * @description fetch all the trades made from a single order
1056
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/trades
1057
+ * @param {string} id order id
1058
+ * @param {string} symbol unified market symbol
1059
+ * @param {int} [since] the earliest time in ms to fetch trades for
1060
+ * @param {int} [limit] the maximum number of trades to retrieve
1061
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1062
+ * @param {string} [params.clientOrderId] the client order id to fetch trades for
1063
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1064
+ */
1065
+ async fetchOrderTrades(id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
1066
+ await this.loadMarkets();
1067
+ const clientOrderId = this.safeString(params, 'clientOrderId');
1068
+ if (clientOrderId === undefined) {
1069
+ params = this.extend({ 'orderId': id }, params);
1070
+ }
1071
+ return await this.fetchMyTrades(symbol, since, limit, params);
1072
+ }
1073
+ parseTrade(trade, market = undefined) {
1074
+ //
1075
+ // fetchTrades
1076
+ // [
1077
+ // {
1078
+ // "tradeId": "100178000000367159",
1079
+ // "symbol": "BTCUSDC",
1080
+ // "price": "103891.8977",
1081
+ // "quantity": "0.00029411",
1082
+ // "quoteAmount": "30.5556",
1083
+ // "side": "BUY",
1084
+ // "isTaker": true,
1085
+ // "createdAtTimestamp": "1747768055826",
1086
+ // "createdAtDatetime": "2025-05-20T19:07:35.826Z"
1087
+ // }, ...
1088
+ // ]
1089
+ //
1090
+ // [
1091
+ // {
1092
+ // "tradeId": "100020000000000060",
1093
+ // "symbol": "BTCUSDC",
1094
+ // "price": "1.00000000",
1095
+ // "quantity": "1.00000000",
1096
+ // "side": "BUY",
1097
+ // "isTaker": true,
1098
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1099
+ // "createdAtTimestamp": "1621490985000"
1100
+ // }
1101
+ // ]
1102
+ //
1103
+ // fetchMyTrades
1104
+ // [
1105
+ // {
1106
+ // "baseFee": "0.00000000",
1107
+ // "createdAtDatetime": "2025-05-18T15:57:28.132Z",
1108
+ // "createdAtTimestamp": "1747583848132",
1109
+ // "handle": null,
1110
+ // "isTaker": true,
1111
+ // "orderId": "844242293909618689",
1112
+ // "price": "103942.7048",
1113
+ // "publishedAtTimestamp": "1747769786131",
1114
+ // "quantity": "1.00000000",
1115
+ // "quoteAmount": "103942.7048",
1116
+ // "quoteFee": "0.0000",
1117
+ // "side": "BUY",
1118
+ // "symbol": "BTCUSDC",
1119
+ // "tradeId": "100178000000288892"
1120
+ // }, ...
1121
+ // ]
1122
+ //
1123
+ const marketId = this.safeString(trade, 'symbol');
1124
+ market = this.safeMarket(marketId, market);
1125
+ const symbol = market['symbol'];
1126
+ const timestamp = this.safeInteger(trade, 'createdAtTimestamp');
1127
+ const price = this.safeString(trade, 'price');
1128
+ const amount = this.safeString(trade, 'quantity');
1129
+ const side = this.safeStringLower(trade, 'side');
1130
+ const isTaker = this.safeBool(trade, 'isTaker');
1131
+ const currency = market['quote'];
1132
+ const code = this.safeCurrencyCode(currency);
1133
+ const feeCost = this.safeNumber(trade, 'quoteFee');
1134
+ let fee = undefined;
1135
+ if (feeCost !== undefined) {
1136
+ fee = { 'currency': code, 'cost': feeCost };
1137
+ }
1138
+ let takerOrMaker = undefined;
1139
+ if (isTaker) {
1140
+ takerOrMaker = 'taker';
1141
+ }
1142
+ else {
1143
+ takerOrMaker = 'maker';
1144
+ }
1145
+ const orderId = this.safeString(trade, 'orderId');
1146
+ return this.safeTrade({
1147
+ 'info': trade,
1148
+ 'timestamp': timestamp,
1149
+ 'datetime': this.iso8601(timestamp),
1150
+ 'symbol': symbol,
1151
+ 'id': this.safeString(trade, 'tradeId'),
1152
+ 'order': orderId,
1153
+ 'type': undefined,
1154
+ 'takerOrMaker': takerOrMaker,
1155
+ 'side': side,
1156
+ 'price': price,
1157
+ 'amount': amount,
1158
+ 'cost': undefined,
1159
+ 'fee': fee,
1160
+ }, market);
1161
+ }
1162
+ /**
1163
+ * @method
1164
+ * @name bullish#fetchTicker
1165
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1166
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/markets/-symbol-/tick
1167
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
1168
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1169
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
1170
+ */
1171
+ async fetchTicker(symbol, params = {}) {
1172
+ await this.loadMarkets();
1173
+ const market = this.market(symbol);
1174
+ const request = {
1175
+ 'symbol': market['id'],
1176
+ };
1177
+ const response = await this.publicGetV1MarketsSymbolTick(this.extend(request, params));
1178
+ //
1179
+ // {
1180
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1181
+ // "createdAtTimestamp": "1621490985000",
1182
+ // "high": "1.00000000",
1183
+ // "low": "1.00000000",
1184
+ // "bestBid": "1.00000000",
1185
+ // "bidVolume": "1.00000000",
1186
+ // "bestAsk": "1.00000000",
1187
+ // "askVolume": "1.00000000",
1188
+ // "vwap": "1.00000000",
1189
+ // "open": "1.00000000",
1190
+ // "close": "1.00000000",
1191
+ // "last": "1.00000000",
1192
+ // "change": "1.00000000",
1193
+ // "percentage": "1.00000000",
1194
+ // "average": "1.00000000",
1195
+ // "baseVolume": "1.00000000",
1196
+ // "quoteVolume": "1.00000000",
1197
+ // "bancorPrice": "1.00000000",
1198
+ // "markPrice": "19999.00",
1199
+ // "fundingRate": "0.01",
1200
+ // "openInterest": "100000.32452",
1201
+ // "lastTradeDatetime": "2021-05-20T01:01:01.000Z",
1202
+ // "lastTradeTimestamp": "1621490985000",
1203
+ // "lastTradeQuantity": "1.00000000",
1204
+ // "ammData": [
1205
+ // {
1206
+ // "feeTierId": "1",
1207
+ // "bidSpreadFee": "0.00040000",
1208
+ // "askSpreadFee": "0.00040000",
1209
+ // "baseReservesQuantity": "245.56257825",
1210
+ // "quoteReservesQuantity": "3424383.3629",
1211
+ // "currentPrice": "16856.0000"
1212
+ // }
1213
+ // ]
1214
+ // }
1215
+ //
1216
+ return this.parseTicker(response, market);
1217
+ }
1218
+ parseTicker(ticker, market = undefined) {
1219
+ //
1220
+ // {
1221
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1222
+ // "createdAtTimestamp": "1621490985000",
1223
+ // "high": "1.00000000",
1224
+ // "low": "1.00000000",
1225
+ // "bestBid": "1.00000000",
1226
+ // "bidVolume": "1.00000000",
1227
+ // "bestAsk": "1.00000000",
1228
+ // "askVolume": "1.00000000",
1229
+ // "vwap": "1.00000000",
1230
+ // "open": "1.00000000",
1231
+ // "close": "1.00000000",
1232
+ // "last": "1.00000000",
1233
+ // "change": "1.00000000",
1234
+ // "percentage": "1.00000000",
1235
+ // "average": "1.00000000",
1236
+ // "baseVolume": "1.00000000",
1237
+ // "quoteVolume": "1.00000000",
1238
+ // "bancorPrice": "1.00000000",
1239
+ // "markPrice": "19999.00",
1240
+ // "fundingRate": "0.01",
1241
+ // "openInterest": "100000.32452",
1242
+ // "lastTradeDatetime": "2021-05-20T01:01:01.000Z",
1243
+ // "lastTradeTimestamp": "1621490985000",
1244
+ // "lastTradeQuantity": "1.00000000",
1245
+ // "ammData": [
1246
+ // {
1247
+ // "feeTierId": "1",
1248
+ // "bidSpreadFee": "0.00040000",
1249
+ // "askSpreadFee": "0.00040000",
1250
+ // "baseReservesQuantity": "245.56257825",
1251
+ // "quoteReservesQuantity": "3424383.3629",
1252
+ // "currentPrice": "16856.0000"
1253
+ // }
1254
+ // ]
1255
+ // }
1256
+ //
1257
+ const marketId = this.safeString(ticker, 'symbol');
1258
+ market = this.safeMarket(marketId, market);
1259
+ const timestamp = this.safeInteger(ticker, 'createdAtTimestamp');
1260
+ return this.safeTicker({
1261
+ 'symbol': market['symbol'],
1262
+ 'timestamp': timestamp,
1263
+ 'datetime': this.iso8601(timestamp),
1264
+ 'high': this.safeString(ticker, 'high'),
1265
+ 'low': this.safeString(ticker, 'low'),
1266
+ 'bid': this.safeString2(ticker, 'bid', 'bestBid'),
1267
+ 'bidVolume': this.safeString(ticker, 'bidVolume'),
1268
+ 'ask': this.safeString2(ticker, 'ask', 'bestAsk'),
1269
+ 'askVolume': this.safeString(ticker, 'askVolume'),
1270
+ 'vwap': this.safeString(ticker, 'vwap'),
1271
+ 'open': this.safeString(ticker, 'open'),
1272
+ 'close': this.safeString(ticker, 'close'),
1273
+ 'last': this.safeString(ticker, 'last'),
1274
+ 'previousClose': undefined,
1275
+ 'change': this.safeString(ticker, 'change'),
1276
+ 'percentage': this.safeString(ticker, 'percentage'),
1277
+ 'average': this.safeString(ticker, 'average'),
1278
+ 'baseVolume': this.safeString(ticker, 'baseVolume'),
1279
+ 'quoteVolume': this.safeString(ticker, 'quoteVolume'),
1280
+ 'markPrice': this.safeString(ticker, 'markPrice'),
1281
+ 'info': ticker,
1282
+ }, market);
1283
+ }
1284
+ async safeDeterministicCall(method, symbol = undefined, since = undefined, limit = undefined, timeframe = undefined, params = {}) {
1285
+ let maxRetries = undefined;
1286
+ [maxRetries, params] = this.handleOptionAndParams(params, method, 'maxRetries', 3);
1287
+ let errors = 0;
1288
+ params = this.omit(params, 'until');
1289
+ // the exchange returns the most recent data, so we do not need to pass until into paginated calls
1290
+ // the correct util value will be calculated inside of the method
1291
+ while (errors <= maxRetries) {
1292
+ try {
1293
+ if (timeframe && method !== 'fetchFundingRateHistory') {
1294
+ return await this[method](symbol, timeframe, since, limit, params);
1295
+ }
1296
+ else {
1297
+ return await this[method](symbol, since, limit, params);
1298
+ }
1299
+ }
1300
+ catch (e) {
1301
+ if (e instanceof RateLimitExceeded) {
1302
+ throw e; // if we are rate limited, we should not retry and fail fast
1303
+ }
1304
+ errors += 1;
1305
+ if (errors > maxRetries) {
1306
+ throw e;
1307
+ }
1308
+ }
1309
+ }
1310
+ return [];
1311
+ }
1312
+ /**
1313
+ * @method
1314
+ * @name bullish#fetchOHLCV
1315
+ * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1316
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/markets/-symbol-/candle
1317
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
1318
+ * @param {string} timeframe the length of time each candle represents
1319
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
1320
+ * @param {int} [limit] the maximum amount of candles to fetch (max 100)
1321
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1322
+ * @param {int} [params.until] timestamp in ms of the latest entry
1323
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1324
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
1325
+ */
1326
+ async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1327
+ await this.loadMarkets();
1328
+ const market = this.market(symbol);
1329
+ const maxLimit = 100;
1330
+ let paginate = false;
1331
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'paginate');
1332
+ if (paginate) {
1333
+ return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, maxLimit);
1334
+ }
1335
+ let request = {
1336
+ 'symbol': market['id'],
1337
+ 'timeBucket': this.safeString(this.timeframes, timeframe, timeframe),
1338
+ '_pageSize': maxLimit,
1339
+ };
1340
+ [request, params] = this.handleUntilOption('createdAtDatetime[lte]', request, params);
1341
+ let until = this.safeInteger(request, 'createdAtDatetime[lte]');
1342
+ const duration = this.parseTimeframe(timeframe);
1343
+ const maxDelta = 1000 * duration * maxLimit;
1344
+ let startTime = since;
1345
+ // both of since and until are required
1346
+ if (startTime === undefined && until === undefined) {
1347
+ until = this.milliseconds();
1348
+ startTime = until - maxDelta;
1349
+ }
1350
+ else if (startTime === undefined) {
1351
+ startTime = until - maxDelta;
1352
+ }
1353
+ else if (until === undefined) {
1354
+ until = this.sum(startTime, maxDelta);
1355
+ }
1356
+ request['createdAtDatetime[gte]'] = this.iso8601(startTime);
1357
+ request['createdAtDatetime[lte]'] = this.iso8601(until);
1358
+ const response = await this.publicGetV1MarketsSymbolCandle(this.extend(request, params));
1359
+ //
1360
+ // [
1361
+ // {
1362
+ // "open": "100846.7490",
1363
+ // "high": "100972.4001",
1364
+ // "low": "100840.8129",
1365
+ // "close": "100972.2602",
1366
+ // "volume": "30.56064890",
1367
+ // "createdAtTimestamp": "1746720540000",
1368
+ // "createdAtDatetime": "2025-05-08T16:09:00.000Z",
1369
+ // "publishedAtTimestamp": "1746720636007"
1370
+ // }, ...
1371
+ // ]
1372
+ //
1373
+ return this.parseOHLCVs(response, market, timeframe, since, limit);
1374
+ }
1375
+ parseOHLCV(ohlcv, market = undefined) {
1376
+ return [
1377
+ this.safeInteger(ohlcv, 'createdAtTimestamp'),
1378
+ this.safeNumber(ohlcv, 'open'),
1379
+ this.safeNumber(ohlcv, 'high'),
1380
+ this.safeNumber(ohlcv, 'low'),
1381
+ this.safeNumber(ohlcv, 'close'),
1382
+ this.safeNumber(ohlcv, 'volume'),
1383
+ ];
1384
+ }
1385
+ /**
1386
+ * @method
1387
+ * @name bullish#fetchFundingRateHistory
1388
+ * @description fetches historical funding rate prices
1389
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/markets/-symbol-/funding-rate
1390
+ * @param {string} symbol unified symbol of the market to fetch the funding rate history for
1391
+ * @param {int} [since] not sent to exchange api, exchange api always returns the most recent data, only used to filter exchange response
1392
+ * @param {int} [limit] the maximum amount of funding rate structures to fetch
1393
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1394
+ * @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
1395
+ */
1396
+ async fetchFundingRateHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1397
+ if (symbol === undefined) {
1398
+ throw new ArgumentsRequired(this.id + ' fetchFundingRateHistory() requires a symbol argument');
1399
+ }
1400
+ await this.loadMarkets();
1401
+ const maxLimit = 100;
1402
+ let paginate = false;
1403
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
1404
+ if (paginate) {
1405
+ params = this.handlePaginationParams('fetchFundingRateHistory', since, params);
1406
+ return await this.fetchPaginatedCallDynamic('fetchFundingRateHistory', symbol, since, limit, params, maxLimit);
1407
+ }
1408
+ const market = this.market(symbol);
1409
+ if (!market['swap']) {
1410
+ throw new BadRequest(this.id + ' fetchFundingRateHistory() supports swap markets only');
1411
+ }
1412
+ const request = {
1413
+ 'symbol': market['id'],
1414
+ };
1415
+ if (limit !== undefined) {
1416
+ request['_pageSize'] = this.getClosestLimit(limit);
1417
+ }
1418
+ params = this.handleSinceAndUntil(since, params, 'updatedAtDatetime[gte]', 'updatedAtDatetime[lte]');
1419
+ const response = await this.publicGetV1HistoryMarketsSymbolFundingRate(this.extend(request, params));
1420
+ //
1421
+ // [
1422
+ // {
1423
+ // "fundingRate": "0.00125",
1424
+ // "updatedAtDatetime": "2025-05-18T09:06:04.074Z"
1425
+ // },
1426
+ // {
1427
+ // "fundingRate": "0.00125",
1428
+ // "updatedAtDatetime": "2025-05-18T08:59:59.033Z"
1429
+ // }, ...
1430
+ // ]
1431
+ //
1432
+ const rates = [];
1433
+ const result = this.toArray(response);
1434
+ for (let i = 0; i < result.length; i++) {
1435
+ const entry = result[i];
1436
+ const datetime = this.safeString(entry, 'updatedAtDatetime');
1437
+ rates.push({
1438
+ 'info': entry,
1439
+ 'symbol': symbol,
1440
+ 'fundingRate': this.safeNumber(entry, 'fundingRate'),
1441
+ 'timestamp': this.parse8601(datetime),
1442
+ 'datetime': datetime,
1443
+ });
1444
+ }
1445
+ const sorted = this.sortBy(rates, 'timestamp');
1446
+ return this.filterBySymbolSinceLimit(sorted, market['symbol'], since, limit);
1447
+ }
1448
+ /**
1449
+ * @method
1450
+ * @name bullish#fetchOrders
1451
+ * @description fetches information on multiple orders made by the user
1452
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--orders
1453
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--history
1454
+ * @param {string} symbol unified market symbol of the market orders were made in
1455
+ * @param {int} [since] the earliest time in ms to fetch orders for
1456
+ * @param {int} [limit] the maximum number of order structures to retrieve (5, 25, 50, 100, default is 25)
1457
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1458
+ * @param {int} [params.until] timestamp in ms of the latest order to fetch
1459
+ * @param {string} [params.tradingAccountId] the trading account id (mandatory parameter)
1460
+ * @param {string} [params.orderId] the id of the order to fetch for
1461
+ * @param {string} [params.clientOrderId] the client id of the order to fetch for
1462
+ * @param {string} [params.status] filter by order status, 'OPEN', 'CANCELLED', 'CLOSED', 'REJECTED'
1463
+ * @param {bool} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1464
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1465
+ */
1466
+ async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1467
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1468
+ const tradingAccountId = await this.loadAccount(params);
1469
+ const paginate = this.safeBool(params, 'paginate', false);
1470
+ if (paginate) {
1471
+ params = this.handlePaginationParams('fetchOrders', since, params);
1472
+ return await this.fetchPaginatedCallDynamic('fetchOrders', symbol, since, limit, params, 100);
1473
+ }
1474
+ let market = undefined;
1475
+ const request = {
1476
+ 'tradingAccountId': tradingAccountId,
1477
+ };
1478
+ if (symbol !== undefined) {
1479
+ market = this.market(symbol);
1480
+ request['symbol'] = market['id'];
1481
+ }
1482
+ params = this.handleSinceAndUntil(since, params);
1483
+ if (limit !== undefined) {
1484
+ request['_pageSize'] = this.getClosestLimit(limit);
1485
+ }
1486
+ let method = 'privateGetV2HistoryOrders';
1487
+ [method, params] = this.handleOptionAndParams(params, 'fetchOrders', 'method', method);
1488
+ let response = undefined;
1489
+ if (method === 'privateGetV2Orders') {
1490
+ //
1491
+ // [
1492
+ // {
1493
+ // "clientOrderId": "187",
1494
+ // "orderId": "297735387747975680",
1495
+ // "symbol": "BTCUSDC",
1496
+ // "price": "1.00000000",
1497
+ // "averageFillPrice": "1.00000000",
1498
+ // "stopPrice": "1.00000000",
1499
+ // "allowBorrow": false,
1500
+ // "quantity": "1.00000000",
1501
+ // "quantityFilled": "1.00000000",
1502
+ // "quoteAmount": "1.00000000",
1503
+ // "baseFee": "0.00100000",
1504
+ // "quoteFee": "0.0010",
1505
+ // "borrowedBaseQuantity": "1.00000000",
1506
+ // "borrowedQuoteQuantity": "1.00000000",
1507
+ // "isLiquidation": false,
1508
+ // "side": "BUY",
1509
+ // "type": "LMT",
1510
+ // "timeInForce": "GTC",
1511
+ // "status": "OPEN",
1512
+ // "statusReason": "User cancelled",
1513
+ // "statusReasonCode": "1002",
1514
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1515
+ // "createdAtTimestamp": "1621490985000",
1516
+ // }
1517
+ // ]
1518
+ //
1519
+ response = await this.privateGetV2Orders(this.extend(request, params));
1520
+ }
1521
+ else if (method === 'privateGetV2HistoryOrders') {
1522
+ response = await this.privateGetV2HistoryOrders(this.extend(request, params));
1523
+ }
1524
+ else {
1525
+ throw new BadRequest(this.id + ' fetchOrders() method parameter must be either "privateGetV2Orders" or "privateGetV2HistoryOrders"');
1526
+ }
1527
+ return this.parseOrders(response, market, since, limit);
1528
+ }
1529
+ handlePaginationParams(method, since = undefined, params = {}) {
1530
+ const ninetyDays = 90 * 24 * 60 * 60 * 1000;
1531
+ const now = this.milliseconds();
1532
+ const allowedSince = now - ninetyDays;
1533
+ if ((since !== undefined) && (since < allowedSince)) {
1534
+ throw new BadRequest(this.id + ' ' + method + '() only allows fetching entries up to 90 days in the past');
1535
+ }
1536
+ params = this.omit(params, 'paginate');
1537
+ params = this.extend(params, { 'paginationDirection': 'backward' });
1538
+ const until = this.safeInteger(params, 'until');
1539
+ if (until === undefined) {
1540
+ params = this.extend(params, { 'until': now });
1541
+ }
1542
+ return params;
1543
+ }
1544
+ handleSinceAndUntil(since = undefined, params = {}, sinceKey = 'createdAtDatetime[gte]', untilKey = 'createdAtDatetime[lte]') {
1545
+ let until = this.safeInteger(params, 'until');
1546
+ if ((since !== undefined) || (until !== undefined)) {
1547
+ const timeDelta = 7 * 24 * 60 * 60 * 1000; // 7 days
1548
+ if (since === undefined) {
1549
+ since = until - timeDelta;
1550
+ params = this.omit(params, 'until');
1551
+ }
1552
+ else if (until === undefined) {
1553
+ until = this.sum(since, timeDelta);
1554
+ const now = this.milliseconds();
1555
+ if (until > now) {
1556
+ until = now;
1557
+ }
1558
+ }
1559
+ const sinceDate = this.iso8601(since);
1560
+ const untilDate = this.iso8601(until);
1561
+ params[sinceKey] = sinceDate;
1562
+ params[untilKey] = untilDate;
1563
+ }
1564
+ return params;
1565
+ }
1566
+ getClosestLimit(limit) {
1567
+ let pageSize = 5;
1568
+ if ((limit > 5) && (limit < 26)) {
1569
+ pageSize = 25;
1570
+ }
1571
+ else if ((limit > 25) && (limit < 51)) {
1572
+ pageSize = 50;
1573
+ }
1574
+ else if (limit > 50) {
1575
+ pageSize = 100;
1576
+ }
1577
+ return pageSize;
1578
+ }
1579
+ /**
1580
+ * @method
1581
+ * @name bullish#fetchOpenOrders
1582
+ * @description fetch all unfilled currently open orders
1583
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--history
1584
+ * @param {string} symbol unified market symbol of the market orders were made in
1585
+ * @param {int} [since] the earliest time in ms to fetch orders for
1586
+ * @param {int} [limit] the maximum number of order structures to retrieve
1587
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1588
+ * @param {string} params.tradingAccountId the trading account id (mandatory parameter)
1589
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1590
+ */
1591
+ async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1592
+ const request = {
1593
+ 'status': 'OPEN',
1594
+ };
1595
+ return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
1596
+ }
1597
+ /**
1598
+ * @method
1599
+ * @name bullish#fetchCanceledOrders
1600
+ * @description fetches information on multiple canceled orders made by the user
1601
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--orders
1602
+ * @param {string} symbol unified market symbol of the canceled orders
1603
+ * @param {int} [since] timestamp in ms of the earliest order
1604
+ * @param {int} [limit] the max number of canceled orders to return
1605
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1606
+ * @param {string} [params.tradingAccountId] the trading account id (mandatory parameter)
1607
+ * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1608
+ */
1609
+ async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1610
+ const request = {
1611
+ 'status': 'CANCELLED',
1612
+ 'method': 'privateGetV2Orders', // current endpoint distinquishes between CLOSED and CANCELLED orders
1613
+ };
1614
+ return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
1615
+ }
1616
+ /**
1617
+ * @method
1618
+ * @name bullish#fetchClosedOrders
1619
+ * @description fetches information on multiple closed orders made by the user
1620
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--orders
1621
+ * @param {string} symbol unified market symbol of the closed orders
1622
+ * @param {int} [since] timestamp in ms of the earliest order
1623
+ * @param {int} [limit] the max number of closed orders to return
1624
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1625
+ * @param {string} params.tradingAccountId the trading account id (mandatory parameter)
1626
+ * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1627
+ */
1628
+ async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1629
+ const request = {
1630
+ 'status': 'CLOSED',
1631
+ 'method': 'privateGetV2Orders', // current endpoint distinquishes between CLOSED and CANCELLED orders
1632
+ };
1633
+ return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
1634
+ }
1635
+ /**
1636
+ * @method
1637
+ * @name bullish#fetchCanceledAndClosedOrders
1638
+ * @description fetches information on multiple canceled orders made by the user
1639
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--history
1640
+ * @param {string} symbol unified market symbol of the closed orders
1641
+ * @param {int} [since] timestamp in ms of the earliest order
1642
+ * @param {int} [limit] the max number of closed orders to return
1643
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1644
+ * @param {string} [params.tradingAccountId] the trading account id (mandatory parameter)
1645
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1646
+ */
1647
+ async fetchCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1648
+ const request = {
1649
+ 'status': 'CLOSED',
1650
+ 'method': 'privateGetV2HistoryOrders', // current endpoint returns both CLOSED and CANCELLED orders
1651
+ };
1652
+ return await this.fetchOrders(symbol, since, limit, this.extend(request, params));
1653
+ }
1654
+ /**
1655
+ * @method
1656
+ * @name bullish#fetchOrder
1657
+ * @description fetches information on an order made by the user
1658
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v2/orders/-orderId-
1659
+ * @param {string} id the order id
1660
+ * @param {string} [symbol] unified symbol of the market the order was made in
1661
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1662
+ * @param {string} [params.traidingAccountId] the trading account id (mandatory parameter)
1663
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1664
+ */
1665
+ async fetchOrder(id, symbol = undefined, params = {}) {
1666
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1667
+ const tradingAccountId = await this.loadAccount(params);
1668
+ let market = undefined;
1669
+ if (symbol !== undefined) {
1670
+ market = this.market(symbol);
1671
+ }
1672
+ const request = {
1673
+ 'orderId': id,
1674
+ 'tradingAccountId': tradingAccountId,
1675
+ };
1676
+ const response = await this.privateGetV2OrdersOrderId(this.extend(request, params));
1677
+ //
1678
+ // {
1679
+ // "clientOrderId": "187",
1680
+ // "orderId": "297735387747975680",
1681
+ // "symbol": "BTCUSDC",
1682
+ // "price": "1.00000000",
1683
+ // "averageFillPrice": "1.00000000",
1684
+ // "stopPrice": "1.00000000",
1685
+ // "allowBorrow": false,
1686
+ // "quantity": "1.00000000",
1687
+ // "quantityFilled": "1.00000000",
1688
+ // "quoteAmount": "1.00000000",
1689
+ // "baseFee": "0.00100000",
1690
+ // "quoteFee": "0.0010",
1691
+ // "borrowedBaseQuantity": "1.00000000",
1692
+ // "borrowedQuoteQuantity": "1.00000000",
1693
+ // "isLiquidation": false,
1694
+ // "side": "BUY",
1695
+ // "type": "LMT",
1696
+ // "timeInForce": "GTC",
1697
+ // "status": "OPEN",
1698
+ // "statusReason": "User cancelled",
1699
+ // "statusReasonCode": "1002",
1700
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1701
+ // "createdAtTimestamp": "1621490985000",
1702
+ // }
1703
+ //
1704
+ return this.parseOrder(response, market);
1705
+ }
1706
+ /**
1707
+ * @method
1708
+ * @name bullish#createOrder
1709
+ * @description create a trade order
1710
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v2/orders
1711
+ * @param {string} symbol unified symbol of the market to create an order in
1712
+ * @param {string} type 'market' or 'limit' or 'STOP_LIMIT' or 'POST_ONLY'
1713
+ * @param {string} side 'buy' or 'sell'
1714
+ * @param {float} amount how much of currency you want to trade in units of base currency
1715
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1716
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1717
+ * @param {string} [params.clientOrderId] a custom client order id
1718
+ * @param {float} [params.triggerPrice] the price at which a stop order is triggered at
1719
+ * @param {string} [params.timeInForce] the time in force for the order, either 'GTC' (Good Till Cancelled) or 'IOC' (Immediate or Cancel), default is 'GTC'
1720
+ * @param {bool} [params.allowBorrow] if true, the order will be allowed to borrow assets to fulfill the order (default is false)
1721
+ * @param {bool} [params.postOnly] if true, the order will only be posted to the order book and not executed immediately (default is false)
1722
+ * @param {string} params.traidingAccountId the trading account id (mandatory parameter)
1723
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1724
+ */
1725
+ async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1726
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1727
+ const tradingAccountId = await this.loadAccount(params);
1728
+ const market = this.market(symbol);
1729
+ const request = {
1730
+ 'commandType': 'V3CreateOrder',
1731
+ 'symbol': market['id'],
1732
+ 'side': side.toUpperCase(),
1733
+ 'quantity': this.amountToPrecision(symbol, amount),
1734
+ 'tradingAccountId': tradingAccountId,
1735
+ };
1736
+ const isMarketOrder = ((type === 'market') || type === 'MARKET');
1737
+ let postOnly = false;
1738
+ [postOnly, params] = this.handlePostOnly(isMarketOrder, type === 'POST_ONLY', params);
1739
+ if (postOnly) {
1740
+ type = 'POST_ONLY';
1741
+ }
1742
+ let timeInForce = 'GTC'; // is mandatory
1743
+ [timeInForce, params] = this.handleOptionAndParams(params, 'createOrder', 'timeInForce', timeInForce);
1744
+ params['timeInForce'] = timeInForce.toUpperCase();
1745
+ if (!isMarketOrder) {
1746
+ request['price'] = this.priceToPrecision(symbol, price);
1747
+ }
1748
+ const triggerPrice = this.safeString(params, 'triggerPrice');
1749
+ if (triggerPrice !== undefined) {
1750
+ if (isMarketOrder) {
1751
+ throw new NotSupported(this.id + ' createOrder() does not support market trigger orders');
1752
+ }
1753
+ request['stopPrice'] = this.priceToPrecision(symbol, triggerPrice);
1754
+ type = 'STOP_LIMIT';
1755
+ params = this.omit(params, 'triggerPrice');
1756
+ }
1757
+ request['type'] = type.toUpperCase();
1758
+ const response = await this.privatePostV2Orders(this.extend(request, params));
1759
+ //
1760
+ // {
1761
+ // "message": "Command acknowledged - CreateOrder",
1762
+ // "requestId": "633910976353665024",
1763
+ // "orderId": "633910775316480001",
1764
+ // "clientOrderId": "1234567"
1765
+ // }
1766
+ //
1767
+ return this.parseOrder(response, market);
1768
+ }
1769
+ /**
1770
+ * @method
1771
+ * @name bullish#editOrder
1772
+ * @description edit a trade limit order
1773
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v2/command-amend
1774
+ * @param {string} id order id
1775
+ * @param {string} [symbol] unified symbol of the market to create an order in
1776
+ * @param {string} [type] 'limit' or 'POST_ONLY'
1777
+ * @param {string} [side] not used by bullish editOrder
1778
+ * @param {float} [amount] how much of the currency you want to trade in units of the base currency
1779
+ * @param {float} [price] the price for the order, in units of the quote currency, ignored in market orders
1780
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1781
+ * @param {string} [params.traidingAccountId] the trading account id (mandatory parameter)
1782
+ * @param {bool} [params.postOnly] if true, the order will only be posted to the order book and not executed immediately (default is false)
1783
+ * @param {string} [params.clientOrderId] a unique identifier for the order, automatically generated if not sent
1784
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1785
+ */
1786
+ async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
1787
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1788
+ const tradingAccountId = await this.loadAccount(params);
1789
+ const market = this.market(symbol);
1790
+ const request = {
1791
+ 'commandType': 'V1AmendOrder',
1792
+ 'symbol': market['id'],
1793
+ 'tradingAccountId': tradingAccountId,
1794
+ };
1795
+ const clientOrderId = this.safeString(params, 'clientOrderId');
1796
+ if (clientOrderId === undefined) {
1797
+ request['orderId'] = id;
1798
+ }
1799
+ if (type !== undefined) {
1800
+ request['type'] = type.toUpperCase();
1801
+ }
1802
+ const postOnly = this.safeBool(params, 'postOnly', false);
1803
+ if (postOnly) {
1804
+ params = this.omit(params, 'postOnly');
1805
+ request['type'] = 'POST_ONLY';
1806
+ }
1807
+ if (amount !== undefined) {
1808
+ request['quantity'] = this.amountToPrecision(symbol, amount);
1809
+ }
1810
+ if (price !== undefined) {
1811
+ request['price'] = this.priceToPrecision(symbol, price);
1812
+ }
1813
+ const response = await this.privatePostV2Command(this.extend(request, params));
1814
+ return this.parseOrder(response, market);
1815
+ }
1816
+ /**
1817
+ * @method
1818
+ * @name bullish#cancelOrder
1819
+ * @description cancels an open order
1820
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v2/command-cancellations
1821
+ * @param {string} [id] order id
1822
+ * @param {string} symbol unified symbol of the market the order was made in
1823
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1824
+ * @param {string} params.commandType the command type, default is 'V3CancelOrder' (mandatory parameter)
1825
+ * @param {string} [params.traidingAccountId] the trading account id (mandatory parameter)
1826
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1827
+ */
1828
+ async cancelOrder(id, symbol = undefined, params = {}) {
1829
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1830
+ const tradingAccountId = await this.loadAccount(params);
1831
+ if (symbol === undefined) {
1832
+ throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
1833
+ }
1834
+ const market = this.market(symbol);
1835
+ const request = {
1836
+ 'symbol': market['id'],
1837
+ 'tradingAccountId': tradingAccountId,
1838
+ 'commandType': this.safeString(params, 'commandType', 'V3CancelOrder'),
1839
+ 'orderId': id,
1840
+ };
1841
+ const response = await this.privatePostV2Command(this.extend(request, params));
1842
+ //
1843
+ // {
1844
+ // "message": "Command acknowledged - CancelOrder",
1845
+ // "requestId": "844658480774644736",
1846
+ // "orderId": "297735387747975680",
1847
+ // "clientOrderId": null
1848
+ // }
1849
+ //
1850
+ return this.parseOrder(response, market);
1851
+ }
1852
+ /**
1853
+ * @method
1854
+ * @name bullish#cancelAllOrders
1855
+ * @description cancel all open orders in a market
1856
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v2/command-cancellations
1857
+ * @param {string} [symbol] alpaca cancelAllOrders cannot setting symbol, it will cancel all open orders
1858
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1859
+ * @param {string} params.traidingAccountId the trading account id (mandatory parameter)
1860
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1861
+ */
1862
+ async cancelAllOrders(symbol = undefined, params = {}) {
1863
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
1864
+ const tradingAccountId = await this.loadAccount(params);
1865
+ const request = {
1866
+ 'tradingAccountId': tradingAccountId,
1867
+ };
1868
+ let market = undefined;
1869
+ if (symbol !== undefined) {
1870
+ market = this.market(symbol);
1871
+ request['symbol'] = market['id'];
1872
+ request['commandType'] = 'V1CancelAllOrdersByMarket';
1873
+ }
1874
+ else {
1875
+ request['commandType'] = 'V1CancelAllOrders';
1876
+ }
1877
+ const response = await this.privatePostV2Command(this.extend(request, params));
1878
+ //
1879
+ // {
1880
+ // "message": "Command acknowledged - CancelAllOrders",
1881
+ // "requestId": "633900538459062272"
1882
+ // }
1883
+ //
1884
+ const orders = [response];
1885
+ return this.parseOrders(orders, market);
1886
+ }
1887
+ parseOrder(order, market = undefined) {
1888
+ //
1889
+ // fetchOrders, fetchOrder
1890
+ // {
1891
+ // "clientOrderId": "187",
1892
+ // "orderId": "297735387747975680",
1893
+ // "symbol": "BTCUSDC",
1894
+ // "price": "1.00000000",
1895
+ // "averageFillPrice": "1.00000000",
1896
+ // "stopPrice": "1.00000000",
1897
+ // "allowBorrow": false,
1898
+ // "quantity": "1.00000000",
1899
+ // "quantityFilled": "1.00000000",
1900
+ // "quoteAmount": "1.00000000",
1901
+ // "baseFee": "0.00100000",
1902
+ // "quoteFee": "0.0010",
1903
+ // "borrowedBaseQuantity": "1.00000000",
1904
+ // "borrowedQuoteQuantity": "1.00000000",
1905
+ // "isLiquidation": false,
1906
+ // "side": "BUY",
1907
+ // "type": "LMT",
1908
+ // "timeInForce": "GTC",
1909
+ // "status": "OPEN",
1910
+ // "statusReason": "User cancelled",
1911
+ // "statusReasonCode": "1002",
1912
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
1913
+ // "createdAtTimestamp": "1621490985000",
1914
+ // }
1915
+ //
1916
+ // createOrder
1917
+ // {
1918
+ // "message": "Command acknowledged - CreateOrder",
1919
+ // "requestId": "633910976353665024",
1920
+ // "orderId": "633910775316480001",
1921
+ // "clientOrderId": "1234567"
1922
+ // }
1923
+ //
1924
+ // cancelOrder
1925
+ // {
1926
+ // "message": "Command acknowledged - CancelOrder",
1927
+ // "requestId": "633910976353665024",
1928
+ // "orderId": "633910775316480001"
1929
+ // }
1930
+ //
1931
+ // cancelAllOrders
1932
+ // {
1933
+ // "message": "Command acknowledged - CancelAllOrders",
1934
+ // "requestId": "633900538459062272"
1935
+ // }
1936
+ //
1937
+ const marketId = this.safeString(order, 'symbol');
1938
+ if (market === undefined) {
1939
+ market = this.safeMarket(marketId);
1940
+ }
1941
+ const symbol = this.safeSymbol(marketId, market);
1942
+ const id = this.safeString(order, 'orderId');
1943
+ const timestamp = this.safeInteger(order, 'createdAtTimestamp');
1944
+ const type = this.safeString(order, 'type');
1945
+ const side = this.safeStringLower(order, 'side');
1946
+ const price = this.safeString(order, 'price');
1947
+ const amount = this.safeString(order, 'quantity');
1948
+ const filled = this.safeString(order, 'quantityFilled');
1949
+ let status = this.parseOrderStatus(this.safeString(order, 'status'));
1950
+ if (status === 'closed') {
1951
+ const statusReason = this.safeString(order, 'statusReason');
1952
+ if (statusReason === 'User cancelled') {
1953
+ status = 'canceled';
1954
+ }
1955
+ }
1956
+ const timeInForce = this.safeString(order, 'timeInForce');
1957
+ const stopPrice = this.safeString(order, 'stopPrice');
1958
+ const cost = this.safeString(order, 'quoteAmount');
1959
+ const fee = {};
1960
+ const quoteFee = this.safeNumber(order, 'quoteFee');
1961
+ if (quoteFee !== undefined) {
1962
+ fee['cost'] = quoteFee;
1963
+ fee['currency'] = market['quote'];
1964
+ }
1965
+ const average = this.safeString(order, 'averageFillPrice');
1966
+ return this.safeOrder({
1967
+ 'id': id,
1968
+ 'clientOrderId': this.safeString(order, 'clientOrderId'),
1969
+ 'timestamp': timestamp,
1970
+ 'datetime': this.iso8601(timestamp),
1971
+ 'lastTradeTimestamp': undefined,
1972
+ 'status': status,
1973
+ 'symbol': symbol,
1974
+ 'type': this.parseOrderType(type),
1975
+ 'timeInForce': timeInForce,
1976
+ 'postOnly': type === 'POST_ONLY',
1977
+ 'side': side,
1978
+ 'price': price,
1979
+ 'triggerPrice': stopPrice,
1980
+ 'amount': amount,
1981
+ 'filled': filled,
1982
+ 'remaining': undefined,
1983
+ 'cost': cost,
1984
+ 'trades': undefined,
1985
+ 'fee': fee,
1986
+ 'info': order,
1987
+ 'average': average,
1988
+ }, market);
1989
+ }
1990
+ parseOrderStatus(status) {
1991
+ const statuses = {
1992
+ 'OPEN': 'open',
1993
+ 'CLOSED': 'closed',
1994
+ 'CANCELLED': 'canceled',
1995
+ 'REJECTED': 'rejected',
1996
+ };
1997
+ return this.safeString(statuses, status, status);
1998
+ }
1999
+ parseOrderType(type) {
2000
+ const types = {
2001
+ 'LMT': 'limit',
2002
+ 'MKT': 'market',
2003
+ 'POST_ONLY': 'limit',
2004
+ 'STOP_LIMIT': 'limit',
2005
+ };
2006
+ return this.safeString(types, type, type);
2007
+ }
2008
+ /**
2009
+ * @method
2010
+ * @name bullish#fetchDepositsWithdrawals
2011
+ * @description fetch history of deposits and withdrawals
2012
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/wallets/transactions
2013
+ * @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
2014
+ * @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
2015
+ * @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
2016
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2017
+ * @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2018
+ */
2019
+ async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
2020
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2021
+ let request = {};
2022
+ [request, params] = this.handleUntilOption('createdAtDatetime[lte]', request, params);
2023
+ const until = this.safeInteger(request, 'createdAtDatetime[lte]');
2024
+ if (until !== undefined) {
2025
+ request['createdAtDatetime[lte]'] = this.iso8601(until);
2026
+ }
2027
+ if (since !== undefined) {
2028
+ request['createdAtDatetime[gte]'] = this.iso8601(since);
2029
+ }
2030
+ const response = await this.privateGetV1WalletsTransactions(this.extend(request, params));
2031
+ //
2032
+ // {
2033
+ // "data": [
2034
+ // {
2035
+ // "custodyTransactionId": "0x791fc85f16a84cbd5250d5517ecad497f564d2e5cc54d31466fe70b952fd58da",
2036
+ // "direction": "DEPOSIT",
2037
+ // "quantity": "150",
2038
+ // "symbol": "USDC",
2039
+ // "fee": "0",
2040
+ // "memo": "0x34625d5f0b6575503a0669994dea24271bfbd443",
2041
+ // "createdAtDateTime": "2025-11-04T14:31:17.000Z",
2042
+ // "updatedAtDateTime": "2025-11-04T14:44:17.500Z",
2043
+ // "status": "COMPLETE",
2044
+ // "statusReason": "OK",
2045
+ // "network": "ETH",
2046
+ // "transactionDetails": {
2047
+ // "address": "0x34625d5f0b6575503a0669994dea24271bfbd443",
2048
+ // "blockchainTxId": "0x791fc85f16a84cbd5250d5517ecad497f564d2e5cc54d31466fe70b952fd58da",
2049
+ // "swiftUetr": null,
2050
+ // "sources": [
2051
+ // {
2052
+ // "address": "0x2653435d52a5f49551ebb757f25b2c8bb954859b"
2053
+ // }
2054
+ // ]
2055
+ // }
2056
+ // }
2057
+ // ],
2058
+ // "links": {
2059
+ // "previous": null,
2060
+ // "next": null
2061
+ // },
2062
+ // "totalCount": 1
2063
+ // }
2064
+ //
2065
+ const data = this.safeList(response, 'data', []);
2066
+ let currency = undefined;
2067
+ if (code !== undefined) {
2068
+ currency = this.currency(code);
2069
+ }
2070
+ return this.parseTransactions(data, currency, since, limit);
2071
+ }
2072
+ /**
2073
+ * @method
2074
+ * @name bullish#withdraw
2075
+ * @description make a withdrawal
2076
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v1/wallets/withdrawal
2077
+ * @param {string} code unified currency code
2078
+ * @param {float} amount the amount to withdraw
2079
+ * @param {string} address the address to withdraw to
2080
+ * @param {string} [tag]
2081
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2082
+ * @param {string} params.timestamp the timestamp of the withdrawal request (mandatory)
2083
+ * @param {string} params.nonce the nonce of the withdrawal request (mandatory)
2084
+ * @param {string} params.network network for withdraw (mandatory)
2085
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2086
+ */
2087
+ async withdraw(code, amount, address, tag = undefined, params = {}) {
2088
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2089
+ // todo check this method properly
2090
+ const currency = this.currency(code);
2091
+ const request = {
2092
+ 'command': {
2093
+ 'commandType': 'V1Withdraw',
2094
+ 'destinationId': address,
2095
+ 'symbol': currency['id'],
2096
+ 'quantity': this.currencyToPrecision(code, amount),
2097
+ },
2098
+ };
2099
+ let networkCode = undefined;
2100
+ [networkCode, params] = this.handleNetworkCodeAndParams(params);
2101
+ if (networkCode !== undefined) {
2102
+ request['network'] = this.networkCodeToId(networkCode);
2103
+ }
2104
+ else {
2105
+ throw new ArgumentsRequired(this.id + ' withdraw() requires a network parameter');
2106
+ }
2107
+ const response = await this.privatePostV1WalletsWithdrawal(this.extend(request, params));
2108
+ //
2109
+ // {
2110
+ // "code": "00000",
2111
+ // "msg": "success",
2112
+ // "data": {
2113
+ // "orderId":888291686266343424",
2114
+ // "clientOrderId":"123"
2115
+ // }
2116
+ // }
2117
+ //
2118
+ return this.parseTransaction(response, currency);
2119
+ }
2120
+ parseTransaction(transaction, currency = undefined) {
2121
+ //
2122
+ // {
2123
+ // "custodyTransactionId": "0x791fc85f16a84cbd5250d5517ecad497f564d2e5cc54d31466fe70b952fd58da",
2124
+ // "direction": "DEPOSIT",
2125
+ // "quantity": "150",
2126
+ // "symbol": "USDC",
2127
+ // "fee": "0",
2128
+ // "memo": "0x34625d5f0b6575503a0669994dea24271bfbd443",
2129
+ // "createdAtDateTime": "2025-11-04T14:31:17.000Z",
2130
+ // "updatedAtDateTime": "2025-11-04T14:44:17.500Z",
2131
+ // "status": "COMPLETE",
2132
+ // "statusReason": "OK",
2133
+ // "network": "ETH",
2134
+ // "transactionDetails": {
2135
+ // "address": "0x34625d5f0b6575503a0669994dea24271bfbd443",
2136
+ // "blockchainTxId": "0x791fc85f16a84cbd5250d5517ecad497f564d2e5cc54d31466fe70b952fd58da",
2137
+ // "swiftUetr": null,
2138
+ // "sources": [
2139
+ // {
2140
+ // "address": "0x2653435d52a5f49551ebb757f25b2c8bb954859b"
2141
+ // }
2142
+ // ]
2143
+ // }
2144
+ // }
2145
+ //
2146
+ const id = this.safeString(transaction, 'custodyTransactionId');
2147
+ const type = this.safeString(transaction, 'direction');
2148
+ const timestamp = this.parse8601(this.safeString(transaction, 'createdAtDateTime'));
2149
+ const updated = this.parse8601(this.safeString(transaction, 'updatedAtDateTime'));
2150
+ const network = this.safeString(transaction, 'network');
2151
+ const transactionDetails = this.safeDict(transaction, 'transactionDetails');
2152
+ const txid = this.safeString(transactionDetails, 'blockchainTxId');
2153
+ const address = this.safeString(transactionDetails, 'address');
2154
+ const amount = this.safeNumber(transaction, 'quantity');
2155
+ const currencyId = this.safeString(transaction, 'symbol');
2156
+ const code = this.safeCurrencyCode(currencyId, currency);
2157
+ const status = this.safeString(transaction, 'status');
2158
+ const sources = this.safeList(transactionDetails, 'sources', []);
2159
+ const source = this.safeDict(sources, 0, {});
2160
+ const sourceAddress = this.safeString(source, 'address');
2161
+ const fee = {
2162
+ 'currency': undefined,
2163
+ 'cost': undefined,
2164
+ 'rate': undefined,
2165
+ };
2166
+ const feeCost = this.safeNumber(transaction, 'fee');
2167
+ if (feeCost !== undefined) {
2168
+ fee['cost'] = feeCost;
2169
+ fee['currency'] = code;
2170
+ }
2171
+ return {
2172
+ 'id': id,
2173
+ 'txid': txid,
2174
+ 'timestamp': timestamp,
2175
+ 'datetime': this.iso8601(timestamp),
2176
+ 'network': this.networkIdToCode(network),
2177
+ 'addressFrom': sourceAddress,
2178
+ 'address': address,
2179
+ 'addressTo': address,
2180
+ 'amount': amount,
2181
+ 'type': this.parseTransactionType(type),
2182
+ 'currency': code,
2183
+ 'status': this.parseTransactionStatus(status),
2184
+ 'updated': updated,
2185
+ 'tagFrom': undefined,
2186
+ 'tag': undefined,
2187
+ 'tagTo': undefined,
2188
+ 'comment': undefined,
2189
+ 'internal': undefined,
2190
+ 'fee': fee,
2191
+ 'info': transaction,
2192
+ };
2193
+ }
2194
+ parseTransactionType(type) {
2195
+ const types = {
2196
+ 'DEPOSIT': 'deposit',
2197
+ 'WITHDRAW': 'withdrawal',
2198
+ };
2199
+ return this.safeString(types, type, type);
2200
+ }
2201
+ parseTransactionStatus(status) {
2202
+ const statuses = {
2203
+ 'COMPLETE': 'ok',
2204
+ 'FAILED': 'failed',
2205
+ 'PENDING': 'pending',
2206
+ 'CANCELLED': 'canceled',
2207
+ };
2208
+ return this.safeString(statuses, status, status);
2209
+ }
2210
+ async loadAccount(params = {}) {
2211
+ let tradingAccountId = undefined;
2212
+ [tradingAccountId, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'tradingAccountId');
2213
+ if (tradingAccountId === undefined) {
2214
+ const response = await this.privateGetV1AccountsTradingAccounts(params);
2215
+ for (let i = 0; i < response.length; i++) {
2216
+ const account = response[i];
2217
+ const name = this.safeString(account, 'tradingAccountName');
2218
+ if (name === 'Primary Account') {
2219
+ tradingAccountId = this.safeString(account, 'tradingAccountId');
2220
+ break;
2221
+ }
2222
+ }
2223
+ }
2224
+ if (tradingAccountId === undefined) {
2225
+ throw new ArgumentsRequired(this.id + ' loadAccount() requires a tradingAccountId parameter in options["tradingAccountId"] or params["tradingAccountId"], fetchAccounts() was not able to find the Primary account');
2226
+ }
2227
+ this.options['tradingAccountId'] = tradingAccountId;
2228
+ return tradingAccountId;
2229
+ }
2230
+ /**
2231
+ * @method
2232
+ * @name bullish#fetchAccounts
2233
+ * @description fetch all the accounts associated with a profile
2234
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#tag--trading-accounts
2235
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2236
+ * @returns {object} a dictionary of [account structures]{@link https://docs.ccxt.com/#/?id=account-structure} indexed by the account type
2237
+ */
2238
+ async fetchAccounts(params = {}) {
2239
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2240
+ const response = await this.privateGetV1AccountsTradingAccounts(params);
2241
+ //
2242
+ // [
2243
+ // {
2244
+ // "defaultedMarginUSD": "0.0000",
2245
+ // "endCustomerId": "222801149768465",
2246
+ // "fullLiquidationMarginUSD": "0.0000",
2247
+ // "initialMarginUSD": "0.0000",
2248
+ // "isBorrowing": "false",
2249
+ // "isConcentrationRiskEnabled": "true",
2250
+ // "isDefaulted": "false",
2251
+ // "isLending": "false",
2252
+ // "isPrimaryAccount": "true",
2253
+ // "liquidationMarginUSD": "0.0000",
2254
+ // "liquidityAddonUSD": "0.0000",
2255
+ // "makerFee": "0.00000000",
2256
+ // "marginProfile": {
2257
+ // "defaultedMarketRiskMultiplierPct": "50.00",
2258
+ // "fullLiquidationMarketRiskMultiplierPct": "75.00",
2259
+ // "initialMarketRiskMultiplierPct": "200.00",
2260
+ // "liquidationMarketRiskMultiplierPct": "100.00",
2261
+ // "warningMarketRiskMultiplierPct": "150.00"
2262
+ // },
2263
+ // "marketRiskUSD": "0.0000",
2264
+ // "maxInitialLeverage": "1",
2265
+ // "rateLimitToken": "7fc358f0bad4124528318ff415e24f1ad6e530321827162a5e35d8de8dcfc750",
2266
+ // "riskLimitUSD": "0.0000",
2267
+ // "takerFee": "0.00000002",
2268
+ // "totalBorrowedUSD": "0.0000",
2269
+ // "totalCollateralUSD": "0.0000",
2270
+ // "totalLiabilitiesUSD": "0.0000",
2271
+ // "tradeFeeRate": [
2272
+ // {
2273
+ // "feeGroupId": "1",
2274
+ // "makerFee": "0.00000000",
2275
+ // "takerFee": "0.00000000"
2276
+ // },
2277
+ // {
2278
+ // "feeGroupId": "2",
2279
+ // "makerFee": "0.00000000",
2280
+ // "takerFee": "0.00000000"
2281
+ // },
2282
+ // {
2283
+ // "feeGroupId": "3",
2284
+ // "makerFee": "0.00000000",
2285
+ // "takerFee": "0.00000000"
2286
+ // },
2287
+ // {
2288
+ // "feeGroupId": "4",
2289
+ // "makerFee": "0.00000000",
2290
+ // "takerFee": "0.00000000"
2291
+ // },
2292
+ // {
2293
+ // "feeGroupId": "5",
2294
+ // "makerFee": "0.00000000",
2295
+ // "takerFee": "0.00000000"
2296
+ // },
2297
+ // {
2298
+ // "feeGroupId": "6",
2299
+ // "makerFee": "0.00000000",
2300
+ // "takerFee": "0.00000000"
2301
+ // },
2302
+ // {
2303
+ // "feeGroupId": "7",
2304
+ // "makerFee": "0.00000000",
2305
+ // "takerFee": "0.00000000"
2306
+ // },
2307
+ // {
2308
+ // "feeGroupId": "8",
2309
+ // "makerFee": "0.00000000",
2310
+ // "takerFee": "0.00000000"
2311
+ // }
2312
+ // ],
2313
+ // "tradingAccountDescription": null,
2314
+ // "tradingAccountId": "111309424211255",
2315
+ // "tradingAccountName": "Primary Account",
2316
+ // "warningMarginUSD": "0.0000"
2317
+ // }
2318
+ // ]
2319
+ //
2320
+ return this.parseAccounts(response, params);
2321
+ }
2322
+ parseAccount(account) {
2323
+ return {
2324
+ 'id': this.safeString(account, 'tradingAccountId'),
2325
+ 'type': undefined,
2326
+ 'code': undefined,
2327
+ 'info': account,
2328
+ };
2329
+ }
2330
+ /**
2331
+ * @method
2332
+ * @name bullish#fetchDepositAddress
2333
+ * @description fetch the deposit address for a currency associated with this account
2334
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/wallets/deposit-instructions/crypto/-symbol-
2335
+ * @param {string} code unified currency code
2336
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2337
+ * @param {string} [params.network] network for deposit address
2338
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
2339
+ */
2340
+ async fetchDepositAddress(code, params = {}) {
2341
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2342
+ const currency = this.currency(code);
2343
+ const request = {
2344
+ 'symbol': currency['id'],
2345
+ };
2346
+ const response = await this.privateGetV1WalletsDepositInstructionsCryptoSymbol(this.extend(request, params));
2347
+ //
2348
+ // [
2349
+ // {
2350
+ // "network": "ETH",
2351
+ // "address": "0xc2fc755082d052bb334763b144851a0031999f33",
2352
+ // "symbol": "ETH"
2353
+ // }
2354
+ // ]
2355
+ //
2356
+ const safeResponse = this.toArray(response);
2357
+ const length = safeResponse.length;
2358
+ let data = this.safeDict(safeResponse, 0, {});
2359
+ let network = undefined;
2360
+ [network, params] = this.handleNetworkCodeAndParams(params);
2361
+ const networkDefinedByUser = network !== undefined;
2362
+ if ((length > 1) || (networkDefinedByUser)) {
2363
+ // some currencies have multiple networks
2364
+ if (network === undefined) {
2365
+ // use default network if not specified and multiple are available
2366
+ network = this.defaultNetworkCode(code);
2367
+ }
2368
+ if (network !== undefined) {
2369
+ // find the entry that matches the network or return first entry if not found and user did not specify a network
2370
+ for (let i = 0; i < safeResponse.length; i++) {
2371
+ const entry = this.safeDict(safeResponse, i, {});
2372
+ const networkId = this.safeString(entry, 'network');
2373
+ const networkCode = this.networkIdToCode(networkId);
2374
+ if (network === networkCode) {
2375
+ data = entry;
2376
+ break;
2377
+ }
2378
+ }
2379
+ if (networkDefinedByUser) {
2380
+ data = {}; // return an empty structure if the user-defined network was not found
2381
+ }
2382
+ }
2383
+ }
2384
+ return this.parseDepositAddress(data, currency);
2385
+ }
2386
+ parseDepositAddress(depositAddress, currency = undefined) {
2387
+ const id = this.safeString(depositAddress, 'symbol');
2388
+ const network = this.safeString(depositAddress, 'network');
2389
+ return {
2390
+ 'info': depositAddress,
2391
+ 'currency': this.safeCurrencyCode(id, currency),
2392
+ 'network': this.networkIdToCode(network),
2393
+ 'address': this.safeString(depositAddress, 'address'),
2394
+ 'tag': undefined,
2395
+ };
2396
+ }
2397
+ /**
2398
+ * @method
2399
+ * @name bullish#fetchBalance
2400
+ * @description query for balance and get the amount of funds available for trading or funds locked in orders
2401
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/accounts/asset
2402
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/accounts/asset/-symbol-
2403
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2404
+ * @param {string} params.tradingAccountId the trading account id (mandatory parameter)
2405
+ * @param {string} [params.code] unified currency code, default is undefined
2406
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
2407
+ */
2408
+ async fetchBalance(params = {}) {
2409
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2410
+ const tradingAccountId = await this.loadAccount(params);
2411
+ const request = {
2412
+ 'tradingAccountId': tradingAccountId,
2413
+ };
2414
+ let response = undefined;
2415
+ const code = this.safeString(params, 'code');
2416
+ if (code !== undefined) {
2417
+ request['symbol'] = this.currency(code)['id'];
2418
+ response = await this.privateGetV1AccountsAssetSymbol(this.extend(request, params));
2419
+ return this.parseBalanceForSingleCurrency(response, code);
2420
+ }
2421
+ else {
2422
+ response = await this.privateGetV1AccountsAsset(this.extend(request, params));
2423
+ //
2424
+ // [
2425
+ // {
2426
+ // "assetId": "10",
2427
+ // "assetSymbol": "AAVE",
2428
+ // "availableQuantity": "10000000.00000000",
2429
+ // "borrowedQuantity": "0.00000000",
2430
+ // "loanedQuantity": "0.00000000",
2431
+ // "lockedQuantity": "0.00000000",
2432
+ // "publishedAtTimestamp": "1747942728870",
2433
+ // "tradingAccountId": "111309424211255",
2434
+ // "updatedAtDatetime": "2025-05-13T11:33:08.801Z",
2435
+ // "updatedAtTimestamp": "1747135988801"
2436
+ // }, ...
2437
+ // ]
2438
+ //
2439
+ return this.parseBalance(response);
2440
+ }
2441
+ }
2442
+ parseBalanceForSingleCurrency(response, code) {
2443
+ const result = { 'info': response };
2444
+ const account = this.account();
2445
+ account['free'] = this.safeString(response, 'availableQuantity');
2446
+ account['used'] = this.safeString(response, 'lockedQuantity');
2447
+ result[code] = account;
2448
+ return this.safeBalance(result);
2449
+ }
2450
+ parseBalance(response) {
2451
+ const result = {
2452
+ 'info': response,
2453
+ };
2454
+ for (let i = 0; i < response.length; i++) {
2455
+ const balance = response[i];
2456
+ const symbol = this.safeString(balance, 'assetSymbol');
2457
+ const code = this.safeCurrencyCode(symbol);
2458
+ const account = this.account();
2459
+ account['total'] = this.safeString(balance, 'availableQuantity');
2460
+ account['used'] = this.safeString(balance, 'lockedQuantity');
2461
+ result[code] = account;
2462
+ }
2463
+ return this.safeBalance(result);
2464
+ }
2465
+ /**
2466
+ * @method
2467
+ * @name bullish#fetchPositions
2468
+ * @description fetch all open positions
2469
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/derivatives-positions
2470
+ * @param {string[]|undefined} symbols list of unified market symbols
2471
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2472
+ * @param {string} params.tradingAccountId the trading account id
2473
+ * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
2474
+ */
2475
+ async fetchPositions(symbols = undefined, params = {}) {
2476
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2477
+ const tradingAccountId = await this.loadAccount(params);
2478
+ const request = {
2479
+ 'tradingAccountId': tradingAccountId,
2480
+ };
2481
+ const response = await this.privateGetV1DerivativesPositions(this.extend(request, params));
2482
+ //
2483
+ // [
2484
+ // {
2485
+ // "tradingAccountId": "111000000000001",
2486
+ // "symbol": "BTC-USDC-PERP",
2487
+ // "side": "BUY",
2488
+ // "quantity": "1.00000000",
2489
+ // "notional": "1.0000",
2490
+ // "entryNotional": "1.0000",
2491
+ // "mtmPnl": "1.0000",
2492
+ // "reportedMtmPnl": "1.0000",
2493
+ // "reportedFundingPnl": "1.0000",
2494
+ // "realizedPnl": "1.0000",
2495
+ // "settlementAssetSymbol": "USDC",
2496
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
2497
+ // "createdAtTimestamp": "1621490985000",
2498
+ // "updatedAtDatetime": "2021-05-20T01:01:01.000Z",
2499
+ // "updatedAtTimestamp": "1621490985000"
2500
+ // }
2501
+ // ]
2502
+ //
2503
+ const results = this.parsePositions(response, symbols);
2504
+ return this.filterByArrayPositions(results, 'symbol', symbols, false);
2505
+ }
2506
+ parsePosition(position, market = undefined) {
2507
+ //
2508
+ // [
2509
+ // {
2510
+ // "tradingAccountId": "111000000000001",
2511
+ // "symbol": "BTC-USDC-PERP",
2512
+ // "side": "BUY",
2513
+ // "quantity": "1.00000000",
2514
+ // "notional": "1.0000",
2515
+ // "entryNotional": "1.0000",
2516
+ // "mtmPnl": "1.0000",
2517
+ // "reportedMtmPnl": "1.0000",
2518
+ // "reportedFundingPnl": "1.0000",
2519
+ // "realizedPnl": "1.0000",
2520
+ // "settlementAssetSymbol": "USDC",
2521
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z",
2522
+ // "createdAtTimestamp": "1621490985000",
2523
+ // "updatedAtDatetime": "2021-05-20T01:01:01.000Z",
2524
+ // "updatedAtTimestamp": "1621490985000"
2525
+ // }
2526
+ // ]
2527
+ //
2528
+ market = this.safeMarket(this.safeString(position, 'symbol'), market);
2529
+ const symbol = market['symbol'];
2530
+ const timestamp = this.safeInteger(position, 'createdAtTimestamp');
2531
+ const side = this.safeString(position, 'side');
2532
+ return this.safePosition({
2533
+ 'info': position,
2534
+ 'id': undefined,
2535
+ 'symbol': symbol,
2536
+ 'timestamp': timestamp,
2537
+ 'datetime': this.iso8601(timestamp),
2538
+ 'lastUpdateTimestamp': this.safeInteger(position, 'updatedAtTimestamp'),
2539
+ 'hedged': undefined,
2540
+ 'side': this.parsePositionSide(side),
2541
+ 'contracts': this.safeNumber(position, 'quantity'),
2542
+ 'contractSize': undefined,
2543
+ 'entryPrice': undefined,
2544
+ 'markPrice': undefined,
2545
+ 'lastPrice': undefined,
2546
+ 'notional': this.safeNumber(position, 'notional'),
2547
+ 'leverage': undefined,
2548
+ 'collateral': undefined,
2549
+ 'initialMargin': undefined,
2550
+ 'initialMarginPercentage': undefined,
2551
+ 'maintenanceMargin': undefined,
2552
+ 'maintenanceMarginPercentage': undefined,
2553
+ 'unrealizedPnl': undefined,
2554
+ 'liquidationPrice': undefined,
2555
+ 'marginMode': undefined,
2556
+ 'marginRatio': undefined,
2557
+ 'percentage': undefined,
2558
+ 'stopLossPrice': undefined,
2559
+ 'takeProfitPrice': undefined,
2560
+ });
2561
+ }
2562
+ parsePositionSide(side) {
2563
+ const sides = {
2564
+ 'BUY': 'long',
2565
+ 'SELL': 'short',
2566
+ };
2567
+ return this.safeString(sides, side, side);
2568
+ }
2569
+ /**
2570
+ * @method
2571
+ * @name bullish#fetchTransfers
2572
+ * @description fetch a history of internal transfers made on an account
2573
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/transfer
2574
+ * @param {string} code unified currency code of the currency transferred
2575
+ * @param {int} [since] the earliest time in ms to fetch transfers for
2576
+ * @param {int} [limit] the maximum number of transfer structures to retrieve
2577
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2578
+ * @param {int} params.until the latest time in ms to fetch transfers for (default time now)
2579
+ * @param {string} params.tradingAccountId the trading account id
2580
+ * @returns {object[]} a list of [transfer structures]{@link https://docs.ccxt.com/#/?id=transfer-structure}
2581
+ */
2582
+ async fetchTransfers(code = undefined, since = undefined, limit = undefined, params = {}) {
2583
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2584
+ const tradingAccountId = await this.loadAccount(params);
2585
+ const maxLimit = 100;
2586
+ let paginate = false;
2587
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchTransfers', 'paginate');
2588
+ if (paginate) {
2589
+ params = this.handlePaginationParams('fetchTransfers', since, params);
2590
+ return await this.fetchPaginatedCallDynamic('fetchTransfers', code, since, limit, params, maxLimit);
2591
+ }
2592
+ const request = {
2593
+ 'tradingAccountId': tradingAccountId,
2594
+ };
2595
+ let currency = undefined;
2596
+ if (code !== undefined) {
2597
+ currency = this.currency(code);
2598
+ request['assetSymbol'] = currency['id'];
2599
+ }
2600
+ const until = this.safeInteger(params, 'until');
2601
+ if ((since === undefined) && (until === undefined)) {
2602
+ // since and until are mandatory for this endpoint, set until to now if both are undefined
2603
+ const now = this.milliseconds();
2604
+ params = this.extend(params, { 'until': now });
2605
+ }
2606
+ params = this.handleSinceAndUntil(since, params);
2607
+ if (limit !== undefined) {
2608
+ request['_pageSize'] = this.getClosestLimit(limit);
2609
+ }
2610
+ const response = await this.privateGetV1HistoryTransfer(this.extend(request, params));
2611
+ //
2612
+ // [
2613
+ // {
2614
+ // "requestId": "1",
2615
+ // "toTradingAccountId": "111000000000001",
2616
+ // "fromTradingAccountId": "121000000000001",
2617
+ // "assetSymbol": "BTC",
2618
+ // "quantity": "1.00000000",
2619
+ // "status": "CLOSED",
2620
+ // "statusReasonCode": "6002",
2621
+ // "statusReason": "Executed",
2622
+ // "createdAtTimestamp": "1621490985000",
2623
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z"
2624
+ // }
2625
+ // ]
2626
+ //
2627
+ return this.parseTransfers(response, currency, since, limit);
2628
+ }
2629
+ /**
2630
+ * @method
2631
+ * @name bullish#transfer
2632
+ * @description transfer currency internally between wallets on the same account
2633
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#post-/v1/command-commandType-V1TransferAsset
2634
+ * @param {string} code unified currency codeåå
2635
+ * @param {float} amount amount to transfer
2636
+ * @param {string} fromAccount account ID to transfer from
2637
+ * @param {string} toAccount account ID to transfer to
2638
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2639
+ * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
2640
+ */
2641
+ async transfer(code, amount, fromAccount, toAccount, params = {}) {
2642
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2643
+ // todo check this method properly
2644
+ const currency = this.currency(code);
2645
+ const request = {
2646
+ 'commandType': 'V2TransferAsset',
2647
+ 'assetSymbol': currency['id'],
2648
+ 'quantity': this.currencyToPrecision(code, amount),
2649
+ 'fromTradingAccountId': fromAccount,
2650
+ 'toTradingAccountId': toAccount,
2651
+ };
2652
+ const response = await this.privatePostV2Command(this.extend(request, params));
2653
+ //
2654
+ // {
2655
+ // "message": "Command acknowledged - TransferAsset",
2656
+ // "requestId": "633909659774222336"
2657
+ // }
2658
+ //
2659
+ const transferOptions = this.safeDict(this.options, 'transfer', {});
2660
+ const fillResponseFromRequest = this.safeBool(transferOptions, 'fillResponseFromRequest', true);
2661
+ const transfer = this.parseTransfer(response, currency);
2662
+ if (fillResponseFromRequest) {
2663
+ transfer['fromAccount'] = fromAccount;
2664
+ transfer['toAccount'] = toAccount;
2665
+ transfer['amount'] = amount;
2666
+ transfer['currency'] = code;
2667
+ }
2668
+ return transfer;
2669
+ }
2670
+ parseTransfer(transfer, currency = undefined) {
2671
+ //
2672
+ // fetchTransfers
2673
+ // {
2674
+ // "requestId": "1",
2675
+ // "toTradingAccountId": "111000000000001",
2676
+ // "fromTradingAccountId": "121000000000001",
2677
+ // "assetSymbol": "BTC",
2678
+ // "quantity": "1.00000000",
2679
+ // "status": "CLOSED",
2680
+ // "statusReasonCode": "6002",
2681
+ // "statusReason": "Executed",
2682
+ // "createdAtTimestamp": "1621490985000",
2683
+ // "createdAtDatetime": "2021-05-20T01:01:01.000Z"
2684
+ // }
2685
+ //
2686
+ // transfer
2687
+ // {
2688
+ // "message": "Command acknowledged - TransferAsset",
2689
+ // "requestId": "633909659774222336"
2690
+ // }
2691
+ //
2692
+ const timestamp = this.safeInteger(transfer, 'createdAtTimestamp');
2693
+ const currencyId = this.safeString(transfer, 'assetSymbol');
2694
+ let status = this.safeString(transfer, 'status');
2695
+ if (status === undefined) {
2696
+ status = this.safeString(transfer, 'message');
2697
+ }
2698
+ return {
2699
+ 'id': this.safeString(transfer, 'requestId'),
2700
+ 'timestamp': timestamp,
2701
+ 'datetime': this.iso8601(timestamp),
2702
+ 'currency': this.safeCurrencyCode(currencyId, currency),
2703
+ 'amount': this.safeNumber(transfer, 'quantity'),
2704
+ 'fromAccount': this.safeString(transfer, 'fromTradingAccountId'),
2705
+ 'toAccount': this.safeString(transfer, 'toTradingAccountId'),
2706
+ 'status': this.parseTransferStatus(status),
2707
+ 'info': transfer,
2708
+ };
2709
+ }
2710
+ parseTransferStatus(status) {
2711
+ const statuses = {
2712
+ 'CLOSED': 'ok',
2713
+ 'OPEN': 'pending',
2714
+ 'REJECTED': 'failed',
2715
+ 'Command acknowledged - TransferAsset': 'ok',
2716
+ };
2717
+ return this.safeString(statuses, status, status);
2718
+ }
2719
+ /**
2720
+ * @method
2721
+ * @name bullish#fetchBorrowRateHistory
2722
+ * @description retrieves a history of a currencies borrow interest rate at specific time slots
2723
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#get-/v1/history/borrow-interest
2724
+ * @param {string} code unified currency code
2725
+ * @param {int} [since] timestamp for the earliest borrow rate
2726
+ * @param {int} [limit] the maximum number of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} to retrieve
2727
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2728
+ * @param {int} params.until the latest time in ms to fetch entries for
2729
+ * @param {string} params.tradingAccountId the trading account id
2730
+ * @returns {object[]} an array of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure}
2731
+ */
2732
+ async fetchBorrowRateHistory(code, since = undefined, limit = undefined, params = {}) {
2733
+ await Promise.all([this.loadMarkets(), this.handleToken()]);
2734
+ const tradingAccountId = await this.loadAccount(params);
2735
+ const currency = this.currency(code);
2736
+ let request = {
2737
+ 'assetSymbol': currency['id'],
2738
+ 'tradingAccountId': tradingAccountId,
2739
+ };
2740
+ const now = this.milliseconds();
2741
+ let startTimestamp = since;
2742
+ [request, params] = this.handleUntilOption('createdAtDatetime[lte]', request, params);
2743
+ let until = this.safeInteger(request, 'createdAtDatetime[lte]');
2744
+ // current endpoint requires both since and until parameters
2745
+ if (startTimestamp === undefined) {
2746
+ startTimestamp = now - 1000 * 60 * 60 * 24 * 90; // Only the last 90 days of data is available for querying
2747
+ }
2748
+ if (until === undefined) {
2749
+ until = now;
2750
+ }
2751
+ request['createdAtDatetime[gte]'] = this.iso8601(startTimestamp);
2752
+ request['createdAtDatetime[lte]'] = this.iso8601(until);
2753
+ const response = await this.privateGetV1HistoryBorrowInterest(this.extend(request, params));
2754
+ //
2755
+ // [
2756
+ // {
2757
+ // "assetId": "1",
2758
+ // "assetSymbol": "BTC",
2759
+ // "borrowedQuantity": "1.00000000",
2760
+ // "totalBorrowedQuantity": "1.00000000",
2761
+ // "createdAtDatetime": "2020-08-21T08:00:00.000Z",
2762
+ // "createdAtTimestamp": "1621490985000"
2763
+ // }
2764
+ // ]
2765
+ //
2766
+ return this.parseBorrowRateHistory(response, code, since, limit);
2767
+ }
2768
+ parseBorrowRate(info, currency = undefined) {
2769
+ //
2770
+ // {
2771
+ // "assetId": "1",
2772
+ // "assetSymbol": "BTC",
2773
+ // "borrowedQuantity": "1.00000000",
2774
+ // "totalBorrowedQuantity": "1.00000000",
2775
+ // "createdAtDatetime": "2020-08-21T08:00:00.000Z",
2776
+ // "createdAtTimestamp": "1621490985000"
2777
+ // }
2778
+ //
2779
+ const timestamp = this.safeInteger(info, 'createdAtTimestamp');
2780
+ const currencyId = this.safeString(info, 'assetSymbol');
2781
+ return {
2782
+ 'currency': this.safeCurrencyCode(currencyId, currency),
2783
+ 'rate': this.safeNumber(info, 'borrowedQuantity'),
2784
+ 'period': 86400000,
2785
+ 'timestamp': timestamp,
2786
+ 'datetime': this.iso8601(timestamp),
2787
+ 'info': info,
2788
+ };
2789
+ }
2790
+ getTimestamp() {
2791
+ return this.milliseconds() - this.options['timeDifference'];
2792
+ }
2793
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
2794
+ const request = this.omit(params, this.extractParams(path));
2795
+ const endpoint = '/' + this.implodeParams(path, params);
2796
+ let url = this.urls['api'][api] + endpoint;
2797
+ if (api === 'private') {
2798
+ this.checkRequiredCredentials();
2799
+ const nonce = this.microseconds().toString();
2800
+ const timestamp = this.getTimestamp().toString();
2801
+ if (method === 'GET') {
2802
+ const payload = timestamp + nonce + method + '/trading-api/' + path;
2803
+ const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha256, 'hex');
2804
+ headers = {
2805
+ 'BX-TIMESTAMP': timestamp,
2806
+ 'BX-NONCE': nonce,
2807
+ 'BX-SIGNATURE': signature,
2808
+ };
2809
+ }
2810
+ else if (method === 'POST') {
2811
+ body = this.json(params);
2812
+ const payload = timestamp + nonce + method + '/trading-api/' + path + body;
2813
+ const digest = this.hash(this.encode(payload), sha256, 'hex');
2814
+ const signature = this.hmac(this.encode(digest), this.encode(this.secret), sha256, 'hex');
2815
+ headers = {
2816
+ 'BX-TIMESTAMP': timestamp,
2817
+ 'BX-NONCE': nonce,
2818
+ 'BX-SIGNATURE': signature,
2819
+ 'Content-Type': 'application/json',
2820
+ };
2821
+ headers['Content-Type'] = 'application/json';
2822
+ const rateLimitToken = this.safeString(request, 'rateLimitToken');
2823
+ if (rateLimitToken !== undefined) {
2824
+ headers['BX-RATE-LIMIT-TOKEN'] = rateLimitToken;
2825
+ }
2826
+ }
2827
+ if (path === 'v1/users/hmac/login') {
2828
+ headers['BX-PUBLIC-KEY'] = this.apiKey;
2829
+ }
2830
+ else {
2831
+ const token = this.token;
2832
+ if ((token === undefined)) {
2833
+ throw new AuthenticationError(this.id + ' requires a token, please call signIn() first');
2834
+ }
2835
+ headers['Authorization'] = 'Bearer ' + token;
2836
+ // headers['BX-NONCE-WINDOW-ENABLED'] = 'false'; // default is false
2837
+ }
2838
+ }
2839
+ if (method === 'GET') {
2840
+ const query = this.urlencode(request);
2841
+ if (query.length) {
2842
+ url += '?' + query;
2843
+ }
2844
+ }
2845
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
2846
+ }
2847
+ /**
2848
+ * @method
2849
+ * @name bullish#signIn
2850
+ * @description sign in, must be called prior to using other authenticated methods
2851
+ * @see https://api.exchange.bullish.com/docs/api/rest/trading-api/v2/#overview--add-authenticated-request-header
2852
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2853
+ * @returns response from exchange
2854
+ */
2855
+ async signIn(params = {}) {
2856
+ const response = await this.privateGetV1UsersHmacLogin(params);
2857
+ //
2858
+ // {
2859
+ // "authorizer": "113363EFA2CA00007368524E02000000",
2860
+ // "ownerAuthorizer": "113363EFA2CA00007368524E02000000",
2861
+ // "token": "eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJiMXgtYXV0aC1zZXJ2aWNlIiwic3ViIjoiNDY0OTc4MzAiLCJleHAiOjE3NDczMzgzNDMsIlNUQUdFIjoiQVVUSEVOVElDQVRFRF9XSVRIX0JMT0NLQ0hBSU4ifQ.5FSyrihzc1wsJqAY8pVX36Y4ZXg3HopLJypPEbHg5bBK8FbL_oLxkj6zM_iOYL2a1x6-ICG0pQjr8hF_k8Yg-w"
2862
+ // }
2863
+ //
2864
+ const token = this.safeString(response, 'token');
2865
+ const authorizer = this.safeString(response, 'authorizer');
2866
+ this.options['authorizer'] = authorizer;
2867
+ this.token = token;
2868
+ this.options['tokenExpires'] = this.sum(this.milliseconds(), 1000 * 60 * 60 * 24); // token expires in 24 hours
2869
+ return token;
2870
+ }
2871
+ async handleToken(params = {}) {
2872
+ const now = this.milliseconds();
2873
+ const token = this.token;
2874
+ const tokenExpires = this.safeInteger(this.options, 'tokenExpires');
2875
+ if ((token === undefined) || (tokenExpires === undefined) || (now > tokenExpires)) {
2876
+ return await this.signIn();
2877
+ }
2878
+ else {
2879
+ return this.token;
2880
+ }
2881
+ }
2882
+ handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2883
+ if (response === undefined) {
2884
+ return undefined; // fallback to default error handler
2885
+ }
2886
+ //
2887
+ // {
2888
+ // "type": "HttpInvalidParameterException",
2889
+ // "message": "HTTP_INVALID_PARAMETER: '100m' is not a valid time bucket"
2890
+ // }
2891
+ //
2892
+ // {
2893
+ // "message": "Order size outside valid range",
2894
+ // "raw": null,
2895
+ // "errorCode": 6023,
2896
+ // "errorCodeName": "ORDER_SIZE_OUTSIDE_VALID_RANGE"
2897
+ // }
2898
+ //
2899
+ const code = this.safeString(response, 'errorCode');
2900
+ const type = this.safeString(response, 'type');
2901
+ if ((code !== undefined && code !== '0' && code !== '1001') || (type !== undefined && type === 'HttpInvalidParameterException')) {
2902
+ let message = '';
2903
+ const errorCodeName = this.safeString(response, 'errorCodeName');
2904
+ if (errorCodeName !== undefined) {
2905
+ message = errorCodeName;
2906
+ }
2907
+ else {
2908
+ message = type;
2909
+ }
2910
+ const feedback = this.id + ' ' + body;
2911
+ this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
2912
+ this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
2913
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
2914
+ throw new ExchangeError(feedback); // unknown message
2915
+ }
2916
+ return undefined;
2917
+ }
2918
+ }