ccxt 4.1.23 → 4.1.25
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 +3 -3
- package/dist/ccxt.browser.js +1249 -232
- package/dist/ccxt.browser.min.js +4 -4
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/ace.js +1 -1
- package/dist/cjs/src/base/Exchange.js +7 -3
- package/dist/cjs/src/base/functions/crypto.js +11 -2
- package/dist/cjs/src/base/functions/generic.js +5 -3
- package/dist/cjs/src/base/functions.js +1 -0
- package/dist/cjs/src/binance.js +112 -34
- package/dist/cjs/src/bitget.js +289 -21
- package/dist/cjs/src/bitmart.js +1 -1
- package/dist/cjs/src/bybit.js +132 -15
- package/dist/cjs/src/cryptocom.js +262 -15
- package/dist/cjs/src/gate.js +191 -88
- package/dist/cjs/src/krakenfutures.js +158 -22
- package/dist/cjs/src/oceanex.js +0 -12
- package/dist/cjs/src/okx.js +60 -1
- package/dist/cjs/src/pro/bybit.js +1 -1
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +8 -6
- package/dist/cjs/src/wavesexchange.js +6 -6
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/binance.d.ts +1 -14
- package/js/src/abstract/binancecoinm.d.ts +1 -14
- package/js/src/abstract/binanceus.d.ts +1 -14
- package/js/src/abstract/binanceusdm.d.ts +1 -14
- package/js/src/abstract/gate.d.ts +2 -7
- package/js/src/abstract/gateio.d.ts +2 -7
- package/js/src/ace.js +1 -1
- package/js/src/base/Exchange.d.ts +4 -2
- package/js/src/base/Exchange.js +7 -3
- package/js/src/base/functions/crypto.d.ts +3 -2
- package/js/src/base/functions/crypto.js +11 -3
- package/js/src/base/functions/generic.d.ts +1 -1
- package/js/src/base/functions/generic.js +5 -3
- package/js/src/base/types.d.ts +8 -0
- package/js/src/binance.d.ts +2 -1
- package/js/src/binance.js +112 -34
- package/js/src/bitget.d.ts +15 -1
- package/js/src/bitget.js +289 -21
- package/js/src/bitmart.js +1 -1
- package/js/src/bybit.d.ts +4 -2
- package/js/src/bybit.js +132 -15
- package/js/src/cryptocom.d.ts +4 -1
- package/js/src/cryptocom.js +262 -15
- package/js/src/gate.d.ts +3 -1
- package/js/src/gate.js +191 -88
- package/js/src/krakenfutures.d.ts +4 -1
- package/js/src/krakenfutures.js +158 -22
- package/js/src/oceanex.d.ts +0 -1
- package/js/src/oceanex.js +0 -12
- package/js/src/okx.d.ts +2 -1
- package/js/src/okx.js +60 -1
- package/js/src/pro/bybit.js +1 -1
- package/js/src/static_dependencies/noble-curves/abstract/edwards.d.ts +1 -0
- package/js/src/static_dependencies/noble-curves/abstract/edwards.js +5 -3
- package/js/src/wavesexchange.js +7 -7
- package/package.json +1 -1
- package/skip-tests.json +2 -3
- package/js/src/bkex.d.ts +0 -95
- package/js/src/bkex.js +0 -1962
- package/js/src/pro/btcex.d.ts +0 -32
- package/js/src/pro/btcex.js +0 -776
- package/js/src/pro/ripio.d.ts +0 -18
- package/js/src/pro/ripio.js +0 -296
- package/js/src/pro/zb.d.ts +0 -22
- package/js/src/pro/zb.js +0 -605
package/js/src/binance.js
CHANGED
|
@@ -11,6 +11,8 @@ import { Precise } from './base/Precise.js';
|
|
|
11
11
|
import { TRUNCATE, DECIMAL_PLACES } from './base/functions/number.js';
|
|
12
12
|
import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
|
|
13
13
|
import { rsa } from './base/functions/rsa.js';
|
|
14
|
+
import { eddsa } from './base/functions/crypto.js';
|
|
15
|
+
import { ed25519 } from './static_dependencies/noble-curves/ed25519.js';
|
|
14
16
|
// ---------------------------------------------------------------------------
|
|
15
17
|
/**
|
|
16
18
|
* @class binance
|
|
@@ -40,6 +42,7 @@ export default class binance extends Exchange {
|
|
|
40
42
|
'cancelOrders': true,
|
|
41
43
|
'createDepositAddress': false,
|
|
42
44
|
'createOrder': true,
|
|
45
|
+
'createOrders': true,
|
|
43
46
|
'createPostOnlyOrder': true,
|
|
44
47
|
'createReduceOnlyOrder': true,
|
|
45
48
|
'createStopLimitOrder': true,
|
|
@@ -159,7 +162,6 @@ export default class binance extends Exchange {
|
|
|
159
162
|
'v1': 'https://testnet.binance.vision/api/v1',
|
|
160
163
|
},
|
|
161
164
|
'api': {
|
|
162
|
-
'wapi': 'https://api.binance.com/wapi/v3',
|
|
163
165
|
'sapi': 'https://api.binance.com/sapi/v1',
|
|
164
166
|
'sapiV2': 'https://api.binance.com/sapi/v2',
|
|
165
167
|
'sapiV3': 'https://api.binance.com/sapi/v3',
|
|
@@ -603,27 +605,6 @@ export default class binance extends Exchange {
|
|
|
603
605
|
'sub-account/assets': 0.40002, // Weight(UID): 60 => cost = 0.006667 * 60 = 0.40002
|
|
604
606
|
},
|
|
605
607
|
},
|
|
606
|
-
// deprecated
|
|
607
|
-
'wapi': {
|
|
608
|
-
'post': {
|
|
609
|
-
'withdraw': 1,
|
|
610
|
-
'sub-account/transfer': 1,
|
|
611
|
-
},
|
|
612
|
-
'get': {
|
|
613
|
-
'depositHistory': 1,
|
|
614
|
-
'withdrawHistory': 1,
|
|
615
|
-
'depositAddress': 1,
|
|
616
|
-
'accountStatus': 1,
|
|
617
|
-
'systemStatus': 1,
|
|
618
|
-
'apiTradingStatus': 1,
|
|
619
|
-
'userAssetDribbletLog': 1,
|
|
620
|
-
'tradeFee': 1,
|
|
621
|
-
'assetDetail': 1,
|
|
622
|
-
'sub-account/list': 1,
|
|
623
|
-
'sub-account/transfer/history': 1,
|
|
624
|
-
'sub-account/assets': 1,
|
|
625
|
-
},
|
|
626
|
-
},
|
|
627
608
|
'dapiPublic': {
|
|
628
609
|
'get': {
|
|
629
610
|
'ping': 1,
|
|
@@ -737,6 +718,7 @@ export default class binance extends Exchange {
|
|
|
737
718
|
},
|
|
738
719
|
'fapiData': {
|
|
739
720
|
'get': {
|
|
721
|
+
'delivery-price': 1,
|
|
740
722
|
'openInterestHist': 1,
|
|
741
723
|
'topLongShortAccountRatio': 1,
|
|
742
724
|
'topLongShortPositionRatio': 1,
|
|
@@ -4289,7 +4271,17 @@ export default class binance extends Exchange {
|
|
|
4289
4271
|
// "lastTrade": {"id":"69","time":"1676084430567","price":"24.9","qty":"1.00"},
|
|
4290
4272
|
// "mmp": false
|
|
4291
4273
|
// }
|
|
4274
|
+
// {
|
|
4275
|
+
// cancelOrders/createOrders
|
|
4276
|
+
// "code": -4005,
|
|
4277
|
+
// "msg": "Quantity greater than max quantity."
|
|
4278
|
+
// },
|
|
4292
4279
|
//
|
|
4280
|
+
const code = this.safeString(order, 'code');
|
|
4281
|
+
if (code !== undefined) {
|
|
4282
|
+
// cancelOrders/createOrders might have a partial success
|
|
4283
|
+
return this.safeOrder({ 'info': order, 'status': 'rejected' }, market);
|
|
4284
|
+
}
|
|
4293
4285
|
const status = this.parseOrderStatus(this.safeString(order, 'status'));
|
|
4294
4286
|
const marketId = this.safeString(order, 'symbol');
|
|
4295
4287
|
const marketType = ('closePosition' in order) ? 'contract' : 'spot';
|
|
@@ -4363,6 +4355,85 @@ export default class binance extends Exchange {
|
|
|
4363
4355
|
'trades': fills,
|
|
4364
4356
|
}, market);
|
|
4365
4357
|
}
|
|
4358
|
+
async createOrders(orders, params = {}) {
|
|
4359
|
+
/**
|
|
4360
|
+
* @method
|
|
4361
|
+
* @name binance#createOrders
|
|
4362
|
+
* @description *contract only* create a list of trade orders
|
|
4363
|
+
* @see https://binance-docs.github.io/apidocs/futures/en/#place-multiple-orders-trade
|
|
4364
|
+
* @param {array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
|
4365
|
+
* @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
|
|
4366
|
+
*/
|
|
4367
|
+
await this.loadMarkets();
|
|
4368
|
+
const ordersRequests = [];
|
|
4369
|
+
let orderSymbols = [];
|
|
4370
|
+
for (let i = 0; i < orders.length; i++) {
|
|
4371
|
+
const rawOrder = orders[i];
|
|
4372
|
+
const marketId = this.safeString(rawOrder, 'symbol');
|
|
4373
|
+
orderSymbols.push(marketId);
|
|
4374
|
+
const type = this.safeString(rawOrder, 'type');
|
|
4375
|
+
const side = this.safeString(rawOrder, 'side');
|
|
4376
|
+
const amount = this.safeValue(rawOrder, 'amount');
|
|
4377
|
+
const price = this.safeValue(rawOrder, 'price');
|
|
4378
|
+
const orderParams = this.safeValue(rawOrder, 'params', {});
|
|
4379
|
+
const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
|
|
4380
|
+
ordersRequests.push(orderRequest);
|
|
4381
|
+
}
|
|
4382
|
+
orderSymbols = this.marketSymbols(orderSymbols, undefined, false, true, true);
|
|
4383
|
+
const market = this.market(orderSymbols[0]);
|
|
4384
|
+
if (market['spot']) {
|
|
4385
|
+
throw new NotSupported(this.id + ' createOrders() does not support ' + market['type'] + ' orders');
|
|
4386
|
+
}
|
|
4387
|
+
let response = undefined;
|
|
4388
|
+
let request = {
|
|
4389
|
+
'batchOrders': ordersRequests,
|
|
4390
|
+
};
|
|
4391
|
+
request = this.extend(request, params);
|
|
4392
|
+
if (market['linear']) {
|
|
4393
|
+
response = await this.fapiPrivatePostBatchOrders(request);
|
|
4394
|
+
}
|
|
4395
|
+
else if (market['option']) {
|
|
4396
|
+
response = await this.eapiPrivatePostBatchOrders(request);
|
|
4397
|
+
}
|
|
4398
|
+
else {
|
|
4399
|
+
response = await this.dapiPrivatePostBatchOrders(request);
|
|
4400
|
+
}
|
|
4401
|
+
//
|
|
4402
|
+
// [
|
|
4403
|
+
// {
|
|
4404
|
+
// "code": -4005,
|
|
4405
|
+
// "msg": "Quantity greater than max quantity."
|
|
4406
|
+
// },
|
|
4407
|
+
// {
|
|
4408
|
+
// "orderId": 650640530,
|
|
4409
|
+
// "symbol": "LTCUSDT",
|
|
4410
|
+
// "status": "NEW",
|
|
4411
|
+
// "clientOrderId": "x-xcKtGhcu32184eb13585491289bbaf",
|
|
4412
|
+
// "price": "54.00",
|
|
4413
|
+
// "avgPrice": "0.00",
|
|
4414
|
+
// "origQty": "0.100",
|
|
4415
|
+
// "executedQty": "0.000",
|
|
4416
|
+
// "cumQty": "0.000",
|
|
4417
|
+
// "cumQuote": "0.00000",
|
|
4418
|
+
// "timeInForce": "GTC",
|
|
4419
|
+
// "type": "LIMIT",
|
|
4420
|
+
// "reduceOnly": false,
|
|
4421
|
+
// "closePosition": false,
|
|
4422
|
+
// "side": "BUY",
|
|
4423
|
+
// "positionSide": "BOTH",
|
|
4424
|
+
// "stopPrice": "0.00",
|
|
4425
|
+
// "workingType": "CONTRACT_PRICE",
|
|
4426
|
+
// "priceProtect": false,
|
|
4427
|
+
// "origType": "LIMIT",
|
|
4428
|
+
// "priceMatch": "NONE",
|
|
4429
|
+
// "selfTradePreventionMode": "NONE",
|
|
4430
|
+
// "goodTillDate": 0,
|
|
4431
|
+
// "updateTime": 1698073926929
|
|
4432
|
+
// }
|
|
4433
|
+
// ]
|
|
4434
|
+
//
|
|
4435
|
+
return this.parseOrders(response);
|
|
4436
|
+
}
|
|
4366
4437
|
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
4367
4438
|
/**
|
|
4368
4439
|
* @method
|
|
@@ -8417,9 +8488,6 @@ export default class binance extends Exchange {
|
|
|
8417
8488
|
}
|
|
8418
8489
|
let url = this.urls['api'][api];
|
|
8419
8490
|
url += '/' + path;
|
|
8420
|
-
if (api === 'wapi') {
|
|
8421
|
-
url += '.html';
|
|
8422
|
-
}
|
|
8423
8491
|
if (path === 'historicalTrades') {
|
|
8424
8492
|
if (this.apiKey) {
|
|
8425
8493
|
headers = {
|
|
@@ -8446,7 +8514,7 @@ export default class binance extends Exchange {
|
|
|
8446
8514
|
throw new AuthenticationError(this.id + ' userDataStream endpoint requires `apiKey` credential');
|
|
8447
8515
|
}
|
|
8448
8516
|
}
|
|
8449
|
-
else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === '
|
|
8517
|
+
else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === 'dapiPrivate') || (api === 'dapiPrivateV2') || (api === 'fapiPrivate') || (api === 'fapiPrivateV2') || (api === 'papi')) {
|
|
8450
8518
|
this.checkRequiredCredentials();
|
|
8451
8519
|
if (method === 'POST' && ((path === 'order') || (path === 'sor/order'))) {
|
|
8452
8520
|
// inject in implicit API calls
|
|
@@ -8461,6 +8529,12 @@ export default class binance extends Exchange {
|
|
|
8461
8529
|
}
|
|
8462
8530
|
}
|
|
8463
8531
|
let query = undefined;
|
|
8532
|
+
// handle batchOrders
|
|
8533
|
+
if ((path === 'batchOrders') && (method === 'POST')) {
|
|
8534
|
+
const batchOrders = this.safeValue(params, 'batchOrders');
|
|
8535
|
+
const queryBatch = (this.json(batchOrders));
|
|
8536
|
+
params['batchOrders'] = queryBatch;
|
|
8537
|
+
}
|
|
8464
8538
|
const defaultRecvWindow = this.safeInteger(this.options, 'recvWindow');
|
|
8465
8539
|
let extendedParams = this.extend({
|
|
8466
8540
|
'timestamp': this.nonce(),
|
|
@@ -8499,7 +8573,12 @@ export default class binance extends Exchange {
|
|
|
8499
8573
|
}
|
|
8500
8574
|
let signature = undefined;
|
|
8501
8575
|
if (this.secret.indexOf('PRIVATE KEY') > -1) {
|
|
8502
|
-
|
|
8576
|
+
if (this.secret.length > 120) {
|
|
8577
|
+
signature = this.encodeURIComponent(rsa(query, this.secret, sha256));
|
|
8578
|
+
}
|
|
8579
|
+
else {
|
|
8580
|
+
signature = this.encodeURIComponent(eddsa(this.encode(query), this.secret, ed25519));
|
|
8581
|
+
}
|
|
8503
8582
|
}
|
|
8504
8583
|
else {
|
|
8505
8584
|
signature = this.hmac(this.encode(query), this.encode(this.secret), sha256);
|
|
@@ -8508,7 +8587,7 @@ export default class binance extends Exchange {
|
|
|
8508
8587
|
headers = {
|
|
8509
8588
|
'X-MBX-APIKEY': this.apiKey,
|
|
8510
8589
|
};
|
|
8511
|
-
if ((method === 'GET') || (method === 'DELETE')
|
|
8590
|
+
if ((method === 'GET') || (method === 'DELETE')) {
|
|
8512
8591
|
url += '?' + query;
|
|
8513
8592
|
}
|
|
8514
8593
|
else {
|
|
@@ -8544,7 +8623,6 @@ export default class binance extends Exchange {
|
|
|
8544
8623
|
if (response === undefined) {
|
|
8545
8624
|
return undefined; // fallback to default error handler
|
|
8546
8625
|
}
|
|
8547
|
-
// check success value for wapi endpoints
|
|
8548
8626
|
// response in format {'msg': 'The coin does not exist.', 'success': true/false}
|
|
8549
8627
|
const success = this.safeValue(response, 'success', true);
|
|
8550
8628
|
if (!success) {
|
|
@@ -8599,10 +8677,10 @@ export default class binance extends Exchange {
|
|
|
8599
8677
|
}
|
|
8600
8678
|
if (Array.isArray(response)) {
|
|
8601
8679
|
// cancelOrders returns an array like this: [{"code":-2011,"msg":"Unknown order sent."}]
|
|
8602
|
-
const
|
|
8603
|
-
if (
|
|
8604
|
-
const
|
|
8605
|
-
const errorCode = this.safeString(
|
|
8680
|
+
const arrayLength = response.length;
|
|
8681
|
+
if (arrayLength === 1) { // when there's a single error we can throw, otherwise we have a partial success
|
|
8682
|
+
const element = response[0];
|
|
8683
|
+
const errorCode = this.safeString(element, 'code');
|
|
8606
8684
|
if (errorCode !== undefined) {
|
|
8607
8685
|
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, this.id + ' ' + body);
|
|
8608
8686
|
}
|
|
@@ -8635,7 +8713,7 @@ export default class binance extends Exchange {
|
|
|
8635
8713
|
async request(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined, config = {}, context = {}) {
|
|
8636
8714
|
const response = await this.fetch2(path, api, method, params, headers, body, config);
|
|
8637
8715
|
// a workaround for {"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}
|
|
8638
|
-
if (
|
|
8716
|
+
if (api === 'private') {
|
|
8639
8717
|
this.options['hasAlreadyAuthenticatedSuccessfully'] = true;
|
|
8640
8718
|
}
|
|
8641
8719
|
return response;
|
package/js/src/bitget.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Exchange from './abstract/bitget.js';
|
|
2
|
-
import { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory } from './base/types.js';
|
|
2
|
+
import { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest } from './base/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* @class bitget
|
|
5
5
|
* @extends Exchange
|
|
@@ -150,6 +150,8 @@ export default class bitget extends Exchange {
|
|
|
150
150
|
parseOrderStatus(status: any): string;
|
|
151
151
|
parseOrder(order: any, market?: any): Order;
|
|
152
152
|
createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<Order>;
|
|
153
|
+
createOrderRequest(symbol: any, type: any, side: any, amount: any, price?: any, params?: {}): any;
|
|
154
|
+
createOrders(orders: OrderRequest[], params?: {}): Promise<Order[]>;
|
|
153
155
|
editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
|
|
154
156
|
cancelOrder(id: string, symbol?: string, params?: {}): Promise<Order>;
|
|
155
157
|
cancelOrders(ids: any, symbol?: string, params?: {}): Promise<any>;
|
|
@@ -314,6 +316,18 @@ export default class bitget extends Exchange {
|
|
|
314
316
|
datetime: any;
|
|
315
317
|
info: any;
|
|
316
318
|
};
|
|
319
|
+
fetchMyLiquidations(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Liquidation[]>;
|
|
320
|
+
parseLiquidation(liquidation: any, market?: any): {
|
|
321
|
+
info: any;
|
|
322
|
+
symbol: any;
|
|
323
|
+
contracts: any;
|
|
324
|
+
contractSize: any;
|
|
325
|
+
price: any;
|
|
326
|
+
baseValue: any;
|
|
327
|
+
quoteValue: number;
|
|
328
|
+
timestamp: number;
|
|
329
|
+
datetime: string;
|
|
330
|
+
};
|
|
317
331
|
handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
|
|
318
332
|
sign(path: any, api?: any[], method?: string, params?: {}, headers?: any, body?: any): {
|
|
319
333
|
url: string;
|