ccxt 4.2.72 → 4.2.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -122
- package/build.sh +1 -1
- package/dist/ccxt.browser.js +3099 -363
- package/dist/ccxt.browser.min.js +4 -4
- package/dist/cjs/ccxt.js +6 -1
- package/dist/cjs/src/abstract/coinbaseinternational.js +9 -0
- package/dist/cjs/src/base/Exchange.js +30 -6
- package/dist/cjs/src/btcturk.js +3 -3
- package/dist/cjs/src/coinbaseinternational.js +2019 -0
- package/dist/cjs/src/gate.js +1 -1
- package/dist/cjs/src/hyperliquid.js +8 -2
- package/dist/cjs/src/mexc.js +1 -1
- package/dist/cjs/src/okx.js +1 -1
- package/dist/cjs/src/pro/coinbaseinternational.js +645 -0
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/coinbaseinternational.d.ts +42 -0
- package/js/src/abstract/coinbaseinternational.js +11 -0
- package/js/src/ace.d.ts +2 -2
- package/js/src/alpaca.d.ts +2 -2
- package/js/src/ascendex.d.ts +3 -3
- package/js/src/base/Exchange.d.ts +25 -22
- package/js/src/base/Exchange.js +30 -6
- package/js/src/bigone.d.ts +2 -2
- package/js/src/binance.d.ts +7 -7
- package/js/src/bingx.d.ts +4 -4
- package/js/src/bit2c.d.ts +2 -2
- package/js/src/bitbank.d.ts +2 -2
- package/js/src/bitbns.d.ts +2 -2
- package/js/src/bitfinex.d.ts +3 -3
- package/js/src/bitfinex2.d.ts +4 -4
- package/js/src/bitflyer.d.ts +2 -2
- package/js/src/bitget.d.ts +4 -4
- package/js/src/bithumb.d.ts +2 -2
- package/js/src/bitmart.d.ts +4 -4
- package/js/src/bitmex.d.ts +3 -3
- package/js/src/bitopro.d.ts +2 -2
- package/js/src/bitrue.d.ts +2 -2
- package/js/src/bitso.d.ts +2 -2
- package/js/src/bitstamp.d.ts +2 -2
- package/js/src/bitteam.d.ts +2 -2
- package/js/src/bitvavo.d.ts +4 -4
- package/js/src/bl3p.d.ts +2 -2
- package/js/src/blockchaincom.d.ts +2 -2
- package/js/src/blofin.d.ts +4 -4
- package/js/src/btcalpha.d.ts +2 -2
- package/js/src/btcbox.d.ts +2 -2
- package/js/src/btcmarkets.d.ts +2 -2
- package/js/src/btcturk.d.ts +2 -2
- package/js/src/btcturk.js +3 -3
- package/js/src/bybit.d.ts +5 -5
- package/js/src/cex.d.ts +3 -3
- package/js/src/coinbase.d.ts +3 -3
- package/js/src/coinbaseinternational.d.ts +146 -0
- package/js/src/coinbaseinternational.js +2020 -0
- package/js/src/coinbasepro.d.ts +2 -2
- package/js/src/coincheck.d.ts +2 -2
- package/js/src/coinex.d.ts +4 -4
- package/js/src/coinlist.d.ts +3 -3
- package/js/src/coinmate.d.ts +2 -2
- package/js/src/coinmetro.d.ts +2 -2
- package/js/src/coinone.d.ts +2 -2
- package/js/src/coinsph.d.ts +2 -2
- package/js/src/coinspot.d.ts +2 -2
- package/js/src/cryptocom.d.ts +4 -4
- package/js/src/currencycom.d.ts +2 -2
- package/js/src/delta.d.ts +3 -3
- package/js/src/deribit.d.ts +3 -3
- package/js/src/digifinex.d.ts +3 -3
- package/js/src/exmo.d.ts +3 -3
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +1 -1
- package/js/src/gemini.d.ts +2 -2
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hollaex.d.ts +2 -2
- package/js/src/htx.d.ts +5 -5
- package/js/src/huobijp.d.ts +2 -2
- package/js/src/hyperliquid.d.ts +4 -3
- package/js/src/hyperliquid.js +9 -3
- package/js/src/idex.d.ts +2 -2
- package/js/src/independentreserve.d.ts +2 -2
- package/js/src/indodax.d.ts +2 -2
- package/js/src/kraken.d.ts +3 -3
- package/js/src/krakenfutures.d.ts +4 -4
- package/js/src/kucoin.d.ts +4 -4
- package/js/src/kucoinfutures.d.ts +3 -3
- package/js/src/kuna.d.ts +2 -2
- package/js/src/latoken.d.ts +2 -2
- package/js/src/lbank.d.ts +2 -2
- package/js/src/luno.d.ts +2 -2
- package/js/src/lykke.d.ts +2 -2
- package/js/src/mercado.d.ts +2 -2
- package/js/src/mexc.d.ts +2 -2
- package/js/src/mexc.js +1 -1
- package/js/src/ndax.d.ts +3 -3
- package/js/src/novadax.d.ts +2 -2
- package/js/src/oceanex.d.ts +2 -2
- package/js/src/okcoin.d.ts +3 -3
- package/js/src/okx.d.ts +4 -4
- package/js/src/okx.js +1 -1
- package/js/src/onetrading.d.ts +2 -2
- package/js/src/p2b.d.ts +2 -2
- package/js/src/paymium.d.ts +2 -2
- package/js/src/phemex.d.ts +3 -3
- package/js/src/poloniex.d.ts +3 -3
- package/js/src/poloniexfutures.d.ts +2 -2
- package/js/src/pro/binance.d.ts +3 -3
- package/js/src/pro/bitvavo.d.ts +3 -3
- package/js/src/pro/cex.d.ts +3 -3
- package/js/src/pro/coinbaseinternational.d.ts +28 -0
- package/js/src/pro/coinbaseinternational.js +646 -0
- package/js/src/pro/cryptocom.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/kraken.d.ts +3 -3
- package/js/src/pro/okx.d.ts +3 -3
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/probit.d.ts +2 -2
- package/js/src/timex.d.ts +3 -3
- package/js/src/tokocrypto.d.ts +2 -2
- package/js/src/upbit.d.ts +2 -2
- package/js/src/wavesexchange.d.ts +2 -2
- package/js/src/wazirx.d.ts +2 -2
- package/js/src/whitebit.d.ts +2 -2
- package/js/src/woo.d.ts +5 -5
- package/js/src/yobit.d.ts +2 -2
- package/js/src/zaif.d.ts +2 -2
- package/js/src/zonda.d.ts +2 -2
- package/package.json +1 -1
- package/skip-tests.json +13 -0
|
@@ -0,0 +1,646 @@
|
|
|
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 coinbaseinternationalRest from '../coinbaseinternational.js';
|
|
9
|
+
import { AuthenticationError, ExchangeError, NotSupported } from '../base/errors.js';
|
|
10
|
+
import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
|
|
11
|
+
import { ArrayCache } from '../base/ws/Cache.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export default class coinbaseinternational extends coinbaseinternationalRest {
|
|
14
|
+
describe() {
|
|
15
|
+
return this.deepExtend(super.describe(), {
|
|
16
|
+
'has': {
|
|
17
|
+
'ws': true,
|
|
18
|
+
'watchTrades': true,
|
|
19
|
+
'watchTradesForSymbols': true,
|
|
20
|
+
'watchOrderBook': true,
|
|
21
|
+
'watchOrderBookForSymbols': true,
|
|
22
|
+
'watchTicker': true,
|
|
23
|
+
'watchBalance': false,
|
|
24
|
+
'watchMyTrades': false,
|
|
25
|
+
'watchOHLCV': false,
|
|
26
|
+
'watchOHLCVForSymbols': false,
|
|
27
|
+
'watchOrders': false,
|
|
28
|
+
'watchOrdersForSymbols': false,
|
|
29
|
+
'watchPositions': false,
|
|
30
|
+
'watchTickers': false,
|
|
31
|
+
'createOrderWs': false,
|
|
32
|
+
'editOrderWs': false,
|
|
33
|
+
'cancelOrderWs': false,
|
|
34
|
+
'cancelOrdersWs': false,
|
|
35
|
+
'cancelAllOrdersWs': false,
|
|
36
|
+
'fetchOrderWs': false,
|
|
37
|
+
'fetchOrdersWs': false,
|
|
38
|
+
'fetchBalanceWs': false,
|
|
39
|
+
'fetchMyTradesWs': false,
|
|
40
|
+
},
|
|
41
|
+
'urls': {
|
|
42
|
+
'api': {
|
|
43
|
+
'ws': 'wss://ws-md.international.coinbase.com',
|
|
44
|
+
},
|
|
45
|
+
'test': {
|
|
46
|
+
'ws': 'wss://ws-md.n5e2.coinbase.com',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
'options': {
|
|
50
|
+
'watchTicker': {
|
|
51
|
+
'channel': 'LEVEL1', // 'INSTRUMENTS' or 'RISK'
|
|
52
|
+
},
|
|
53
|
+
'tradesLimit': 1000,
|
|
54
|
+
'ordersLimit': 1000,
|
|
55
|
+
'myTradesLimit': 1000,
|
|
56
|
+
},
|
|
57
|
+
'errors': {
|
|
58
|
+
'exact': {
|
|
59
|
+
'Unable to authenticate': AuthenticationError,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async subscribe(name, symbols = undefined, params = {}) {
|
|
65
|
+
/**
|
|
66
|
+
* @ignore
|
|
67
|
+
* @method
|
|
68
|
+
* @description subscribes to a websocket channel
|
|
69
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-overview#subscribe
|
|
70
|
+
* @param {string} name the name of the channel
|
|
71
|
+
* @param {string[]} [symbols] unified market symbol
|
|
72
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
73
|
+
* @returns {object} subscription to a websocket channel
|
|
74
|
+
*/
|
|
75
|
+
this.checkRequiredCredentials();
|
|
76
|
+
let market = undefined;
|
|
77
|
+
let messageHash = name;
|
|
78
|
+
let productIds = [];
|
|
79
|
+
if (symbols === undefined) {
|
|
80
|
+
symbols = this.symbols;
|
|
81
|
+
}
|
|
82
|
+
const symbolsLength = symbols.length;
|
|
83
|
+
if (symbolsLength > 1) {
|
|
84
|
+
const parsedSymbols = this.marketSymbols(symbols);
|
|
85
|
+
const marketIds = this.marketIds(parsedSymbols);
|
|
86
|
+
productIds = marketIds;
|
|
87
|
+
messageHash = messageHash + '::' + parsedSymbols.join(',');
|
|
88
|
+
}
|
|
89
|
+
else if (symbolsLength === 1) {
|
|
90
|
+
market = this.market(symbols[0]);
|
|
91
|
+
messageHash = name + '::' + market['symbol'];
|
|
92
|
+
productIds = [market['id']];
|
|
93
|
+
}
|
|
94
|
+
const url = this.urls['api']['ws'];
|
|
95
|
+
if (url === undefined) {
|
|
96
|
+
throw new NotSupported(this.id + ' is not supported in sandbox environment');
|
|
97
|
+
}
|
|
98
|
+
const timestamp = this.nonce().toString();
|
|
99
|
+
const auth = timestamp + this.apiKey + 'CBINTLMD' + this.password;
|
|
100
|
+
const signature = this.hmac(this.encode(auth), this.base64ToBinary(this.secret), sha256, 'base64');
|
|
101
|
+
const subscribe = {
|
|
102
|
+
'type': 'SUBSCRIBE',
|
|
103
|
+
'product_ids': productIds,
|
|
104
|
+
'channels': [name],
|
|
105
|
+
'time': timestamp,
|
|
106
|
+
'key': this.apiKey,
|
|
107
|
+
'passphrase': this.password,
|
|
108
|
+
'signature': signature,
|
|
109
|
+
};
|
|
110
|
+
return await this.watch(url, messageHash, this.extend(subscribe, params), messageHash);
|
|
111
|
+
}
|
|
112
|
+
async subscribeMultiple(name, symbols = undefined, params = {}) {
|
|
113
|
+
/**
|
|
114
|
+
* @ignore
|
|
115
|
+
* @method
|
|
116
|
+
* @description subscribes to a websocket channel using watchMultiple
|
|
117
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-overview#subscribe
|
|
118
|
+
* @param {string} name the name of the channel
|
|
119
|
+
* @param {string|string[]} [symbol] unified market symbol
|
|
120
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
121
|
+
* @returns {object} subscription to a websocket channel
|
|
122
|
+
*/
|
|
123
|
+
this.checkRequiredCredentials();
|
|
124
|
+
if (this.isEmpty(symbols)) {
|
|
125
|
+
symbols = this.symbols;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
symbols = this.marketSymbols(symbols);
|
|
129
|
+
}
|
|
130
|
+
const messageHashes = [];
|
|
131
|
+
const productIds = [];
|
|
132
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
133
|
+
const marketId = this.marketId(symbols[i]);
|
|
134
|
+
const symbol = this.symbol(marketId);
|
|
135
|
+
productIds.push(marketId);
|
|
136
|
+
messageHashes.push(name + '::' + symbol);
|
|
137
|
+
}
|
|
138
|
+
const url = this.urls['api']['ws'];
|
|
139
|
+
if (url === undefined) {
|
|
140
|
+
throw new NotSupported(this.id + ' is not supported in sandbox environment');
|
|
141
|
+
}
|
|
142
|
+
const timestamp = this.numberToString(this.seconds());
|
|
143
|
+
const auth = timestamp + this.apiKey + 'CBINTLMD' + this.password;
|
|
144
|
+
const signature = this.hmac(this.encode(auth), this.base64ToBinary(this.secret), sha256, 'base64');
|
|
145
|
+
const subscribe = {
|
|
146
|
+
'type': 'SUBSCRIBE',
|
|
147
|
+
'time': timestamp,
|
|
148
|
+
'product_ids': productIds,
|
|
149
|
+
'channels': [name],
|
|
150
|
+
'key': this.apiKey,
|
|
151
|
+
'passphrase': this.password,
|
|
152
|
+
'signature': signature,
|
|
153
|
+
};
|
|
154
|
+
return await this.watchMultiple(url, messageHashes, this.extend(subscribe, params), messageHashes);
|
|
155
|
+
}
|
|
156
|
+
async watchFundingRate(symbol, params = {}) {
|
|
157
|
+
/**
|
|
158
|
+
* @method
|
|
159
|
+
* @name coinbaseinternational#watchFundingRate
|
|
160
|
+
* @description watch the current funding rate
|
|
161
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#funding-channel
|
|
162
|
+
* @param {string} symbol unified market symbol
|
|
163
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
164
|
+
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
|
|
165
|
+
*/
|
|
166
|
+
return await this.subscribe('RISK', [symbol], params);
|
|
167
|
+
}
|
|
168
|
+
async watchFundingRates(symbols, params = {}) {
|
|
169
|
+
/**
|
|
170
|
+
* @method
|
|
171
|
+
* @name coinbaseinternational#watchFundingRates
|
|
172
|
+
* @description watch the funding rate for multiple markets
|
|
173
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#funding-channel
|
|
174
|
+
* @param {string[]|undefined} symbols list of unified market symbols
|
|
175
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
176
|
+
* @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
|
|
177
|
+
*/
|
|
178
|
+
return await this.subscribeMultiple('RISK', symbols, params);
|
|
179
|
+
}
|
|
180
|
+
async watchTicker(symbol, params = {}) {
|
|
181
|
+
/**
|
|
182
|
+
* @method
|
|
183
|
+
* @name coinbaseinternational#watchTicker
|
|
184
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
185
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#instruments-channel
|
|
186
|
+
* @param {string} [symbol] unified symbol of the market to fetch the ticker for
|
|
187
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
188
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
189
|
+
*/
|
|
190
|
+
let channel = undefined;
|
|
191
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchTicker', 'channel', 'LEVEL1');
|
|
192
|
+
return await this.subscribe(channel, [symbol], params);
|
|
193
|
+
}
|
|
194
|
+
handleInstrument(client, message) {
|
|
195
|
+
//
|
|
196
|
+
// {
|
|
197
|
+
// "sequence": 1,
|
|
198
|
+
// "product_id": "ETH-PERP",
|
|
199
|
+
// "instrument_type": "PERP",
|
|
200
|
+
// "base_asset_name": "ETH",
|
|
201
|
+
// "quote_asset_name": "USDC",
|
|
202
|
+
// "base_increment": "0.0001",
|
|
203
|
+
// "quote_increment": "0.01",
|
|
204
|
+
// "avg_daily_quantity": "43.0",
|
|
205
|
+
// "avg_daily_volume": "80245.2",
|
|
206
|
+
// "total_30_day_quantity":"1443.0",
|
|
207
|
+
// "total_30_day_volume":"3040449.0",
|
|
208
|
+
// "total_24_hour_quantity":"48.1",
|
|
209
|
+
// "total_24_hour_volume":"101348.3",
|
|
210
|
+
// "base_imf": "0.2",
|
|
211
|
+
// "min_quantity": "0.0001",
|
|
212
|
+
// "position_size_limit": "500",
|
|
213
|
+
// "funding_interval": "60000000000",
|
|
214
|
+
// "trading_state": "trading",
|
|
215
|
+
// "last_update_time": "2023-05-04T11:16:33.016Z",
|
|
216
|
+
// "time": "2023-05-10T14:58:47.000Z",
|
|
217
|
+
// "channel":"INSTRUMENTS",
|
|
218
|
+
// "type":"SNAPSHOT"
|
|
219
|
+
// }
|
|
220
|
+
const ticker = this.parseWsInstrument(message);
|
|
221
|
+
const channel = this.safeString(message, 'channel');
|
|
222
|
+
client.resolve(ticker, channel);
|
|
223
|
+
client.resolve(ticker, channel + '::' + ticker['symbol']);
|
|
224
|
+
}
|
|
225
|
+
parseWsInstrument(ticker, market = undefined) {
|
|
226
|
+
//
|
|
227
|
+
// {
|
|
228
|
+
// "sequence": 1,
|
|
229
|
+
// "product_id": "ETH-PERP",
|
|
230
|
+
// "instrument_type": "PERP",
|
|
231
|
+
// "base_asset_name": "ETH",
|
|
232
|
+
// "quote_asset_name": "USDC",
|
|
233
|
+
// "base_increment": "0.0001",
|
|
234
|
+
// "quote_increment": "0.01",
|
|
235
|
+
// "avg_daily_quantity": "43.0",
|
|
236
|
+
// "avg_daily_volume": "80245.2",
|
|
237
|
+
// "total_30_day_quantity":"1443.0",
|
|
238
|
+
// "total_30_day_volume":"3040449.0",
|
|
239
|
+
// "total_24_hour_quantity":"48.1",
|
|
240
|
+
// "total_24_hour_volume":"101348.3",
|
|
241
|
+
// "base_imf": "0.2",
|
|
242
|
+
// "min_quantity": "0.0001",
|
|
243
|
+
// "position_size_limit": "500",
|
|
244
|
+
// "funding_interval": "60000000000",
|
|
245
|
+
// "trading_state": "trading",
|
|
246
|
+
// "last_update_time": "2023-05-04T11:16:33.016Z",
|
|
247
|
+
// "time": "2023-05-10T14:58:47.000Z",
|
|
248
|
+
// "channel":"INSTRUMENTS",
|
|
249
|
+
// "type":"SNAPSHOT"
|
|
250
|
+
// }
|
|
251
|
+
//
|
|
252
|
+
const marketId = this.safeString(ticker, 'product_id');
|
|
253
|
+
const datetime = this.safeString(ticker, 'time');
|
|
254
|
+
return this.safeTicker({
|
|
255
|
+
'info': ticker,
|
|
256
|
+
'symbol': this.safeSymbol(marketId, market, '-'),
|
|
257
|
+
'timestamp': this.parse8601(datetime),
|
|
258
|
+
'datetime': datetime,
|
|
259
|
+
'high': undefined,
|
|
260
|
+
'low': undefined,
|
|
261
|
+
'bid': undefined,
|
|
262
|
+
'bidVolume': undefined,
|
|
263
|
+
'ask': undefined,
|
|
264
|
+
'askVolume': undefined,
|
|
265
|
+
'vwap': undefined,
|
|
266
|
+
'open': undefined,
|
|
267
|
+
'close': undefined,
|
|
268
|
+
'last': undefined,
|
|
269
|
+
'previousClose': undefined,
|
|
270
|
+
'change': undefined,
|
|
271
|
+
'percentage': undefined,
|
|
272
|
+
'average': undefined,
|
|
273
|
+
'baseVolume': this.safeString(ticker, 'total_24_hour_quantity'),
|
|
274
|
+
'quoteVolume': this.safeString(ticker, 'total_24_hour_volume'),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
handleTicker(client, message) {
|
|
278
|
+
//
|
|
279
|
+
// snapshot
|
|
280
|
+
// {
|
|
281
|
+
// "sequence": 0,
|
|
282
|
+
// "product_id": "BTC-PERP",
|
|
283
|
+
// "time": "2023-05-10T14:58:47.000Z",
|
|
284
|
+
// "bid_price": "28787.8",
|
|
285
|
+
// "bid_qty": "0.466", // One side book
|
|
286
|
+
// "channel": "LEVEL1",
|
|
287
|
+
// "type": "SNAPSHOT"
|
|
288
|
+
// }
|
|
289
|
+
// update
|
|
290
|
+
// {
|
|
291
|
+
// "sequence": 1,
|
|
292
|
+
// "product_id": "BTC-PERP",
|
|
293
|
+
// "time": "2023-05-10T14:58:47.547Z",
|
|
294
|
+
// "bid_price": "28787.8",
|
|
295
|
+
// "bid_qty": "0.466",
|
|
296
|
+
// "ask_price": "28788.8",
|
|
297
|
+
// "ask_qty": "1.566",
|
|
298
|
+
// "channel": "LEVEL1",
|
|
299
|
+
// "type": "UPDATE"
|
|
300
|
+
// }
|
|
301
|
+
//
|
|
302
|
+
const ticker = this.parseWsTicker(message);
|
|
303
|
+
const channel = this.safeString(message, 'channel');
|
|
304
|
+
client.resolve(ticker, channel);
|
|
305
|
+
client.resolve(ticker, channel + '::' + ticker['symbol']);
|
|
306
|
+
}
|
|
307
|
+
parseWsTicker(ticker, market = undefined) {
|
|
308
|
+
//
|
|
309
|
+
// {
|
|
310
|
+
// "sequence": 1,
|
|
311
|
+
// "product_id": "BTC-PERP",
|
|
312
|
+
// "time": "2023-05-10T14:58:47.547Z",
|
|
313
|
+
// "bid_price": "28787.8",
|
|
314
|
+
// "bid_qty": "0.466",
|
|
315
|
+
// "ask_price": "28788.8",
|
|
316
|
+
// "ask_qty": "1.566",
|
|
317
|
+
// "channel": "LEVEL1",
|
|
318
|
+
// "type": "UPDATE"
|
|
319
|
+
// }
|
|
320
|
+
//
|
|
321
|
+
const datetime = this.safeString(ticker, 'time');
|
|
322
|
+
const marketId = this.safeString(ticker, 'product_id');
|
|
323
|
+
return this.safeTicker({
|
|
324
|
+
'info': ticker,
|
|
325
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
326
|
+
'timestamp': this.parse8601(datetime),
|
|
327
|
+
'datetime': datetime,
|
|
328
|
+
'bid': this.safeNumber(ticker, 'bid_price'),
|
|
329
|
+
'bidVolume': this.safeNumber(ticker, 'bid_qty'),
|
|
330
|
+
'ask': this.safeNumber(ticker, 'ask_price'),
|
|
331
|
+
'askVolume': this.safeNumber(ticker, 'ask_qty'),
|
|
332
|
+
'high': undefined,
|
|
333
|
+
'low': undefined,
|
|
334
|
+
'open': undefined,
|
|
335
|
+
'close': undefined,
|
|
336
|
+
'last': undefined,
|
|
337
|
+
'change': undefined,
|
|
338
|
+
'percentage': undefined,
|
|
339
|
+
'average': undefined,
|
|
340
|
+
'vwap': undefined,
|
|
341
|
+
'baseVolume': undefined,
|
|
342
|
+
'quoteVolume': undefined,
|
|
343
|
+
'previousClose': undefined,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
347
|
+
/**
|
|
348
|
+
* @method
|
|
349
|
+
* @name coinbaseinternational#watchTrades
|
|
350
|
+
* @description get the list of most recent trades for a particular symbol
|
|
351
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#match-channel
|
|
352
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
353
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
354
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
355
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
356
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
357
|
+
*/
|
|
358
|
+
return await this.watchTradesForSymbols([symbol], since, limit, params);
|
|
359
|
+
}
|
|
360
|
+
async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
361
|
+
/**
|
|
362
|
+
* @method
|
|
363
|
+
* @name coinbaseinternational#watchTradesForSymbols
|
|
364
|
+
* @description get the list of most recent trades for a list of symbols
|
|
365
|
+
* @param {string[]} symbols unified symbol of the market to fetch trades for
|
|
366
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
367
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
368
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
369
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
370
|
+
*/
|
|
371
|
+
await this.loadMarkets();
|
|
372
|
+
symbols = this.marketSymbols(symbols, undefined, false, true, true);
|
|
373
|
+
const trades = await this.subscribeMultiple('MATCH', symbols, params);
|
|
374
|
+
if (this.newUpdates) {
|
|
375
|
+
const first = this.safeDict(trades, 0);
|
|
376
|
+
const tradeSymbol = this.safeString(first, 'symbol');
|
|
377
|
+
limit = trades.getLimit(tradeSymbol, limit);
|
|
378
|
+
}
|
|
379
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
380
|
+
}
|
|
381
|
+
handleTrade(client, message) {
|
|
382
|
+
//
|
|
383
|
+
// {
|
|
384
|
+
// "sequence": 0,
|
|
385
|
+
// "product_id": "BTC-PERP",
|
|
386
|
+
// "time": "2023-05-10T14:58:47.002Z",
|
|
387
|
+
// "match_id": "177101110052388865",
|
|
388
|
+
// "trade_qty": "0.006",
|
|
389
|
+
// "aggressor_side": "BUY",
|
|
390
|
+
// "trade_price": "28833.1",
|
|
391
|
+
// "channel": "MATCH",
|
|
392
|
+
// "type": "UPDATE"
|
|
393
|
+
// }
|
|
394
|
+
//
|
|
395
|
+
const trade = this.parseWsTrade(message);
|
|
396
|
+
const symbol = trade['symbol'];
|
|
397
|
+
const channel = this.safeString(message, 'channel');
|
|
398
|
+
if (!(symbol in this.trades)) {
|
|
399
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
400
|
+
const tradesArrayCache = new ArrayCache(limit);
|
|
401
|
+
this.trades[symbol] = tradesArrayCache;
|
|
402
|
+
}
|
|
403
|
+
const tradesArray = this.trades[symbol];
|
|
404
|
+
tradesArray.append(trade);
|
|
405
|
+
this.trades[symbol] = tradesArray;
|
|
406
|
+
client.resolve(tradesArray, channel);
|
|
407
|
+
client.resolve(tradesArray, channel + '::' + trade['symbol']);
|
|
408
|
+
return message;
|
|
409
|
+
}
|
|
410
|
+
parseWsTrade(trade, market = undefined) {
|
|
411
|
+
//
|
|
412
|
+
// {
|
|
413
|
+
// "sequence": 0,
|
|
414
|
+
// "product_id": "BTC-PERP",
|
|
415
|
+
// "time": "2023-05-10T14:58:47.002Z",
|
|
416
|
+
// "match_id": "177101110052388865",
|
|
417
|
+
// "trade_qty": "0.006",
|
|
418
|
+
// "aggressor_side": "BUY",
|
|
419
|
+
// "trade_price": "28833.1",
|
|
420
|
+
// "channel": "MATCH",
|
|
421
|
+
// "type": "UPDATE"
|
|
422
|
+
// }
|
|
423
|
+
const marketId = this.safeString2(trade, 'symbol', 'product_id');
|
|
424
|
+
const datetime = this.safeString(trade, 'time');
|
|
425
|
+
return this.safeTrade({
|
|
426
|
+
'info': trade,
|
|
427
|
+
'id': this.safeString(trade, 'match_id'),
|
|
428
|
+
'order': undefined,
|
|
429
|
+
'timestamp': this.parse8601(datetime),
|
|
430
|
+
'datetime': datetime,
|
|
431
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
432
|
+
'type': undefined,
|
|
433
|
+
'side': this.safeStringLower(trade, 'agressor_side'),
|
|
434
|
+
'takerOrMaker': undefined,
|
|
435
|
+
'price': this.safeString(trade, 'trade_price'),
|
|
436
|
+
'amount': this.safeString(trade, 'trade_qty'),
|
|
437
|
+
'cost': undefined,
|
|
438
|
+
'fee': undefined,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
442
|
+
/**
|
|
443
|
+
* @method
|
|
444
|
+
* @name coinbaseinternational#watchOrderBook
|
|
445
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
446
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#level2-channel
|
|
447
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
448
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
449
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
450
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
451
|
+
*/
|
|
452
|
+
return await this.watchOrderBookForSymbols([symbol], limit, params);
|
|
453
|
+
}
|
|
454
|
+
async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
|
|
455
|
+
/**
|
|
456
|
+
* @method
|
|
457
|
+
* @name coinbaseinternational#watchOrderBook
|
|
458
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
459
|
+
* @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#level2-channel
|
|
460
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
461
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
462
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
463
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
464
|
+
*/
|
|
465
|
+
await this.loadMarkets();
|
|
466
|
+
return await this.subscribeMultiple('LEVEL2', symbols, params);
|
|
467
|
+
}
|
|
468
|
+
handleOrderBook(client, message) {
|
|
469
|
+
//
|
|
470
|
+
// snapshot
|
|
471
|
+
// {
|
|
472
|
+
// "sequence": 0,
|
|
473
|
+
// "product_id": "BTC-PERP",
|
|
474
|
+
// "time": "2023-05-10T14:58:47.000Z",
|
|
475
|
+
// "bids": [
|
|
476
|
+
// ["29100", "0.02"],
|
|
477
|
+
// ["28950", "0.01"],
|
|
478
|
+
// ["28900", "0.01"]
|
|
479
|
+
// ],
|
|
480
|
+
// "asks": [
|
|
481
|
+
// ["29267.8", "18"],
|
|
482
|
+
// ["29747.6", "18"],
|
|
483
|
+
// ["30227.4", "9"]
|
|
484
|
+
// ],
|
|
485
|
+
// "channel": "LEVEL2",
|
|
486
|
+
// "type": "SNAPSHOT",
|
|
487
|
+
// }
|
|
488
|
+
// update
|
|
489
|
+
// {
|
|
490
|
+
// "sequence": 1,
|
|
491
|
+
// "product_id": "BTC-PERP",
|
|
492
|
+
// "time": "2023-05-10T14:58:47.375Z",
|
|
493
|
+
// "changes": [
|
|
494
|
+
// [
|
|
495
|
+
// "BUY",
|
|
496
|
+
// "28787.7",
|
|
497
|
+
// "6"
|
|
498
|
+
// ]
|
|
499
|
+
// ],
|
|
500
|
+
// "channel": "LEVEL2",
|
|
501
|
+
// "type": "UPDATE"
|
|
502
|
+
// }
|
|
503
|
+
//
|
|
504
|
+
const type = this.safeString(message, 'type');
|
|
505
|
+
const marketId = this.safeString(message, 'product_id');
|
|
506
|
+
const symbol = this.safeSymbol(marketId);
|
|
507
|
+
const datetime = this.safeString(message, 'time');
|
|
508
|
+
const channel = this.safeString(message, 'channel');
|
|
509
|
+
if (!(symbol in this.orderbooks)) {
|
|
510
|
+
const limit = this.safeInteger(this.options, 'watchOrderBookLimit', 1000);
|
|
511
|
+
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
512
|
+
}
|
|
513
|
+
const orderbook = this.orderbooks[symbol];
|
|
514
|
+
if (type === 'SNAPSHOT') {
|
|
515
|
+
const parsedSnapshot = this.parseOrderBook(message, symbol, undefined, 'bids', 'asks');
|
|
516
|
+
orderbook.reset(parsedSnapshot);
|
|
517
|
+
orderbook['symbol'] = symbol;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
const changes = this.safeList(message, 'changes', []);
|
|
521
|
+
this.handleDeltas(orderbook, changes);
|
|
522
|
+
}
|
|
523
|
+
orderbook['nonce'] = this.safeInteger(message, 'sequence');
|
|
524
|
+
orderbook['datetime'] = datetime;
|
|
525
|
+
orderbook['timestamp'] = this.parse8601(datetime);
|
|
526
|
+
this.orderbooks[symbol] = orderbook;
|
|
527
|
+
client.resolve(orderbook, channel + '::' + symbol);
|
|
528
|
+
}
|
|
529
|
+
handleDelta(orderbook, delta) {
|
|
530
|
+
const rawSide = this.safeStringLower(delta, 0);
|
|
531
|
+
const side = (rawSide === 'buy') ? 'bids' : 'asks';
|
|
532
|
+
const price = this.safeFloat(delta, 1);
|
|
533
|
+
const amount = this.safeFloat(delta, 2);
|
|
534
|
+
const bookside = orderbook[side];
|
|
535
|
+
bookside.store(price, amount);
|
|
536
|
+
}
|
|
537
|
+
handleDeltas(orderbook, deltas) {
|
|
538
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
539
|
+
this.handleDelta(orderbook, deltas[i]);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
handleSubscriptionStatus(client, message) {
|
|
543
|
+
//
|
|
544
|
+
// {
|
|
545
|
+
// "channels": [
|
|
546
|
+
// {
|
|
547
|
+
// "name": "MATCH",
|
|
548
|
+
// "product_ids": [
|
|
549
|
+
// "BTC-PERP",
|
|
550
|
+
// "ETH-PERP"
|
|
551
|
+
// ]
|
|
552
|
+
// },
|
|
553
|
+
// {
|
|
554
|
+
// "name": "INSTRUMENTS",
|
|
555
|
+
// "product_ids": [
|
|
556
|
+
// "BTC-PERP",
|
|
557
|
+
// "ETH-PERP"
|
|
558
|
+
// ]
|
|
559
|
+
// }
|
|
560
|
+
// ],
|
|
561
|
+
// "authenticated": true,
|
|
562
|
+
// "channel": "SUBSCRIPTIONS",
|
|
563
|
+
// "type": "SNAPSHOT",
|
|
564
|
+
// "time": "2023-05-30T16:53:46.847Z"
|
|
565
|
+
// }
|
|
566
|
+
//
|
|
567
|
+
return message;
|
|
568
|
+
}
|
|
569
|
+
handleFundingRate(client, message) {
|
|
570
|
+
//
|
|
571
|
+
// snapshot
|
|
572
|
+
// {
|
|
573
|
+
// "sequence": 0,
|
|
574
|
+
// "product_id": "BTC-PERP",
|
|
575
|
+
// "time": "2023-05-10T14:58:47.000Z",
|
|
576
|
+
// "funding_rate": "0.001387",
|
|
577
|
+
// "is_final": true,
|
|
578
|
+
// "channel": "FUNDING",
|
|
579
|
+
// "type": "SNAPSHOT"
|
|
580
|
+
// }
|
|
581
|
+
// update
|
|
582
|
+
// {
|
|
583
|
+
// "sequence": 1,
|
|
584
|
+
// "product_id": "BTC-PERP",
|
|
585
|
+
// "time": "2023-05-10T15:00:00.000Z",
|
|
586
|
+
// "funding_rate": "0.001487",
|
|
587
|
+
// "is_final": false,
|
|
588
|
+
// "channel": "FUNDING",
|
|
589
|
+
// "type": "UPDATE"
|
|
590
|
+
// }
|
|
591
|
+
//
|
|
592
|
+
const channel = this.safeString(message, 'channel');
|
|
593
|
+
const fundingRate = this.parseFundingRate(message);
|
|
594
|
+
client.resolve(fundingRate, channel + '::' + fundingRate['symbol']);
|
|
595
|
+
}
|
|
596
|
+
handleErrorMessage(client, message) {
|
|
597
|
+
//
|
|
598
|
+
// {
|
|
599
|
+
// message: 'Failed to subscribe',
|
|
600
|
+
// reason: 'Unable to authenticate',
|
|
601
|
+
// channel: 'SUBSCRIPTIONS',
|
|
602
|
+
// type: 'REJECT'
|
|
603
|
+
// }
|
|
604
|
+
//
|
|
605
|
+
const type = this.safeString(message, 'type');
|
|
606
|
+
if (type !== 'REJECT') {
|
|
607
|
+
return false;
|
|
608
|
+
}
|
|
609
|
+
const reason = this.safeString(message, 'reason');
|
|
610
|
+
const errMsg = this.safeString(message, 'message');
|
|
611
|
+
try {
|
|
612
|
+
const feedback = this.id + ' ' + errMsg + reason;
|
|
613
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], reason, feedback);
|
|
614
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], reason, feedback);
|
|
615
|
+
throw new ExchangeError(feedback);
|
|
616
|
+
}
|
|
617
|
+
catch (e) {
|
|
618
|
+
client.reject(e);
|
|
619
|
+
}
|
|
620
|
+
return true;
|
|
621
|
+
}
|
|
622
|
+
handleMessage(client, message) {
|
|
623
|
+
if (this.handleErrorMessage(client, message)) {
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const channel = this.safeString(message, 'channel');
|
|
627
|
+
const methods = {
|
|
628
|
+
'SUBSCRIPTIONS': this.handleSubscriptionStatus,
|
|
629
|
+
'INSTRUMENTS': this.handleInstrument,
|
|
630
|
+
'LEVEL1': this.handleTicker,
|
|
631
|
+
'MATCH': this.handleTrade,
|
|
632
|
+
'LEVEL2': this.handleOrderBook,
|
|
633
|
+
'FUNDING': this.handleFundingRate,
|
|
634
|
+
'RISK': this.handleTicker,
|
|
635
|
+
};
|
|
636
|
+
const type = this.safeString(message, 'type');
|
|
637
|
+
if (type === 'error') {
|
|
638
|
+
const errorMessage = this.safeString(message, 'message');
|
|
639
|
+
throw new ExchangeError(errorMessage);
|
|
640
|
+
}
|
|
641
|
+
const method = this.safeValue(methods, channel);
|
|
642
|
+
if (method !== undefined) {
|
|
643
|
+
method.call(this, client, message);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import cryptocomRest from '../cryptocom.js';
|
|
2
|
-
import type { Int, OrderSide, OrderType, Str, Strings, OrderBook, Order, Trade, Ticker, OHLCV, Position, Balances } from '../base/types.js';
|
|
2
|
+
import type { Int, OrderSide, OrderType, Str, Strings, OrderBook, Order, Trade, Ticker, OHLCV, Position, Balances, Num } from '../base/types.js';
|
|
3
3
|
import Client from '../base/ws/Client.js';
|
|
4
4
|
export default class cryptocom extends cryptocomRest {
|
|
5
5
|
describe(): any;
|
|
@@ -25,7 +25,7 @@ export default class cryptocom extends cryptocomRest {
|
|
|
25
25
|
handlePositions(client: any, message: any): void;
|
|
26
26
|
watchBalance(params?: {}): Promise<Balances>;
|
|
27
27
|
handleBalance(client: Client, message: any): void;
|
|
28
|
-
createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?:
|
|
28
|
+
createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
|
|
29
29
|
handleOrder(client: Client, message: any): void;
|
|
30
30
|
cancelOrderWs(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
31
31
|
cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
|
package/js/src/pro/hitbtc.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import hitbtcRest from '../hitbtc.js';
|
|
2
|
-
import type { Tickers, Int, OHLCV, OrderSide, OrderType, Strings } from '../base/types.js';
|
|
2
|
+
import type { Tickers, Int, OHLCV, OrderSide, OrderType, Strings, Num } from '../base/types.js';
|
|
3
3
|
import Client from '../base/ws/Client.js';
|
|
4
4
|
import { Str, OrderBook, Order, Trade, Ticker, Balances } from '../base/types';
|
|
5
5
|
export default class hitbtc extends hitbtcRest {
|
|
@@ -29,7 +29,7 @@ export default class hitbtc extends hitbtcRest {
|
|
|
29
29
|
parseWsOrderTrade(trade: any, market?: any): Trade;
|
|
30
30
|
parseWsOrder(order: any, market?: any): Order;
|
|
31
31
|
watchBalance(params?: {}): Promise<Balances>;
|
|
32
|
-
createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?:
|
|
32
|
+
createOrderWs(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
|
|
33
33
|
cancelOrderWs(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
34
34
|
cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
|
|
35
35
|
fetchOpenOrdersWs(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|