@d8x/perpetuals-sdk 2.0.12-alpha → 2.1.0-alpha2
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/abi/IPerpetualManager.json +124 -3
- package/dist/cjs/abi/OracleFactory.json +94 -25
- package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
- package/dist/cjs/brokerTool.d.ts +5 -1
- package/dist/cjs/brokerTool.js +14 -1
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/contracts/IPerpetualManager.d.ts +74 -10
- package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
- package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +124 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/cjs/d8XMath.d.ts +44 -1
- package/dist/cjs/d8XMath.js +236 -3
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/liquidatorTool.d.ts +1 -0
- package/dist/cjs/liquidatorTool.js +24 -7
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/marketData.d.ts +42 -20
- package/dist/cjs/marketData.js +261 -188
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +24 -2
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderExecutorTool.d.ts +3 -3
- package/dist/cjs/orderExecutorTool.js +38 -13
- package/dist/cjs/orderExecutorTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +22 -12
- package/dist/cjs/perpetualDataHandler.js +59 -44
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.d.ts +1 -1
- package/dist/cjs/perpetualEventHandler.js +6 -7
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/polyMktsPxFeed.d.ts +6 -4
- package/dist/cjs/polyMktsPxFeed.js +24 -3
- package/dist/cjs/polyMktsPxFeed.js.map +1 -1
- package/dist/cjs/priceFeeds.d.ts +6 -7
- package/dist/cjs/priceFeeds.js +36 -14
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/abi/IPerpetualManager.json +124 -3
- package/dist/esm/abi/OracleFactory.json +94 -25
- package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
- package/dist/esm/brokerTool.d.ts +5 -1
- package/dist/esm/brokerTool.js +15 -2
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/contracts/IPerpetualManager.d.ts +74 -10
- package/dist/esm/contracts/OracleFactory.d.ts +69 -20
- package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +124 -3
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
- package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
- package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +44 -1
- package/dist/esm/d8XMath.js +229 -2
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.d.ts +1 -0
- package/dist/esm/liquidatorTool.js +25 -8
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/marketData.d.ts +42 -20
- package/dist/esm/marketData.js +263 -190
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +24 -2
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderExecutorTool.d.ts +3 -3
- package/dist/esm/orderExecutorTool.js +38 -13
- package/dist/esm/orderExecutorTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +22 -12
- package/dist/esm/perpetualDataHandler.js +60 -45
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.d.ts +1 -1
- package/dist/esm/perpetualEventHandler.js +6 -7
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/polyMktsPxFeed.d.ts +6 -4
- package/dist/esm/polyMktsPxFeed.js +24 -3
- package/dist/esm/polyMktsPxFeed.js.map +1 -1
- package/dist/esm/priceFeeds.d.ts +6 -7
- package/dist/esm/priceFeeds.js +36 -14
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
- package/src/abi/IPerpetualManager.json +124 -3
- package/src/abi/OracleFactory.json +523 -454
- package/src/abi/PerpetualManagerProxy.json +1596 -1386
- package/src/brokerTool.ts +16 -2
- package/src/contracts/IPerpetualManager.ts +107 -7
- package/src/contracts/OracleFactory.ts +100 -26
- package/src/contracts/PerpetualManagerProxy.ts +192 -3
- package/src/contracts/factories/IPerpetualManager__factory.ts +124 -3
- package/src/contracts/factories/OracleFactory__factory.ts +94 -25
- package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
- package/src/d8XMath.ts +304 -2
- package/src/liquidatorTool.ts +29 -14
- package/src/marketData.ts +415 -238
- package/src/nodeSDKTypes.ts +30 -2
- package/src/orderExecutorTool.ts +48 -20
- package/src/perpetualDataHandler.ts +87 -45
- package/src/perpetualEventHandler.ts +6 -7
- package/src/polyMktsPxFeed.ts +30 -5
- package/src/priceFeeds.ts +41 -17
- package/src/version.ts +1 -1
- package/dist/cjs/abi/BeaconProxy.json +0 -71
- package/dist/cjs/abi/Maintainer.json +0 -774
- package/dist/cjs/abi/MockToken.json +0 -347
- package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
- package/dist/cjs/abi/WeETH.json +0 -310
- package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
- package/dist/cjs/contracts/BeaconProxy.js +0 -3
- package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
- package/dist/cjs/contracts/Maintainer.d.ts +0 -799
- package/dist/cjs/contracts/Maintainer.js +0 -3
- package/dist/cjs/contracts/Maintainer.js.map +0 -1
- package/dist/cjs/contracts/MockToken.d.ts +0 -263
- package/dist/cjs/contracts/MockToken.js +0 -3
- package/dist/cjs/contracts/MockToken.js.map +0 -1
- package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
- package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/cjs/contracts/WeETH.d.ts +0 -503
- package/dist/cjs/contracts/WeETH.js +0 -3
- package/dist/cjs/contracts/WeETH.js.map +0 -1
- package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
- package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
- package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
- package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/factories/lean0/index.js +0 -15
- package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
- package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
- package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
- package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/cjs/contracts/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/lean0/index.js +0 -3
- package/dist/cjs/contracts/lean0/index.js.map +0 -1
- package/dist/esm/abi/BeaconProxy.json +0 -71
- package/dist/esm/abi/Maintainer.json +0 -774
- package/dist/esm/abi/MockToken.json +0 -347
- package/dist/esm/abi/UUPSUpgradeable.json +0 -104
- package/dist/esm/abi/WeETH.json +0 -310
- package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
- package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
- package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
- package/dist/esm/abi/lean0/ShareToken.json +0 -438
- package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
- package/dist/esm/contracts/BeaconProxy.js +0 -2
- package/dist/esm/contracts/BeaconProxy.js.map +0 -1
- package/dist/esm/contracts/Maintainer.d.ts +0 -799
- package/dist/esm/contracts/Maintainer.js +0 -2
- package/dist/esm/contracts/Maintainer.js.map +0 -1
- package/dist/esm/contracts/MockToken.d.ts +0 -263
- package/dist/esm/contracts/MockToken.js +0 -2
- package/dist/esm/contracts/MockToken.js.map +0 -1
- package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
- package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/esm/contracts/WeETH.d.ts +0 -503
- package/dist/esm/contracts/WeETH.js +0 -2
- package/dist/esm/contracts/WeETH.js.map +0 -1
- package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
- package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
- package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
- package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
- package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/factories/lean0/index.js +0 -8
- package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
- package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
- package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/esm/contracts/lean0/ShareToken.js +0 -2
- package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/esm/contracts/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/lean0/index.js +0 -2
- package/dist/esm/contracts/lean0/index.js.map +0 -1
package/dist/cjs/marketData.js
CHANGED
|
@@ -286,7 +286,8 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
286
286
|
*/
|
|
287
287
|
async _positionRiskForTraderInPerpetual(traderAddr, symbol, provider, overrides) {
|
|
288
288
|
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
289
|
-
|
|
289
|
+
const isPred = this.isPredictionMarket(symbol);
|
|
290
|
+
let mgnAcct = await perpetualDataHandler_1.default.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), obj, isPred, overrides);
|
|
290
291
|
return mgnAcct;
|
|
291
292
|
}
|
|
292
293
|
/**
|
|
@@ -298,122 +299,67 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
298
299
|
*/
|
|
299
300
|
async _positionRiskForTraderInPerpetuals(traderAddr, symbols, provider, overrides) {
|
|
300
301
|
const MAX_SYMBOLS_PER_CALL = 10;
|
|
301
|
-
const
|
|
302
|
+
const pxInfo = new Array();
|
|
302
303
|
for (let i = 0; i < symbols.length; i++) {
|
|
303
304
|
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbols[i]);
|
|
304
|
-
|
|
305
|
+
pxInfo.push(obj);
|
|
305
306
|
}
|
|
306
307
|
let mgnAcct = [];
|
|
307
308
|
let callSymbols = symbols.slice(0, MAX_SYMBOLS_PER_CALL);
|
|
308
|
-
let
|
|
309
|
+
let _px = pxInfo.slice(0, MAX_SYMBOLS_PER_CALL);
|
|
309
310
|
while (callSymbols.length > 0) {
|
|
310
|
-
|
|
311
|
+
const isPred = callSymbols.map((_sym) => this.isPredictionMarket(_sym));
|
|
312
|
+
let acc = await perpetualDataHandler_1.default.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, contracts_1.Multicall3__factory.connect(this.config.multicall ?? constants_1.MULTICALL_ADDRESS, provider), new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), _px, isPred, overrides);
|
|
311
313
|
mgnAcct = mgnAcct.concat(acc);
|
|
312
314
|
callSymbols = symbols.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
|
|
313
|
-
|
|
315
|
+
_px = pxInfo.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
|
|
314
316
|
}
|
|
315
317
|
return mgnAcct;
|
|
316
318
|
}
|
|
317
|
-
|
|
318
|
-
* Estimates what the position risk will be if a given order is executed.
|
|
319
|
-
* @param traderAddr Address of trader
|
|
320
|
-
* @param order Order to be submitted
|
|
321
|
-
* @param account Position risk before trade. Defaults to current position if not given.
|
|
322
|
-
* @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
|
|
323
|
-
* @returns Position risk after trade, including order cost and maximal trade sizes for position
|
|
324
|
-
* @example
|
|
325
|
-
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
326
|
-
* async function main() {
|
|
327
|
-
* console.log(MarketData);
|
|
328
|
-
* // setup
|
|
329
|
-
* const config = PerpetualDataHandler.readSDKConfig("cardona");
|
|
330
|
-
* const mktData = new MarketData(config);
|
|
331
|
-
* await mktData.createProxyInstance();
|
|
332
|
-
* const order: Order = {
|
|
333
|
-
* symbol: "MATIC-USD-MATIC",
|
|
334
|
-
* side: "BUY",
|
|
335
|
-
* type: "MARKET",
|
|
336
|
-
* quantity: 100,
|
|
337
|
-
* leverage: 2,
|
|
338
|
-
* executionTimestamp: Date.now()/1000,
|
|
339
|
-
* };
|
|
340
|
-
* // Get position risk conditional on this order being executed
|
|
341
|
-
* const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order);
|
|
342
|
-
* console.log(posRisk);
|
|
343
|
-
* }
|
|
344
|
-
* main();
|
|
345
|
-
*/
|
|
346
|
-
async positionRiskOnTrade(traderAddr, order, account, indexPriceInfo, overrides) {
|
|
319
|
+
async dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides) {
|
|
347
320
|
if (this.proxyContract == null || this.multicall == null) {
|
|
348
321
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
349
322
|
}
|
|
350
|
-
|
|
351
|
-
if (indexPriceInfo == undefined) {
|
|
352
|
-
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
|
|
353
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
354
|
-
}
|
|
355
|
-
// override total fee
|
|
356
|
-
let tradingFeeTbps;
|
|
357
|
-
if (overrides) {
|
|
358
|
-
({ tradingFeeTbps, ...overrides } = overrides);
|
|
359
|
-
}
|
|
360
|
-
// signed trade amount
|
|
361
|
-
let tradeAmountBC = Math.abs(order.quantity) * (order.side == constants_1.BUY_SIDE ? 1 : -1);
|
|
362
|
-
const accountGiven = account !== undefined;
|
|
323
|
+
const isPredMkt = this.isPredictionMarket(symbol);
|
|
363
324
|
// create all calls
|
|
364
|
-
const
|
|
365
|
-
const
|
|
366
|
-
const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
325
|
+
const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
326
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
367
327
|
const proxyCalls = [
|
|
368
328
|
// 0: traderState
|
|
369
329
|
{
|
|
370
330
|
target: this.proxyContract.target,
|
|
371
331
|
allowFailure: true,
|
|
372
|
-
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr,
|
|
373
|
-
},
|
|
374
|
-
// 1: ammState
|
|
375
|
-
{
|
|
376
|
-
target: this.proxyContract.target,
|
|
377
|
-
allowFailure: true,
|
|
378
|
-
callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, fS2S3]),
|
|
379
|
-
},
|
|
380
|
-
// 2: exchangeFee
|
|
381
|
-
{
|
|
382
|
-
target: this.proxyContract.target,
|
|
383
|
-
allowFailure: false,
|
|
384
|
-
callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
|
|
385
|
-
poolId,
|
|
386
|
-
traderAddr,
|
|
387
|
-
order.brokerAddr ?? constants_1.ZERO_ADDRESS,
|
|
388
|
-
]),
|
|
332
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
389
333
|
},
|
|
390
|
-
//
|
|
334
|
+
// 1: perpetual price
|
|
391
335
|
{
|
|
392
336
|
target: this.proxyContract.target,
|
|
393
337
|
allowFailure: true,
|
|
394
338
|
callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
395
339
|
perpId,
|
|
396
340
|
(0, d8XMath_1.floatToABK64x64)(tradeAmountBC),
|
|
397
|
-
|
|
341
|
+
[fS2, fS3],
|
|
342
|
+
indexPriceInfo.conf,
|
|
343
|
+
indexPriceInfo.predMktCLOBParams,
|
|
398
344
|
]),
|
|
399
345
|
},
|
|
400
|
-
//
|
|
346
|
+
// 2: max long pos
|
|
401
347
|
{
|
|
402
348
|
target: this.proxyContract.target,
|
|
403
349
|
allowFailure: false,
|
|
404
350
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
405
351
|
perpId,
|
|
406
|
-
|
|
352
|
+
(0, d8XMath_1.floatToABK64x64)(signedPositionNotionalBaseCCY),
|
|
407
353
|
true,
|
|
408
354
|
]),
|
|
409
355
|
},
|
|
410
|
-
//
|
|
356
|
+
// 3: max short pos
|
|
411
357
|
{
|
|
412
358
|
target: this.proxyContract.target,
|
|
413
359
|
allowFailure: false,
|
|
414
360
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
415
361
|
perpId,
|
|
416
|
-
|
|
362
|
+
(0, d8XMath_1.floatToABK64x64)(signedPositionNotionalBaseCCY),
|
|
417
363
|
false,
|
|
418
364
|
]),
|
|
419
365
|
},
|
|
@@ -421,44 +367,84 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
421
367
|
// multicall
|
|
422
368
|
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, (overrides || {}));
|
|
423
369
|
// positionRisk to apply this trade on: if not given, defaults to the current trader's position
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
traderState = await this.proxyContract.getTraderState(perpId, traderAddr, fS2S3);
|
|
431
|
-
}
|
|
432
|
-
account = MarketData.buildMarginAccountFromState(order.symbol, traderState, this.symbolToPerpStaticInfo, [
|
|
433
|
-
indexPriceInfo[0],
|
|
434
|
-
indexPriceInfo[1],
|
|
435
|
-
]);
|
|
436
|
-
}
|
|
437
|
-
// perpetualState, for prices
|
|
438
|
-
let ammState;
|
|
439
|
-
if (encodedResults[1].success) {
|
|
440
|
-
ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[1].returnData)[0];
|
|
370
|
+
let traderState;
|
|
371
|
+
if (encodedResults[0].success) {
|
|
372
|
+
traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
441
373
|
}
|
|
442
374
|
else {
|
|
443
|
-
|
|
375
|
+
traderState = await this.proxyContract.getTraderState(perpId, traderAddr, [fEma, fS3]);
|
|
444
376
|
}
|
|
445
|
-
const
|
|
446
|
-
indexPriceInfo, this.symbolToPerpStaticInfo);
|
|
447
|
-
let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
|
|
448
|
-
// exchange fee based on this trader's address (volume, token holding, etc) and his broker address (if any)
|
|
449
|
-
const exchangeFeeTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
377
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
|
|
450
378
|
// amm price for this trade amount
|
|
451
379
|
let ammPrice;
|
|
452
380
|
{
|
|
453
381
|
let fPrice;
|
|
454
|
-
if (encodedResults[
|
|
455
|
-
fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[
|
|
382
|
+
if (encodedResults[1].success) {
|
|
383
|
+
fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[1].returnData)[0];
|
|
456
384
|
}
|
|
457
385
|
else {
|
|
458
|
-
fPrice = await this.proxyContract.queryPerpetualPrice(perpId, (0, d8XMath_1.floatToABK64x64)(tradeAmountBC),
|
|
386
|
+
fPrice = await this.proxyContract.queryPerpetualPrice(perpId, (0, d8XMath_1.floatToABK64x64)(tradeAmountBC), [indexPriceInfo.s2, indexPriceInfo.s3], indexPriceInfo.conf, indexPriceInfo.predMktCLOBParams);
|
|
459
387
|
}
|
|
460
388
|
ammPrice = (0, d8XMath_1.ABK64x64ToFloat)(fPrice);
|
|
461
389
|
}
|
|
390
|
+
// max buy
|
|
391
|
+
const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[2].returnData)[0];
|
|
392
|
+
const maxLongTrade = Math.max(0, (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) - signedPositionNotionalBaseCCY);
|
|
393
|
+
// max sell
|
|
394
|
+
const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[3].returnData)[0];
|
|
395
|
+
const maxShortTrade = Math.max(0, Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) - signedPositionNotionalBaseCCY);
|
|
396
|
+
return { account: account, ammPrice: ammPrice, maxShortTrade: maxShortTrade, maxLongTrade: maxLongTrade };
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Estimates what the position risk will be if a given order is executed.
|
|
400
|
+
* @param traderAddr Address of trader
|
|
401
|
+
* @param order Order to be submitted
|
|
402
|
+
* @param signedPositionNotionalBaseCCY signed position notional of current position (before trade)
|
|
403
|
+
* @param tradingFeeTbps trading fee in tenth of basis points (exchange fee and broker fee)
|
|
404
|
+
* @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
|
|
405
|
+
* @returns Position risk after trade, including order cost and maximal trade sizes for position
|
|
406
|
+
* @example
|
|
407
|
+
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
408
|
+
* async function main() {
|
|
409
|
+
* console.log(MarketData);
|
|
410
|
+
* // setup
|
|
411
|
+
* const config = PerpetualDataHandler.readSDKConfig("cardona");
|
|
412
|
+
* const mktData = new MarketData(config);
|
|
413
|
+
* await mktData.createProxyInstance();
|
|
414
|
+
* const order: Order = {
|
|
415
|
+
* symbol: "MATIC-USD-MATIC",
|
|
416
|
+
* side: "BUY",
|
|
417
|
+
* type: "MARKET",
|
|
418
|
+
* quantity: 100,
|
|
419
|
+
* leverage: 2,
|
|
420
|
+
* executionTimestamp: Date.now()/1000,
|
|
421
|
+
* };
|
|
422
|
+
* // Get position risk conditional on this order being executed
|
|
423
|
+
* const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order, 0, 60);
|
|
424
|
+
* console.log(posRisk);
|
|
425
|
+
* }
|
|
426
|
+
* main();
|
|
427
|
+
*/
|
|
428
|
+
async positionRiskOnTrade(traderAddr, order, signedPositionNotionalBaseCCY, tradingFeeTbps, indexPriceInfo, overrides) {
|
|
429
|
+
if (this.proxyContract == null || this.multicall == null) {
|
|
430
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
431
|
+
}
|
|
432
|
+
const isPredMkt = this.isPredictionMarket(order.symbol);
|
|
433
|
+
// fetch prices
|
|
434
|
+
if (indexPriceInfo == undefined) {
|
|
435
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
|
|
436
|
+
}
|
|
437
|
+
// signed trade amount
|
|
438
|
+
let tradeAmountBC = Math.abs(order.quantity) * (order.side == constants_1.BUY_SIDE ? 1 : -1);
|
|
439
|
+
const symbol = order.symbol;
|
|
440
|
+
let obj = await this.dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides);
|
|
441
|
+
const account = obj.account;
|
|
442
|
+
const maxLongTrade = obj.maxLongTrade;
|
|
443
|
+
const maxShortTrade = obj.maxShortTrade;
|
|
444
|
+
const ammPrice = obj.ammPrice;
|
|
445
|
+
let Sm = account.markPrice;
|
|
446
|
+
let S2 = indexPriceInfo.s2;
|
|
447
|
+
let S3 = account.collToQuoteConversion;
|
|
462
448
|
// price for this order = amm price if no limit given, else conservatively adjusted
|
|
463
449
|
let tradePrice;
|
|
464
450
|
if (order.limitPrice == undefined) {
|
|
@@ -494,16 +480,6 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
494
480
|
}
|
|
495
481
|
}
|
|
496
482
|
}
|
|
497
|
-
// max buy
|
|
498
|
-
const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[4].returnData)[0];
|
|
499
|
-
const maxLongTrade = account.side == constants_1.BUY_SIDE
|
|
500
|
-
? Math.max(0, (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) - (accountGiven ? 0 : account.positionNotionalBaseCCY))
|
|
501
|
-
: (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) + account.positionNotionalBaseCCY;
|
|
502
|
-
// max sell
|
|
503
|
-
const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[5].returnData)[0];
|
|
504
|
-
const maxShortTrade = account.side == constants_1.SELL_SIDE
|
|
505
|
-
? Math.max(0, Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) - (accountGiven ? 0 : Math.abs(account.positionNotionalBaseCCY)))
|
|
506
|
-
: Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) + Math.abs(account.positionNotionalBaseCCY);
|
|
507
483
|
// Current state:
|
|
508
484
|
let lotSizeBC = MarketData._getLotSize(order.symbol, this.symbolToPerpStaticInfo);
|
|
509
485
|
// Too small, no change to account
|
|
@@ -525,10 +501,6 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
525
501
|
newPositionBC = 0;
|
|
526
502
|
}
|
|
527
503
|
let newSide = newPositionBC > 0 ? constants_1.BUY_SIDE : newPositionBC < 0 ? constants_1.SELL_SIDE : constants_1.CLOSED_SIDE;
|
|
528
|
-
if (tradingFeeTbps === undefined) {
|
|
529
|
-
// use usual input if not overriden
|
|
530
|
-
tradingFeeTbps = Number(exchangeFeeTbps) + (order.brokerFeeTbps ?? 0);
|
|
531
|
-
}
|
|
532
504
|
let tradingFeeCC = (Math.abs(tradeAmountBC) * tradingFeeTbps * 1e-5 * S2) / S3;
|
|
533
505
|
let referralFeeCC = this.symbolToPerpStaticInfo.get(account.symbol).referralRebate;
|
|
534
506
|
// Trade type:
|
|
@@ -553,7 +525,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
553
525
|
let initialMarginRate = this.symbolToPerpStaticInfo.get(account.symbol).initialMarginRate;
|
|
554
526
|
targetLvg = isFlip || isOpen ? order.leverage ?? 1 / initialMarginRate : 0;
|
|
555
527
|
let [b0, pos0] = isOpen ? [0, 0] : [account.collateralCC, currentPositionBC];
|
|
556
|
-
traderDepositCC = (0, d8XMath_1.getDepositAmountForLvgTrade)(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm);
|
|
528
|
+
traderDepositCC = (0, d8XMath_1.getDepositAmountForLvgTrade)(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm, isPredMkt);
|
|
557
529
|
// fees are paid from wallet in this case
|
|
558
530
|
traderDepositCC += tradingFeeCC + referralFeeCC;
|
|
559
531
|
}
|
|
@@ -578,7 +550,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
578
550
|
? Infinity
|
|
579
551
|
: (Math.abs(newPositionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
580
552
|
// Liquidation params
|
|
581
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
553
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
582
554
|
// New position risk
|
|
583
555
|
let newPositionRisk = {
|
|
584
556
|
symbol: account.symbol,
|
|
@@ -601,6 +573,18 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
601
573
|
maxShortTrade: maxShortTrade,
|
|
602
574
|
};
|
|
603
575
|
}
|
|
576
|
+
/**
|
|
577
|
+
* Fee is relative to base-currency amount (=trade amount)
|
|
578
|
+
* @param state current perpetual state (need longBC and shortBC)
|
|
579
|
+
* @param maxMaintMgnRate maintenance margin rate param for pred mkts
|
|
580
|
+
* @param Sm Mark price
|
|
581
|
+
* @param tradeAmtBC signed trade amount
|
|
582
|
+
* @param tradeMgnRate margin rate param from perpetual
|
|
583
|
+
* @returns relative exchange fee in decimals
|
|
584
|
+
*/
|
|
585
|
+
static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
|
|
586
|
+
return (0, d8XMath_1.pmExchangeFee)(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
|
|
587
|
+
}
|
|
604
588
|
/**
|
|
605
589
|
* Estimates what the position risk will be if given amount of collateral is added/removed from the account.
|
|
606
590
|
* @param {number} deltaCollateral Amount of collateral to add or remove (signed)
|
|
@@ -630,11 +614,17 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
630
614
|
throw new Error("not enough margin to remove");
|
|
631
615
|
}
|
|
632
616
|
if (indexPriceInfo == undefined) {
|
|
633
|
-
|
|
634
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
617
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
|
|
635
618
|
}
|
|
636
619
|
let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
|
|
637
|
-
let
|
|
620
|
+
let Sm; //mark price
|
|
621
|
+
if (this.isPredictionMarket(account.symbol)) {
|
|
622
|
+
Sm = indexPriceInfo.ema + perpetualState.markPremium;
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
|
|
626
|
+
}
|
|
627
|
+
let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
|
|
638
628
|
// no position: just increase collateral and kill liquidation vars
|
|
639
629
|
if (account.positionNotionalBaseCCY == 0) {
|
|
640
630
|
return {
|
|
@@ -674,7 +664,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
674
664
|
}
|
|
675
665
|
let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
676
666
|
// Liquidation params
|
|
677
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
667
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
678
668
|
// New position risk
|
|
679
669
|
let newPositionRisk = {
|
|
680
670
|
symbol: account.symbol,
|
|
@@ -693,35 +683,39 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
693
683
|
return newPositionRisk;
|
|
694
684
|
}
|
|
695
685
|
/**
|
|
696
|
-
* Calculates liquidation prices for a
|
|
686
|
+
* Calculates liquidation prices for a position
|
|
687
|
+
* constructed in positionRiskOnTrade/positionRiskOnCollateralAction
|
|
697
688
|
* @param symbol Perpetual symbol
|
|
698
689
|
* @param lockedInQC Locked in value
|
|
699
690
|
* @param signedPositionBC Signed position size
|
|
700
|
-
* @param marginCashCC
|
|
691
|
+
* @param marginCashCC Available cash in margin account (includes unpaid funding)
|
|
701
692
|
* @param markPrice Mark price
|
|
702
|
-
* @param collToQuoteConversion Collateral index price
|
|
693
|
+
* @param collToQuoteConversion Collateral index price (S3)
|
|
694
|
+
* @param S2 index price
|
|
703
695
|
* @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
|
|
704
696
|
* @returns [Base index price, Collateral index price, Maintenance margin rate]
|
|
705
697
|
* @ignore
|
|
706
698
|
*/
|
|
707
|
-
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
|
|
699
|
+
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
|
|
708
700
|
let S2Liq, S3Liq;
|
|
709
|
-
|
|
710
|
-
let
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
701
|
+
const staticInfo = symbolToPerpStaticInfo.get(symbol);
|
|
702
|
+
let tau = staticInfo.maintenanceMarginRate;
|
|
703
|
+
let ccyType = staticInfo.collateralCurrencyType;
|
|
704
|
+
const isPred = MarketData.isPredictionMarketStatic(staticInfo);
|
|
705
|
+
const idx_availableCashCC = 2;
|
|
706
|
+
const idx_cash = 3;
|
|
707
|
+
const idx_notional = 4;
|
|
708
|
+
const idx_locked_in = 5;
|
|
709
|
+
const idx_mark_price = 8;
|
|
710
|
+
const idx_s3 = 9;
|
|
711
|
+
let traderState = new Array(10);
|
|
712
|
+
traderState[idx_availableCashCC] = (0, d8XMath_1.floatToABK64x64)(marginCashCC);
|
|
713
|
+
traderState[idx_cash] = traderState[idx_availableCashCC];
|
|
714
|
+
traderState[idx_notional] = (0, d8XMath_1.floatToABK64x64)(signedPositionBC);
|
|
715
|
+
traderState[idx_locked_in] = (0, d8XMath_1.floatToABK64x64)(lockedInQC);
|
|
716
|
+
traderState[idx_mark_price] = (0, d8XMath_1.floatToABK64x64)(markPrice);
|
|
717
|
+
traderState[idx_s3] = (0, d8XMath_1.floatToABK64x64)(collToQuoteConversion);
|
|
718
|
+
[S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
|
|
725
719
|
return [S2Liq, S3Liq, tau];
|
|
726
720
|
}
|
|
727
721
|
/**
|
|
@@ -889,22 +883,28 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
889
883
|
if (!this.proxyContract || !this.multicall) {
|
|
890
884
|
throw new Error("proxy contract not initialized");
|
|
891
885
|
}
|
|
886
|
+
if (this.isPredictionMarket(symbol)) {
|
|
887
|
+
// prediction markets
|
|
888
|
+
return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
889
|
+
}
|
|
890
|
+
// regular markets
|
|
891
|
+
return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
892
|
+
}
|
|
893
|
+
async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
894
|
+
if (!this.proxyContract || !this.multicall) {
|
|
895
|
+
throw new Error("proxy contract not initialized");
|
|
896
|
+
}
|
|
897
|
+
const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
|
|
892
898
|
const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
893
|
-
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
894
899
|
const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
|
|
895
|
-
const
|
|
896
|
-
const
|
|
897
|
-
const indexPriceInfo = await this.priceFeedGetter
|
|
898
|
-
.fetchPricesForPerpetual(symbol)
|
|
899
|
-
.then((obj) => [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]]);
|
|
900
|
-
const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
901
|
-
let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
|
|
900
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
901
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
902
902
|
const proxyCalls = [
|
|
903
903
|
// 0: traderState
|
|
904
904
|
{
|
|
905
905
|
target: this.proxyContract.target,
|
|
906
906
|
allowFailure: false,
|
|
907
|
-
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr,
|
|
907
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
908
908
|
},
|
|
909
909
|
// 1: wallet balance
|
|
910
910
|
{
|
|
@@ -912,31 +912,53 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
912
912
|
allowFailure: false,
|
|
913
913
|
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
914
914
|
},
|
|
915
|
-
// 2:
|
|
915
|
+
// 2: amm state
|
|
916
916
|
{
|
|
917
917
|
target: this.proxyContract.target,
|
|
918
918
|
allowFailure: false,
|
|
919
|
-
callData: this.proxyContract.interface.encodeFunctionData("
|
|
920
|
-
poolId,
|
|
921
|
-
traderAddr,
|
|
922
|
-
constants_1.ZERO_ADDRESS,
|
|
923
|
-
]),
|
|
919
|
+
callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
|
|
924
920
|
},
|
|
925
921
|
];
|
|
926
922
|
// multicall
|
|
927
923
|
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
928
|
-
// position risk
|
|
929
|
-
const idxNotional = 4;
|
|
930
924
|
const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
931
|
-
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, [
|
|
932
|
-
indexPriceInfo[0],
|
|
933
|
-
indexPriceInfo[1],
|
|
934
|
-
]);
|
|
935
|
-
// fee rate
|
|
936
|
-
const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
937
|
-
const feeRate = 1e-5 * Number(feeRateTbps);
|
|
938
|
-
// Max based on margin requirements:
|
|
939
925
|
const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
926
|
+
const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
|
|
927
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
|
|
928
|
+
);
|
|
929
|
+
const openInterestBC = (0, d8XMath_1.ABK64x64ToFloat)(ammState[11]);
|
|
930
|
+
const net = -(0, d8XMath_1.ABK64x64ToFloat)(ammState[1]);
|
|
931
|
+
let totLong, totShort;
|
|
932
|
+
if (net < 0) {
|
|
933
|
+
totLong = openInterestBC;
|
|
934
|
+
totShort = openInterestBC - Math.abs(net);
|
|
935
|
+
}
|
|
936
|
+
else {
|
|
937
|
+
totLong = openInterestBC - net;
|
|
938
|
+
totShort = openInterestBC;
|
|
939
|
+
}
|
|
940
|
+
let currentPositionBC = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
941
|
+
const Sm = (0, d8XMath_1.ABK64x64ToFloat)(traderState[8]);
|
|
942
|
+
// settlement token must be equal to collateral token for walletBalance to be correct
|
|
943
|
+
const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
|
|
944
|
+
const idxNotional = 4;
|
|
945
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
946
|
+
const maxShort = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
947
|
+
const maxLong = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
948
|
+
return { buy: maxLong, sell: maxShort };
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Returns the maximal allowed short pos and long pos (signed) for a trader
|
|
952
|
+
* with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
|
|
953
|
+
* @param perpId
|
|
954
|
+
* @param currentTraderPos ABDK64x64 notional position of trader
|
|
955
|
+
* @param overrides
|
|
956
|
+
* @returns [maxShortPos, maxLongPos] signed maximal position sizes
|
|
957
|
+
*/
|
|
958
|
+
async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
|
|
959
|
+
if (!this.proxyContract || !this.multicall) {
|
|
960
|
+
throw new Error("proxy contract not initialized");
|
|
961
|
+
}
|
|
940
962
|
const proxyCalls2 = [
|
|
941
963
|
// 0: max long
|
|
942
964
|
{
|
|
@@ -944,7 +966,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
944
966
|
allowFailure: false,
|
|
945
967
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
946
968
|
perpId,
|
|
947
|
-
|
|
969
|
+
currentTraderPos,
|
|
948
970
|
true,
|
|
949
971
|
]),
|
|
950
972
|
},
|
|
@@ -954,7 +976,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
954
976
|
allowFailure: false,
|
|
955
977
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
956
978
|
perpId,
|
|
957
|
-
|
|
979
|
+
currentTraderPos,
|
|
958
980
|
false,
|
|
959
981
|
]),
|
|
960
982
|
},
|
|
@@ -964,15 +986,66 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
964
986
|
// Max based on perp:
|
|
965
987
|
// max buy
|
|
966
988
|
const maxLongOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[0].returnData)[0]);
|
|
967
|
-
const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(
|
|
989
|
+
const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
|
|
968
990
|
// max short
|
|
969
991
|
const maxShortOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[1].returnData)[0]);
|
|
970
|
-
const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(
|
|
992
|
+
const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
|
|
993
|
+
return [maxShortPosPerp, maxLongPosPerp];
|
|
994
|
+
}
|
|
995
|
+
async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
996
|
+
const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
997
|
+
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
998
|
+
const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
|
|
999
|
+
const perpInfo = this.getPerpetualStaticInfo(symbol);
|
|
1000
|
+
const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
|
|
1001
|
+
const isPredMkt = false;
|
|
1002
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1003
|
+
let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
|
|
1004
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
1005
|
+
if (!this.proxyContract || !this.multicall) {
|
|
1006
|
+
throw new Error("proxy contract not initialized");
|
|
1007
|
+
}
|
|
1008
|
+
const proxyCalls = [
|
|
1009
|
+
// 0: traderState
|
|
1010
|
+
{
|
|
1011
|
+
target: this.proxyContract.target,
|
|
1012
|
+
allowFailure: false,
|
|
1013
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
1014
|
+
},
|
|
1015
|
+
// 1: wallet balance
|
|
1016
|
+
{
|
|
1017
|
+
target: poolInfo.poolSettleTokenAddr,
|
|
1018
|
+
allowFailure: false,
|
|
1019
|
+
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
1020
|
+
},
|
|
1021
|
+
// 2: exchange fee
|
|
1022
|
+
{
|
|
1023
|
+
target: this.proxyContract.target,
|
|
1024
|
+
allowFailure: false,
|
|
1025
|
+
callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
|
|
1026
|
+
poolId,
|
|
1027
|
+
traderAddr,
|
|
1028
|
+
constants_1.ZERO_ADDRESS,
|
|
1029
|
+
]),
|
|
1030
|
+
},
|
|
1031
|
+
];
|
|
1032
|
+
// multicall
|
|
1033
|
+
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
1034
|
+
// position risk
|
|
1035
|
+
const idxNotional = 4;
|
|
1036
|
+
const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
1037
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
|
|
1038
|
+
// fee rate
|
|
1039
|
+
const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
1040
|
+
const feeRate = 1e-5 * Number(feeRateTbps);
|
|
1041
|
+
// Max based on margin requirements:
|
|
1042
|
+
const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
1043
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
971
1044
|
const curPos = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
972
1045
|
const px = await coll2SettlePromise;
|
|
973
1046
|
const walletBalanceInMgnToken = walletBalance / px;
|
|
974
|
-
const maxLongPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo
|
|
975
|
-
const maxShortPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo
|
|
1047
|
+
const maxLongPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
|
|
1048
|
+
const maxShortPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
|
|
976
1049
|
// max long/short all accounted for
|
|
977
1050
|
const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
|
|
978
1051
|
const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
|
|
@@ -1105,6 +1178,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1105
1178
|
/**
|
|
1106
1179
|
* Get the current mark price
|
|
1107
1180
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1181
|
+
* @param indexPrices optional. IdxPriceInfo
|
|
1108
1182
|
* @example
|
|
1109
1183
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1110
1184
|
* async function main() {
|
|
@@ -1126,15 +1200,15 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1126
1200
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1127
1201
|
}
|
|
1128
1202
|
if (indexPrices == undefined) {
|
|
1129
|
-
|
|
1130
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1203
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1131
1204
|
}
|
|
1132
|
-
return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
|
|
1205
|
+
return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
|
|
1133
1206
|
}
|
|
1134
1207
|
/**
|
|
1135
1208
|
* get the current price for a given quantity
|
|
1136
1209
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1137
1210
|
* @param quantity quantity to be traded, negative if short
|
|
1211
|
+
* @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
|
|
1138
1212
|
* @example
|
|
1139
1213
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1140
1214
|
* async function main() {
|
|
@@ -1151,16 +1225,18 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1151
1225
|
*
|
|
1152
1226
|
* @returns {number} price
|
|
1153
1227
|
*/
|
|
1154
|
-
async getPerpetualPrice(symbol, quantity,
|
|
1228
|
+
async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
|
|
1155
1229
|
if (this.proxyContract == null) {
|
|
1156
1230
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1157
1231
|
}
|
|
1158
|
-
if (
|
|
1232
|
+
if (priceInfo == undefined) {
|
|
1159
1233
|
// fetch from API
|
|
1160
|
-
|
|
1161
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1234
|
+
priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1162
1235
|
}
|
|
1163
|
-
return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract,
|
|
1236
|
+
return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3], //s2,s3
|
|
1237
|
+
priceInfo.conf, //conf
|
|
1238
|
+
priceInfo.predMktCLOBParams, //params
|
|
1239
|
+
overrides);
|
|
1164
1240
|
}
|
|
1165
1241
|
/**
|
|
1166
1242
|
* Query recent perpetual state from blockchain
|
|
@@ -1172,8 +1248,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1172
1248
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1173
1249
|
}
|
|
1174
1250
|
if (indexPriceInfo == undefined) {
|
|
1175
|
-
|
|
1176
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
1251
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1177
1252
|
}
|
|
1178
1253
|
let state = await perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
|
|
1179
1254
|
return state;
|
|
@@ -1369,7 +1444,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1369
1444
|
* Result is in collateral currency
|
|
1370
1445
|
* @param {string} traderAddr address of the trader
|
|
1371
1446
|
* @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
|
|
1372
|
-
* @param indexPrices optional
|
|
1447
|
+
* @param indexPrices optional indexPriceInfo
|
|
1373
1448
|
* @returns available margin in collateral currency
|
|
1374
1449
|
* @example
|
|
1375
1450
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
@@ -1391,11 +1466,10 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1391
1466
|
}
|
|
1392
1467
|
if (indexPrices == undefined) {
|
|
1393
1468
|
// fetch from API
|
|
1394
|
-
|
|
1395
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1469
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1396
1470
|
}
|
|
1397
1471
|
let perpID = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
1398
|
-
let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map((x) => (0, d8XMath_1.floatToABK64x64)(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
|
|
1472
|
+
let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, [indexPrices.s2, indexPrices.s3].map((x) => (0, d8XMath_1.floatToABK64x64)(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
|
|
1399
1473
|
const idx_availableMargin = 1;
|
|
1400
1474
|
let mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
|
|
1401
1475
|
return mgn;
|
|
@@ -1662,7 +1736,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1662
1736
|
quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perp.S2QuoteCCY, _symbolList),
|
|
1663
1737
|
indexPrice: 0,
|
|
1664
1738
|
collToQuoteIndexPrice: 0,
|
|
1665
|
-
|
|
1739
|
+
markPremium: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
|
|
1666
1740
|
midPrice: 0,
|
|
1667
1741
|
currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perp.fCurrentFundingRate),
|
|
1668
1742
|
openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perp.fOpenInterest),
|
|
@@ -1711,7 +1785,6 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1711
1785
|
perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
|
|
1712
1786
|
}
|
|
1713
1787
|
perp.indexPrice = idxPriceS2Pair[0];
|
|
1714
|
-
perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
|
|
1715
1788
|
let indexS3 = 1;
|
|
1716
1789
|
if (info.collateralCurrencyType == constants_1.COLLATERAL_CURRENCY_BASE) {
|
|
1717
1790
|
indexS3 = idxPriceS2Pair[0];
|