@d8x/perpetuals-sdk 0.7.5 → 0.7.6
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 +134 -239
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.js +144 -290
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/contracts/factories/ERC20__factory.js +9 -12
- package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +9 -12
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +9 -12
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +9 -12
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +9 -12
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/ShareToken__factory.js +9 -12
- package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js +9 -12
- package/dist/cjs/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js +9 -12
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js +9 -12
- package/dist/cjs/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/zkevmTestnet/ShareToken__factory.js +9 -12
- package/dist/cjs/contracts/factories/zkevmTestnet/ShareToken__factory.js.map +1 -1
- package/dist/cjs/contracts/index.js +1 -1
- package/dist/cjs/d8XMath.d.ts +7 -0
- package/dist/cjs/d8XMath.js +81 -61
- 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 +80 -137
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/liquidityProviderTool.js +33 -64
- package/dist/cjs/liquidityProviderTool.js.map +1 -1
- package/dist/cjs/marketData.js +635 -978
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +1 -0
- package/dist/cjs/nodeSDKTypes.js +10 -22
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderReferrerTool.js +200 -321
- package/dist/cjs/orderReferrerTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +11 -0
- package/dist/cjs/perpetualDataHandler.js +422 -535
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.js +129 -190
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/priceFeeds.js +223 -335
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/traderDigests.js +20 -23
- package/dist/cjs/traderDigests.js.map +1 -1
- package/dist/cjs/traderInterface.js +54 -87
- package/dist/cjs/traderInterface.js.map +1 -1
- package/dist/cjs/triangulator.js +34 -38
- package/dist/cjs/triangulator.js.map +1 -1
- package/dist/cjs/utils.js +18 -32
- 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 +78 -112
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/accountTrade.js +126 -233
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.js +136 -284
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/contracts/factories/ERC20__factory.js +8 -12
- package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +8 -12
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +8 -12
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js +8 -12
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js +8 -12
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/esm/contracts/factories/ShareToken__factory.js +8 -12
- package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js +8 -12
- package/dist/esm/contracts/factories/zkevmTestnet/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js +8 -12
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js +8 -12
- package/dist/esm/contracts/factories/zkevmTestnet/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/zkevmTestnet/ShareToken__factory.js +8 -12
- package/dist/esm/contracts/factories/zkevmTestnet/ShareToken__factory.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +7 -0
- package/dist/esm/d8XMath.js +77 -58
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.js +77 -136
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/liquidityProviderTool.js +30 -63
- package/dist/esm/liquidityProviderTool.js.map +1 -1
- package/dist/esm/marketData.js +626 -971
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +1 -0
- package/dist/esm/nodeSDKTypes.js +36 -48
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderReferrerTool.js +194 -317
- package/dist/esm/orderReferrerTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +11 -0
- package/dist/esm/perpetualDataHandler.js +413 -528
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.js +126 -188
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/priceFeeds.js +218 -332
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/traderDigests.js +15 -19
- package/dist/esm/traderDigests.js.map +1 -1
- package/dist/esm/traderInterface.js +48 -83
- package/dist/esm/traderInterface.js.map +1 -1
- package/dist/esm/triangulator.js +34 -39
- package/dist/esm/triangulator.js.map +1 -1
- package/dist/esm/utils.js +16 -30
- 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 +70 -106
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/package.json +1 -1
- package/src/d8XMath.ts +21 -0
- package/src/liquidityProviderTool.ts +5 -4
- package/src/nodeSDKTypes.ts +1 -0
- package/src/perpetualDataHandler.ts +27 -0
- package/src/version.ts +1 -1
- package/src/writeAccessHandler.ts +3 -3
package/dist/cjs/marketData.js
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const bignumber_1 = require("@ethersproject/bignumber");
|
|
5
|
+
const providers_1 = require("@ethersproject/providers");
|
|
6
|
+
const units_1 = require("@ethersproject/units");
|
|
7
|
+
const contracts_1 = require("./contracts");
|
|
8
|
+
const d8XMath_1 = require("./d8XMath");
|
|
9
|
+
const nodeSDKTypes_1 = require("./nodeSDKTypes");
|
|
10
|
+
const perpetualDataHandler_1 = tslib_1.__importDefault(require("./perpetualDataHandler"));
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
12
|
/**
|
|
13
13
|
* Functions to access market data (e.g., information on open orders, information on products that can be traded).
|
|
14
14
|
* This class requires no private key and is blockchain read-only.
|
|
15
15
|
* No gas required for the queries here.
|
|
16
16
|
* @extends PerpetualDataHandler
|
|
17
17
|
*/
|
|
18
|
-
|
|
19
|
-
tslib_1.__extends(MarketData, _super);
|
|
18
|
+
class MarketData extends perpetualDataHandler_1.default {
|
|
20
19
|
/**
|
|
21
20
|
* Constructor
|
|
22
21
|
* @param {NodeSDKConfig} config Configuration object, see
|
|
@@ -35,8 +34,8 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
35
34
|
* main();
|
|
36
35
|
*
|
|
37
36
|
*/
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
constructor(config) {
|
|
38
|
+
super(config);
|
|
40
39
|
}
|
|
41
40
|
/**
|
|
42
41
|
* Initialize the marketData-Class with this function
|
|
@@ -44,43 +43,33 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
44
43
|
* about perpetual currencies
|
|
45
44
|
* @param provider optional provider
|
|
46
45
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
this.provider = provider;
|
|
57
|
-
}
|
|
58
|
-
return [4 /*yield*/, this.initContractsAndData(this.provider, overrides)];
|
|
59
|
-
case 1:
|
|
60
|
-
_a.sent();
|
|
61
|
-
return [2 /*return*/];
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
};
|
|
46
|
+
async createProxyInstance(provider, overrides) {
|
|
47
|
+
if (provider == undefined) {
|
|
48
|
+
this.provider = new providers_1.StaticJsonRpcProvider(this.nodeURL);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.provider = provider;
|
|
52
|
+
}
|
|
53
|
+
await this.initContractsAndData(this.provider, overrides);
|
|
54
|
+
}
|
|
66
55
|
/**
|
|
67
56
|
* Get the proxy address
|
|
68
57
|
* @returns Address of the perpetual proxy contract
|
|
69
58
|
*/
|
|
70
|
-
|
|
59
|
+
getProxyAddress() {
|
|
71
60
|
if (this.proxyContract == null) {
|
|
72
61
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
73
62
|
}
|
|
74
63
|
return this.proxyContract.address;
|
|
75
|
-
}
|
|
64
|
+
}
|
|
76
65
|
/**
|
|
77
66
|
* Convert the smart contract output of an order into a convenient format of type "Order"
|
|
78
67
|
* @param smOrder SmartContractOrder, as obtained e.g., by PerpetualLimitOrderCreated event
|
|
79
68
|
* @returns more convenient format of order, type "Order"
|
|
80
69
|
*/
|
|
81
|
-
|
|
70
|
+
smartContractOrderToOrder(smOrder) {
|
|
82
71
|
return perpetualDataHandler_1.default.fromSmartContractOrder(smOrder, this.symbolToPerpStaticInfo);
|
|
83
|
-
}
|
|
72
|
+
}
|
|
84
73
|
/**
|
|
85
74
|
* Get contract instance. Useful for event listening.
|
|
86
75
|
* @example
|
|
@@ -99,12 +88,12 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
99
88
|
*
|
|
100
89
|
* @returns read-only proxy instance
|
|
101
90
|
*/
|
|
102
|
-
|
|
91
|
+
getReadOnlyProxyInstance() {
|
|
103
92
|
if (this.proxyContract == null) {
|
|
104
93
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
105
94
|
}
|
|
106
95
|
return this.proxyContract;
|
|
107
|
-
}
|
|
96
|
+
}
|
|
108
97
|
/**
|
|
109
98
|
* Information about the products traded in the exchange.
|
|
110
99
|
* @example
|
|
@@ -123,20 +112,12 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
123
112
|
*
|
|
124
113
|
* @returns {ExchangeInfo} Array of static data for all the pools and perpetuals in the system.
|
|
125
114
|
*/
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
133
|
-
}
|
|
134
|
-
return [4 /*yield*/, MarketData._exchangeInfo(this.proxyContract, this.poolStaticInfos, this.symbolToPerpStaticInfo, this.perpetualIdToSymbol, this.nestedPerpetualIDs, this.symbolList, this.priceFeedGetter, overrides)];
|
|
135
|
-
case 1: return [2 /*return*/, _a.sent()];
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
};
|
|
115
|
+
async exchangeInfo(overrides) {
|
|
116
|
+
if (this.proxyContract == null) {
|
|
117
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
118
|
+
}
|
|
119
|
+
return await MarketData._exchangeInfo(this.proxyContract, this.poolStaticInfos, this.symbolToPerpStaticInfo, this.perpetualIdToSymbol, this.nestedPerpetualIDs, this.symbolList, this.priceFeedGetter, overrides);
|
|
120
|
+
}
|
|
140
121
|
/**
|
|
141
122
|
* All open orders for a trader-address and a symbol.
|
|
142
123
|
* @param {string} traderAddr Address of the trader for which we get the open orders.
|
|
@@ -158,58 +139,40 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
158
139
|
*
|
|
159
140
|
* @returns For each perpetual an array of open orders and corresponding order-ids.
|
|
160
141
|
*/
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
case 3:
|
|
181
|
-
res = _a.sent();
|
|
182
|
-
resArray.push(res);
|
|
183
|
-
_a.label = 4;
|
|
184
|
-
case 4: return [2 /*return*/, resArray];
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
};
|
|
142
|
+
async openOrders(traderAddr, symbol, overrides) {
|
|
143
|
+
// open orders requested only for given symbol
|
|
144
|
+
let resArray = [];
|
|
145
|
+
if (symbol.split("-").length == 1) {
|
|
146
|
+
// pool symbol
|
|
147
|
+
const symbols = this.getPerpetualSymbolsInPool(symbol);
|
|
148
|
+
let prom = [];
|
|
149
|
+
for (let k = 0; k < symbols.length; k++) {
|
|
150
|
+
let p = this._openOrdersOfPerpetual(traderAddr, symbols[k], overrides);
|
|
151
|
+
prom.push(p);
|
|
152
|
+
}
|
|
153
|
+
resArray = await Promise.all(prom);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
let res = await this._openOrdersOfPerpetual(traderAddr, symbol, overrides);
|
|
157
|
+
resArray.push(res);
|
|
158
|
+
}
|
|
159
|
+
return resArray;
|
|
160
|
+
}
|
|
189
161
|
/**
|
|
190
162
|
* All open orders for a trader-address and a given perpetual symbol.
|
|
191
163
|
* @param {string} traderAddr Address of the trader for which we get the open orders.
|
|
192
164
|
* @param {string} symbol perpetual-symbol of the form ETH-USD-MATIC
|
|
193
165
|
* @returns open orders and order ids
|
|
194
166
|
*/
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
MarketData.orderIdsOfTrader(traderAddr, orderBookContract, overrides),
|
|
205
|
-
])];
|
|
206
|
-
case 1:
|
|
207
|
-
_a = tslib_1.__read.apply(void 0, [_b.sent(), 2]), orders = _a[0], digests = _a[1];
|
|
208
|
-
return [2 /*return*/, { orders: orders, orderIds: digests }];
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
};
|
|
167
|
+
async _openOrdersOfPerpetual(traderAddr, symbol, overrides) {
|
|
168
|
+
// open orders requested only for given symbol
|
|
169
|
+
let orderBookContract = this.getOrderBookContract(symbol);
|
|
170
|
+
let [orders, digests] = await Promise.all([
|
|
171
|
+
this.openOrdersOnOrderBook(traderAddr, orderBookContract, overrides),
|
|
172
|
+
MarketData.orderIdsOfTrader(traderAddr, orderBookContract, overrides),
|
|
173
|
+
]);
|
|
174
|
+
return { orders: orders, orderIds: digests };
|
|
175
|
+
}
|
|
213
176
|
/**
|
|
214
177
|
* Information about the position open by a given trader in a given perpetual contract, or
|
|
215
178
|
* for all perpetuals in a pool
|
|
@@ -232,59 +195,38 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
232
195
|
*
|
|
233
196
|
* @returns {MarginAccount[]} Array of position risks of trader.
|
|
234
197
|
*/
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
case 2: return [4 /*yield*/, this._positionRiskForTraderInPerpetual(traderAddr, symbol, overrides)];
|
|
257
|
-
case 3:
|
|
258
|
-
res = _a.sent();
|
|
259
|
-
resArray.push(res);
|
|
260
|
-
_a.label = 4;
|
|
261
|
-
case 4: return [2 /*return*/, resArray];
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
};
|
|
198
|
+
async positionRisk(traderAddr, symbol, overrides) {
|
|
199
|
+
if (this.proxyContract == null) {
|
|
200
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
201
|
+
}
|
|
202
|
+
let resArray = [];
|
|
203
|
+
if (symbol.split("-").length == 1) {
|
|
204
|
+
// pool symbol
|
|
205
|
+
const symbols = this.getPerpetualSymbolsInPool(symbol);
|
|
206
|
+
let prom = [];
|
|
207
|
+
for (let k = 0; k < symbols.length; k++) {
|
|
208
|
+
let p = this._positionRiskForTraderInPerpetual(traderAddr, symbols[k], overrides);
|
|
209
|
+
prom.push(p);
|
|
210
|
+
}
|
|
211
|
+
resArray = await Promise.all(prom);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
let res = await this._positionRiskForTraderInPerpetual(traderAddr, symbol, overrides);
|
|
215
|
+
resArray.push(res);
|
|
216
|
+
}
|
|
217
|
+
return resArray;
|
|
218
|
+
}
|
|
266
219
|
/**
|
|
267
220
|
* Information about the position open by a given trader in a given perpetual contract.
|
|
268
221
|
* @param {string} traderAddr Address of the trader for which we get the position risk.
|
|
269
222
|
* @param {string} symbol perpetual symbol of the form ETH-USD-MATIC
|
|
270
223
|
* @returns MarginAccount struct for the trader
|
|
271
224
|
*/
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
case 0: return [4 /*yield*/, this.priceFeedGetter.fetchPricesForPerpetual(symbol)];
|
|
278
|
-
case 1:
|
|
279
|
-
obj = _a.sent();
|
|
280
|
-
return [4 /*yield*/, perpetualDataHandler_1.default.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, this.proxyContract, [obj.idxPrices[0], obj.idxPrices[1]], overrides)];
|
|
281
|
-
case 2:
|
|
282
|
-
mgnAcct = _a.sent();
|
|
283
|
-
return [2 /*return*/, mgnAcct];
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
};
|
|
225
|
+
async _positionRiskForTraderInPerpetual(traderAddr, symbol, overrides) {
|
|
226
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
227
|
+
let mgnAcct = await perpetualDataHandler_1.default.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, this.proxyContract, [obj.idxPrices[0], obj.idxPrices[1]], overrides);
|
|
228
|
+
return mgnAcct;
|
|
229
|
+
}
|
|
288
230
|
/**
|
|
289
231
|
* Estimates what the position risk will be if a given order is executed.
|
|
290
232
|
* @param traderAddr Address of trader
|
|
@@ -293,119 +235,118 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
293
235
|
* @param indexPriceInfo Index prices and market status (open/closed)
|
|
294
236
|
* @returns Position risk after trade
|
|
295
237
|
*/
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
};
|
|
238
|
+
async positionRiskOnTrade(traderAddr, order, account, indexPriceInfo, overrides) {
|
|
239
|
+
if (this.proxyContract == null) {
|
|
240
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
241
|
+
}
|
|
242
|
+
// fetch undefined data
|
|
243
|
+
if (account == undefined) {
|
|
244
|
+
account = (await this.positionRisk(traderAddr, order.symbol, overrides))[0];
|
|
245
|
+
}
|
|
246
|
+
if (indexPriceInfo == undefined) {
|
|
247
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
|
|
248
|
+
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
249
|
+
}
|
|
250
|
+
let lotSizeBC = MarketData._getLotSize(account.symbol, this.symbolToPerpStaticInfo);
|
|
251
|
+
// Too small, no change to account
|
|
252
|
+
if (Math.abs(order.quantity) < lotSizeBC) {
|
|
253
|
+
return { newPositionRisk: account, orderCost: 0 };
|
|
254
|
+
}
|
|
255
|
+
// Current state:
|
|
256
|
+
// perp (for FXs and such)
|
|
257
|
+
let perpetualState = await this.getPerpetualState(order.symbol, indexPriceInfo, overrides);
|
|
258
|
+
let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
|
|
259
|
+
// cash in margin account: upon trading, unpaid funding will be realized
|
|
260
|
+
let currentMarginCashCC = account.collateralCC;
|
|
261
|
+
// signed position, still correct if side is closed (==0)
|
|
262
|
+
let currentPositionBC = (account.side == nodeSDKTypes_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
263
|
+
// signed locked-in value
|
|
264
|
+
let currentLockedInQC = account.entryPrice * currentPositionBC;
|
|
265
|
+
// New trader state:
|
|
266
|
+
// signed trade amount
|
|
267
|
+
let tradeAmountBC = Math.abs(order.quantity) * (order.side == nodeSDKTypes_1.BUY_SIDE ? 1 : -1);
|
|
268
|
+
// signed position
|
|
269
|
+
let newPositionBC = currentPositionBC + tradeAmountBC;
|
|
270
|
+
if (Math.abs(newPositionBC) < 10 * lotSizeBC) {
|
|
271
|
+
// fully closed
|
|
272
|
+
tradeAmountBC = -currentPositionBC;
|
|
273
|
+
newPositionBC = 0;
|
|
274
|
+
}
|
|
275
|
+
let newSide = newPositionBC > 0 ? nodeSDKTypes_1.BUY_SIDE : newPositionBC < 0 ? nodeSDKTypes_1.SELL_SIDE : nodeSDKTypes_1.CLOSED_SIDE;
|
|
276
|
+
// price for this order = limit price (conservative) if given, else the current perp price
|
|
277
|
+
let tradePrice = order.limitPrice ??
|
|
278
|
+
(await this.getPerpetualPrice(order.symbol, tradeAmountBC, [indexPriceInfo[0], indexPriceInfo[1]], overrides));
|
|
279
|
+
// fees
|
|
280
|
+
let poolId = perpetualDataHandler_1.default._getPoolIdFromSymbol(order.symbol, this.poolStaticInfos);
|
|
281
|
+
let exchangeFeeTbps = await this.proxyContract.queryExchangeFee(poolId, traderAddr, order.brokerAddr ?? nodeSDKTypes_1.ZERO_ADDRESS, overrides || {});
|
|
282
|
+
let exchangeFeeCC = (Math.abs(tradeAmountBC) * exchangeFeeTbps * 1e-5 * S2) / S3;
|
|
283
|
+
let brokerFeeCC = (Math.abs(tradeAmountBC) * (order.brokerFeeTbps ?? 0) * 1e-5 * S2) / S3;
|
|
284
|
+
let referralFeeCC = this.symbolToPerpStaticInfo.get(account.symbol).referralRebate;
|
|
285
|
+
// Trade type:
|
|
286
|
+
let isClose = newPositionBC == 0 || newPositionBC * tradeAmountBC < 0;
|
|
287
|
+
let isOpen = newPositionBC != 0 && (currentPositionBC == 0 || tradeAmountBC * currentPositionBC > 0); // regular open, no flip
|
|
288
|
+
let isFlip = Math.abs(newPositionBC) > Math.abs(currentPositionBC) && !isOpen; // flip position sign, not fully closed
|
|
289
|
+
let keepPositionLvgOnClose = (order.keepPositionLvg ?? false) && !isOpen;
|
|
290
|
+
// Contract: _doMarginCollateralActions
|
|
291
|
+
// No collateral actions if
|
|
292
|
+
// 1) leverage is not set or
|
|
293
|
+
// 2) fully closed after trade or
|
|
294
|
+
// 3) is a partial closing, it doesn't flip, and keep lvg flag is not set
|
|
295
|
+
let traderDepositCC;
|
|
296
|
+
let targetLvg;
|
|
297
|
+
if (order.leverage == undefined || newPositionBC == 0 || (!isOpen && !isFlip && !keepPositionLvgOnClose)) {
|
|
298
|
+
traderDepositCC = 0;
|
|
299
|
+
targetLvg = 0;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// 1) opening and flipping trades need to specify a leverage: default to max if not given
|
|
303
|
+
// 2) for others it's ignored, set target to 0
|
|
304
|
+
let initialMarginRate = this.symbolToPerpStaticInfo.get(account.symbol).initialMarginRate;
|
|
305
|
+
targetLvg = isFlip || isOpen ? order.leverage ?? 1 / initialMarginRate : 0;
|
|
306
|
+
let [b0, pos0] = isOpen ? [0, 0] : [account.collateralCC, currentPositionBC];
|
|
307
|
+
traderDepositCC = (0, d8XMath_1.getDepositAmountForLvgTrade)(b0, pos0, tradeAmountBC, targetLvg, tradePrice, S3, Sm);
|
|
308
|
+
// fees are paid from wallet in this case
|
|
309
|
+
traderDepositCC += exchangeFeeCC + brokerFeeCC + referralFeeCC;
|
|
310
|
+
}
|
|
311
|
+
// Contract: _executeTrade
|
|
312
|
+
let deltaCashCC = (-tradeAmountBC * (tradePrice - S2)) / S3;
|
|
313
|
+
let deltaLockedQC = tradeAmountBC * S2;
|
|
314
|
+
if (isClose) {
|
|
315
|
+
let pnl = account.entryPrice * tradeAmountBC - deltaLockedQC;
|
|
316
|
+
deltaLockedQC += pnl;
|
|
317
|
+
deltaCashCC += pnl / S3;
|
|
318
|
+
}
|
|
319
|
+
// funding and fees
|
|
320
|
+
deltaCashCC = deltaCashCC + account.unrealizedFundingCollateralCCY - exchangeFeeCC - brokerFeeCC - referralFeeCC;
|
|
321
|
+
// New cash, locked-in, entry price & leverage after trade
|
|
322
|
+
let newLockedInValueQC = currentLockedInQC + deltaLockedQC;
|
|
323
|
+
let newMarginCashCC = currentMarginCashCC + deltaCashCC + traderDepositCC;
|
|
324
|
+
let newEntryPrice = newPositionBC == 0 ? 0 : Math.abs(newLockedInValueQC / newPositionBC);
|
|
325
|
+
let newMarginBalanceCC = newMarginCashCC + (newPositionBC * Sm - newLockedInValueQC) / S3;
|
|
326
|
+
let newLeverage = newPositionBC == 0
|
|
327
|
+
? 0
|
|
328
|
+
: newMarginBalanceCC <= 0
|
|
329
|
+
? Infinity
|
|
330
|
+
: (Math.abs(newPositionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
331
|
+
// Liquidation params
|
|
332
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
333
|
+
// New position risk
|
|
334
|
+
let newPositionRisk = {
|
|
335
|
+
symbol: account.symbol,
|
|
336
|
+
positionNotionalBaseCCY: Math.abs(newPositionBC),
|
|
337
|
+
side: newSide,
|
|
338
|
+
entryPrice: newEntryPrice,
|
|
339
|
+
leverage: newLeverage,
|
|
340
|
+
markPrice: Sm,
|
|
341
|
+
unrealizedPnlQuoteCCY: newPositionBC * Sm - newLockedInValueQC,
|
|
342
|
+
unrealizedFundingCollateralCCY: 0,
|
|
343
|
+
collateralCC: newMarginCashCC,
|
|
344
|
+
collToQuoteConversion: S3,
|
|
345
|
+
liquidationPrice: [S2Liq, S3Liq],
|
|
346
|
+
liquidationLvg: 1 / tau,
|
|
347
|
+
};
|
|
348
|
+
return { newPositionRisk: newPositionRisk, orderCost: traderDepositCC };
|
|
349
|
+
}
|
|
409
350
|
/**
|
|
410
351
|
* Estimates what the position risk will be if given amount of collateral is added/removed from the account.
|
|
411
352
|
* @param traderAddr Address of trader
|
|
@@ -413,90 +354,80 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
413
354
|
* @param currentPositionRisk Position risk before
|
|
414
355
|
* @returns {MarginAccount} Position risk after
|
|
415
356
|
*/
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
};
|
|
491
|
-
return [2 /*return*/, newPositionRisk];
|
|
492
|
-
}
|
|
493
|
-
});
|
|
494
|
-
});
|
|
495
|
-
};
|
|
496
|
-
MarketData._getLiquidationParams = function (symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
|
|
497
|
-
var S2Liq, S3Liq;
|
|
498
|
-
var tau = symbolToPerpStaticInfo.get(symbol).maintenanceMarginRate;
|
|
499
|
-
var ccyType = symbolToPerpStaticInfo.get(symbol).collateralCurrencyType;
|
|
357
|
+
async positionRiskOnCollateralAction(deltaCollateral, account, indexPriceInfo, overrides) {
|
|
358
|
+
if (this.proxyContract == null) {
|
|
359
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
360
|
+
}
|
|
361
|
+
if (deltaCollateral + account.collateralCC + account.unrealizedFundingCollateralCCY < 0) {
|
|
362
|
+
throw Error("not enough margin to remove");
|
|
363
|
+
}
|
|
364
|
+
if (indexPriceInfo == undefined) {
|
|
365
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
|
|
366
|
+
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
367
|
+
}
|
|
368
|
+
let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
|
|
369
|
+
let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
|
|
370
|
+
// no position: just increase collateral and kill liquidation vars
|
|
371
|
+
if (account.positionNotionalBaseCCY == 0) {
|
|
372
|
+
return {
|
|
373
|
+
symbol: account.symbol,
|
|
374
|
+
positionNotionalBaseCCY: account.positionNotionalBaseCCY,
|
|
375
|
+
side: account.side,
|
|
376
|
+
entryPrice: account.entryPrice,
|
|
377
|
+
leverage: account.leverage,
|
|
378
|
+
markPrice: Sm,
|
|
379
|
+
unrealizedPnlQuoteCCY: account.unrealizedPnlQuoteCCY,
|
|
380
|
+
unrealizedFundingCollateralCCY: account.unrealizedFundingCollateralCCY,
|
|
381
|
+
collateralCC: account.collateralCC + deltaCollateral,
|
|
382
|
+
collToQuoteConversion: S3,
|
|
383
|
+
liquidationPrice: [0, undefined],
|
|
384
|
+
liquidationLvg: Infinity,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
let positionBC = account.positionNotionalBaseCCY * (account.side == nodeSDKTypes_1.BUY_SIDE ? 1 : -1);
|
|
388
|
+
let lockedInQC = account.entryPrice * positionBC;
|
|
389
|
+
let newMarginCashCC = account.collateralCC + deltaCollateral;
|
|
390
|
+
let newMarginBalanceCC = newMarginCashCC + account.unrealizedFundingCollateralCCY + (positionBC * Sm - lockedInQC) / S3;
|
|
391
|
+
if (newMarginBalanceCC <= 0) {
|
|
392
|
+
return {
|
|
393
|
+
symbol: account.symbol,
|
|
394
|
+
positionNotionalBaseCCY: account.positionNotionalBaseCCY,
|
|
395
|
+
side: account.side,
|
|
396
|
+
entryPrice: account.entryPrice,
|
|
397
|
+
leverage: Infinity,
|
|
398
|
+
markPrice: Sm,
|
|
399
|
+
unrealizedPnlQuoteCCY: account.unrealizedPnlQuoteCCY,
|
|
400
|
+
unrealizedFundingCollateralCCY: account.unrealizedFundingCollateralCCY,
|
|
401
|
+
collateralCC: newMarginCashCC,
|
|
402
|
+
collToQuoteConversion: S3,
|
|
403
|
+
liquidationPrice: [S2, S3],
|
|
404
|
+
liquidationLvg: 0,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
408
|
+
// Liquidation params
|
|
409
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
410
|
+
// New position risk
|
|
411
|
+
let newPositionRisk = {
|
|
412
|
+
symbol: account.symbol,
|
|
413
|
+
positionNotionalBaseCCY: account.positionNotionalBaseCCY,
|
|
414
|
+
side: account.side,
|
|
415
|
+
entryPrice: account.entryPrice,
|
|
416
|
+
leverage: newLeverage,
|
|
417
|
+
markPrice: Sm,
|
|
418
|
+
unrealizedPnlQuoteCCY: account.unrealizedPnlQuoteCCY,
|
|
419
|
+
unrealizedFundingCollateralCCY: account.unrealizedFundingCollateralCCY,
|
|
420
|
+
collateralCC: newMarginCashCC,
|
|
421
|
+
collToQuoteConversion: S3,
|
|
422
|
+
liquidationPrice: [S2Liq, S3Liq],
|
|
423
|
+
liquidationLvg: 1 / tau,
|
|
424
|
+
};
|
|
425
|
+
return newPositionRisk;
|
|
426
|
+
}
|
|
427
|
+
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
|
|
428
|
+
let S2Liq, S3Liq;
|
|
429
|
+
let tau = symbolToPerpStaticInfo.get(symbol).maintenanceMarginRate;
|
|
430
|
+
let ccyType = symbolToPerpStaticInfo.get(symbol).collateralCurrencyType;
|
|
500
431
|
if (ccyType == nodeSDKTypes_1.CollaterlCCY.BASE) {
|
|
501
432
|
S2Liq = (0, d8XMath_1.calculateLiquidationPriceCollateralBase)(lockedInQC, signedPositionBC, marginCashCC, tau);
|
|
502
433
|
S3Liq = S2Liq;
|
|
@@ -512,90 +443,53 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
512
443
|
S2Liq = S2Liq < 0 ? 0 : S2Liq;
|
|
513
444
|
S3Liq = S3Liq && S3Liq < 0 ? 0 : S3Liq;
|
|
514
445
|
return [S2Liq, S3Liq, tau];
|
|
515
|
-
}
|
|
446
|
+
}
|
|
516
447
|
/**
|
|
517
448
|
* Gets the wallet balance in the collateral currency corresponding to a given perpetual symbol.
|
|
518
449
|
* @param address Address to check
|
|
519
450
|
* @param symbol Symbol of the form ETH-USD-MATIC.
|
|
520
451
|
* @returns Balance
|
|
521
452
|
*/
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
token = contracts_1.ERC20__factory.connect(marginTokenAddr, this.provider);
|
|
531
|
-
return [4 /*yield*/, token.balanceOf(address, overrides || {})];
|
|
532
|
-
case 1:
|
|
533
|
-
walletBalance = _a.sent();
|
|
534
|
-
return [4 /*yield*/, token.decimals(overrides || {})];
|
|
535
|
-
case 2:
|
|
536
|
-
decimals = _a.sent();
|
|
537
|
-
return [2 /*return*/, Number((0, units_1.formatUnits)(walletBalance, decimals))];
|
|
538
|
-
}
|
|
539
|
-
});
|
|
540
|
-
});
|
|
541
|
-
};
|
|
453
|
+
async getWalletBalance(address, symbol, overrides) {
|
|
454
|
+
let poolIdx = this.getPoolStaticInfoIndexFromSymbol(symbol);
|
|
455
|
+
let marginTokenAddr = this.poolStaticInfos[poolIdx].poolMarginTokenAddr;
|
|
456
|
+
let token = contracts_1.ERC20__factory.connect(marginTokenAddr, this.provider);
|
|
457
|
+
let walletBalance = await token.balanceOf(address, overrides || {});
|
|
458
|
+
let decimals = await token.decimals(overrides || {});
|
|
459
|
+
return Number((0, units_1.formatUnits)(walletBalance, decimals));
|
|
460
|
+
}
|
|
542
461
|
/**
|
|
543
462
|
* Get the address' balance of the pool share token
|
|
544
463
|
* @param address address of the liquidity provider
|
|
545
464
|
* @param symbolOrId Symbol of the form ETH-USD-MATIC, or MATIC (collateral only), or Pool-Id
|
|
546
465
|
*/
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
poolId = this._poolSymbolOrIdToPoolId(symbolOrId);
|
|
552
|
-
return [2 /*return*/, this._getPoolShareTokenBalanceFromId(address, poolId, overrides)];
|
|
553
|
-
});
|
|
554
|
-
});
|
|
555
|
-
};
|
|
466
|
+
async getPoolShareTokenBalance(address, symbolOrId, overrides) {
|
|
467
|
+
let poolId = this._poolSymbolOrIdToPoolId(symbolOrId);
|
|
468
|
+
return this._getPoolShareTokenBalanceFromId(address, poolId, overrides);
|
|
469
|
+
}
|
|
556
470
|
/**
|
|
557
471
|
* Query the pool share token holdings of address
|
|
558
472
|
* @param address address of token holder
|
|
559
473
|
* @param poolId pool id
|
|
560
474
|
* @returns pool share token balance of address
|
|
561
475
|
*/
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
shareTokenAddr = this.poolStaticInfos[poolId - 1].shareTokenAddr;
|
|
569
|
-
shareToken = contracts_1.ERC20__factory.connect(shareTokenAddr, this.provider);
|
|
570
|
-
return [4 /*yield*/, shareToken.balanceOf(address, overrides || {})];
|
|
571
|
-
case 1:
|
|
572
|
-
d18ShareTokenBalanceOfAddr = _a.sent();
|
|
573
|
-
return [2 /*return*/, (0, d8XMath_1.dec18ToFloat)(d18ShareTokenBalanceOfAddr)];
|
|
574
|
-
}
|
|
575
|
-
});
|
|
576
|
-
});
|
|
577
|
-
};
|
|
476
|
+
async _getPoolShareTokenBalanceFromId(address, poolId, overrides) {
|
|
477
|
+
let shareTokenAddr = this.poolStaticInfos[poolId - 1].shareTokenAddr;
|
|
478
|
+
let shareToken = contracts_1.ERC20__factory.connect(shareTokenAddr, this.provider);
|
|
479
|
+
let d18ShareTokenBalanceOfAddr = await shareToken.balanceOf(address, overrides || {});
|
|
480
|
+
return (0, d8XMath_1.dec18ToFloat)(d18ShareTokenBalanceOfAddr);
|
|
481
|
+
}
|
|
578
482
|
/**
|
|
579
483
|
* Value of pool token in collateral currency
|
|
580
484
|
* @param symbolOrId symbol of the form ETH-USD-MATIC, MATIC (collateral), or poolId
|
|
581
485
|
* @returns current pool share token price in collateral currency
|
|
582
486
|
*/
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
poolId = this._poolSymbolOrIdToPoolId(symbolOrId);
|
|
590
|
-
return [4 /*yield*/, this.proxyContract.getShareTokenPriceD18(poolId, overrides || {})];
|
|
591
|
-
case 1:
|
|
592
|
-
priceDec18 = _a.sent();
|
|
593
|
-
price = (0, d8XMath_1.dec18ToFloat)(priceDec18);
|
|
594
|
-
return [2 /*return*/, price];
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
});
|
|
598
|
-
};
|
|
487
|
+
async getShareTokenPrice(symbolOrId, overrides) {
|
|
488
|
+
let poolId = this._poolSymbolOrIdToPoolId(symbolOrId);
|
|
489
|
+
const priceDec18 = await this.proxyContract.getShareTokenPriceD18(poolId, overrides || {});
|
|
490
|
+
const price = (0, d8XMath_1.dec18ToFloat)(priceDec18);
|
|
491
|
+
return price;
|
|
492
|
+
}
|
|
599
493
|
/**
|
|
600
494
|
* Value of the pool share tokens for this liquidity provider
|
|
601
495
|
* in poolSymbol-currency (e.g. MATIC, USDC).
|
|
@@ -616,36 +510,24 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
616
510
|
* main();
|
|
617
511
|
* @returns the value (in collateral tokens) of the pool share, #share tokens, shareTokenAddress
|
|
618
512
|
*/
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
value = price * shareTokens;
|
|
634
|
-
shareTokenAddr = this.poolStaticInfos[poolId - 1].shareTokenAddr;
|
|
635
|
-
return [2 /*return*/, {
|
|
636
|
-
value: value,
|
|
637
|
-
shareTokenBalance: shareTokens,
|
|
638
|
-
poolShareToken: shareTokenAddr,
|
|
639
|
-
}];
|
|
640
|
-
}
|
|
641
|
-
});
|
|
642
|
-
});
|
|
643
|
-
};
|
|
644
|
-
MarketData.prototype._poolSymbolOrIdToPoolId = function (poolSymbolOrId) {
|
|
513
|
+
async getParticipationValue(address, symbolOrId, overrides) {
|
|
514
|
+
let poolId = this._poolSymbolOrIdToPoolId(symbolOrId);
|
|
515
|
+
const shareTokens = await this._getPoolShareTokenBalanceFromId(address, poolId, overrides);
|
|
516
|
+
const priceDec18 = await this.proxyContract.getShareTokenPriceD18(poolId, overrides || {});
|
|
517
|
+
const price = (0, d8XMath_1.dec18ToFloat)(priceDec18);
|
|
518
|
+
const value = price * shareTokens;
|
|
519
|
+
const shareTokenAddr = this.poolStaticInfos[poolId - 1].shareTokenAddr;
|
|
520
|
+
return {
|
|
521
|
+
value: value,
|
|
522
|
+
shareTokenBalance: shareTokens,
|
|
523
|
+
poolShareToken: shareTokenAddr,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
_poolSymbolOrIdToPoolId(poolSymbolOrId) {
|
|
645
527
|
if (this.proxyContract == null || this.poolStaticInfos.length == 0) {
|
|
646
528
|
throw Error("no proxy contract or wallet or data initialized. Use createProxyInstance().");
|
|
647
529
|
}
|
|
648
|
-
|
|
530
|
+
let poolId;
|
|
649
531
|
if (isNaN(Number(poolSymbolOrId))) {
|
|
650
532
|
poolId = perpetualDataHandler_1.default._getPoolIdFromSymbol(poolSymbolOrId, this.poolStaticInfos);
|
|
651
533
|
}
|
|
@@ -653,7 +535,7 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
653
535
|
poolId = Number(poolSymbolOrId);
|
|
654
536
|
}
|
|
655
537
|
return poolId;
|
|
656
|
-
}
|
|
538
|
+
}
|
|
657
539
|
/**
|
|
658
540
|
* Gets the maximal order size to open positions (increase size),
|
|
659
541
|
* considering the existing position, state of the perpetual
|
|
@@ -662,44 +544,24 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
662
544
|
* @param positionRisk Current position risk (as seen in positionRisk)
|
|
663
545
|
* @returns Maximal trade size, not signed
|
|
664
546
|
*/
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
curPosition = side == nodeSDKTypes_1.BUY_SIDE ? positionRisk.positionNotionalBaseCCY : -positionRisk.positionNotionalBaseCCY;
|
|
672
|
-
perpId = this.getPerpIdFromSymbol(positionRisk.symbol);
|
|
673
|
-
return [4 /*yield*/, this.proxyContract.getMaxSignedOpenTradeSizeForPos(perpId, (0, d8XMath_1.floatToABK64x64)(curPosition), side == nodeSDKTypes_1.BUY_SIDE, overrides || {})];
|
|
674
|
-
case 1:
|
|
675
|
-
perpMaxPositionABK = _a.sent();
|
|
676
|
-
return [2 /*return*/, (0, d8XMath_1.ABK64x64ToFloat)(perpMaxPositionABK.abs())];
|
|
677
|
-
}
|
|
678
|
-
});
|
|
679
|
-
});
|
|
680
|
-
};
|
|
547
|
+
async maxOrderSizeForTrader(side, positionRisk, overrides) {
|
|
548
|
+
let curPosition = side == nodeSDKTypes_1.BUY_SIDE ? positionRisk.positionNotionalBaseCCY : -positionRisk.positionNotionalBaseCCY;
|
|
549
|
+
let perpId = this.getPerpIdFromSymbol(positionRisk.symbol);
|
|
550
|
+
let perpMaxPositionABK = await this.proxyContract.getMaxSignedOpenTradeSizeForPos(perpId, (0, d8XMath_1.floatToABK64x64)(curPosition), side == nodeSDKTypes_1.BUY_SIDE, overrides || {});
|
|
551
|
+
return (0, d8XMath_1.ABK64x64ToFloat)(perpMaxPositionABK.abs());
|
|
552
|
+
}
|
|
681
553
|
/**
|
|
682
554
|
*
|
|
683
555
|
* @param side BUY_SIDE or SELL_SIDE
|
|
684
556
|
* @param symbol of the form ETH-USD-MATIC.
|
|
685
557
|
* @returns signed maximal position size in base currency
|
|
686
558
|
*/
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
perpId = this.getPerpIdFromSymbol(symbol);
|
|
694
|
-
isBuy = side == nodeSDKTypes_1.BUY_SIDE;
|
|
695
|
-
return [4 /*yield*/, this.proxyContract.getMaxSignedOpenTradeSizeForPos(perpId, bignumber_1.BigNumber.from(0), isBuy, overrides || {})];
|
|
696
|
-
case 1:
|
|
697
|
-
maxSignedPos = _a.sent();
|
|
698
|
-
return [2 /*return*/, (0, d8XMath_1.ABK64x64ToFloat)(maxSignedPos)];
|
|
699
|
-
}
|
|
700
|
-
});
|
|
701
|
-
});
|
|
702
|
-
};
|
|
559
|
+
async maxSignedPosition(side, symbol, overrides) {
|
|
560
|
+
let perpId = this.getPerpIdFromSymbol(symbol);
|
|
561
|
+
let isBuy = side == nodeSDKTypes_1.BUY_SIDE;
|
|
562
|
+
let maxSignedPos = await this.proxyContract.getMaxSignedOpenTradeSizeForPos(perpId, bignumber_1.BigNumber.from(0), isBuy, overrides || {});
|
|
563
|
+
return (0, d8XMath_1.ABK64x64ToFloat)(maxSignedPos);
|
|
564
|
+
}
|
|
703
565
|
/**
|
|
704
566
|
* Uses the Oracle(s) in the exchange to get the latest price of a given index in a given currency, if a route exists.
|
|
705
567
|
* @param {string} base Index name, e.g. ETH.
|
|
@@ -720,23 +582,13 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
720
582
|
*
|
|
721
583
|
* @returns {number} Price of index in given currency.
|
|
722
584
|
*/
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
731
|
-
}
|
|
732
|
-
return [4 /*yield*/, this.proxyContract.getOraclePrice([(0, utils_1.toBytes4)(base), (0, utils_1.toBytes4)(quote)], overrides || {})];
|
|
733
|
-
case 1:
|
|
734
|
-
px = _a.sent();
|
|
735
|
-
return [2 /*return*/, px == undefined ? undefined : (0, d8XMath_1.ABK64x64ToFloat)(px)];
|
|
736
|
-
}
|
|
737
|
-
});
|
|
738
|
-
});
|
|
739
|
-
};
|
|
585
|
+
async getOraclePrice(base, quote, overrides) {
|
|
586
|
+
if (!this.proxyContract) {
|
|
587
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
588
|
+
}
|
|
589
|
+
let px = await this.proxyContract.getOraclePrice([(0, utils_1.toBytes4)(base), (0, utils_1.toBytes4)(quote)], overrides || {});
|
|
590
|
+
return px == undefined ? undefined : (0, d8XMath_1.ABK64x64ToFloat)(px);
|
|
591
|
+
}
|
|
740
592
|
/**
|
|
741
593
|
*
|
|
742
594
|
* @param symbol Symbol of the form ETH-USD-MATIC
|
|
@@ -744,24 +596,14 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
744
596
|
* @param overrides
|
|
745
597
|
* @returns Order status ()
|
|
746
598
|
*/
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
}
|
|
756
|
-
orderBookContract = this.getOrderBookContract(symbol);
|
|
757
|
-
return [4 /*yield*/, orderBookContract.getOrderStatus(orderId, overrides || {})];
|
|
758
|
-
case 1:
|
|
759
|
-
status = _a.sent();
|
|
760
|
-
return [2 /*return*/, status];
|
|
761
|
-
}
|
|
762
|
-
});
|
|
763
|
-
});
|
|
764
|
-
};
|
|
599
|
+
async getOrderStatus(symbol, orderId, overrides) {
|
|
600
|
+
if (!this.proxyContract) {
|
|
601
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
602
|
+
}
|
|
603
|
+
const orderBookContract = this.getOrderBookContract(symbol);
|
|
604
|
+
let status = await orderBookContract.getOrderStatus(orderId, overrides || {});
|
|
605
|
+
return status;
|
|
606
|
+
}
|
|
765
607
|
/**
|
|
766
608
|
* Get the current mark price
|
|
767
609
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
@@ -781,27 +623,16 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
781
623
|
*
|
|
782
624
|
* @returns mark price
|
|
783
625
|
*/
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
return [4 /*yield*/, this.priceFeedGetter.fetchPricesForPerpetual(symbol)];
|
|
795
|
-
case 1:
|
|
796
|
-
obj = _a.sent();
|
|
797
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
798
|
-
_a.label = 2;
|
|
799
|
-
case 2: return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices)];
|
|
800
|
-
case 3: return [2 /*return*/, _a.sent()];
|
|
801
|
-
}
|
|
802
|
-
});
|
|
803
|
-
});
|
|
804
|
-
};
|
|
626
|
+
async getMarkPrice(symbol, indexPrices) {
|
|
627
|
+
if (this.proxyContract == null) {
|
|
628
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
629
|
+
}
|
|
630
|
+
if (indexPrices == undefined) {
|
|
631
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
632
|
+
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
633
|
+
}
|
|
634
|
+
return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
|
|
635
|
+
}
|
|
805
636
|
/**
|
|
806
637
|
* get the current price for a given quantity
|
|
807
638
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
@@ -822,104 +653,72 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
822
653
|
*
|
|
823
654
|
* @returns price (number)
|
|
824
655
|
*/
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
case 1:
|
|
837
|
-
obj = _a.sent();
|
|
838
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
839
|
-
_a.label = 2;
|
|
840
|
-
case 2: return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides)];
|
|
841
|
-
case 3: return [2 /*return*/, _a.sent()];
|
|
842
|
-
}
|
|
843
|
-
});
|
|
844
|
-
});
|
|
845
|
-
};
|
|
656
|
+
async getPerpetualPrice(symbol, quantity, indexPrices, overrides) {
|
|
657
|
+
if (this.proxyContract == null) {
|
|
658
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
659
|
+
}
|
|
660
|
+
if (indexPrices == undefined) {
|
|
661
|
+
// fetch from API
|
|
662
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
663
|
+
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
664
|
+
}
|
|
665
|
+
return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides);
|
|
666
|
+
}
|
|
846
667
|
/**
|
|
847
668
|
* Query recent perpetual state from blockchain
|
|
848
669
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
849
670
|
* @param indexPrices S2 and S3 prices/isMarketOpen if not provided fetch via REST API
|
|
850
671
|
* @returns PerpetualState reference
|
|
851
672
|
*/
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
case 1:
|
|
864
|
-
obj = _a.sent();
|
|
865
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
866
|
-
_a.label = 2;
|
|
867
|
-
case 2: return [4 /*yield*/, perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPriceInfo, overrides)];
|
|
868
|
-
case 3:
|
|
869
|
-
state = _a.sent();
|
|
870
|
-
return [2 /*return*/, state];
|
|
871
|
-
}
|
|
872
|
-
});
|
|
873
|
-
});
|
|
874
|
-
};
|
|
673
|
+
async getPerpetualState(symbol, indexPriceInfo, overrides) {
|
|
674
|
+
if (this.proxyContract == null) {
|
|
675
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
676
|
+
}
|
|
677
|
+
if (indexPriceInfo == undefined) {
|
|
678
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
679
|
+
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
680
|
+
}
|
|
681
|
+
let state = await perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPriceInfo, overrides);
|
|
682
|
+
return state;
|
|
683
|
+
}
|
|
875
684
|
/**
|
|
876
685
|
* Query recent pool state from blockchain, not including perpetual states
|
|
877
686
|
* @param symbol symbol of the form USDC
|
|
878
687
|
* @param indexPrices S2 and S3 prices/isMarketOpen if not provided fetch via REST API
|
|
879
688
|
* @returns PoolState reference
|
|
880
689
|
*/
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
pnlParticipantCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pool.fPnLparticipantsCashCC),
|
|
901
|
-
totalTargetAMMFundSizeCC: (0, d8XMath_1.ABK64x64ToFloat)(pool.fTargetAMMFundSize),
|
|
902
|
-
brokerCollateralLotSize: (0, d8XMath_1.ABK64x64ToFloat)(pool.fBrokerCollateralLotSize),
|
|
903
|
-
perpetuals: [],
|
|
904
|
-
};
|
|
905
|
-
return [2 /*return*/, state];
|
|
906
|
-
}
|
|
907
|
-
});
|
|
908
|
-
});
|
|
909
|
-
};
|
|
690
|
+
async getPoolState(poolSymbol, overrides) {
|
|
691
|
+
if (this.proxyContract == null) {
|
|
692
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
693
|
+
}
|
|
694
|
+
const poolId = this._poolSymbolOrIdToPoolId(poolSymbol);
|
|
695
|
+
const pool = await this.proxyContract.getLiquidityPool(poolId, overrides || {});
|
|
696
|
+
let state = {
|
|
697
|
+
isRunning: pool.isRunning,
|
|
698
|
+
poolSymbol: poolSymbol,
|
|
699
|
+
marginTokenAddr: pool.marginTokenAddress,
|
|
700
|
+
poolShareTokenAddr: pool.shareTokenAddress,
|
|
701
|
+
defaultFundCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pool.fDefaultFundCashCC),
|
|
702
|
+
pnlParticipantCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pool.fPnLparticipantsCashCC),
|
|
703
|
+
totalTargetAMMFundSizeCC: (0, d8XMath_1.ABK64x64ToFloat)(pool.fTargetAMMFundSize),
|
|
704
|
+
brokerCollateralLotSize: (0, d8XMath_1.ABK64x64ToFloat)(pool.fBrokerCollateralLotSize),
|
|
705
|
+
perpetuals: [],
|
|
706
|
+
};
|
|
707
|
+
return state;
|
|
708
|
+
}
|
|
910
709
|
/**
|
|
911
710
|
* Query perpetual static info.
|
|
912
711
|
* This information is queried once at createProxyInstance-time and remains static after that.
|
|
913
712
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
914
713
|
* @returns PerpetualStaticInfo copy.
|
|
915
714
|
*/
|
|
916
|
-
|
|
917
|
-
|
|
715
|
+
getPerpetualStaticInfo(symbol) {
|
|
716
|
+
let perpInfo = this.symbolToPerpStaticInfo.get(symbol);
|
|
918
717
|
if (perpInfo == undefined) {
|
|
919
|
-
throw Error(
|
|
718
|
+
throw Error(`Perpetual with symbol ${symbol} not found. Check symbol or use createProxyInstance().`);
|
|
920
719
|
}
|
|
921
720
|
// return new copy, not a reference
|
|
922
|
-
|
|
721
|
+
let res = {
|
|
923
722
|
id: perpInfo.id,
|
|
924
723
|
poolId: perpInfo.poolId,
|
|
925
724
|
limitOrderBookAddr: perpInfo.limitOrderBookAddr,
|
|
@@ -933,7 +732,7 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
933
732
|
priceIds: perpInfo.priceIds,
|
|
934
733
|
};
|
|
935
734
|
return res;
|
|
936
|
-
}
|
|
735
|
+
}
|
|
937
736
|
/**
|
|
938
737
|
* get the current mid-price for a perpetual
|
|
939
738
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
@@ -953,20 +752,12 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
953
752
|
*
|
|
954
753
|
* @returns {number} price
|
|
955
754
|
*/
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
963
|
-
}
|
|
964
|
-
return [4 /*yield*/, this.getPerpetualPrice(symbol, 0)];
|
|
965
|
-
case 1: return [2 /*return*/, _a.sent()];
|
|
966
|
-
}
|
|
967
|
-
});
|
|
968
|
-
});
|
|
969
|
-
};
|
|
755
|
+
async getPerpetualMidPrice(symbol) {
|
|
756
|
+
if (this.proxyContract == null) {
|
|
757
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
758
|
+
}
|
|
759
|
+
return await this.getPerpetualPrice(symbol, 0);
|
|
760
|
+
}
|
|
970
761
|
/**
|
|
971
762
|
* Query smart contract to get user orders and convert to user friendly order format.
|
|
972
763
|
* @param {string} traderAddr Address of trader.
|
|
@@ -974,35 +765,24 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
974
765
|
* @returns {Order[]} Array of user friendly order struct.
|
|
975
766
|
* @ignore
|
|
976
767
|
*/
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
userFriendlyOrders.push(perpetualDataHandler_1.default.fromClientOrder(orders[k], this.symbolToPerpStaticInfo));
|
|
996
|
-
k++;
|
|
997
|
-
}
|
|
998
|
-
haveMoreOrders = orders[orders.length - 1].traderAddr !== nodeSDKTypes_1.ZERO_ADDRESS;
|
|
999
|
-
from = from + bulkSize;
|
|
1000
|
-
return [3 /*break*/, 1];
|
|
1001
|
-
case 3: return [2 /*return*/, userFriendlyOrders];
|
|
1002
|
-
}
|
|
1003
|
-
});
|
|
1004
|
-
});
|
|
1005
|
-
};
|
|
768
|
+
async openOrdersOnOrderBook(traderAddr, orderBookContract, overrides) {
|
|
769
|
+
//eliminate empty orders and map to user friendly orders
|
|
770
|
+
let userFriendlyOrders = new Array();
|
|
771
|
+
let haveMoreOrders = true;
|
|
772
|
+
let from = 0;
|
|
773
|
+
const bulkSize = 15;
|
|
774
|
+
while (haveMoreOrders) {
|
|
775
|
+
let orders = await orderBookContract.getOrders(traderAddr, from, bulkSize, overrides || {});
|
|
776
|
+
let k = 0;
|
|
777
|
+
while (k < orders.length && orders[k].traderAddr !== nodeSDKTypes_1.ZERO_ADDRESS) {
|
|
778
|
+
userFriendlyOrders.push(perpetualDataHandler_1.default.fromClientOrder(orders[k], this.symbolToPerpStaticInfo));
|
|
779
|
+
k++;
|
|
780
|
+
}
|
|
781
|
+
haveMoreOrders = orders[orders.length - 1].traderAddr !== nodeSDKTypes_1.ZERO_ADDRESS;
|
|
782
|
+
from = from + bulkSize;
|
|
783
|
+
}
|
|
784
|
+
return userFriendlyOrders;
|
|
785
|
+
}
|
|
1006
786
|
/**
|
|
1007
787
|
*
|
|
1008
788
|
* @param traderAddr Address of the trader
|
|
@@ -1010,25 +790,16 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
1010
790
|
* @returns Array of order-id's
|
|
1011
791
|
* @ignore
|
|
1012
792
|
*/
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
while (k < digestsRaw.length && bignumber_1.BigNumber.from(digestsRaw[k]).gt(0)) {
|
|
1024
|
-
digests.push(digestsRaw[k]);
|
|
1025
|
-
k++;
|
|
1026
|
-
}
|
|
1027
|
-
return [2 /*return*/, digests];
|
|
1028
|
-
}
|
|
1029
|
-
});
|
|
1030
|
-
});
|
|
1031
|
-
};
|
|
793
|
+
static async orderIdsOfTrader(traderAddr, orderBookContract, overrides) {
|
|
794
|
+
let digestsRaw = await orderBookContract.limitDigestsOfTrader(traderAddr, 0, 15, overrides || {});
|
|
795
|
+
let k = 0;
|
|
796
|
+
let digests = [];
|
|
797
|
+
while (k < digestsRaw.length && bignumber_1.BigNumber.from(digestsRaw[k]).gt(0)) {
|
|
798
|
+
digests.push(digestsRaw[k]);
|
|
799
|
+
k++;
|
|
800
|
+
}
|
|
801
|
+
return digests;
|
|
802
|
+
}
|
|
1032
803
|
/**
|
|
1033
804
|
* Query the available margin conditional on the given (or current) index prices
|
|
1034
805
|
* Result is in collateral currency
|
|
@@ -1037,165 +808,106 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
1037
808
|
* @param indexPrices optional index prices, will otherwise fetch from REST API
|
|
1038
809
|
* @returns available margin in collateral currency
|
|
1039
810
|
*/
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
case 2:
|
|
1056
|
-
perpID = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
1057
|
-
return [4 /*yield*/, this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map(function (x) { return (0, d8XMath_1.floatToABK64x64)(x); }), overrides || {})];
|
|
1058
|
-
case 3:
|
|
1059
|
-
traderState = _a.sent();
|
|
1060
|
-
idx_availableMargin = 1;
|
|
1061
|
-
mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
|
|
1062
|
-
return [2 /*return*/, mgn];
|
|
1063
|
-
}
|
|
1064
|
-
});
|
|
1065
|
-
});
|
|
1066
|
-
};
|
|
811
|
+
async getAvailableMargin(traderAddr, symbol, indexPrices, overrides) {
|
|
812
|
+
if (!this.proxyContract) {
|
|
813
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
814
|
+
}
|
|
815
|
+
if (indexPrices == undefined) {
|
|
816
|
+
// fetch from API
|
|
817
|
+
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
818
|
+
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
819
|
+
}
|
|
820
|
+
let perpID = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
821
|
+
let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map((x) => (0, d8XMath_1.floatToABK64x64)(x)), overrides || {});
|
|
822
|
+
const idx_availableMargin = 1;
|
|
823
|
+
let mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
|
|
824
|
+
return mgn;
|
|
825
|
+
}
|
|
1067
826
|
/**
|
|
1068
827
|
* Calculate a type of exchange loyality score based on trader volume
|
|
1069
828
|
* @param traderAddr address of the trader
|
|
1070
829
|
* @param brokerAddr address of the trader's broker or undefined
|
|
1071
830
|
* @returns a loyality score (4 worst, 1 best)
|
|
1072
831
|
*/
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
volumeCap = 500000;
|
|
1107
|
-
score = totalBrokerVolume == 0 ? totalTraderVolume / volumeCap : totalBrokerVolume;
|
|
1108
|
-
rank4 = 1 + Math.floor(Math.min(score, 1 - 1e-15) * 4);
|
|
1109
|
-
// desired ranking starts at 4 (worst) and ends at 1 (best)
|
|
1110
|
-
return [2 /*return*/, 5 - rank4];
|
|
1111
|
-
}
|
|
1112
|
-
});
|
|
1113
|
-
});
|
|
1114
|
-
};
|
|
832
|
+
async getTraderLoyalityScore(traderAddr, brokerAddr, overrides) {
|
|
833
|
+
if (this.proxyContract == null) {
|
|
834
|
+
throw Error("no proxy contract or wallet initialized. Use createProxyInstance().");
|
|
835
|
+
}
|
|
836
|
+
// loop over all pools and query volumes
|
|
837
|
+
let brokerProm = [];
|
|
838
|
+
let traderProm = [];
|
|
839
|
+
for (let k = 0; k < this.poolStaticInfos.length; k++) {
|
|
840
|
+
if (brokerAddr != "" && brokerAddr != undefined) {
|
|
841
|
+
let brkrVol = this.proxyContract.getCurrentBrokerVolume(this.poolStaticInfos[k].poolId, brokerAddr, overrides || {});
|
|
842
|
+
brokerProm.push(brkrVol);
|
|
843
|
+
}
|
|
844
|
+
let trdrVol = this.proxyContract.getCurrentTraderVolume(this.poolStaticInfos[k].poolId, traderAddr, overrides || {});
|
|
845
|
+
traderProm.push(trdrVol);
|
|
846
|
+
}
|
|
847
|
+
// sum
|
|
848
|
+
let totalBrokerVolume = 0;
|
|
849
|
+
let totalTraderVolume = 0;
|
|
850
|
+
let brkrVol = await Promise.all(brokerProm);
|
|
851
|
+
let trdrVol = await Promise.all(traderProm);
|
|
852
|
+
for (let k = 0; k < this.poolStaticInfos.length; k++) {
|
|
853
|
+
if (brokerAddr != "" && brokerAddr != undefined) {
|
|
854
|
+
totalBrokerVolume += (0, d8XMath_1.ABK64x64ToFloat)(brkrVol[k]);
|
|
855
|
+
}
|
|
856
|
+
totalTraderVolume += (0, d8XMath_1.ABK64x64ToFloat)(trdrVol[k]);
|
|
857
|
+
}
|
|
858
|
+
const volumeCap = 500000;
|
|
859
|
+
let score = totalBrokerVolume == 0 ? totalTraderVolume / volumeCap : totalBrokerVolume;
|
|
860
|
+
// 5 different equally spaced categories: (4 is best, 1 worst)
|
|
861
|
+
let rank4 = 1 + Math.floor(Math.min(score, 1 - 1e-15) * 4);
|
|
862
|
+
// desired ranking starts at 4 (worst) and ends at 1 (best)
|
|
863
|
+
return 5 - rank4;
|
|
864
|
+
}
|
|
1115
865
|
/**
|
|
1116
866
|
* Get all off-chain prices
|
|
1117
867
|
* @param _symbolToPerpStaticInfo mapping: PerpetualStaticInfo for each perpetual
|
|
1118
868
|
* @param _priceFeedGetter priceFeed class from which we can get offchain price data
|
|
1119
869
|
* @returns mapping of symbol-pair (e.g. BTC-USD) to price/isMarketClosed
|
|
1120
870
|
*/
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
allSym.add(sInfo.S3Symbol);
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
1140
|
-
finally {
|
|
1141
|
-
try {
|
|
1142
|
-
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
1143
|
-
}
|
|
1144
|
-
finally { if (e_1) throw e_1.error; }
|
|
1145
|
-
}
|
|
1146
|
-
allSymArr = Array.from(allSym.values());
|
|
1147
|
-
return [4 /*yield*/, _priceFeedGetter.fetchPrices(allSymArr)];
|
|
1148
|
-
case 1:
|
|
1149
|
-
idxPriceMap = _d.sent();
|
|
1150
|
-
return [2 /*return*/, idxPriceMap];
|
|
1151
|
-
}
|
|
1152
|
-
});
|
|
1153
|
-
});
|
|
1154
|
-
};
|
|
871
|
+
static async _getAllIndexPrices(_symbolToPerpStaticInfo, _priceFeedGetter) {
|
|
872
|
+
// get all prices from off-chain price-sources
|
|
873
|
+
let allSym = new Set();
|
|
874
|
+
for (let perpSymbol of _symbolToPerpStaticInfo.keys()) {
|
|
875
|
+
let sInfo = _symbolToPerpStaticInfo.get(perpSymbol);
|
|
876
|
+
allSym.add(sInfo.S2Symbol);
|
|
877
|
+
if (sInfo.S3Symbol != "") {
|
|
878
|
+
allSym.add(sInfo.S3Symbol);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
let allSymArr = Array.from(allSym.values());
|
|
882
|
+
let idxPriceMap = await _priceFeedGetter.fetchPrices(allSymArr);
|
|
883
|
+
return idxPriceMap;
|
|
884
|
+
}
|
|
1155
885
|
/**
|
|
1156
886
|
* Get market open/closed status
|
|
1157
887
|
* @param symbol Perpetual symbol of the form ETH-USD-MATIC
|
|
1158
888
|
* @returns True if the market is closed
|
|
1159
889
|
*/
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
priceSymbols = [];
|
|
1182
|
-
if ((sInfo === null || sInfo === void 0 ? void 0 : sInfo.S2Symbol) != undefined && sInfo.S2Symbol != "") {
|
|
1183
|
-
priceSymbols.push(sInfo.S2Symbol);
|
|
1184
|
-
}
|
|
1185
|
-
if ((sInfo === null || sInfo === void 0 ? void 0 : sInfo.S3Symbol) != undefined && sInfo.S3Symbol != "") {
|
|
1186
|
-
priceSymbols.push(sInfo.S3Symbol);
|
|
1187
|
-
}
|
|
1188
|
-
if (priceSymbols.length == 0) {
|
|
1189
|
-
throw new Error("symbol not found");
|
|
1190
|
-
}
|
|
1191
|
-
return [4 /*yield*/, _priceFeedGetter.fetchPrices(priceSymbols)];
|
|
1192
|
-
case 1:
|
|
1193
|
-
priceInfos = _a.sent();
|
|
1194
|
-
return [2 /*return*/, tslib_1.__spreadArray([], tslib_1.__read(priceInfos.values()), false).some(function (p) { return p[1]; })];
|
|
1195
|
-
}
|
|
1196
|
-
});
|
|
1197
|
-
});
|
|
1198
|
-
};
|
|
890
|
+
async isMarketClosed(symbol) {
|
|
891
|
+
if (this.proxyContract == null) {
|
|
892
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
893
|
+
}
|
|
894
|
+
return await MarketData._isMarketClosed(symbol, this.symbolToPerpStaticInfo, this.priceFeedGetter);
|
|
895
|
+
}
|
|
896
|
+
static async _isMarketClosed(symbol, _symbolToPerpStaticInfo, _priceFeedGetter) {
|
|
897
|
+
const sInfo = _symbolToPerpStaticInfo.get(symbol);
|
|
898
|
+
let priceSymbols = [];
|
|
899
|
+
if (sInfo?.S2Symbol != undefined && sInfo.S2Symbol != "") {
|
|
900
|
+
priceSymbols.push(sInfo.S2Symbol);
|
|
901
|
+
}
|
|
902
|
+
if (sInfo?.S3Symbol != undefined && sInfo.S3Symbol != "") {
|
|
903
|
+
priceSymbols.push(sInfo.S3Symbol);
|
|
904
|
+
}
|
|
905
|
+
if (priceSymbols.length == 0) {
|
|
906
|
+
throw new Error("symbol not found");
|
|
907
|
+
}
|
|
908
|
+
const priceInfos = await _priceFeedGetter.fetchPrices(priceSymbols);
|
|
909
|
+
return [...priceInfos.values()].some((p) => p[1]);
|
|
910
|
+
}
|
|
1199
911
|
/**
|
|
1200
912
|
* Collect all mid-prices
|
|
1201
913
|
* @param _proxyContract contract instance
|
|
@@ -1205,182 +917,127 @@ var MarketData = /** @class */ (function (_super) {
|
|
|
1205
917
|
* @param _idxPriceMap symbol to price/market closed
|
|
1206
918
|
* @returns perpetual symbol to mid-prices mapping
|
|
1207
919
|
*/
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
id = perpetualIDChunks[k][j];
|
|
1225
|
-
symbol3s = _perpetualIdToSymbol.get(id);
|
|
1226
|
-
info = _symbolToPerpStaticInfo.get(symbol3s);
|
|
1227
|
-
S2 = (0, d8XMath_1.floatToABK64x64)(_idxPriceMap.get(info.S2Symbol)[0]);
|
|
1228
|
-
S3 = bignumber_1.BigNumber.from(0);
|
|
1229
|
-
if (info.S3Symbol != "") {
|
|
1230
|
-
S3 = (0, d8XMath_1.floatToABK64x64)(_idxPriceMap.get(info.S3Symbol)[0]);
|
|
1231
|
-
}
|
|
1232
|
-
indexPrices.push(S2);
|
|
1233
|
-
indexPrices.push(S3);
|
|
1234
|
-
}
|
|
1235
|
-
return [4 /*yield*/, _proxyContract.queryMidPrices(perpetualIDChunks[k], indexPrices, overrides || {})];
|
|
1236
|
-
case 2:
|
|
1237
|
-
fMidPrice = _a.sent();
|
|
1238
|
-
for (j = 0; j < fMidPrice.length; j++) {
|
|
1239
|
-
id = perpetualIDChunks[k][j];
|
|
1240
|
-
symbol3s = _perpetualIdToSymbol.get(id);
|
|
1241
|
-
midPriceMap.set(symbol3s, (0, d8XMath_1.ABK64x64ToFloat)(fMidPrice[j]));
|
|
1242
|
-
}
|
|
1243
|
-
_a.label = 3;
|
|
1244
|
-
case 3:
|
|
1245
|
-
k++;
|
|
1246
|
-
return [3 /*break*/, 1];
|
|
1247
|
-
case 4: return [2 /*return*/, midPriceMap];
|
|
1248
|
-
}
|
|
1249
|
-
});
|
|
1250
|
-
});
|
|
1251
|
-
};
|
|
1252
|
-
MarketData._queryPoolStates = function (_proxyContract, _poolStaticInfos, _numPools, overrides) {
|
|
1253
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
1254
|
-
var chunkSize, iFrom, poolStates, pools, k, poolSymbol, poolState;
|
|
1255
|
-
return tslib_1.__generator(this, function (_a) {
|
|
1256
|
-
switch (_a.label) {
|
|
1257
|
-
case 0:
|
|
1258
|
-
chunkSize = 5;
|
|
1259
|
-
iFrom = 1;
|
|
1260
|
-
poolStates = [];
|
|
1261
|
-
_a.label = 1;
|
|
1262
|
-
case 1:
|
|
1263
|
-
if (!(iFrom <= _numPools)) return [3 /*break*/, 3];
|
|
1264
|
-
return [4 /*yield*/, _proxyContract.getLiquidityPools(iFrom, iFrom + chunkSize, overrides || {})];
|
|
1265
|
-
case 2:
|
|
1266
|
-
pools = _a.sent();
|
|
1267
|
-
for (k = 0; k < pools.length; k++) {
|
|
1268
|
-
poolSymbol = _poolStaticInfos[iFrom + k - 1].poolMarginSymbol;
|
|
1269
|
-
poolState = {
|
|
1270
|
-
isRunning: pools[k].isRunning,
|
|
1271
|
-
poolSymbol: poolSymbol,
|
|
1272
|
-
marginTokenAddr: pools[k].marginTokenAddress,
|
|
1273
|
-
poolShareTokenAddr: pools[k].shareTokenAddress,
|
|
1274
|
-
defaultFundCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fDefaultFundCashCC),
|
|
1275
|
-
pnlParticipantCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fPnLparticipantsCashCC),
|
|
1276
|
-
totalTargetAMMFundSizeCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fTargetAMMFundSize),
|
|
1277
|
-
brokerCollateralLotSize: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fBrokerCollateralLotSize),
|
|
1278
|
-
perpetuals: [],
|
|
1279
|
-
};
|
|
1280
|
-
poolStates.push(poolState);
|
|
1281
|
-
}
|
|
1282
|
-
iFrom = iFrom + chunkSize + 1;
|
|
1283
|
-
return [3 /*break*/, 1];
|
|
1284
|
-
case 3: return [2 /*return*/, poolStates];
|
|
1285
|
-
}
|
|
1286
|
-
});
|
|
1287
|
-
});
|
|
1288
|
-
};
|
|
1289
|
-
MarketData._queryPerpetualStates = function (_proxyContract, _nestedPerpetualIDs, _symbolList, overrides) {
|
|
1290
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
1291
|
-
var chunkSize, perpetualIDChunks, perpStateInfos, k, perps, j, PerpetualState;
|
|
1292
|
-
return tslib_1.__generator(this, function (_a) {
|
|
1293
|
-
switch (_a.label) {
|
|
1294
|
-
case 0:
|
|
1295
|
-
chunkSize = 10;
|
|
1296
|
-
perpetualIDChunks = perpetualDataHandler_1.default.nestedIDsToChunks(chunkSize, _nestedPerpetualIDs);
|
|
1297
|
-
perpStateInfos = new Array();
|
|
1298
|
-
k = 0;
|
|
1299
|
-
_a.label = 1;
|
|
1300
|
-
case 1:
|
|
1301
|
-
if (!(k < perpetualIDChunks.length)) return [3 /*break*/, 4];
|
|
1302
|
-
return [4 /*yield*/, _proxyContract.getPerpetuals(perpetualIDChunks[k], overrides || {})];
|
|
1303
|
-
case 2:
|
|
1304
|
-
perps = _a.sent();
|
|
1305
|
-
for (j = 0; j < perps.length; j++) {
|
|
1306
|
-
PerpetualState = {
|
|
1307
|
-
id: perps[j].id,
|
|
1308
|
-
state: nodeSDKTypes_1.PERP_STATE_STR[perps[j].state],
|
|
1309
|
-
baseCurrency: (0, utils_1.contractSymbolToSymbol)(perps[j].S2BaseCCY, _symbolList),
|
|
1310
|
-
quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perps[j].S2QuoteCCY, _symbolList),
|
|
1311
|
-
indexPrice: 0,
|
|
1312
|
-
collToQuoteIndexPrice: 0,
|
|
1313
|
-
markPrice: (0, d8XMath_1.ABK64x64ToFloat)(perps[j].currentMarkPremiumRate.fPrice),
|
|
1314
|
-
midPrice: 0,
|
|
1315
|
-
currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perps[j].fCurrentFundingRate),
|
|
1316
|
-
openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perps[j].fOpenInterest),
|
|
1317
|
-
isMarketClosed: false, //fill later
|
|
1318
|
-
};
|
|
1319
|
-
perpStateInfos.push(PerpetualState);
|
|
1320
|
-
}
|
|
1321
|
-
_a.label = 3;
|
|
1322
|
-
case 3:
|
|
1323
|
-
k++;
|
|
1324
|
-
return [3 /*break*/, 1];
|
|
1325
|
-
case 4: return [2 /*return*/, perpStateInfos];
|
|
920
|
+
static async _queryMidPrices(_proxyContract, _nestedPerpetualIDs, _symbolToPerpStaticInfo, _perpetualIdToSymbol, _idxPriceMap, overrides) {
|
|
921
|
+
// what is the maximal number of queries at once?
|
|
922
|
+
const chunkSize = 10;
|
|
923
|
+
let perpetualIDChunks = perpetualDataHandler_1.default.nestedIDsToChunks(chunkSize, _nestedPerpetualIDs);
|
|
924
|
+
let midPriceMap = new Map();
|
|
925
|
+
for (let k = 0; k < perpetualIDChunks.length; k++) {
|
|
926
|
+
let indexPrices = [];
|
|
927
|
+
// collect/order all index prices
|
|
928
|
+
for (let j = 0; j < perpetualIDChunks[k].length; j++) {
|
|
929
|
+
let id = perpetualIDChunks[k][j];
|
|
930
|
+
let symbol3s = _perpetualIdToSymbol.get(id);
|
|
931
|
+
let info = _symbolToPerpStaticInfo.get(symbol3s);
|
|
932
|
+
let S2 = (0, d8XMath_1.floatToABK64x64)(_idxPriceMap.get(info.S2Symbol)[0]);
|
|
933
|
+
let S3 = bignumber_1.BigNumber.from(0);
|
|
934
|
+
if (info.S3Symbol != "") {
|
|
935
|
+
S3 = (0, d8XMath_1.floatToABK64x64)(_idxPriceMap.get(info.S3Symbol)[0]);
|
|
1326
936
|
}
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
}
|
|
937
|
+
indexPrices.push(S2);
|
|
938
|
+
indexPrices.push(S3);
|
|
939
|
+
}
|
|
940
|
+
let fMidPrice = await _proxyContract.queryMidPrices(perpetualIDChunks[k], indexPrices, overrides || {});
|
|
941
|
+
for (let j = 0; j < fMidPrice.length; j++) {
|
|
942
|
+
let id = perpetualIDChunks[k][j];
|
|
943
|
+
let symbol3s = _perpetualIdToSymbol.get(id);
|
|
944
|
+
midPriceMap.set(symbol3s, (0, d8XMath_1.ABK64x64ToFloat)(fMidPrice[j]));
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
return midPriceMap;
|
|
948
|
+
}
|
|
949
|
+
static async _queryPoolStates(_proxyContract, _poolStaticInfos, _numPools, overrides) {
|
|
950
|
+
const chunkSize = 5;
|
|
951
|
+
let iFrom = 1;
|
|
952
|
+
let poolStates = [];
|
|
953
|
+
while (iFrom <= _numPools) {
|
|
954
|
+
let pools = await _proxyContract.getLiquidityPools(iFrom, iFrom + chunkSize, overrides || {});
|
|
955
|
+
for (let k = 0; k < pools.length; k++) {
|
|
956
|
+
let poolSymbol = _poolStaticInfos[iFrom + k - 1].poolMarginSymbol;
|
|
957
|
+
let poolState = {
|
|
958
|
+
isRunning: pools[k].isRunning,
|
|
959
|
+
poolSymbol: poolSymbol,
|
|
960
|
+
marginTokenAddr: pools[k].marginTokenAddress,
|
|
961
|
+
poolShareTokenAddr: pools[k].shareTokenAddress,
|
|
962
|
+
defaultFundCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fDefaultFundCashCC),
|
|
963
|
+
pnlParticipantCashCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fPnLparticipantsCashCC),
|
|
964
|
+
totalTargetAMMFundSizeCC: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fTargetAMMFundSize),
|
|
965
|
+
brokerCollateralLotSize: (0, d8XMath_1.ABK64x64ToFloat)(pools[k].fBrokerCollateralLotSize),
|
|
966
|
+
perpetuals: [],
|
|
967
|
+
};
|
|
968
|
+
poolStates.push(poolState);
|
|
969
|
+
}
|
|
970
|
+
iFrom = iFrom + chunkSize + 1;
|
|
971
|
+
}
|
|
972
|
+
return poolStates;
|
|
973
|
+
}
|
|
974
|
+
static async _queryPerpetualStates(_proxyContract, _nestedPerpetualIDs, _symbolList, overrides) {
|
|
975
|
+
// what is the maximal number of queries at once?
|
|
976
|
+
const chunkSize = 10;
|
|
977
|
+
let perpetualIDChunks = perpetualDataHandler_1.default.nestedIDsToChunks(chunkSize, _nestedPerpetualIDs);
|
|
978
|
+
let perpStateInfos = new Array();
|
|
979
|
+
for (let k = 0; k < perpetualIDChunks.length; k++) {
|
|
980
|
+
let perps = await _proxyContract.getPerpetuals(perpetualIDChunks[k], overrides || {});
|
|
981
|
+
for (let j = 0; j < perps.length; j++) {
|
|
982
|
+
let PerpetualState = {
|
|
983
|
+
id: perps[j].id,
|
|
984
|
+
state: nodeSDKTypes_1.PERP_STATE_STR[perps[j].state],
|
|
985
|
+
baseCurrency: (0, utils_1.contractSymbolToSymbol)(perps[j].S2BaseCCY, _symbolList),
|
|
986
|
+
quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perps[j].S2QuoteCCY, _symbolList),
|
|
987
|
+
indexPrice: 0,
|
|
988
|
+
collToQuoteIndexPrice: 0,
|
|
989
|
+
markPrice: (0, d8XMath_1.ABK64x64ToFloat)(perps[j].currentMarkPremiumRate.fPrice),
|
|
990
|
+
midPrice: 0,
|
|
991
|
+
currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perps[j].fCurrentFundingRate),
|
|
992
|
+
openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perps[j].fOpenInterest),
|
|
993
|
+
isMarketClosed: false, //fill later
|
|
994
|
+
};
|
|
995
|
+
perpStateInfos.push(PerpetualState);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
return perpStateInfos;
|
|
999
|
+
}
|
|
1000
|
+
static async _exchangeInfo(_proxyContract, _poolStaticInfos, _symbolToPerpStaticInfo, _perpetualIdToSymbol, _nestedPerpetualIDs, _symbolList, _priceFeedGetter, overrides) {
|
|
1001
|
+
// get the factory address (shared among all pools)
|
|
1002
|
+
let factory = _poolStaticInfos[0].oracleFactoryAddr;
|
|
1003
|
+
let info = { pools: [], oracleFactoryAddr: factory, proxyAddr: _proxyContract.address };
|
|
1004
|
+
const numPools = _nestedPerpetualIDs.length;
|
|
1005
|
+
// get all prices from off-chain price-sources
|
|
1006
|
+
let idxPriceMap = await MarketData._getAllIndexPrices(_symbolToPerpStaticInfo, _priceFeedGetter);
|
|
1007
|
+
// query mid-prices from on-chain conditional on the off-chain prices
|
|
1008
|
+
let midPriceMap = await MarketData._queryMidPrices(_proxyContract, _nestedPerpetualIDs, _symbolToPerpStaticInfo, _perpetualIdToSymbol, idxPriceMap, overrides);
|
|
1009
|
+
let poolStateInfos = await MarketData._queryPoolStates(_proxyContract, _poolStaticInfos, numPools, overrides);
|
|
1010
|
+
let perpStateInfos = await MarketData._queryPerpetualStates(_proxyContract, _nestedPerpetualIDs, _symbolList, overrides);
|
|
1011
|
+
// put together all info
|
|
1012
|
+
for (let k = 0; k < perpStateInfos.length; k++) {
|
|
1013
|
+
const perp = perpStateInfos[k];
|
|
1014
|
+
let symbol3s = _perpetualIdToSymbol.get(perp.id);
|
|
1015
|
+
let info = _symbolToPerpStaticInfo.get(symbol3s);
|
|
1016
|
+
const idxPriceS2Pair = idxPriceMap.get(info.S2Symbol);
|
|
1017
|
+
let idxPriceS3Pair = [0, false];
|
|
1018
|
+
perp.isMarketClosed = idxPriceS2Pair[1];
|
|
1019
|
+
if (info.S3Symbol != "") {
|
|
1020
|
+
idxPriceS3Pair = idxPriceMap.get(info.S3Symbol);
|
|
1021
|
+
perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
|
|
1022
|
+
}
|
|
1023
|
+
perp.indexPrice = idxPriceS2Pair[0];
|
|
1024
|
+
perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
|
|
1025
|
+
let indexS3 = 1;
|
|
1026
|
+
if (info.collateralCurrencyType == nodeSDKTypes_1.COLLATERAL_CURRENCY_BASE) {
|
|
1027
|
+
indexS3 = idxPriceS2Pair[0];
|
|
1028
|
+
}
|
|
1029
|
+
else if (info.collateralCurrencyType == nodeSDKTypes_1.COLLATERAL_CURRENCY_QUANTO) {
|
|
1030
|
+
indexS3 = idxPriceS3Pair[0];
|
|
1031
|
+
}
|
|
1032
|
+
perp.collToQuoteIndexPrice = indexS3;
|
|
1033
|
+
perp.midPrice = midPriceMap.get(symbol3s);
|
|
1034
|
+
// which pool?
|
|
1035
|
+
const poolId = info.poolId;
|
|
1036
|
+
poolStateInfos[poolId - 1].perpetuals.push(perp);
|
|
1037
|
+
}
|
|
1038
|
+
info.pools = poolStateInfos;
|
|
1039
|
+
return info;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1385
1042
|
exports.default = MarketData;
|
|
1386
1043
|
//# sourceMappingURL=marketData.js.map
|