@d8x/perpetuals-sdk 2.0.13-alpha → 2.1.0-alpha2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/abi/IPerpetualManager.json +124 -3
- package/dist/cjs/abi/OracleFactory.json +94 -25
- package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
- package/dist/cjs/brokerTool.d.ts +5 -1
- package/dist/cjs/brokerTool.js +14 -1
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/priceFeedConfig.json +0 -18
- package/dist/cjs/contracts/IPerpetualManager.d.ts +74 -10
- package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
- package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +124 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/cjs/d8XMath.d.ts +44 -1
- package/dist/cjs/d8XMath.js +236 -3
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/liquidatorTool.d.ts +1 -0
- package/dist/cjs/liquidatorTool.js +24 -7
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/marketData.d.ts +42 -20
- package/dist/cjs/marketData.js +261 -188
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +24 -2
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderExecutorTool.d.ts +3 -3
- package/dist/cjs/orderExecutorTool.js +38 -13
- package/dist/cjs/orderExecutorTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +22 -12
- package/dist/cjs/perpetualDataHandler.js +59 -44
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.d.ts +1 -1
- package/dist/cjs/perpetualEventHandler.js +6 -7
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/polyMktsPxFeed.d.ts +6 -4
- package/dist/cjs/polyMktsPxFeed.js +24 -3
- package/dist/cjs/polyMktsPxFeed.js.map +1 -1
- package/dist/cjs/priceFeeds.d.ts +6 -7
- package/dist/cjs/priceFeeds.js +36 -14
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/abi/IPerpetualManager.json +124 -3
- package/dist/esm/abi/OracleFactory.json +94 -25
- package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
- package/dist/esm/brokerTool.d.ts +5 -1
- package/dist/esm/brokerTool.js +15 -2
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/priceFeedConfig.json +0 -18
- package/dist/esm/contracts/IPerpetualManager.d.ts +74 -10
- package/dist/esm/contracts/OracleFactory.d.ts +69 -20
- package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +124 -3
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
- package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
- package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +44 -1
- package/dist/esm/d8XMath.js +229 -2
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.d.ts +1 -0
- package/dist/esm/liquidatorTool.js +25 -8
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/marketData.d.ts +42 -20
- package/dist/esm/marketData.js +263 -190
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +24 -2
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderExecutorTool.d.ts +3 -3
- package/dist/esm/orderExecutorTool.js +38 -13
- package/dist/esm/orderExecutorTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +22 -12
- package/dist/esm/perpetualDataHandler.js +60 -45
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.d.ts +1 -1
- package/dist/esm/perpetualEventHandler.js +6 -7
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/polyMktsPxFeed.d.ts +6 -4
- package/dist/esm/polyMktsPxFeed.js +24 -3
- package/dist/esm/polyMktsPxFeed.js.map +1 -1
- package/dist/esm/priceFeeds.d.ts +6 -7
- package/dist/esm/priceFeeds.js +36 -14
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
- package/src/abi/IPerpetualManager.json +124 -3
- package/src/abi/OracleFactory.json +523 -454
- package/src/abi/PerpetualManagerProxy.json +1596 -1386
- package/src/brokerTool.ts +16 -2
- package/src/config/priceFeedConfig.json +0 -18
- package/src/contracts/IPerpetualManager.ts +107 -7
- package/src/contracts/OracleFactory.ts +100 -26
- package/src/contracts/PerpetualManagerProxy.ts +192 -3
- package/src/contracts/factories/IPerpetualManager__factory.ts +124 -3
- package/src/contracts/factories/OracleFactory__factory.ts +94 -25
- package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
- package/src/d8XMath.ts +304 -2
- package/src/liquidatorTool.ts +29 -14
- package/src/marketData.ts +415 -238
- package/src/nodeSDKTypes.ts +30 -2
- package/src/orderExecutorTool.ts +48 -20
- package/src/perpetualDataHandler.ts +87 -45
- package/src/perpetualEventHandler.ts +6 -7
- package/src/polyMktsPxFeed.ts +30 -5
- package/src/priceFeeds.ts +41 -17
- package/src/version.ts +1 -1
- package/dist/cjs/abi/BeaconProxy.json +0 -71
- package/dist/cjs/abi/Maintainer.json +0 -774
- package/dist/cjs/abi/MockToken.json +0 -347
- package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
- package/dist/cjs/abi/WeETH.json +0 -310
- package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
- package/dist/cjs/contracts/BeaconProxy.js +0 -3
- package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
- package/dist/cjs/contracts/Maintainer.d.ts +0 -799
- package/dist/cjs/contracts/Maintainer.js +0 -3
- package/dist/cjs/contracts/Maintainer.js.map +0 -1
- package/dist/cjs/contracts/MockToken.d.ts +0 -263
- package/dist/cjs/contracts/MockToken.js +0 -3
- package/dist/cjs/contracts/MockToken.js.map +0 -1
- package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
- package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/cjs/contracts/WeETH.d.ts +0 -503
- package/dist/cjs/contracts/WeETH.js +0 -3
- package/dist/cjs/contracts/WeETH.js.map +0 -1
- package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
- package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
- package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
- package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/factories/lean0/index.js +0 -15
- package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
- package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
- package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
- package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/cjs/contracts/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/lean0/index.js +0 -3
- package/dist/cjs/contracts/lean0/index.js.map +0 -1
- package/dist/esm/abi/BeaconProxy.json +0 -71
- package/dist/esm/abi/Maintainer.json +0 -774
- package/dist/esm/abi/MockToken.json +0 -347
- package/dist/esm/abi/UUPSUpgradeable.json +0 -104
- package/dist/esm/abi/WeETH.json +0 -310
- package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
- package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
- package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
- package/dist/esm/abi/lean0/ShareToken.json +0 -438
- package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
- package/dist/esm/contracts/BeaconProxy.js +0 -2
- package/dist/esm/contracts/BeaconProxy.js.map +0 -1
- package/dist/esm/contracts/Maintainer.d.ts +0 -799
- package/dist/esm/contracts/Maintainer.js +0 -2
- package/dist/esm/contracts/Maintainer.js.map +0 -1
- package/dist/esm/contracts/MockToken.d.ts +0 -263
- package/dist/esm/contracts/MockToken.js +0 -2
- package/dist/esm/contracts/MockToken.js.map +0 -1
- package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
- package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/esm/contracts/WeETH.d.ts +0 -503
- package/dist/esm/contracts/WeETH.js +0 -2
- package/dist/esm/contracts/WeETH.js.map +0 -1
- package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
- package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
- package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
- package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
- package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/factories/lean0/index.js +0 -8
- package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
- package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
- package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/esm/contracts/lean0/ShareToken.js +0 -2
- package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/esm/contracts/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/lean0/index.js +0 -2
- package/dist/esm/contracts/lean0/index.js.map +0 -1
package/src/nodeSDKTypes.ts
CHANGED
|
@@ -146,7 +146,7 @@ export interface PerpetualState {
|
|
|
146
146
|
quoteCurrency: string;
|
|
147
147
|
indexPrice: number;
|
|
148
148
|
collToQuoteIndexPrice: number;
|
|
149
|
-
|
|
149
|
+
markPremium: number;
|
|
150
150
|
midPrice: number;
|
|
151
151
|
currentFundingRateBps: number;
|
|
152
152
|
openInterestBC: number;
|
|
@@ -306,7 +306,7 @@ export interface PriceFeedConfig {
|
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
export interface PriceFeedEndpointsItem {
|
|
309
|
-
type: string | "odin" | "pyth" | "onchain";
|
|
309
|
+
type: string | "odin" | "pyth" | "onchain" | "polymarket";
|
|
310
310
|
// Read only endpoints. Used by default.
|
|
311
311
|
endpoints: string[];
|
|
312
312
|
// Price feed endpoints which are used for fetching prices which will be
|
|
@@ -337,6 +337,14 @@ export interface PriceFeedFormat {
|
|
|
337
337
|
publish_time: number;
|
|
338
338
|
}
|
|
339
339
|
|
|
340
|
+
// json version of PriceFeedFormat
|
|
341
|
+
export interface PriceFeedJson {
|
|
342
|
+
conf: string;
|
|
343
|
+
expo: number;
|
|
344
|
+
price: string;
|
|
345
|
+
publish_time: number;
|
|
346
|
+
}
|
|
347
|
+
|
|
340
348
|
export interface PythV2MetaData {
|
|
341
349
|
slot: number;
|
|
342
350
|
proof_available_time: number;
|
|
@@ -526,3 +534,23 @@ export const referralTypes = {
|
|
|
526
534
|
{ name: "CreatedOn", type: "uint256" },
|
|
527
535
|
],
|
|
528
536
|
};
|
|
537
|
+
|
|
538
|
+
// Price information that can be used for
|
|
539
|
+
// prediction markets and regular markets
|
|
540
|
+
export interface IdxPriceInfo {
|
|
541
|
+
s2: number;
|
|
542
|
+
s3: number;
|
|
543
|
+
ema: number;
|
|
544
|
+
s2MktClosed: boolean;
|
|
545
|
+
s3MktClosed: boolean;
|
|
546
|
+
conf: bigint;
|
|
547
|
+
predMktCLOBParams: bigint;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
export interface PredMktPriceInfo {
|
|
551
|
+
s2: number;
|
|
552
|
+
ema: number;
|
|
553
|
+
s2MktClosed: boolean;
|
|
554
|
+
conf: bigint;
|
|
555
|
+
predMktCLOBParams: bigint;
|
|
556
|
+
}
|
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
|
|
|
@@ -59,6 +59,8 @@ import {
|
|
|
59
59
|
dec18ToFloat,
|
|
60
60
|
priceToProb,
|
|
61
61
|
probToPrice,
|
|
62
|
+
pmFindLiquidationPrice,
|
|
63
|
+
pmMaintenanceMarginRate,
|
|
62
64
|
} from "./d8XMath";
|
|
63
65
|
import {
|
|
64
66
|
TokenOverride,
|
|
@@ -76,6 +78,7 @@ import {
|
|
|
76
78
|
LiquidityPoolData,
|
|
77
79
|
SettlementConfig,
|
|
78
80
|
SettlementCcyItem,
|
|
81
|
+
IdxPriceInfo,
|
|
79
82
|
} from "./nodeSDKTypes";
|
|
80
83
|
import PriceFeeds from "./priceFeeds";
|
|
81
84
|
import {
|
|
@@ -855,7 +858,8 @@ export default class PerpetualDataHandler {
|
|
|
855
858
|
symbol: string,
|
|
856
859
|
traderState: bigint[],
|
|
857
860
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
858
|
-
|
|
861
|
+
pxInfo: IdxPriceInfo,
|
|
862
|
+
isPredMkt: boolean
|
|
859
863
|
): MarginAccount {
|
|
860
864
|
const idx_cash = 3;
|
|
861
865
|
const idx_notional = 4;
|
|
@@ -877,8 +881,9 @@ export default class PerpetualDataHandler {
|
|
|
877
881
|
[S2Liq, S3Liq, tau, pnl, unpaidFundingCC] = PerpetualDataHandler._calculateLiquidationPrice(
|
|
878
882
|
symbol,
|
|
879
883
|
traderState,
|
|
880
|
-
|
|
881
|
-
symbolToPerpStaticInfo
|
|
884
|
+
pxInfo.s2,
|
|
885
|
+
symbolToPerpStaticInfo,
|
|
886
|
+
isPredMkt
|
|
882
887
|
);
|
|
883
888
|
fLockedIn = traderState[idx_locked_in];
|
|
884
889
|
side = traderState[idx_notional] > 0n ? BUY_SIDE : SELL_SIDE;
|
|
@@ -907,7 +912,7 @@ export default class PerpetualDataHandler {
|
|
|
907
912
|
* @param symbol Perpetual symbol
|
|
908
913
|
* @param symbolToPerpStaticInfo Symbol to perp static info mapping
|
|
909
914
|
* @param _proxyContract Proxy contract instance
|
|
910
|
-
* @param
|
|
915
|
+
* @param _pxInfo index price info
|
|
911
916
|
* @param overrides Optional overrides for eth_call
|
|
912
917
|
* @returns A Margin account
|
|
913
918
|
*/
|
|
@@ -916,7 +921,8 @@ export default class PerpetualDataHandler {
|
|
|
916
921
|
symbol: string,
|
|
917
922
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
918
923
|
_proxyContract: Contract,
|
|
919
|
-
|
|
924
|
+
_pxInfo: IdxPriceInfo,
|
|
925
|
+
isPredMkt: boolean,
|
|
920
926
|
overrides?: Overrides
|
|
921
927
|
): Promise<MarginAccount> {
|
|
922
928
|
let perpId = Number(symbol);
|
|
@@ -926,10 +932,16 @@ export default class PerpetualDataHandler {
|
|
|
926
932
|
let traderState = await _proxyContract.getTraderState(
|
|
927
933
|
perpId,
|
|
928
934
|
traderAddr,
|
|
929
|
-
|
|
935
|
+
[_pxInfo.ema, _pxInfo.s3].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
930
936
|
overrides || {}
|
|
931
937
|
);
|
|
932
|
-
return PerpetualDataHandler.buildMarginAccountFromState(
|
|
938
|
+
return PerpetualDataHandler.buildMarginAccountFromState(
|
|
939
|
+
symbol,
|
|
940
|
+
traderState,
|
|
941
|
+
symbolToPerpStaticInfo,
|
|
942
|
+
_pxInfo,
|
|
943
|
+
isPredMkt
|
|
944
|
+
);
|
|
933
945
|
}
|
|
934
946
|
|
|
935
947
|
/**
|
|
@@ -1093,7 +1105,7 @@ export default class PerpetualDataHandler {
|
|
|
1093
1105
|
* @param symbolToPerpStaticInfo Symbol to perp static info mapping
|
|
1094
1106
|
* @param _multicall Multicall3 contract instance
|
|
1095
1107
|
* @param _proxyContract Proxy contract instance
|
|
1096
|
-
* @param
|
|
1108
|
+
* @param _pxInfo List of price info
|
|
1097
1109
|
* @param overrides Optional eth_call overrides
|
|
1098
1110
|
* @returns List of margin accounts
|
|
1099
1111
|
*/
|
|
@@ -1103,15 +1115,16 @@ export default class PerpetualDataHandler {
|
|
|
1103
1115
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1104
1116
|
_multicall: Multicall3,
|
|
1105
1117
|
_proxyContract: Contract,
|
|
1106
|
-
|
|
1118
|
+
_pxInfo: IdxPriceInfo[],
|
|
1119
|
+
isPredMkt: boolean[],
|
|
1107
1120
|
overrides?: Overrides
|
|
1108
1121
|
): Promise<MarginAccount[]> {
|
|
1109
1122
|
if (
|
|
1110
1123
|
traderAddrs.length != symbols.length ||
|
|
1111
|
-
traderAddrs.length !=
|
|
1112
|
-
symbols.length !=
|
|
1124
|
+
traderAddrs.length != _pxInfo.length ||
|
|
1125
|
+
symbols.length != _pxInfo.length
|
|
1113
1126
|
) {
|
|
1114
|
-
throw new Error("traderAddr, symbol and
|
|
1127
|
+
throw new Error("traderAddr, symbol and _pxInfo should all have the same length");
|
|
1115
1128
|
}
|
|
1116
1129
|
const proxyCalls: Multicall3.Call3Struct[] = traderAddrs.map((_addr, i) => ({
|
|
1117
1130
|
target: _proxyContract.target,
|
|
@@ -1119,7 +1132,7 @@ export default class PerpetualDataHandler {
|
|
|
1119
1132
|
callData: _proxyContract.interface.encodeFunctionData("getTraderState", [
|
|
1120
1133
|
PerpetualDataHandler.symbolToPerpetualId(symbols[i], symbolToPerpStaticInfo),
|
|
1121
1134
|
_addr,
|
|
1122
|
-
|
|
1135
|
+
[_pxInfo[i].ema, _pxInfo[i].s3].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
1123
1136
|
]),
|
|
1124
1137
|
}));
|
|
1125
1138
|
const encodedResults = await _multicall.aggregate3.staticCall(proxyCalls, overrides || {});
|
|
@@ -1128,10 +1141,13 @@ export default class PerpetualDataHandler {
|
|
|
1128
1141
|
return _proxyContract.interface.decodeFunctionResult("getTraderState", returnData)[0];
|
|
1129
1142
|
});
|
|
1130
1143
|
return traderStates.map((traderState, i) =>
|
|
1131
|
-
PerpetualDataHandler.buildMarginAccountFromState(
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1144
|
+
PerpetualDataHandler.buildMarginAccountFromState(
|
|
1145
|
+
symbols[i],
|
|
1146
|
+
traderState,
|
|
1147
|
+
symbolToPerpStaticInfo,
|
|
1148
|
+
_pxInfo[i],
|
|
1149
|
+
isPredMkt[i]
|
|
1150
|
+
)
|
|
1135
1151
|
);
|
|
1136
1152
|
}
|
|
1137
1153
|
|
|
@@ -1141,6 +1157,8 @@ export default class PerpetualDataHandler {
|
|
|
1141
1157
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1142
1158
|
_proxyContract: Contract,
|
|
1143
1159
|
indexPrices: [number, number],
|
|
1160
|
+
conf: bigint,
|
|
1161
|
+
params: bigint,
|
|
1144
1162
|
overrides?: Overrides
|
|
1145
1163
|
): Promise<number> {
|
|
1146
1164
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
@@ -1149,23 +1167,41 @@ export default class PerpetualDataHandler {
|
|
|
1149
1167
|
perpId,
|
|
1150
1168
|
floatToABK64x64(tradeAmount),
|
|
1151
1169
|
fIndexPrices as [bigint, bigint],
|
|
1170
|
+
conf,
|
|
1171
|
+
params,
|
|
1152
1172
|
overrides || {}
|
|
1153
1173
|
);
|
|
1154
1174
|
return ABK64x64ToFloat(fPrice);
|
|
1155
1175
|
}
|
|
1156
1176
|
|
|
1177
|
+
/**
|
|
1178
|
+
*
|
|
1179
|
+
* @param symbol perpetual symbol of the form BTC-USDC-USDC
|
|
1180
|
+
* @param symbolToPerpStaticInfo mapping
|
|
1181
|
+
* @param _proxyContract contract instance
|
|
1182
|
+
* @param indexPrices IdxPriceInfo
|
|
1183
|
+
* @param isPredMkt true if prediction market perpetual
|
|
1184
|
+
* @param overrides
|
|
1185
|
+
* @returns mark price
|
|
1186
|
+
*/
|
|
1157
1187
|
protected static async _queryPerpetualMarkPrice(
|
|
1158
1188
|
symbol: string,
|
|
1159
1189
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1160
1190
|
_proxyContract: Contract,
|
|
1161
|
-
indexPrices:
|
|
1191
|
+
indexPrices: IdxPriceInfo,
|
|
1192
|
+
isPredMkt: boolean,
|
|
1162
1193
|
overrides?: Overrides
|
|
1163
1194
|
): Promise<number> {
|
|
1164
1195
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1165
|
-
let [S2, S3] = indexPrices.map((x) =>
|
|
1196
|
+
let [S2, S3] = [indexPrices.s2, indexPrices.s3].map((x) =>
|
|
1197
|
+
floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)
|
|
1198
|
+
);
|
|
1166
1199
|
let ammState = await _proxyContract.getAMMState(perpId, [S2, S3], overrides || {});
|
|
1167
1200
|
// ammState[6] == S2 == indexPrices[0] up to rounding errors (indexPrices is most accurate)
|
|
1168
|
-
|
|
1201
|
+
if (isPredMkt) {
|
|
1202
|
+
return indexPrices.ema + ABK64x64ToFloat(ammState[8]);
|
|
1203
|
+
}
|
|
1204
|
+
return indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
1169
1205
|
}
|
|
1170
1206
|
|
|
1171
1207
|
protected static async _queryPerpetualState(
|
|
@@ -1173,16 +1209,15 @@ export default class PerpetualDataHandler {
|
|
|
1173
1209
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1174
1210
|
_proxyContract: Contract,
|
|
1175
1211
|
_multicall: Multicall3,
|
|
1176
|
-
indexPrices:
|
|
1212
|
+
indexPrices: IdxPriceInfo,
|
|
1177
1213
|
overrides?: Overrides
|
|
1178
1214
|
): Promise<PerpetualState> {
|
|
1179
1215
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1180
1216
|
let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
|
|
1181
|
-
let [S2, S3] = [indexPrices[0], indexPrices[1]];
|
|
1182
1217
|
if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1183
|
-
|
|
1218
|
+
indexPrices.s3 = indexPrices.s2;
|
|
1184
1219
|
} else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
|
|
1185
|
-
|
|
1220
|
+
indexPrices.s3 = 1;
|
|
1186
1221
|
}
|
|
1187
1222
|
// multicall
|
|
1188
1223
|
const proxyCalls: Multicall3.Call3Struct[] = [
|
|
@@ -1191,7 +1226,7 @@ export default class PerpetualDataHandler {
|
|
|
1191
1226
|
allowFailure: false,
|
|
1192
1227
|
callData: _proxyContract.interface.encodeFunctionData("getAMMState", [
|
|
1193
1228
|
perpId,
|
|
1194
|
-
[
|
|
1229
|
+
[indexPrices.s2, indexPrices.s3].map(floatToABK64x64) as [bigint, bigint],
|
|
1195
1230
|
]),
|
|
1196
1231
|
},
|
|
1197
1232
|
{
|
|
@@ -1234,19 +1269,18 @@ export default class PerpetualDataHandler {
|
|
|
1234
1269
|
symbol: string,
|
|
1235
1270
|
ammState: bigint[],
|
|
1236
1271
|
longShort: [bigint, bigint],
|
|
1237
|
-
indexPrices:
|
|
1272
|
+
indexPrices: IdxPriceInfo,
|
|
1238
1273
|
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
|
|
1239
1274
|
) {
|
|
1240
1275
|
let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
|
|
1241
1276
|
let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
|
|
1242
1277
|
let ccy = symbol.split("-");
|
|
1243
|
-
let [S2, S3] = [indexPrices
|
|
1278
|
+
let [S2, S3] = [indexPrices.s2, indexPrices.s3];
|
|
1244
1279
|
if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1245
1280
|
S3 = S2;
|
|
1246
1281
|
} else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
|
|
1247
1282
|
S3 = 1;
|
|
1248
1283
|
}
|
|
1249
|
-
let markPrice = S2 * (1 + ABK64x64ToFloat(ammState[8]));
|
|
1250
1284
|
let state: PerpetualState = {
|
|
1251
1285
|
id: perpId,
|
|
1252
1286
|
state: PERP_STATE_STR[Number(ammState[13])],
|
|
@@ -1254,11 +1288,11 @@ export default class PerpetualDataHandler {
|
|
|
1254
1288
|
quoteCurrency: ccy[1],
|
|
1255
1289
|
indexPrice: S2,
|
|
1256
1290
|
collToQuoteIndexPrice: S3,
|
|
1257
|
-
|
|
1291
|
+
markPremium: ABK64x64ToFloat(ammState[8]),
|
|
1258
1292
|
midPrice: ABK64x64ToFloat(ammState[10]),
|
|
1259
1293
|
currentFundingRateBps: ABK64x64ToFloat(ammState[14]) * 1e4,
|
|
1260
1294
|
openInterestBC: ABK64x64ToFloat(ammState[11]),
|
|
1261
|
-
isMarketClosed: indexPrices
|
|
1295
|
+
isMarketClosed: indexPrices.s2MktClosed || indexPrices.s3MktClosed,
|
|
1262
1296
|
longBC: ABK64x64ToFloat(longShort[0]),
|
|
1263
1297
|
shortBC: ABK64x64ToFloat(longShort[1]),
|
|
1264
1298
|
};
|
|
@@ -1277,7 +1311,8 @@ export default class PerpetualDataHandler {
|
|
|
1277
1311
|
symbol: string,
|
|
1278
1312
|
traderState: bigint[],
|
|
1279
1313
|
S2: number,
|
|
1280
|
-
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo
|
|
1314
|
+
symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
|
|
1315
|
+
isPredMarket: boolean
|
|
1281
1316
|
): [number, number, number, number, number] {
|
|
1282
1317
|
const idx_availableCashCC = 2;
|
|
1283
1318
|
const idx_cash = 3;
|
|
@@ -1292,14 +1327,22 @@ export default class PerpetualDataHandler {
|
|
|
1292
1327
|
if (perpInfo == undefined) {
|
|
1293
1328
|
throw new Error(`no info for perpetual ${symbol}`);
|
|
1294
1329
|
}
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1330
|
+
const tau = perpInfo.maintenanceMarginRate;
|
|
1331
|
+
const lockedInValueQC = ABK64x64ToFloat(traderState[idx_locked_in]);
|
|
1332
|
+
const position = ABK64x64ToFloat(traderState[idx_notional]);
|
|
1333
|
+
const cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
|
|
1334
|
+
const Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
|
|
1335
|
+
const unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC] - traderState[idx_cash]);
|
|
1301
1336
|
let unpaidFunding = unpaidFundingCC;
|
|
1302
1337
|
|
|
1338
|
+
if (isPredMarket) {
|
|
1339
|
+
const S2Liq = pmFindLiquidationPrice(position, S3Liq, lockedInValueQC, cashCC, tau, S2);
|
|
1340
|
+
let pnl = position * Sm - lockedInValueQC + unpaidFunding / S3Liq;
|
|
1341
|
+
// liquidation margin rate
|
|
1342
|
+
const tauLiq = pmMaintenanceMarginRate(position, S2Liq, tau);
|
|
1343
|
+
return [S2Liq, S3Liq, tauLiq, pnl, unpaidFundingCC];
|
|
1344
|
+
}
|
|
1345
|
+
// regular perpetuals:
|
|
1303
1346
|
if (perpInfo.collateralCurrencyType == CollaterlCCY.BASE) {
|
|
1304
1347
|
S2Liq = calculateLiquidationPriceCollateralBase(lockedInValueQC, position, cashCC, tau);
|
|
1305
1348
|
S3Liq = S2Liq;
|
|
@@ -1397,7 +1440,7 @@ export default class PerpetualDataHandler {
|
|
|
1397
1440
|
}
|
|
1398
1441
|
// adjust prices for market type
|
|
1399
1442
|
const sInfo = symbolToPerpInfoMap.get(symbol)!;
|
|
1400
|
-
if (PerpetualDataHandler.
|
|
1443
|
+
if (PerpetualDataHandler.isPredictionMarketStatic(sInfo)) {
|
|
1401
1444
|
limitPrice = limitPrice !== undefined && limitPrice !== 0 ? priceToProb(limitPrice) : limitPrice;
|
|
1402
1445
|
stopPrice = stopPrice !== undefined && stopPrice !== 0 ? priceToProb(stopPrice) : stopPrice;
|
|
1403
1446
|
}
|
|
@@ -1416,10 +1459,10 @@ export default class PerpetualDataHandler {
|
|
|
1416
1459
|
leverage: Number(order.leverageTDR) / 100,
|
|
1417
1460
|
deadline: Number(order.iDeadline),
|
|
1418
1461
|
executionTimestamp: Number(order.executionTimestamp),
|
|
1419
|
-
submittedTimestamp:
|
|
1462
|
+
submittedTimestamp: "submittedTimestamp" in order ? Number(order.submittedTimestamp) : undefined,
|
|
1420
1463
|
parentChildOrderIds:
|
|
1421
|
-
|
|
1422
|
-
? [order
|
|
1464
|
+
"parentChildDigest1" && "parentChildDigest2" in order
|
|
1465
|
+
? [order.parentChildDigest1.toString(), order.parentChildDigest2.toString()]
|
|
1423
1466
|
: undefined,
|
|
1424
1467
|
};
|
|
1425
1468
|
return userOrder;
|
|
@@ -1450,7 +1493,7 @@ export default class PerpetualDataHandler {
|
|
|
1450
1493
|
} else {
|
|
1451
1494
|
throw Error(`invalid side in order spec, use ${BUY_SIDE} or ${SELL_SIDE}`);
|
|
1452
1495
|
}
|
|
1453
|
-
const isPred = PerpetualDataHandler.
|
|
1496
|
+
const isPred = PerpetualDataHandler.isPredictionMarketStatic(perpStaticInfo.get(order.symbol)!);
|
|
1454
1497
|
let fLimitPrice: bigint;
|
|
1455
1498
|
if (order.limitPrice == undefined) {
|
|
1456
1499
|
// we need to set the limit price to infinity or zero for
|
|
@@ -1960,7 +2003,7 @@ export default class PerpetualDataHandler {
|
|
|
1960
2003
|
if (staticInfo == undefined) {
|
|
1961
2004
|
throw new Error(`Perpetual with symbol ${symbol} not found. Check symbol or use createProxyInstance().`);
|
|
1962
2005
|
}
|
|
1963
|
-
return PerpetualDataHandler.
|
|
2006
|
+
return PerpetualDataHandler.isPredictionMarketStatic(staticInfo);
|
|
1964
2007
|
}
|
|
1965
2008
|
|
|
1966
2009
|
/**
|
|
@@ -1968,8 +2011,7 @@ export default class PerpetualDataHandler {
|
|
|
1968
2011
|
* @param staticInfo Perpetual static info
|
|
1969
2012
|
* @returns True if this is a prediction market
|
|
1970
2013
|
*/
|
|
1971
|
-
public static
|
|
1972
|
-
// return true; // for testing
|
|
2014
|
+
public static isPredictionMarketStatic(staticInfo: PerpetualStaticInfo) {
|
|
1973
2015
|
return containsFlag(staticInfo.perpFlags, MASK_PREDICTION_MARKET);
|
|
1974
2016
|
}
|
|
1975
2017
|
}
|
|
@@ -175,7 +175,7 @@ export default class PerpetualEventHandler {
|
|
|
175
175
|
perp.state = perpState.state;
|
|
176
176
|
perp.indexPrice = perpState.indexPrice;
|
|
177
177
|
perp.collToQuoteIndexPrice = perpState.collToQuoteIndexPrice;
|
|
178
|
-
perp.
|
|
178
|
+
perp.markPremium = perpState.markPremium;
|
|
179
179
|
perp.midPrice = perpState.midPrice;
|
|
180
180
|
perp.currentFundingRateBps = perpState.currentFundingRateBps;
|
|
181
181
|
perp.openInterestBC = perpState.openInterestBC;
|
|
@@ -197,7 +197,7 @@ export default class PerpetualEventHandler {
|
|
|
197
197
|
fMarkPricePremium: bigint,
|
|
198
198
|
fSpotIndexPrice: bigint
|
|
199
199
|
): void {
|
|
200
|
-
let [newMidPrice,
|
|
200
|
+
let [newMidPrice, newMarkPricePrem, newIndexPrice] = PerpetualEventHandler.ConvertUpdateMarkPrice(
|
|
201
201
|
fMidPricePremium,
|
|
202
202
|
fMarkPricePremium,
|
|
203
203
|
fSpotIndexPrice
|
|
@@ -207,7 +207,7 @@ export default class PerpetualEventHandler {
|
|
|
207
207
|
return;
|
|
208
208
|
}
|
|
209
209
|
perpetual.midPrice = newMidPrice;
|
|
210
|
-
perpetual.
|
|
210
|
+
perpetual.markPremium = newMarkPricePrem;
|
|
211
211
|
perpetual.indexPrice = newIndexPrice;
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -436,18 +436,17 @@ export default class PerpetualEventHandler {
|
|
|
436
436
|
* )
|
|
437
437
|
* @param fMarkPricePremium premium rate in ABDK format
|
|
438
438
|
* @param fSpotIndexPrice spot index price in ABDK format
|
|
439
|
-
* @returns
|
|
439
|
+
* @returns midPrice, markPricePremium, indexPrice in float
|
|
440
440
|
*/
|
|
441
441
|
private static ConvertUpdateMarkPrice(
|
|
442
442
|
fMidPricePremium: bigint,
|
|
443
443
|
fMarkPricePremium: bigint,
|
|
444
444
|
fSpotIndexPrice: bigint
|
|
445
445
|
): [number, number, number] {
|
|
446
|
-
let fMarkPrice = mul64x64(fSpotIndexPrice, ONE_64x64 + fMarkPricePremium);
|
|
447
446
|
let fMidPrice = mul64x64(fSpotIndexPrice, ONE_64x64 + fMidPricePremium);
|
|
448
447
|
let midPrice = ABK64x64ToFloat(fMidPrice);
|
|
449
|
-
let
|
|
448
|
+
let markPricePremium = ABK64x64ToFloat(fMarkPricePremium);
|
|
450
449
|
let indexPrice = ABK64x64ToFloat(fSpotIndexPrice);
|
|
451
|
-
return [midPrice,
|
|
450
|
+
return [midPrice, markPricePremium, indexPrice];
|
|
452
451
|
}
|
|
453
452
|
}
|
package/src/polyMktsPxFeed.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { probToPrice } from "./d8XMath";
|
|
2
|
-
import type { PriceFeedConfig } from "./nodeSDKTypes";
|
|
2
|
+
import type { PriceFeedConfig, PriceFeedJson, PredMktPriceInfo } from "./nodeSDKTypes";
|
|
3
3
|
|
|
4
4
|
interface PolyConfig {
|
|
5
5
|
sym: string;
|
|
@@ -14,8 +14,9 @@ interface PolyConfig {
|
|
|
14
14
|
*/
|
|
15
15
|
export default class PolyMktsPxFeed {
|
|
16
16
|
private ids: Map<string, PolyConfig>;
|
|
17
|
+
private oracleEndpoint: string;
|
|
17
18
|
|
|
18
|
-
constructor(config: PriceFeedConfig) {
|
|
19
|
+
constructor(config: PriceFeedConfig, oracleEndpoint: string) {
|
|
19
20
|
this.ids = new Map<string, PolyConfig>();
|
|
20
21
|
for (let k = 0; k < config.ids.length; k++) {
|
|
21
22
|
if (config.ids[k].type == "polymarket") {
|
|
@@ -29,21 +30,45 @@ export default class PolyMktsPxFeed {
|
|
|
29
30
|
this.ids.set(sym, el);
|
|
30
31
|
}
|
|
31
32
|
}
|
|
33
|
+
|
|
34
|
+
this.oracleEndpoint = oracleEndpoint.replace(/\/$/, "") + "v2/updates/price/latest?encoding=base64&ids[]=";
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
public isPolyMktsSym(sym: string) {
|
|
35
38
|
return this.ids.get(sym) == undefined;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
|
|
41
|
+
// returns index price, ema price, conf in tbps, parameters for order book
|
|
42
|
+
public async fetchPriceForSym(sym: string): Promise<PredMktPriceInfo> {
|
|
39
43
|
const mkt = this.ids.get(sym);
|
|
40
44
|
if (mkt == undefined) {
|
|
41
45
|
throw new Error(`symbol not in polymarket universe: ${sym}`);
|
|
42
46
|
}
|
|
43
|
-
return this.fetchPrice(mkt.
|
|
47
|
+
return this.fetchPrice(mkt.id);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// fetch price of the form 1+p from oracle, also fetches ema
|
|
51
|
+
public async fetchPrice(tokenIdHex: string): Promise<PredMktPriceInfo> {
|
|
52
|
+
const query = this.oracleEndpoint + tokenIdHex;
|
|
53
|
+
let response = await fetch(query);
|
|
54
|
+
if (response.status !== 200) {
|
|
55
|
+
throw new Error(`unexpected status code: ${response.status}`);
|
|
56
|
+
}
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
throw new Error(`failed to fetch posts (${response.status}): ${response.statusText} ${query}`);
|
|
59
|
+
}
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
const emaObj = data.parsed.ema_price as PriceFeedJson;
|
|
62
|
+
const pxObj = data.parsed.price as PriceFeedJson;
|
|
63
|
+
|
|
64
|
+
const px = Number(pxObj.price) * Math.pow(10, pxObj.expo);
|
|
65
|
+
const ema = Number(emaObj.price) * Math.pow(10, emaObj.expo);
|
|
66
|
+
const params = BigInt(emaObj.conf);
|
|
67
|
+
const conf = BigInt(pxObj.conf);
|
|
68
|
+
return { s2: px, ema: ema, s2MktClosed: false, conf: conf, predMktCLOBParams: params } as PredMktPriceInfo;
|
|
44
69
|
}
|
|
45
70
|
|
|
46
|
-
public async
|
|
71
|
+
public async fetchPriceFromAPI(tokenIdDec: string): Promise<number> {
|
|
47
72
|
const query = "https://clob.polymarket.com/midpoint?token_id=" + tokenIdDec;
|
|
48
73
|
let response = await fetch(query);
|
|
49
74
|
if (response.status !== 200) {
|