@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
@@ -52,7 +52,7 @@ class MarketData extends perpetualDataHandler_1.default {
52
52
  const mktData = providerOrMarketData;
53
53
  this.nodeURL = mktData.config.nodeURL;
54
54
  this.provider = new ethers_1.JsonRpcProvider(mktData.config.nodeURL, mktData.network, { staticNetwork: true });
55
- this.proxyContract = new ethers_1.Contract(mktData.getProxyAddress(), this.config.proxyABI, this.provider);
55
+ this.proxyContract = contracts_1.IPerpetualManager__factory.connect(mktData.getProxyAddress(), this.provider);
56
56
  this.multicall = contracts_1.Multicall3__factory.connect(this.config.multicall ?? constants_1.MULTICALL_ADDRESS, this.provider);
57
57
  ({
58
58
  nestedPerpetualIDs: this.nestedPerpetualIDs,
@@ -106,7 +106,7 @@ class MarketData extends perpetualDataHandler_1.default {
106
106
  * }
107
107
  * main();
108
108
  *
109
- * @returns {Contract} read-only proxy instance
109
+ * @returns read-only proxy instance
110
110
  */
111
111
  getReadOnlyProxyInstance() {
112
112
  if (this.proxyContract == null) {
@@ -286,7 +286,8 @@ class MarketData extends perpetualDataHandler_1.default {
286
286
  */
287
287
  async _positionRiskForTraderInPerpetual(traderAddr, symbol, provider, overrides) {
288
288
  let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
289
- let mgnAcct = await perpetualDataHandler_1.default.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), [obj.idxPrices[0], obj.idxPrices[1]], overrides);
289
+ const isPred = this.isPredictionMarket(symbol);
290
+ let mgnAcct = await perpetualDataHandler_1.default.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), obj, isPred, overrides);
290
291
  return mgnAcct;
291
292
  }
292
293
  /**
@@ -298,122 +299,67 @@ class MarketData extends perpetualDataHandler_1.default {
298
299
  */
299
300
  async _positionRiskForTraderInPerpetuals(traderAddr, symbols, provider, overrides) {
300
301
  const MAX_SYMBOLS_PER_CALL = 10;
301
- const S2S3 = new Array();
302
+ const pxInfo = new Array();
302
303
  for (let i = 0; i < symbols.length; i++) {
303
304
  let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbols[i]);
304
- S2S3.push([obj.idxPrices[0], obj.idxPrices[1]]);
305
+ pxInfo.push(obj);
305
306
  }
306
307
  let mgnAcct = [];
307
308
  let callSymbols = symbols.slice(0, MAX_SYMBOLS_PER_CALL);
308
- let pxS2S3 = S2S3.slice(0, MAX_SYMBOLS_PER_CALL);
309
+ let _px = pxInfo.slice(0, MAX_SYMBOLS_PER_CALL);
309
310
  while (callSymbols.length > 0) {
310
- let acc = await perpetualDataHandler_1.default.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, contracts_1.Multicall3__factory.connect(this.config.multicall ?? constants_1.MULTICALL_ADDRESS, provider), new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), pxS2S3, overrides);
311
+ const isPred = callSymbols.map((_sym) => this.isPredictionMarket(_sym));
312
+ let acc = await perpetualDataHandler_1.default.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, contracts_1.Multicall3__factory.connect(this.config.multicall ?? constants_1.MULTICALL_ADDRESS, provider), new ethers_1.Contract(this.proxyAddr, this.config.proxyABI, provider), _px, isPred, overrides);
311
313
  mgnAcct = mgnAcct.concat(acc);
312
314
  callSymbols = symbols.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
313
- pxS2S3 = S2S3.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
315
+ _px = pxInfo.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
314
316
  }
315
317
  return mgnAcct;
316
318
  }
317
- /**
318
- * Estimates what the position risk will be if a given order is executed.
319
- * @param traderAddr Address of trader
320
- * @param order Order to be submitted
321
- * @param account Position risk before trade. Defaults to current position if not given.
322
- * @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
323
- * @returns Position risk after trade, including order cost and maximal trade sizes for position
324
- * @example
325
- * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
326
- * async function main() {
327
- * console.log(MarketData);
328
- * // setup
329
- * const config = PerpetualDataHandler.readSDKConfig("cardona");
330
- * const mktData = new MarketData(config);
331
- * await mktData.createProxyInstance();
332
- * const order: Order = {
333
- * symbol: "MATIC-USD-MATIC",
334
- * side: "BUY",
335
- * type: "MARKET",
336
- * quantity: 100,
337
- * leverage: 2,
338
- * executionTimestamp: Date.now()/1000,
339
- * };
340
- * // Get position risk conditional on this order being executed
341
- * const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order);
342
- * console.log(posRisk);
343
- * }
344
- * main();
345
- */
346
- async positionRiskOnTrade(traderAddr, order, account, indexPriceInfo, overrides) {
319
+ async dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides) {
347
320
  if (this.proxyContract == null || this.multicall == null) {
348
321
  throw Error("no proxy contract initialized. Use createProxyInstance().");
349
322
  }
350
- // fetch prices
351
- if (indexPriceInfo == undefined) {
352
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
353
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
354
- }
355
- // override total fee
356
- let tradingFeeTbps;
357
- if (overrides) {
358
- ({ tradingFeeTbps, ...overrides } = overrides);
359
- }
360
- // signed trade amount
361
- let tradeAmountBC = Math.abs(order.quantity) * (order.side == constants_1.BUY_SIDE ? 1 : -1);
362
- const accountGiven = account !== undefined;
323
+ const isPredMkt = this.isPredictionMarket(symbol);
363
324
  // create all calls
364
- const poolId = perpetualDataHandler_1.default._getPoolIdFromSymbol(order.symbol, this.poolStaticInfos);
365
- const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(order.symbol, this.symbolToPerpStaticInfo);
366
- const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
325
+ const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
326
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
367
327
  const proxyCalls = [
368
328
  // 0: traderState
369
329
  {
370
330
  target: this.proxyContract.target,
371
331
  allowFailure: true,
372
- callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, fS2S3]),
373
- },
374
- // 1: ammState
375
- {
376
- target: this.proxyContract.target,
377
- allowFailure: true,
378
- callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, fS2S3]),
379
- },
380
- // 2: exchangeFee
381
- {
382
- target: this.proxyContract.target,
383
- allowFailure: false,
384
- callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
385
- poolId,
386
- traderAddr,
387
- order.brokerAddr ?? constants_1.ZERO_ADDRESS,
388
- ]),
332
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
389
333
  },
390
- // 3: perpetual price
334
+ // 1: perpetual price
391
335
  {
392
336
  target: this.proxyContract.target,
393
337
  allowFailure: true,
394
338
  callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
395
339
  perpId,
396
340
  (0, d8XMath_1.floatToABK64x64)(tradeAmountBC),
397
- fS2S3,
341
+ [fS2, fS3],
342
+ indexPriceInfo.conf,
343
+ indexPriceInfo.predMktCLOBParams,
398
344
  ]),
399
345
  },
400
- // 4: max long pos
346
+ // 2: max long pos
401
347
  {
402
348
  target: this.proxyContract.target,
403
349
  allowFailure: false,
404
350
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
405
351
  perpId,
406
- account ? (0, d8XMath_1.floatToABK64x64)(account.positionNotionalBaseCCY * (account.side === constants_1.BUY_SIDE ? 1 : -1)) : 0n,
352
+ (0, d8XMath_1.floatToABK64x64)(signedPositionNotionalBaseCCY),
407
353
  true,
408
354
  ]),
409
355
  },
410
- // 5: max short pos
356
+ // 3: max short pos
411
357
  {
412
358
  target: this.proxyContract.target,
413
359
  allowFailure: false,
414
360
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
415
361
  perpId,
416
- account ? (0, d8XMath_1.floatToABK64x64)(account.positionNotionalBaseCCY * (account.side === constants_1.BUY_SIDE ? 1 : -1)) : 0n,
362
+ (0, d8XMath_1.floatToABK64x64)(signedPositionNotionalBaseCCY),
417
363
  false,
418
364
  ]),
419
365
  },
@@ -421,44 +367,84 @@ class MarketData extends perpetualDataHandler_1.default {
421
367
  // multicall
422
368
  const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, (overrides || {}));
423
369
  // positionRisk to apply this trade on: if not given, defaults to the current trader's position
424
- if (!account) {
425
- let traderState;
426
- if (encodedResults[0].success) {
427
- traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
428
- }
429
- else {
430
- traderState = await this.proxyContract.getTraderState(perpId, traderAddr, fS2S3);
431
- }
432
- account = MarketData.buildMarginAccountFromState(order.symbol, traderState, this.symbolToPerpStaticInfo, [
433
- indexPriceInfo[0],
434
- indexPriceInfo[1],
435
- ]);
436
- }
437
- // perpetualState, for prices
438
- let ammState;
439
- if (encodedResults[1].success) {
440
- ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[1].returnData)[0];
370
+ let traderState;
371
+ if (encodedResults[0].success) {
372
+ traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
441
373
  }
442
374
  else {
443
- ammState = await this.proxyContract.getAMMState(perpId, fS2S3);
375
+ traderState = await this.proxyContract.getTraderState(perpId, traderAddr, [fEma, fS3]);
444
376
  }
445
- const perpetualState = perpetualDataHandler_1.default._parseAMMState(order.symbol, ammState, [0n, 0n], // not used below
446
- indexPriceInfo, this.symbolToPerpStaticInfo);
447
- let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
448
- // exchange fee based on this trader's address (volume, token holding, etc) and his broker address (if any)
449
- const exchangeFeeTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
377
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
450
378
  // amm price for this trade amount
451
379
  let ammPrice;
452
380
  {
453
381
  let fPrice;
454
- if (encodedResults[3].success) {
455
- fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[3].returnData)[0];
382
+ if (encodedResults[1].success) {
383
+ fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[1].returnData)[0];
456
384
  }
457
385
  else {
458
- fPrice = await this.proxyContract.queryPerpetualPrice(perpId, (0, d8XMath_1.floatToABK64x64)(tradeAmountBC), fS2S3);
386
+ fPrice = await this.proxyContract.queryPerpetualPrice(perpId, (0, d8XMath_1.floatToABK64x64)(tradeAmountBC), [(0, d8XMath_1.floatToABK64x64)(indexPriceInfo.s2), (0, d8XMath_1.floatToABK64x64)(indexPriceInfo.s3 ?? 0)], indexPriceInfo.conf, indexPriceInfo.predMktCLOBParams);
459
387
  }
460
388
  ammPrice = (0, d8XMath_1.ABK64x64ToFloat)(fPrice);
461
389
  }
390
+ // max buy
391
+ const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[2].returnData)[0];
392
+ const maxLongTrade = Math.max(0, (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) - signedPositionNotionalBaseCCY);
393
+ // max sell
394
+ const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[3].returnData)[0];
395
+ const maxShortTrade = Math.max(0, Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) - signedPositionNotionalBaseCCY);
396
+ return { account: account, ammPrice: ammPrice, maxShortTrade: maxShortTrade, maxLongTrade: maxLongTrade };
397
+ }
398
+ /**
399
+ * Estimates what the position risk will be if a given order is executed.
400
+ * @param traderAddr Address of trader
401
+ * @param order Order to be submitted
402
+ * @param signedPositionNotionalBaseCCY signed position notional of current position (before trade)
403
+ * @param tradingFeeTbps trading fee in tenth of basis points (exchange fee and broker fee)
404
+ * @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
405
+ * @returns Position risk after trade, including order cost and maximal trade sizes for position
406
+ * @example
407
+ * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
408
+ * async function main() {
409
+ * console.log(MarketData);
410
+ * // setup
411
+ * const config = PerpetualDataHandler.readSDKConfig("cardona");
412
+ * const mktData = new MarketData(config);
413
+ * await mktData.createProxyInstance();
414
+ * const order: Order = {
415
+ * symbol: "MATIC-USD-MATIC",
416
+ * side: "BUY",
417
+ * type: "MARKET",
418
+ * quantity: 100,
419
+ * leverage: 2,
420
+ * executionTimestamp: Date.now()/1000,
421
+ * };
422
+ * // Get position risk conditional on this order being executed
423
+ * const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order, 0, 60);
424
+ * console.log(posRisk);
425
+ * }
426
+ * main();
427
+ */
428
+ async positionRiskOnTrade(traderAddr, order, signedPositionNotionalBaseCCY, tradingFeeTbps, indexPriceInfo, overrides) {
429
+ if (this.proxyContract == null || this.multicall == null) {
430
+ throw Error("no proxy contract initialized. Use createProxyInstance().");
431
+ }
432
+ const isPredMkt = this.isPredictionMarket(order.symbol);
433
+ // fetch prices
434
+ if (indexPriceInfo == undefined) {
435
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
436
+ }
437
+ // signed trade amount
438
+ let tradeAmountBC = Math.abs(order.quantity) * (order.side == constants_1.BUY_SIDE ? 1 : -1);
439
+ const symbol = order.symbol;
440
+ let obj = await this.dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides);
441
+ const account = obj.account;
442
+ const maxLongTrade = obj.maxLongTrade;
443
+ const maxShortTrade = obj.maxShortTrade;
444
+ const ammPrice = obj.ammPrice;
445
+ let Sm = account.markPrice;
446
+ let S2 = indexPriceInfo.s2;
447
+ let S3 = account.collToQuoteConversion;
462
448
  // price for this order = amm price if no limit given, else conservatively adjusted
463
449
  let tradePrice;
464
450
  if (order.limitPrice == undefined) {
@@ -494,16 +480,6 @@ class MarketData extends perpetualDataHandler_1.default {
494
480
  }
495
481
  }
496
482
  }
497
- // max buy
498
- const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[4].returnData)[0];
499
- const maxLongTrade = account.side == constants_1.BUY_SIDE
500
- ? Math.max(0, (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) - (accountGiven ? 0 : account.positionNotionalBaseCCY))
501
- : (0, d8XMath_1.ABK64x64ToFloat)(fMaxLong) + account.positionNotionalBaseCCY;
502
- // max sell
503
- const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[5].returnData)[0];
504
- const maxShortTrade = account.side == constants_1.SELL_SIDE
505
- ? Math.max(0, Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) - (accountGiven ? 0 : Math.abs(account.positionNotionalBaseCCY)))
506
- : Math.abs((0, d8XMath_1.ABK64x64ToFloat)(fMaxShort)) + Math.abs(account.positionNotionalBaseCCY);
507
483
  // Current state:
508
484
  let lotSizeBC = MarketData._getLotSize(order.symbol, this.symbolToPerpStaticInfo);
509
485
  // Too small, no change to account
@@ -525,10 +501,6 @@ class MarketData extends perpetualDataHandler_1.default {
525
501
  newPositionBC = 0;
526
502
  }
527
503
  let newSide = newPositionBC > 0 ? constants_1.BUY_SIDE : newPositionBC < 0 ? constants_1.SELL_SIDE : constants_1.CLOSED_SIDE;
528
- if (tradingFeeTbps === undefined) {
529
- // use usual input if not overriden
530
- tradingFeeTbps = Number(exchangeFeeTbps) + (order.brokerFeeTbps ?? 0);
531
- }
532
504
  let tradingFeeCC = (Math.abs(tradeAmountBC) * tradingFeeTbps * 1e-5 * S2) / S3;
533
505
  let referralFeeCC = this.symbolToPerpStaticInfo.get(account.symbol).referralRebate;
534
506
  // Trade type:
@@ -553,7 +525,7 @@ class MarketData extends perpetualDataHandler_1.default {
553
525
  let initialMarginRate = this.symbolToPerpStaticInfo.get(account.symbol).initialMarginRate;
554
526
  targetLvg = isFlip || isOpen ? order.leverage ?? 1 / initialMarginRate : 0;
555
527
  let [b0, pos0] = isOpen ? [0, 0] : [account.collateralCC, currentPositionBC];
556
- traderDepositCC = (0, d8XMath_1.getDepositAmountForLvgTrade)(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm);
528
+ traderDepositCC = (0, d8XMath_1.getDepositAmountForLvgTrade)(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm, isPredMkt);
557
529
  // fees are paid from wallet in this case
558
530
  traderDepositCC += tradingFeeCC + referralFeeCC;
559
531
  }
@@ -572,13 +544,23 @@ class MarketData extends perpetualDataHandler_1.default {
572
544
  let newMarginCashCC = currentMarginCashCC + deltaCashCC + traderDepositCC;
573
545
  let newEntryPrice = newPositionBC == 0 ? 0 : Math.abs(newLockedInValueQC / newPositionBC);
574
546
  let newMarginBalanceCC = newMarginCashCC + (newPositionBC * Sm - newLockedInValueQC) / S3;
575
- let newLeverage = newPositionBC == 0
576
- ? 0
577
- : newMarginBalanceCC <= 0
578
- ? Infinity
579
- : (Math.abs(newPositionBC) * Sm) / S3 / newMarginBalanceCC;
547
+ let newLeverage;
548
+ if (newPositionBC === 0) {
549
+ newLeverage = 0;
550
+ }
551
+ else if (newMarginBalanceCC <= 0) {
552
+ newLeverage = Infinity;
553
+ }
554
+ else {
555
+ let p = Sm;
556
+ if (isPredMkt) {
557
+ p -= 1;
558
+ p = newPositionBC > 0 ? p : 1 - p;
559
+ }
560
+ newLeverage = Math.abs(newPositionBC * p) / S3 / newMarginBalanceCC;
561
+ }
580
562
  // Liquidation params
581
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
563
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
582
564
  // New position risk
583
565
  let newPositionRisk = {
584
566
  symbol: account.symbol,
@@ -601,6 +583,18 @@ class MarketData extends perpetualDataHandler_1.default {
601
583
  maxShortTrade: maxShortTrade,
602
584
  };
603
585
  }
586
+ /**
587
+ * Fee is relative to base-currency amount (=trade amount)
588
+ * @param state current perpetual state (need longBC and shortBC)
589
+ * @param maxMaintMgnRate maintenance margin rate param for pred mkts
590
+ * @param Sm Mark price
591
+ * @param tradeAmtBC signed trade amount
592
+ * @param tradeMgnRate margin rate param from perpetual
593
+ * @returns relative exchange fee in decimals
594
+ */
595
+ static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
596
+ return (0, d8XMath_1.pmExchangeFee)(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
597
+ }
604
598
  /**
605
599
  * Estimates what the position risk will be if given amount of collateral is added/removed from the account.
606
600
  * @param {number} deltaCollateral Amount of collateral to add or remove (signed)
@@ -630,11 +624,17 @@ class MarketData extends perpetualDataHandler_1.default {
630
624
  throw new Error("not enough margin to remove");
631
625
  }
632
626
  if (indexPriceInfo == undefined) {
633
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
634
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
627
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
635
628
  }
636
629
  let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
637
- let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
630
+ let Sm; //mark price
631
+ if (this.isPredictionMarket(account.symbol)) {
632
+ Sm = indexPriceInfo.ema + perpetualState.markPremium;
633
+ }
634
+ else {
635
+ Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
636
+ }
637
+ let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
638
638
  // no position: just increase collateral and kill liquidation vars
639
639
  if (account.positionNotionalBaseCCY == 0) {
640
640
  return {
@@ -674,7 +674,7 @@ class MarketData extends perpetualDataHandler_1.default {
674
674
  }
675
675
  let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
676
676
  // Liquidation params
677
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
677
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
678
678
  // New position risk
679
679
  let newPositionRisk = {
680
680
  symbol: account.symbol,
@@ -693,35 +693,39 @@ class MarketData extends perpetualDataHandler_1.default {
693
693
  return newPositionRisk;
694
694
  }
695
695
  /**
696
- * Calculates liquidation prices for a given position
696
+ * Calculates liquidation prices for a position
697
+ * constructed in positionRiskOnTrade/positionRiskOnCollateralAction
697
698
  * @param symbol Perpetual symbol
698
699
  * @param lockedInQC Locked in value
699
700
  * @param signedPositionBC Signed position size
700
- * @param marginCashCC Cash in margin account
701
+ * @param marginCashCC Available cash in margin account (includes unpaid funding)
701
702
  * @param markPrice Mark price
702
- * @param collToQuoteConversion Collateral index price
703
+ * @param collToQuoteConversion Collateral index price (S3)
704
+ * @param S2 index price
703
705
  * @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
704
706
  * @returns [Base index price, Collateral index price, Maintenance margin rate]
705
707
  * @ignore
706
708
  */
707
- static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
709
+ static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
708
710
  let S2Liq, S3Liq;
709
- let tau = symbolToPerpStaticInfo.get(symbol).maintenanceMarginRate;
710
- let ccyType = symbolToPerpStaticInfo.get(symbol).collateralCurrencyType;
711
- if (ccyType == constants_1.CollaterlCCY.BASE) {
712
- S2Liq = (0, d8XMath_1.calculateLiquidationPriceCollateralBase)(lockedInQC, signedPositionBC, marginCashCC, tau);
713
- S3Liq = S2Liq;
714
- }
715
- else if (ccyType == constants_1.CollaterlCCY.QUANTO) {
716
- S3Liq = collToQuoteConversion;
717
- S2Liq = (0, d8XMath_1.calculateLiquidationPriceCollateralQuanto)(lockedInQC, signedPositionBC, marginCashCC, tau, collToQuoteConversion, markPrice);
718
- }
719
- else {
720
- S2Liq = (0, d8XMath_1.calculateLiquidationPriceCollateralQuote)(lockedInQC, signedPositionBC, marginCashCC, tau);
721
- }
722
- // floor at 0
723
- S2Liq = S2Liq < 0 ? 0 : S2Liq;
724
- S3Liq = S3Liq && S3Liq < 0 ? 0 : S3Liq;
711
+ const staticInfo = symbolToPerpStaticInfo.get(symbol);
712
+ let tau = staticInfo.maintenanceMarginRate;
713
+ let ccyType = staticInfo.collateralCurrencyType;
714
+ const isPred = MarketData.isPredictionMarketStatic(staticInfo);
715
+ const idx_availableCashCC = 2;
716
+ const idx_cash = 3;
717
+ const idx_notional = 4;
718
+ const idx_locked_in = 5;
719
+ const idx_mark_price = 8;
720
+ const idx_s3 = 9;
721
+ let traderState = new Array(10);
722
+ traderState[idx_availableCashCC] = (0, d8XMath_1.floatToABK64x64)(marginCashCC);
723
+ traderState[idx_cash] = traderState[idx_availableCashCC];
724
+ traderState[idx_notional] = (0, d8XMath_1.floatToABK64x64)(signedPositionBC);
725
+ traderState[idx_locked_in] = (0, d8XMath_1.floatToABK64x64)(lockedInQC);
726
+ traderState[idx_mark_price] = (0, d8XMath_1.floatToABK64x64)(markPrice);
727
+ traderState[idx_s3] = (0, d8XMath_1.floatToABK64x64)(collToQuoteConversion);
728
+ [S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
725
729
  return [S2Liq, S3Liq, tau];
726
730
  }
727
731
  /**
@@ -889,22 +893,28 @@ class MarketData extends perpetualDataHandler_1.default {
889
893
  if (!this.proxyContract || !this.multicall) {
890
894
  throw new Error("proxy contract not initialized");
891
895
  }
896
+ if (this.isPredictionMarket(symbol)) {
897
+ // prediction markets
898
+ return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
899
+ }
900
+ // regular markets
901
+ return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
902
+ }
903
+ async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
904
+ if (!this.proxyContract || !this.multicall) {
905
+ throw new Error("proxy contract not initialized");
906
+ }
907
+ const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
892
908
  const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
893
- const poolId = this.getPoolIdFromSymbol(symbol);
894
909
  const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
895
- const perpInfo = this.getPerpetualStaticInfo(symbol);
896
- const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
897
- const indexPriceInfo = await this.priceFeedGetter
898
- .fetchPricesForPerpetual(symbol)
899
- .then((obj) => [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]]);
900
- const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
901
- let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
910
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
911
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
902
912
  const proxyCalls = [
903
913
  // 0: traderState
904
914
  {
905
915
  target: this.proxyContract.target,
906
916
  allowFailure: false,
907
- callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, fS2S3]),
917
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
908
918
  },
909
919
  // 1: wallet balance
910
920
  {
@@ -912,31 +922,53 @@ class MarketData extends perpetualDataHandler_1.default {
912
922
  allowFailure: false,
913
923
  callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
914
924
  },
915
- // 2: exchange fee
925
+ // 2: amm state
916
926
  {
917
927
  target: this.proxyContract.target,
918
928
  allowFailure: false,
919
- callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
920
- poolId,
921
- traderAddr,
922
- constants_1.ZERO_ADDRESS,
923
- ]),
929
+ callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
924
930
  },
925
931
  ];
926
932
  // multicall
927
933
  const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
928
- // position risk
929
- const idxNotional = 4;
930
934
  const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
931
- const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, [
932
- indexPriceInfo[0],
933
- indexPriceInfo[1],
934
- ]);
935
- // fee rate
936
- const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
937
- const feeRate = 1e-5 * Number(feeRateTbps);
938
- // Max based on margin requirements:
939
935
  const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
936
+ const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
937
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
938
+ );
939
+ const openInterestBC = (0, d8XMath_1.ABK64x64ToFloat)(ammState[11]);
940
+ const net = -(0, d8XMath_1.ABK64x64ToFloat)(ammState[1]);
941
+ let totLong, totShort;
942
+ if (net < 0) {
943
+ totLong = openInterestBC;
944
+ totShort = openInterestBC - Math.abs(net);
945
+ }
946
+ else {
947
+ totLong = openInterestBC - net;
948
+ totShort = openInterestBC;
949
+ }
950
+ let currentPositionBC = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
951
+ const Sm = (0, d8XMath_1.ABK64x64ToFloat)(traderState[8]);
952
+ // settlement token must be equal to collateral token for walletBalance to be correct
953
+ const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
954
+ const idxNotional = 4;
955
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
956
+ const maxShort = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
957
+ const maxLong = (0, d8XMath_1.pmFindMaxTradeSize)(1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
958
+ return { buy: maxLong, sell: maxShort };
959
+ }
960
+ /**
961
+ * Returns the maximal allowed short pos and long pos (signed) for a trader
962
+ * with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
963
+ * @param perpId
964
+ * @param currentTraderPos ABDK64x64 notional position of trader
965
+ * @param overrides
966
+ * @returns [maxShortPos, maxLongPos] signed maximal position sizes
967
+ */
968
+ async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
969
+ if (!this.proxyContract || !this.multicall) {
970
+ throw new Error("proxy contract not initialized");
971
+ }
940
972
  const proxyCalls2 = [
941
973
  // 0: max long
942
974
  {
@@ -944,7 +976,7 @@ class MarketData extends perpetualDataHandler_1.default {
944
976
  allowFailure: false,
945
977
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
946
978
  perpId,
947
- traderState[idxNotional],
979
+ currentTraderPos,
948
980
  true,
949
981
  ]),
950
982
  },
@@ -954,7 +986,7 @@ class MarketData extends perpetualDataHandler_1.default {
954
986
  allowFailure: false,
955
987
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
956
988
  perpId,
957
- traderState[idxNotional],
989
+ currentTraderPos,
958
990
  false,
959
991
  ]),
960
992
  },
@@ -964,15 +996,66 @@ class MarketData extends perpetualDataHandler_1.default {
964
996
  // Max based on perp:
965
997
  // max buy
966
998
  const maxLongOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[0].returnData)[0]);
967
- const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(traderState[idxNotional]);
999
+ const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
968
1000
  // max short
969
1001
  const maxShortOrderPerp = (0, d8XMath_1.ABK64x64ToFloat)(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[1].returnData)[0]);
970
- const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(traderState[idxNotional]);
1002
+ const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
1003
+ return [maxShortPosPerp, maxLongPosPerp];
1004
+ }
1005
+ async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
1006
+ const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
1007
+ const poolId = this.getPoolIdFromSymbol(symbol);
1008
+ const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
1009
+ const perpInfo = this.getPerpetualStaticInfo(symbol);
1010
+ const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
1011
+ const isPredMkt = false;
1012
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1013
+ let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
1014
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
1015
+ if (!this.proxyContract || !this.multicall) {
1016
+ throw new Error("proxy contract not initialized");
1017
+ }
1018
+ const proxyCalls = [
1019
+ // 0: traderState
1020
+ {
1021
+ target: this.proxyContract.target,
1022
+ allowFailure: false,
1023
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
1024
+ },
1025
+ // 1: wallet balance
1026
+ {
1027
+ target: poolInfo.poolSettleTokenAddr,
1028
+ allowFailure: false,
1029
+ callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
1030
+ },
1031
+ // 2: exchange fee
1032
+ {
1033
+ target: this.proxyContract.target,
1034
+ allowFailure: false,
1035
+ callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
1036
+ poolId,
1037
+ traderAddr,
1038
+ constants_1.ZERO_ADDRESS,
1039
+ ]),
1040
+ },
1041
+ ];
1042
+ // multicall
1043
+ const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
1044
+ // position risk
1045
+ const idxNotional = 4;
1046
+ const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
1047
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
1048
+ // fee rate
1049
+ const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
1050
+ const feeRate = 1e-5 * Number(feeRateTbps);
1051
+ // Max based on margin requirements:
1052
+ const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
1053
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
971
1054
  const curPos = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
972
1055
  const px = await coll2SettlePromise;
973
1056
  const walletBalanceInMgnToken = walletBalance / px;
974
- const maxLongPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo[0], account.collToQuoteConversion);
975
- const maxShortPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo[0], account.collToQuoteConversion);
1057
+ const maxLongPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
1058
+ const maxShortPosAccount = (0, d8XMath_1.getMaxSignedPositionSize)(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
976
1059
  // max long/short all accounted for
977
1060
  const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
978
1061
  const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
@@ -1035,8 +1118,7 @@ class MarketData extends perpetualDataHandler_1.default {
1035
1118
  if (!this.proxyContract) {
1036
1119
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1037
1120
  }
1038
- let px = await this.proxyContract.getOraclePrice([(0, utils_1.toBytes4)(base), (0, utils_1.toBytes4)(quote)], overrides || {});
1039
- return px == undefined ? undefined : (0, d8XMath_1.ABK64x64ToFloat)(px);
1121
+ return await this.proxyContract.getOraclePrice([(0, utils_1.toBytes4)(base), (0, utils_1.toBytes4)(quote)], overrides || {});
1040
1122
  }
1041
1123
  /**
1042
1124
  * Get the status of an order given a symbol and order Id
@@ -1105,6 +1187,7 @@ class MarketData extends perpetualDataHandler_1.default {
1105
1187
  /**
1106
1188
  * Get the current mark price
1107
1189
  * @param symbol symbol of the form ETH-USD-MATIC
1190
+ * @param indexPrices optional. IdxPriceInfo
1108
1191
  * @example
1109
1192
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1110
1193
  * async function main() {
@@ -1126,15 +1209,15 @@ class MarketData extends perpetualDataHandler_1.default {
1126
1209
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1127
1210
  }
1128
1211
  if (indexPrices == undefined) {
1129
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1130
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1212
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1131
1213
  }
1132
- return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
1214
+ return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
1133
1215
  }
1134
1216
  /**
1135
1217
  * get the current price for a given quantity
1136
1218
  * @param symbol symbol of the form ETH-USD-MATIC
1137
1219
  * @param quantity quantity to be traded, negative if short
1220
+ * @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
1138
1221
  * @example
1139
1222
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1140
1223
  * async function main() {
@@ -1151,16 +1234,18 @@ class MarketData extends perpetualDataHandler_1.default {
1151
1234
  *
1152
1235
  * @returns {number} price
1153
1236
  */
1154
- async getPerpetualPrice(symbol, quantity, indexPrices, overrides) {
1237
+ async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
1155
1238
  if (this.proxyContract == null) {
1156
1239
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1157
1240
  }
1158
- if (indexPrices == undefined) {
1241
+ if (priceInfo == undefined) {
1159
1242
  // fetch from API
1160
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1161
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1243
+ priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1162
1244
  }
1163
- return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides);
1245
+ return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3 ?? 0], //s2,s3
1246
+ priceInfo.conf, //conf
1247
+ priceInfo.predMktCLOBParams, //params
1248
+ overrides);
1164
1249
  }
1165
1250
  /**
1166
1251
  * Query recent perpetual state from blockchain
@@ -1172,8 +1257,7 @@ class MarketData extends perpetualDataHandler_1.default {
1172
1257
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1173
1258
  }
1174
1259
  if (indexPriceInfo == undefined) {
1175
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1176
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
1260
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1177
1261
  }
1178
1262
  let state = await perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
1179
1263
  return state;
@@ -1369,7 +1453,7 @@ class MarketData extends perpetualDataHandler_1.default {
1369
1453
  * Result is in collateral currency
1370
1454
  * @param {string} traderAddr address of the trader
1371
1455
  * @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
1372
- * @param indexPrices optional index prices, will otherwise fetch from REST API
1456
+ * @param indexPrices optional indexPriceInfo
1373
1457
  * @returns available margin in collateral currency
1374
1458
  * @example
1375
1459
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
@@ -1391,11 +1475,10 @@ class MarketData extends perpetualDataHandler_1.default {
1391
1475
  }
1392
1476
  if (indexPrices == undefined) {
1393
1477
  // fetch from API
1394
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1395
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1478
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1396
1479
  }
1397
1480
  let perpID = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
1398
- let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map((x) => (0, d8XMath_1.floatToABK64x64)(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
1481
+ let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, [indexPrices.s2, indexPrices.s3].map((x) => (0, d8XMath_1.floatToABK64x64)(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
1399
1482
  const idx_availableMargin = 1;
1400
1483
  let mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
1401
1484
  return mgn;
@@ -1662,7 +1745,8 @@ class MarketData extends perpetualDataHandler_1.default {
1662
1745
  quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perp.S2QuoteCCY, _symbolList),
1663
1746
  indexPrice: 0,
1664
1747
  collToQuoteIndexPrice: 0,
1665
- markPrice: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
1748
+ markPremium: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
1749
+ markPrice: 0,
1666
1750
  midPrice: 0,
1667
1751
  currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perp.fCurrentFundingRate),
1668
1752
  openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perp.fOpenInterest),
@@ -1711,7 +1795,6 @@ class MarketData extends perpetualDataHandler_1.default {
1711
1795
  perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
1712
1796
  }
1713
1797
  perp.indexPrice = idxPriceS2Pair[0];
1714
- perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
1715
1798
  let indexS3 = 1;
1716
1799
  if (info.collateralCurrencyType == constants_1.COLLATERAL_CURRENCY_BASE) {
1717
1800
  indexS3 = idxPriceS2Pair[0];
@@ -1720,6 +1803,18 @@ class MarketData extends perpetualDataHandler_1.default {
1720
1803
  indexS3 = idxPriceS3Pair[0];
1721
1804
  }
1722
1805
  perp.collToQuoteIndexPrice = indexS3;
1806
+ const emaKey = info.S2Symbol + ":ema";
1807
+ let markPrice;
1808
+ if (idxPriceMap.has(emaKey)) {
1809
+ let ema;
1810
+ let res = idxPriceMap.get(emaKey);
1811
+ ema = res[0];
1812
+ markPrice = ema + perp.markPremium;
1813
+ }
1814
+ else {
1815
+ markPrice = perp.indexPrice * (1 + perp.markPremium);
1816
+ }
1817
+ perp.markPrice = markPrice;
1723
1818
  perp.midPrice = midPriceMap.get(symbol3s);
1724
1819
  // which pool?
1725
1820
  const poolId = info.poolId;