@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,3 +1,4 @@
|
|
|
1
|
+
import { __awaiter, __generator, __read, __values } from "tslib";
|
|
1
2
|
import { FormatTypes } from "@ethersproject/abi";
|
|
2
3
|
import { Signer } from "@ethersproject/abstract-signer";
|
|
3
4
|
import { BigNumber } from "@ethersproject/bignumber";
|
|
@@ -11,8 +12,8 @@ import { combineFlags, containsFlag, contractSymbolToSymbol, symbol4BToLongSymbo
|
|
|
11
12
|
* Parent class for MarketData and WriteAccessHandler that handles
|
|
12
13
|
* common data and chain operations.
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
var PerpetualDataHandler = /** @class */ (function () {
|
|
16
|
+
function PerpetualDataHandler(config) {
|
|
16
17
|
this.PRICE_UPDATE_FEE_GWEI = 1;
|
|
17
18
|
this.proxyContract = null;
|
|
18
19
|
// limit order book
|
|
@@ -34,168 +35,226 @@ export default class PerpetualDataHandler {
|
|
|
34
35
|
this.symbolList = SYMBOL_LIST;
|
|
35
36
|
this.priceFeedGetter = new PriceFeeds(this, config.priceFeedConfigNetwork);
|
|
36
37
|
}
|
|
37
|
-
|
|
38
|
-
this
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
38
|
+
PerpetualDataHandler.prototype.initContractsAndData = function (signerOrProvider, overrides) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
+
var network, error_1, _a;
|
|
41
|
+
return __generator(this, function (_b) {
|
|
42
|
+
switch (_b.label) {
|
|
43
|
+
case 0:
|
|
44
|
+
this.signerOrProvider = signerOrProvider;
|
|
45
|
+
_b.label = 1;
|
|
46
|
+
case 1:
|
|
47
|
+
_b.trys.push([1, 6, , 7]);
|
|
48
|
+
if (!(signerOrProvider instanceof Signer)) return [3 /*break*/, 3];
|
|
49
|
+
return [4 /*yield*/, signerOrProvider.provider.getNetwork()];
|
|
50
|
+
case 2:
|
|
51
|
+
network = _b.sent();
|
|
52
|
+
return [3 /*break*/, 5];
|
|
53
|
+
case 3: return [4 /*yield*/, signerOrProvider.getNetwork()];
|
|
54
|
+
case 4:
|
|
55
|
+
network = _b.sent();
|
|
56
|
+
_b.label = 5;
|
|
57
|
+
case 5: return [3 /*break*/, 7];
|
|
58
|
+
case 6:
|
|
59
|
+
error_1 = _b.sent();
|
|
60
|
+
console.log(error_1);
|
|
61
|
+
throw new Error("Unable to connect to network.");
|
|
62
|
+
case 7:
|
|
63
|
+
if (network.chainId !== this.chainId) {
|
|
64
|
+
throw new Error("Provider: chain id ".concat(network.chainId, " does not match config (").concat(this.chainId, ")"));
|
|
65
|
+
}
|
|
66
|
+
this.proxyContract = IPerpetualManager__factory.connect(this.proxyAddr, signerOrProvider);
|
|
67
|
+
_a = this;
|
|
68
|
+
return [4 /*yield*/, this.proxyContract.getOrderBookFactoryAddress(overrides || {})];
|
|
69
|
+
case 8:
|
|
70
|
+
_a.lobFactoryAddr = _b.sent();
|
|
71
|
+
this.lobFactoryContract = LimitOrderBookFactory__factory.connect(this.lobFactoryAddr, signerOrProvider);
|
|
72
|
+
return [4 /*yield*/, this._fillSymbolMaps(overrides)];
|
|
73
|
+
case 9:
|
|
74
|
+
_b.sent();
|
|
75
|
+
return [2 /*return*/];
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
};
|
|
61
80
|
/**
|
|
62
81
|
* Returns the order-book contract for the symbol if found or fails
|
|
63
82
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
64
83
|
* @returns order book contract for the perpetual
|
|
65
84
|
*/
|
|
66
|
-
getOrderBookContract(symbol) {
|
|
67
|
-
|
|
85
|
+
PerpetualDataHandler.prototype.getOrderBookContract = function (symbol) {
|
|
86
|
+
var _a;
|
|
87
|
+
var orderBookAddr = (_a = this.symbolToPerpStaticInfo.get(symbol)) === null || _a === void 0 ? void 0 : _a.limitOrderBookAddr;
|
|
68
88
|
if (orderBookAddr == "" || orderBookAddr == undefined || this.signerOrProvider == null) {
|
|
69
|
-
throw Error(
|
|
89
|
+
throw Error("no limit order book found for ".concat(symbol, " or no signer"));
|
|
70
90
|
}
|
|
71
|
-
|
|
91
|
+
var lobContract = LimitOrderBook__factory.connect(orderBookAddr, this.signerOrProvider);
|
|
72
92
|
return lobContract;
|
|
73
|
-
}
|
|
93
|
+
};
|
|
74
94
|
/**
|
|
75
95
|
* Called when initializing. This function fills this.symbolToTokenAddrMap,
|
|
76
96
|
* and this.nestedPerpetualIDs and this.symbolToPerpStaticInfo
|
|
77
97
|
*
|
|
78
98
|
*/
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
99
|
+
PerpetualDataHandler.prototype._fillSymbolMaps = function (overrides) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
101
|
+
var poolInfo, j, decimals, info, perpStaticInfos, requiredPairs, j, perp, poolCCY, _a, base, quote, base3, currentSymbol3, _b, _c, _d, key, info;
|
|
102
|
+
var e_1, _e;
|
|
103
|
+
return __generator(this, function (_f) {
|
|
104
|
+
switch (_f.label) {
|
|
105
|
+
case 0:
|
|
106
|
+
if (!this.proxyContract || !this.lobFactoryContract) {
|
|
107
|
+
throw Error("proxy or limit order book not defined");
|
|
108
|
+
}
|
|
109
|
+
return [4 /*yield*/, PerpetualDataHandler.getPoolStaticInfo(this.proxyContract, overrides)];
|
|
110
|
+
case 1:
|
|
111
|
+
poolInfo = _f.sent();
|
|
112
|
+
this.nestedPerpetualIDs = poolInfo.nestedPerpetualIDs;
|
|
113
|
+
j = 0;
|
|
114
|
+
_f.label = 2;
|
|
115
|
+
case 2:
|
|
116
|
+
if (!(j < poolInfo.nestedPerpetualIDs.length)) return [3 /*break*/, 5];
|
|
117
|
+
return [4 /*yield*/, ERC20__factory.connect(poolInfo.poolMarginTokenAddr[j], this.provider).decimals()];
|
|
118
|
+
case 3:
|
|
119
|
+
decimals = _f.sent();
|
|
120
|
+
info = {
|
|
121
|
+
poolId: j + 1,
|
|
122
|
+
poolMarginSymbol: "",
|
|
123
|
+
poolMarginTokenAddr: poolInfo.poolMarginTokenAddr[j],
|
|
124
|
+
poolMarginTokenDecimals: decimals,
|
|
125
|
+
shareTokenAddr: poolInfo.poolShareTokenAddr[j],
|
|
126
|
+
oracleFactoryAddr: poolInfo.oracleFactory,
|
|
127
|
+
isRunning: poolInfo.poolShareTokenAddr[j] != AddressZero,
|
|
128
|
+
};
|
|
129
|
+
this.poolStaticInfos.push(info);
|
|
130
|
+
_f.label = 4;
|
|
131
|
+
case 4:
|
|
132
|
+
j++;
|
|
133
|
+
return [3 /*break*/, 2];
|
|
134
|
+
case 5: return [4 /*yield*/, PerpetualDataHandler.getPerpetualStaticInfo(this.proxyContract, this.nestedPerpetualIDs, this.symbolList, overrides)];
|
|
135
|
+
case 6:
|
|
136
|
+
perpStaticInfos = _f.sent();
|
|
137
|
+
requiredPairs = new Set();
|
|
138
|
+
// 1) determine pool currency based on its perpetuals
|
|
139
|
+
// 2) determine which triangulations we need
|
|
140
|
+
// 3) fill mapping this.symbolToPerpStaticInf
|
|
141
|
+
for (j = 0; j < perpStaticInfos.length; j++) {
|
|
142
|
+
perp = perpStaticInfos[j];
|
|
143
|
+
requiredPairs.add(perp.S2Symbol);
|
|
144
|
+
if (perp.S3Symbol != "") {
|
|
145
|
+
requiredPairs.add(perp.S3Symbol);
|
|
146
|
+
}
|
|
147
|
+
poolCCY = this.poolStaticInfos[perp.poolId - 1].poolMarginSymbol;
|
|
148
|
+
if (poolCCY == "") {
|
|
149
|
+
_a = __read(perp.S2Symbol.split("-"), 2), base = _a[0], quote = _a[1];
|
|
150
|
+
base3 = perp.S3Symbol.split("-")[0];
|
|
151
|
+
// we find out the pool currency by looking at all perpetuals
|
|
152
|
+
// from the perpetual.
|
|
153
|
+
if (perp.collateralCurrencyType == COLLATERAL_CURRENCY_BASE) {
|
|
154
|
+
poolCCY = base;
|
|
155
|
+
}
|
|
156
|
+
else if (perp.collateralCurrencyType == COLLATERAL_CURRENCY_QUOTE) {
|
|
157
|
+
poolCCY = quote;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
poolCCY = base3;
|
|
161
|
+
}
|
|
162
|
+
// set pool currency
|
|
163
|
+
this.poolStaticInfos[perp.poolId - 1].poolMarginSymbol = poolCCY;
|
|
164
|
+
// push pool margin token address into map
|
|
165
|
+
this.symbolToTokenAddrMap.set(poolCCY, this.poolStaticInfos[perp.poolId - 1].poolMarginTokenAddr);
|
|
166
|
+
}
|
|
167
|
+
currentSymbol3 = perp.S2Symbol + "-" + poolCCY;
|
|
168
|
+
this.symbolToPerpStaticInfo.set(currentSymbol3, perpStaticInfos[j]);
|
|
169
|
+
}
|
|
170
|
+
// pre-calculate all triangulation paths so we can easily get from
|
|
171
|
+
// the prices of price-feeds to the index price required, e.g.
|
|
172
|
+
// BTC-USDC : BTC-USD / USDC-USD
|
|
173
|
+
this.priceFeedGetter.initializeTriangulations(requiredPairs);
|
|
174
|
+
try {
|
|
175
|
+
// fill this.perpetualIdToSymbol
|
|
176
|
+
for (_b = __values(this.symbolToPerpStaticInfo), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
177
|
+
_d = __read(_c.value, 2), key = _d[0], info = _d[1];
|
|
178
|
+
this.perpetualIdToSymbol.set(info.id, key);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
182
|
+
finally {
|
|
183
|
+
try {
|
|
184
|
+
if (_c && !_c.done && (_e = _b.return)) _e.call(_b);
|
|
185
|
+
}
|
|
186
|
+
finally { if (e_1) throw e_1.error; }
|
|
187
|
+
}
|
|
188
|
+
return [2 /*return*/];
|
|
118
189
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
else {
|
|
123
|
-
poolCCY = base3;
|
|
124
|
-
}
|
|
125
|
-
// set pool currency
|
|
126
|
-
this.poolStaticInfos[perp.poolId - 1].poolMarginSymbol = poolCCY;
|
|
127
|
-
// push pool margin token address into map
|
|
128
|
-
this.symbolToTokenAddrMap.set(poolCCY, this.poolStaticInfos[perp.poolId - 1].poolMarginTokenAddr);
|
|
129
|
-
}
|
|
130
|
-
let currentSymbol3 = perp.S2Symbol + "-" + poolCCY;
|
|
131
|
-
this.symbolToPerpStaticInfo.set(currentSymbol3, perpStaticInfos[j]);
|
|
132
|
-
}
|
|
133
|
-
// pre-calculate all triangulation paths so we can easily get from
|
|
134
|
-
// the prices of price-feeds to the index price required, e.g.
|
|
135
|
-
// BTC-USDC : BTC-USD / USDC-USD
|
|
136
|
-
this.priceFeedGetter.initializeTriangulations(requiredPairs);
|
|
137
|
-
// fill this.perpetualIdToSymbol
|
|
138
|
-
for (let [key, info] of this.symbolToPerpStaticInfo) {
|
|
139
|
-
this.perpetualIdToSymbol.set(info.id, key);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
};
|
|
142
193
|
/**
|
|
143
194
|
* Get pool symbol given a pool Id.
|
|
144
195
|
* @param {number} poolId Pool Id.
|
|
145
196
|
* @returns {symbol} Pool symbol, e.g. "USDC".
|
|
146
197
|
*/
|
|
147
|
-
getSymbolFromPoolId(poolId) {
|
|
198
|
+
PerpetualDataHandler.prototype.getSymbolFromPoolId = function (poolId) {
|
|
148
199
|
return PerpetualDataHandler._getSymbolFromPoolId(poolId, this.poolStaticInfos);
|
|
149
|
-
}
|
|
200
|
+
};
|
|
150
201
|
/**
|
|
151
202
|
* Get pool Id given a pool symbol. Pool IDs start at 1.
|
|
152
203
|
* @param {string} symbol Pool symbol.
|
|
153
204
|
* @returns {number} Pool Id.
|
|
154
205
|
*/
|
|
155
|
-
getPoolIdFromSymbol(symbol) {
|
|
206
|
+
PerpetualDataHandler.prototype.getPoolIdFromSymbol = function (symbol) {
|
|
156
207
|
return PerpetualDataHandler._getPoolIdFromSymbol(symbol, this.poolStaticInfos);
|
|
157
|
-
}
|
|
208
|
+
};
|
|
158
209
|
/**
|
|
159
210
|
* Get perpetual Id given a perpetual symbol.
|
|
160
211
|
* @param {string} symbol Perpetual symbol, e.g. "BTC-USD-MATIC".
|
|
161
212
|
* @returns {number} Perpetual Id.
|
|
162
213
|
*/
|
|
163
|
-
getPerpIdFromSymbol(symbol) {
|
|
214
|
+
PerpetualDataHandler.prototype.getPerpIdFromSymbol = function (symbol) {
|
|
164
215
|
return PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
165
|
-
}
|
|
216
|
+
};
|
|
166
217
|
/**
|
|
167
218
|
* Get the symbol in long format of the perpetual id
|
|
168
219
|
* @param perpId perpetual id
|
|
169
220
|
*/
|
|
170
|
-
getSymbolFromPerpId(perpId) {
|
|
221
|
+
PerpetualDataHandler.prototype.getSymbolFromPerpId = function (perpId) {
|
|
171
222
|
return this.perpetualIdToSymbol.get(perpId);
|
|
172
|
-
}
|
|
173
|
-
symbol4BToLongSymbol(sym) {
|
|
223
|
+
};
|
|
224
|
+
PerpetualDataHandler.prototype.symbol4BToLongSymbol = function (sym) {
|
|
174
225
|
return symbol4BToLongSymbol(sym, this.symbolList);
|
|
175
|
-
}
|
|
226
|
+
};
|
|
176
227
|
/**
|
|
177
228
|
* Get PriceFeedSubmission data required for blockchain queries that involve price data, and the corresponding
|
|
178
229
|
* triangulated prices for the indices S2 and S3
|
|
179
230
|
* @param symbol pool symbol of the form "ETH-USD-MATIC"
|
|
180
231
|
* @returns PriceFeedSubmission and prices for S2 and S3. [S2price, 0] if S3 not defined.
|
|
181
232
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
233
|
+
PerpetualDataHandler.prototype.fetchPriceSubmissionInfoForPerpetual = function (symbol) {
|
|
234
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
235
|
+
return __generator(this, function (_a) {
|
|
236
|
+
switch (_a.label) {
|
|
237
|
+
case 0: return [4 /*yield*/, this.priceFeedGetter.fetchFeedPriceInfoAndIndicesForPerpetual(symbol)];
|
|
238
|
+
case 1:
|
|
239
|
+
// fetch prices from required price-feeds (REST)
|
|
240
|
+
return [2 /*return*/, _a.sent()];
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
};
|
|
186
245
|
/**
|
|
187
246
|
* Get the symbols required as indices for the given perpetual
|
|
188
247
|
* @param symbol of the form ETH-USD-MATIC, specifying the perpetual
|
|
189
248
|
* @returns name of underlying index prices, e.g. ["MATIC-USD", ""]
|
|
190
249
|
*/
|
|
191
|
-
getIndexSymbols(symbol) {
|
|
250
|
+
PerpetualDataHandler.prototype.getIndexSymbols = function (symbol) {
|
|
192
251
|
// get index
|
|
193
|
-
|
|
252
|
+
var staticInfo = this.symbolToPerpStaticInfo.get(symbol);
|
|
194
253
|
if (staticInfo == undefined) {
|
|
195
|
-
throw new Error(
|
|
254
|
+
throw new Error("No static info for perpetual with symbol ".concat(symbol));
|
|
196
255
|
}
|
|
197
256
|
return [staticInfo.S2Symbol, staticInfo.S3Symbol];
|
|
198
|
-
}
|
|
257
|
+
};
|
|
199
258
|
/**
|
|
200
259
|
* Get the latest prices for a given perpetual from the offchain oracle
|
|
201
260
|
* networks
|
|
@@ -203,60 +262,68 @@ export default class PerpetualDataHandler {
|
|
|
203
262
|
* @returns array of price feed updates that can be submitted to the smart contract
|
|
204
263
|
* and corresponding price information
|
|
205
264
|
*/
|
|
206
|
-
|
|
207
|
-
return
|
|
208
|
-
|
|
265
|
+
PerpetualDataHandler.prototype.fetchLatestFeedPriceInfo = function (symbol) {
|
|
266
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
267
|
+
return __generator(this, function (_a) {
|
|
268
|
+
switch (_a.label) {
|
|
269
|
+
case 0: return [4 /*yield*/, this.priceFeedGetter.fetchLatestFeedPriceInfoForPerpetual(symbol)];
|
|
270
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
};
|
|
209
275
|
/**
|
|
210
276
|
* Get list of required pyth price source IDs for given perpetual
|
|
211
277
|
* @param symbol perpetual symbol, e.g., BTC-USD-MATIC
|
|
212
278
|
* @returns list of required pyth price sources for this perpetual
|
|
213
279
|
*/
|
|
214
|
-
getPriceIds(symbol) {
|
|
215
|
-
|
|
280
|
+
PerpetualDataHandler.prototype.getPriceIds = function (symbol) {
|
|
281
|
+
var perpInfo = this.symbolToPerpStaticInfo.get(symbol);
|
|
216
282
|
if (perpInfo == undefined) {
|
|
217
|
-
throw Error(
|
|
283
|
+
throw Error("Perpetual with symbol ".concat(symbol, " not found. Check symbol or use createProxyInstance()."));
|
|
218
284
|
}
|
|
219
285
|
return perpInfo.priceIds;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
286
|
+
};
|
|
287
|
+
PerpetualDataHandler._getSymbolFromPoolId = function (poolId, staticInfos) {
|
|
288
|
+
var idx = poolId - 1;
|
|
223
289
|
return staticInfos[idx].poolMarginSymbol;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
290
|
+
};
|
|
291
|
+
PerpetualDataHandler._getPoolIdFromSymbol = function (symbol, staticInfos) {
|
|
292
|
+
var symbols = symbol.split("-");
|
|
227
293
|
//in case user provided ETH-USD-MATIC instead of MATIC; or similar
|
|
228
294
|
if (symbols.length == 3) {
|
|
229
295
|
symbol = symbols[2];
|
|
230
296
|
}
|
|
231
|
-
|
|
297
|
+
var j = 0;
|
|
232
298
|
while (j < staticInfos.length && staticInfos[j].poolMarginSymbol != symbol) {
|
|
233
299
|
j++;
|
|
234
300
|
}
|
|
235
301
|
if (j == staticInfos.length) {
|
|
236
|
-
throw new Error(
|
|
302
|
+
throw new Error("no pool found for symbol ".concat(symbol));
|
|
237
303
|
}
|
|
238
304
|
return j + 1;
|
|
239
|
-
}
|
|
305
|
+
};
|
|
240
306
|
/**
|
|
241
307
|
* Get perpetual symbols for a given pool
|
|
242
308
|
* @param poolSymbol pool symbol such as "MATIC"
|
|
243
309
|
* @returns array of perpetual symbols in this pool
|
|
244
310
|
*/
|
|
245
|
-
getPerpetualSymbolsInPool(poolSymbol) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
311
|
+
PerpetualDataHandler.prototype.getPerpetualSymbolsInPool = function (poolSymbol) {
|
|
312
|
+
var _this = this;
|
|
313
|
+
var j = PerpetualDataHandler._getPoolIdFromSymbol(poolSymbol, this.poolStaticInfos);
|
|
314
|
+
var perpIds = this.nestedPerpetualIDs[j - 1];
|
|
315
|
+
var perpSymbols = perpIds.map(function (k) {
|
|
316
|
+
var s = _this.getSymbolFromPerpId(k);
|
|
250
317
|
if (s == undefined) {
|
|
251
318
|
return "";
|
|
252
319
|
}
|
|
253
320
|
return s;
|
|
254
321
|
});
|
|
255
322
|
return perpSymbols;
|
|
256
|
-
}
|
|
257
|
-
getNestedPerpetualIds() {
|
|
323
|
+
};
|
|
324
|
+
PerpetualDataHandler.prototype.getNestedPerpetualIds = function () {
|
|
258
325
|
return this.nestedPerpetualIDs;
|
|
259
|
-
}
|
|
326
|
+
};
|
|
260
327
|
/**
|
|
261
328
|
* Collect all perpetuals static info
|
|
262
329
|
* @param {ethers.Contract} _proxyContract perpetuals contract with getter
|
|
@@ -264,51 +331,65 @@ export default class PerpetualDataHandler {
|
|
|
264
331
|
* @param {Map<string, string>} symbolList mapping of symbols to convert long-format <-> blockchain-format
|
|
265
332
|
* @returns array with PerpetualStaticInfo for each perpetual
|
|
266
333
|
*/
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
334
|
+
PerpetualDataHandler.getPerpetualStaticInfo = function (_proxyContract, nestedPerpetualIDs, symbolList, overrides) {
|
|
335
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
336
|
+
var chunkSize, ids, infoArr, k, perpInfos, j, base, quote, base3, quote3, sym2, sym3, info;
|
|
337
|
+
return __generator(this, function (_a) {
|
|
338
|
+
switch (_a.label) {
|
|
339
|
+
case 0:
|
|
340
|
+
chunkSize = 10;
|
|
341
|
+
ids = PerpetualDataHandler.nestedIDsToChunks(chunkSize, nestedPerpetualIDs);
|
|
342
|
+
infoArr = new Array();
|
|
343
|
+
k = 0;
|
|
344
|
+
_a.label = 1;
|
|
345
|
+
case 1:
|
|
346
|
+
if (!(k < ids.length)) return [3 /*break*/, 4];
|
|
347
|
+
return [4 /*yield*/, _proxyContract.getPerpetualStaticInfo(ids[k], overrides || {})];
|
|
348
|
+
case 2:
|
|
349
|
+
perpInfos = _a.sent();
|
|
350
|
+
for (j = 0; j < perpInfos.length; j++) {
|
|
351
|
+
base = contractSymbolToSymbol(perpInfos[j].S2BaseCCY, symbolList);
|
|
352
|
+
quote = contractSymbolToSymbol(perpInfos[j].S2QuoteCCY, symbolList);
|
|
353
|
+
base3 = contractSymbolToSymbol(perpInfos[j].S3BaseCCY, symbolList);
|
|
354
|
+
quote3 = contractSymbolToSymbol(perpInfos[j].S3QuoteCCY, symbolList);
|
|
355
|
+
sym2 = base + "-" + quote;
|
|
356
|
+
sym3 = base3 == "" ? "" : base3 + "-" + quote3;
|
|
357
|
+
info = {
|
|
358
|
+
id: perpInfos[j].id,
|
|
359
|
+
poolId: Math.floor(perpInfos[j].id / 100000),
|
|
360
|
+
limitOrderBookAddr: perpInfos[j].limitOrderBookAddr,
|
|
361
|
+
initialMarginRate: ABDK29ToFloat(perpInfos[j].fInitialMarginRate),
|
|
362
|
+
maintenanceMarginRate: ABDK29ToFloat(perpInfos[j].fMaintenanceMarginRate),
|
|
363
|
+
collateralCurrencyType: perpInfos[j].collCurrencyType,
|
|
364
|
+
S2Symbol: sym2,
|
|
365
|
+
S3Symbol: sym3,
|
|
366
|
+
lotSizeBC: ABK64x64ToFloat(perpInfos[j].fLotSizeBC),
|
|
367
|
+
referralRebate: ABK64x64ToFloat(perpInfos[j].fReferralRebateCC),
|
|
368
|
+
priceIds: perpInfos[j].priceIds,
|
|
369
|
+
};
|
|
370
|
+
infoArr.push(info);
|
|
371
|
+
}
|
|
372
|
+
_a.label = 3;
|
|
373
|
+
case 3:
|
|
374
|
+
k++;
|
|
375
|
+
return [3 /*break*/, 1];
|
|
376
|
+
case 4: return [2 /*return*/, infoArr];
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
};
|
|
300
381
|
/**
|
|
301
382
|
* Breaks up an array of nested arrays into chunks of a specified size.
|
|
302
383
|
* @param {number} chunkSize The size of each chunk.
|
|
303
384
|
* @param {number[][]} nestedIDs The array of nested arrays to chunk.
|
|
304
385
|
* @returns {number[][]} An array of subarrays, each containing `chunkSize` or fewer elements from `nestedIDs`.
|
|
305
386
|
*/
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
for (
|
|
310
|
-
|
|
311
|
-
for (
|
|
387
|
+
PerpetualDataHandler.nestedIDsToChunks = function (chunkSize, nestedIDs) {
|
|
388
|
+
var chunkIDs = [];
|
|
389
|
+
var currentChunk = [];
|
|
390
|
+
for (var k = 0; k < nestedIDs.length; k++) {
|
|
391
|
+
var currentPoolIds = nestedIDs[k];
|
|
392
|
+
for (var j = 0; j < currentPoolIds.length; j++) {
|
|
312
393
|
currentChunk.push(currentPoolIds[j]);
|
|
313
394
|
if (currentChunk.length === chunkSize) {
|
|
314
395
|
chunkIDs.push(currentChunk);
|
|
@@ -320,48 +401,61 @@ export default class PerpetualDataHandler {
|
|
|
320
401
|
chunkIDs.push(currentChunk);
|
|
321
402
|
}
|
|
322
403
|
return chunkIDs;
|
|
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
|
-
|
|
404
|
+
};
|
|
405
|
+
PerpetualDataHandler.getPoolStaticInfo = function (_proxyContract, overrides) {
|
|
406
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
407
|
+
var idxFrom, len, lenReceived, nestedPerpetualIDs, poolShareTokenAddr, poolMarginTokenAddr, oracleFactory, res;
|
|
408
|
+
return __generator(this, function (_a) {
|
|
409
|
+
switch (_a.label) {
|
|
410
|
+
case 0:
|
|
411
|
+
idxFrom = 1;
|
|
412
|
+
len = 10;
|
|
413
|
+
lenReceived = 10;
|
|
414
|
+
nestedPerpetualIDs = [];
|
|
415
|
+
poolShareTokenAddr = [];
|
|
416
|
+
poolMarginTokenAddr = [];
|
|
417
|
+
oracleFactory = "";
|
|
418
|
+
_a.label = 1;
|
|
419
|
+
case 1:
|
|
420
|
+
if (!(lenReceived == len)) return [3 /*break*/, 3];
|
|
421
|
+
return [4 /*yield*/, _proxyContract.getPoolStaticInfo(idxFrom, idxFrom + len - 1, overrides || {})];
|
|
422
|
+
case 2:
|
|
423
|
+
res = _a.sent();
|
|
424
|
+
lenReceived = res.length;
|
|
425
|
+
nestedPerpetualIDs = nestedPerpetualIDs.concat(res[0]);
|
|
426
|
+
poolShareTokenAddr = res[1];
|
|
427
|
+
poolMarginTokenAddr = res[2];
|
|
428
|
+
oracleFactory = res[3];
|
|
429
|
+
idxFrom = idxFrom + len;
|
|
430
|
+
return [3 /*break*/, 1];
|
|
431
|
+
case 3: return [2 /*return*/, {
|
|
432
|
+
nestedPerpetualIDs: nestedPerpetualIDs,
|
|
433
|
+
poolShareTokenAddr: poolShareTokenAddr,
|
|
434
|
+
poolMarginTokenAddr: poolMarginTokenAddr,
|
|
435
|
+
oracleFactory: oracleFactory,
|
|
436
|
+
}];
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
};
|
|
441
|
+
PerpetualDataHandler.buildMarginAccountFromState = function (symbol, traderState, symbolToPerpStaticInfo, _pxS2S3) {
|
|
442
|
+
var _a;
|
|
443
|
+
var idx_cash = 3;
|
|
444
|
+
var idx_notional = 4;
|
|
445
|
+
var idx_locked_in = 5;
|
|
446
|
+
var idx_mark_price = 8;
|
|
447
|
+
var idx_lvg = 7;
|
|
448
|
+
var idx_s3 = 9;
|
|
449
|
+
var isEmpty = traderState[idx_notional].eq(0);
|
|
450
|
+
var cash = ABK64x64ToFloat(traderState[idx_cash]);
|
|
451
|
+
var S2Liq = 0, S3Liq = 0, tau = Infinity, pnl = 0, unpaidFundingCC = 0, fLockedIn = BigNumber.from(0), side = CLOSED_SIDE, entryPrice = 0;
|
|
358
452
|
if (!isEmpty) {
|
|
359
|
-
|
|
453
|
+
_a = __read(PerpetualDataHandler._calculateLiquidationPrice(symbol, traderState, _pxS2S3[0], symbolToPerpStaticInfo), 5), S2Liq = _a[0], S3Liq = _a[1], tau = _a[2], pnl = _a[3], unpaidFundingCC = _a[4];
|
|
360
454
|
fLockedIn = traderState[idx_locked_in];
|
|
361
455
|
side = traderState[idx_locked_in].gt(0) ? BUY_SIDE : SELL_SIDE;
|
|
362
456
|
entryPrice = ABK64x64ToFloat(div64x64(fLockedIn, traderState[idx_notional]));
|
|
363
457
|
}
|
|
364
|
-
|
|
458
|
+
var mgn = {
|
|
365
459
|
symbol: symbol,
|
|
366
460
|
positionNotionalBaseCCY: isEmpty ? 0 : ABK64x64ToFloat(traderState[idx_notional].abs()),
|
|
367
461
|
side: isEmpty ? CLOSED_SIDE : side,
|
|
@@ -376,56 +470,96 @@ export default class PerpetualDataHandler {
|
|
|
376
470
|
collToQuoteConversion: ABK64x64ToFloat(traderState[idx_s3]),
|
|
377
471
|
};
|
|
378
472
|
return mgn;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
return
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
473
|
+
};
|
|
474
|
+
PerpetualDataHandler.getMarginAccount = function (traderAddr, symbol, symbolToPerpStaticInfo, _proxyContract, _pxS2S3, overrides) {
|
|
475
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
476
|
+
var perpId, traderState;
|
|
477
|
+
return __generator(this, function (_a) {
|
|
478
|
+
switch (_a.label) {
|
|
479
|
+
case 0:
|
|
480
|
+
perpId = Number(symbol);
|
|
481
|
+
if (isNaN(perpId)) {
|
|
482
|
+
perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
483
|
+
}
|
|
484
|
+
return [4 /*yield*/, _proxyContract.getTraderState(perpId, traderAddr, _pxS2S3.map(function (x) { return floatToABK64x64(x); }), overrides || {})];
|
|
485
|
+
case 1:
|
|
486
|
+
traderState = _a.sent();
|
|
487
|
+
return [2 /*return*/, PerpetualDataHandler.buildMarginAccountFromState(symbol, traderState, symbolToPerpStaticInfo, _pxS2S3)];
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
};
|
|
492
|
+
PerpetualDataHandler._queryPerpetualPrice = function (symbol, tradeAmount, symbolToPerpStaticInfo, _proxyContract, indexPrices, overrides) {
|
|
493
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
494
|
+
var perpId, fIndexPrices, fPrice;
|
|
495
|
+
return __generator(this, function (_a) {
|
|
496
|
+
switch (_a.label) {
|
|
497
|
+
case 0:
|
|
498
|
+
perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
499
|
+
fIndexPrices = indexPrices.map(function (x) { return floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x); });
|
|
500
|
+
return [4 /*yield*/, _proxyContract.queryPerpetualPrice(perpId, floatToABK64x64(tradeAmount), fIndexPrices, overrides || {})];
|
|
501
|
+
case 1:
|
|
502
|
+
fPrice = _a.sent();
|
|
503
|
+
return [2 /*return*/, ABK64x64ToFloat(fPrice)];
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
};
|
|
508
|
+
PerpetualDataHandler._queryPerpetualMarkPrice = function (symbol, symbolToPerpStaticInfo, _proxyContract, indexPrices, overrides) {
|
|
509
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
510
|
+
var perpId, _a, S2, S3, ammState;
|
|
511
|
+
return __generator(this, function (_b) {
|
|
512
|
+
switch (_b.label) {
|
|
513
|
+
case 0:
|
|
514
|
+
perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
515
|
+
_a = __read(indexPrices.map(function (x) { return floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x); }), 2), S2 = _a[0], S3 = _a[1];
|
|
516
|
+
return [4 /*yield*/, _proxyContract.getAMMState(perpId, [S2, S3], overrides || {})];
|
|
517
|
+
case 1:
|
|
518
|
+
ammState = _b.sent();
|
|
519
|
+
// ammState[6] == S2 == indexPrices[0] up to rounding errors (indexPrices is most accurate)
|
|
520
|
+
return [2 /*return*/, indexPrices[0] * (1 + ABK64x64ToFloat(ammState[8]))];
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
};
|
|
525
|
+
PerpetualDataHandler._queryPerpetualState = function (symbol, symbolToPerpStaticInfo, _proxyContract, indexPrices, overrides) {
|
|
526
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
527
|
+
var perpId, staticInfo, ccy, _a, S2, S3, ammState, markPrice, state;
|
|
528
|
+
return __generator(this, function (_b) {
|
|
529
|
+
switch (_b.label) {
|
|
530
|
+
case 0:
|
|
531
|
+
perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
532
|
+
staticInfo = symbolToPerpStaticInfo.get(symbol);
|
|
533
|
+
ccy = symbol.split("-");
|
|
534
|
+
_a = __read([indexPrices[0], indexPrices[1]], 2), S2 = _a[0], S3 = _a[1];
|
|
535
|
+
if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
536
|
+
S3 = S2;
|
|
537
|
+
}
|
|
538
|
+
else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
|
|
539
|
+
S3 = 1;
|
|
540
|
+
}
|
|
541
|
+
return [4 /*yield*/, _proxyContract.getAMMState(perpId, [S2, S3].map(floatToABK64x64), overrides || {})];
|
|
542
|
+
case 1:
|
|
543
|
+
ammState = _b.sent();
|
|
544
|
+
markPrice = S2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
545
|
+
state = {
|
|
546
|
+
id: perpId,
|
|
547
|
+
state: PERP_STATE_STR[ammState[13].toNumber()],
|
|
548
|
+
baseCurrency: ccy[0],
|
|
549
|
+
quoteCurrency: ccy[1],
|
|
550
|
+
indexPrice: S2,
|
|
551
|
+
collToQuoteIndexPrice: S3,
|
|
552
|
+
markPrice: markPrice,
|
|
553
|
+
midPrice: ABK64x64ToFloat(ammState[10]),
|
|
554
|
+
currentFundingRateBps: ABK64x64ToFloat(ammState[14]) * 1e4,
|
|
555
|
+
openInterestBC: ABK64x64ToFloat(ammState[11]),
|
|
556
|
+
isMarketClosed: indexPrices[2] || indexPrices[3],
|
|
557
|
+
};
|
|
558
|
+
return [2 /*return*/, state];
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
};
|
|
429
563
|
/**
|
|
430
564
|
* Liquidation price
|
|
431
565
|
* @param symbol symbol of the form BTC-USD-MATIC
|
|
@@ -434,34 +568,34 @@ export default class PerpetualDataHandler {
|
|
|
434
568
|
* @param symbolToPerpStaticInfo mapping symbol->PerpStaticInfo
|
|
435
569
|
* @returns liquidation mark-price, corresponding collateral/quote conversion
|
|
436
570
|
*/
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
571
|
+
PerpetualDataHandler._calculateLiquidationPrice = function (symbol, traderState, S2, symbolToPerpStaticInfo) {
|
|
572
|
+
var idx_availableCashCC = 2;
|
|
573
|
+
var idx_cash = 3;
|
|
574
|
+
var idx_notional = 4;
|
|
575
|
+
var idx_locked_in = 5;
|
|
576
|
+
var idx_mark_price = 8;
|
|
577
|
+
var idx_s3 = 9;
|
|
444
578
|
// const idx_s2 = 10;
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
579
|
+
var S2Liq;
|
|
580
|
+
var S3Liq = ABK64x64ToFloat(traderState[idx_s3]);
|
|
581
|
+
var perpInfo = symbolToPerpStaticInfo.get(symbol);
|
|
448
582
|
if (perpInfo == undefined) {
|
|
449
|
-
throw new Error(
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
583
|
+
throw new Error("no info for perpetual ".concat(symbol));
|
|
584
|
+
}
|
|
585
|
+
var tau = perpInfo.maintenanceMarginRate;
|
|
586
|
+
var lockedInValueQC = ABK64x64ToFloat(traderState[idx_locked_in]);
|
|
587
|
+
var position = ABK64x64ToFloat(traderState[idx_notional]);
|
|
588
|
+
var cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
|
|
589
|
+
var Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
|
|
590
|
+
var unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC].sub(traderState[idx_cash]));
|
|
591
|
+
var unpaidFunding = unpaidFundingCC;
|
|
458
592
|
if (perpInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
459
593
|
S2Liq = calculateLiquidationPriceCollateralBase(lockedInValueQC, position, cashCC, tau);
|
|
460
594
|
S3Liq = S2Liq;
|
|
461
595
|
unpaidFunding = unpaidFunding / S2;
|
|
462
596
|
}
|
|
463
597
|
else if (perpInfo.collateralCurrencyType == CollaterlCCY.QUANTO) {
|
|
464
|
-
|
|
598
|
+
var S3 = S3Liq;
|
|
465
599
|
S3Liq = S3;
|
|
466
600
|
S2Liq = calculateLiquidationPriceCollateralQuanto(lockedInValueQC, position, cashCC, tau, S3, Sm);
|
|
467
601
|
unpaidFunding = unpaidFunding / S3;
|
|
@@ -473,9 +607,9 @@ export default class PerpetualDataHandler {
|
|
|
473
607
|
S2Liq = S2Liq < 0 ? 0 : S2Liq;
|
|
474
608
|
S3Liq = S3Liq && S3Liq < 0 ? 0 : S3Liq;
|
|
475
609
|
// account cash + pnl = avail cash + pos Sm - L = margin balance
|
|
476
|
-
|
|
610
|
+
var pnl = position * Sm - lockedInValueQC + unpaidFunding;
|
|
477
611
|
return [S2Liq, S3Liq, tau, pnl, unpaidFundingCC];
|
|
478
|
-
}
|
|
612
|
+
};
|
|
479
613
|
/**
|
|
480
614
|
* Finds the perpetual id for a symbol of the form
|
|
481
615
|
* <base>-<quote>-<collateral>. The function first converts the
|
|
@@ -485,45 +619,57 @@ export default class PerpetualDataHandler {
|
|
|
485
619
|
* including id mapping
|
|
486
620
|
* @returns perpetual id or it fails
|
|
487
621
|
*/
|
|
488
|
-
|
|
489
|
-
|
|
622
|
+
PerpetualDataHandler.symbolToPerpetualId = function (symbol, symbolToPerpStaticInfo) {
|
|
623
|
+
var _a;
|
|
624
|
+
var id = (_a = symbolToPerpStaticInfo.get(symbol)) === null || _a === void 0 ? void 0 : _a.id;
|
|
490
625
|
if (id == undefined) {
|
|
491
|
-
throw Error(
|
|
626
|
+
throw Error("No perpetual found for symbol ".concat(symbol));
|
|
492
627
|
}
|
|
493
628
|
return id;
|
|
494
|
-
}
|
|
495
|
-
|
|
629
|
+
};
|
|
630
|
+
PerpetualDataHandler.symbolToBytes4Symbol = function (symbol) {
|
|
496
631
|
//split by dashes BTC-USD-MATIC
|
|
497
|
-
|
|
632
|
+
var symbols = symbol.split("-");
|
|
498
633
|
if (symbols.length != 3) {
|
|
499
|
-
throw Error(
|
|
634
|
+
throw Error("Symbol ".concat(symbol, " not valid. Expecting CCY-CCY-CCY format"));
|
|
500
635
|
}
|
|
501
636
|
//transform into bytes4 currencies (without the space): "BTC", "USD", "MATC"
|
|
502
|
-
symbols = symbols.map((x)
|
|
503
|
-
|
|
637
|
+
symbols = symbols.map(function (x) {
|
|
638
|
+
var v = to4Chars(x);
|
|
504
639
|
v = v.replace(/\0/g, "");
|
|
505
640
|
return v;
|
|
506
641
|
});
|
|
507
642
|
// concatenate and find perpetual Id in map
|
|
508
643
|
return symbols[0] + "-" + symbols[1] + "-" + symbols[2];
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
644
|
+
};
|
|
645
|
+
PerpetualDataHandler._getByValue = function (map, searchValue, valueField) {
|
|
646
|
+
var e_2, _a;
|
|
647
|
+
try {
|
|
648
|
+
for (var _b = __values(map.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
649
|
+
var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
|
|
650
|
+
if (value[valueField] === searchValue) {
|
|
651
|
+
return key;
|
|
652
|
+
}
|
|
514
653
|
}
|
|
515
654
|
}
|
|
655
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
656
|
+
finally {
|
|
657
|
+
try {
|
|
658
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
659
|
+
}
|
|
660
|
+
finally { if (e_2) throw e_2.error; }
|
|
661
|
+
}
|
|
516
662
|
return undefined;
|
|
517
|
-
}
|
|
518
|
-
|
|
663
|
+
};
|
|
664
|
+
PerpetualDataHandler.fromSmartContractOrder = function (order, symbolToPerpInfoMap) {
|
|
519
665
|
// find symbol of perpetual id
|
|
520
|
-
|
|
666
|
+
var symbol = PerpetualDataHandler._getByValue(symbolToPerpInfoMap, order.iPerpetualId, "id");
|
|
521
667
|
if (symbol == undefined) {
|
|
522
|
-
throw Error(
|
|
668
|
+
throw Error("Perpetual id ".concat(order.iPerpetualId, " not found. Check with marketData.exchangeInfo()."));
|
|
523
669
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
670
|
+
var side = order.fAmount > BigNumber.from(0) ? BUY_SIDE : SELL_SIDE;
|
|
671
|
+
var limitPrice, stopPrice;
|
|
672
|
+
var fLimitPrice = BigNumber.from(order.fLimitPrice);
|
|
527
673
|
if (fLimitPrice.eq(0)) {
|
|
528
674
|
limitPrice = side == BUY_SIDE ? undefined : 0;
|
|
529
675
|
}
|
|
@@ -533,14 +679,14 @@ export default class PerpetualDataHandler {
|
|
|
533
679
|
else {
|
|
534
680
|
limitPrice = ABK64x64ToFloat(fLimitPrice);
|
|
535
681
|
}
|
|
536
|
-
|
|
682
|
+
var fStopPrice = BigNumber.from(order.fTriggerPrice);
|
|
537
683
|
if (fStopPrice.eq(0) || fStopPrice.eq(MAX_64x64)) {
|
|
538
684
|
stopPrice = undefined;
|
|
539
685
|
}
|
|
540
686
|
else {
|
|
541
687
|
stopPrice = ABK64x64ToFloat(fStopPrice);
|
|
542
688
|
}
|
|
543
|
-
|
|
689
|
+
var userOrder = {
|
|
544
690
|
symbol: symbol,
|
|
545
691
|
side: side,
|
|
546
692
|
type: PerpetualDataHandler._flagToOrderType(BigNumber.from(order.flags), BigNumber.from(order.fLimitPrice)),
|
|
@@ -558,7 +704,7 @@ export default class PerpetualDataHandler {
|
|
|
558
704
|
submittedTimestamp: Number(order.submittedTimestamp),
|
|
559
705
|
};
|
|
560
706
|
return userOrder;
|
|
561
|
-
}
|
|
707
|
+
};
|
|
562
708
|
/**
|
|
563
709
|
* Transform the convenient form of the order into a smart-contract accepted type of order
|
|
564
710
|
* @param order order type
|
|
@@ -566,14 +712,14 @@ export default class PerpetualDataHandler {
|
|
|
566
712
|
* @param symbolToPerpetualMap mapping of symbol to perpetual Id
|
|
567
713
|
* @returns SmartContractOrder
|
|
568
714
|
*/
|
|
569
|
-
|
|
715
|
+
PerpetualDataHandler.toSmartContractOrder = function (order, traderAddr, perpStaticInfo) {
|
|
570
716
|
// this revers if order is invalid
|
|
571
717
|
PerpetualDataHandler.checkOrder(order, perpStaticInfo);
|
|
572
718
|
// translate order
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
719
|
+
var flags = PerpetualDataHandler._orderTypeToFlag(order);
|
|
720
|
+
var brokerSig = order.brokerSignature == undefined ? [] : order.brokerSignature;
|
|
721
|
+
var perpetualId = PerpetualDataHandler.symbolToPerpetualId(order.symbol, perpStaticInfo);
|
|
722
|
+
var fAmount;
|
|
577
723
|
if (order.side == BUY_SIDE) {
|
|
578
724
|
fAmount = floatToABK64x64(Math.abs(order.quantity));
|
|
579
725
|
}
|
|
@@ -581,9 +727,9 @@ export default class PerpetualDataHandler {
|
|
|
581
727
|
fAmount = floatToABK64x64(-Math.abs(order.quantity));
|
|
582
728
|
}
|
|
583
729
|
else {
|
|
584
|
-
throw Error(
|
|
730
|
+
throw Error("invalid side in order spec, use ".concat(BUY_SIDE, " or ").concat(SELL_SIDE));
|
|
585
731
|
}
|
|
586
|
-
|
|
732
|
+
var fLimitPrice;
|
|
587
733
|
if (order.limitPrice == undefined) {
|
|
588
734
|
// we need to set the limit price to infinity or zero for
|
|
589
735
|
// the trade to go through
|
|
@@ -594,9 +740,9 @@ export default class PerpetualDataHandler {
|
|
|
594
740
|
else {
|
|
595
741
|
fLimitPrice = floatToABK64x64(order.limitPrice);
|
|
596
742
|
}
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
743
|
+
var iDeadline = order.deadline == undefined ? Date.now() / 1000 + ORDER_MAX_DURATION_SEC : order.deadline;
|
|
744
|
+
var fTriggerPrice = order.stopPrice == undefined ? BigNumber.from(0) : floatToABK64x64(order.stopPrice);
|
|
745
|
+
var smOrder = {
|
|
600
746
|
flags: flags,
|
|
601
747
|
iPerpetualId: perpetualId,
|
|
602
748
|
brokerFeeTbps: order.brokerFeeTbps == undefined ? 0 : order.brokerFeeTbps,
|
|
@@ -613,14 +759,14 @@ export default class PerpetualDataHandler {
|
|
|
613
759
|
submittedTimestamp: 0,
|
|
614
760
|
};
|
|
615
761
|
return smOrder;
|
|
616
|
-
}
|
|
762
|
+
};
|
|
617
763
|
/**
|
|
618
764
|
* Converts a smart contract order to a client order
|
|
619
765
|
* @param scOrder Smart contract order
|
|
620
766
|
* @param parentChildIds Optional parent-child dependency
|
|
621
767
|
* @returns Client order that can be submitted to the corresponding LOB
|
|
622
768
|
*/
|
|
623
|
-
|
|
769
|
+
PerpetualDataHandler.fromSmartContratOrderToClientOrder = function (scOrder, parentChildIds) {
|
|
624
770
|
return {
|
|
625
771
|
flags: scOrder.flags,
|
|
626
772
|
iPerpetualId: scOrder.iPerpetualId,
|
|
@@ -638,24 +784,24 @@ export default class PerpetualDataHandler {
|
|
|
638
784
|
parentChildDigest1: parentChildIds ? parentChildIds[0] : ZERO_ORDER_ID,
|
|
639
785
|
parentChildDigest2: parentChildIds ? parentChildIds[1] : ZERO_ORDER_ID,
|
|
640
786
|
};
|
|
641
|
-
}
|
|
787
|
+
};
|
|
642
788
|
/**
|
|
643
789
|
* Converts a user-friendly order to a client order
|
|
644
790
|
* @param order Order
|
|
645
791
|
* @param parentChildIds Optional parent-child dependency
|
|
646
792
|
* @returns Client order that can be submitted to the corresponding LOB
|
|
647
793
|
*/
|
|
648
|
-
|
|
649
|
-
|
|
794
|
+
PerpetualDataHandler.toClientOrder = function (order, traderAddr, perpStaticInfo, parentChildIds) {
|
|
795
|
+
var scOrder = PerpetualDataHandler.toSmartContractOrder(order, traderAddr, perpStaticInfo);
|
|
650
796
|
return PerpetualDataHandler.fromSmartContratOrderToClientOrder(scOrder, parentChildIds);
|
|
651
|
-
}
|
|
797
|
+
};
|
|
652
798
|
/**
|
|
653
799
|
* Converts an order as stored in the LOB smart contract into a user-friendly order type
|
|
654
800
|
* @param obOrder Order-book contract order type
|
|
655
801
|
* @returns User friendly order struct
|
|
656
802
|
*/
|
|
657
|
-
|
|
658
|
-
|
|
803
|
+
PerpetualDataHandler.fromClientOrder = function (obOrder, perpStaticInfo) {
|
|
804
|
+
var scOrder = {
|
|
659
805
|
flags: obOrder.flags,
|
|
660
806
|
iPerpetualId: obOrder.iPerpetualId,
|
|
661
807
|
brokerFeeTbps: obOrder.brokerFeeTbps,
|
|
@@ -669,18 +815,18 @@ export default class PerpetualDataHandler {
|
|
|
669
815
|
iDeadline: obOrder.iDeadline,
|
|
670
816
|
executionTimestamp: obOrder.executionTimestamp,
|
|
671
817
|
};
|
|
672
|
-
|
|
818
|
+
var order = PerpetualDataHandler.fromSmartContractOrder(scOrder, perpStaticInfo);
|
|
673
819
|
if (obOrder.parentChildDigest1.toString() != ZERO_ORDER_ID ||
|
|
674
820
|
obOrder.parentChildDigest2.toString() != ZERO_ORDER_ID) {
|
|
675
821
|
order.parentChildOrderIds = [obOrder.parentChildDigest1.toString(), obOrder.parentChildDigest2.toString()];
|
|
676
822
|
}
|
|
677
823
|
return order;
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
824
|
+
};
|
|
825
|
+
PerpetualDataHandler._flagToOrderType = function (orderFlags, orderLimitPrice) {
|
|
826
|
+
var flag = BigNumber.from(orderFlags);
|
|
827
|
+
var isLimit = containsFlag(flag, MASK_LIMIT_ORDER);
|
|
828
|
+
var hasLimit = !BigNumber.from(orderLimitPrice).eq(0) || !BigNumber.from(orderLimitPrice).eq(MAX_64x64);
|
|
829
|
+
var isStop = containsFlag(flag, MASK_STOP_ORDER);
|
|
684
830
|
if (isStop && hasLimit) {
|
|
685
831
|
return ORDER_TYPE_STOP_LIMIT;
|
|
686
832
|
}
|
|
@@ -693,15 +839,15 @@ export default class PerpetualDataHandler {
|
|
|
693
839
|
else {
|
|
694
840
|
return ORDER_TYPE_MARKET;
|
|
695
841
|
}
|
|
696
|
-
}
|
|
842
|
+
};
|
|
697
843
|
/**
|
|
698
844
|
* Determine the correct order flags based on the order-properties.
|
|
699
845
|
* Checks for some misspecifications.
|
|
700
846
|
* @param order order type
|
|
701
847
|
* @returns BigNumber flags
|
|
702
848
|
*/
|
|
703
|
-
|
|
704
|
-
|
|
849
|
+
PerpetualDataHandler._orderTypeToFlag = function (order) {
|
|
850
|
+
var flag;
|
|
705
851
|
order.type = order.type.toUpperCase();
|
|
706
852
|
switch (order.type) {
|
|
707
853
|
case ORDER_TYPE_LIMIT:
|
|
@@ -717,7 +863,7 @@ export default class PerpetualDataHandler {
|
|
|
717
863
|
flag = MASK_STOP_ORDER;
|
|
718
864
|
break;
|
|
719
865
|
default: {
|
|
720
|
-
throw Error(
|
|
866
|
+
throw Error("Order type ".concat(order.type, " not found."));
|
|
721
867
|
}
|
|
722
868
|
}
|
|
723
869
|
if (order.keepPositionLvg != undefined && order.keepPositionLvg) {
|
|
@@ -727,37 +873,37 @@ export default class PerpetualDataHandler {
|
|
|
727
873
|
flag = combineFlags(flag, MASK_CLOSE_ONLY);
|
|
728
874
|
}
|
|
729
875
|
if ((order.type == ORDER_TYPE_LIMIT || order.type == ORDER_TYPE_STOP_LIMIT) && order.limitPrice == undefined) {
|
|
730
|
-
throw Error(
|
|
876
|
+
throw Error("Order type ".concat(order.type, " requires limit price."));
|
|
731
877
|
}
|
|
732
878
|
if ((order.type == ORDER_TYPE_STOP_MARKET || order.type == ORDER_TYPE_STOP_LIMIT) && order.stopPrice == undefined) {
|
|
733
|
-
throw Error(
|
|
879
|
+
throw Error("Order type ".concat(order.type, " requires trigger price."));
|
|
734
880
|
}
|
|
735
881
|
if ((order.type == ORDER_TYPE_MARKET || order.type == ORDER_TYPE_LIMIT) && order.stopPrice != undefined) {
|
|
736
|
-
throw Error(
|
|
882
|
+
throw Error("Order type ".concat(order.type, " has no trigger price."));
|
|
737
883
|
}
|
|
738
884
|
if (order.type != ORDER_TYPE_STOP_LIMIT && order.type != ORDER_TYPE_STOP_MARKET && order.stopPrice != undefined) {
|
|
739
|
-
throw Error(
|
|
885
|
+
throw Error("Order type ".concat(order.type, " has no trigger price."));
|
|
740
886
|
}
|
|
741
887
|
return flag;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
|
|
888
|
+
};
|
|
889
|
+
PerpetualDataHandler._getLotSize = function (symbol, symbolToPerpStaticInfo) {
|
|
890
|
+
var perpInfo = symbolToPerpStaticInfo.get(symbol);
|
|
745
891
|
if (perpInfo == undefined) {
|
|
746
|
-
throw new Error(
|
|
892
|
+
throw new Error("no info for perpetual ".concat(symbol));
|
|
747
893
|
}
|
|
748
894
|
return perpInfo.lotSizeBC;
|
|
749
|
-
}
|
|
750
|
-
|
|
895
|
+
};
|
|
896
|
+
PerpetualDataHandler._getMinimalPositionSize = function (symbol, symbolToPerpStaticInfo) {
|
|
751
897
|
return 10 * PerpetualDataHandler._getLotSize(symbol, symbolToPerpStaticInfo);
|
|
752
|
-
}
|
|
898
|
+
};
|
|
753
899
|
/**
|
|
754
900
|
* Get NodeSDKConfig from a chain ID, known config name, or custom file location..
|
|
755
901
|
* @param configNameOrfileLocation Name of a known default config, or chain ID, or json-file with required variables for config
|
|
756
902
|
* @param version Config version number. Defaults to highest version if name or chain ID are not unique
|
|
757
903
|
* @returns NodeSDKConfig
|
|
758
904
|
*/
|
|
759
|
-
|
|
760
|
-
|
|
905
|
+
PerpetualDataHandler.readSDKConfig = function (configNameOrChainIdOrFileLocation, version) {
|
|
906
|
+
var config;
|
|
761
907
|
if (typeof configNameOrChainIdOrFileLocation === "number") {
|
|
762
908
|
// user entered a chain ID
|
|
763
909
|
config = this.getConfigByChainId(configNameOrChainIdOrFileLocation, version);
|
|
@@ -774,92 +920,92 @@ export default class PerpetualDataHandler {
|
|
|
774
920
|
}
|
|
775
921
|
else {
|
|
776
922
|
// error
|
|
777
|
-
throw Error(
|
|
923
|
+
throw Error("Please specify a chain ID, config name, or custom file location.");
|
|
778
924
|
}
|
|
779
925
|
if (config == undefined) {
|
|
780
|
-
throw Error(
|
|
926
|
+
throw Error("Config ".concat(configNameOrChainIdOrFileLocation, " not found."));
|
|
781
927
|
}
|
|
782
928
|
return config;
|
|
783
|
-
}
|
|
929
|
+
};
|
|
784
930
|
/**
|
|
785
931
|
* Get a NodeSDKConfig from its name
|
|
786
932
|
* @param name Name of the known config
|
|
787
933
|
* @param version Version of the config. Defaults to highest available.
|
|
788
934
|
* @returns NodeSDKConfig
|
|
789
935
|
*/
|
|
790
|
-
|
|
791
|
-
|
|
936
|
+
PerpetualDataHandler.getConfigByName = function (name, version) {
|
|
937
|
+
var configFile = DEFAULT_CONFIG.filter(function (c) { return c.name == name; });
|
|
792
938
|
if (configFile.length == 0) {
|
|
793
|
-
throw Error(
|
|
939
|
+
throw Error("No SDK config found with name ".concat(name, "."));
|
|
794
940
|
}
|
|
795
941
|
if (configFile.length == 1) {
|
|
796
942
|
return configFile[0];
|
|
797
943
|
}
|
|
798
944
|
else {
|
|
799
945
|
if (version === undefined) {
|
|
800
|
-
configFile = configFile.sort((conf)
|
|
946
|
+
configFile = configFile.sort(function (conf) { return -conf.version; });
|
|
801
947
|
return configFile[0];
|
|
802
948
|
}
|
|
803
949
|
else {
|
|
804
|
-
return configFile.find((conf)
|
|
950
|
+
return configFile.find(function (conf) { return conf.version === version; });
|
|
805
951
|
}
|
|
806
952
|
}
|
|
807
|
-
}
|
|
953
|
+
};
|
|
808
954
|
/**
|
|
809
955
|
* Get a NodeSDKConfig from a json file.
|
|
810
956
|
* @param filename Location of the file
|
|
811
957
|
* @param version Version of the config. Defaults to highest available.
|
|
812
958
|
* @returns NodeSDKConfig
|
|
813
959
|
*/
|
|
814
|
-
|
|
960
|
+
PerpetualDataHandler.getConfigByLocation = function (filename) {
|
|
815
961
|
// file path: this throws a warning during build - that's ok, it just won't work in react apps
|
|
816
962
|
// eslint-disable-next-line
|
|
817
|
-
|
|
963
|
+
var configFile = require(filename);
|
|
818
964
|
loadABIs(configFile);
|
|
819
965
|
return configFile;
|
|
820
|
-
}
|
|
966
|
+
};
|
|
821
967
|
/**
|
|
822
968
|
* Get a NodeSDKConfig from its chain Id
|
|
823
969
|
* @param chainId Chain Id
|
|
824
970
|
* @param version Version of the config. Defaults to highest available.
|
|
825
971
|
* @returns NodeSDKConfig
|
|
826
972
|
*/
|
|
827
|
-
|
|
828
|
-
|
|
973
|
+
PerpetualDataHandler.getConfigByChainId = function (chainId, version) {
|
|
974
|
+
var configFile = DEFAULT_CONFIG.filter(function (c) { return c.chainId == chainId; });
|
|
829
975
|
if (configFile.length == 0) {
|
|
830
|
-
throw Error(
|
|
976
|
+
throw Error("No SDK config found for chain ID ".concat(chainId, "."));
|
|
831
977
|
}
|
|
832
978
|
if (configFile.length == 1) {
|
|
833
979
|
return configFile[0];
|
|
834
980
|
}
|
|
835
981
|
else {
|
|
836
982
|
if (version === undefined) {
|
|
837
|
-
configFile = configFile.sort((conf)
|
|
983
|
+
configFile = configFile.sort(function (conf) { return -conf.version; });
|
|
838
984
|
return configFile[0];
|
|
839
985
|
}
|
|
840
986
|
else {
|
|
841
|
-
return configFile.find((conf)
|
|
987
|
+
return configFile.find(function (conf) { return conf.version === version; });
|
|
842
988
|
}
|
|
843
989
|
}
|
|
844
|
-
}
|
|
990
|
+
};
|
|
845
991
|
/**
|
|
846
992
|
* Get the ABI of a function in a given contract
|
|
847
993
|
* @param contract A contract instance, e.g. this.proxyContract
|
|
848
994
|
* @param functionName Name of the function whose ABI we want
|
|
849
995
|
* @returns Function ABI as a single JSON string
|
|
850
996
|
*/
|
|
851
|
-
|
|
997
|
+
PerpetualDataHandler._getABIFromContract = function (contract, functionName) {
|
|
852
998
|
return contract.interface.getFunction(functionName).format(FormatTypes.full);
|
|
853
|
-
}
|
|
999
|
+
};
|
|
854
1000
|
/**
|
|
855
1001
|
* Gets the pool index (starting at 0 in exchangeInfo, not ID!) corresponding to a given symbol.
|
|
856
1002
|
* @param symbol Symbol of the form ETH-USD-MATIC
|
|
857
1003
|
* @returns Pool index
|
|
858
1004
|
*/
|
|
859
|
-
getPoolStaticInfoIndexFromSymbol(symbol) {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
1005
|
+
PerpetualDataHandler.prototype.getPoolStaticInfoIndexFromSymbol = function (symbol) {
|
|
1006
|
+
var pools = this.poolStaticInfos;
|
|
1007
|
+
var poolId = PerpetualDataHandler._getPoolIdFromSymbol(symbol, this.poolStaticInfos);
|
|
1008
|
+
var k = 0;
|
|
863
1009
|
while (k < pools.length) {
|
|
864
1010
|
if (pools[k].poolId == poolId) {
|
|
865
1011
|
// pool found
|
|
@@ -868,16 +1014,16 @@ export default class PerpetualDataHandler {
|
|
|
868
1014
|
k++;
|
|
869
1015
|
}
|
|
870
1016
|
return -1;
|
|
871
|
-
}
|
|
1017
|
+
};
|
|
872
1018
|
/**
|
|
873
1019
|
*
|
|
874
1020
|
* @param symbol Symbol of the form USDC
|
|
875
1021
|
* @returns Address of the corresponding token
|
|
876
1022
|
*/
|
|
877
|
-
getMarginTokenFromSymbol(symbol) {
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
1023
|
+
PerpetualDataHandler.prototype.getMarginTokenFromSymbol = function (symbol) {
|
|
1024
|
+
var pools = this.poolStaticInfos;
|
|
1025
|
+
var poolId = PerpetualDataHandler._getPoolIdFromSymbol(symbol, this.poolStaticInfos);
|
|
1026
|
+
var k = 0;
|
|
881
1027
|
while (k < pools.length) {
|
|
882
1028
|
if (pools[k].poolId == poolId) {
|
|
883
1029
|
// pool found
|
|
@@ -886,16 +1032,16 @@ export default class PerpetualDataHandler {
|
|
|
886
1032
|
k++;
|
|
887
1033
|
}
|
|
888
1034
|
return undefined;
|
|
889
|
-
}
|
|
1035
|
+
};
|
|
890
1036
|
/**
|
|
891
1037
|
*
|
|
892
1038
|
* @param symbol Symbol of the form USDC
|
|
893
1039
|
* @returns Decimals of the corresponding token
|
|
894
1040
|
*/
|
|
895
|
-
getMarginTokenDecimalsFromSymbol(symbol) {
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
1041
|
+
PerpetualDataHandler.prototype.getMarginTokenDecimalsFromSymbol = function (symbol) {
|
|
1042
|
+
var pools = this.poolStaticInfos;
|
|
1043
|
+
var poolId = PerpetualDataHandler._getPoolIdFromSymbol(symbol, this.poolStaticInfos);
|
|
1044
|
+
var k = 0;
|
|
899
1045
|
while (k < pools.length) {
|
|
900
1046
|
if (pools[k].poolId == poolId) {
|
|
901
1047
|
// pool found
|
|
@@ -904,13 +1050,13 @@ export default class PerpetualDataHandler {
|
|
|
904
1050
|
k++;
|
|
905
1051
|
}
|
|
906
1052
|
return undefined;
|
|
907
|
-
}
|
|
1053
|
+
};
|
|
908
1054
|
/**
|
|
909
1055
|
* Get ABI for LimitOrderBook, Proxy, or Share Pool Token
|
|
910
1056
|
* @param contract name of contract: proxy|lob|sharetoken
|
|
911
1057
|
* @returns ABI for the requested contract
|
|
912
1058
|
*/
|
|
913
|
-
getABI(contract) {
|
|
1059
|
+
PerpetualDataHandler.prototype.getABI = function (contract) {
|
|
914
1060
|
switch (contract) {
|
|
915
1061
|
case "proxy":
|
|
916
1062
|
return this.proxyABI;
|
|
@@ -921,22 +1067,22 @@ export default class PerpetualDataHandler {
|
|
|
921
1067
|
default:
|
|
922
1068
|
return undefined;
|
|
923
1069
|
}
|
|
924
|
-
}
|
|
1070
|
+
};
|
|
925
1071
|
/**
|
|
926
1072
|
* Performs basic validity checks on a given order
|
|
927
1073
|
* @param order Order struct
|
|
928
1074
|
* @param traderAccount Trader account
|
|
929
1075
|
* @param perpStaticInfo Symbol to perpetual info map
|
|
930
1076
|
*/
|
|
931
|
-
|
|
1077
|
+
PerpetualDataHandler.checkOrder = function (order,
|
|
932
1078
|
// traderAccount: MarginAccount,
|
|
933
1079
|
perpStaticInfo) {
|
|
934
1080
|
// check side
|
|
935
1081
|
if (order.side != BUY_SIDE && order.side != SELL_SIDE) {
|
|
936
|
-
throw Error(
|
|
1082
|
+
throw Error("order side must be ".concat(BUY_SIDE, " or ").concat(SELL_SIDE));
|
|
937
1083
|
}
|
|
938
1084
|
// check amount
|
|
939
|
-
|
|
1085
|
+
var lotSize = perpStaticInfo.get(order.symbol).lotSizeBC;
|
|
940
1086
|
// let curPos =
|
|
941
1087
|
// traderAccount.side == CLOSED_SIDE
|
|
942
1088
|
// ? 0
|
|
@@ -944,20 +1090,22 @@ export default class PerpetualDataHandler {
|
|
|
944
1090
|
// let newPos = curPos + (order.side == BUY_SIDE ? 1 : -1) * order.quantity;
|
|
945
1091
|
// if (Math.abs(order.quantity) < lotSize || (Math.abs(newPos) >= lotSize && Math.abs(newPos) < 10 * lotSize)) {
|
|
946
1092
|
if (Math.abs(order.quantity) < lotSize) {
|
|
947
|
-
throw Error(
|
|
1093
|
+
throw Error("trade amount too small: ".concat(order.quantity, " ").concat(perpStaticInfo.get(order.symbol).S2Symbol));
|
|
948
1094
|
}
|
|
949
1095
|
// check limit price
|
|
950
1096
|
if (order.side == BUY_SIDE && order.limitPrice != undefined && order.limitPrice <= 0) {
|
|
951
|
-
throw Error(
|
|
1097
|
+
throw Error("invalid limit price for buy order: ".concat(order.limitPrice));
|
|
952
1098
|
}
|
|
953
1099
|
// broker fee
|
|
954
1100
|
if (order.brokerFeeTbps != undefined && order.brokerFeeTbps < 0) {
|
|
955
|
-
throw Error(
|
|
1101
|
+
throw Error("invalid broker fee: ".concat(order.brokerFeeTbps / 10, " bps"));
|
|
956
1102
|
}
|
|
957
1103
|
// stop price
|
|
958
1104
|
if (order.stopPrice != undefined && order.stopPrice < 0) {
|
|
959
|
-
throw Error(
|
|
1105
|
+
throw Error("invalid stop price: ".concat(order.stopPrice));
|
|
960
1106
|
}
|
|
961
|
-
}
|
|
962
|
-
|
|
1107
|
+
};
|
|
1108
|
+
return PerpetualDataHandler;
|
|
1109
|
+
}());
|
|
1110
|
+
export default PerpetualDataHandler;
|
|
963
1111
|
//# sourceMappingURL=perpetualDataHandler.js.map
|