ccxt 4.4.9 → 4.4.11

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 (117) hide show
  1. package/README.md +131 -131
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/ascendex.js +2 -1
  5. package/dist/cjs/src/binance.js +6 -9
  6. package/dist/cjs/src/bingx.js +19 -20
  7. package/dist/cjs/src/bitfinex2.js +5 -16
  8. package/dist/cjs/src/bitget.js +6 -5
  9. package/dist/cjs/src/bitmart.js +1 -0
  10. package/dist/cjs/src/bitmex.js +4 -3
  11. package/dist/cjs/src/blofin.js +4 -13
  12. package/dist/cjs/src/bybit.js +16 -14
  13. package/dist/cjs/src/coinex.js +15 -1
  14. package/dist/cjs/src/delta.js +2 -1
  15. package/dist/cjs/src/deribit.js +1 -0
  16. package/dist/cjs/src/digifinex.js +15 -1
  17. package/dist/cjs/src/gate.js +30 -9
  18. package/dist/cjs/src/hashkey.js +2 -2
  19. package/dist/cjs/src/hitbtc.js +2 -1
  20. package/dist/cjs/src/htx.js +26 -3
  21. package/dist/cjs/src/hyperliquid.js +6 -1
  22. package/dist/cjs/src/kraken.js +41 -13
  23. package/dist/cjs/src/krakenfutures.js +3 -2
  24. package/dist/cjs/src/kucoinfutures.js +11 -0
  25. package/dist/cjs/src/mexc.js +12 -4
  26. package/dist/cjs/src/oceanex.js +83 -3
  27. package/dist/cjs/src/okx.js +15 -0
  28. package/dist/cjs/src/oxfun.js +4 -4
  29. package/dist/cjs/src/phemex.js +1 -0
  30. package/dist/cjs/src/poloniexfutures.js +11 -0
  31. package/dist/cjs/src/pro/deribit.js +122 -1
  32. package/dist/cjs/src/pro/exmo.js +31 -1
  33. package/dist/cjs/src/pro/gate.js +1 -1
  34. package/dist/cjs/src/pro/okx.js +1 -1
  35. package/dist/cjs/src/vertex.js +2 -1
  36. package/dist/cjs/src/whitebit.js +10 -9
  37. package/dist/cjs/src/woo.js +42 -17
  38. package/dist/cjs/src/woofipro.js +15 -2
  39. package/dist/cjs/src/xt.js +2 -0
  40. package/js/ccxt.d.ts +1 -1
  41. package/js/ccxt.js +1 -1
  42. package/js/src/abstract/binance.d.ts +1 -0
  43. package/js/src/abstract/binancecoinm.d.ts +1 -0
  44. package/js/src/abstract/binanceus.d.ts +1 -0
  45. package/js/src/abstract/binanceusdm.d.ts +1 -0
  46. package/js/src/abstract/oceanex.d.ts +5 -0
  47. package/js/src/ascendex.d.ts +3 -21
  48. package/js/src/ascendex.js +2 -1
  49. package/js/src/base/Exchange.d.ts +3 -3
  50. package/js/src/base/types.d.ts +1 -0
  51. package/js/src/binance.d.ts +4 -40
  52. package/js/src/binance.js +6 -9
  53. package/js/src/bingx.d.ts +4 -40
  54. package/js/src/bingx.js +19 -20
  55. package/js/src/bitfinex2.d.ts +3 -22
  56. package/js/src/bitfinex2.js +5 -16
  57. package/js/src/bitget.d.ts +3 -39
  58. package/js/src/bitget.js +6 -5
  59. package/js/src/bitmart.d.ts +3 -39
  60. package/js/src/bitmart.js +1 -0
  61. package/js/src/bitmex.d.ts +3 -21
  62. package/js/src/bitmex.js +4 -3
  63. package/js/src/blofin.d.ts +3 -39
  64. package/js/src/blofin.js +4 -13
  65. package/js/src/bybit.d.ts +3 -21
  66. package/js/src/bybit.js +16 -14
  67. package/js/src/coinex.d.ts +5 -40
  68. package/js/src/coinex.js +15 -1
  69. package/js/src/delta.d.ts +4 -40
  70. package/js/src/delta.js +2 -1
  71. package/js/src/deribit.d.ts +3 -39
  72. package/js/src/deribit.js +1 -0
  73. package/js/src/digifinex.d.ts +4 -21
  74. package/js/src/digifinex.js +15 -1
  75. package/js/src/gate.d.ts +6 -41
  76. package/js/src/gate.js +30 -9
  77. package/js/src/hashkey.d.ts +4 -40
  78. package/js/src/hashkey.js +2 -2
  79. package/js/src/hitbtc.d.ts +4 -40
  80. package/js/src/hitbtc.js +2 -1
  81. package/js/src/htx.d.ts +5 -40
  82. package/js/src/htx.js +26 -3
  83. package/js/src/hyperliquid.js +6 -1
  84. package/js/src/kraken.js +41 -13
  85. package/js/src/krakenfutures.d.ts +3 -21
  86. package/js/src/krakenfutures.js +3 -2
  87. package/js/src/kucoinfutures.d.ts +3 -20
  88. package/js/src/kucoinfutures.js +11 -0
  89. package/js/src/mexc.d.ts +3 -39
  90. package/js/src/mexc.js +12 -4
  91. package/js/src/oceanex.d.ts +9 -1
  92. package/js/src/oceanex.js +83 -3
  93. package/js/src/okx.d.ts +4 -39
  94. package/js/src/okx.js +16 -1
  95. package/js/src/oxfun.d.ts +3 -21
  96. package/js/src/oxfun.js +4 -4
  97. package/js/src/phemex.d.ts +3 -39
  98. package/js/src/phemex.js +1 -0
  99. package/js/src/poloniexfutures.d.ts +3 -20
  100. package/js/src/poloniexfutures.js +11 -0
  101. package/js/src/pro/deribit.d.ts +5 -1
  102. package/js/src/pro/deribit.js +122 -1
  103. package/js/src/pro/exmo.d.ts +2 -1
  104. package/js/src/pro/exmo.js +31 -1
  105. package/js/src/pro/gate.js +1 -1
  106. package/js/src/pro/okx.js +1 -1
  107. package/js/src/vertex.d.ts +4 -40
  108. package/js/src/vertex.js +2 -1
  109. package/js/src/whitebit.d.ts +4 -21
  110. package/js/src/whitebit.js +10 -9
  111. package/js/src/woo.d.ts +4 -40
  112. package/js/src/woo.js +42 -17
  113. package/js/src/woofipro.d.ts +5 -40
  114. package/js/src/woofipro.js +15 -2
  115. package/js/src/xt.d.ts +3 -39
  116. package/js/src/xt.js +2 -0
  117. package/package.json +1 -1
package/js/src/mexc.js CHANGED
@@ -3862,6 +3862,7 @@ export default class mexc extends Exchange {
3862
3862
  * @param {int} [since] the earliest time in ms to fetch trades for
3863
3863
  * @param {int} [limit] the maximum number of trades structures to retrieve
3864
3864
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3865
+ * @param {int} [params.until] the latest time in ms to fetch trades for
3865
3866
  * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
3866
3867
  */
3867
3868
  if (symbol === undefined) {
@@ -3869,19 +3870,25 @@ export default class mexc extends Exchange {
3869
3870
  }
3870
3871
  await this.loadMarkets();
3871
3872
  const market = this.market(symbol);
3872
- const [marketType, query] = this.handleMarketTypeAndParams('fetchMyTrades', market, params);
3873
+ let marketType = undefined;
3874
+ [marketType, params] = this.handleMarketTypeAndParams('fetchMyTrades', market, params);
3873
3875
  const request = {
3874
3876
  'symbol': market['id'],
3875
3877
  };
3876
3878
  let trades = undefined;
3877
3879
  if (marketType === 'spot') {
3878
3880
  if (since !== undefined) {
3879
- request['start_time'] = since;
3881
+ request['startTime'] = since;
3880
3882
  }
3881
3883
  if (limit !== undefined) {
3882
3884
  request['limit'] = limit;
3883
3885
  }
3884
- trades = await this.spotPrivateGetMyTrades(this.extend(request, query));
3886
+ const until = this.safeInteger(params, 'until');
3887
+ if (until !== undefined) {
3888
+ params = this.omit(params, 'until');
3889
+ request['endTime'] = until;
3890
+ }
3891
+ trades = await this.spotPrivateGetMyTrades(this.extend(request, params));
3885
3892
  //
3886
3893
  // spot
3887
3894
  //
@@ -3915,7 +3922,7 @@ export default class mexc extends Exchange {
3915
3922
  if (limit !== undefined) {
3916
3923
  request['page_size'] = limit;
3917
3924
  }
3918
- const response = await this.contractPrivateGetOrderListOrderDeals(this.extend(request, query));
3925
+ const response = await this.contractPrivateGetOrderListOrderDeals(this.extend(request, params));
3919
3926
  //
3920
3927
  // {
3921
3928
  // "success": true,
@@ -4217,6 +4224,7 @@ export default class mexc extends Exchange {
4217
4224
  'previousFundingRate': undefined,
4218
4225
  'previousFundingTimestamp': undefined,
4219
4226
  'previousFundingDatetime': undefined,
4227
+ 'interval': undefined,
4220
4228
  };
4221
4229
  }
4222
4230
  async fetchFundingRate(symbol, params = {}) {
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/oceanex.js';
2
- import type { Balances, Dict, Dictionary, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, int } from './base/types.js';
2
+ import type { Balances, Currency, Dict, Dictionary, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, int } from './base/types.js';
3
3
  /**
4
4
  * @class oceanex
5
5
  * @augments Exchange
@@ -32,6 +32,14 @@ export default class oceanex extends Exchange {
32
32
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
33
33
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
34
34
  cancelAllOrders(symbol?: Str, params?: {}): Promise<Order[]>;
35
+ fetchDepositAddressesByNetwork(code: string, params?: {}): Promise<{}>;
36
+ parseDepositAddress(depositAddress: any, currency?: Currency): {
37
+ info: any;
38
+ currency: string;
39
+ address: string;
40
+ tag: string;
41
+ network: string;
42
+ };
35
43
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
36
44
  url: string;
37
45
  method: string;
package/js/src/oceanex.js CHANGED
@@ -50,9 +50,9 @@ export default class oceanex extends Exchange {
50
50
  'fetchClosedOrders': true,
51
51
  'fetchCrossBorrowRate': false,
52
52
  'fetchCrossBorrowRates': false,
53
- 'fetchDepositAddress': false,
54
- 'fetchDepositAddresses': false,
55
- 'fetchDepositAddressesByNetwork': false,
53
+ 'fetchDepositAddress': 'emulated',
54
+ 'fetchDepositAddresses': undefined,
55
+ 'fetchDepositAddressesByNetwork': true,
56
56
  'fetchIsolatedBorrowRate': false,
57
57
  'fetchIsolatedBorrowRates': false,
58
58
  'fetchMarkets': true,
@@ -113,6 +113,11 @@ export default class oceanex extends Exchange {
113
113
  'order/delete',
114
114
  'order/delete/multi',
115
115
  'orders/clear',
116
+ '/withdraws/special/new',
117
+ '/deposit_address',
118
+ '/deposit_addresses',
119
+ '/deposit_history',
120
+ '/withdraw_history',
116
121
  ],
117
122
  },
118
123
  },
@@ -913,6 +918,81 @@ export default class oceanex extends Exchange {
913
918
  const data = this.safeList(response, 'data');
914
919
  return this.parseOrders(data);
915
920
  }
921
+ async fetchDepositAddressesByNetwork(code, params = {}) {
922
+ /**
923
+ * @method
924
+ * @name oceanex#fetchDepositAddressesByNetwork
925
+ * @description fetch the deposit addresses for a currency associated with this account
926
+ * @see https://api.oceanex.pro/doc/v1/#deposit-addresses-post
927
+ * @param {string} code unified currency code
928
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
929
+ * @returns {object} a dictionary [address structures]{@link https://docs.ccxt.com/#/?id=address-structure}, indexed by the network
930
+ */
931
+ await this.loadMarkets();
932
+ const currency = this.currency(code);
933
+ const request = {
934
+ 'currency': currency['id'],
935
+ };
936
+ const response = await this.privatePostDepositAddresses(this.extend(request, params));
937
+ //
938
+ // {
939
+ // code: '0',
940
+ // message: 'Operation successful',
941
+ // data: {
942
+ // data: {
943
+ // currency_id: 'usdt',
944
+ // display_name: 'USDT',
945
+ // num_of_resources: '3',
946
+ // resources: [
947
+ // {
948
+ // chain_name: 'TRC20',
949
+ // currency_id: 'usdt',
950
+ // address: 'TPcS7VgKMFmpRrWY82GbJzDeMnemWxEbpg',
951
+ // memo: '',
952
+ // deposit_status: 'enabled'
953
+ // },
954
+ // ...
955
+ // ]
956
+ // }
957
+ // }
958
+ // }
959
+ //
960
+ const data = this.safeDict(response, 'data', {});
961
+ const data2 = this.safeDict(data, 'data', {});
962
+ const resources = this.safeList(data2, 'resources', []);
963
+ const result = {};
964
+ for (let i = 0; i < resources.length; i++) {
965
+ const resource = resources[i];
966
+ const enabled = this.safeString(resource, 'deposit_status');
967
+ if (enabled === 'enabled') {
968
+ const parsedAddress = this.parseDepositAddress(resource, currency);
969
+ result[parsedAddress['currency']] = parsedAddress;
970
+ }
971
+ }
972
+ return result;
973
+ }
974
+ parseDepositAddress(depositAddress, currency = undefined) {
975
+ //
976
+ // {
977
+ // chain_name: 'TRC20',
978
+ // currency_id: 'usdt',
979
+ // address: 'TPcS7VgKMFmpRrWY82GbJzDeMnemWxEbpg',
980
+ // memo: '',
981
+ // deposit_status: 'enabled'
982
+ // }
983
+ //
984
+ const address = this.safeString(depositAddress, 'address');
985
+ this.checkAddress(address);
986
+ const currencyId = this.safeString(depositAddress, 'currency_id');
987
+ const networkId = this.safeString(depositAddress, 'chain_name');
988
+ return {
989
+ 'info': depositAddress,
990
+ 'currency': this.safeCurrencyCode(currencyId, currency),
991
+ 'address': address,
992
+ 'tag': this.safeString(depositAddress, 'memo'),
993
+ 'network': this.networkIdToCode(networkId),
994
+ };
995
+ }
916
996
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
917
997
  let url = this.urls['api']['rest'] + '/' + this.version + '/' + this.implodeParams(path, params);
918
998
  const query = this.omit(params, this.extractParams(path));
package/js/src/okx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/okx.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion, CancellationRequest, Dict, Position, CrossBorrowRate, CrossBorrowRates, LeverageTier, int, LedgerEntry } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion, CancellationRequest, Dict, Position, CrossBorrowRate, CrossBorrowRates, LeverageTier, int, LedgerEntry, FundingRate } from './base/types.js';
3
3
  /**
4
4
  * @class okx
5
5
  * @augments Exchange
@@ -88,44 +88,9 @@ export default class okx extends Exchange {
88
88
  body: any;
89
89
  headers: any;
90
90
  };
91
- parseFundingRate(contract: any, market?: Market): {
92
- info: any;
93
- symbol: string;
94
- markPrice: any;
95
- indexPrice: any;
96
- interestRate: number;
97
- estimatedSettlePrice: any;
98
- timestamp: any;
99
- datetime: any;
100
- fundingRate: number;
101
- fundingTimestamp: number;
102
- fundingDatetime: string;
103
- nextFundingRate: number;
104
- nextFundingTimestamp: number;
105
- nextFundingDatetime: string;
106
- previousFundingRate: any;
107
- previousFundingTimestamp: any;
108
- previousFundingDatetime: any;
109
- };
110
- fetchFundingRate(symbol: string, params?: {}): Promise<{
111
- info: any;
112
- symbol: string;
113
- markPrice: any;
114
- indexPrice: any;
115
- interestRate: number;
116
- estimatedSettlePrice: any;
117
- timestamp: any;
118
- datetime: any;
119
- fundingRate: number;
120
- fundingTimestamp: number;
121
- fundingDatetime: string;
122
- nextFundingRate: number;
123
- nextFundingTimestamp: number;
124
- nextFundingDatetime: string;
125
- previousFundingRate: any;
126
- previousFundingTimestamp: any;
127
- previousFundingDatetime: any;
128
- }>;
91
+ parseFundingRate(contract: any, market?: Market): FundingRate;
92
+ parseFundingInterval(interval: any): string;
93
+ fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
129
94
  fetchFundingHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<FundingHistory[]>;
130
95
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
131
96
  fetchPositionMode(symbol?: Str, params?: {}): Promise<{
package/js/src/okx.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import Exchange from './abstract/okx.js';
9
- import { ExchangeError, ExchangeNotAvailable, OnMaintenance, ArgumentsRequired, BadRequest, AccountSuspended, InvalidAddress, DDoSProtection, PermissionDenied, InsufficientFunds, InvalidNonce, InvalidOrder, OrderNotFound, AuthenticationError, RequestTimeout, BadSymbol, RateLimitExceeded, NetworkError, CancelPending, NotSupported, AccountNotEnabled, ContractUnavailable } from './base/errors.js';
9
+ import { ExchangeError, ExchangeNotAvailable, OnMaintenance, ArgumentsRequired, BadRequest, AccountSuspended, InvalidAddress, DDoSProtection, PermissionDenied, InsufficientFunds, InvalidNonce, InvalidOrder, OrderNotFound, AuthenticationError, RequestTimeout, BadSymbol, RateLimitExceeded, NetworkError, CancelPending, NotSupported, AccountNotEnabled, ContractUnavailable, ManualInteractionNeeded } from './base/errors.js';
10
10
  import { Precise } from './base/Precise.js';
11
11
  import { TICK_SIZE } from './base/functions/number.js';
12
12
  import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
@@ -578,6 +578,7 @@ export default class okx extends Exchange {
578
578
  // General Class
579
579
  '1': ExchangeError,
580
580
  '2': ExchangeError,
581
+ '4088': ManualInteractionNeeded,
581
582
  '50000': BadRequest,
582
583
  '50001': OnMaintenance,
583
584
  '50002': BadRequest,
@@ -6052,6 +6053,9 @@ export default class okx extends Exchange {
6052
6053
  const symbol = this.safeSymbol(marketId, market);
6053
6054
  const nextFundingRate = this.safeNumber(contract, 'nextFundingRate');
6054
6055
  const fundingTime = this.safeInteger(contract, 'fundingTime');
6056
+ const fundingTimeString = this.safeString(contract, 'fundingTime');
6057
+ const nextFundingTimeString = this.safeString(contract, 'nextFundingRate');
6058
+ const millisecondsInterval = Precise.stringSub(nextFundingTimeString, fundingTimeString);
6055
6059
  // https://www.okx.com/support/hc/en-us/articles/360053909272-Ⅸ-Introduction-to-perpetual-swap-funding-fee
6056
6060
  // > The current interest is 0.
6057
6061
  return {
@@ -6072,8 +6076,19 @@ export default class okx extends Exchange {
6072
6076
  'previousFundingRate': undefined,
6073
6077
  'previousFundingTimestamp': undefined,
6074
6078
  'previousFundingDatetime': undefined,
6079
+ 'interval': this.parseFundingInterval(millisecondsInterval),
6075
6080
  };
6076
6081
  }
6082
+ parseFundingInterval(interval) {
6083
+ const intervals = {
6084
+ '3600000': '1h',
6085
+ '14400000': '4h',
6086
+ '28800000': '8h',
6087
+ '57600000': '16h',
6088
+ '86400000': '24h',
6089
+ };
6090
+ return this.safeString(intervals, interval, interval);
6091
+ }
6077
6092
  async fetchFundingRate(symbol, params = {}) {
6078
6093
  /**
6079
6094
  * @method
package/js/src/oxfun.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/oxfun.js';
2
- import type { Account, Balances, Currencies, Currency, Int, Market, Num, OHLCV, Order, OrderBook, OrderType, OrderSide, OrderRequest, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry } from './base/types.js';
2
+ import type { Account, Balances, Currencies, Currency, Int, Market, Num, OHLCV, Order, OrderBook, OrderType, OrderSide, OrderRequest, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry, FundingRate, FundingRates } from './base/types.js';
3
3
  /**
4
4
  * @class oxfun
5
5
  * @augments Exchange
@@ -16,26 +16,8 @@ export default class oxfun extends Exchange {
16
16
  fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
17
17
  parseOHLCV(ohlcv: any, market?: Market): OHLCV;
18
18
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
19
- fetchFundingRates(symbols?: Strings, params?: {}): Promise<any>;
20
- parseFundingRate(fundingRate: any, market?: Market): {
21
- info: any;
22
- symbol: string;
23
- markPrice: any;
24
- indexPrice: any;
25
- interestRate: number;
26
- estimatedSettlePrice: any;
27
- timestamp: number;
28
- datetime: string;
29
- fundingRate: number;
30
- fundingTimestamp: any;
31
- fundingDatetime: any;
32
- nextFundingRate: any;
33
- nextFundingTimestamp: any;
34
- nextFundingDatetime: any;
35
- previousFundingRate: any;
36
- previousFundingTimestamp: any;
37
- previousFundingDatetime: any;
38
- };
19
+ fetchFundingRates(symbols?: Strings, params?: {}): Promise<FundingRates>;
20
+ parseFundingRate(fundingRate: any, market?: Market): FundingRate;
39
21
  fetchFundingRateHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").FundingRateHistory[]>;
40
22
  parseFundingRateHistory(info: any, market?: Market): {
41
23
  info: any;
package/js/src/oxfun.js CHANGED
@@ -70,7 +70,7 @@ export default class oxfun extends Exchange {
70
70
  'fetchDepositWithdrawFee': false,
71
71
  'fetchDepositWithdrawFees': false,
72
72
  'fetchFundingHistory': true,
73
- 'fetchFundingRate': false,
73
+ 'fetchFundingRate': 'emulated',
74
74
  'fetchFundingRateHistory': true,
75
75
  'fetchFundingRates': true,
76
76
  'fetchIndexOHLCV': false,
@@ -1004,8 +1004,8 @@ export default class oxfun extends Exchange {
1004
1004
  /**
1005
1005
  * @method
1006
1006
  * @name oxfun#fetchFundingRates
1007
+ * @description fetch the current funding rates for multiple markets
1007
1008
  * @see https://docs.ox.fun/?json#get-v3-funding-estimates
1008
- * @description fetch the current funding rates
1009
1009
  * @param {string[]} symbols unified market symbols
1010
1010
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1011
1011
  * @returns {Order[]} an array of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
@@ -1041,8 +1041,7 @@ export default class oxfun extends Exchange {
1041
1041
  // "marketCode": "OX-USD-SWAP-LIN",
1042
1042
  // "fundingAt": "1715515200000",
1043
1043
  // "estFundingRate": "0.000200000"
1044
- // },
1045
- //
1044
+ // }
1046
1045
  //
1047
1046
  const symbol = this.safeString(fundingRate, 'marketCode');
1048
1047
  market = this.market(symbol);
@@ -1065,6 +1064,7 @@ export default class oxfun extends Exchange {
1065
1064
  'previousFundingRate': undefined,
1066
1065
  'previousFundingTimestamp': undefined,
1067
1066
  'previousFundingDatetime': undefined,
1067
+ 'interval': undefined,
1068
1068
  };
1069
1069
  }
1070
1070
  async fetchFundingRateHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/phemex.js';
2
- import type { TransferEntry, Balances, Currency, FundingHistory, FundingRateHistory, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, MarginModification, Currencies, Dict, LeverageTier, LeverageTiers, int } from './base/types.js';
2
+ import type { TransferEntry, Balances, Currency, FundingHistory, FundingRateHistory, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, MarginModification, Currencies, Dict, LeverageTier, LeverageTiers, int, FundingRate } from './base/types.js';
3
3
  /**
4
4
  * @class phemex
5
5
  * @augments Exchange
@@ -62,44 +62,8 @@ export default class phemex extends Exchange {
62
62
  parsePosition(position: Dict, market?: Market): import("./base/types.js").Position;
63
63
  fetchFundingHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<FundingHistory[]>;
64
64
  parseFundingFeeToPrecision(value: any, market?: Market, currencyCode?: Str): any;
65
- fetchFundingRate(symbol: string, params?: {}): Promise<{
66
- info: any;
67
- symbol: string;
68
- markPrice: any;
69
- indexPrice: any;
70
- interestRate: any;
71
- estimatedSettlePrice: any;
72
- timestamp: number;
73
- datetime: string;
74
- fundingRate: any;
75
- fundingTimestamp: any;
76
- fundingDatetime: any;
77
- nextFundingRate: any;
78
- nextFundingTimestamp: any;
79
- nextFundingDatetime: any;
80
- previousFundingRate: any;
81
- previousFundingTimestamp: any;
82
- previousFundingDatetime: any;
83
- }>;
84
- parseFundingRate(contract: any, market?: Market): {
85
- info: any;
86
- symbol: string;
87
- markPrice: any;
88
- indexPrice: any;
89
- interestRate: any;
90
- estimatedSettlePrice: any;
91
- timestamp: number;
92
- datetime: string;
93
- fundingRate: any;
94
- fundingTimestamp: any;
95
- fundingDatetime: any;
96
- nextFundingRate: any;
97
- nextFundingTimestamp: any;
98
- nextFundingDatetime: any;
99
- previousFundingRate: any;
100
- previousFundingTimestamp: any;
101
- previousFundingDatetime: any;
102
- };
65
+ fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
66
+ parseFundingRate(contract: any, market?: Market): FundingRate;
103
67
  setMargin(symbol: string, amount: number, params?: {}): Promise<MarginModification>;
104
68
  parseMarginStatus(status: any): string;
105
69
  parseMarginModification(data: Dict, market?: Market): MarginModification;
package/js/src/phemex.js CHANGED
@@ -4131,6 +4131,7 @@ export default class phemex extends Exchange {
4131
4131
  'previousFundingRate': undefined,
4132
4132
  'previousFundingTimestamp': undefined,
4133
4133
  'previousFundingDatetime': undefined,
4134
+ 'interval': undefined,
4134
4135
  };
4135
4136
  }
4136
4137
  async setMargin(symbol, amount, params = {}) {
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/poloniexfutures.js';
2
- import type { Balances, Dict, FundingHistory, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, int } from './base/types.js';
2
+ import type { Balances, Dict, FundingHistory, Int, Market, Num, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, int, FundingRate } from './base/types.js';
3
3
  /**
4
4
  * @class poloniexfutures
5
5
  * @augments Exchange
@@ -55,25 +55,8 @@ export default class poloniexfutures extends Exchange {
55
55
  fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
56
56
  fetchOrder(id?: Str, symbol?: Str, params?: {}): Promise<Order>;
57
57
  parseOrder(order: Dict, market?: Market): Order;
58
- fetchFundingRate(symbol: string, params?: {}): Promise<{
59
- info: any;
60
- symbol: string;
61
- markPrice: any;
62
- indexPrice: any;
63
- interestRate: any;
64
- estimatedSettlePrice: any;
65
- timestamp: any;
66
- datetime: any;
67
- fundingRate: number;
68
- fundingTimestamp: any;
69
- fundingDatetime: any;
70
- nextFundingRate: any;
71
- nextFundingTimestamp: any;
72
- nextFundingDatetime: any;
73
- previousFundingRate: number;
74
- previousFundingTimestamp: number;
75
- previousFundingDatetime: string;
76
- }>;
58
+ fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
59
+ parseFundingInterval(interval: any): string;
77
60
  fetchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
78
61
  setMarginMode(marginMode: string, symbol?: Str, params?: {}): Promise<any>;
79
62
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
@@ -1658,8 +1658,19 @@ export default class poloniexfutures extends Exchange {
1658
1658
  'previousFundingRate': this.safeNumber(data, 'value'),
1659
1659
  'previousFundingTimestamp': fundingTimestamp,
1660
1660
  'previousFundingDatetime': this.iso8601(fundingTimestamp),
1661
+ 'interval': this.parseFundingInterval(this.safeString(data, 'interval')),
1661
1662
  };
1662
1663
  }
1664
+ parseFundingInterval(interval) {
1665
+ const intervals = {
1666
+ '3600000': '1h',
1667
+ '14400000': '4h',
1668
+ '28800000': '8h',
1669
+ '57600000': '16h',
1670
+ '86400000': '24h',
1671
+ };
1672
+ return this.safeString(intervals, interval, interval);
1673
+ }
1663
1674
  async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1664
1675
  /**
1665
1676
  * @method
@@ -1,5 +1,5 @@
1
1
  import deribitRest from '../deribit.js';
2
- import type { Int, Str, OrderBook, Order, Trade, Ticker, OHLCV, Balances } from '../base/types.js';
2
+ import type { Int, Str, OrderBook, Order, Trade, Ticker, OHLCV, Balances, Strings, Tickers } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class deribit extends deribitRest {
5
5
  describe(): any;
@@ -7,7 +7,11 @@ export default class deribit extends deribitRest {
7
7
  watchBalance(params?: {}): Promise<Balances>;
8
8
  handleBalance(client: Client, message: any): void;
9
9
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
10
+ watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
10
11
  handleTicker(client: Client, message: any): void;
12
+ watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
13
+ handleBidAsk(client: Client, message: any): void;
14
+ parseWsBidAsk(ticker: any, market?: any): Ticker;
11
15
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
12
16
  watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
13
17
  handleTrades(client: Client, message: any): void;
@@ -17,7 +17,8 @@ export default class deribit extends deribitRest {
17
17
  'ws': true,
18
18
  'watchBalance': true,
19
19
  'watchTicker': true,
20
- 'watchTickers': false,
20
+ 'watchTickers': true,
21
+ 'watchBidsAsks': true,
21
22
  'watchTrades': true,
22
23
  'watchTradesForSymbols': true,
23
24
  'watchMyTrades': true,
@@ -188,6 +189,48 @@ export default class deribit extends deribitRest {
188
189
  const request = this.deepExtend(message, params);
189
190
  return await this.watch(url, channel, request, channel, request);
190
191
  }
192
+ async watchTickers(symbols = undefined, params = {}) {
193
+ /**
194
+ * @method
195
+ * @name deribit#watchTickers
196
+ * @see https://docs.deribit.com/#ticker-instrument_name-interval
197
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
198
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
199
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
200
+ * @param {str} [params.interval] specify aggregation and frequency of notifications. Possible values: 100ms, raw
201
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
202
+ */
203
+ await this.loadMarkets();
204
+ symbols = this.marketSymbols(symbols, undefined, false);
205
+ const url = this.urls['api']['ws'];
206
+ const interval = this.safeString(params, 'interval', '100ms');
207
+ params = this.omit(params, 'interval');
208
+ await this.loadMarkets();
209
+ if (interval === 'raw') {
210
+ await this.authenticate();
211
+ }
212
+ const channels = [];
213
+ for (let i = 0; i < symbols.length; i++) {
214
+ const market = this.market(symbols[i]);
215
+ channels.push('ticker.' + market['id'] + '.' + interval);
216
+ }
217
+ const message = {
218
+ 'jsonrpc': '2.0',
219
+ 'method': 'public/subscribe',
220
+ 'params': {
221
+ 'channels': channels,
222
+ },
223
+ 'id': this.requestId(),
224
+ };
225
+ const request = this.deepExtend(message, params);
226
+ const newTickers = await this.watchMultiple(url, channels, request, channels, request);
227
+ if (this.newUpdates) {
228
+ const tickers = {};
229
+ tickers[newTickers['symbol']] = newTickers;
230
+ return tickers;
231
+ }
232
+ return this.filterByArray(this.tickers, 'symbol', symbols);
233
+ }
191
234
  handleTicker(client, message) {
192
235
  //
193
236
  // {
@@ -227,6 +270,83 @@ export default class deribit extends deribitRest {
227
270
  this.tickers[symbol] = ticker;
228
271
  client.resolve(ticker, messageHash);
229
272
  }
273
+ async watchBidsAsks(symbols = undefined, params = {}) {
274
+ /**
275
+ * @method
276
+ * @name deribit#watchBidsAsks
277
+ * @see https://docs.deribit.com/#quote-instrument_name
278
+ * @description watches best bid & ask for symbols
279
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
280
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
281
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
282
+ */
283
+ await this.loadMarkets();
284
+ symbols = this.marketSymbols(symbols, undefined, false);
285
+ const url = this.urls['api']['ws'];
286
+ const channels = [];
287
+ for (let i = 0; i < symbols.length; i++) {
288
+ const market = this.market(symbols[i]);
289
+ channels.push('quote.' + market['id']);
290
+ }
291
+ const message = {
292
+ 'jsonrpc': '2.0',
293
+ 'method': 'public/subscribe',
294
+ 'params': {
295
+ 'channels': channels,
296
+ },
297
+ 'id': this.requestId(),
298
+ };
299
+ const request = this.deepExtend(message, params);
300
+ const newTickers = await this.watchMultiple(url, channels, request, channels, request);
301
+ if (this.newUpdates) {
302
+ const tickers = {};
303
+ tickers[newTickers['symbol']] = newTickers;
304
+ return tickers;
305
+ }
306
+ return this.filterByArray(this.bidsasks, 'symbol', symbols);
307
+ }
308
+ handleBidAsk(client, message) {
309
+ //
310
+ // {
311
+ // "jsonrpc": "2.0",
312
+ // "method": "subscription",
313
+ // "params": {
314
+ // "channel": "quote.BTC_USDT",
315
+ // "data": {
316
+ // "best_bid_amount": 0.026,
317
+ // "best_ask_amount": 0.026,
318
+ // "best_bid_price": 63908,
319
+ // "best_ask_price": 63940,
320
+ // "instrument_name": "BTC_USDT",
321
+ // "timestamp": 1727765131750
322
+ // }
323
+ // }
324
+ // }
325
+ //
326
+ const params = this.safeDict(message, 'params', {});
327
+ const data = this.safeDict(params, 'data', {});
328
+ const ticker = this.parseWsBidAsk(data);
329
+ const symbol = ticker['symbol'];
330
+ this.bidsasks[symbol] = ticker;
331
+ const messageHash = this.safeString(params, 'channel');
332
+ client.resolve(ticker, messageHash);
333
+ }
334
+ parseWsBidAsk(ticker, market = undefined) {
335
+ const marketId = this.safeString(ticker, 'instrument_name');
336
+ market = this.safeMarket(marketId, market);
337
+ const symbol = this.safeString(market, 'symbol');
338
+ const timestamp = this.safeInteger(ticker, 'timestamp');
339
+ return this.safeTicker({
340
+ 'symbol': symbol,
341
+ 'timestamp': timestamp,
342
+ 'datetime': this.iso8601(timestamp),
343
+ 'ask': this.safeString(ticker, 'best_ask_price'),
344
+ 'askVolume': this.safeString(ticker, 'best_ask_amount'),
345
+ 'bid': this.safeString(ticker, 'best_bid_price'),
346
+ 'bidVolume': this.safeString(ticker, 'best_bid_amount'),
347
+ 'info': ticker,
348
+ }, market);
349
+ }
230
350
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
231
351
  /**
232
352
  * @method
@@ -872,6 +992,7 @@ export default class deribit extends deribitRest {
872
992
  };
873
993
  const handlers = {
874
994
  'ticker': this.handleTicker,
995
+ 'quote': this.handleBidAsk,
875
996
  'book': this.handleOrderBook,
876
997
  'trades': this.handleTrades,
877
998
  'chart': this.handleOHLCV,