@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/esm/marketData.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Contract, formatUnits, Interface, JsonRpcProvider } from "ethers";
|
|
2
|
-
import { BUY_SIDE, CLOSED_SIDE, COLLATERAL_CURRENCY_BASE, COLLATERAL_CURRENCY_QUANTO,
|
|
3
|
-
import { ERC20__factory, Multicall3__factory, } from "./contracts";
|
|
4
|
-
import { ABK64x64ToFloat,
|
|
2
|
+
import { BUY_SIDE, CLOSED_SIDE, COLLATERAL_CURRENCY_BASE, COLLATERAL_CURRENCY_QUANTO, ERC20_ABI, MULTICALL_ADDRESS, ORDER_TYPE_MARKET, PERP_STATE_STR, SELL_SIDE, ZERO_ADDRESS, ZERO_ORDER_ID, } from "./constants";
|
|
3
|
+
import { ERC20__factory, IPerpetualManager__factory, Multicall3__factory, } from "./contracts";
|
|
4
|
+
import { ABK64x64ToFloat, dec18ToFloat, decNToFloat, floatToABK64x64, getDepositAmountForLvgTrade, getMaxSignedPositionSize, pmExchangeFee, pmFindMaxTradeSize, } from "./d8XMath";
|
|
5
5
|
import PerpetualDataHandler from "./perpetualDataHandler";
|
|
6
6
|
import { contractSymbolToSymbol, toBytes4 } from "./utils";
|
|
7
7
|
/**
|
|
@@ -47,7 +47,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
47
47
|
const mktData = providerOrMarketData;
|
|
48
48
|
this.nodeURL = mktData.config.nodeURL;
|
|
49
49
|
this.provider = new JsonRpcProvider(mktData.config.nodeURL, mktData.network, { staticNetwork: true });
|
|
50
|
-
this.proxyContract =
|
|
50
|
+
this.proxyContract = IPerpetualManager__factory.connect(mktData.getProxyAddress(), this.provider);
|
|
51
51
|
this.multicall = Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, this.provider);
|
|
52
52
|
({
|
|
53
53
|
nestedPerpetualIDs: this.nestedPerpetualIDs,
|
|
@@ -101,7 +101,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
101
101
|
* }
|
|
102
102
|
* main();
|
|
103
103
|
*
|
|
104
|
-
* @returns
|
|
104
|
+
* @returns read-only proxy instance
|
|
105
105
|
*/
|
|
106
106
|
getReadOnlyProxyInstance() {
|
|
107
107
|
if (this.proxyContract == null) {
|
|
@@ -281,7 +281,8 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
281
281
|
*/
|
|
282
282
|
async _positionRiskForTraderInPerpetual(traderAddr, symbol, provider, overrides) {
|
|
283
283
|
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
284
|
-
|
|
284
|
+
const isPred = this.isPredictionMarket(symbol);
|
|
285
|
+
let mgnAcct = await PerpetualDataHandler.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new Contract(this.proxyAddr, this.config.proxyABI, provider), obj, isPred, overrides);
|
|
285
286
|
return mgnAcct;
|
|
286
287
|
}
|
|
287
288
|
/**
|
|
@@ -293,122 +294,67 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
293
294
|
*/
|
|
294
295
|
async _positionRiskForTraderInPerpetuals(traderAddr, symbols, provider, overrides) {
|
|
295
296
|
const MAX_SYMBOLS_PER_CALL = 10;
|
|
296
|
-
const
|
|
297
|
+
const pxInfo = new Array();
|
|
297
298
|
for (let i = 0; i < symbols.length; i++) {
|
|
298
299
|
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbols[i]);
|
|
299
|
-
|
|
300
|
+
pxInfo.push(obj);
|
|
300
301
|
}
|
|
301
302
|
let mgnAcct = [];
|
|
302
303
|
let callSymbols = symbols.slice(0, MAX_SYMBOLS_PER_CALL);
|
|
303
|
-
let
|
|
304
|
+
let _px = pxInfo.slice(0, MAX_SYMBOLS_PER_CALL);
|
|
304
305
|
while (callSymbols.length > 0) {
|
|
305
|
-
|
|
306
|
+
const isPred = callSymbols.map((_sym) => this.isPredictionMarket(_sym));
|
|
307
|
+
let acc = await PerpetualDataHandler.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, provider), new Contract(this.proxyAddr, this.config.proxyABI, provider), _px, isPred, overrides);
|
|
306
308
|
mgnAcct = mgnAcct.concat(acc);
|
|
307
309
|
callSymbols = symbols.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
|
|
308
|
-
|
|
310
|
+
_px = pxInfo.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
|
|
309
311
|
}
|
|
310
312
|
return mgnAcct;
|
|
311
313
|
}
|
|
312
|
-
|
|
313
|
-
* Estimates what the position risk will be if a given order is executed.
|
|
314
|
-
* @param traderAddr Address of trader
|
|
315
|
-
* @param order Order to be submitted
|
|
316
|
-
* @param account Position risk before trade. Defaults to current position if not given.
|
|
317
|
-
* @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
|
|
318
|
-
* @returns Position risk after trade, including order cost and maximal trade sizes for position
|
|
319
|
-
* @example
|
|
320
|
-
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
321
|
-
* async function main() {
|
|
322
|
-
* console.log(MarketData);
|
|
323
|
-
* // setup
|
|
324
|
-
* const config = PerpetualDataHandler.readSDKConfig("cardona");
|
|
325
|
-
* const mktData = new MarketData(config);
|
|
326
|
-
* await mktData.createProxyInstance();
|
|
327
|
-
* const order: Order = {
|
|
328
|
-
* symbol: "MATIC-USD-MATIC",
|
|
329
|
-
* side: "BUY",
|
|
330
|
-
* type: "MARKET",
|
|
331
|
-
* quantity: 100,
|
|
332
|
-
* leverage: 2,
|
|
333
|
-
* executionTimestamp: Date.now()/1000,
|
|
334
|
-
* };
|
|
335
|
-
* // Get position risk conditional on this order being executed
|
|
336
|
-
* const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order);
|
|
337
|
-
* console.log(posRisk);
|
|
338
|
-
* }
|
|
339
|
-
* main();
|
|
340
|
-
*/
|
|
341
|
-
async positionRiskOnTrade(traderAddr, order, account, indexPriceInfo, overrides) {
|
|
314
|
+
async dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides) {
|
|
342
315
|
if (this.proxyContract == null || this.multicall == null) {
|
|
343
316
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
344
317
|
}
|
|
345
|
-
|
|
346
|
-
if (indexPriceInfo == undefined) {
|
|
347
|
-
let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
|
|
348
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
349
|
-
}
|
|
350
|
-
// override total fee
|
|
351
|
-
let tradingFeeTbps;
|
|
352
|
-
if (overrides) {
|
|
353
|
-
({ tradingFeeTbps, ...overrides } = overrides);
|
|
354
|
-
}
|
|
355
|
-
// signed trade amount
|
|
356
|
-
let tradeAmountBC = Math.abs(order.quantity) * (order.side == BUY_SIDE ? 1 : -1);
|
|
357
|
-
const accountGiven = account !== undefined;
|
|
318
|
+
const isPredMkt = this.isPredictionMarket(symbol);
|
|
358
319
|
// create all calls
|
|
359
|
-
const
|
|
360
|
-
const
|
|
361
|
-
const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => floatToABK64x64(x));
|
|
320
|
+
const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
321
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
|
|
362
322
|
const proxyCalls = [
|
|
363
323
|
// 0: traderState
|
|
364
324
|
{
|
|
365
325
|
target: this.proxyContract.target,
|
|
366
326
|
allowFailure: true,
|
|
367
|
-
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr,
|
|
368
|
-
},
|
|
369
|
-
// 1: ammState
|
|
370
|
-
{
|
|
371
|
-
target: this.proxyContract.target,
|
|
372
|
-
allowFailure: true,
|
|
373
|
-
callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, fS2S3]),
|
|
374
|
-
},
|
|
375
|
-
// 2: exchangeFee
|
|
376
|
-
{
|
|
377
|
-
target: this.proxyContract.target,
|
|
378
|
-
allowFailure: false,
|
|
379
|
-
callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
|
|
380
|
-
poolId,
|
|
381
|
-
traderAddr,
|
|
382
|
-
order.brokerAddr ?? ZERO_ADDRESS,
|
|
383
|
-
]),
|
|
327
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
384
328
|
},
|
|
385
|
-
//
|
|
329
|
+
// 1: perpetual price
|
|
386
330
|
{
|
|
387
331
|
target: this.proxyContract.target,
|
|
388
332
|
allowFailure: true,
|
|
389
333
|
callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
390
334
|
perpId,
|
|
391
335
|
floatToABK64x64(tradeAmountBC),
|
|
392
|
-
|
|
336
|
+
[fS2, fS3],
|
|
337
|
+
indexPriceInfo.conf,
|
|
338
|
+
indexPriceInfo.predMktCLOBParams,
|
|
393
339
|
]),
|
|
394
340
|
},
|
|
395
|
-
//
|
|
341
|
+
// 2: max long pos
|
|
396
342
|
{
|
|
397
343
|
target: this.proxyContract.target,
|
|
398
344
|
allowFailure: false,
|
|
399
345
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
400
346
|
perpId,
|
|
401
|
-
|
|
347
|
+
floatToABK64x64(signedPositionNotionalBaseCCY),
|
|
402
348
|
true,
|
|
403
349
|
]),
|
|
404
350
|
},
|
|
405
|
-
//
|
|
351
|
+
// 3: max short pos
|
|
406
352
|
{
|
|
407
353
|
target: this.proxyContract.target,
|
|
408
354
|
allowFailure: false,
|
|
409
355
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
410
356
|
perpId,
|
|
411
|
-
|
|
357
|
+
floatToABK64x64(signedPositionNotionalBaseCCY),
|
|
412
358
|
false,
|
|
413
359
|
]),
|
|
414
360
|
},
|
|
@@ -416,44 +362,84 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
416
362
|
// multicall
|
|
417
363
|
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, (overrides || {}));
|
|
418
364
|
// positionRisk to apply this trade on: if not given, defaults to the current trader's position
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
traderState = await this.proxyContract.getTraderState(perpId, traderAddr, fS2S3);
|
|
426
|
-
}
|
|
427
|
-
account = MarketData.buildMarginAccountFromState(order.symbol, traderState, this.symbolToPerpStaticInfo, [
|
|
428
|
-
indexPriceInfo[0],
|
|
429
|
-
indexPriceInfo[1],
|
|
430
|
-
]);
|
|
431
|
-
}
|
|
432
|
-
// perpetualState, for prices
|
|
433
|
-
let ammState;
|
|
434
|
-
if (encodedResults[1].success) {
|
|
435
|
-
ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[1].returnData)[0];
|
|
365
|
+
let traderState;
|
|
366
|
+
if (encodedResults[0].success) {
|
|
367
|
+
traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
436
368
|
}
|
|
437
369
|
else {
|
|
438
|
-
|
|
370
|
+
traderState = await this.proxyContract.getTraderState(perpId, traderAddr, [fEma, fS3]);
|
|
439
371
|
}
|
|
440
|
-
const
|
|
441
|
-
indexPriceInfo, this.symbolToPerpStaticInfo);
|
|
442
|
-
let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
|
|
443
|
-
// exchange fee based on this trader's address (volume, token holding, etc) and his broker address (if any)
|
|
444
|
-
const exchangeFeeTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
372
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
|
|
445
373
|
// amm price for this trade amount
|
|
446
374
|
let ammPrice;
|
|
447
375
|
{
|
|
448
376
|
let fPrice;
|
|
449
|
-
if (encodedResults[
|
|
450
|
-
fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[
|
|
377
|
+
if (encodedResults[1].success) {
|
|
378
|
+
fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[1].returnData)[0];
|
|
451
379
|
}
|
|
452
380
|
else {
|
|
453
|
-
fPrice = await this.proxyContract.queryPerpetualPrice(perpId, floatToABK64x64(tradeAmountBC),
|
|
381
|
+
fPrice = await this.proxyContract.queryPerpetualPrice(perpId, floatToABK64x64(tradeAmountBC), [floatToABK64x64(indexPriceInfo.s2), floatToABK64x64(indexPriceInfo.s3 ?? 0)], indexPriceInfo.conf, indexPriceInfo.predMktCLOBParams);
|
|
454
382
|
}
|
|
455
383
|
ammPrice = ABK64x64ToFloat(fPrice);
|
|
456
384
|
}
|
|
385
|
+
// max buy
|
|
386
|
+
const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[2].returnData)[0];
|
|
387
|
+
const maxLongTrade = Math.max(0, ABK64x64ToFloat(fMaxLong) - signedPositionNotionalBaseCCY);
|
|
388
|
+
// max sell
|
|
389
|
+
const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[3].returnData)[0];
|
|
390
|
+
const maxShortTrade = Math.max(0, Math.abs(ABK64x64ToFloat(fMaxShort)) - signedPositionNotionalBaseCCY);
|
|
391
|
+
return { account: account, ammPrice: ammPrice, maxShortTrade: maxShortTrade, maxLongTrade: maxLongTrade };
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Estimates what the position risk will be if a given order is executed.
|
|
395
|
+
* @param traderAddr Address of trader
|
|
396
|
+
* @param order Order to be submitted
|
|
397
|
+
* @param signedPositionNotionalBaseCCY signed position notional of current position (before trade)
|
|
398
|
+
* @param tradingFeeTbps trading fee in tenth of basis points (exchange fee and broker fee)
|
|
399
|
+
* @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
|
|
400
|
+
* @returns Position risk after trade, including order cost and maximal trade sizes for position
|
|
401
|
+
* @example
|
|
402
|
+
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
403
|
+
* async function main() {
|
|
404
|
+
* console.log(MarketData);
|
|
405
|
+
* // setup
|
|
406
|
+
* const config = PerpetualDataHandler.readSDKConfig("cardona");
|
|
407
|
+
* const mktData = new MarketData(config);
|
|
408
|
+
* await mktData.createProxyInstance();
|
|
409
|
+
* const order: Order = {
|
|
410
|
+
* symbol: "MATIC-USD-MATIC",
|
|
411
|
+
* side: "BUY",
|
|
412
|
+
* type: "MARKET",
|
|
413
|
+
* quantity: 100,
|
|
414
|
+
* leverage: 2,
|
|
415
|
+
* executionTimestamp: Date.now()/1000,
|
|
416
|
+
* };
|
|
417
|
+
* // Get position risk conditional on this order being executed
|
|
418
|
+
* const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order, 0, 60);
|
|
419
|
+
* console.log(posRisk);
|
|
420
|
+
* }
|
|
421
|
+
* main();
|
|
422
|
+
*/
|
|
423
|
+
async positionRiskOnTrade(traderAddr, order, signedPositionNotionalBaseCCY, tradingFeeTbps, indexPriceInfo, overrides) {
|
|
424
|
+
if (this.proxyContract == null || this.multicall == null) {
|
|
425
|
+
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
426
|
+
}
|
|
427
|
+
const isPredMkt = this.isPredictionMarket(order.symbol);
|
|
428
|
+
// fetch prices
|
|
429
|
+
if (indexPriceInfo == undefined) {
|
|
430
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
|
|
431
|
+
}
|
|
432
|
+
// signed trade amount
|
|
433
|
+
let tradeAmountBC = Math.abs(order.quantity) * (order.side == BUY_SIDE ? 1 : -1);
|
|
434
|
+
const symbol = order.symbol;
|
|
435
|
+
let obj = await this.dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides);
|
|
436
|
+
const account = obj.account;
|
|
437
|
+
const maxLongTrade = obj.maxLongTrade;
|
|
438
|
+
const maxShortTrade = obj.maxShortTrade;
|
|
439
|
+
const ammPrice = obj.ammPrice;
|
|
440
|
+
let Sm = account.markPrice;
|
|
441
|
+
let S2 = indexPriceInfo.s2;
|
|
442
|
+
let S3 = account.collToQuoteConversion;
|
|
457
443
|
// price for this order = amm price if no limit given, else conservatively adjusted
|
|
458
444
|
let tradePrice;
|
|
459
445
|
if (order.limitPrice == undefined) {
|
|
@@ -489,16 +475,6 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
489
475
|
}
|
|
490
476
|
}
|
|
491
477
|
}
|
|
492
|
-
// max buy
|
|
493
|
-
const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[4].returnData)[0];
|
|
494
|
-
const maxLongTrade = account.side == BUY_SIDE
|
|
495
|
-
? Math.max(0, ABK64x64ToFloat(fMaxLong) - (accountGiven ? 0 : account.positionNotionalBaseCCY))
|
|
496
|
-
: ABK64x64ToFloat(fMaxLong) + account.positionNotionalBaseCCY;
|
|
497
|
-
// max sell
|
|
498
|
-
const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[5].returnData)[0];
|
|
499
|
-
const maxShortTrade = account.side == SELL_SIDE
|
|
500
|
-
? Math.max(0, Math.abs(ABK64x64ToFloat(fMaxShort)) - (accountGiven ? 0 : Math.abs(account.positionNotionalBaseCCY)))
|
|
501
|
-
: Math.abs(ABK64x64ToFloat(fMaxShort)) + Math.abs(account.positionNotionalBaseCCY);
|
|
502
478
|
// Current state:
|
|
503
479
|
let lotSizeBC = MarketData._getLotSize(order.symbol, this.symbolToPerpStaticInfo);
|
|
504
480
|
// Too small, no change to account
|
|
@@ -520,10 +496,6 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
520
496
|
newPositionBC = 0;
|
|
521
497
|
}
|
|
522
498
|
let newSide = newPositionBC > 0 ? BUY_SIDE : newPositionBC < 0 ? SELL_SIDE : CLOSED_SIDE;
|
|
523
|
-
if (tradingFeeTbps === undefined) {
|
|
524
|
-
// use usual input if not overriden
|
|
525
|
-
tradingFeeTbps = Number(exchangeFeeTbps) + (order.brokerFeeTbps ?? 0);
|
|
526
|
-
}
|
|
527
499
|
let tradingFeeCC = (Math.abs(tradeAmountBC) * tradingFeeTbps * 1e-5 * S2) / S3;
|
|
528
500
|
let referralFeeCC = this.symbolToPerpStaticInfo.get(account.symbol).referralRebate;
|
|
529
501
|
// Trade type:
|
|
@@ -548,7 +520,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
548
520
|
let initialMarginRate = this.symbolToPerpStaticInfo.get(account.symbol).initialMarginRate;
|
|
549
521
|
targetLvg = isFlip || isOpen ? order.leverage ?? 1 / initialMarginRate : 0;
|
|
550
522
|
let [b0, pos0] = isOpen ? [0, 0] : [account.collateralCC, currentPositionBC];
|
|
551
|
-
traderDepositCC = getDepositAmountForLvgTrade(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm);
|
|
523
|
+
traderDepositCC = getDepositAmountForLvgTrade(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm, isPredMkt);
|
|
552
524
|
// fees are paid from wallet in this case
|
|
553
525
|
traderDepositCC += tradingFeeCC + referralFeeCC;
|
|
554
526
|
}
|
|
@@ -567,13 +539,23 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
567
539
|
let newMarginCashCC = currentMarginCashCC + deltaCashCC + traderDepositCC;
|
|
568
540
|
let newEntryPrice = newPositionBC == 0 ? 0 : Math.abs(newLockedInValueQC / newPositionBC);
|
|
569
541
|
let newMarginBalanceCC = newMarginCashCC + (newPositionBC * Sm - newLockedInValueQC) / S3;
|
|
570
|
-
let newLeverage
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
542
|
+
let newLeverage;
|
|
543
|
+
if (newPositionBC === 0) {
|
|
544
|
+
newLeverage = 0;
|
|
545
|
+
}
|
|
546
|
+
else if (newMarginBalanceCC <= 0) {
|
|
547
|
+
newLeverage = Infinity;
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
let p = Sm;
|
|
551
|
+
if (isPredMkt) {
|
|
552
|
+
p -= 1;
|
|
553
|
+
p = newPositionBC > 0 ? p : 1 - p;
|
|
554
|
+
}
|
|
555
|
+
newLeverage = Math.abs(newPositionBC * p) / S3 / newMarginBalanceCC;
|
|
556
|
+
}
|
|
575
557
|
// Liquidation params
|
|
576
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
558
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
577
559
|
// New position risk
|
|
578
560
|
let newPositionRisk = {
|
|
579
561
|
symbol: account.symbol,
|
|
@@ -596,6 +578,18 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
596
578
|
maxShortTrade: maxShortTrade,
|
|
597
579
|
};
|
|
598
580
|
}
|
|
581
|
+
/**
|
|
582
|
+
* Fee is relative to base-currency amount (=trade amount)
|
|
583
|
+
* @param state current perpetual state (need longBC and shortBC)
|
|
584
|
+
* @param maxMaintMgnRate maintenance margin rate param for pred mkts
|
|
585
|
+
* @param Sm Mark price
|
|
586
|
+
* @param tradeAmtBC signed trade amount
|
|
587
|
+
* @param tradeMgnRate margin rate param from perpetual
|
|
588
|
+
* @returns relative exchange fee in decimals
|
|
589
|
+
*/
|
|
590
|
+
static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
|
|
591
|
+
return pmExchangeFee(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
|
|
592
|
+
}
|
|
599
593
|
/**
|
|
600
594
|
* Estimates what the position risk will be if given amount of collateral is added/removed from the account.
|
|
601
595
|
* @param {number} deltaCollateral Amount of collateral to add or remove (signed)
|
|
@@ -625,11 +619,17 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
625
619
|
throw new Error("not enough margin to remove");
|
|
626
620
|
}
|
|
627
621
|
if (indexPriceInfo == undefined) {
|
|
628
|
-
|
|
629
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
622
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
|
|
630
623
|
}
|
|
631
624
|
let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
|
|
632
|
-
let
|
|
625
|
+
let Sm; //mark price
|
|
626
|
+
if (this.isPredictionMarket(account.symbol)) {
|
|
627
|
+
Sm = indexPriceInfo.ema + perpetualState.markPremium;
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
|
|
631
|
+
}
|
|
632
|
+
let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
|
|
633
633
|
// no position: just increase collateral and kill liquidation vars
|
|
634
634
|
if (account.positionNotionalBaseCCY == 0) {
|
|
635
635
|
return {
|
|
@@ -669,7 +669,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
669
669
|
}
|
|
670
670
|
let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
|
|
671
671
|
// Liquidation params
|
|
672
|
-
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
|
|
672
|
+
let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
|
|
673
673
|
// New position risk
|
|
674
674
|
let newPositionRisk = {
|
|
675
675
|
symbol: account.symbol,
|
|
@@ -688,35 +688,39 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
688
688
|
return newPositionRisk;
|
|
689
689
|
}
|
|
690
690
|
/**
|
|
691
|
-
* Calculates liquidation prices for a
|
|
691
|
+
* Calculates liquidation prices for a position
|
|
692
|
+
* constructed in positionRiskOnTrade/positionRiskOnCollateralAction
|
|
692
693
|
* @param symbol Perpetual symbol
|
|
693
694
|
* @param lockedInQC Locked in value
|
|
694
695
|
* @param signedPositionBC Signed position size
|
|
695
|
-
* @param marginCashCC
|
|
696
|
+
* @param marginCashCC Available cash in margin account (includes unpaid funding)
|
|
696
697
|
* @param markPrice Mark price
|
|
697
|
-
* @param collToQuoteConversion Collateral index price
|
|
698
|
+
* @param collToQuoteConversion Collateral index price (S3)
|
|
699
|
+
* @param S2 index price
|
|
698
700
|
* @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
|
|
699
701
|
* @returns [Base index price, Collateral index price, Maintenance margin rate]
|
|
700
702
|
* @ignore
|
|
701
703
|
*/
|
|
702
|
-
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
|
|
704
|
+
static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
|
|
703
705
|
let S2Liq, S3Liq;
|
|
704
|
-
|
|
705
|
-
let
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
706
|
+
const staticInfo = symbolToPerpStaticInfo.get(symbol);
|
|
707
|
+
let tau = staticInfo.maintenanceMarginRate;
|
|
708
|
+
let ccyType = staticInfo.collateralCurrencyType;
|
|
709
|
+
const isPred = MarketData.isPredictionMarketStatic(staticInfo);
|
|
710
|
+
const idx_availableCashCC = 2;
|
|
711
|
+
const idx_cash = 3;
|
|
712
|
+
const idx_notional = 4;
|
|
713
|
+
const idx_locked_in = 5;
|
|
714
|
+
const idx_mark_price = 8;
|
|
715
|
+
const idx_s3 = 9;
|
|
716
|
+
let traderState = new Array(10);
|
|
717
|
+
traderState[idx_availableCashCC] = floatToABK64x64(marginCashCC);
|
|
718
|
+
traderState[idx_cash] = traderState[idx_availableCashCC];
|
|
719
|
+
traderState[idx_notional] = floatToABK64x64(signedPositionBC);
|
|
720
|
+
traderState[idx_locked_in] = floatToABK64x64(lockedInQC);
|
|
721
|
+
traderState[idx_mark_price] = floatToABK64x64(markPrice);
|
|
722
|
+
traderState[idx_s3] = floatToABK64x64(collToQuoteConversion);
|
|
723
|
+
[S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
|
|
720
724
|
return [S2Liq, S3Liq, tau];
|
|
721
725
|
}
|
|
722
726
|
/**
|
|
@@ -884,22 +888,28 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
884
888
|
if (!this.proxyContract || !this.multicall) {
|
|
885
889
|
throw new Error("proxy contract not initialized");
|
|
886
890
|
}
|
|
891
|
+
if (this.isPredictionMarket(symbol)) {
|
|
892
|
+
// prediction markets
|
|
893
|
+
return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
894
|
+
}
|
|
895
|
+
// regular markets
|
|
896
|
+
return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
|
|
897
|
+
}
|
|
898
|
+
async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
899
|
+
if (!this.proxyContract || !this.multicall) {
|
|
900
|
+
throw new Error("proxy contract not initialized");
|
|
901
|
+
}
|
|
902
|
+
const IERC20 = new Interface(ERC20_ABI);
|
|
887
903
|
const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
888
|
-
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
889
904
|
const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
|
|
890
|
-
const
|
|
891
|
-
const
|
|
892
|
-
const indexPriceInfo = await this.priceFeedGetter
|
|
893
|
-
.fetchPricesForPerpetual(symbol)
|
|
894
|
-
.then((obj) => [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]]);
|
|
895
|
-
const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => floatToABK64x64(x));
|
|
896
|
-
let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
|
|
905
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
906
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
|
|
897
907
|
const proxyCalls = [
|
|
898
908
|
// 0: traderState
|
|
899
909
|
{
|
|
900
910
|
target: this.proxyContract.target,
|
|
901
911
|
allowFailure: false,
|
|
902
|
-
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr,
|
|
912
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
903
913
|
},
|
|
904
914
|
// 1: wallet balance
|
|
905
915
|
{
|
|
@@ -907,31 +917,53 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
907
917
|
allowFailure: false,
|
|
908
918
|
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
909
919
|
},
|
|
910
|
-
// 2:
|
|
920
|
+
// 2: amm state
|
|
911
921
|
{
|
|
912
922
|
target: this.proxyContract.target,
|
|
913
923
|
allowFailure: false,
|
|
914
|
-
callData: this.proxyContract.interface.encodeFunctionData("
|
|
915
|
-
poolId,
|
|
916
|
-
traderAddr,
|
|
917
|
-
ZERO_ADDRESS,
|
|
918
|
-
]),
|
|
924
|
+
callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
|
|
919
925
|
},
|
|
920
926
|
];
|
|
921
927
|
// multicall
|
|
922
928
|
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
923
|
-
// position risk
|
|
924
|
-
const idxNotional = 4;
|
|
925
929
|
const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
926
|
-
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, [
|
|
927
|
-
indexPriceInfo[0],
|
|
928
|
-
indexPriceInfo[1],
|
|
929
|
-
]);
|
|
930
|
-
// fee rate
|
|
931
|
-
const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
932
|
-
const feeRate = 1e-5 * Number(feeRateTbps);
|
|
933
|
-
// Max based on margin requirements:
|
|
934
930
|
const walletBalance = decNToFloat(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
931
|
+
const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
|
|
932
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
|
|
933
|
+
);
|
|
934
|
+
const openInterestBC = ABK64x64ToFloat(ammState[11]);
|
|
935
|
+
const net = -ABK64x64ToFloat(ammState[1]);
|
|
936
|
+
let totLong, totShort;
|
|
937
|
+
if (net < 0) {
|
|
938
|
+
totLong = openInterestBC;
|
|
939
|
+
totShort = openInterestBC - Math.abs(net);
|
|
940
|
+
}
|
|
941
|
+
else {
|
|
942
|
+
totLong = openInterestBC - net;
|
|
943
|
+
totShort = openInterestBC;
|
|
944
|
+
}
|
|
945
|
+
let currentPositionBC = (account.side == BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
946
|
+
const Sm = ABK64x64ToFloat(traderState[8]);
|
|
947
|
+
// settlement token must be equal to collateral token for walletBalance to be correct
|
|
948
|
+
const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
|
|
949
|
+
const idxNotional = 4;
|
|
950
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
951
|
+
const maxShort = pmFindMaxTradeSize(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
952
|
+
const maxLong = pmFindMaxTradeSize(1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
|
|
953
|
+
return { buy: maxLong, sell: maxShort };
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* Returns the maximal allowed short pos and long pos (signed) for a trader
|
|
957
|
+
* with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
|
|
958
|
+
* @param perpId
|
|
959
|
+
* @param currentTraderPos ABDK64x64 notional position of trader
|
|
960
|
+
* @param overrides
|
|
961
|
+
* @returns [maxShortPos, maxLongPos] signed maximal position sizes
|
|
962
|
+
*/
|
|
963
|
+
async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
|
|
964
|
+
if (!this.proxyContract || !this.multicall) {
|
|
965
|
+
throw new Error("proxy contract not initialized");
|
|
966
|
+
}
|
|
935
967
|
const proxyCalls2 = [
|
|
936
968
|
// 0: max long
|
|
937
969
|
{
|
|
@@ -939,7 +971,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
939
971
|
allowFailure: false,
|
|
940
972
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
941
973
|
perpId,
|
|
942
|
-
|
|
974
|
+
currentTraderPos,
|
|
943
975
|
true,
|
|
944
976
|
]),
|
|
945
977
|
},
|
|
@@ -949,7 +981,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
949
981
|
allowFailure: false,
|
|
950
982
|
callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
|
|
951
983
|
perpId,
|
|
952
|
-
|
|
984
|
+
currentTraderPos,
|
|
953
985
|
false,
|
|
954
986
|
]),
|
|
955
987
|
},
|
|
@@ -959,15 +991,66 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
959
991
|
// Max based on perp:
|
|
960
992
|
// max buy
|
|
961
993
|
const maxLongOrderPerp = ABK64x64ToFloat(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[0].returnData)[0]);
|
|
962
|
-
const maxLongPosPerp = maxLongOrderPerp + ABK64x64ToFloat(
|
|
994
|
+
const maxLongPosPerp = maxLongOrderPerp + ABK64x64ToFloat(currentTraderPos);
|
|
963
995
|
// max short
|
|
964
996
|
const maxShortOrderPerp = ABK64x64ToFloat(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[1].returnData)[0]);
|
|
965
|
-
const maxShortPosPerp = maxShortOrderPerp + ABK64x64ToFloat(
|
|
997
|
+
const maxShortPosPerp = maxShortOrderPerp + ABK64x64ToFloat(currentTraderPos);
|
|
998
|
+
return [maxShortPosPerp, maxLongPosPerp];
|
|
999
|
+
}
|
|
1000
|
+
async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
|
|
1001
|
+
const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
1002
|
+
const poolId = this.getPoolIdFromSymbol(symbol);
|
|
1003
|
+
const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
|
|
1004
|
+
const perpInfo = this.getPerpetualStaticInfo(symbol);
|
|
1005
|
+
const IERC20 = new Interface(ERC20_ABI);
|
|
1006
|
+
const isPredMkt = false;
|
|
1007
|
+
const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1008
|
+
let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
|
|
1009
|
+
const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
|
|
1010
|
+
if (!this.proxyContract || !this.multicall) {
|
|
1011
|
+
throw new Error("proxy contract not initialized");
|
|
1012
|
+
}
|
|
1013
|
+
const proxyCalls = [
|
|
1014
|
+
// 0: traderState
|
|
1015
|
+
{
|
|
1016
|
+
target: this.proxyContract.target,
|
|
1017
|
+
allowFailure: false,
|
|
1018
|
+
callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
|
|
1019
|
+
},
|
|
1020
|
+
// 1: wallet balance
|
|
1021
|
+
{
|
|
1022
|
+
target: poolInfo.poolSettleTokenAddr,
|
|
1023
|
+
allowFailure: false,
|
|
1024
|
+
callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
|
|
1025
|
+
},
|
|
1026
|
+
// 2: exchange fee
|
|
1027
|
+
{
|
|
1028
|
+
target: this.proxyContract.target,
|
|
1029
|
+
allowFailure: false,
|
|
1030
|
+
callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
|
|
1031
|
+
poolId,
|
|
1032
|
+
traderAddr,
|
|
1033
|
+
ZERO_ADDRESS,
|
|
1034
|
+
]),
|
|
1035
|
+
},
|
|
1036
|
+
];
|
|
1037
|
+
// multicall
|
|
1038
|
+
const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
1039
|
+
// position risk
|
|
1040
|
+
const idxNotional = 4;
|
|
1041
|
+
const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
|
|
1042
|
+
const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
|
|
1043
|
+
// fee rate
|
|
1044
|
+
const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
|
|
1045
|
+
const feeRate = 1e-5 * Number(feeRateTbps);
|
|
1046
|
+
// Max based on margin requirements:
|
|
1047
|
+
const walletBalance = decNToFloat(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
|
|
1048
|
+
const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
|
|
966
1049
|
const curPos = (account.side == BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
|
|
967
1050
|
const px = await coll2SettlePromise;
|
|
968
1051
|
const walletBalanceInMgnToken = walletBalance / px;
|
|
969
|
-
const maxLongPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo
|
|
970
|
-
const maxShortPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo
|
|
1052
|
+
const maxLongPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
|
|
1053
|
+
const maxShortPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
|
|
971
1054
|
// max long/short all accounted for
|
|
972
1055
|
const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
|
|
973
1056
|
const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
|
|
@@ -1030,8 +1113,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1030
1113
|
if (!this.proxyContract) {
|
|
1031
1114
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1032
1115
|
}
|
|
1033
|
-
|
|
1034
|
-
return px == undefined ? undefined : ABK64x64ToFloat(px);
|
|
1116
|
+
return await this.proxyContract.getOraclePrice([toBytes4(base), toBytes4(quote)], overrides || {});
|
|
1035
1117
|
}
|
|
1036
1118
|
/**
|
|
1037
1119
|
* Get the status of an order given a symbol and order Id
|
|
@@ -1100,6 +1182,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1100
1182
|
/**
|
|
1101
1183
|
* Get the current mark price
|
|
1102
1184
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1185
|
+
* @param indexPrices optional. IdxPriceInfo
|
|
1103
1186
|
* @example
|
|
1104
1187
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1105
1188
|
* async function main() {
|
|
@@ -1121,15 +1204,15 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1121
1204
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1122
1205
|
}
|
|
1123
1206
|
if (indexPrices == undefined) {
|
|
1124
|
-
|
|
1125
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1207
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1126
1208
|
}
|
|
1127
|
-
return await PerpetualDataHandler._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
|
|
1209
|
+
return await PerpetualDataHandler._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
|
|
1128
1210
|
}
|
|
1129
1211
|
/**
|
|
1130
1212
|
* get the current price for a given quantity
|
|
1131
1213
|
* @param symbol symbol of the form ETH-USD-MATIC
|
|
1132
1214
|
* @param quantity quantity to be traded, negative if short
|
|
1215
|
+
* @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
|
|
1133
1216
|
* @example
|
|
1134
1217
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
1135
1218
|
* async function main() {
|
|
@@ -1146,16 +1229,18 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1146
1229
|
*
|
|
1147
1230
|
* @returns {number} price
|
|
1148
1231
|
*/
|
|
1149
|
-
async getPerpetualPrice(symbol, quantity,
|
|
1232
|
+
async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
|
|
1150
1233
|
if (this.proxyContract == null) {
|
|
1151
1234
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1152
1235
|
}
|
|
1153
|
-
if (
|
|
1236
|
+
if (priceInfo == undefined) {
|
|
1154
1237
|
// fetch from API
|
|
1155
|
-
|
|
1156
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1238
|
+
priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1157
1239
|
}
|
|
1158
|
-
return await PerpetualDataHandler._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract,
|
|
1240
|
+
return await PerpetualDataHandler._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3 ?? 0], //s2,s3
|
|
1241
|
+
priceInfo.conf, //conf
|
|
1242
|
+
priceInfo.predMktCLOBParams, //params
|
|
1243
|
+
overrides);
|
|
1159
1244
|
}
|
|
1160
1245
|
/**
|
|
1161
1246
|
* Query recent perpetual state from blockchain
|
|
@@ -1167,8 +1252,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1167
1252
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
1168
1253
|
}
|
|
1169
1254
|
if (indexPriceInfo == undefined) {
|
|
1170
|
-
|
|
1171
|
-
indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
1255
|
+
indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1172
1256
|
}
|
|
1173
1257
|
let state = await PerpetualDataHandler._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
|
|
1174
1258
|
return state;
|
|
@@ -1364,7 +1448,7 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1364
1448
|
* Result is in collateral currency
|
|
1365
1449
|
* @param {string} traderAddr address of the trader
|
|
1366
1450
|
* @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
|
|
1367
|
-
* @param indexPrices optional
|
|
1451
|
+
* @param indexPrices optional indexPriceInfo
|
|
1368
1452
|
* @returns available margin in collateral currency
|
|
1369
1453
|
* @example
|
|
1370
1454
|
* import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
|
|
@@ -1386,11 +1470,10 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1386
1470
|
}
|
|
1387
1471
|
if (indexPrices == undefined) {
|
|
1388
1472
|
// fetch from API
|
|
1389
|
-
|
|
1390
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
1473
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
|
|
1391
1474
|
}
|
|
1392
1475
|
let perpID = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
|
|
1393
|
-
let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
|
|
1476
|
+
let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, [indexPrices.s2, indexPrices.s3].map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
|
|
1394
1477
|
const idx_availableMargin = 1;
|
|
1395
1478
|
let mgn = ABK64x64ToFloat(traderState[idx_availableMargin]);
|
|
1396
1479
|
return mgn;
|
|
@@ -1657,7 +1740,8 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1657
1740
|
quoteCurrency: contractSymbolToSymbol(perp.S2QuoteCCY, _symbolList),
|
|
1658
1741
|
indexPrice: 0,
|
|
1659
1742
|
collToQuoteIndexPrice: 0,
|
|
1660
|
-
|
|
1743
|
+
markPremium: ABK64x64ToFloat(perp.currentMarkPremiumRate.fPrice),
|
|
1744
|
+
markPrice: 0,
|
|
1661
1745
|
midPrice: 0,
|
|
1662
1746
|
currentFundingRateBps: 1e4 * ABK64x64ToFloat(perp.fCurrentFundingRate),
|
|
1663
1747
|
openInterestBC: ABK64x64ToFloat(perp.fOpenInterest),
|
|
@@ -1706,7 +1790,6 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1706
1790
|
perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
|
|
1707
1791
|
}
|
|
1708
1792
|
perp.indexPrice = idxPriceS2Pair[0];
|
|
1709
|
-
perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
|
|
1710
1793
|
let indexS3 = 1;
|
|
1711
1794
|
if (info.collateralCurrencyType == COLLATERAL_CURRENCY_BASE) {
|
|
1712
1795
|
indexS3 = idxPriceS2Pair[0];
|
|
@@ -1715,6 +1798,18 @@ export default class MarketData extends PerpetualDataHandler {
|
|
|
1715
1798
|
indexS3 = idxPriceS3Pair[0];
|
|
1716
1799
|
}
|
|
1717
1800
|
perp.collToQuoteIndexPrice = indexS3;
|
|
1801
|
+
const emaKey = info.S2Symbol + ":ema";
|
|
1802
|
+
let markPrice;
|
|
1803
|
+
if (idxPriceMap.has(emaKey)) {
|
|
1804
|
+
let ema;
|
|
1805
|
+
let res = idxPriceMap.get(emaKey);
|
|
1806
|
+
ema = res[0];
|
|
1807
|
+
markPrice = ema + perp.markPremium;
|
|
1808
|
+
}
|
|
1809
|
+
else {
|
|
1810
|
+
markPrice = perp.indexPrice * (1 + perp.markPremium);
|
|
1811
|
+
}
|
|
1812
|
+
perp.markPrice = markPrice;
|
|
1718
1813
|
perp.midPrice = midPriceMap.get(symbol3s);
|
|
1719
1814
|
// which pool?
|
|
1720
1815
|
const poolId = info.poolId;
|