ccxt 4.2.88 → 4.2.90

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 (164) hide show
  1. package/README.md +3 -3
  2. package/build.sh +2 -2
  3. package/dist/ccxt.browser.js +1062 -241
  4. package/dist/ccxt.browser.min.js +6 -4
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/ascendex.js +3 -0
  7. package/dist/cjs/src/base/Exchange.js +53 -7
  8. package/dist/cjs/src/base/functions/crypto.js +37 -0
  9. package/dist/cjs/src/base/functions/rsa.js +19 -4
  10. package/dist/cjs/src/binance.js +92 -9
  11. package/dist/cjs/src/bingx.js +101 -1
  12. package/dist/cjs/src/bitfinex2.js +1 -0
  13. package/dist/cjs/src/bitflyer.js +2 -0
  14. package/dist/cjs/src/bitget.js +9 -1
  15. package/dist/cjs/src/bitmart.js +2 -0
  16. package/dist/cjs/src/bitmex.js +1 -0
  17. package/dist/cjs/src/bitrue.js +1 -0
  18. package/dist/cjs/src/bitstamp.js +83 -99
  19. package/dist/cjs/src/blofin.js +2 -0
  20. package/dist/cjs/src/bybit.js +63 -0
  21. package/dist/cjs/src/coinbase.js +48 -24
  22. package/dist/cjs/src/coinbaseinternational.js +1 -0
  23. package/dist/cjs/src/coinex.js +102 -8
  24. package/dist/cjs/src/coinsph.js +2 -0
  25. package/dist/cjs/src/cryptocom.js +1 -0
  26. package/dist/cjs/src/delta.js +1 -0
  27. package/dist/cjs/src/digifinex.js +3 -0
  28. package/dist/cjs/src/exmo.js +1 -0
  29. package/dist/cjs/src/gate.js +4 -0
  30. package/dist/cjs/src/gemini.js +10 -9
  31. package/dist/cjs/src/hitbtc.js +3 -0
  32. package/dist/cjs/src/htx.js +3 -0
  33. package/dist/cjs/src/hyperliquid.js +1 -0
  34. package/dist/cjs/src/kucoin.js +40 -15
  35. package/dist/cjs/src/kucoinfutures.js +34 -3
  36. package/dist/cjs/src/latoken.js +4 -0
  37. package/dist/cjs/src/lbank.js +3 -1
  38. package/dist/cjs/src/luno.js +2 -0
  39. package/dist/cjs/src/mexc.js +55 -6
  40. package/dist/cjs/src/okx.js +159 -8
  41. package/dist/cjs/src/phemex.js +1 -0
  42. package/dist/cjs/src/pro/bitget.js +2 -0
  43. package/dist/cjs/src/static_dependencies/noble-curves/p256.js +48 -0
  44. package/dist/cjs/src/timex.js +2 -0
  45. package/dist/cjs/src/woo.js +1 -0
  46. package/js/ccxt.d.ts +1 -1
  47. package/js/ccxt.js +1 -1
  48. package/js/src/abstract/bingx.d.ts +2 -0
  49. package/js/src/abstract/bybit.d.ts +2 -0
  50. package/js/src/ascendex.d.ts +3 -3
  51. package/js/src/ascendex.js +3 -0
  52. package/js/src/base/Exchange.d.ts +13 -8
  53. package/js/src/base/Exchange.js +53 -7
  54. package/js/src/base/functions/crypto.js +37 -0
  55. package/js/src/base/functions/rsa.d.ts +1 -1
  56. package/js/src/base/functions/rsa.js +21 -5
  57. package/js/src/base/types.d.ts +35 -1
  58. package/js/src/bigone.d.ts +2 -2
  59. package/js/src/binance.d.ts +6 -15
  60. package/js/src/binance.js +92 -9
  61. package/js/src/bingx.d.ts +3 -2
  62. package/js/src/bingx.js +101 -1
  63. package/js/src/bit2c.d.ts +2 -2
  64. package/js/src/bitbank.d.ts +2 -2
  65. package/js/src/bitfinex.d.ts +2 -2
  66. package/js/src/bitfinex2.d.ts +3 -3
  67. package/js/src/bitfinex2.js +1 -0
  68. package/js/src/bitflyer.d.ts +2 -7
  69. package/js/src/bitflyer.js +2 -0
  70. package/js/src/bitget.d.ts +6 -9
  71. package/js/src/bitget.js +9 -1
  72. package/js/src/bitmart.d.ts +4 -14
  73. package/js/src/bitmart.js +2 -0
  74. package/js/src/bitmex.d.ts +2 -2
  75. package/js/src/bitmex.js +1 -0
  76. package/js/src/bitopro.d.ts +3 -3
  77. package/js/src/bitrue.d.ts +2 -2
  78. package/js/src/bitrue.js +1 -0
  79. package/js/src/bitso.d.ts +2 -2
  80. package/js/src/bitstamp.d.ts +7 -19
  81. package/js/src/bitstamp.js +83 -99
  82. package/js/src/bitteam.d.ts +2 -2
  83. package/js/src/bitvavo.d.ts +3 -3
  84. package/js/src/bl3p.d.ts +2 -2
  85. package/js/src/blockchaincom.d.ts +2 -2
  86. package/js/src/blofin.d.ts +2 -7
  87. package/js/src/blofin.js +2 -0
  88. package/js/src/bybit.d.ts +7 -15
  89. package/js/src/bybit.js +63 -0
  90. package/js/src/cex.d.ts +3 -3
  91. package/js/src/coinbase.d.ts +2 -2
  92. package/js/src/coinbase.js +48 -24
  93. package/js/src/coinbaseinternational.d.ts +2 -2
  94. package/js/src/coinbaseinternational.js +1 -0
  95. package/js/src/coinbasepro.d.ts +3 -3
  96. package/js/src/coincheck.d.ts +2 -2
  97. package/js/src/coinex.d.ts +7 -19
  98. package/js/src/coinex.js +102 -8
  99. package/js/src/coinlist.d.ts +3 -3
  100. package/js/src/coinmate.d.ts +2 -9
  101. package/js/src/coinmetro.d.ts +2 -2
  102. package/js/src/coinone.d.ts +2 -2
  103. package/js/src/coinsph.d.ts +4 -14
  104. package/js/src/coinsph.js +2 -0
  105. package/js/src/cryptocom.js +1 -0
  106. package/js/src/currencycom.d.ts +3 -3
  107. package/js/src/delta.d.ts +2 -2
  108. package/js/src/delta.js +1 -0
  109. package/js/src/deribit.d.ts +3 -3
  110. package/js/src/digifinex.d.ts +4 -14
  111. package/js/src/digifinex.js +3 -0
  112. package/js/src/exmo.d.ts +3 -3
  113. package/js/src/exmo.js +1 -0
  114. package/js/src/gate.d.ts +6 -9
  115. package/js/src/gate.js +4 -0
  116. package/js/src/gemini.d.ts +3 -3
  117. package/js/src/gemini.js +10 -9
  118. package/js/src/hitbtc.d.ts +5 -15
  119. package/js/src/hitbtc.js +3 -0
  120. package/js/src/hollaex.d.ts +3 -3
  121. package/js/src/htx.d.ts +4 -14
  122. package/js/src/htx.js +3 -0
  123. package/js/src/huobijp.d.ts +2 -2
  124. package/js/src/hyperliquid.d.ts +2 -2
  125. package/js/src/hyperliquid.js +1 -0
  126. package/js/src/idex.d.ts +3 -3
  127. package/js/src/independentreserve.d.ts +2 -2
  128. package/js/src/kraken.d.ts +3 -10
  129. package/js/src/kucoin.d.ts +3 -10
  130. package/js/src/kucoin.js +40 -15
  131. package/js/src/kucoinfutures.d.ts +2 -9
  132. package/js/src/kucoinfutures.js +34 -3
  133. package/js/src/kuna.d.ts +2 -2
  134. package/js/src/latoken.d.ts +7 -8
  135. package/js/src/latoken.js +4 -0
  136. package/js/src/lbank.d.ts +4 -9
  137. package/js/src/lbank.js +3 -1
  138. package/js/src/luno.d.ts +2 -7
  139. package/js/src/luno.js +2 -0
  140. package/js/src/lykke.d.ts +2 -2
  141. package/js/src/mexc.d.ts +3 -3
  142. package/js/src/mexc.js +55 -6
  143. package/js/src/ndax.d.ts +2 -2
  144. package/js/src/oceanex.d.ts +2 -2
  145. package/js/src/okcoin.d.ts +2 -2
  146. package/js/src/okx.d.ts +5 -14
  147. package/js/src/okx.js +159 -8
  148. package/js/src/onetrading.d.ts +3 -3
  149. package/js/src/phemex.d.ts +2 -2
  150. package/js/src/phemex.js +1 -0
  151. package/js/src/poloniex.d.ts +3 -3
  152. package/js/src/pro/bitget.js +2 -0
  153. package/js/src/pro/bitvavo.d.ts +2 -2
  154. package/js/src/probit.d.ts +2 -2
  155. package/js/src/timex.d.ts +4 -14
  156. package/js/src/timex.js +2 -0
  157. package/js/src/upbit.d.ts +2 -9
  158. package/js/src/wazirx.d.ts +2 -2
  159. package/js/src/whitebit.d.ts +3 -3
  160. package/js/src/woo.d.ts +3 -3
  161. package/js/src/woo.js +1 -0
  162. package/js/src/yobit.d.ts +2 -2
  163. package/package.json +1 -1
  164. package/skip-tests.json +6 -1
@@ -8,12 +8,19 @@
8
8
  import { hmac as _hmac } from '../../static_dependencies/noble-hashes/hmac.js';
9
9
  import { base16, base64, base58 } from '../../static_dependencies/scure-base/index.js';
10
10
  import { Base64 } from '../../static_dependencies/jsencrypt/lib/asn1js/base64.js';
11
+ import { ASN1 } from "../../static_dependencies/jsencrypt/lib/asn1js/asn1.js";
12
+ import { secp256k1 } from '../../static_dependencies/noble-curves/secp256k1.js';
13
+ import { P256 } from '../../static_dependencies/noble-curves/p256.js';
11
14
  /* ------------------------------------------------------------------------ */
12
15
  const encoders = {
13
16
  binary: x => x,
14
17
  hex: base16.encode,
15
18
  base64: base64.encode,
16
19
  };
20
+ const supportedCurve = {
21
+ '1.3.132.0.10': secp256k1,
22
+ '1.2.840.10045.3.1.7': P256,
23
+ };
17
24
  /* ............................................. */
18
25
  const hash = (request, hash, digest = 'hex') => {
19
26
  const binary = hash(request);
@@ -29,6 +36,36 @@ function ecdsa(request, secret, curve, prehash = null) {
29
36
  if (prehash) {
30
37
  request = hash(request, prehash, 'hex');
31
38
  }
39
+ if (typeof secret === 'string' && secret.length > 64) {
40
+ // decode pem key
41
+ if (secret.startsWith('-----BEGIN EC PRIVATE KEY-----')) {
42
+ const der = Base64.unarmor(secret);
43
+ let asn1 = ASN1.decode(der);
44
+ if (asn1.sub.length === 4) {
45
+ // ECPrivateKey ::= SEQUENCE {
46
+ // version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
47
+ // privateKey OCTET STRING,
48
+ // parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
49
+ // publicKey [1] BIT STRING OPTIONAL
50
+ // }
51
+ if (typeof asn1.sub[2].sub !== null && asn1.sub[2].sub.length > 0) {
52
+ const oid = asn1.sub[2].sub[0].content(undefined);
53
+ if (supportedCurve[oid] === undefined)
54
+ throw new Error('Unsupported curve');
55
+ curve = supportedCurve[oid];
56
+ }
57
+ secret = asn1.sub[1].getHexStringValue();
58
+ }
59
+ else {
60
+ // maybe return false
61
+ throw new Error('Unsupported key format');
62
+ }
63
+ }
64
+ else {
65
+ // maybe return false
66
+ throw new Error('Unsupported key format');
67
+ }
68
+ }
32
69
  const signature = curve.sign(request, secret);
33
70
  return {
34
71
  'r': signature.r.toString(16),
@@ -1,4 +1,4 @@
1
1
  import { CHash } from '../../static_dependencies/noble-hashes/utils.js';
2
2
  declare function rsa(request: string, secret: string, hash: CHash): string | false;
3
- declare function jwt(request: {}, secret: Uint8Array, hash: CHash, isRSA?: boolean): string;
3
+ declare function jwt(request: {}, secret: Uint8Array, hash: CHash, isRSA?: boolean, opts?: {}): string;
4
4
  export { rsa, jwt };
@@ -6,8 +6,10 @@
6
6
 
7
7
  import { JSEncrypt } from "../../static_dependencies/jsencrypt/JSEncrypt.js";
8
8
  import { base16, utf8 } from '../../static_dependencies/scure-base/index.js';
9
- import { urlencodeBase64, stringToBase64 } from './encode.js';
9
+ import { urlencodeBase64, stringToBase64, base16ToBinary, binaryToBase64 } from './encode.js';
10
10
  import { hmac } from './crypto.js';
11
+ import { P256 } from '../../static_dependencies/noble-curves/p256.js';
12
+ import { ecdsa } from '../../base/functions/crypto.js';
11
13
  function rsa(request, secret, hash) {
12
14
  const RSA = new JSEncrypt();
13
15
  const digester = (input) => base16.encode(hash(input));
@@ -15,9 +17,17 @@ function rsa(request, secret, hash) {
15
17
  const name = (hash.create()).constructor.name.toLowerCase();
16
18
  return RSA.sign(request, digester, name);
17
19
  }
18
- function jwt(request, secret, hash, isRSA = false) {
19
- const alg = (isRSA ? 'RS' : 'HS') + (hash.outputLen * 8);
20
- const encodedHeader = urlencodeBase64(stringToBase64(JSON.stringify({ 'alg': alg, 'typ': 'JWT' })));
20
+ function jwt(request, secret, hash, isRSA = false, opts = {}) {
21
+ let alg = (isRSA ? 'RS' : 'HS') + (hash.outputLen * 8);
22
+ if (opts['alg']) {
23
+ alg = opts['alg'].toUpperCase();
24
+ }
25
+ const header = Object.assign({ 'alg': alg, 'typ': 'JWT' }, opts);
26
+ if (header['iat'] !== undefined) {
27
+ request['iat'] = header['iat'];
28
+ delete header['iat'];
29
+ }
30
+ const encodedHeader = urlencodeBase64(stringToBase64(JSON.stringify(header)));
21
31
  const encodedData = urlencodeBase64(stringToBase64(JSON.stringify(request)));
22
32
  const token = [encodedHeader, encodedData].join('.');
23
33
  const algoType = alg.slice(0, 2);
@@ -25,9 +35,15 @@ function jwt(request, secret, hash, isRSA = false) {
25
35
  if (algoType === 'HS') {
26
36
  signature = urlencodeBase64(hmac(token, secret, hash, 'base64'));
27
37
  }
28
- else if (algoType === 'RS') {
38
+ else if (isRSA || algoType === 'RS') {
29
39
  signature = urlencodeBase64(rsa(token, utf8.encode(secret), hash));
30
40
  }
41
+ else if (algoType === 'ES') {
42
+ const signedHash = ecdsa(token, utf8.encode(secret), P256, hash);
43
+ const r = (signedHash.r.length === 64) ? signedHash.r : '0' + signedHash.r;
44
+ const s = (signedHash.s.length === 64) ? signedHash.s : '0' + signedHash.s;
45
+ signature = urlencodeBase64(binaryToBase64(base16ToBinary(r + s)));
46
+ }
31
47
  return [token, signature].join('.');
32
48
  }
33
49
  export { rsa, jwt };
@@ -25,6 +25,14 @@ export interface FeeInterface {
25
25
  cost: Num;
26
26
  rate?: Num;
27
27
  }
28
+ export interface TradingFeeInterface {
29
+ info: any;
30
+ symbol: Str;
31
+ maker: Num;
32
+ taker: Num;
33
+ percentage: Bool;
34
+ tierBased: Bool;
35
+ }
28
36
  export declare type Fee = FeeInterface | undefined;
29
37
  export interface MarketInterface {
30
38
  id: string;
@@ -171,8 +179,29 @@ export interface Tickers extends Dictionary<Ticker> {
171
179
  export interface CurrencyInterface {
172
180
  id: string;
173
181
  code: string;
174
- numericId?: number;
182
+ numericId?: Int;
175
183
  precision: number;
184
+ type?: Str;
185
+ margin?: Bool;
186
+ name?: Str;
187
+ active?: Bool;
188
+ deposit?: Bool;
189
+ withdraw?: Bool;
190
+ fee?: Num;
191
+ limits: {
192
+ amount: {
193
+ min?: Num;
194
+ max?: Num;
195
+ };
196
+ withdraw: {
197
+ min?: Num;
198
+ max?: Num;
199
+ };
200
+ };
201
+ networks: {
202
+ string: any;
203
+ };
204
+ info: any;
176
205
  }
177
206
  export interface Balance {
178
207
  free: Num;
@@ -436,6 +465,7 @@ export interface MarginModification {
436
465
  'info': any;
437
466
  'symbol': string;
438
467
  'type': 'add' | 'reduce' | 'set' | undefined;
468
+ 'marginMode': 'cross' | 'isolated' | undefined;
439
469
  'amount': Num;
440
470
  'total': Num;
441
471
  'code': Str;
@@ -447,6 +477,10 @@ export interface Leverages extends Dictionary<Leverage> {
447
477
  }
448
478
  export interface LastPrices extends Dictionary<LastPrice> {
449
479
  }
480
+ export interface Currencies extends Dictionary<CurrencyInterface> {
481
+ }
482
+ export interface TradingFees extends Dictionary<TradingFeeInterface> {
483
+ }
450
484
  export interface MarginModes extends Dictionary<MarginMode> {
451
485
  }
452
486
  export interface OptionChain extends Dictionary<Option> {
@@ -1,12 +1,12 @@
1
1
  import Exchange from './abstract/bigone.js';
2
- import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num } from './base/types.js';
2
+ import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num, Currencies } from './base/types.js';
3
3
  /**
4
4
  * @class bigone
5
5
  * @augments Exchange
6
6
  */
7
7
  export default class bigone extends Exchange {
8
8
  describe(): any;
9
- fetchCurrencies(params?: {}): Promise<{}>;
9
+ fetchCurrencies(params?: {}): Promise<Currencies>;
10
10
  fetchMarkets(params?: {}): Promise<Market[]>;
11
11
  parseTicker(ticker: any, market?: Market): Ticker;
12
12
  fetchTicker(symbol: string, params?: {}): Promise<Ticker>;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/binance.js';
2
- import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification, TradingFeeInterface, Currencies, TradingFees } from './base/types.js';
3
3
  /**
4
4
  * @class binance
5
5
  * @augments Exchange
@@ -16,7 +16,7 @@ export default class binance extends Exchange {
16
16
  currencyToPrecision(code: any, fee: any, networkCode?: any): any;
17
17
  nonce(): number;
18
18
  fetchTime(params?: {}): Promise<number>;
19
- fetchCurrencies(params?: {}): Promise<{}>;
19
+ fetchCurrencies(params?: {}): Promise<Currencies>;
20
20
  fetchMarkets(params?: {}): Promise<Market[]>;
21
21
  parseMarket(market: any): Market;
22
22
  parseBalanceHelper(entry: any): import("./base/types.js").BalanceAccount;
@@ -132,19 +132,9 @@ export default class binance extends Exchange {
132
132
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
133
133
  parseDepositWithdrawFee(fee: any, currency?: Currency): any;
134
134
  withdraw(code: string, amount: number, address: any, tag?: any, params?: {}): Promise<Transaction>;
135
- parseTradingFee(fee: any, market?: Market): {
136
- info: any;
137
- symbol: string;
138
- maker: number;
139
- taker: number;
140
- };
141
- fetchTradingFee(symbol: string, params?: {}): Promise<{
142
- info: any;
143
- symbol: string;
144
- maker: number;
145
- taker: number;
146
- }>;
147
- fetchTradingFees(params?: {}): Promise<{}>;
135
+ parseTradingFee(fee: any, market?: Market): TradingFeeInterface;
136
+ fetchTradingFee(symbol: string, params?: {}): Promise<TradingFeeInterface>;
137
+ fetchTradingFees(params?: {}): Promise<TradingFees>;
148
138
  futuresTransfer(code: string, amount: any, type: any, params?: {}): Promise<{
149
139
  info: any;
150
140
  id: string;
@@ -448,4 +438,5 @@ export default class binance extends Exchange {
448
438
  baseVolume: number;
449
439
  quoteVolume: any;
450
440
  };
441
+ fetchMarginAdjustmentHistory(symbol?: Str, type?: Str, since?: Num, limit?: Num, params?: {}): Promise<MarginModification[]>;
451
442
  }
package/js/src/binance.js CHANGED
@@ -101,6 +101,7 @@ export default class binance extends Exchange {
101
101
  'fetchLeverages': true,
102
102
  'fetchLeverageTiers': true,
103
103
  'fetchLiquidations': false,
104
+ 'fetchMarginAdjustmentHistory': true,
104
105
  'fetchMarginMode': 'emulated',
105
106
  'fetchMarginModes': true,
106
107
  'fetchMarketLeverageTiers': 'emulated',
@@ -8656,6 +8657,8 @@ export default class binance extends Exchange {
8656
8657
  'symbol': symbol,
8657
8658
  'maker': this.safeNumber2(fee, 'makerCommission', 'makerCommissionRate'),
8658
8659
  'taker': this.safeNumber2(fee, 'takerCommission', 'takerCommissionRate'),
8660
+ 'percentage': undefined,
8661
+ 'tierBased': undefined,
8659
8662
  };
8660
8663
  }
8661
8664
  async fetchTradingFee(symbol, params = {}) {
@@ -11229,21 +11232,37 @@ export default class binance extends Exchange {
11229
11232
  // "type": 1
11230
11233
  // }
11231
11234
  //
11235
+ // fetchMarginAdjustmentHistory
11236
+ //
11237
+ // {
11238
+ // symbol: "XRPUSDT",
11239
+ // type: "1",
11240
+ // deltaType: "TRADE",
11241
+ // amount: "2.57148240",
11242
+ // asset: "USDT",
11243
+ // time: "1711046271555",
11244
+ // positionSide: "BOTH",
11245
+ // clientTranId: ""
11246
+ // }
11247
+ //
11232
11248
  const rawType = this.safeInteger(data, 'type');
11233
- const resultType = (rawType === 1) ? 'add' : 'reduce';
11234
- const resultAmount = this.safeNumber(data, 'amount');
11235
11249
  const errorCode = this.safeString(data, 'code');
11236
- const status = (errorCode === '200') ? 'ok' : 'failed';
11250
+ const marketId = this.safeString(data, 'symbol');
11251
+ const timestamp = this.safeInteger(data, 'time');
11252
+ market = this.safeMarket(marketId, market, undefined, 'swap');
11253
+ const noErrorCode = errorCode === undefined;
11254
+ const success = errorCode === '200';
11237
11255
  return {
11238
11256
  'info': data,
11239
11257
  'symbol': market['symbol'],
11240
- 'type': resultType,
11241
- 'amount': resultAmount,
11258
+ 'type': (rawType === 1) ? 'add' : 'reduce',
11259
+ 'marginMode': 'isolated',
11260
+ 'amount': this.safeNumber(data, 'amount'),
11261
+ 'code': this.safeString(data, 'asset'),
11242
11262
  'total': undefined,
11243
- 'code': undefined,
11244
- 'status': status,
11245
- 'timestamp': undefined,
11246
- 'datetime': undefined,
11263
+ 'status': (success || noErrorCode) ? 'ok' : 'failed',
11264
+ 'timestamp': timestamp,
11265
+ 'datetime': this.iso8601(timestamp),
11247
11266
  };
11248
11267
  }
11249
11268
  async reduceMargin(symbol, amount, params = {}) {
@@ -12506,4 +12525,68 @@ export default class binance extends Exchange {
12506
12525
  'quoteVolume': undefined,
12507
12526
  };
12508
12527
  }
12528
+ async fetchMarginAdjustmentHistory(symbol = undefined, type = undefined, since = undefined, limit = undefined, params = {}) {
12529
+ /**
12530
+ * @method
12531
+ * @description fetches the history of margin added or reduced from contract isolated positions
12532
+ * @see https://binance-docs.github.io/apidocs/futures/en/#get-position-margin-change-history-trade
12533
+ * @see https://binance-docs.github.io/apidocs/delivery/en/#get-position-margin-change-history-trade
12534
+ * @param {string} symbol unified market symbol
12535
+ * @param {string} [type] "add" or "reduce"
12536
+ * @param {int} [since] timestamp in ms of the earliest change to fetch
12537
+ * @param {int} [limit] the maximum amount of changes to fetch
12538
+ * @param {object} params extra parameters specific to the exchange api endpoint
12539
+ * @param {int} [params.until] timestamp in ms of the latest change to fetch
12540
+ * @returns {object[]} a list of [margin structures]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
12541
+ */
12542
+ await this.loadMarkets();
12543
+ if (symbol === undefined) {
12544
+ throw new ArgumentsRequired(this.id + ' fetchMarginAdjustmentHistory () requires a symbol argument');
12545
+ }
12546
+ const market = this.market(symbol);
12547
+ const until = this.safeInteger(params, 'until');
12548
+ params = this.omit(params, 'until');
12549
+ const request = {
12550
+ 'symbol': market['id'],
12551
+ };
12552
+ if (type !== undefined) {
12553
+ request['type'] = (type === 'add') ? 1 : 2;
12554
+ }
12555
+ if (since !== undefined) {
12556
+ request['startTime'] = since;
12557
+ }
12558
+ if (limit !== undefined) {
12559
+ request['limit'] = limit;
12560
+ }
12561
+ if (until !== undefined) {
12562
+ request['endTime'] = until;
12563
+ }
12564
+ let response = undefined;
12565
+ if (market['linear']) {
12566
+ response = await this.fapiPrivateGetPositionMarginHistory(this.extend(request, params));
12567
+ }
12568
+ else if (market['inverse']) {
12569
+ response = await this.dapiPrivateGetPositionMarginHistory(this.extend(request, params));
12570
+ }
12571
+ else {
12572
+ throw new BadRequest(this.id + 'fetchMarginAdjustmentHistory () is not supported for markets of type ' + market['type']);
12573
+ }
12574
+ //
12575
+ // [
12576
+ // {
12577
+ // symbol: "XRPUSDT",
12578
+ // type: "1",
12579
+ // deltaType: "TRADE",
12580
+ // amount: "2.57148240",
12581
+ // asset: "USDT",
12582
+ // time: "1711046271555",
12583
+ // positionSide: "BOTH",
12584
+ // clientTranId: ""
12585
+ // }
12586
+ // ...
12587
+ // ]
12588
+ //
12589
+ const modifications = this.parseMarginModifications(response);
12590
+ return this.filterBySymbolSinceLimit(modifications, symbol, since, limit);
12591
+ }
12509
12592
  }
package/js/src/bingx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bingx.js';
2
- import type { TransferEntry, Int, OrderSide, OHLCV, FundingRateHistory, Order, OrderType, OrderRequest, Str, Trade, Balances, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Dict, Leverage, MarginMode, Num, MarginModification } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OHLCV, FundingRateHistory, Order, OrderType, OrderRequest, Str, Trade, Balances, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Dict, Leverage, MarginMode, Num, MarginModification, Currencies } from './base/types.js';
3
3
  /**
4
4
  * @class bingx
5
5
  * @augments Exchange
@@ -7,7 +7,7 @@ import type { TransferEntry, Int, OrderSide, OHLCV, FundingRateHistory, Order, O
7
7
  export default class bingx extends Exchange {
8
8
  describe(): any;
9
9
  fetchTime(params?: {}): Promise<number>;
10
- fetchCurrencies(params?: {}): Promise<{}>;
10
+ fetchCurrencies(params?: {}): Promise<Currencies>;
11
11
  fetchSpotMarkets(params: any): Promise<import("./base/types.js").MarketInterface[]>;
12
12
  fetchSwapMarkets(params: any): Promise<import("./base/types.js").MarketInterface[]>;
13
13
  parseMarket(market: any): Market;
@@ -80,6 +80,7 @@ export default class bingx extends Exchange {
80
80
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
81
81
  cancelOrders(ids: string[], symbol?: Str, params?: {}): Promise<any>;
82
82
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
83
+ fetchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
83
84
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
84
85
  fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
85
86
  transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
package/js/src/bingx.js CHANGED
@@ -63,6 +63,7 @@ export default class bingx extends Exchange {
63
63
  'fetchFundingRates': true,
64
64
  'fetchLeverage': true,
65
65
  'fetchLiquidations': false,
66
+ 'fetchMarginAdjustmentHistory': false,
66
67
  'fetchMarginMode': true,
67
68
  'fetchMarkets': true,
68
69
  'fetchMarkOHLCV': true,
@@ -72,6 +73,7 @@ export default class bingx extends Exchange {
72
73
  'fetchOpenOrders': true,
73
74
  'fetchOrder': true,
74
75
  'fetchOrderBook': true,
76
+ 'fetchOrders': true,
75
77
  'fetchPositionMode': true,
76
78
  'fetchPositions': true,
77
79
  'fetchTicker': true,
@@ -183,6 +185,7 @@ export default class bingx extends Exchange {
183
185
  'positionSide/dual': 1,
184
186
  'market/markPriceKlines': 1,
185
187
  'trade/batchCancelReplace': 1,
188
+ 'trade/fullOrder': 1,
186
189
  },
187
190
  'post': {
188
191
  'trade/cancelReplace': 1,
@@ -330,6 +333,7 @@ export default class bingx extends Exchange {
330
333
  'post': {
331
334
  'swap/trace/closeTrackOrder': 1,
332
335
  'swap/trace/setTPSL': 1,
336
+ 'spot/trader/sellOrder': 1,
333
337
  },
334
338
  },
335
339
  },
@@ -2760,7 +2764,7 @@ export default class bingx extends Exchange {
2760
2764
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2761
2765
  */
2762
2766
  if (symbol === undefined) {
2763
- throw new ArgumentsRequired(this.id + ' fetchOrders() requires a symbol argument');
2767
+ throw new ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
2764
2768
  }
2765
2769
  await this.loadMarkets();
2766
2770
  const market = this.market(symbol);
@@ -2831,6 +2835,101 @@ export default class bingx extends Exchange {
2831
2835
  const first = this.safeDict(data, 'order', data);
2832
2836
  return this.parseOrder(first, market);
2833
2837
  }
2838
+ async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2839
+ /**
2840
+ * @method
2841
+ * @name bingx#fetchOrders
2842
+ * @description fetches information on multiple orders made by the user
2843
+ * @see https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#User's%20All%20Orders
2844
+ * @param {string} symbol unified market symbol of the market orders were made in
2845
+ * @param {int} [since] the earliest time in ms to fetch orders for
2846
+ * @param {int} [limit] the maximum number of order structures to retrieve
2847
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2848
+ * @param {int} [params.until] the latest time in ms to fetch entries for
2849
+ * @param {int} [params.orderId] Only return subsequent orders, and return the latest order by default
2850
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2851
+ */
2852
+ await this.loadMarkets();
2853
+ const request = {};
2854
+ let market = undefined;
2855
+ if (symbol !== undefined) {
2856
+ market = this.market(symbol);
2857
+ request['symbol'] = market['id'];
2858
+ }
2859
+ let type = undefined;
2860
+ [type, params] = this.handleMarketTypeAndParams('fetchOrders', market, params);
2861
+ if (type !== 'swap') {
2862
+ throw new NotSupported(this.id + ' fetchOrders() is only supported for swap markets');
2863
+ }
2864
+ if (limit !== undefined) {
2865
+ request['limit'] = limit;
2866
+ }
2867
+ if (since !== undefined) {
2868
+ request['startTime'] = since;
2869
+ }
2870
+ const until = this.safeInteger2(params, 'until', 'till'); // unified in milliseconds
2871
+ const endTime = this.safeInteger(params, 'endTime', until); // exchange-specific in milliseconds
2872
+ params = this.omit(params, ['endTime', 'till', 'until']);
2873
+ if (endTime !== undefined) {
2874
+ request['endTime'] = endTime;
2875
+ }
2876
+ const response = await this.swapV1PrivateGetTradeFullOrder(this.extend(request, params));
2877
+ //
2878
+ // {
2879
+ // "code": 0,
2880
+ // "msg": "",
2881
+ // "data": {
2882
+ // "orders": [
2883
+ // {
2884
+ // "symbol": "PYTH-USDT",
2885
+ // "orderId": 1736007506620112100,
2886
+ // "side": "SELL",
2887
+ // "positionSide": "SHORT",
2888
+ // "type": "LIMIT",
2889
+ // "origQty": "33",
2890
+ // "price": "0.3916",
2891
+ // "executedQty": "33",
2892
+ // "avgPrice": "0.3916",
2893
+ // "cumQuote": "13",
2894
+ // "stopPrice": "",
2895
+ // "profit": "0.0000",
2896
+ // "commission": "-0.002585",
2897
+ // "status": "FILLED",
2898
+ // "time": 1702731418000,
2899
+ // "updateTime": 1702731470000,
2900
+ // "clientOrderId": "",
2901
+ // "leverage": "15X",
2902
+ // "takeProfit": {
2903
+ // "type": "TAKE_PROFIT",
2904
+ // "quantity": 0,
2905
+ // "stopPrice": 0,
2906
+ // "price": 0,
2907
+ // "workingType": ""
2908
+ // },
2909
+ // "stopLoss": {
2910
+ // "type": "STOP",
2911
+ // "quantity": 0,
2912
+ // "stopPrice": 0,
2913
+ // "price": 0,
2914
+ // "workingType": ""
2915
+ // },
2916
+ // "advanceAttr": 0,
2917
+ // "positionID": 0,
2918
+ // "takeProfitEntrustPrice": 0,
2919
+ // "stopLossEntrustPrice": 0,
2920
+ // "orderType": "",
2921
+ // "workingType": "MARK_PRICE",
2922
+ // "stopGuaranteed": false,
2923
+ // "triggerOrderId": 1736012449498123500
2924
+ // }
2925
+ // ]
2926
+ // }
2927
+ // }
2928
+ //
2929
+ const data = this.safeDict(response, 'data', {});
2930
+ const orders = this.safeList(data, 'orders', []);
2931
+ return this.parseOrders(orders, market, since, limit);
2932
+ }
2834
2933
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2835
2934
  /**
2836
2935
  * @method
@@ -3531,6 +3630,7 @@ export default class bingx extends Exchange {
3531
3630
  'info': data,
3532
3631
  'symbol': this.safeString(market, 'symbol'),
3533
3632
  'type': (type === '1') ? 'add' : 'reduce',
3633
+ 'marginMode': 'isolated',
3534
3634
  'amount': this.safeNumber(data, 'amount'),
3535
3635
  'total': this.safeNumber(data, 'margin'),
3536
3636
  'code': this.safeString(market, 'settle'),
package/js/src/bit2c.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bit2c.js';
2
- import type { Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade } from './base/types.js';
2
+ import type { Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, TradingFees } from './base/types.js';
3
3
  /**
4
4
  * @class bit2c
5
5
  * @augments Exchange
@@ -12,7 +12,7 @@ export default class bit2c extends Exchange {
12
12
  parseTicker(ticker: any, market?: Market): Ticker;
13
13
  fetchTicker(symbol: string, params?: {}): Promise<Ticker>;
14
14
  fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
15
- fetchTradingFees(params?: {}): Promise<{}>;
15
+ fetchTradingFees(params?: {}): Promise<TradingFees>;
16
16
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
17
17
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
18
18
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitbank.js';
2
- import type { Balances, Currency, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, Transaction } from './base/types.js';
2
+ import type { Balances, Currency, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, TradingFees, Transaction } from './base/types.js';
3
3
  /**
4
4
  * @class bitbank
5
5
  * @augments Exchange
@@ -13,7 +13,7 @@ export default class bitbank extends Exchange {
13
13
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
14
14
  parseTrade(trade: any, market?: Market): Trade;
15
15
  fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
16
- fetchTradingFees(params?: {}): Promise<{}>;
16
+ fetchTradingFees(params?: {}): Promise<TradingFees>;
17
17
  parseOHLCV(ohlcv: any, market?: Market): OHLCV;
18
18
  fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
19
19
  parseBalance(response: any): Balances;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitfinex.js';
2
- import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num } from './base/types.js';
2
+ import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num, TradingFees } from './base/types.js';
3
3
  /**
4
4
  * @class bitfinex
5
5
  * @augments Exchange
@@ -20,7 +20,7 @@ export default class bitfinex extends Exchange {
20
20
  networks: {};
21
21
  info: any;
22
22
  };
23
- fetchTradingFees(params?: {}): Promise<{}>;
23
+ fetchTradingFees(params?: {}): Promise<TradingFees>;
24
24
  fetchMarkets(params?: {}): Promise<Market[]>;
25
25
  amountToPrecision(symbol: any, amount: any): any;
26
26
  priceToPrecision(symbol: any, price: any): any;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitfinex2.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderBook, Str, Transaction, Ticker, Balances, Tickers, Strings, Currency, Market, OpenInterest, Liquidation, OrderRequest, Num, MarginModification } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderBook, Str, Transaction, Ticker, Balances, Tickers, Strings, Currency, Market, OpenInterest, Liquidation, OrderRequest, Num, MarginModification, Currencies, TradingFees } from './base/types.js';
3
3
  /**
4
4
  * @class bitfinex2
5
5
  * @augments Exchange
@@ -19,7 +19,7 @@ export default class bitfinex2 extends Exchange {
19
19
  info: any;
20
20
  }>;
21
21
  fetchMarkets(params?: {}): Promise<Market[]>;
22
- fetchCurrencies(params?: {}): Promise<{}>;
22
+ fetchCurrencies(params?: {}): Promise<Currencies>;
23
23
  safeNetwork(networkId: any): string;
24
24
  fetchBalance(params?: {}): Promise<Balances>;
25
25
  transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
@@ -76,7 +76,7 @@ export default class bitfinex2 extends Exchange {
76
76
  }>;
77
77
  parseTransactionStatus(status: any): string;
78
78
  parseTransaction(transaction: any, currency?: Currency): Transaction;
79
- fetchTradingFees(params?: {}): Promise<{}>;
79
+ fetchTradingFees(params?: {}): Promise<TradingFees>;
80
80
  fetchDepositsWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
81
81
  withdraw(code: string, amount: number, address: any, tag?: any, params?: {}): Promise<any>;
82
82
  fetchPositions(symbols?: Strings, params?: {}): Promise<import("./base/types.js").Position[]>;
@@ -3522,6 +3522,7 @@ export default class bitfinex2 extends Exchange {
3522
3522
  'info': data,
3523
3523
  'symbol': market['symbol'],
3524
3524
  'type': undefined,
3525
+ 'marginMode': 'isolated',
3525
3526
  'amount': undefined,
3526
3527
  'total': undefined,
3527
3528
  'code': undefined,
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitflyer.js';
2
- import type { Balances, Currency, Int, Market, MarketInterface, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Trade, Transaction } from './base/types.js';
2
+ import type { Balances, Currency, Int, Market, MarketInterface, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Trade, TradingFeeInterface, Transaction } from './base/types.js';
3
3
  /**
4
4
  * @class bitflyer
5
5
  * @augments Exchange
@@ -16,12 +16,7 @@ export default class bitflyer extends Exchange {
16
16
  fetchTicker(symbol: string, params?: {}): Promise<Ticker>;
17
17
  parseTrade(trade: any, market?: Market): Trade;
18
18
  fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
19
- fetchTradingFee(symbol: string, params?: {}): Promise<{
20
- info: any;
21
- symbol: string;
22
- maker: number;
23
- taker: number;
24
- }>;
19
+ fetchTradingFee(symbol: string, params?: {}): Promise<TradingFeeInterface>;
25
20
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
26
21
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
27
22
  parseOrderStatus(status: any): string;