@d8x/perpetuals-sdk 0.7.6 → 0.7.7
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/dist/cjs/accountTrade.js +243 -134
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.js +290 -144
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/priceFeedConfig.json +1 -1
- package/dist/cjs/contracts/factories/ERC20__factory.js +12 -9
- package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +12 -9
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +12 -9
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +12 -9
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +12 -9
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/ShareToken__factory.js +12 -9
- package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js +12 -9
- package/dist/cjs/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js +12 -9
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js +12 -9
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/ShareToken__factory.js +12 -9
- package/dist/cjs/contracts/factories/zkevmTestnet/ShareToken__factory.js.map +1 -1
- package/dist/cjs/contracts/index.js +1 -1
- package/dist/cjs/d8XMath.js +66 -65
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/index.js +11 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/liquidatorTool.js +137 -80
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/liquidityProviderTool.js +65 -33
- package/dist/cjs/liquidityProviderTool.js.map +1 -1
- package/dist/cjs/marketData.js +978 -635
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.js +22 -10
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderReferrerTool.js +323 -200
- package/dist/cjs/orderReferrerTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.js +550 -404
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.js +190 -129
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/priceFeeds.js +335 -223
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/traderDigests.js +23 -20
- package/dist/cjs/traderDigests.js.map +1 -1
- package/dist/cjs/traderInterface.js +87 -54
- package/dist/cjs/traderInterface.js.map +1 -1
- package/dist/cjs/triangulator.js +38 -34
- package/dist/cjs/triangulator.js.map +1 -1
- package/dist/cjs/utils.js +32 -18
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/writeAccessHandler.js +112 -78
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/accountTrade.js +237 -126
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.js +284 -136
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/priceFeedConfig.json +1 -1
- package/dist/esm/contracts/factories/ERC20__factory.js +12 -8
- package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +12 -8
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +12 -8
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js +12 -8
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js +12 -8
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/esm/contracts/factories/ShareToken__factory.js +12 -8
- package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js +12 -8
- package/dist/esm/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js +12 -8
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js +12 -8
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/ShareToken__factory.js +12 -8
- package/dist/esm/contracts/factories/zkevmTestnet/ShareToken__factory.js.map +1 -1
- package/dist/esm/d8XMath.js +64 -63
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.js +136 -77
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/liquidityProviderTool.js +63 -29
- package/dist/esm/liquidityProviderTool.js.map +1 -1
- package/dist/esm/marketData.js +971 -626
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.js +48 -36
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderReferrerTool.js +319 -194
- package/dist/esm/orderReferrerTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.js +542 -394
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.js +188 -126
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/priceFeeds.js +332 -218
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/traderDigests.js +19 -15
- package/dist/esm/traderDigests.js.map +1 -1
- package/dist/esm/traderInterface.js +83 -48
- package/dist/esm/traderInterface.js.map +1 -1
- package/dist/esm/triangulator.js +39 -34
- package/dist/esm/triangulator.js.map +1 -1
- package/dist/esm/utils.js +30 -16
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/esm/writeAccessHandler.js +105 -69
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/package.json +1 -1
- package/src/accountTrade.ts +6 -1
- package/src/config/priceFeedConfig.json +1 -1
- package/src/orderReferrerTool.ts +2 -0
- package/src/version.ts +1 -1
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var bignumber_1 = require("@ethersproject/bignumber");
|
|
5
|
+
var constants_1 = require("@ethersproject/constants");
|
|
6
|
+
var nodeSDKTypes_1 = require("./nodeSDKTypes");
|
|
7
|
+
var perpetualDataHandler_1 = tslib_1.__importDefault(require("./perpetualDataHandler"));
|
|
8
|
+
var writeAccessHandler_1 = tslib_1.__importDefault(require("./writeAccessHandler"));
|
|
9
9
|
/**
|
|
10
10
|
* Functions to execute existing conditional orders from the limit order book. This class
|
|
11
11
|
* requires a private key and executes smart-contract interactions that require
|
|
12
12
|
* gas-payments.
|
|
13
13
|
* @extends WriteAccessHandler
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
var OrderReferrerTool = /** @class */ (function (_super) {
|
|
16
|
+
tslib_1.__extends(OrderReferrerTool, _super);
|
|
16
17
|
/**
|
|
17
18
|
* Constructor.
|
|
18
19
|
* @param {NodeSDKConfig} config Configuration object, see PerpetualDataHandler.readSDKConfig.
|
|
@@ -32,10 +33,11 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
32
33
|
*
|
|
33
34
|
* @param {string | Signer} signer Private key or ethers Signer of the account
|
|
34
35
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
function OrderReferrerTool(config, signer) {
|
|
37
|
+
var _this = _super.call(this, config, signer) || this;
|
|
37
38
|
// override parent's gas limit with a lower number
|
|
38
|
-
|
|
39
|
+
_this.gasLimit = 4000000;
|
|
40
|
+
return _this;
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Executes an order by symbol and ID. This action interacts with the blockchain and incurs gas costs.
|
|
@@ -71,46 +73,66 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
71
73
|
* main();
|
|
72
74
|
* @returns Transaction object.
|
|
73
75
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
76
|
+
OrderReferrerTool.prototype.executeOrder = function (symbol, orderId, referrerAddr, submission, overrides) {
|
|
77
|
+
var _a;
|
|
78
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
79
|
+
var orderBookSC, nonce;
|
|
80
|
+
return tslib_1.__generator(this, function (_b) {
|
|
81
|
+
switch (_b.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
if (this.proxyContract == null || this.signer == null) {
|
|
84
|
+
throw Error("no proxy contract or wallet initialized. Use createProxyInstance().");
|
|
85
|
+
}
|
|
86
|
+
orderBookSC = this.getOrderBookContract(symbol);
|
|
87
|
+
if (typeof referrerAddr == "undefined") {
|
|
88
|
+
referrerAddr = this.traderAddr;
|
|
89
|
+
}
|
|
90
|
+
if (!(submission == undefined)) return [3 /*break*/, 2];
|
|
91
|
+
return [4 /*yield*/, this.priceFeedGetter.fetchLatestFeedPriceInfoForPerpetual(symbol)];
|
|
92
|
+
case 1:
|
|
93
|
+
submission = _b.sent();
|
|
94
|
+
_b.label = 2;
|
|
95
|
+
case 2: return [4 /*yield*/, this.signer.getTransactionCount()];
|
|
96
|
+
case 3:
|
|
97
|
+
nonce = _b.sent();
|
|
98
|
+
if (!overrides || overrides.value == undefined) {
|
|
99
|
+
overrides = tslib_1.__assign({ value: submission.timestamps.length * this.PRICE_UPDATE_FEE_GWEI, gasLimit: (_a = overrides === null || overrides === void 0 ? void 0 : overrides.gasLimit) !== null && _a !== void 0 ? _a : this.gasLimit, nonce: nonce }, overrides);
|
|
100
|
+
}
|
|
101
|
+
return [4 /*yield*/, orderBookSC.executeOrder(orderId, referrerAddr, submission.priceFeedVaas, submission.timestamps, overrides)];
|
|
102
|
+
case 4: return [2 /*return*/, _b.sent()];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
OrderReferrerTool.prototype.executeOrders = function (symbol, orderIds, referrerAddr, submission, overrides) {
|
|
108
|
+
var _a;
|
|
109
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
110
|
+
var orderBookSC;
|
|
111
|
+
return tslib_1.__generator(this, function (_b) {
|
|
112
|
+
switch (_b.label) {
|
|
113
|
+
case 0:
|
|
114
|
+
if (this.proxyContract == null || this.signer == null) {
|
|
115
|
+
throw Error("no proxy contract or wallet initialized. Use createProxyInstance().");
|
|
116
|
+
}
|
|
117
|
+
orderBookSC = this.getOrderBookContract(symbol);
|
|
118
|
+
if (typeof referrerAddr == "undefined") {
|
|
119
|
+
referrerAddr = this.traderAddr;
|
|
120
|
+
}
|
|
121
|
+
if (!(submission == undefined)) return [3 /*break*/, 2];
|
|
122
|
+
return [4 /*yield*/, this.priceFeedGetter.fetchLatestFeedPriceInfoForPerpetual(symbol)];
|
|
123
|
+
case 1:
|
|
124
|
+
submission = _b.sent();
|
|
125
|
+
_b.label = 2;
|
|
126
|
+
case 2:
|
|
127
|
+
if (!overrides || overrides.value == undefined) {
|
|
128
|
+
overrides = tslib_1.__assign({ value: submission.timestamps.length * this.PRICE_UPDATE_FEE_GWEI, gasLimit: (_a = overrides === null || overrides === void 0 ? void 0 : overrides.gasLimit) !== null && _a !== void 0 ? _a : this.gasLimit }, overrides);
|
|
129
|
+
}
|
|
130
|
+
return [4 /*yield*/, orderBookSC.executeOrders(orderIds, referrerAddr, submission === null || submission === void 0 ? void 0 : submission.priceFeedVaas, submission === null || submission === void 0 ? void 0 : submission.timestamps, overrides)];
|
|
131
|
+
case 3: return [2 /*return*/, _b.sent()];
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
};
|
|
114
136
|
/**
|
|
115
137
|
* All the orders in the order book for a given symbol that are currently open.
|
|
116
138
|
* @param {string} symbol Symbol of the form ETH-USD-MATIC.
|
|
@@ -131,10 +153,20 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
131
153
|
*
|
|
132
154
|
* @returns Array with all open orders and their IDs.
|
|
133
155
|
*/
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
156
|
+
OrderReferrerTool.prototype.getAllOpenOrders = function (symbol, overrides) {
|
|
157
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
158
|
+
var totalOrders;
|
|
159
|
+
return tslib_1.__generator(this, function (_a) {
|
|
160
|
+
switch (_a.label) {
|
|
161
|
+
case 0: return [4 /*yield*/, this.numberOfOpenOrders(symbol, overrides)];
|
|
162
|
+
case 1:
|
|
163
|
+
totalOrders = _a.sent();
|
|
164
|
+
return [4 /*yield*/, this.pollLimitOrders(symbol, totalOrders, nodeSDKTypes_1.ZERO_ORDER_ID, overrides)];
|
|
165
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
};
|
|
138
170
|
/**
|
|
139
171
|
* Total number of limit orders for this symbol, excluding those that have been cancelled/removed.
|
|
140
172
|
* @param {string} symbol Symbol of the form ETH-USD-MATIC.
|
|
@@ -155,14 +187,24 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
155
187
|
*
|
|
156
188
|
* @returns {number} Number of open orders.
|
|
157
189
|
*/
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
190
|
+
OrderReferrerTool.prototype.numberOfOpenOrders = function (symbol, overrides) {
|
|
191
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
192
|
+
var orderBookSC, numOrders;
|
|
193
|
+
return tslib_1.__generator(this, function (_a) {
|
|
194
|
+
switch (_a.label) {
|
|
195
|
+
case 0:
|
|
196
|
+
if (this.proxyContract == null) {
|
|
197
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
198
|
+
}
|
|
199
|
+
orderBookSC = this.getOrderBookContract(symbol);
|
|
200
|
+
return [4 /*yield*/, orderBookSC.numberOfOrderBookDigests(overrides || {})];
|
|
201
|
+
case 1:
|
|
202
|
+
numOrders = _a.sent();
|
|
203
|
+
return [2 /*return*/, Number(numOrders)];
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
};
|
|
166
208
|
/**
|
|
167
209
|
* Get order from the digest (=id)
|
|
168
210
|
* @param symbol symbol of order book, e.g. ETH-USD-MATIC
|
|
@@ -185,15 +227,26 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
185
227
|
*
|
|
186
228
|
* @returns order or undefined
|
|
187
229
|
*/
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
230
|
+
OrderReferrerTool.prototype.getOrderById = function (symbol, id, overrides) {
|
|
231
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
232
|
+
var ob, smartContractOrder, order;
|
|
233
|
+
return tslib_1.__generator(this, function (_a) {
|
|
234
|
+
switch (_a.label) {
|
|
235
|
+
case 0: return [4 /*yield*/, this.getOrderBookContract(symbol)];
|
|
236
|
+
case 1:
|
|
237
|
+
ob = _a.sent();
|
|
238
|
+
return [4 /*yield*/, ob.orderOfDigest(id, overrides || {})];
|
|
239
|
+
case 2:
|
|
240
|
+
smartContractOrder = _a.sent();
|
|
241
|
+
if (smartContractOrder.traderAddr == nodeSDKTypes_1.ZERO_ADDRESS) {
|
|
242
|
+
return [2 /*return*/, undefined];
|
|
243
|
+
}
|
|
244
|
+
order = OrderReferrerTool.fromSmartContractOrder(smartContractOrder, this.symbolToPerpStaticInfo);
|
|
245
|
+
return [2 /*return*/, order];
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
};
|
|
197
250
|
/**
|
|
198
251
|
* Get a list of active conditional orders in the order book.
|
|
199
252
|
* This a read-only action and does not incur in gas costs.
|
|
@@ -217,25 +270,35 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
217
270
|
*
|
|
218
271
|
* @returns Array of orders and corresponding order IDs
|
|
219
272
|
*/
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
273
|
+
OrderReferrerTool.prototype.pollLimitOrders = function (symbol, numElements, startAfter, overrides) {
|
|
274
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
275
|
+
var orderBookSC, _a, orders, orderIds, userFriendlyOrders, orderIdsOut, k;
|
|
276
|
+
return tslib_1.__generator(this, function (_b) {
|
|
277
|
+
switch (_b.label) {
|
|
278
|
+
case 0:
|
|
279
|
+
if (this.proxyContract == null) {
|
|
280
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
281
|
+
}
|
|
282
|
+
orderBookSC = this.getOrderBookContract(symbol);
|
|
283
|
+
if (typeof startAfter == "undefined") {
|
|
284
|
+
startAfter = nodeSDKTypes_1.ZERO_ORDER_ID;
|
|
285
|
+
}
|
|
286
|
+
return [4 /*yield*/, orderBookSC.pollLimitOrders(startAfter, bignumber_1.BigNumber.from(numElements), overrides || {})];
|
|
287
|
+
case 1:
|
|
288
|
+
_a = tslib_1.__read.apply(void 0, [_b.sent(), 2]), orders = _a[0], orderIds = _a[1];
|
|
289
|
+
userFriendlyOrders = new Array();
|
|
290
|
+
orderIdsOut = [];
|
|
291
|
+
k = 0;
|
|
292
|
+
while (k < orders.length && orders[k].traderAddr != nodeSDKTypes_1.ZERO_ADDRESS) {
|
|
293
|
+
userFriendlyOrders.push(writeAccessHandler_1.default.fromClientOrder(orders[k], this.symbolToPerpStaticInfo));
|
|
294
|
+
orderIdsOut.push(orderIds[k]);
|
|
295
|
+
k++;
|
|
296
|
+
}
|
|
297
|
+
return [2 /*return*/, [userFriendlyOrders, orderIdsOut]];
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
};
|
|
239
302
|
/**
|
|
240
303
|
* Check if a conditional order can be executed
|
|
241
304
|
* @param order order structure
|
|
@@ -258,22 +321,41 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
258
321
|
* main();
|
|
259
322
|
* @returns true if order can be executed for the current state of the perpetuals
|
|
260
323
|
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
324
|
+
OrderReferrerTool.prototype.isTradeable = function (order, blockTimestamp, indexPrices, overrides) {
|
|
325
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
326
|
+
var obj, orderPrice, markPrice, currentBlock;
|
|
327
|
+
return tslib_1.__generator(this, function (_a) {
|
|
328
|
+
switch (_a.label) {
|
|
329
|
+
case 0:
|
|
330
|
+
if (this.proxyContract == null) {
|
|
331
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
332
|
+
}
|
|
333
|
+
if (!(indexPrices == undefined)) return [3 /*break*/, 2];
|
|
334
|
+
return [4 /*yield*/, this.priceFeedGetter.fetchPricesForPerpetual(order.symbol)];
|
|
335
|
+
case 1:
|
|
336
|
+
obj = _a.sent();
|
|
337
|
+
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
338
|
+
_a.label = 2;
|
|
339
|
+
case 2: return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualPrice(order.symbol, order.quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides)];
|
|
340
|
+
case 3:
|
|
341
|
+
orderPrice = _a.sent();
|
|
342
|
+
return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualMarkPrice(order.symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides)];
|
|
343
|
+
case 4:
|
|
344
|
+
markPrice = _a.sent();
|
|
345
|
+
if (!(blockTimestamp == undefined)) return [3 /*break*/, 7];
|
|
346
|
+
return [4 /*yield*/, this.provider.getBlockNumber()];
|
|
347
|
+
case 5:
|
|
348
|
+
currentBlock = _a.sent();
|
|
349
|
+
return [4 /*yield*/, this.provider.getBlock(currentBlock)];
|
|
350
|
+
case 6:
|
|
351
|
+
blockTimestamp = (_a.sent()).timestamp;
|
|
352
|
+
_a.label = 7;
|
|
353
|
+
case 7: return [4 /*yield*/, this._isTradeable(order, orderPrice, markPrice, blockTimestamp, this.symbolToPerpStaticInfo, overrides)];
|
|
354
|
+
case 8: return [2 /*return*/, _a.sent()];
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
};
|
|
277
359
|
/**
|
|
278
360
|
* Check for a batch of orders on the same perpetual whether they can be traded
|
|
279
361
|
* @param orders orders belonging to 1 perpetual
|
|
@@ -281,32 +363,57 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
281
363
|
* if not defined.
|
|
282
364
|
* @returns array of tradeable boolean
|
|
283
365
|
*/
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
366
|
+
OrderReferrerTool.prototype.isTradeableBatch = function (orders, blockTimestamp, indexPrices, overrides) {
|
|
367
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
368
|
+
var obj, orderPrice, markPrice, currentBlock;
|
|
369
|
+
var _this = this;
|
|
370
|
+
return tslib_1.__generator(this, function (_a) {
|
|
371
|
+
switch (_a.label) {
|
|
372
|
+
case 0:
|
|
373
|
+
if (orders.length == 0) {
|
|
374
|
+
return [2 /*return*/, []];
|
|
375
|
+
}
|
|
376
|
+
if (this.proxyContract == null) {
|
|
377
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
378
|
+
}
|
|
379
|
+
if (orders.filter(function (o) { return o.symbol == orders[0].symbol; }).length < orders.length) {
|
|
380
|
+
throw Error("all orders in a batch must have the same symbol");
|
|
381
|
+
}
|
|
382
|
+
if (!(indexPrices == undefined)) return [3 /*break*/, 2];
|
|
383
|
+
return [4 /*yield*/, this.priceFeedGetter.fetchPricesForPerpetual(orders[0].symbol)];
|
|
384
|
+
case 1:
|
|
385
|
+
obj = _a.sent();
|
|
386
|
+
indexPrices = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
387
|
+
_a.label = 2;
|
|
388
|
+
case 2:
|
|
389
|
+
if (indexPrices[2] || indexPrices[3]) {
|
|
390
|
+
// market closed
|
|
391
|
+
return [2 /*return*/, orders.map(function () { return false; })];
|
|
392
|
+
}
|
|
393
|
+
return [4 /*yield*/, Promise.all(orders.map(function (o) {
|
|
394
|
+
return perpetualDataHandler_1.default._queryPerpetualPrice(o.symbol, o.quantity, _this.symbolToPerpStaticInfo, _this.proxyContract, [indexPrices[0], indexPrices[1]], overrides);
|
|
395
|
+
}))];
|
|
396
|
+
case 3:
|
|
397
|
+
orderPrice = _a.sent();
|
|
398
|
+
return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualMarkPrice(orders[0].symbol, this.symbolToPerpStaticInfo, this.proxyContract, [indexPrices[0], indexPrices[1]], overrides)];
|
|
399
|
+
case 4:
|
|
400
|
+
markPrice = _a.sent();
|
|
401
|
+
if (!(blockTimestamp == undefined)) return [3 /*break*/, 7];
|
|
402
|
+
return [4 /*yield*/, this.provider.getBlockNumber()];
|
|
403
|
+
case 5:
|
|
404
|
+
currentBlock = _a.sent();
|
|
405
|
+
return [4 /*yield*/, this.provider.getBlock(currentBlock)];
|
|
406
|
+
case 6:
|
|
407
|
+
blockTimestamp = (_a.sent()).timestamp;
|
|
408
|
+
_a.label = 7;
|
|
409
|
+
case 7: return [4 /*yield*/, Promise.all(orders.map(function (o, idx) {
|
|
410
|
+
return _this._isTradeable(o, orderPrice[idx], markPrice, blockTimestamp, _this.symbolToPerpStaticInfo, overrides);
|
|
411
|
+
}))];
|
|
412
|
+
case 8: return [2 /*return*/, _a.sent()];
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
};
|
|
310
417
|
/**
|
|
311
418
|
* Can the order be executed?
|
|
312
419
|
* @param order order struct
|
|
@@ -316,79 +423,95 @@ class OrderReferrerTool extends writeAccessHandler_1.default {
|
|
|
316
423
|
* @param symbolToPerpInfoMap metadata
|
|
317
424
|
* @returns true if trading conditions met, false otherwise
|
|
318
425
|
*/
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
426
|
+
OrderReferrerTool.prototype._isTradeable = function (order, tradePrice, markPrice, blockTimestamp, symbolToPerpInfoMap, overrides) {
|
|
427
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
428
|
+
var nextBlockTimestamp, lotSize, limitPrice, orderBookContract, parentStatus;
|
|
429
|
+
return tslib_1.__generator(this, function (_a) {
|
|
430
|
+
switch (_a.label) {
|
|
431
|
+
case 0:
|
|
432
|
+
// check expiration date
|
|
433
|
+
if (order.deadline != undefined && order.deadline < Date.now() / 1000) {
|
|
434
|
+
console.log("order expired");
|
|
435
|
+
return [2 /*return*/, false];
|
|
436
|
+
}
|
|
437
|
+
nextBlockTimestamp = blockTimestamp + 2;
|
|
438
|
+
// TODO: replace 2 by a chain-dependent constant - 1 for zkEVM
|
|
439
|
+
if (nextBlockTimestamp < order.executionTimestamp) {
|
|
440
|
+
console.log("execution deferred to ".concat(order.executionTimestamp - nextBlockTimestamp, " more seconds"));
|
|
441
|
+
return [2 /*return*/, false];
|
|
442
|
+
}
|
|
443
|
+
if (order.submittedTimestamp != undefined &&
|
|
444
|
+
nextBlockTimestamp < order.submittedTimestamp + OrderReferrerTool.TRADE_DELAY) {
|
|
445
|
+
// next block should be in ~2 seconds, so + 2
|
|
446
|
+
console.log("on hold for ".concat(OrderReferrerTool.TRADE_DELAY + order.submittedTimestamp - nextBlockTimestamp, " more seconds"));
|
|
447
|
+
return [2 /*return*/, false];
|
|
448
|
+
}
|
|
449
|
+
lotSize = perpetualDataHandler_1.default._getLotSize(order.symbol, symbolToPerpInfoMap);
|
|
450
|
+
if (order.quantity < lotSize) {
|
|
451
|
+
// console.log(`order size too small: ${order.quantity} < ${lotSize}`);
|
|
452
|
+
return [2 /*return*/, false];
|
|
453
|
+
}
|
|
454
|
+
// check limit price: fromSmartContractOrder will set it to undefined when not tradeable
|
|
455
|
+
if (order.limitPrice == undefined) {
|
|
456
|
+
// console.log("limit price undefined");
|
|
457
|
+
return [2 /*return*/, false];
|
|
458
|
+
}
|
|
459
|
+
limitPrice = order.limitPrice;
|
|
460
|
+
if ((order.side == nodeSDKTypes_1.BUY_SIDE && tradePrice > limitPrice) || (order.side == nodeSDKTypes_1.SELL_SIDE && tradePrice < limitPrice)) {
|
|
461
|
+
// console.log(`limit price not met: ${limitPrice} ${order.side} @ ${tradePrice}`);
|
|
462
|
+
return [2 /*return*/, false];
|
|
463
|
+
}
|
|
464
|
+
// check stop price
|
|
465
|
+
if (order.stopPrice != undefined &&
|
|
466
|
+
((order.side == nodeSDKTypes_1.BUY_SIDE && markPrice < order.stopPrice) ||
|
|
467
|
+
(order.side == nodeSDKTypes_1.SELL_SIDE && markPrice > order.stopPrice))) {
|
|
468
|
+
// console.log("stop price not met");
|
|
469
|
+
return [2 /*return*/, false];
|
|
470
|
+
}
|
|
471
|
+
if (!(order.parentChildOrderIds != undefined &&
|
|
472
|
+
order.parentChildOrderIds[0] == constants_1.HashZero &&
|
|
473
|
+
order.parentChildOrderIds[1] != constants_1.HashZero)) return [3 /*break*/, 2];
|
|
474
|
+
orderBookContract = this.getOrderBookContract(order.symbol);
|
|
475
|
+
return [4 /*yield*/, orderBookContract.getOrderStatus(order.parentChildOrderIds[1], overrides || {})];
|
|
476
|
+
case 1:
|
|
477
|
+
parentStatus = _a.sent();
|
|
478
|
+
if (parentStatus == 2 || parentStatus == 3) {
|
|
479
|
+
// console.log("parent not executed/cancelled");
|
|
480
|
+
// parent is open or unknown
|
|
481
|
+
return [2 /*return*/, false];
|
|
482
|
+
}
|
|
483
|
+
return [2 /*return*/, true];
|
|
484
|
+
case 2:
|
|
485
|
+
// all checks passed -> order is tradeable
|
|
486
|
+
return [2 /*return*/, true];
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
};
|
|
377
491
|
/**
|
|
378
492
|
* Wrapper of static method to use after mappings have been loaded into memory.
|
|
379
493
|
* @param scOrder Perpetual order as received in the proxy events.
|
|
380
494
|
* @returns A user-friendly order struct.
|
|
381
495
|
*/
|
|
382
|
-
smartContractOrderToOrder(scOrder) {
|
|
496
|
+
OrderReferrerTool.prototype.smartContractOrderToOrder = function (scOrder) {
|
|
383
497
|
return perpetualDataHandler_1.default.fromSmartContractOrder(scOrder, this.symbolToPerpStaticInfo);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
498
|
+
};
|
|
499
|
+
OrderReferrerTool.prototype.getTransactionCount = function (blockTag) {
|
|
500
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
501
|
+
return tslib_1.__generator(this, function (_a) {
|
|
502
|
+
switch (_a.label) {
|
|
503
|
+
case 0:
|
|
504
|
+
if (this.signer == null) {
|
|
505
|
+
throw Error("no wallet initialized. Use createProxyInstance().");
|
|
506
|
+
}
|
|
507
|
+
return [4 /*yield*/, this.signer.getTransactionCount(blockTag)];
|
|
508
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
};
|
|
513
|
+
OrderReferrerTool.TRADE_DELAY = 4;
|
|
514
|
+
return OrderReferrerTool;
|
|
515
|
+
}(writeAccessHandler_1.default));
|
|
392
516
|
exports.default = OrderReferrerTool;
|
|
393
|
-
OrderReferrerTool.TRADE_DELAY = 4;
|
|
394
517
|
//# sourceMappingURL=orderReferrerTool.js.map
|