@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.
Files changed (255) hide show
  1. package/dist/cjs/abi/IPerpetualManager.json +124 -3
  2. package/dist/cjs/abi/OracleFactory.json +94 -25
  3. package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
  4. package/dist/cjs/brokerTool.d.ts +5 -1
  5. package/dist/cjs/brokerTool.js +14 -1
  6. package/dist/cjs/brokerTool.js.map +1 -1
  7. package/dist/cjs/config/priceFeedConfig.json +0 -18
  8. package/dist/cjs/contracts/IPerpetualManager.d.ts +74 -10
  9. package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
  10. package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
  11. package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
  12. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +124 -3
  13. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  14. package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
  15. package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
  16. package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
  17. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  18. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  19. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  20. package/dist/cjs/d8XMath.d.ts +44 -1
  21. package/dist/cjs/d8XMath.js +236 -3
  22. package/dist/cjs/d8XMath.js.map +1 -1
  23. package/dist/cjs/liquidatorTool.d.ts +1 -0
  24. package/dist/cjs/liquidatorTool.js +24 -7
  25. package/dist/cjs/liquidatorTool.js.map +1 -1
  26. package/dist/cjs/marketData.d.ts +42 -20
  27. package/dist/cjs/marketData.js +261 -188
  28. package/dist/cjs/marketData.js.map +1 -1
  29. package/dist/cjs/nodeSDKTypes.d.ts +24 -2
  30. package/dist/cjs/nodeSDKTypes.js.map +1 -1
  31. package/dist/cjs/orderExecutorTool.d.ts +3 -3
  32. package/dist/cjs/orderExecutorTool.js +38 -13
  33. package/dist/cjs/orderExecutorTool.js.map +1 -1
  34. package/dist/cjs/perpetualDataHandler.d.ts +22 -12
  35. package/dist/cjs/perpetualDataHandler.js +59 -44
  36. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  37. package/dist/cjs/perpetualEventHandler.d.ts +1 -1
  38. package/dist/cjs/perpetualEventHandler.js +6 -7
  39. package/dist/cjs/perpetualEventHandler.js.map +1 -1
  40. package/dist/cjs/polyMktsPxFeed.d.ts +6 -4
  41. package/dist/cjs/polyMktsPxFeed.js +24 -3
  42. package/dist/cjs/polyMktsPxFeed.js.map +1 -1
  43. package/dist/cjs/priceFeeds.d.ts +6 -7
  44. package/dist/cjs/priceFeeds.js +36 -14
  45. package/dist/cjs/priceFeeds.js.map +1 -1
  46. package/dist/cjs/version.d.ts +1 -1
  47. package/dist/cjs/version.js +1 -1
  48. package/dist/esm/abi/IPerpetualManager.json +124 -3
  49. package/dist/esm/abi/OracleFactory.json +94 -25
  50. package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
  51. package/dist/esm/brokerTool.d.ts +5 -1
  52. package/dist/esm/brokerTool.js +15 -2
  53. package/dist/esm/brokerTool.js.map +1 -1
  54. package/dist/esm/config/priceFeedConfig.json +0 -18
  55. package/dist/esm/contracts/IPerpetualManager.d.ts +74 -10
  56. package/dist/esm/contracts/OracleFactory.d.ts +69 -20
  57. package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
  58. package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
  59. package/dist/esm/contracts/factories/IPerpetualManager__factory.js +124 -3
  60. package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  61. package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
  62. package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
  63. package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
  64. package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
  65. package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
  66. package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
  67. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  68. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  69. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  70. package/dist/esm/d8XMath.d.ts +44 -1
  71. package/dist/esm/d8XMath.js +229 -2
  72. package/dist/esm/d8XMath.js.map +1 -1
  73. package/dist/esm/liquidatorTool.d.ts +1 -0
  74. package/dist/esm/liquidatorTool.js +25 -8
  75. package/dist/esm/liquidatorTool.js.map +1 -1
  76. package/dist/esm/marketData.d.ts +42 -20
  77. package/dist/esm/marketData.js +263 -190
  78. package/dist/esm/marketData.js.map +1 -1
  79. package/dist/esm/nodeSDKTypes.d.ts +24 -2
  80. package/dist/esm/nodeSDKTypes.js.map +1 -1
  81. package/dist/esm/orderExecutorTool.d.ts +3 -3
  82. package/dist/esm/orderExecutorTool.js +38 -13
  83. package/dist/esm/orderExecutorTool.js.map +1 -1
  84. package/dist/esm/perpetualDataHandler.d.ts +22 -12
  85. package/dist/esm/perpetualDataHandler.js +60 -45
  86. package/dist/esm/perpetualDataHandler.js.map +1 -1
  87. package/dist/esm/perpetualEventHandler.d.ts +1 -1
  88. package/dist/esm/perpetualEventHandler.js +6 -7
  89. package/dist/esm/perpetualEventHandler.js.map +1 -1
  90. package/dist/esm/polyMktsPxFeed.d.ts +6 -4
  91. package/dist/esm/polyMktsPxFeed.js +24 -3
  92. package/dist/esm/polyMktsPxFeed.js.map +1 -1
  93. package/dist/esm/priceFeeds.d.ts +6 -7
  94. package/dist/esm/priceFeeds.js +36 -14
  95. package/dist/esm/priceFeeds.js.map +1 -1
  96. package/dist/esm/version.d.ts +1 -1
  97. package/dist/esm/version.js +1 -1
  98. package/package.json +1 -1
  99. package/src/abi/IPerpetualManager.json +124 -3
  100. package/src/abi/OracleFactory.json +523 -454
  101. package/src/abi/PerpetualManagerProxy.json +1596 -1386
  102. package/src/brokerTool.ts +16 -2
  103. package/src/config/priceFeedConfig.json +0 -18
  104. package/src/contracts/IPerpetualManager.ts +107 -7
  105. package/src/contracts/OracleFactory.ts +100 -26
  106. package/src/contracts/PerpetualManagerProxy.ts +192 -3
  107. package/src/contracts/factories/IPerpetualManager__factory.ts +124 -3
  108. package/src/contracts/factories/OracleFactory__factory.ts +94 -25
  109. package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
  110. package/src/d8XMath.ts +304 -2
  111. package/src/liquidatorTool.ts +29 -14
  112. package/src/marketData.ts +415 -238
  113. package/src/nodeSDKTypes.ts +30 -2
  114. package/src/orderExecutorTool.ts +48 -20
  115. package/src/perpetualDataHandler.ts +87 -45
  116. package/src/perpetualEventHandler.ts +6 -7
  117. package/src/polyMktsPxFeed.ts +30 -5
  118. package/src/priceFeeds.ts +41 -17
  119. package/src/version.ts +1 -1
  120. package/dist/cjs/abi/BeaconProxy.json +0 -71
  121. package/dist/cjs/abi/Maintainer.json +0 -774
  122. package/dist/cjs/abi/MockToken.json +0 -347
  123. package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
  124. package/dist/cjs/abi/WeETH.json +0 -310
  125. package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
  126. package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
  127. package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
  128. package/dist/cjs/contracts/BeaconProxy.js +0 -3
  129. package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
  130. package/dist/cjs/contracts/Maintainer.d.ts +0 -799
  131. package/dist/cjs/contracts/Maintainer.js +0 -3
  132. package/dist/cjs/contracts/Maintainer.js.map +0 -1
  133. package/dist/cjs/contracts/MockToken.d.ts +0 -263
  134. package/dist/cjs/contracts/MockToken.js +0 -3
  135. package/dist/cjs/contracts/MockToken.js.map +0 -1
  136. package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
  137. package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
  138. package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
  139. package/dist/cjs/contracts/WeETH.d.ts +0 -503
  140. package/dist/cjs/contracts/WeETH.js +0 -3
  141. package/dist/cjs/contracts/WeETH.js.map +0 -1
  142. package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  143. package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
  144. package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
  145. package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
  146. package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
  147. package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
  148. package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
  149. package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
  150. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  151. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
  152. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  153. package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
  154. package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
  155. package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
  156. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  157. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
  158. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  159. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  160. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
  161. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  162. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  163. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
  164. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  165. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  166. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
  167. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  168. package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
  169. package/dist/cjs/contracts/factories/lean0/index.js +0 -15
  170. package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
  171. package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  172. package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
  173. package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
  174. package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
  175. package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
  176. package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
  177. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  178. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
  179. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  180. package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
  181. package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
  182. package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
  183. package/dist/cjs/contracts/lean0/index.d.ts +0 -4
  184. package/dist/cjs/contracts/lean0/index.js +0 -3
  185. package/dist/cjs/contracts/lean0/index.js.map +0 -1
  186. package/dist/esm/abi/BeaconProxy.json +0 -71
  187. package/dist/esm/abi/Maintainer.json +0 -774
  188. package/dist/esm/abi/MockToken.json +0 -347
  189. package/dist/esm/abi/UUPSUpgradeable.json +0 -104
  190. package/dist/esm/abi/WeETH.json +0 -310
  191. package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
  192. package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
  193. package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
  194. package/dist/esm/abi/lean0/ShareToken.json +0 -438
  195. package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
  196. package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
  197. package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
  198. package/dist/esm/contracts/BeaconProxy.js +0 -2
  199. package/dist/esm/contracts/BeaconProxy.js.map +0 -1
  200. package/dist/esm/contracts/Maintainer.d.ts +0 -799
  201. package/dist/esm/contracts/Maintainer.js +0 -2
  202. package/dist/esm/contracts/Maintainer.js.map +0 -1
  203. package/dist/esm/contracts/MockToken.d.ts +0 -263
  204. package/dist/esm/contracts/MockToken.js +0 -2
  205. package/dist/esm/contracts/MockToken.js.map +0 -1
  206. package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
  207. package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
  208. package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
  209. package/dist/esm/contracts/WeETH.d.ts +0 -503
  210. package/dist/esm/contracts/WeETH.js +0 -2
  211. package/dist/esm/contracts/WeETH.js.map +0 -1
  212. package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  213. package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
  214. package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
  215. package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
  216. package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
  217. package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
  218. package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
  219. package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
  220. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  221. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
  222. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  223. package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
  224. package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
  225. package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
  226. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  227. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
  228. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  229. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  230. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
  231. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  232. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  233. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
  234. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  235. package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  236. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
  237. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  238. package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
  239. package/dist/esm/contracts/factories/lean0/index.js +0 -8
  240. package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
  241. package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  242. package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
  243. package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
  244. package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
  245. package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
  246. package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
  247. package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  248. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
  249. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  250. package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
  251. package/dist/esm/contracts/lean0/ShareToken.js +0 -2
  252. package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
  253. package/dist/esm/contracts/lean0/index.d.ts +0 -4
  254. package/dist/esm/contracts/lean0/index.js +0 -2
  255. package/dist/esm/contracts/lean0/index.js.map +0 -1
@@ -146,7 +146,7 @@ export interface PerpetualState {
146
146
  quoteCurrency: string;
147
147
  indexPrice: number;
148
148
  collToQuoteIndexPrice: number;
149
- markPrice: number;
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
+ }
@@ -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?: [number, number],
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
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
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) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)) as [
387
- bigint,
388
- bigint
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", [perpId, fAmount, fS2S3]),
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
- const markPrice = indexPrices[0] * (1 + ABK64x64ToFloat(ammState[8]));
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(perpId, fAmount, fS2S3);
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?: [number, number, boolean, boolean],
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?: [number, number, boolean, boolean],
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
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(orders[0].symbol);
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[2] || indexPrices[3]) {
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[0], indexPrices[1]].map((x) =>
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", [perpId, fAmount, fS2S3]),
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
- const markPrice = indexPrices[0] * (1 + ABK64x64ToFloat(ammState[8]));
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], markPrice, blockTimestamp!, this.symbolToPerpStaticInfo);
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
- _pxS2S3: [number, number]
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
- _pxS2S3[0],
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 _pxS2S3 Prices [S2, S3]
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
- _pxS2S3: [number, number],
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
- _pxS2S3.map((x) => floatToABK64x64(x)) as [bigint, bigint],
935
+ [_pxInfo.ema, _pxInfo.s3].map((x) => floatToABK64x64(x)) as [bigint, bigint],
930
936
  overrides || {}
931
937
  );
932
- return PerpetualDataHandler.buildMarginAccountFromState(symbol, traderState, symbolToPerpStaticInfo, _pxS2S3);
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 _pxS2S3s List of price pairs, [[S2, S3] (1st perp), [S2, S3] (2nd perp), ... ]
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
- _pxS2S3s: number[][],
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 != _pxS2S3s.length ||
1112
- symbols.length != _pxS2S3s.length
1124
+ traderAddrs.length != _pxInfo.length ||
1125
+ symbols.length != _pxInfo.length
1113
1126
  ) {
1114
- throw new Error("traderAddr, symbol and pxS2S3 should all have the same length");
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
- _pxS2S3s[i].map((x) => floatToABK64x64(x)) as [bigint, bigint],
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(symbols[i], traderState, symbolToPerpStaticInfo, [
1132
- _pxS2S3s[i][0],
1133
- _pxS2S3s[i][1],
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: [number, number],
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) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : 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
- return indexPrices[0] * (1 + ABK64x64ToFloat(ammState[8]));
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: [number, number, boolean, boolean],
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
- S3 = S2;
1218
+ indexPrices.s3 = indexPrices.s2;
1184
1219
  } else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
1185
- S3 = 1;
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
- [S2, S3].map(floatToABK64x64) as [bigint, bigint],
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: [number, number, boolean, boolean],
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[0], indexPrices[1]];
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
- markPrice: markPrice,
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[2] || indexPrices[3],
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
- let tau = perpInfo.maintenanceMarginRate;
1296
- let lockedInValueQC = ABK64x64ToFloat(traderState[idx_locked_in]);
1297
- let position = ABK64x64ToFloat(traderState[idx_notional]);
1298
- let cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
1299
- let Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
1300
- let unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC] - traderState[idx_cash]);
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.isPredictionMarket(sInfo)) {
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: order["submittedTimestamp"] ? Number(order["submittedTimestamp"]) : undefined,
1462
+ submittedTimestamp: "submittedTimestamp" in order ? Number(order.submittedTimestamp) : undefined,
1420
1463
  parentChildOrderIds:
1421
- order["parentChildDigest1"] && order["parentChildDigest2"]
1422
- ? [order["parentChildDigest1"].toString(), order["parentChildDigest2"].toString()]
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.isPredictionMarket(perpStaticInfo.get(order.symbol)!);
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.isPredictionMarket(staticInfo);
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 isPredictionMarket(staticInfo: PerpetualStaticInfo) {
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.markPrice = perpState.markPrice;
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, newMarkPrice, newIndexPrice] = PerpetualEventHandler.ConvertUpdateMarkPrice(
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.markPrice = newMarkPrice;
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 mark price and spot index in float
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 markPrice = ABK64x64ToFloat(fMarkPrice);
448
+ let markPricePremium = ABK64x64ToFloat(fMarkPricePremium);
450
449
  let indexPrice = ABK64x64ToFloat(fSpotIndexPrice);
451
- return [midPrice, markPrice, indexPrice];
450
+ return [midPrice, markPricePremium, indexPrice];
452
451
  }
453
452
  }
@@ -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
- public async fetchPriceForSym(sym: string): Promise<number> {
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.idDec);
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 fetchPrice(tokenIdDec: string): Promise<number> {
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) {