@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
@@ -1,7 +1,7 @@
1
1
  import { Contract, formatUnits, Interface, JsonRpcProvider } from "ethers";
2
- import { BUY_SIDE, CLOSED_SIDE, COLLATERAL_CURRENCY_BASE, COLLATERAL_CURRENCY_QUANTO, CollaterlCCY, ERC20_ABI, MULTICALL_ADDRESS, ORDER_TYPE_MARKET, PERP_STATE_STR, SELL_SIDE, ZERO_ADDRESS, ZERO_ORDER_ID, } from "./constants";
3
- import { ERC20__factory, Multicall3__factory, } from "./contracts";
4
- import { ABK64x64ToFloat, calculateLiquidationPriceCollateralBase, calculateLiquidationPriceCollateralQuanto, calculateLiquidationPriceCollateralQuote, dec18ToFloat, decNToFloat, floatToABK64x64, getDepositAmountForLvgTrade, getMaxSignedPositionSize, } from "./d8XMath";
2
+ import { BUY_SIDE, CLOSED_SIDE, COLLATERAL_CURRENCY_BASE, COLLATERAL_CURRENCY_QUANTO, ERC20_ABI, MULTICALL_ADDRESS, ORDER_TYPE_MARKET, PERP_STATE_STR, SELL_SIDE, ZERO_ADDRESS, ZERO_ORDER_ID, } from "./constants";
3
+ import { ERC20__factory, IPerpetualManager__factory, Multicall3__factory, } from "./contracts";
4
+ import { ABK64x64ToFloat, dec18ToFloat, decNToFloat, floatToABK64x64, getDepositAmountForLvgTrade, getMaxSignedPositionSize, pmExchangeFee, pmFindMaxTradeSize, } from "./d8XMath";
5
5
  import PerpetualDataHandler from "./perpetualDataHandler";
6
6
  import { contractSymbolToSymbol, toBytes4 } from "./utils";
7
7
  /**
@@ -47,7 +47,7 @@ export default class MarketData extends PerpetualDataHandler {
47
47
  const mktData = providerOrMarketData;
48
48
  this.nodeURL = mktData.config.nodeURL;
49
49
  this.provider = new JsonRpcProvider(mktData.config.nodeURL, mktData.network, { staticNetwork: true });
50
- this.proxyContract = new Contract(mktData.getProxyAddress(), this.config.proxyABI, this.provider);
50
+ this.proxyContract = IPerpetualManager__factory.connect(mktData.getProxyAddress(), this.provider);
51
51
  this.multicall = Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, this.provider);
52
52
  ({
53
53
  nestedPerpetualIDs: this.nestedPerpetualIDs,
@@ -101,7 +101,7 @@ export default class MarketData extends PerpetualDataHandler {
101
101
  * }
102
102
  * main();
103
103
  *
104
- * @returns {Contract} read-only proxy instance
104
+ * @returns read-only proxy instance
105
105
  */
106
106
  getReadOnlyProxyInstance() {
107
107
  if (this.proxyContract == null) {
@@ -281,7 +281,8 @@ export default class MarketData extends PerpetualDataHandler {
281
281
  */
282
282
  async _positionRiskForTraderInPerpetual(traderAddr, symbol, provider, overrides) {
283
283
  let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
284
- let mgnAcct = await PerpetualDataHandler.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new Contract(this.proxyAddr, this.config.proxyABI, provider), [obj.idxPrices[0], obj.idxPrices[1]], overrides);
284
+ const isPred = this.isPredictionMarket(symbol);
285
+ let mgnAcct = await PerpetualDataHandler.getMarginAccount(traderAddr, symbol, this.symbolToPerpStaticInfo, new Contract(this.proxyAddr, this.config.proxyABI, provider), obj, isPred, overrides);
285
286
  return mgnAcct;
286
287
  }
287
288
  /**
@@ -293,122 +294,67 @@ export default class MarketData extends PerpetualDataHandler {
293
294
  */
294
295
  async _positionRiskForTraderInPerpetuals(traderAddr, symbols, provider, overrides) {
295
296
  const MAX_SYMBOLS_PER_CALL = 10;
296
- const S2S3 = new Array();
297
+ const pxInfo = new Array();
297
298
  for (let i = 0; i < symbols.length; i++) {
298
299
  let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbols[i]);
299
- S2S3.push([obj.idxPrices[0], obj.idxPrices[1]]);
300
+ pxInfo.push(obj);
300
301
  }
301
302
  let mgnAcct = [];
302
303
  let callSymbols = symbols.slice(0, MAX_SYMBOLS_PER_CALL);
303
- let pxS2S3 = S2S3.slice(0, MAX_SYMBOLS_PER_CALL);
304
+ let _px = pxInfo.slice(0, MAX_SYMBOLS_PER_CALL);
304
305
  while (callSymbols.length > 0) {
305
- let acc = await PerpetualDataHandler.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, provider), new Contract(this.proxyAddr, this.config.proxyABI, provider), pxS2S3, overrides);
306
+ const isPred = callSymbols.map((_sym) => this.isPredictionMarket(_sym));
307
+ let acc = await PerpetualDataHandler.getMarginAccounts(Array(callSymbols.length).fill(traderAddr), callSymbols, this.symbolToPerpStaticInfo, Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, provider), new Contract(this.proxyAddr, this.config.proxyABI, provider), _px, isPred, overrides);
306
308
  mgnAcct = mgnAcct.concat(acc);
307
309
  callSymbols = symbols.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
308
- pxS2S3 = S2S3.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
310
+ _px = pxInfo.slice(mgnAcct.length, mgnAcct.length + MAX_SYMBOLS_PER_CALL);
309
311
  }
310
312
  return mgnAcct;
311
313
  }
312
- /**
313
- * Estimates what the position risk will be if a given order is executed.
314
- * @param traderAddr Address of trader
315
- * @param order Order to be submitted
316
- * @param account Position risk before trade. Defaults to current position if not given.
317
- * @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
318
- * @returns Position risk after trade, including order cost and maximal trade sizes for position
319
- * @example
320
- * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
321
- * async function main() {
322
- * console.log(MarketData);
323
- * // setup
324
- * const config = PerpetualDataHandler.readSDKConfig("cardona");
325
- * const mktData = new MarketData(config);
326
- * await mktData.createProxyInstance();
327
- * const order: Order = {
328
- * symbol: "MATIC-USD-MATIC",
329
- * side: "BUY",
330
- * type: "MARKET",
331
- * quantity: 100,
332
- * leverage: 2,
333
- * executionTimestamp: Date.now()/1000,
334
- * };
335
- * // Get position risk conditional on this order being executed
336
- * const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order);
337
- * console.log(posRisk);
338
- * }
339
- * main();
340
- */
341
- async positionRiskOnTrade(traderAddr, order, account, indexPriceInfo, overrides) {
314
+ async dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides) {
342
315
  if (this.proxyContract == null || this.multicall == null) {
343
316
  throw Error("no proxy contract initialized. Use createProxyInstance().");
344
317
  }
345
- // fetch prices
346
- if (indexPriceInfo == undefined) {
347
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
348
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
349
- }
350
- // override total fee
351
- let tradingFeeTbps;
352
- if (overrides) {
353
- ({ tradingFeeTbps, ...overrides } = overrides);
354
- }
355
- // signed trade amount
356
- let tradeAmountBC = Math.abs(order.quantity) * (order.side == BUY_SIDE ? 1 : -1);
357
- const accountGiven = account !== undefined;
318
+ const isPredMkt = this.isPredictionMarket(symbol);
358
319
  // create all calls
359
- const poolId = PerpetualDataHandler._getPoolIdFromSymbol(order.symbol, this.poolStaticInfos);
360
- const perpId = PerpetualDataHandler.symbolToPerpetualId(order.symbol, this.symbolToPerpStaticInfo);
361
- const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => floatToABK64x64(x));
320
+ const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
321
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
362
322
  const proxyCalls = [
363
323
  // 0: traderState
364
324
  {
365
325
  target: this.proxyContract.target,
366
326
  allowFailure: true,
367
- callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, fS2S3]),
368
- },
369
- // 1: ammState
370
- {
371
- target: this.proxyContract.target,
372
- allowFailure: true,
373
- callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, fS2S3]),
374
- },
375
- // 2: exchangeFee
376
- {
377
- target: this.proxyContract.target,
378
- allowFailure: false,
379
- callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
380
- poolId,
381
- traderAddr,
382
- order.brokerAddr ?? ZERO_ADDRESS,
383
- ]),
327
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
384
328
  },
385
- // 3: perpetual price
329
+ // 1: perpetual price
386
330
  {
387
331
  target: this.proxyContract.target,
388
332
  allowFailure: true,
389
333
  callData: this.proxyContract.interface.encodeFunctionData("queryPerpetualPrice", [
390
334
  perpId,
391
335
  floatToABK64x64(tradeAmountBC),
392
- fS2S3,
336
+ [fS2, fS3],
337
+ indexPriceInfo.conf,
338
+ indexPriceInfo.predMktCLOBParams,
393
339
  ]),
394
340
  },
395
- // 4: max long pos
341
+ // 2: max long pos
396
342
  {
397
343
  target: this.proxyContract.target,
398
344
  allowFailure: false,
399
345
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
400
346
  perpId,
401
- account ? floatToABK64x64(account.positionNotionalBaseCCY * (account.side === BUY_SIDE ? 1 : -1)) : 0n,
347
+ floatToABK64x64(signedPositionNotionalBaseCCY),
402
348
  true,
403
349
  ]),
404
350
  },
405
- // 5: max short pos
351
+ // 3: max short pos
406
352
  {
407
353
  target: this.proxyContract.target,
408
354
  allowFailure: false,
409
355
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
410
356
  perpId,
411
- account ? floatToABK64x64(account.positionNotionalBaseCCY * (account.side === BUY_SIDE ? 1 : -1)) : 0n,
357
+ floatToABK64x64(signedPositionNotionalBaseCCY),
412
358
  false,
413
359
  ]),
414
360
  },
@@ -416,44 +362,84 @@ export default class MarketData extends PerpetualDataHandler {
416
362
  // multicall
417
363
  const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, (overrides || {}));
418
364
  // positionRisk to apply this trade on: if not given, defaults to the current trader's position
419
- if (!account) {
420
- let traderState;
421
- if (encodedResults[0].success) {
422
- traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
423
- }
424
- else {
425
- traderState = await this.proxyContract.getTraderState(perpId, traderAddr, fS2S3);
426
- }
427
- account = MarketData.buildMarginAccountFromState(order.symbol, traderState, this.symbolToPerpStaticInfo, [
428
- indexPriceInfo[0],
429
- indexPriceInfo[1],
430
- ]);
431
- }
432
- // perpetualState, for prices
433
- let ammState;
434
- if (encodedResults[1].success) {
435
- ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[1].returnData)[0];
365
+ let traderState;
366
+ if (encodedResults[0].success) {
367
+ traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
436
368
  }
437
369
  else {
438
- ammState = await this.proxyContract.getAMMState(perpId, fS2S3);
370
+ traderState = await this.proxyContract.getTraderState(perpId, traderAddr, [fEma, fS3]);
439
371
  }
440
- const perpetualState = PerpetualDataHandler._parseAMMState(order.symbol, ammState, [0n, 0n], // not used below
441
- indexPriceInfo, this.symbolToPerpStaticInfo);
442
- let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
443
- // exchange fee based on this trader's address (volume, token holding, etc) and his broker address (if any)
444
- const exchangeFeeTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
372
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
445
373
  // amm price for this trade amount
446
374
  let ammPrice;
447
375
  {
448
376
  let fPrice;
449
- if (encodedResults[3].success) {
450
- fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[3].returnData)[0];
377
+ if (encodedResults[1].success) {
378
+ fPrice = this.proxyContract.interface.decodeFunctionResult("queryPerpetualPrice", encodedResults[1].returnData)[0];
451
379
  }
452
380
  else {
453
- fPrice = await this.proxyContract.queryPerpetualPrice(perpId, floatToABK64x64(tradeAmountBC), fS2S3);
381
+ fPrice = await this.proxyContract.queryPerpetualPrice(perpId, floatToABK64x64(tradeAmountBC), [floatToABK64x64(indexPriceInfo.s2), floatToABK64x64(indexPriceInfo.s3 ?? 0)], indexPriceInfo.conf, indexPriceInfo.predMktCLOBParams);
454
382
  }
455
383
  ammPrice = ABK64x64ToFloat(fPrice);
456
384
  }
385
+ // max buy
386
+ const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[2].returnData)[0];
387
+ const maxLongTrade = Math.max(0, ABK64x64ToFloat(fMaxLong) - signedPositionNotionalBaseCCY);
388
+ // max sell
389
+ const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[3].returnData)[0];
390
+ const maxShortTrade = Math.max(0, Math.abs(ABK64x64ToFloat(fMaxShort)) - signedPositionNotionalBaseCCY);
391
+ return { account: account, ammPrice: ammPrice, maxShortTrade: maxShortTrade, maxLongTrade: maxLongTrade };
392
+ }
393
+ /**
394
+ * Estimates what the position risk will be if a given order is executed.
395
+ * @param traderAddr Address of trader
396
+ * @param order Order to be submitted
397
+ * @param signedPositionNotionalBaseCCY signed position notional of current position (before trade)
398
+ * @param tradingFeeTbps trading fee in tenth of basis points (exchange fee and broker fee)
399
+ * @param indexPriceInfo Index prices and market status (open/closed). Defaults to current market status if not given.
400
+ * @returns Position risk after trade, including order cost and maximal trade sizes for position
401
+ * @example
402
+ * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
403
+ * async function main() {
404
+ * console.log(MarketData);
405
+ * // setup
406
+ * const config = PerpetualDataHandler.readSDKConfig("cardona");
407
+ * const mktData = new MarketData(config);
408
+ * await mktData.createProxyInstance();
409
+ * const order: Order = {
410
+ * symbol: "MATIC-USD-MATIC",
411
+ * side: "BUY",
412
+ * type: "MARKET",
413
+ * quantity: 100,
414
+ * leverage: 2,
415
+ * executionTimestamp: Date.now()/1000,
416
+ * };
417
+ * // Get position risk conditional on this order being executed
418
+ * const posRisk = await mktData.positionRiskOnTrade("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B", order, 0, 60);
419
+ * console.log(posRisk);
420
+ * }
421
+ * main();
422
+ */
423
+ async positionRiskOnTrade(traderAddr, order, signedPositionNotionalBaseCCY, tradingFeeTbps, indexPriceInfo, overrides) {
424
+ if (this.proxyContract == null || this.multicall == null) {
425
+ throw Error("no proxy contract initialized. Use createProxyInstance().");
426
+ }
427
+ const isPredMkt = this.isPredictionMarket(order.symbol);
428
+ // fetch prices
429
+ if (indexPriceInfo == undefined) {
430
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
431
+ }
432
+ // signed trade amount
433
+ let tradeAmountBC = Math.abs(order.quantity) * (order.side == BUY_SIDE ? 1 : -1);
434
+ const symbol = order.symbol;
435
+ let obj = await this.dataForPositionRiskOnTrade(symbol, traderAddr, tradeAmountBC, indexPriceInfo, signedPositionNotionalBaseCCY, overrides);
436
+ const account = obj.account;
437
+ const maxLongTrade = obj.maxLongTrade;
438
+ const maxShortTrade = obj.maxShortTrade;
439
+ const ammPrice = obj.ammPrice;
440
+ let Sm = account.markPrice;
441
+ let S2 = indexPriceInfo.s2;
442
+ let S3 = account.collToQuoteConversion;
457
443
  // price for this order = amm price if no limit given, else conservatively adjusted
458
444
  let tradePrice;
459
445
  if (order.limitPrice == undefined) {
@@ -489,16 +475,6 @@ export default class MarketData extends PerpetualDataHandler {
489
475
  }
490
476
  }
491
477
  }
492
- // max buy
493
- const fMaxLong = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[4].returnData)[0];
494
- const maxLongTrade = account.side == BUY_SIDE
495
- ? Math.max(0, ABK64x64ToFloat(fMaxLong) - (accountGiven ? 0 : account.positionNotionalBaseCCY))
496
- : ABK64x64ToFloat(fMaxLong) + account.positionNotionalBaseCCY;
497
- // max sell
498
- const fMaxShort = this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults[5].returnData)[0];
499
- const maxShortTrade = account.side == SELL_SIDE
500
- ? Math.max(0, Math.abs(ABK64x64ToFloat(fMaxShort)) - (accountGiven ? 0 : Math.abs(account.positionNotionalBaseCCY)))
501
- : Math.abs(ABK64x64ToFloat(fMaxShort)) + Math.abs(account.positionNotionalBaseCCY);
502
478
  // Current state:
503
479
  let lotSizeBC = MarketData._getLotSize(order.symbol, this.symbolToPerpStaticInfo);
504
480
  // Too small, no change to account
@@ -520,10 +496,6 @@ export default class MarketData extends PerpetualDataHandler {
520
496
  newPositionBC = 0;
521
497
  }
522
498
  let newSide = newPositionBC > 0 ? BUY_SIDE : newPositionBC < 0 ? SELL_SIDE : CLOSED_SIDE;
523
- if (tradingFeeTbps === undefined) {
524
- // use usual input if not overriden
525
- tradingFeeTbps = Number(exchangeFeeTbps) + (order.brokerFeeTbps ?? 0);
526
- }
527
499
  let tradingFeeCC = (Math.abs(tradeAmountBC) * tradingFeeTbps * 1e-5 * S2) / S3;
528
500
  let referralFeeCC = this.symbolToPerpStaticInfo.get(account.symbol).referralRebate;
529
501
  // Trade type:
@@ -548,7 +520,7 @@ export default class MarketData extends PerpetualDataHandler {
548
520
  let initialMarginRate = this.symbolToPerpStaticInfo.get(account.symbol).initialMarginRate;
549
521
  targetLvg = isFlip || isOpen ? order.leverage ?? 1 / initialMarginRate : 0;
550
522
  let [b0, pos0] = isOpen ? [0, 0] : [account.collateralCC, currentPositionBC];
551
- traderDepositCC = getDepositAmountForLvgTrade(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm);
523
+ traderDepositCC = getDepositAmountForLvgTrade(pos0, b0, tradeAmountBC, targetLvg, tradePrice, S3, Sm, isPredMkt);
552
524
  // fees are paid from wallet in this case
553
525
  traderDepositCC += tradingFeeCC + referralFeeCC;
554
526
  }
@@ -567,13 +539,23 @@ export default class MarketData extends PerpetualDataHandler {
567
539
  let newMarginCashCC = currentMarginCashCC + deltaCashCC + traderDepositCC;
568
540
  let newEntryPrice = newPositionBC == 0 ? 0 : Math.abs(newLockedInValueQC / newPositionBC);
569
541
  let newMarginBalanceCC = newMarginCashCC + (newPositionBC * Sm - newLockedInValueQC) / S3;
570
- let newLeverage = newPositionBC == 0
571
- ? 0
572
- : newMarginBalanceCC <= 0
573
- ? Infinity
574
- : (Math.abs(newPositionBC) * Sm) / S3 / newMarginBalanceCC;
542
+ let newLeverage;
543
+ if (newPositionBC === 0) {
544
+ newLeverage = 0;
545
+ }
546
+ else if (newMarginBalanceCC <= 0) {
547
+ newLeverage = Infinity;
548
+ }
549
+ else {
550
+ let p = Sm;
551
+ if (isPredMkt) {
552
+ p -= 1;
553
+ p = newPositionBC > 0 ? p : 1 - p;
554
+ }
555
+ newLeverage = Math.abs(newPositionBC * p) / S3 / newMarginBalanceCC;
556
+ }
575
557
  // Liquidation params
576
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
558
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
577
559
  // New position risk
578
560
  let newPositionRisk = {
579
561
  symbol: account.symbol,
@@ -596,6 +578,18 @@ export default class MarketData extends PerpetualDataHandler {
596
578
  maxShortTrade: maxShortTrade,
597
579
  };
598
580
  }
581
+ /**
582
+ * Fee is relative to base-currency amount (=trade amount)
583
+ * @param state current perpetual state (need longBC and shortBC)
584
+ * @param maxMaintMgnRate maintenance margin rate param for pred mkts
585
+ * @param Sm Mark price
586
+ * @param tradeAmtBC signed trade amount
587
+ * @param tradeMgnRate margin rate param from perpetual
588
+ * @returns relative exchange fee in decimals
589
+ */
590
+ static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
591
+ return pmExchangeFee(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
592
+ }
599
593
  /**
600
594
  * Estimates what the position risk will be if given amount of collateral is added/removed from the account.
601
595
  * @param {number} deltaCollateral Amount of collateral to add or remove (signed)
@@ -625,11 +619,17 @@ export default class MarketData extends PerpetualDataHandler {
625
619
  throw new Error("not enough margin to remove");
626
620
  }
627
621
  if (indexPriceInfo == undefined) {
628
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
629
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
622
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
630
623
  }
631
624
  let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
632
- let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
625
+ let Sm; //mark price
626
+ if (this.isPredictionMarket(account.symbol)) {
627
+ Sm = indexPriceInfo.ema + perpetualState.markPremium;
628
+ }
629
+ else {
630
+ Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
631
+ }
632
+ let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
633
633
  // no position: just increase collateral and kill liquidation vars
634
634
  if (account.positionNotionalBaseCCY == 0) {
635
635
  return {
@@ -669,7 +669,7 @@ export default class MarketData extends PerpetualDataHandler {
669
669
  }
670
670
  let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
671
671
  // Liquidation params
672
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
672
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
673
673
  // New position risk
674
674
  let newPositionRisk = {
675
675
  symbol: account.symbol,
@@ -688,35 +688,39 @@ export default class MarketData extends PerpetualDataHandler {
688
688
  return newPositionRisk;
689
689
  }
690
690
  /**
691
- * Calculates liquidation prices for a given position
691
+ * Calculates liquidation prices for a position
692
+ * constructed in positionRiskOnTrade/positionRiskOnCollateralAction
692
693
  * @param symbol Perpetual symbol
693
694
  * @param lockedInQC Locked in value
694
695
  * @param signedPositionBC Signed position size
695
- * @param marginCashCC Cash in margin account
696
+ * @param marginCashCC Available cash in margin account (includes unpaid funding)
696
697
  * @param markPrice Mark price
697
- * @param collToQuoteConversion Collateral index price
698
+ * @param collToQuoteConversion Collateral index price (S3)
699
+ * @param S2 index price
698
700
  * @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
699
701
  * @returns [Base index price, Collateral index price, Maintenance margin rate]
700
702
  * @ignore
701
703
  */
702
- static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
704
+ static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
703
705
  let S2Liq, S3Liq;
704
- let tau = symbolToPerpStaticInfo.get(symbol).maintenanceMarginRate;
705
- let ccyType = symbolToPerpStaticInfo.get(symbol).collateralCurrencyType;
706
- if (ccyType == CollaterlCCY.BASE) {
707
- S2Liq = calculateLiquidationPriceCollateralBase(lockedInQC, signedPositionBC, marginCashCC, tau);
708
- S3Liq = S2Liq;
709
- }
710
- else if (ccyType == CollaterlCCY.QUANTO) {
711
- S3Liq = collToQuoteConversion;
712
- S2Liq = calculateLiquidationPriceCollateralQuanto(lockedInQC, signedPositionBC, marginCashCC, tau, collToQuoteConversion, markPrice);
713
- }
714
- else {
715
- S2Liq = calculateLiquidationPriceCollateralQuote(lockedInQC, signedPositionBC, marginCashCC, tau);
716
- }
717
- // floor at 0
718
- S2Liq = S2Liq < 0 ? 0 : S2Liq;
719
- S3Liq = S3Liq && S3Liq < 0 ? 0 : S3Liq;
706
+ const staticInfo = symbolToPerpStaticInfo.get(symbol);
707
+ let tau = staticInfo.maintenanceMarginRate;
708
+ let ccyType = staticInfo.collateralCurrencyType;
709
+ const isPred = MarketData.isPredictionMarketStatic(staticInfo);
710
+ const idx_availableCashCC = 2;
711
+ const idx_cash = 3;
712
+ const idx_notional = 4;
713
+ const idx_locked_in = 5;
714
+ const idx_mark_price = 8;
715
+ const idx_s3 = 9;
716
+ let traderState = new Array(10);
717
+ traderState[idx_availableCashCC] = floatToABK64x64(marginCashCC);
718
+ traderState[idx_cash] = traderState[idx_availableCashCC];
719
+ traderState[idx_notional] = floatToABK64x64(signedPositionBC);
720
+ traderState[idx_locked_in] = floatToABK64x64(lockedInQC);
721
+ traderState[idx_mark_price] = floatToABK64x64(markPrice);
722
+ traderState[idx_s3] = floatToABK64x64(collToQuoteConversion);
723
+ [S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
720
724
  return [S2Liq, S3Liq, tau];
721
725
  }
722
726
  /**
@@ -884,22 +888,28 @@ export default class MarketData extends PerpetualDataHandler {
884
888
  if (!this.proxyContract || !this.multicall) {
885
889
  throw new Error("proxy contract not initialized");
886
890
  }
891
+ if (this.isPredictionMarket(symbol)) {
892
+ // prediction markets
893
+ return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
894
+ }
895
+ // regular markets
896
+ return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
897
+ }
898
+ async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
899
+ if (!this.proxyContract || !this.multicall) {
900
+ throw new Error("proxy contract not initialized");
901
+ }
902
+ const IERC20 = new Interface(ERC20_ABI);
887
903
  const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
888
- const poolId = this.getPoolIdFromSymbol(symbol);
889
904
  const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
890
- const perpInfo = this.getPerpetualStaticInfo(symbol);
891
- const IERC20 = new Interface(ERC20_ABI);
892
- const indexPriceInfo = await this.priceFeedGetter
893
- .fetchPricesForPerpetual(symbol)
894
- .then((obj) => [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]]);
895
- const fS2S3 = [indexPriceInfo[0], indexPriceInfo[1]].map((x) => floatToABK64x64(x));
896
- let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
905
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
906
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
897
907
  const proxyCalls = [
898
908
  // 0: traderState
899
909
  {
900
910
  target: this.proxyContract.target,
901
911
  allowFailure: false,
902
- callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, fS2S3]),
912
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
903
913
  },
904
914
  // 1: wallet balance
905
915
  {
@@ -907,31 +917,53 @@ export default class MarketData extends PerpetualDataHandler {
907
917
  allowFailure: false,
908
918
  callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
909
919
  },
910
- // 2: exchange fee
920
+ // 2: amm state
911
921
  {
912
922
  target: this.proxyContract.target,
913
923
  allowFailure: false,
914
- callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
915
- poolId,
916
- traderAddr,
917
- ZERO_ADDRESS,
918
- ]),
924
+ callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
919
925
  },
920
926
  ];
921
927
  // multicall
922
928
  const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
923
- // position risk
924
- const idxNotional = 4;
925
929
  const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
926
- const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, [
927
- indexPriceInfo[0],
928
- indexPriceInfo[1],
929
- ]);
930
- // fee rate
931
- const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
932
- const feeRate = 1e-5 * Number(feeRateTbps);
933
- // Max based on margin requirements:
934
930
  const walletBalance = decNToFloat(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
931
+ const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
932
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
933
+ );
934
+ const openInterestBC = ABK64x64ToFloat(ammState[11]);
935
+ const net = -ABK64x64ToFloat(ammState[1]);
936
+ let totLong, totShort;
937
+ if (net < 0) {
938
+ totLong = openInterestBC;
939
+ totShort = openInterestBC - Math.abs(net);
940
+ }
941
+ else {
942
+ totLong = openInterestBC - net;
943
+ totShort = openInterestBC;
944
+ }
945
+ let currentPositionBC = (account.side == BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
946
+ const Sm = ABK64x64ToFloat(traderState[8]);
947
+ // settlement token must be equal to collateral token for walletBalance to be correct
948
+ const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
949
+ const idxNotional = 4;
950
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
951
+ const maxShort = pmFindMaxTradeSize(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
952
+ const maxLong = pmFindMaxTradeSize(1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3 ?? 0, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
953
+ return { buy: maxLong, sell: maxShort };
954
+ }
955
+ /**
956
+ * Returns the maximal allowed short pos and long pos (signed) for a trader
957
+ * with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
958
+ * @param perpId
959
+ * @param currentTraderPos ABDK64x64 notional position of trader
960
+ * @param overrides
961
+ * @returns [maxShortPos, maxLongPos] signed maximal position sizes
962
+ */
963
+ async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
964
+ if (!this.proxyContract || !this.multicall) {
965
+ throw new Error("proxy contract not initialized");
966
+ }
935
967
  const proxyCalls2 = [
936
968
  // 0: max long
937
969
  {
@@ -939,7 +971,7 @@ export default class MarketData extends PerpetualDataHandler {
939
971
  allowFailure: false,
940
972
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
941
973
  perpId,
942
- traderState[idxNotional],
974
+ currentTraderPos,
943
975
  true,
944
976
  ]),
945
977
  },
@@ -949,7 +981,7 @@ export default class MarketData extends PerpetualDataHandler {
949
981
  allowFailure: false,
950
982
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
951
983
  perpId,
952
- traderState[idxNotional],
984
+ currentTraderPos,
953
985
  false,
954
986
  ]),
955
987
  },
@@ -959,15 +991,66 @@ export default class MarketData extends PerpetualDataHandler {
959
991
  // Max based on perp:
960
992
  // max buy
961
993
  const maxLongOrderPerp = ABK64x64ToFloat(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[0].returnData)[0]);
962
- const maxLongPosPerp = maxLongOrderPerp + ABK64x64ToFloat(traderState[idxNotional]);
994
+ const maxLongPosPerp = maxLongOrderPerp + ABK64x64ToFloat(currentTraderPos);
963
995
  // max short
964
996
  const maxShortOrderPerp = ABK64x64ToFloat(this.proxyContract.interface.decodeFunctionResult("getMaxSignedOpenTradeSizeForPos", encodedResults2[1].returnData)[0]);
965
- const maxShortPosPerp = maxShortOrderPerp + ABK64x64ToFloat(traderState[idxNotional]);
997
+ const maxShortPosPerp = maxShortOrderPerp + ABK64x64ToFloat(currentTraderPos);
998
+ return [maxShortPosPerp, maxLongPosPerp];
999
+ }
1000
+ async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
1001
+ const perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
1002
+ const poolId = this.getPoolIdFromSymbol(symbol);
1003
+ const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
1004
+ const perpInfo = this.getPerpetualStaticInfo(symbol);
1005
+ const IERC20 = new Interface(ERC20_ABI);
1006
+ const isPredMkt = false;
1007
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1008
+ let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
1009
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3 ?? 0, indexPriceInfo.ema].map((x) => floatToABK64x64(x));
1010
+ if (!this.proxyContract || !this.multicall) {
1011
+ throw new Error("proxy contract not initialized");
1012
+ }
1013
+ const proxyCalls = [
1014
+ // 0: traderState
1015
+ {
1016
+ target: this.proxyContract.target,
1017
+ allowFailure: false,
1018
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
1019
+ },
1020
+ // 1: wallet balance
1021
+ {
1022
+ target: poolInfo.poolSettleTokenAddr,
1023
+ allowFailure: false,
1024
+ callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
1025
+ },
1026
+ // 2: exchange fee
1027
+ {
1028
+ target: this.proxyContract.target,
1029
+ allowFailure: false,
1030
+ callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
1031
+ poolId,
1032
+ traderAddr,
1033
+ ZERO_ADDRESS,
1034
+ ]),
1035
+ },
1036
+ ];
1037
+ // multicall
1038
+ const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
1039
+ // position risk
1040
+ const idxNotional = 4;
1041
+ const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
1042
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
1043
+ // fee rate
1044
+ const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
1045
+ const feeRate = 1e-5 * Number(feeRateTbps);
1046
+ // Max based on margin requirements:
1047
+ const walletBalance = decNToFloat(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
1048
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
966
1049
  const curPos = (account.side == BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
967
1050
  const px = await coll2SettlePromise;
968
1051
  const walletBalanceInMgnToken = walletBalance / px;
969
- const maxLongPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo[0], account.collToQuoteConversion);
970
- const maxShortPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo[0], account.collToQuoteConversion);
1052
+ const maxLongPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, 1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
1053
+ const maxShortPosAccount = getMaxSignedPositionSize(account.collateralCC + walletBalanceInMgnToken + account.unrealizedFundingCollateralCCY, curPos, account.entryPrice * curPos, -1, account.markPrice, perpInfo.initialMarginRate, feeRate, account.markPrice, indexPriceInfo.s2, account.collToQuoteConversion);
971
1054
  // max long/short all accounted for
972
1055
  const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
973
1056
  const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
@@ -1030,8 +1113,7 @@ export default class MarketData extends PerpetualDataHandler {
1030
1113
  if (!this.proxyContract) {
1031
1114
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1032
1115
  }
1033
- let px = await this.proxyContract.getOraclePrice([toBytes4(base), toBytes4(quote)], overrides || {});
1034
- return px == undefined ? undefined : ABK64x64ToFloat(px);
1116
+ return await this.proxyContract.getOraclePrice([toBytes4(base), toBytes4(quote)], overrides || {});
1035
1117
  }
1036
1118
  /**
1037
1119
  * Get the status of an order given a symbol and order Id
@@ -1100,6 +1182,7 @@ export default class MarketData extends PerpetualDataHandler {
1100
1182
  /**
1101
1183
  * Get the current mark price
1102
1184
  * @param symbol symbol of the form ETH-USD-MATIC
1185
+ * @param indexPrices optional. IdxPriceInfo
1103
1186
  * @example
1104
1187
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1105
1188
  * async function main() {
@@ -1121,15 +1204,15 @@ export default class MarketData extends PerpetualDataHandler {
1121
1204
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1122
1205
  }
1123
1206
  if (indexPrices == undefined) {
1124
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1125
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1207
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1126
1208
  }
1127
- return await PerpetualDataHandler._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
1209
+ return await PerpetualDataHandler._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
1128
1210
  }
1129
1211
  /**
1130
1212
  * get the current price for a given quantity
1131
1213
  * @param symbol symbol of the form ETH-USD-MATIC
1132
1214
  * @param quantity quantity to be traded, negative if short
1215
+ * @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
1133
1216
  * @example
1134
1217
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1135
1218
  * async function main() {
@@ -1146,16 +1229,18 @@ export default class MarketData extends PerpetualDataHandler {
1146
1229
  *
1147
1230
  * @returns {number} price
1148
1231
  */
1149
- async getPerpetualPrice(symbol, quantity, indexPrices, overrides) {
1232
+ async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
1150
1233
  if (this.proxyContract == null) {
1151
1234
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1152
1235
  }
1153
- if (indexPrices == undefined) {
1236
+ if (priceInfo == undefined) {
1154
1237
  // fetch from API
1155
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1156
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1238
+ priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1157
1239
  }
1158
- return await PerpetualDataHandler._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides);
1240
+ return await PerpetualDataHandler._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3 ?? 0], //s2,s3
1241
+ priceInfo.conf, //conf
1242
+ priceInfo.predMktCLOBParams, //params
1243
+ overrides);
1159
1244
  }
1160
1245
  /**
1161
1246
  * Query recent perpetual state from blockchain
@@ -1167,8 +1252,7 @@ export default class MarketData extends PerpetualDataHandler {
1167
1252
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1168
1253
  }
1169
1254
  if (indexPriceInfo == undefined) {
1170
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1171
- indexPriceInfo = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
1255
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1172
1256
  }
1173
1257
  let state = await PerpetualDataHandler._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
1174
1258
  return state;
@@ -1364,7 +1448,7 @@ export default class MarketData extends PerpetualDataHandler {
1364
1448
  * Result is in collateral currency
1365
1449
  * @param {string} traderAddr address of the trader
1366
1450
  * @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
1367
- * @param indexPrices optional index prices, will otherwise fetch from REST API
1451
+ * @param indexPrices optional indexPriceInfo
1368
1452
  * @returns available margin in collateral currency
1369
1453
  * @example
1370
1454
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
@@ -1386,11 +1470,10 @@ export default class MarketData extends PerpetualDataHandler {
1386
1470
  }
1387
1471
  if (indexPrices == undefined) {
1388
1472
  // fetch from API
1389
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1390
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1473
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1391
1474
  }
1392
1475
  let perpID = PerpetualDataHandler.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
1393
- let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
1476
+ let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, [indexPrices.s2, indexPrices.s3].map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)), overrides || {});
1394
1477
  const idx_availableMargin = 1;
1395
1478
  let mgn = ABK64x64ToFloat(traderState[idx_availableMargin]);
1396
1479
  return mgn;
@@ -1657,7 +1740,8 @@ export default class MarketData extends PerpetualDataHandler {
1657
1740
  quoteCurrency: contractSymbolToSymbol(perp.S2QuoteCCY, _symbolList),
1658
1741
  indexPrice: 0,
1659
1742
  collToQuoteIndexPrice: 0,
1660
- markPrice: ABK64x64ToFloat(perp.currentMarkPremiumRate.fPrice),
1743
+ markPremium: ABK64x64ToFloat(perp.currentMarkPremiumRate.fPrice),
1744
+ markPrice: 0,
1661
1745
  midPrice: 0,
1662
1746
  currentFundingRateBps: 1e4 * ABK64x64ToFloat(perp.fCurrentFundingRate),
1663
1747
  openInterestBC: ABK64x64ToFloat(perp.fOpenInterest),
@@ -1706,7 +1790,6 @@ export default class MarketData extends PerpetualDataHandler {
1706
1790
  perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
1707
1791
  }
1708
1792
  perp.indexPrice = idxPriceS2Pair[0];
1709
- perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
1710
1793
  let indexS3 = 1;
1711
1794
  if (info.collateralCurrencyType == COLLATERAL_CURRENCY_BASE) {
1712
1795
  indexS3 = idxPriceS2Pair[0];
@@ -1715,6 +1798,18 @@ export default class MarketData extends PerpetualDataHandler {
1715
1798
  indexS3 = idxPriceS3Pair[0];
1716
1799
  }
1717
1800
  perp.collToQuoteIndexPrice = indexS3;
1801
+ const emaKey = info.S2Symbol + ":ema";
1802
+ let markPrice;
1803
+ if (idxPriceMap.has(emaKey)) {
1804
+ let ema;
1805
+ let res = idxPriceMap.get(emaKey);
1806
+ ema = res[0];
1807
+ markPrice = ema + perp.markPremium;
1808
+ }
1809
+ else {
1810
+ markPrice = perp.indexPrice * (1 + perp.markPremium);
1811
+ }
1812
+ perp.markPrice = markPrice;
1718
1813
  perp.midPrice = midPriceMap.get(symbol3s);
1719
1814
  // which pool?
1720
1815
  const poolId = info.poolId;