@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/src/nodeSDKTypes.ts
CHANGED
|
@@ -146,6 +146,7 @@ export interface PerpetualState {
|
|
|
146
146
|
quoteCurrency: string;
|
|
147
147
|
indexPrice: number;
|
|
148
148
|
collToQuoteIndexPrice: number;
|
|
149
|
+
markPremium: number;
|
|
149
150
|
markPrice: number;
|
|
150
151
|
midPrice: number;
|
|
151
152
|
currentFundingRateBps: number;
|
|
@@ -306,7 +307,7 @@ export interface PriceFeedConfig {
|
|
|
306
307
|
}
|
|
307
308
|
|
|
308
309
|
export interface PriceFeedEndpointsItem {
|
|
309
|
-
type: string | "odin" | "pyth" | "onchain";
|
|
310
|
+
type: string | "odin" | "pyth" | "onchain" | "polymarket";
|
|
310
311
|
// Read only endpoints. Used by default.
|
|
311
312
|
endpoints: string[];
|
|
312
313
|
// Price feed endpoints which are used for fetching prices which will be
|
|
@@ -337,6 +338,14 @@ export interface PriceFeedFormat {
|
|
|
337
338
|
publish_time: number;
|
|
338
339
|
}
|
|
339
340
|
|
|
341
|
+
// json version of PriceFeedFormat
|
|
342
|
+
export interface PriceFeedJson {
|
|
343
|
+
conf: string;
|
|
344
|
+
expo: number;
|
|
345
|
+
price: string;
|
|
346
|
+
publish_time: number;
|
|
347
|
+
}
|
|
348
|
+
|
|
340
349
|
export interface PythV2MetaData {
|
|
341
350
|
slot: number;
|
|
342
351
|
proof_available_time: number;
|
|
@@ -526,3 +535,23 @@ export const referralTypes = {
|
|
|
526
535
|
{ name: "CreatedOn", type: "uint256" },
|
|
527
536
|
],
|
|
528
537
|
};
|
|
538
|
+
|
|
539
|
+
// Price information that can be used for
|
|
540
|
+
// prediction markets and regular markets
|
|
541
|
+
export interface IdxPriceInfo {
|
|
542
|
+
s2: number;
|
|
543
|
+
s3?: number;
|
|
544
|
+
ema: number;
|
|
545
|
+
s2MktClosed: boolean;
|
|
546
|
+
s3MktClosed?: boolean;
|
|
547
|
+
conf: bigint;
|
|
548
|
+
predMktCLOBParams: bigint;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
export interface PredMktPriceInfo {
|
|
552
|
+
s2: number;
|
|
553
|
+
ema: number;
|
|
554
|
+
s2MktClosed: boolean;
|
|
555
|
+
conf: bigint;
|
|
556
|
+
predMktCLOBParams: bigint;
|
|
557
|
+
}
|
package/src/orderExecutorTool.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { IPyth__factory, LimitOrderBook__factory, Multicall3, Multicall3__factor
|
|
|
13
13
|
import { PayableOverrides } from "./contracts/common";
|
|
14
14
|
import { ABK64x64ToFloat, floatToABK64x64 } from "./d8XMath";
|
|
15
15
|
import {
|
|
16
|
+
IdxPriceInfo,
|
|
16
17
|
type NodeSDKConfig,
|
|
17
18
|
type Order,
|
|
18
19
|
type PerpetualStaticInfo,
|
|
@@ -367,15 +368,15 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
367
368
|
order: Order,
|
|
368
369
|
orderId: string,
|
|
369
370
|
blockTimestamp?: number,
|
|
370
|
-
indexPrices?:
|
|
371
|
+
indexPrices?: IdxPriceInfo,
|
|
371
372
|
overrides?: Overrides & { rpcURL?: string }
|
|
372
373
|
): Promise<boolean> {
|
|
373
374
|
if (this.proxyContract == null || this.multicall == null) {
|
|
374
375
|
throw Error("no proxy contract initialized. Use createProxyInstance().");
|
|
375
376
|
}
|
|
377
|
+
const isPred = this.isPredictionMarket(order.symbol);
|
|
376
378
|
if (indexPrices == undefined) {
|
|
377
|
-
|
|
378
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
|
|
379
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
|
|
379
380
|
}
|
|
380
381
|
let rpcURL: string | undefined;
|
|
381
382
|
if (overrides) {
|
|
@@ -383,10 +384,9 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
383
384
|
}
|
|
384
385
|
const provider = new JsonRpcProvider(rpcURL ?? this.nodeURL, this.network, { staticNetwork: true });
|
|
385
386
|
|
|
386
|
-
const fS2S3 = indexPrices.map((x) =>
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
];
|
|
387
|
+
const fS2S3 = [indexPrices.s2, indexPrices.s3].map((x) =>
|
|
388
|
+
floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)
|
|
389
|
+
) as [bigint, bigint];
|
|
390
390
|
const perpId = this.getPerpIdFromSymbol(order.symbol);
|
|
391
391
|
const fAmount = floatToABK64x64(order.quantity * (order.side == BUY_SIDE ? 1 : -1));
|
|
392
392
|
const orderBook = this.getOrderBookContract(order.symbol).connect(provider);
|
|
@@ -396,7 +396,13 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
396
396
|
{
|
|
397
397
|
target: this.proxyContract.target,
|
|
398
398
|
allowFailure: true,
|
|
399
|
-
callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
399
|
+
callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
400
|
+
perpId,
|
|
401
|
+
fAmount,
|
|
402
|
+
fS2S3,
|
|
403
|
+
indexPrices.conf,
|
|
404
|
+
indexPrices.predMktCLOBParams,
|
|
405
|
+
]),
|
|
400
406
|
},
|
|
401
407
|
// 1: amm state to get the mark price
|
|
402
408
|
{
|
|
@@ -474,7 +480,13 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
474
480
|
} else {
|
|
475
481
|
ammState = await this.proxyContract.getAMMState(perpId, fS2S3);
|
|
476
482
|
}
|
|
477
|
-
|
|
483
|
+
let markPrice;
|
|
484
|
+
const idx_markPremRate = 8;
|
|
485
|
+
if (isPred) {
|
|
486
|
+
markPrice = indexPrices.ema + ABK64x64ToFloat(ammState[idx_markPremRate]);
|
|
487
|
+
} else {
|
|
488
|
+
markPrice = indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[idx_markPremRate]));
|
|
489
|
+
}
|
|
478
490
|
|
|
479
491
|
// price
|
|
480
492
|
let fOrderPrice: bigint;
|
|
@@ -484,7 +496,13 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
484
496
|
encodedResults[0].returnData
|
|
485
497
|
)[0] as bigint;
|
|
486
498
|
} else {
|
|
487
|
-
fOrderPrice = await this.proxyContract.queryPerpetualPrice(
|
|
499
|
+
fOrderPrice = await this.proxyContract.queryPerpetualPrice(
|
|
500
|
+
perpId,
|
|
501
|
+
fAmount,
|
|
502
|
+
fS2S3,
|
|
503
|
+
indexPrices.conf,
|
|
504
|
+
indexPrices.predMktCLOBParams
|
|
505
|
+
);
|
|
488
506
|
}
|
|
489
507
|
const orderPrice = ABK64x64ToFloat(fOrderPrice);
|
|
490
508
|
|
|
@@ -526,7 +544,7 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
526
544
|
orders: Order[],
|
|
527
545
|
orderIds: string[],
|
|
528
546
|
blockTimestamp?: number,
|
|
529
|
-
indexPrices?:
|
|
547
|
+
indexPrices?: IdxPriceInfo,
|
|
530
548
|
overrides?: Overrides & { rpcURL?: string }
|
|
531
549
|
): Promise<boolean[]> {
|
|
532
550
|
const MAX_ORDERS_CHECKED = 10;
|
|
@@ -561,7 +579,7 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
561
579
|
orders: Order[],
|
|
562
580
|
orderIds: string[],
|
|
563
581
|
blockTimestamp?: number,
|
|
564
|
-
indexPrices?:
|
|
582
|
+
indexPrices?: IdxPriceInfo,
|
|
565
583
|
overrides?: Overrides & { rpcURL?: string }
|
|
566
584
|
): Promise<boolean[]> {
|
|
567
585
|
if (orders.length == 0) {
|
|
@@ -574,10 +592,9 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
574
592
|
throw Error("all orders in a batch must have the same symbol");
|
|
575
593
|
}
|
|
576
594
|
if (indexPrices == undefined) {
|
|
577
|
-
|
|
578
|
-
indexPrices = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
|
|
595
|
+
indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(orders[0].symbol);
|
|
579
596
|
}
|
|
580
|
-
if (indexPrices
|
|
597
|
+
if (indexPrices.s2MktClosed || indexPrices.s3MktClosed) {
|
|
581
598
|
// market closed
|
|
582
599
|
return orders.map(() => false);
|
|
583
600
|
}
|
|
@@ -586,8 +603,8 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
586
603
|
({ rpcURL, ...overrides } = overrides);
|
|
587
604
|
}
|
|
588
605
|
const provider = new JsonRpcProvider(rpcURL ?? this.nodeURL, this.network, { staticNetwork: true });
|
|
589
|
-
|
|
590
|
-
const fS2S3 = [indexPrices
|
|
606
|
+
const isPred = this.isPredictionMarket(orders[0].symbol);
|
|
607
|
+
const fS2S3 = [indexPrices.s2, indexPrices.s3].map((x) =>
|
|
591
608
|
floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)
|
|
592
609
|
) as [bigint, bigint];
|
|
593
610
|
const perpId = this.getPerpIdFromSymbol(orders[0].symbol);
|
|
@@ -623,7 +640,13 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
623
640
|
const priceCalls: Multicall3.Call3Struct[] = fAmounts.map((fAmount) => ({
|
|
624
641
|
target: this.proxyContract!.target,
|
|
625
642
|
allowFailure: false,
|
|
626
|
-
callData: this.proxyContract!.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
643
|
+
callData: this.proxyContract!.interface.encodeFunctionData("queryPerpetualPrice", [
|
|
644
|
+
perpId,
|
|
645
|
+
fAmount,
|
|
646
|
+
fS2S3,
|
|
647
|
+
indexPrices!.conf,
|
|
648
|
+
indexPrices!.predMktCLOBParams,
|
|
649
|
+
]),
|
|
627
650
|
}));
|
|
628
651
|
proxyCalls = proxyCalls.concat(priceCalls);
|
|
629
652
|
|
|
@@ -652,7 +675,12 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
652
675
|
"getAMMState",
|
|
653
676
|
encodedResults[0].returnData
|
|
654
677
|
)[0] as bigint[];
|
|
655
|
-
|
|
678
|
+
let markprice: number;
|
|
679
|
+
if (isPred) {
|
|
680
|
+
markprice = indexPrices.ema + ABK64x64ToFloat(ammState[8]);
|
|
681
|
+
} else {
|
|
682
|
+
markprice = indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
683
|
+
}
|
|
656
684
|
|
|
657
685
|
// block timestamp
|
|
658
686
|
const ts = this.multicall.interface.decodeFunctionResult(
|
|
@@ -699,7 +727,7 @@ export default class OrderExecutorTool extends WriteAccessHandler {
|
|
|
699
727
|
if (!isOrderOpen[idx] || !isParentReady[idx]) {
|
|
700
728
|
return false;
|
|
701
729
|
}
|
|
702
|
-
return this._isTradeable(o, orderPrices[idx],
|
|
730
|
+
return this._isTradeable(o, orderPrices[idx], markprice, blockTimestamp!, this.symbolToPerpStaticInfo);
|
|
703
731
|
});
|
|
704
732
|
}
|
|
705
733
|
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
} from "./constants";
|
|
38
38
|
import {
|
|
39
39
|
ERC20__factory,
|
|
40
|
+
IPerpetualManager__factory,
|
|
40
41
|
LimitOrderBook,
|
|
41
42
|
LimitOrderBookFactory,
|
|
42
43
|
LimitOrderBookFactory__factory,
|
|
@@ -45,7 +46,7 @@ import {
|
|
|
45
46
|
Multicall3__factory,
|
|
46
47
|
OracleFactory__factory,
|
|
47
48
|
} from "./contracts";
|
|
48
|
-
import { IPerpetualInfo } from "./contracts/IPerpetualManager";
|
|
49
|
+
import { IPerpetualInfo, IPerpetualManager } from "./contracts/IPerpetualManager";
|
|
49
50
|
import { IClientOrder, IPerpetualOrder } from "./contracts/LimitOrderBook";
|
|
50
51
|
|
|
51
52
|
import {
|
|
@@ -59,6 +60,8 @@ import {
|
|
|
59
60
|
dec18ToFloat,
|
|
60
61
|
priceToProb,
|
|
61
62
|
probToPrice,
|
|
63
|
+
pmFindLiquidationPrice,
|
|
64
|
+
pmMaintenanceMarginRate,
|
|
62
65
|
} from "./d8XMath";
|
|
63
66
|
import {
|
|
64
67
|
TokenOverride,
|
|
@@ -76,6 +79,7 @@ import {
|
|
|
76
79
|
LiquidityPoolData,
|
|
77
80
|
SettlementConfig,
|
|
78
81
|
SettlementCcyItem,
|
|
82
|
+
IdxPriceInfo,
|
|
79
83
|
} from "./nodeSDKTypes";
|
|
80
84
|
import PriceFeeds from "./priceFeeds";
|
|
81
85
|
import {
|
|
@@ -108,7 +112,7 @@ export default class PerpetualDataHandler {
|
|
|
108
112
|
protected symbolToTokenAddrMap: Map<string, string>;
|
|
109
113
|
public chainId: bigint;
|
|
110
114
|
public network: Network;
|
|
111
|
-
protected proxyContract:
|
|
115
|
+
protected proxyContract: IPerpetualManager | null = null;
|
|
112
116
|
protected proxyABI: Interface;
|
|
113
117
|
protected proxyAddr: string;
|
|
114
118
|
// oracle
|
|
@@ -178,7 +182,7 @@ export default class PerpetualDataHandler {
|
|
|
178
182
|
if (network.chainId !== this.chainId) {
|
|
179
183
|
throw new Error(`Provider: chain id ${network.chainId} does not match config (${this.chainId})`);
|
|
180
184
|
}
|
|
181
|
-
this.proxyContract =
|
|
185
|
+
this.proxyContract = IPerpetualManager__factory.connect(this.proxyAddr, signerOrProvider);
|
|
182
186
|
this.multicall = Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, this.signerOrProvider);
|
|
183
187
|
await this._fillSymbolMaps(overrides);
|
|
184
188
|
}
|
|
@@ -613,7 +617,7 @@ export default class PerpetualDataHandler {
|
|
|
613
617
|
* @returns array with PerpetualStaticInfo for each perpetual
|
|
614
618
|
*/
|
|
615
619
|
public static async getPerpetualStaticInfo(
|
|
616
|
-
_proxyContract:
|
|
620
|
+
_proxyContract: IPerpetualManager,
|
|
617
621
|
nestedPerpetualIDs: Array<Array<number>>,
|
|
618
622
|
symbolList: Map<string, string>,
|
|
619
623
|
overrides?: Overrides
|
|
@@ -692,7 +696,7 @@ export default class PerpetualDataHandler {
|
|
|
692
696
|
public static async _getLiquidityPools(
|
|
693
697
|
fromIdx: number,
|
|
694
698
|
toIdx: number,
|
|
695
|
-
_proxyContract:
|
|
699
|
+
_proxyContract: IPerpetualManager,
|
|
696
700
|
_symbolList: Map<string, string>,
|
|
697
701
|
overrides?: Overrides
|
|
698
702
|
): Promise<LiquidityPoolData[]> {
|
|
@@ -739,7 +743,7 @@ export default class PerpetualDataHandler {
|
|
|
739
743
|
*/
|
|
740
744
|
public static async _getPerpetuals(
|
|
741
745
|
ids: number[],
|
|
742
|
-
_proxyContract:
|
|
746
|
+
_proxyContract: IPerpetualManager,
|
|
743
747
|
_symbolList: Map<string, string>,
|
|
744
748
|
overrides?: Overrides
|
|
745
749
|
): Promise<PerpetualData[]> {
|
|
@@ -810,7 +814,7 @@ export default class PerpetualDataHandler {
|
|
|
810
814
|
}
|
|
811
815
|
|
|
812
816
|
public static async getPoolStaticInfo(
|
|
813
|
-
_proxyContract:
|
|
817
|
+
_proxyContract: IPerpetualManager,
|
|
814
818
|
overrides?: Overrides
|
|
815
819
|
): Promise<{
|
|
816
820
|
nestedPerpetualIDs: Array<Array<number>>;
|
|
@@ -855,7 +859,8 @@ export default class PerpetualDataHandler {
|
|
|
855
859
|
symbol: string,
|
|
856
860
|
traderState: bigint[],
|
|
857
861
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
858
|
-
|
|
862
|
+
pxInfo: IdxPriceInfo,
|
|
863
|
+
isPredMkt: boolean
|
|
859
864
|
): MarginAccount {
|
|
860
865
|
const idx_cash = 3;
|
|
861
866
|
const idx_notional = 4;
|
|
@@ -877,8 +882,9 @@ export default class PerpetualDataHandler {
|
|
|
877
882
|
[S2Liq, S3Liq, tau, pnl, unpaidFundingCC] = PerpetualDataHandler._calculateLiquidationPrice(
|
|
878
883
|
symbol,
|
|
879
884
|
traderState,
|
|
880
|
-
|
|
881
|
-
symbolToPerpStaticInfo
|
|
885
|
+
pxInfo.s2,
|
|
886
|
+
symbolToPerpStaticInfo,
|
|
887
|
+
isPredMkt
|
|
882
888
|
);
|
|
883
889
|
fLockedIn = traderState[idx_locked_in];
|
|
884
890
|
side = traderState[idx_notional] > 0n ? BUY_SIDE : SELL_SIDE;
|
|
@@ -907,7 +913,7 @@ export default class PerpetualDataHandler {
|
|
|
907
913
|
* @param symbol Perpetual symbol
|
|
908
914
|
* @param symbolToPerpStaticInfo Symbol to perp static info mapping
|
|
909
915
|
* @param _proxyContract Proxy contract instance
|
|
910
|
-
* @param
|
|
916
|
+
* @param _pxInfo index price info
|
|
911
917
|
* @param overrides Optional overrides for eth_call
|
|
912
918
|
* @returns A Margin account
|
|
913
919
|
*/
|
|
@@ -916,7 +922,8 @@ export default class PerpetualDataHandler {
|
|
|
916
922
|
symbol: string,
|
|
917
923
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
918
924
|
_proxyContract: Contract,
|
|
919
|
-
|
|
925
|
+
_pxInfo: IdxPriceInfo,
|
|
926
|
+
isPredMkt: boolean,
|
|
920
927
|
overrides?: Overrides
|
|
921
928
|
): Promise<MarginAccount> {
|
|
922
929
|
let perpId = Number(symbol);
|
|
@@ -926,10 +933,16 @@ export default class PerpetualDataHandler {
|
|
|
926
933
|
let traderState = await _proxyContract.getTraderState(
|
|
927
934
|
perpId,
|
|
928
935
|
traderAddr,
|
|
929
|
-
|
|
936
|
+
[_pxInfo.ema, _pxInfo.s3 ?? 0].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
930
937
|
overrides || {}
|
|
931
938
|
);
|
|
932
|
-
return PerpetualDataHandler.buildMarginAccountFromState(
|
|
939
|
+
return PerpetualDataHandler.buildMarginAccountFromState(
|
|
940
|
+
symbol,
|
|
941
|
+
traderState,
|
|
942
|
+
symbolToPerpStaticInfo,
|
|
943
|
+
_pxInfo,
|
|
944
|
+
isPredMkt
|
|
945
|
+
);
|
|
933
946
|
}
|
|
934
947
|
|
|
935
948
|
/**
|
|
@@ -1093,7 +1106,7 @@ export default class PerpetualDataHandler {
|
|
|
1093
1106
|
* @param symbolToPerpStaticInfo Symbol to perp static info mapping
|
|
1094
1107
|
* @param _multicall Multicall3 contract instance
|
|
1095
1108
|
* @param _proxyContract Proxy contract instance
|
|
1096
|
-
* @param
|
|
1109
|
+
* @param _pxInfo List of price info
|
|
1097
1110
|
* @param overrides Optional eth_call overrides
|
|
1098
1111
|
* @returns List of margin accounts
|
|
1099
1112
|
*/
|
|
@@ -1103,15 +1116,16 @@ export default class PerpetualDataHandler {
|
|
|
1103
1116
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1104
1117
|
_multicall: Multicall3,
|
|
1105
1118
|
_proxyContract: Contract,
|
|
1106
|
-
|
|
1119
|
+
_pxInfo: IdxPriceInfo[],
|
|
1120
|
+
isPredMkt: boolean[],
|
|
1107
1121
|
overrides?: Overrides
|
|
1108
1122
|
): Promise<MarginAccount[]> {
|
|
1109
1123
|
if (
|
|
1110
1124
|
traderAddrs.length != symbols.length ||
|
|
1111
|
-
traderAddrs.length !=
|
|
1112
|
-
symbols.length !=
|
|
1125
|
+
traderAddrs.length != _pxInfo.length ||
|
|
1126
|
+
symbols.length != _pxInfo.length
|
|
1113
1127
|
) {
|
|
1114
|
-
throw new Error("traderAddr, symbol and
|
|
1128
|
+
throw new Error("traderAddr, symbol and _pxInfo should all have the same length");
|
|
1115
1129
|
}
|
|
1116
1130
|
const proxyCalls: Multicall3.Call3Struct[] = traderAddrs.map((_addr, i) => ({
|
|
1117
1131
|
target: _proxyContract.target,
|
|
@@ -1119,7 +1133,7 @@ export default class PerpetualDataHandler {
|
|
|
1119
1133
|
callData: _proxyContract.interface.encodeFunctionData("getTraderState", [
|
|
1120
1134
|
PerpetualDataHandler.symbolToPerpetualId(symbols[i], symbolToPerpStaticInfo),
|
|
1121
1135
|
_addr,
|
|
1122
|
-
|
|
1136
|
+
[_pxInfo[i].ema, _pxInfo[i].s3 ?? 0].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
1123
1137
|
]),
|
|
1124
1138
|
}));
|
|
1125
1139
|
const encodedResults = await _multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
@@ -1128,10 +1142,13 @@ export default class PerpetualDataHandler {
|
|
|
1128
1142
|
return _proxyContract.interface.decodeFunctionResult("getTraderState", returnData)[0];
|
|
1129
1143
|
});
|
|
1130
1144
|
return traderStates.map((traderState, i) =>
|
|
1131
|
-
PerpetualDataHandler.buildMarginAccountFromState(
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1145
|
+
PerpetualDataHandler.buildMarginAccountFromState(
|
|
1146
|
+
symbols[i],
|
|
1147
|
+
traderState,
|
|
1148
|
+
symbolToPerpStaticInfo,
|
|
1149
|
+
_pxInfo[i],
|
|
1150
|
+
isPredMkt[i]
|
|
1151
|
+
)
|
|
1135
1152
|
);
|
|
1136
1153
|
}
|
|
1137
1154
|
|
|
@@ -1139,8 +1156,10 @@ export default class PerpetualDataHandler {
|
|
|
1139
1156
|
symbol: string,
|
|
1140
1157
|
tradeAmount: number,
|
|
1141
1158
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1142
|
-
_proxyContract:
|
|
1159
|
+
_proxyContract: IPerpetualManager,
|
|
1143
1160
|
indexPrices: [number, number],
|
|
1161
|
+
conf: bigint,
|
|
1162
|
+
params: bigint,
|
|
1144
1163
|
overrides?: Overrides
|
|
1145
1164
|
): Promise<number> {
|
|
1146
1165
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
@@ -1149,40 +1168,57 @@ export default class PerpetualDataHandler {
|
|
|
1149
1168
|
perpId,
|
|
1150
1169
|
floatToABK64x64(tradeAmount),
|
|
1151
1170
|
fIndexPrices as [bigint, bigint],
|
|
1171
|
+
conf,
|
|
1172
|
+
params,
|
|
1152
1173
|
overrides || {}
|
|
1153
1174
|
);
|
|
1154
1175
|
return ABK64x64ToFloat(fPrice);
|
|
1155
1176
|
}
|
|
1156
1177
|
|
|
1178
|
+
/**
|
|
1179
|
+
*
|
|
1180
|
+
* @param symbol perpetual symbol of the form BTC-USDC-USDC
|
|
1181
|
+
* @param symbolToPerpStaticInfo mapping
|
|
1182
|
+
* @param _proxyContract contract instance
|
|
1183
|
+
* @param indexPrices IdxPriceInfo
|
|
1184
|
+
* @param isPredMkt true if prediction market perpetual
|
|
1185
|
+
* @param overrides
|
|
1186
|
+
* @returns mark price
|
|
1187
|
+
*/
|
|
1157
1188
|
protected static async _queryPerpetualMarkPrice(
|
|
1158
1189
|
symbol: string,
|
|
1159
1190
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1160
|
-
_proxyContract:
|
|
1161
|
-
indexPrices:
|
|
1191
|
+
_proxyContract: IPerpetualManager,
|
|
1192
|
+
indexPrices: IdxPriceInfo,
|
|
1193
|
+
isPredMkt: boolean,
|
|
1162
1194
|
overrides?: Overrides
|
|
1163
1195
|
): Promise<number> {
|
|
1164
1196
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1165
|
-
let [S2, S3] = indexPrices.map((x) =>
|
|
1197
|
+
let [S2, S3] = [indexPrices.s2, indexPrices.s3].map((x) =>
|
|
1198
|
+
floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)
|
|
1199
|
+
);
|
|
1166
1200
|
let ammState = await _proxyContract.getAMMState(perpId, [S2, S3], overrides || {});
|
|
1167
1201
|
// ammState[6] == S2 == indexPrices[0] up to rounding errors (indexPrices is most accurate)
|
|
1168
|
-
|
|
1202
|
+
if (isPredMkt) {
|
|
1203
|
+
return indexPrices.ema + ABK64x64ToFloat(ammState[8]);
|
|
1204
|
+
}
|
|
1205
|
+
return indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
1169
1206
|
}
|
|
1170
1207
|
|
|
1171
1208
|
protected static async _queryPerpetualState(
|
|
1172
1209
|
symbol: string,
|
|
1173
1210
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1174
|
-
_proxyContract:
|
|
1211
|
+
_proxyContract: IPerpetualManager,
|
|
1175
1212
|
_multicall: Multicall3,
|
|
1176
|
-
indexPrices:
|
|
1213
|
+
indexPrices: IdxPriceInfo,
|
|
1177
1214
|
overrides?: Overrides
|
|
1178
1215
|
): Promise<PerpetualState> {
|
|
1179
1216
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1180
1217
|
let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
|
|
1181
|
-
let [S2, S3] = [indexPrices[0], indexPrices[1]];
|
|
1182
1218
|
if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1183
|
-
|
|
1219
|
+
indexPrices.s3 = indexPrices.s2;
|
|
1184
1220
|
} else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
|
|
1185
|
-
|
|
1221
|
+
indexPrices.s3 = 1;
|
|
1186
1222
|
}
|
|
1187
1223
|
// multicall
|
|
1188
1224
|
const proxyCalls: Multicall3.Call3Struct[] = [
|
|
@@ -1191,7 +1227,7 @@ export default class PerpetualDataHandler {
|
|
|
1191
1227
|
allowFailure: false,
|
|
1192
1228
|
callData: _proxyContract.interface.encodeFunctionData("getAMMState", [
|
|
1193
1229
|
perpId,
|
|
1194
|
-
[
|
|
1230
|
+
[indexPrices.s2, indexPrices.s3 ?? 0].map(floatToABK64x64) as [bigint, bigint],
|
|
1195
1231
|
]),
|
|
1196
1232
|
},
|
|
1197
1233
|
{
|
|
@@ -1234,31 +1270,40 @@ export default class PerpetualDataHandler {
|
|
|
1234
1270
|
symbol: string,
|
|
1235
1271
|
ammState: bigint[],
|
|
1236
1272
|
longShort: [bigint, bigint],
|
|
1237
|
-
indexPrices:
|
|
1273
|
+
indexPrices: IdxPriceInfo,
|
|
1238
1274
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
|
|
1239
1275
|
) {
|
|
1240
1276
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1241
1277
|
let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
|
|
1242
1278
|
let ccy = symbol.split("-");
|
|
1243
|
-
let [S2, S3] = [indexPrices
|
|
1279
|
+
let [S2, S3] = [indexPrices.s2, indexPrices.s3];
|
|
1244
1280
|
if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1245
1281
|
S3 = S2;
|
|
1246
1282
|
} else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
|
|
1247
1283
|
S3 = 1;
|
|
1248
1284
|
}
|
|
1249
|
-
|
|
1285
|
+
const isPred = PerpetualDataHandler.isPredictionMarketStatic(staticInfo);
|
|
1286
|
+
let markPrice: number;
|
|
1287
|
+
if (isPred) {
|
|
1288
|
+
// ema + premium
|
|
1289
|
+
markPrice = indexPrices.ema + ABK64x64ToFloat(ammState[8]);
|
|
1290
|
+
} else {
|
|
1291
|
+
// S2 * (1+premium)
|
|
1292
|
+
markPrice = indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
1293
|
+
}
|
|
1250
1294
|
let state: PerpetualState = {
|
|
1251
1295
|
id: perpId,
|
|
1252
1296
|
state: PERP_STATE_STR[Number(ammState[13])],
|
|
1253
1297
|
baseCurrency: ccy[0],
|
|
1254
1298
|
quoteCurrency: ccy[1],
|
|
1255
1299
|
indexPrice: S2,
|
|
1256
|
-
collToQuoteIndexPrice: S3,
|
|
1300
|
+
collToQuoteIndexPrice: S3 ?? (ccy[0] === ccy[1] ? S2 : 1),
|
|
1301
|
+
markPremium: ABK64x64ToFloat(ammState[8]),
|
|
1257
1302
|
markPrice: markPrice,
|
|
1258
1303
|
midPrice: ABK64x64ToFloat(ammState[10]),
|
|
1259
1304
|
currentFundingRateBps: ABK64x64ToFloat(ammState[14]) * 1e4,
|
|
1260
1305
|
openInterestBC: ABK64x64ToFloat(ammState[11]),
|
|
1261
|
-
isMarketClosed: indexPrices
|
|
1306
|
+
isMarketClosed: indexPrices.s2MktClosed || (indexPrices.s3MktClosed !== undefined && indexPrices.s3MktClosed),
|
|
1262
1307
|
longBC: ABK64x64ToFloat(longShort[0]),
|
|
1263
1308
|
shortBC: ABK64x64ToFloat(longShort[1]),
|
|
1264
1309
|
};
|
|
@@ -1277,7 +1322,8 @@ export default class PerpetualDataHandler {
|
|
|
1277
1322
|
symbol: string,
|
|
1278
1323
|
traderState: bigint[],
|
|
1279
1324
|
S2: number,
|
|
1280
|
-
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo
|
|
1325
|
+
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1326
|
+
isPredMarket: boolean
|
|
1281
1327
|
): [number, number, number, number, number] {
|
|
1282
1328
|
const idx_availableCashCC = 2;
|
|
1283
1329
|
const idx_cash = 3;
|
|
@@ -1292,14 +1338,22 @@ export default class PerpetualDataHandler {
|
|
|
1292
1338
|
if (perpInfo == undefined) {
|
|
1293
1339
|
throw new Error(`no info for perpetual ${symbol}`);
|
|
1294
1340
|
}
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1341
|
+
const tau = perpInfo.maintenanceMarginRate;
|
|
1342
|
+
const lockedInValueQC = ABK64x64ToFloat(traderState[idx_locked_in]);
|
|
1343
|
+
const position = ABK64x64ToFloat(traderState[idx_notional]);
|
|
1344
|
+
const cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
|
|
1345
|
+
const Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
|
|
1346
|
+
const unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC] - traderState[idx_cash]);
|
|
1301
1347
|
let unpaidFunding = unpaidFundingCC;
|
|
1302
1348
|
|
|
1349
|
+
if (isPredMarket) {
|
|
1350
|
+
const S2Liq = pmFindLiquidationPrice(position, S3Liq, lockedInValueQC, cashCC, tau, S2);
|
|
1351
|
+
let pnl = position * Sm - lockedInValueQC + unpaidFunding / S3Liq;
|
|
1352
|
+
// liquidation margin rate
|
|
1353
|
+
const tauLiq = pmMaintenanceMarginRate(position, S2Liq, tau);
|
|
1354
|
+
return [S2Liq, S3Liq, tauLiq, pnl, unpaidFundingCC];
|
|
1355
|
+
}
|
|
1356
|
+
// regular perpetuals:
|
|
1303
1357
|
if (perpInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1304
1358
|
S2Liq = calculateLiquidationPriceCollateralBase(lockedInValueQC, position, cashCC, tau);
|
|
1305
1359
|
S3Liq = S2Liq;
|
|
@@ -1397,7 +1451,7 @@ export default class PerpetualDataHandler {
|
|
|
1397
1451
|
}
|
|
1398
1452
|
// adjust prices for market type
|
|
1399
1453
|
const sInfo = symbolToPerpInfoMap.get(symbol)!;
|
|
1400
|
-
if (PerpetualDataHandler.
|
|
1454
|
+
if (PerpetualDataHandler.isPredictionMarketStatic(sInfo)) {
|
|
1401
1455
|
limitPrice = limitPrice !== undefined && limitPrice !== 0 ? priceToProb(limitPrice) : limitPrice;
|
|
1402
1456
|
stopPrice = stopPrice !== undefined && stopPrice !== 0 ? priceToProb(stopPrice) : stopPrice;
|
|
1403
1457
|
}
|
|
@@ -1416,10 +1470,10 @@ export default class PerpetualDataHandler {
|
|
|
1416
1470
|
leverage: Number(order.leverageTDR) / 100,
|
|
1417
1471
|
deadline: Number(order.iDeadline),
|
|
1418
1472
|
executionTimestamp: Number(order.executionTimestamp),
|
|
1419
|
-
submittedTimestamp:
|
|
1473
|
+
submittedTimestamp: "submittedTimestamp" in order ? Number(order.submittedTimestamp) : undefined,
|
|
1420
1474
|
parentChildOrderIds:
|
|
1421
|
-
|
|
1422
|
-
? [order
|
|
1475
|
+
"parentChildDigest1" && "parentChildDigest2" in order
|
|
1476
|
+
? [order.parentChildDigest1.toString(), order.parentChildDigest2.toString()]
|
|
1423
1477
|
: undefined,
|
|
1424
1478
|
};
|
|
1425
1479
|
return userOrder;
|
|
@@ -1450,7 +1504,7 @@ export default class PerpetualDataHandler {
|
|
|
1450
1504
|
} else {
|
|
1451
1505
|
throw Error(`invalid side in order spec, use ${BUY_SIDE} or ${SELL_SIDE}`);
|
|
1452
1506
|
}
|
|
1453
|
-
const isPred = PerpetualDataHandler.
|
|
1507
|
+
const isPred = PerpetualDataHandler.isPredictionMarketStatic(perpStaticInfo.get(order.symbol)!);
|
|
1454
1508
|
let fLimitPrice: bigint;
|
|
1455
1509
|
if (order.limitPrice == undefined) {
|
|
1456
1510
|
// we need to set the limit price to infinity or zero for
|
|
@@ -1960,7 +2014,7 @@ export default class PerpetualDataHandler {
|
|
|
1960
2014
|
if (staticInfo == undefined) {
|
|
1961
2015
|
throw new Error(`Perpetual with symbol ${symbol} not found. Check symbol or use createProxyInstance().`);
|
|
1962
2016
|
}
|
|
1963
|
-
return PerpetualDataHandler.
|
|
2017
|
+
return PerpetualDataHandler.isPredictionMarketStatic(staticInfo);
|
|
1964
2018
|
}
|
|
1965
2019
|
|
|
1966
2020
|
/**
|
|
@@ -1968,8 +2022,7 @@ export default class PerpetualDataHandler {
|
|
|
1968
2022
|
* @param staticInfo Perpetual static info
|
|
1969
2023
|
* @returns True if this is a prediction market
|
|
1970
2024
|
*/
|
|
1971
|
-
public static
|
|
1972
|
-
// return true; // for testing
|
|
2025
|
+
public static isPredictionMarketStatic(staticInfo: PerpetualStaticInfo) {
|
|
1973
2026
|
return containsFlag(staticInfo.perpFlags, MASK_PREDICTION_MARKET);
|
|
1974
2027
|
}
|
|
1975
2028
|
}
|