@d8x/perpetuals-sdk 2.0.13-alpha → 2.1.1-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/dist/cjs/abi/IPerpetualManager.json +154 -4
  2. package/dist/cjs/abi/OracleFactory.json +94 -25
  3. package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
  4. package/dist/cjs/accountTrade.d.ts +3 -3
  5. package/dist/cjs/accountTrade.js +1 -1
  6. package/dist/cjs/accountTrade.js.map +1 -1
  7. package/dist/cjs/brokerTool.d.ts +5 -1
  8. package/dist/cjs/brokerTool.js +20 -7
  9. package/dist/cjs/brokerTool.js.map +1 -1
  10. package/dist/cjs/config/defaultConfig.json +0 -12
  11. package/dist/cjs/config/priceFeedConfig.json +1 -19
  12. package/dist/cjs/constants.d.ts +0 -1
  13. package/dist/cjs/constants.js +2 -3
  14. package/dist/cjs/constants.js.map +1 -1
  15. package/dist/cjs/contracts/IPerpetualManager.d.ts +93 -13
  16. package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
  17. package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
  18. package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +118 -4
  19. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +154 -4
  20. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  21. package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
  22. package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
  23. package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
  24. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  25. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  26. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  27. package/dist/cjs/d8XMath.d.ts +59 -1
  28. package/dist/cjs/d8XMath.js +259 -3
  29. package/dist/cjs/d8XMath.js.map +1 -1
  30. package/dist/cjs/liquidatorTool.d.ts +1 -0
  31. package/dist/cjs/liquidatorTool.js +24 -7
  32. package/dist/cjs/liquidatorTool.js.map +1 -1
  33. package/dist/cjs/marketData.d.ts +45 -23
  34. package/dist/cjs/marketData.js +292 -197
  35. package/dist/cjs/marketData.js.map +1 -1
  36. package/dist/cjs/nodeSDKTypes.d.ts +24 -1
  37. package/dist/cjs/nodeSDKTypes.js.map +1 -1
  38. package/dist/cjs/orderExecutorTool.d.ts +3 -3
  39. package/dist/cjs/orderExecutorTool.js +38 -13
  40. package/dist/cjs/orderExecutorTool.js.map +1 -1
  41. package/dist/cjs/perpetualDataHandler.d.ts +28 -17
  42. package/dist/cjs/perpetualDataHandler.js +71 -45
  43. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  44. package/dist/cjs/perpetualEventHandler.d.ts +1 -1
  45. package/dist/cjs/perpetualEventHandler.js +6 -7
  46. package/dist/cjs/perpetualEventHandler.js.map +1 -1
  47. package/dist/cjs/polyMktsPxFeed.d.ts +5 -3
  48. package/dist/cjs/polyMktsPxFeed.js +34 -2
  49. package/dist/cjs/polyMktsPxFeed.js.map +1 -1
  50. package/dist/cjs/priceFeeds.d.ts +6 -7
  51. package/dist/cjs/priceFeeds.js +36 -14
  52. package/dist/cjs/priceFeeds.js.map +1 -1
  53. package/dist/cjs/version.d.ts +1 -1
  54. package/dist/cjs/version.js +1 -1
  55. package/dist/cjs/writeAccessHandler.js +1 -1
  56. package/dist/cjs/writeAccessHandler.js.map +1 -1
  57. package/dist/esm/abi/IPerpetualManager.json +154 -4
  58. package/dist/esm/abi/OracleFactory.json +94 -25
  59. package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
  60. package/dist/esm/accountTrade.d.ts +3 -3
  61. package/dist/esm/accountTrade.js +1 -1
  62. package/dist/esm/accountTrade.js.map +1 -1
  63. package/dist/esm/brokerTool.d.ts +5 -1
  64. package/dist/esm/brokerTool.js +21 -8
  65. package/dist/esm/brokerTool.js.map +1 -1
  66. package/dist/esm/config/defaultConfig.json +0 -12
  67. package/dist/esm/config/priceFeedConfig.json +1 -19
  68. package/dist/esm/constants.d.ts +0 -1
  69. package/dist/esm/constants.js +1 -2
  70. package/dist/esm/constants.js.map +1 -1
  71. package/dist/esm/contracts/IPerpetualManager.d.ts +93 -13
  72. package/dist/esm/contracts/OracleFactory.d.ts +69 -20
  73. package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
  74. package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +118 -4
  75. package/dist/esm/contracts/factories/IPerpetualManager__factory.js +154 -4
  76. package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  77. package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
  78. package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
  79. package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
  80. package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
  81. package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
  82. package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
  83. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  84. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  85. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  86. package/dist/esm/d8XMath.d.ts +59 -1
  87. package/dist/esm/d8XMath.js +251 -2
  88. package/dist/esm/d8XMath.js.map +1 -1
  89. package/dist/esm/liquidatorTool.d.ts +1 -0
  90. package/dist/esm/liquidatorTool.js +25 -8
  91. package/dist/esm/liquidatorTool.js.map +1 -1
  92. package/dist/esm/marketData.d.ts +45 -23
  93. package/dist/esm/marketData.js +295 -200
  94. package/dist/esm/marketData.js.map +1 -1
  95. package/dist/esm/nodeSDKTypes.d.ts +24 -1
  96. package/dist/esm/nodeSDKTypes.js.map +1 -1
  97. package/dist/esm/orderExecutorTool.d.ts +3 -3
  98. package/dist/esm/orderExecutorTool.js +38 -13
  99. package/dist/esm/orderExecutorTool.js.map +1 -1
  100. package/dist/esm/perpetualDataHandler.d.ts +28 -17
  101. package/dist/esm/perpetualDataHandler.js +74 -48
  102. package/dist/esm/perpetualDataHandler.js.map +1 -1
  103. package/dist/esm/perpetualEventHandler.d.ts +1 -1
  104. package/dist/esm/perpetualEventHandler.js +6 -7
  105. package/dist/esm/perpetualEventHandler.js.map +1 -1
  106. package/dist/esm/polyMktsPxFeed.d.ts +5 -3
  107. package/dist/esm/polyMktsPxFeed.js +34 -2
  108. package/dist/esm/polyMktsPxFeed.js.map +1 -1
  109. package/dist/esm/priceFeeds.d.ts +6 -7
  110. package/dist/esm/priceFeeds.js +36 -14
  111. package/dist/esm/priceFeeds.js.map +1 -1
  112. package/dist/esm/version.d.ts +1 -1
  113. package/dist/esm/version.js +1 -1
  114. package/dist/esm/writeAccessHandler.js +3 -3
  115. package/dist/esm/writeAccessHandler.js.map +1 -1
  116. package/doc/brokerTool.md +3 -1
  117. package/doc/d8x-perpetuals-sdk.md +804 -132
  118. package/doc/marketData.md +813 -0
  119. package/doc/perpetualDataHandler.md +76 -7
  120. package/package.json +1 -1
  121. package/src/abi/IPerpetualManager.json +154 -4
  122. package/src/abi/OracleFactory.json +523 -454
  123. package/src/abi/PerpetualManagerProxy.json +1596 -1386
  124. package/src/accountTrade.ts +3 -3
  125. package/src/brokerTool.ts +22 -8
  126. package/src/config/defaultConfig.json +0 -13
  127. package/src/config/priceFeedConfig.json +1 -19
  128. package/src/constants.ts +1 -2
  129. package/src/contracts/IPerpetualManager.ts +140 -10
  130. package/src/contracts/OracleFactory.ts +100 -26
  131. package/src/contracts/PerpetualManagerProxy.ts +192 -3
  132. package/src/contracts/factories/IPerpetualManager__factory.ts +154 -4
  133. package/src/contracts/factories/OracleFactory__factory.ts +94 -25
  134. package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
  135. package/src/d8XMath.ts +327 -2
  136. package/src/liquidatorTool.ts +29 -14
  137. package/src/marketData.ts +448 -250
  138. package/src/nodeSDKTypes.ts +30 -1
  139. package/src/orderExecutorTool.ts +48 -20
  140. package/src/perpetualDataHandler.ts +108 -55
  141. package/src/perpetualEventHandler.ts +6 -7
  142. package/src/polyMktsPxFeed.ts +40 -4
  143. package/src/priceFeeds.ts +41 -17
  144. package/src/version.ts +1 -1
  145. package/src/writeAccessHandler.ts +2 -2
  146. package/dist/cjs/abi/BeaconProxy.json +0 -71
  147. package/dist/cjs/abi/Maintainer.json +0 -774
  148. package/dist/cjs/abi/MockToken.json +0 -347
  149. package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
  150. package/dist/cjs/abi/WeETH.json +0 -310
  151. package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
  152. package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
  153. package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
  154. package/dist/cjs/contracts/BeaconProxy.js +0 -3
  155. package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
  156. package/dist/cjs/contracts/Maintainer.d.ts +0 -799
  157. package/dist/cjs/contracts/Maintainer.js +0 -3
  158. package/dist/cjs/contracts/Maintainer.js.map +0 -1
  159. package/dist/cjs/contracts/MockToken.d.ts +0 -263
  160. package/dist/cjs/contracts/MockToken.js +0 -3
  161. package/dist/cjs/contracts/MockToken.js.map +0 -1
  162. package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
  163. package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
  164. package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
  165. package/dist/cjs/contracts/WeETH.d.ts +0 -503
  166. package/dist/cjs/contracts/WeETH.js +0 -3
  167. package/dist/cjs/contracts/WeETH.js.map +0 -1
  168. package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  169. package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
  170. package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
  171. package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
  172. package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
  173. package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
  174. package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
  175. package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
  176. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  177. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
  178. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  179. package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
  180. package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
  181. package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
  182. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  183. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
  184. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  185. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  186. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
  187. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  188. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  189. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
  190. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  191. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  192. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
  193. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  194. package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
  195. package/dist/cjs/contracts/factories/lean0/index.js +0 -15
  196. package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
  197. package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  198. package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
  199. package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
  200. package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
  201. package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
  202. package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
  203. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  204. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
  205. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  206. package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
  207. package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
  208. package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
  209. package/dist/cjs/contracts/lean0/index.d.ts +0 -4
  210. package/dist/cjs/contracts/lean0/index.js +0 -3
  211. package/dist/cjs/contracts/lean0/index.js.map +0 -1
  212. package/dist/esm/abi/BeaconProxy.json +0 -71
  213. package/dist/esm/abi/Maintainer.json +0 -774
  214. package/dist/esm/abi/MockToken.json +0 -347
  215. package/dist/esm/abi/UUPSUpgradeable.json +0 -104
  216. package/dist/esm/abi/WeETH.json +0 -310
  217. package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
  218. package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
  219. package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
  220. package/dist/esm/abi/lean0/ShareToken.json +0 -438
  221. package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
  222. package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
  223. package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
  224. package/dist/esm/contracts/BeaconProxy.js +0 -2
  225. package/dist/esm/contracts/BeaconProxy.js.map +0 -1
  226. package/dist/esm/contracts/Maintainer.d.ts +0 -799
  227. package/dist/esm/contracts/Maintainer.js +0 -2
  228. package/dist/esm/contracts/Maintainer.js.map +0 -1
  229. package/dist/esm/contracts/MockToken.d.ts +0 -263
  230. package/dist/esm/contracts/MockToken.js +0 -2
  231. package/dist/esm/contracts/MockToken.js.map +0 -1
  232. package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
  233. package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
  234. package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
  235. package/dist/esm/contracts/WeETH.d.ts +0 -503
  236. package/dist/esm/contracts/WeETH.js +0 -2
  237. package/dist/esm/contracts/WeETH.js.map +0 -1
  238. package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  239. package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
  240. package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
  241. package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
  242. package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
  243. package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
  244. package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
  245. package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
  246. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  247. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
  248. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  249. package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
  250. package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
  251. package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
  252. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  253. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
  254. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  255. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  256. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
  257. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  258. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  259. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
  260. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  261. package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  262. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
  263. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  264. package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
  265. package/dist/esm/contracts/factories/lean0/index.js +0 -8
  266. package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
  267. package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  268. package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
  269. package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
  270. package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
  271. package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
  272. package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
  273. package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  274. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
  275. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  276. package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
  277. package/dist/esm/contracts/lean0/ShareToken.js +0 -2
  278. package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
  279. package/dist/esm/contracts/lean0/index.d.ts +0 -4
  280. package/dist/esm/contracts/lean0/index.js +0 -2
  281. package/dist/esm/contracts/lean0/index.js.map +0 -1
  282. package/src/abi-zkevm/IPerpetualManager.json +0 -5366
@@ -146,6 +146,7 @@ export interface PerpetualState {
146
146
  quoteCurrency: string;
147
147
  indexPrice: number;
148
148
  collToQuoteIndexPrice: number;
149
+ markPremium: number;
149
150
  markPrice: number;
150
151
  midPrice: number;
151
152
  currentFundingRateBps: number;
@@ -306,7 +307,7 @@ export interface PriceFeedConfig {
306
307
  }
307
308
 
308
309
  export interface PriceFeedEndpointsItem {
309
- type: string | "odin" | "pyth" | "onchain";
310
+ type: string | "odin" | "pyth" | "onchain" | "polymarket";
310
311
  // Read only endpoints. Used by default.
311
312
  endpoints: string[];
312
313
  // Price feed endpoints which are used for fetching prices which will be
@@ -337,6 +338,14 @@ export interface PriceFeedFormat {
337
338
  publish_time: number;
338
339
  }
339
340
 
341
+ // json version of PriceFeedFormat
342
+ export interface PriceFeedJson {
343
+ conf: string;
344
+ expo: number;
345
+ price: string;
346
+ publish_time: number;
347
+ }
348
+
340
349
  export interface PythV2MetaData {
341
350
  slot: number;
342
351
  proof_available_time: number;
@@ -526,3 +535,23 @@ export const referralTypes = {
526
535
  { name: "CreatedOn", type: "uint256" },
527
536
  ],
528
537
  };
538
+
539
+ // Price information that can be used for
540
+ // prediction markets and regular markets
541
+ export interface IdxPriceInfo {
542
+ s2: number;
543
+ s3?: number;
544
+ ema: number;
545
+ s2MktClosed: boolean;
546
+ s3MktClosed?: boolean;
547
+ conf: bigint;
548
+ predMktCLOBParams: bigint;
549
+ }
550
+
551
+ export interface PredMktPriceInfo {
552
+ s2: number;
553
+ ema: number;
554
+ s2MktClosed: boolean;
555
+ conf: bigint;
556
+ predMktCLOBParams: bigint;
557
+ }
@@ -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
 
@@ -37,6 +37,7 @@ import {
37
37
  } from "./constants";
38
38
  import {
39
39
  ERC20__factory,
40
+ IPerpetualManager__factory,
40
41
  LimitOrderBook,
41
42
  LimitOrderBookFactory,
42
43
  LimitOrderBookFactory__factory,
@@ -45,7 +46,7 @@ import {
45
46
  Multicall3__factory,
46
47
  OracleFactory__factory,
47
48
  } from "./contracts";
48
- import { IPerpetualInfo } from "./contracts/IPerpetualManager";
49
+ import { IPerpetualInfo, IPerpetualManager } from "./contracts/IPerpetualManager";
49
50
  import { IClientOrder, IPerpetualOrder } from "./contracts/LimitOrderBook";
50
51
 
51
52
  import {
@@ -59,6 +60,8 @@ import {
59
60
  dec18ToFloat,
60
61
  priceToProb,
61
62
  probToPrice,
63
+ pmFindLiquidationPrice,
64
+ pmMaintenanceMarginRate,
62
65
  } from "./d8XMath";
63
66
  import {
64
67
  TokenOverride,
@@ -76,6 +79,7 @@ import {
76
79
  LiquidityPoolData,
77
80
  SettlementConfig,
78
81
  SettlementCcyItem,
82
+ IdxPriceInfo,
79
83
  } from "./nodeSDKTypes";
80
84
  import PriceFeeds from "./priceFeeds";
81
85
  import {
@@ -108,7 +112,7 @@ export default class PerpetualDataHandler {
108
112
  protected symbolToTokenAddrMap: Map<string, string>;
109
113
  public chainId: bigint;
110
114
  public network: Network;
111
- protected proxyContract: Contract | null = null;
115
+ protected proxyContract: IPerpetualManager | null = null;
112
116
  protected proxyABI: Interface;
113
117
  protected proxyAddr: string;
114
118
  // oracle
@@ -178,7 +182,7 @@ export default class PerpetualDataHandler {
178
182
  if (network.chainId !== this.chainId) {
179
183
  throw new Error(`Provider: chain id ${network.chainId} does not match config (${this.chainId})`);
180
184
  }
181
- this.proxyContract = new Contract(this.proxyAddr, this.config.proxyABI!, signerOrProvider);
185
+ this.proxyContract = IPerpetualManager__factory.connect(this.proxyAddr, signerOrProvider);
182
186
  this.multicall = Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, this.signerOrProvider);
183
187
  await this._fillSymbolMaps(overrides);
184
188
  }
@@ -613,7 +617,7 @@ export default class PerpetualDataHandler {
613
617
  * @returns array with PerpetualStaticInfo for each perpetual
614
618
  */
615
619
  public static async getPerpetualStaticInfo(
616
- _proxyContract: Contract,
620
+ _proxyContract: IPerpetualManager,
617
621
  nestedPerpetualIDs: Array<Array<number>>,
618
622
  symbolList: Map<string, string>,
619
623
  overrides?: Overrides
@@ -692,7 +696,7 @@ export default class PerpetualDataHandler {
692
696
  public static async _getLiquidityPools(
693
697
  fromIdx: number,
694
698
  toIdx: number,
695
- _proxyContract: Contract,
699
+ _proxyContract: IPerpetualManager,
696
700
  _symbolList: Map<string, string>,
697
701
  overrides?: Overrides
698
702
  ): Promise<LiquidityPoolData[]> {
@@ -739,7 +743,7 @@ export default class PerpetualDataHandler {
739
743
  */
740
744
  public static async _getPerpetuals(
741
745
  ids: number[],
742
- _proxyContract: Contract,
746
+ _proxyContract: IPerpetualManager,
743
747
  _symbolList: Map<string, string>,
744
748
  overrides?: Overrides
745
749
  ): Promise<PerpetualData[]> {
@@ -810,7 +814,7 @@ export default class PerpetualDataHandler {
810
814
  }
811
815
 
812
816
  public static async getPoolStaticInfo(
813
- _proxyContract: Contract,
817
+ _proxyContract: IPerpetualManager,
814
818
  overrides?: Overrides
815
819
  ): Promise<{
816
820
  nestedPerpetualIDs: Array<Array<number>>;
@@ -855,7 +859,8 @@ export default class PerpetualDataHandler {
855
859
  symbol: string,
856
860
  traderState: bigint[],
857
861
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
858
- _pxS2S3: [number, number]
862
+ pxInfo: IdxPriceInfo,
863
+ isPredMkt: boolean
859
864
  ): MarginAccount {
860
865
  const idx_cash = 3;
861
866
  const idx_notional = 4;
@@ -877,8 +882,9 @@ export default class PerpetualDataHandler {
877
882
  [S2Liq, S3Liq, tau, pnl, unpaidFundingCC] = PerpetualDataHandler._calculateLiquidationPrice(
878
883
  symbol,
879
884
  traderState,
880
- _pxS2S3[0],
881
- symbolToPerpStaticInfo
885
+ pxInfo.s2,
886
+ symbolToPerpStaticInfo,
887
+ isPredMkt
882
888
  );
883
889
  fLockedIn = traderState[idx_locked_in];
884
890
  side = traderState[idx_notional] > 0n ? BUY_SIDE : SELL_SIDE;
@@ -907,7 +913,7 @@ export default class PerpetualDataHandler {
907
913
  * @param symbol Perpetual symbol
908
914
  * @param symbolToPerpStaticInfo Symbol to perp static info mapping
909
915
  * @param _proxyContract Proxy contract instance
910
- * @param _pxS2S3 Prices [S2, S3]
916
+ * @param _pxInfo index price info
911
917
  * @param overrides Optional overrides for eth_call
912
918
  * @returns A Margin account
913
919
  */
@@ -916,7 +922,8 @@ export default class PerpetualDataHandler {
916
922
  symbol: string,
917
923
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
918
924
  _proxyContract: Contract,
919
- _pxS2S3: [number, number],
925
+ _pxInfo: IdxPriceInfo,
926
+ isPredMkt: boolean,
920
927
  overrides?: Overrides
921
928
  ): Promise<MarginAccount> {
922
929
  let perpId = Number(symbol);
@@ -926,10 +933,16 @@ export default class PerpetualDataHandler {
926
933
  let traderState = await _proxyContract.getTraderState(
927
934
  perpId,
928
935
  traderAddr,
929
- _pxS2S3.map((x) => floatToABK64x64(x)) as [bigint, bigint],
936
+ [_pxInfo.ema, _pxInfo.s3 ?? 0].map((x) => floatToABK64x64(x)) as [bigint, bigint],
930
937
  overrides || {}
931
938
  );
932
- return PerpetualDataHandler.buildMarginAccountFromState(symbol, traderState, symbolToPerpStaticInfo, _pxS2S3);
939
+ return PerpetualDataHandler.buildMarginAccountFromState(
940
+ symbol,
941
+ traderState,
942
+ symbolToPerpStaticInfo,
943
+ _pxInfo,
944
+ isPredMkt
945
+ );
933
946
  }
934
947
 
935
948
  /**
@@ -1093,7 +1106,7 @@ export default class PerpetualDataHandler {
1093
1106
  * @param symbolToPerpStaticInfo Symbol to perp static info mapping
1094
1107
  * @param _multicall Multicall3 contract instance
1095
1108
  * @param _proxyContract Proxy contract instance
1096
- * @param _pxS2S3s List of price pairs, [[S2, S3] (1st perp), [S2, S3] (2nd perp), ... ]
1109
+ * @param _pxInfo List of price info
1097
1110
  * @param overrides Optional eth_call overrides
1098
1111
  * @returns List of margin accounts
1099
1112
  */
@@ -1103,15 +1116,16 @@ export default class PerpetualDataHandler {
1103
1116
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1104
1117
  _multicall: Multicall3,
1105
1118
  _proxyContract: Contract,
1106
- _pxS2S3s: number[][],
1119
+ _pxInfo: IdxPriceInfo[],
1120
+ isPredMkt: boolean[],
1107
1121
  overrides?: Overrides
1108
1122
  ): Promise<MarginAccount[]> {
1109
1123
  if (
1110
1124
  traderAddrs.length != symbols.length ||
1111
- traderAddrs.length != _pxS2S3s.length ||
1112
- symbols.length != _pxS2S3s.length
1125
+ traderAddrs.length != _pxInfo.length ||
1126
+ symbols.length != _pxInfo.length
1113
1127
  ) {
1114
- throw new Error("traderAddr, symbol and pxS2S3 should all have the same length");
1128
+ throw new Error("traderAddr, symbol and _pxInfo should all have the same length");
1115
1129
  }
1116
1130
  const proxyCalls: Multicall3.Call3Struct[] = traderAddrs.map((_addr, i) => ({
1117
1131
  target: _proxyContract.target,
@@ -1119,7 +1133,7 @@ export default class PerpetualDataHandler {
1119
1133
  callData: _proxyContract.interface.encodeFunctionData("getTraderState", [
1120
1134
  PerpetualDataHandler.symbolToPerpetualId(symbols[i], symbolToPerpStaticInfo),
1121
1135
  _addr,
1122
- _pxS2S3s[i].map((x) => floatToABK64x64(x)) as [bigint, bigint],
1136
+ [_pxInfo[i].ema, _pxInfo[i].s3 ?? 0].map((x) => floatToABK64x64(x)) as [bigint, bigint],
1123
1137
  ]),
1124
1138
  }));
1125
1139
  const encodedResults = await _multicall.aggregate3.staticCall(proxyCalls, overrides || {});
@@ -1128,10 +1142,13 @@ export default class PerpetualDataHandler {
1128
1142
  return _proxyContract.interface.decodeFunctionResult("getTraderState", returnData)[0];
1129
1143
  });
1130
1144
  return traderStates.map((traderState, i) =>
1131
- PerpetualDataHandler.buildMarginAccountFromState(symbols[i], traderState, symbolToPerpStaticInfo, [
1132
- _pxS2S3s[i][0],
1133
- _pxS2S3s[i][1],
1134
- ])
1145
+ PerpetualDataHandler.buildMarginAccountFromState(
1146
+ symbols[i],
1147
+ traderState,
1148
+ symbolToPerpStaticInfo,
1149
+ _pxInfo[i],
1150
+ isPredMkt[i]
1151
+ )
1135
1152
  );
1136
1153
  }
1137
1154
 
@@ -1139,8 +1156,10 @@ export default class PerpetualDataHandler {
1139
1156
  symbol: string,
1140
1157
  tradeAmount: number,
1141
1158
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1142
- _proxyContract: Contract,
1159
+ _proxyContract: IPerpetualManager,
1143
1160
  indexPrices: [number, number],
1161
+ conf: bigint,
1162
+ params: bigint,
1144
1163
  overrides?: Overrides
1145
1164
  ): Promise<number> {
1146
1165
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
@@ -1149,40 +1168,57 @@ export default class PerpetualDataHandler {
1149
1168
  perpId,
1150
1169
  floatToABK64x64(tradeAmount),
1151
1170
  fIndexPrices as [bigint, bigint],
1171
+ conf,
1172
+ params,
1152
1173
  overrides || {}
1153
1174
  );
1154
1175
  return ABK64x64ToFloat(fPrice);
1155
1176
  }
1156
1177
 
1178
+ /**
1179
+ *
1180
+ * @param symbol perpetual symbol of the form BTC-USDC-USDC
1181
+ * @param symbolToPerpStaticInfo mapping
1182
+ * @param _proxyContract contract instance
1183
+ * @param indexPrices IdxPriceInfo
1184
+ * @param isPredMkt true if prediction market perpetual
1185
+ * @param overrides
1186
+ * @returns mark price
1187
+ */
1157
1188
  protected static async _queryPerpetualMarkPrice(
1158
1189
  symbol: string,
1159
1190
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1160
- _proxyContract: Contract,
1161
- indexPrices: [number, number],
1191
+ _proxyContract: IPerpetualManager,
1192
+ indexPrices: IdxPriceInfo,
1193
+ isPredMkt: boolean,
1162
1194
  overrides?: Overrides
1163
1195
  ): Promise<number> {
1164
1196
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1165
- let [S2, S3] = indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x));
1197
+ let [S2, S3] = [indexPrices.s2, indexPrices.s3].map((x) =>
1198
+ floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)
1199
+ );
1166
1200
  let ammState = await _proxyContract.getAMMState(perpId, [S2, S3], overrides || {});
1167
1201
  // ammState[6] == S2 == indexPrices[0] up to rounding errors (indexPrices is most accurate)
1168
- return indexPrices[0] * (1 + ABK64x64ToFloat(ammState[8]));
1202
+ if (isPredMkt) {
1203
+ return indexPrices.ema + ABK64x64ToFloat(ammState[8]);
1204
+ }
1205
+ return indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
1169
1206
  }
1170
1207
 
1171
1208
  protected static async _queryPerpetualState(
1172
1209
  symbol: string,
1173
1210
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1174
- _proxyContract: Contract,
1211
+ _proxyContract: IPerpetualManager,
1175
1212
  _multicall: Multicall3,
1176
- indexPrices: [number, number, boolean, boolean],
1213
+ indexPrices: IdxPriceInfo,
1177
1214
  overrides?: Overrides
1178
1215
  ): Promise<PerpetualState> {
1179
1216
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1180
1217
  let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
1181
- let [S2, S3] = [indexPrices[0], indexPrices[1]];
1182
1218
  if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
1183
- S3 = S2;
1219
+ indexPrices.s3 = indexPrices.s2;
1184
1220
  } else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
1185
- S3 = 1;
1221
+ indexPrices.s3 = 1;
1186
1222
  }
1187
1223
  // multicall
1188
1224
  const proxyCalls: Multicall3.Call3Struct[] = [
@@ -1191,7 +1227,7 @@ export default class PerpetualDataHandler {
1191
1227
  allowFailure: false,
1192
1228
  callData: _proxyContract.interface.encodeFunctionData("getAMMState", [
1193
1229
  perpId,
1194
- [S2, S3].map(floatToABK64x64) as [bigint, bigint],
1230
+ [indexPrices.s2, indexPrices.s3 ?? 0].map(floatToABK64x64) as [bigint, bigint],
1195
1231
  ]),
1196
1232
  },
1197
1233
  {
@@ -1234,31 +1270,40 @@ export default class PerpetualDataHandler {
1234
1270
  symbol: string,
1235
1271
  ammState: bigint[],
1236
1272
  longShort: [bigint, bigint],
1237
- indexPrices: [number, number, boolean, boolean],
1273
+ indexPrices: IdxPriceInfo,
1238
1274
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
1239
1275
  ) {
1240
1276
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1241
1277
  let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
1242
1278
  let ccy = symbol.split("-");
1243
- let [S2, S3] = [indexPrices[0], indexPrices[1]];
1279
+ let [S2, S3] = [indexPrices.s2, indexPrices.s3];
1244
1280
  if (staticInfo.collateralCurrencyType == CollaterlCCY.BASE) {
1245
1281
  S3 = S2;
1246
1282
  } else if (staticInfo.collateralCurrencyType == CollaterlCCY.QUOTE) {
1247
1283
  S3 = 1;
1248
1284
  }
1249
- let markPrice = S2 * (1 + ABK64x64ToFloat(ammState[8]));
1285
+ const isPred = PerpetualDataHandler.isPredictionMarketStatic(staticInfo);
1286
+ let markPrice: number;
1287
+ if (isPred) {
1288
+ // ema + premium
1289
+ markPrice = indexPrices.ema + ABK64x64ToFloat(ammState[8]);
1290
+ } else {
1291
+ // S2 * (1+premium)
1292
+ markPrice = indexPrices.s2 * (1 + ABK64x64ToFloat(ammState[8]));
1293
+ }
1250
1294
  let state: PerpetualState = {
1251
1295
  id: perpId,
1252
1296
  state: PERP_STATE_STR[Number(ammState[13])],
1253
1297
  baseCurrency: ccy[0],
1254
1298
  quoteCurrency: ccy[1],
1255
1299
  indexPrice: S2,
1256
- collToQuoteIndexPrice: S3,
1300
+ collToQuoteIndexPrice: S3 ?? (ccy[0] === ccy[1] ? S2 : 1),
1301
+ markPremium: ABK64x64ToFloat(ammState[8]),
1257
1302
  markPrice: markPrice,
1258
1303
  midPrice: ABK64x64ToFloat(ammState[10]),
1259
1304
  currentFundingRateBps: ABK64x64ToFloat(ammState[14]) * 1e4,
1260
1305
  openInterestBC: ABK64x64ToFloat(ammState[11]),
1261
- isMarketClosed: indexPrices[2] || indexPrices[3],
1306
+ isMarketClosed: indexPrices.s2MktClosed || (indexPrices.s3MktClosed !== undefined && indexPrices.s3MktClosed),
1262
1307
  longBC: ABK64x64ToFloat(longShort[0]),
1263
1308
  shortBC: ABK64x64ToFloat(longShort[1]),
1264
1309
  };
@@ -1277,7 +1322,8 @@ export default class PerpetualDataHandler {
1277
1322
  symbol: string,
1278
1323
  traderState: bigint[],
1279
1324
  S2: number,
1280
- symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
1325
+ symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1326
+ isPredMarket: boolean
1281
1327
  ): [number, number, number, number, number] {
1282
1328
  const idx_availableCashCC = 2;
1283
1329
  const idx_cash = 3;
@@ -1292,14 +1338,22 @@ export default class PerpetualDataHandler {
1292
1338
  if (perpInfo == undefined) {
1293
1339
  throw new Error(`no info for perpetual ${symbol}`);
1294
1340
  }
1295
- 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]);
1341
+ const tau = perpInfo.maintenanceMarginRate;
1342
+ const lockedInValueQC = ABK64x64ToFloat(traderState[idx_locked_in]);
1343
+ const position = ABK64x64ToFloat(traderState[idx_notional]);
1344
+ const cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
1345
+ const Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
1346
+ const unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC] - traderState[idx_cash]);
1301
1347
  let unpaidFunding = unpaidFundingCC;
1302
1348
 
1349
+ if (isPredMarket) {
1350
+ const S2Liq = pmFindLiquidationPrice(position, S3Liq, lockedInValueQC, cashCC, tau, S2);
1351
+ let pnl = position * Sm - lockedInValueQC + unpaidFunding / S3Liq;
1352
+ // liquidation margin rate
1353
+ const tauLiq = pmMaintenanceMarginRate(position, S2Liq, tau);
1354
+ return [S2Liq, S3Liq, tauLiq, pnl, unpaidFundingCC];
1355
+ }
1356
+ // regular perpetuals:
1303
1357
  if (perpInfo.collateralCurrencyType == CollaterlCCY.BASE) {
1304
1358
  S2Liq = calculateLiquidationPriceCollateralBase(lockedInValueQC, position, cashCC, tau);
1305
1359
  S3Liq = S2Liq;
@@ -1397,7 +1451,7 @@ export default class PerpetualDataHandler {
1397
1451
  }
1398
1452
  // adjust prices for market type
1399
1453
  const sInfo = symbolToPerpInfoMap.get(symbol)!;
1400
- if (PerpetualDataHandler.isPredictionMarket(sInfo)) {
1454
+ if (PerpetualDataHandler.isPredictionMarketStatic(sInfo)) {
1401
1455
  limitPrice = limitPrice !== undefined && limitPrice !== 0 ? priceToProb(limitPrice) : limitPrice;
1402
1456
  stopPrice = stopPrice !== undefined && stopPrice !== 0 ? priceToProb(stopPrice) : stopPrice;
1403
1457
  }
@@ -1416,10 +1470,10 @@ export default class PerpetualDataHandler {
1416
1470
  leverage: Number(order.leverageTDR) / 100,
1417
1471
  deadline: Number(order.iDeadline),
1418
1472
  executionTimestamp: Number(order.executionTimestamp),
1419
- submittedTimestamp: order["submittedTimestamp"] ? Number(order["submittedTimestamp"]) : undefined,
1473
+ submittedTimestamp: "submittedTimestamp" in order ? Number(order.submittedTimestamp) : undefined,
1420
1474
  parentChildOrderIds:
1421
- order["parentChildDigest1"] && order["parentChildDigest2"]
1422
- ? [order["parentChildDigest1"].toString(), order["parentChildDigest2"].toString()]
1475
+ "parentChildDigest1" && "parentChildDigest2" in order
1476
+ ? [order.parentChildDigest1.toString(), order.parentChildDigest2.toString()]
1423
1477
  : undefined,
1424
1478
  };
1425
1479
  return userOrder;
@@ -1450,7 +1504,7 @@ export default class PerpetualDataHandler {
1450
1504
  } else {
1451
1505
  throw Error(`invalid side in order spec, use ${BUY_SIDE} or ${SELL_SIDE}`);
1452
1506
  }
1453
- const isPred = PerpetualDataHandler.isPredictionMarket(perpStaticInfo.get(order.symbol)!);
1507
+ const isPred = PerpetualDataHandler.isPredictionMarketStatic(perpStaticInfo.get(order.symbol)!);
1454
1508
  let fLimitPrice: bigint;
1455
1509
  if (order.limitPrice == undefined) {
1456
1510
  // we need to set the limit price to infinity or zero for
@@ -1960,7 +2014,7 @@ export default class PerpetualDataHandler {
1960
2014
  if (staticInfo == undefined) {
1961
2015
  throw new Error(`Perpetual with symbol ${symbol} not found. Check symbol or use createProxyInstance().`);
1962
2016
  }
1963
- return PerpetualDataHandler.isPredictionMarket(staticInfo);
2017
+ return PerpetualDataHandler.isPredictionMarketStatic(staticInfo);
1964
2018
  }
1965
2019
 
1966
2020
  /**
@@ -1968,8 +2022,7 @@ export default class PerpetualDataHandler {
1968
2022
  * @param staticInfo Perpetual static info
1969
2023
  * @returns True if this is a prediction market
1970
2024
  */
1971
- public static isPredictionMarket(staticInfo: PerpetualStaticInfo) {
1972
- // return true; // for testing
2025
+ public static isPredictionMarketStatic(staticInfo: PerpetualStaticInfo) {
1973
2026
  return containsFlag(staticInfo.perpFlags, MASK_PREDICTION_MARKET);
1974
2027
  }
1975
2028
  }