@d8x/perpetuals-sdk 2.0.13-alpha → 2.1.1-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 +154 -4
- package/dist/cjs/abi/OracleFactory.json +94 -25
- package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
- package/dist/cjs/accountTrade.d.ts +3 -3
- package/dist/cjs/accountTrade.js +1 -1
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.d.ts +5 -1
- package/dist/cjs/brokerTool.js +20 -7
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/defaultConfig.json +0 -12
- package/dist/cjs/config/priceFeedConfig.json +1 -19
- package/dist/cjs/constants.d.ts +0 -1
- package/dist/cjs/constants.js +2 -3
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/contracts/IPerpetualManager.d.ts +93 -13
- 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 +118 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +154 -4
- 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 +59 -1
- package/dist/cjs/d8XMath.js +259 -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 +45 -23
- package/dist/cjs/marketData.js +292 -197
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +24 -1
- 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 +28 -17
- package/dist/cjs/perpetualDataHandler.js +71 -45
- 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 +5 -3
- package/dist/cjs/polyMktsPxFeed.js +34 -2
- 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/cjs/writeAccessHandler.js +1 -1
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/abi/IPerpetualManager.json +154 -4
- package/dist/esm/abi/OracleFactory.json +94 -25
- package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
- package/dist/esm/accountTrade.d.ts +3 -3
- package/dist/esm/accountTrade.js +1 -1
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.d.ts +5 -1
- package/dist/esm/brokerTool.js +21 -8
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/defaultConfig.json +0 -12
- package/dist/esm/config/priceFeedConfig.json +1 -19
- package/dist/esm/constants.d.ts +0 -1
- package/dist/esm/constants.js +1 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/contracts/IPerpetualManager.d.ts +93 -13
- 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 +118 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +154 -4
- 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 +59 -1
- package/dist/esm/d8XMath.js +251 -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 +45 -23
- package/dist/esm/marketData.js +295 -200
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +24 -1
- 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 +28 -17
- package/dist/esm/perpetualDataHandler.js +74 -48
- 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 +5 -3
- package/dist/esm/polyMktsPxFeed.js +34 -2
- 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/dist/esm/writeAccessHandler.js +3 -3
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/doc/brokerTool.md +3 -1
- package/doc/d8x-perpetuals-sdk.md +804 -132
- package/doc/marketData.md +813 -0
- package/doc/perpetualDataHandler.md +76 -7
- package/package.json +1 -1
- package/src/abi/IPerpetualManager.json +154 -4
- package/src/abi/OracleFactory.json +523 -454
- package/src/abi/PerpetualManagerProxy.json +1596 -1386
- package/src/accountTrade.ts +3 -3
- package/src/brokerTool.ts +22 -8
- package/src/config/defaultConfig.json +0 -13
- package/src/config/priceFeedConfig.json +1 -19
- package/src/constants.ts +1 -2
- package/src/contracts/IPerpetualManager.ts +140 -10
- package/src/contracts/OracleFactory.ts +100 -26
- package/src/contracts/PerpetualManagerProxy.ts +192 -3
- package/src/contracts/factories/IPerpetualManager__factory.ts +154 -4
- package/src/contracts/factories/OracleFactory__factory.ts +94 -25
- package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
- package/src/d8XMath.ts +327 -2
- package/src/liquidatorTool.ts +29 -14
- package/src/marketData.ts +448 -250
- package/src/nodeSDKTypes.ts +30 -1
- package/src/orderExecutorTool.ts +48 -20
- package/src/perpetualDataHandler.ts +108 -55
- package/src/perpetualEventHandler.ts +6 -7
- package/src/polyMktsPxFeed.ts +40 -4
- package/src/priceFeeds.ts +41 -17
- package/src/version.ts +1 -1
- package/src/writeAccessHandler.ts +2 -2
- 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/src/abi-zkevm/IPerpetualManager.json +0 -5366
package/dist/cjs/marketData.js
CHANGED
|
@@ -52,7 +52,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
52
52
|
const mktData = providerOrMarketData;
|
|
53
53
|
this.nodeURL = mktData.config.nodeURL;
|
|
54
54
|
this.provider = new ethers_1.JsonRpcProvider(mktData.config.nodeURL, mktData.network, { staticNetwork: true });
|
|
55
|
-
this.proxyContract =
|
|
55
|
+
this.proxyContract = contracts_1.IPerpetualManager__factory.connect(mktData.getProxyAddress(), this.provider);
|
|
56
56
|
this.multicall = contracts_1.Multicall3__factory.connect(this.config.multicall ?? constants_1.MULTICALL_ADDRESS, this.provider);
|
|
57
57
|
({
|
|
58
58
|
nestedPerpetualIDs: this.nestedPerpetualIDs,
|
|
@@ -106,7 +106,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
106
106
|
* }
|
|
107
107
|
* main();
|
|
108
108
|
*
|
|
109
|
-
* @returns
|
|
109
|
+
* @returns read-only proxy instance
|
|
110
110
|
*/
|
|
111
111
|
getReadOnlyProxyInstance() {
|
|
112
112
|
if (this.proxyContract == null) {
|
|
@@ -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 ?? 0, 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), [(0, d8XMath_1.floatToABK64x64)(indexPriceInfo.s2), (0, d8XMath_1.floatToABK64x64)(indexPriceInfo.s3 ?? 0)], 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
|
}
|
|
@@ -572,13 +544,23 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
572
544
|
let newMarginCashCC = currentMarginCashCC + deltaCashCC + traderDepositCC;
|
|
573
545
|
let newEntryPrice = newPositionBC == 0 ? 0 : Math.abs(newLockedInValueQC / newPositionBC);
|
|
574
546
|
let newMarginBalanceCC = newMarginCashCC + (newPositionBC * Sm - newLockedInValueQC) / S3;
|
|
575
|
-
let newLeverage
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
547
|
+
let newLeverage;
|
|
548
|
+
if (newPositionBC === 0) {
|
|
549
|
+
newLeverage = 0;
|
|
550
|
+
}
|
|
551
|
+
else if (newMarginBalanceCC <= 0) {
|
|
552
|
+
newLeverage = Infinity;
|
|
553
|
+
}
|
|
554
|
+
else {
|
|
555
|
+
let p = Sm;
|
|
556
|
+
if (isPredMkt) {
|
|
557
|
+
p -= 1;
|
|
558
|
+
p = newPositionBC > 0 ? p : 1 - p;
|
|
559
|
+
}
|
|
560
|
+
newLeverage = Math.abs(newPositionBC * p) / S3 / newMarginBalanceCC;
|
|
561
|
+
}
|
|
580
562
|
// Liquidation params
|
|
581
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
563
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
582
564
|
// New position risk
|
|
583
565
|
let newPositionRisk = {
|
|
584
566
|
symbol: account.symbol,
|
|
@@ -601,6 +583,18 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
601
583
|
maxShortTrade: maxShortTrade,
|
|
602
584
|
};
|
|
603
585
|
}
|
|
586
|
+
/**
|
|
587
|
+
* Fee is relative to base-currency amount (=trade amount)
|
|
588
|
+
* @param state current perpetual state (need longBC and shortBC)
|
|
589
|
+
* @param maxMaintMgnRate maintenance margin rate param for pred mkts
|
|
590
|
+
* @param Sm Mark price
|
|
591
|
+
* @param tradeAmtBC signed trade amount
|
|
592
|
+
* @param tradeMgnRate margin rate param from perpetual
|
|
593
|
+
* @returns relative exchange fee in decimals
|
|
594
|
+
*/
|
|
595
|
+
static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
|
|
596
|
+
return (0, d8XMath_1.pmExchangeFee)(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
|
|
597
|
+
}
|
|
604
598
|
/**
|
|
605
599
|
* Estimates what the position risk will be if given amount of collateral is added/removed from the account.
|
|
606
600
|
* @param {number} deltaCollateral Amount of collateral to add or remove (signed)
|
|
@@ -630,11 +624,17 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
630
624
|
throw new Error("not enough margin to remove");
|
|
631
625
|
}
|
|
632
626
|
if (indexPriceInfo == undefined) {
|
|
633
|
-
|
|
634
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
627
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
|
|
635
628
|
}
|
|
636
629
|
let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
|
|
637
|
-
let
|
|
630
|
+
let Sm; //mark price
|
|
631
|
+
if (this.isPredictionMarket(account.symbol)) {
|
|
632
|
+
Sm = indexPriceInfo.ema + perpetualState.markPremium;
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
|
|
636
|
+
}
|
|
637
|
+
let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
|
|
638
638
|
// no position: just increase collateral and kill liquidation vars
|
|
639
639
|
if (account.positionNotionalBaseCCY == 0) {
|
|
640
640
|
return {
|
|
@@ -674,7 +674,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
674
674
|
}
|
|
675
675
|
let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
676
676
|
// Liquidation params
|
|
677
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
677
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
678
678
|
// New position risk
|
|
679
679
|
let newPositionRisk = {
|
|
680
680
|
symbol: account.symbol,
|
|
@@ -693,35 +693,39 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
693
693
|
return newPositionRisk;
|
|
694
694
|
}
|
|
695
695
|
/**
|
|
696
|
-
* Calculates liquidation prices for a
|
|
696
|
+
* Calculates liquidation prices for a position
|
|
697
|
+
* constructed in positionRiskOnTrade/positionRiskOnCollateralAction
|
|
697
698
|
* @param symbol Perpetual symbol
|
|
698
699
|
* @param lockedInQC Locked in value
|
|
699
700
|
* @param signedPositionBC Signed position size
|
|
700
|
-
* @param marginCashCC
|
|
701
|
+
* @param marginCashCC Available cash in margin account (includes unpaid funding)
|
|
701
702
|
* @param markPrice Mark price
|
|
702
|
-
* @param collToQuoteConversion Collateral index price
|
|
703
|
+
* @param collToQuoteConversion Collateral index price (S3)
|
|
704
|
+
* @param S2 index price
|
|
703
705
|
* @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
|
|
704
706
|
* @returns [Base index price, Collateral index price, Maintenance margin rate]
|
|
705
707
|
* @ignore
|
|
706
708
|
*/
|
|
707
|
-
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
|
|
709
|
+
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
|
|
708
710
|
let S2Liq, S3Liq;
|
|
709
|
-
|
|
710
|
-
let
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
711
|
+
const staticInfo = symbolToPerpStaticInfo.get(symbol);
|
|
712
|
+
let tau = staticInfo.maintenanceMarginRate;
|
|
713
|
+
let ccyType = staticInfo.collateralCurrencyType;
|
|
714
|
+
const isPred = MarketData.isPredictionMarketStatic(staticInfo);
|
|
715
|
+
const idx_availableCashCC = 2;
|
|
716
|
+
const idx_cash = 3;
|
|
717
|
+
const idx_notional = 4;
|
|
718
|
+
const idx_locked_in = 5;
|
|
719
|
+
const idx_mark_price = 8;
|
|
720
|
+
const idx_s3 = 9;
|
|
721
|
+
let traderState = new Array(10);
|
|
722
|
+
traderState[idx_availableCashCC] = (0, d8XMath_1.floatToABK64x64)(marginCashCC);
|
|
723
|
+
traderState[idx_cash] = traderState[idx_availableCashCC];
|
|
724
|
+
traderState[idx_notional] = (0, d8XMath_1.floatToABK64x64)(signedPositionBC);
|
|
725
|
+
traderState[idx_locked_in] = (0, d8XMath_1.floatToABK64x64)(lockedInQC);
|
|
726
|
+
traderState[idx_mark_price] = (0, d8XMath_1.floatToABK64x64)(markPrice);
|
|
727
|
+
traderState[idx_s3] = (0, d8XMath_1.floatToABK64x64)(collToQuoteConversion);
|
|
728
|
+
[S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
|
|
725
729
|
return [S2Liq, S3Liq, tau];
|
|
726
730
|
}
|
|
727
731
|
/**
|
|
@@ -889,22 +893,28 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
889
893
|
if (!this.proxyContract || !this.multicall) {
|
|
890
894
|
throw new Error("proxy contract not initialized");
|
|
891
895
|
}
|
|
896
|
+
if (this.isPredictionMarket(symbol)) {
|
|
897
|
+
// prediction markets
|
|
898
|
+
return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
899
|
+
}
|
|
900
|
+
// regular markets
|
|
901
|
+
return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
902
|
+
}
|
|
903
|
+
async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
904
|
+
if (!this.proxyContract || !this.multicall) {
|
|
905
|
+
throw new Error("proxy contract not initialized");
|
|
906
|
+
}
|
|
907
|
+
const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
|
|
892
908
|
const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
893
|
-
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
894
909
|
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);
|
|
910
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
911
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
902
912
|
const proxyCalls = [
|
|
903
913
|
// 0: traderState
|
|
904
914
|
{
|
|
905
915
|
target: this.proxyContract.target,
|
|
906
916
|
allowFailure: false,
|
|
907
|
-
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr,
|
|
917
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
908
918
|
},
|
|
909
919
|
// 1: wallet balance
|
|
910
920
|
{
|
|
@@ -912,31 +922,53 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
912
922
|
allowFailure: false,
|
|
913
923
|
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
914
924
|
},
|
|
915
|
-
// 2:
|
|
925
|
+
// 2: amm state
|
|
916
926
|
{
|
|
917
927
|
target: this.proxyContract.target,
|
|
918
928
|
allowFailure: false,
|
|
919
|
-
callData: this.proxyContract.interface.encodeFunctionData("
|
|
920
|
-
poolId,
|
|
921
|
-
traderAddr,
|
|
922
|
-
constants_1.ZERO_ADDRESS,
|
|
923
|
-
]),
|
|
929
|
+
callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
|
|
924
930
|
},
|
|
925
931
|
];
|
|
926
932
|
// multicall
|
|
927
933
|
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
928
|
-
// position risk
|
|
929
|
-
const idxNotional = 4;
|
|
930
934
|
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
935
|
const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
936
|
+
const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
|
|
937
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
|
|
938
|
+
);
|
|
939
|
+
const openInterestBC = (0, d8XMath_1.ABK64x64ToFloat)(ammState[11]);
|
|
940
|
+
const net = -(0, d8XMath_1.ABK64x64ToFloat)(ammState[1]);
|
|
941
|
+
let totLong, totShort;
|
|
942
|
+
if (net < 0) {
|
|
943
|
+
totLong = openInterestBC;
|
|
944
|
+
totShort = openInterestBC - Math.abs(net);
|
|
945
|
+
}
|
|
946
|
+
else {
|
|
947
|
+
totLong = openInterestBC - net;
|
|
948
|
+
totShort = openInterestBC;
|
|
949
|
+
}
|
|
950
|
+
let currentPositionBC = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
951
|
+
const Sm = (0, d8XMath_1.ABK64x64ToFloat)(traderState[8]);
|
|
952
|
+
// settlement token must be equal to collateral token for walletBalance to be correct
|
|
953
|
+
const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
|
|
954
|
+
const idxNotional = 4;
|
|
955
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
956
|
+
const maxShort = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
957
|
+
const maxLong = (0, d8XMath_1.pmFindMaxTradeSize)(1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
958
|
+
return { buy: maxLong, sell: maxShort };
|
|
959
|
+
}
|
|
960
|
+
/**
|
|
961
|
+
* Returns the maximal allowed short pos and long pos (signed) for a trader
|
|
962
|
+
* with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
|
|
963
|
+
* @param perpId
|
|
964
|
+
* @param currentTraderPos ABDK64x64 notional position of trader
|
|
965
|
+
* @param overrides
|
|
966
|
+
* @returns [maxShortPos, maxLongPos] signed maximal position sizes
|
|
967
|
+
*/
|
|
968
|
+
async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
|
|
969
|
+
if (!this.proxyContract || !this.multicall) {
|
|
970
|
+
throw new Error("proxy contract not initialized");
|
|
971
|
+
}
|
|
940
972
|
const proxyCalls2 = [
|
|
941
973
|
// 0: max long
|
|
942
974
|
{
|
|
@@ -944,7 +976,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
944
976
|
allowFailure: false,
|
|
945
977
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
946
978
|
perpId,
|
|
947
|
-
|
|
979
|
+
currentTraderPos,
|
|
948
980
|
true,
|
|
949
981
|
]),
|
|
950
982
|
},
|
|
@@ -954,7 +986,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
954
986
|
allowFailure: false,
|
|
955
987
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
956
988
|
perpId,
|
|
957
|
-
|
|
989
|
+
currentTraderPos,
|
|
958
990
|
false,
|
|
959
991
|
]),
|
|
960
992
|
},
|
|
@@ -964,15 +996,66 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
964
996
|
// Max based on perp:
|
|
965
997
|
// max buy
|
|
966
998
|
const maxLongOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[0].returnData)[0]);
|
|
967
|
-
const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(
|
|
999
|
+
const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
|
|
968
1000
|
// max short
|
|
969
1001
|
const maxShortOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[1].returnData)[0]);
|
|
970
|
-
const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(
|
|
1002
|
+
const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
|
|
1003
|
+
return [maxShortPosPerp, maxLongPosPerp];
|
|
1004
|
+
}
|
|
1005
|
+
async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
1006
|
+
const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
1007
|
+
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
1008
|
+
const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
|
|
1009
|
+
const perpInfo = this.getPerpetualStaticInfo(symbol);
|
|
1010
|
+
const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
|
|
1011
|
+
const isPredMkt = false;
|
|
1012
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1013
|
+
let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
|
|
1014
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
|
|
1015
|
+
if (!this.proxyContract || !this.multicall) {
|
|
1016
|
+
throw new Error("proxy contract not initialized");
|
|
1017
|
+
}
|
|
1018
|
+
const proxyCalls = [
|
|
1019
|
+
// 0: traderState
|
|
1020
|
+
{
|
|
1021
|
+
target: this.proxyContract.target,
|
|
1022
|
+
allowFailure: false,
|
|
1023
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
1024
|
+
},
|
|
1025
|
+
// 1: wallet balance
|
|
1026
|
+
{
|
|
1027
|
+
target: poolInfo.poolSettleTokenAddr,
|
|
1028
|
+
allowFailure: false,
|
|
1029
|
+
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
1030
|
+
},
|
|
1031
|
+
// 2: exchange fee
|
|
1032
|
+
{
|
|
1033
|
+
target: this.proxyContract.target,
|
|
1034
|
+
allowFailure: false,
|
|
1035
|
+
callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
|
|
1036
|
+
poolId,
|
|
1037
|
+
traderAddr,
|
|
1038
|
+
constants_1.ZERO_ADDRESS,
|
|
1039
|
+
]),
|
|
1040
|
+
},
|
|
1041
|
+
];
|
|
1042
|
+
// multicall
|
|
1043
|
+
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
1044
|
+
// position risk
|
|
1045
|
+
const idxNotional = 4;
|
|
1046
|
+
const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
1047
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
|
|
1048
|
+
// fee rate
|
|
1049
|
+
const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
1050
|
+
const feeRate = 1e-5 * Number(feeRateTbps);
|
|
1051
|
+
// Max based on margin requirements:
|
|
1052
|
+
const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
1053
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
971
1054
|
const curPos = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
972
1055
|
const px = await coll2SettlePromise;
|
|
973
1056
|
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
|
|
1057
|
+
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);
|
|
1058
|
+
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
1059
|
// max long/short all accounted for
|
|
977
1060
|
const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
|
|
978
1061
|
const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
|
|
@@ -1035,8 +1118,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1035
1118
|
if (!this.proxyContract) {
|
|
1036
1119
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1037
1120
|
}
|
|
1038
|
-
|
|
1039
|
-
return px == undefined ? undefined : (0, d8XMath_1.ABK64x64ToFloat)(px);
|
|
1121
|
+
return await this.proxyContract.getOraclePrice([(0, utils_1.toBytes4)(base), (0, utils_1.toBytes4)(quote)], overrides || {});
|
|
1040
1122
|
}
|
|
1041
1123
|
/**
|
|
1042
1124
|
* Get the status of an order given a symbol and order Id
|
|
@@ -1105,6 +1187,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1105
1187
|
/**
|
|
1106
1188
|
* Get the current mark price
|
|
1107
1189
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1190
|
+
* @param indexPrices optional. IdxPriceInfo
|
|
1108
1191
|
* @example
|
|
1109
1192
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1110
1193
|
* async function main() {
|
|
@@ -1126,15 +1209,15 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1126
1209
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1127
1210
|
}
|
|
1128
1211
|
if (indexPrices == undefined) {
|
|
1129
|
-
|
|
1130
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1212
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1131
1213
|
}
|
|
1132
|
-
return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
|
|
1214
|
+
return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
|
|
1133
1215
|
}
|
|
1134
1216
|
/**
|
|
1135
1217
|
* get the current price for a given quantity
|
|
1136
1218
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1137
1219
|
* @param quantity quantity to be traded, negative if short
|
|
1220
|
+
* @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
|
|
1138
1221
|
* @example
|
|
1139
1222
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1140
1223
|
* async function main() {
|
|
@@ -1151,16 +1234,18 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1151
1234
|
*
|
|
1152
1235
|
* @returns {number} price
|
|
1153
1236
|
*/
|
|
1154
|
-
async getPerpetualPrice(symbol, quantity,
|
|
1237
|
+
async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
|
|
1155
1238
|
if (this.proxyContract == null) {
|
|
1156
1239
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1157
1240
|
}
|
|
1158
|
-
if (
|
|
1241
|
+
if (priceInfo == undefined) {
|
|
1159
1242
|
// fetch from API
|
|
1160
|
-
|
|
1161
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1243
|
+
priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1162
1244
|
}
|
|
1163
|
-
return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract,
|
|
1245
|
+
return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3 ?? 0], //s2,s3
|
|
1246
|
+
priceInfo.conf, //conf
|
|
1247
|
+
priceInfo.predMktCLOBParams, //params
|
|
1248
|
+
overrides);
|
|
1164
1249
|
}
|
|
1165
1250
|
/**
|
|
1166
1251
|
* Query recent perpetual state from blockchain
|
|
@@ -1172,8 +1257,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1172
1257
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1173
1258
|
}
|
|
1174
1259
|
if (indexPriceInfo == undefined) {
|
|
1175
|
-
|
|
1176
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
1260
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1177
1261
|
}
|
|
1178
1262
|
let state = await perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
|
|
1179
1263
|
return state;
|
|
@@ -1369,7 +1453,7 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1369
1453
|
* Result is in collateral currency
|
|
1370
1454
|
* @param {string} traderAddr address of the trader
|
|
1371
1455
|
* @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
|
|
1372
|
-
* @param indexPrices optional
|
|
1456
|
+
* @param indexPrices optional indexPriceInfo
|
|
1373
1457
|
* @returns available margin in collateral currency
|
|
1374
1458
|
* @example
|
|
1375
1459
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
@@ -1391,11 +1475,10 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1391
1475
|
}
|
|
1392
1476
|
if (indexPrices == undefined) {
|
|
1393
1477
|
// fetch from API
|
|
1394
|
-
|
|
1395
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1478
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1396
1479
|
}
|
|
1397
1480
|
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 || {});
|
|
1481
|
+
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
1482
|
const idx_availableMargin = 1;
|
|
1400
1483
|
let mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
|
|
1401
1484
|
return mgn;
|
|
@@ -1662,7 +1745,8 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1662
1745
|
quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perp.S2QuoteCCY, _symbolList),
|
|
1663
1746
|
indexPrice: 0,
|
|
1664
1747
|
collToQuoteIndexPrice: 0,
|
|
1665
|
-
|
|
1748
|
+
markPremium: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
|
|
1749
|
+
markPrice: 0,
|
|
1666
1750
|
midPrice: 0,
|
|
1667
1751
|
currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perp.fCurrentFundingRate),
|
|
1668
1752
|
openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perp.fOpenInterest),
|
|
@@ -1711,7 +1795,6 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1711
1795
|
perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
|
|
1712
1796
|
}
|
|
1713
1797
|
perp.indexPrice = idxPriceS2Pair[0];
|
|
1714
|
-
perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
|
|
1715
1798
|
let indexS3 = 1;
|
|
1716
1799
|
if (info.collateralCurrencyType == constants_1.COLLATERAL_CURRENCY_BASE) {
|
|
1717
1800
|
indexS3 = idxPriceS2Pair[0];
|
|
@@ -1720,6 +1803,18 @@ class MarketData extends perpetualDataHandler_1.default {
|
|
|
1720
1803
|
indexS3 = idxPriceS3Pair[0];
|
|
1721
1804
|
}
|
|
1722
1805
|
perp.collToQuoteIndexPrice = indexS3;
|
|
1806
|
+
const emaKey = info.S2Symbol + ":ema";
|
|
1807
|
+
let markPrice;
|
|
1808
|
+
if (idxPriceMap.has(emaKey)) {
|
|
1809
|
+
let ema;
|
|
1810
|
+
let res = idxPriceMap.get(emaKey);
|
|
1811
|
+
ema = res[0];
|
|
1812
|
+
markPrice = ema + perp.markPremium;
|
|
1813
|
+
}
|
|
1814
|
+
else {
|
|
1815
|
+
markPrice = perp.indexPrice * (1 + perp.markPremium);
|
|
1816
|
+
}
|
|
1817
|
+
perp.markPrice = markPrice;
|
|
1723
1818
|
perp.midPrice = midPriceMap.get(symbol3s);
|
|
1724
1819
|
// which pool?
|
|
1725
1820
|
const poolId = info.poolId;
|