@d8x/perpetuals-sdk 2.0.12-alpha → 2.1.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/cjs/abi/IPerpetualManager.json +124 -3
  2. package/dist/cjs/abi/OracleFactory.json +94 -25
  3. package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
  4. package/dist/cjs/brokerTool.d.ts +5 -1
  5. package/dist/cjs/brokerTool.js +14 -1
  6. package/dist/cjs/brokerTool.js.map +1 -1
  7. package/dist/cjs/contracts/IPerpetualManager.d.ts +74 -10
  8. package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
  9. package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
  10. package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
  11. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +124 -3
  12. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  13. package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
  14. package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
  15. package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
  16. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  17. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  18. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  19. package/dist/cjs/d8XMath.d.ts +44 -1
  20. package/dist/cjs/d8XMath.js +236 -3
  21. package/dist/cjs/d8XMath.js.map +1 -1
  22. package/dist/cjs/liquidatorTool.d.ts +1 -0
  23. package/dist/cjs/liquidatorTool.js +24 -7
  24. package/dist/cjs/liquidatorTool.js.map +1 -1
  25. package/dist/cjs/marketData.d.ts +42 -20
  26. package/dist/cjs/marketData.js +261 -188
  27. package/dist/cjs/marketData.js.map +1 -1
  28. package/dist/cjs/nodeSDKTypes.d.ts +24 -2
  29. package/dist/cjs/nodeSDKTypes.js.map +1 -1
  30. package/dist/cjs/orderExecutorTool.d.ts +3 -3
  31. package/dist/cjs/orderExecutorTool.js +38 -13
  32. package/dist/cjs/orderExecutorTool.js.map +1 -1
  33. package/dist/cjs/perpetualDataHandler.d.ts +22 -12
  34. package/dist/cjs/perpetualDataHandler.js +59 -44
  35. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  36. package/dist/cjs/perpetualEventHandler.d.ts +1 -1
  37. package/dist/cjs/perpetualEventHandler.js +6 -7
  38. package/dist/cjs/perpetualEventHandler.js.map +1 -1
  39. package/dist/cjs/polyMktsPxFeed.d.ts +6 -4
  40. package/dist/cjs/polyMktsPxFeed.js +24 -3
  41. package/dist/cjs/polyMktsPxFeed.js.map +1 -1
  42. package/dist/cjs/priceFeeds.d.ts +6 -7
  43. package/dist/cjs/priceFeeds.js +36 -14
  44. package/dist/cjs/priceFeeds.js.map +1 -1
  45. package/dist/cjs/version.d.ts +1 -1
  46. package/dist/cjs/version.js +1 -1
  47. package/dist/esm/abi/IPerpetualManager.json +124 -3
  48. package/dist/esm/abi/OracleFactory.json +94 -25
  49. package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
  50. package/dist/esm/brokerTool.d.ts +5 -1
  51. package/dist/esm/brokerTool.js +15 -2
  52. package/dist/esm/brokerTool.js.map +1 -1
  53. package/dist/esm/contracts/IPerpetualManager.d.ts +74 -10
  54. package/dist/esm/contracts/OracleFactory.d.ts +69 -20
  55. package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
  56. package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +95 -3
  57. package/dist/esm/contracts/factories/IPerpetualManager__factory.js +124 -3
  58. package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  59. package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
  60. package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
  61. package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
  62. package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
  63. package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
  64. package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
  65. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
  66. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
  67. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  68. package/dist/esm/d8XMath.d.ts +44 -1
  69. package/dist/esm/d8XMath.js +229 -2
  70. package/dist/esm/d8XMath.js.map +1 -1
  71. package/dist/esm/liquidatorTool.d.ts +1 -0
  72. package/dist/esm/liquidatorTool.js +25 -8
  73. package/dist/esm/liquidatorTool.js.map +1 -1
  74. package/dist/esm/marketData.d.ts +42 -20
  75. package/dist/esm/marketData.js +263 -190
  76. package/dist/esm/marketData.js.map +1 -1
  77. package/dist/esm/nodeSDKTypes.d.ts +24 -2
  78. package/dist/esm/nodeSDKTypes.js.map +1 -1
  79. package/dist/esm/orderExecutorTool.d.ts +3 -3
  80. package/dist/esm/orderExecutorTool.js +38 -13
  81. package/dist/esm/orderExecutorTool.js.map +1 -1
  82. package/dist/esm/perpetualDataHandler.d.ts +22 -12
  83. package/dist/esm/perpetualDataHandler.js +60 -45
  84. package/dist/esm/perpetualDataHandler.js.map +1 -1
  85. package/dist/esm/perpetualEventHandler.d.ts +1 -1
  86. package/dist/esm/perpetualEventHandler.js +6 -7
  87. package/dist/esm/perpetualEventHandler.js.map +1 -1
  88. package/dist/esm/polyMktsPxFeed.d.ts +6 -4
  89. package/dist/esm/polyMktsPxFeed.js +24 -3
  90. package/dist/esm/polyMktsPxFeed.js.map +1 -1
  91. package/dist/esm/priceFeeds.d.ts +6 -7
  92. package/dist/esm/priceFeeds.js +36 -14
  93. package/dist/esm/priceFeeds.js.map +1 -1
  94. package/dist/esm/version.d.ts +1 -1
  95. package/dist/esm/version.js +1 -1
  96. package/package.json +1 -1
  97. package/src/abi/IPerpetualManager.json +124 -3
  98. package/src/abi/OracleFactory.json +523 -454
  99. package/src/abi/PerpetualManagerProxy.json +1596 -1386
  100. package/src/brokerTool.ts +16 -2
  101. package/src/contracts/IPerpetualManager.ts +107 -7
  102. package/src/contracts/OracleFactory.ts +100 -26
  103. package/src/contracts/PerpetualManagerProxy.ts +192 -3
  104. package/src/contracts/factories/IPerpetualManager__factory.ts +124 -3
  105. package/src/contracts/factories/OracleFactory__factory.ts +94 -25
  106. package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
  107. package/src/d8XMath.ts +304 -2
  108. package/src/liquidatorTool.ts +29 -14
  109. package/src/marketData.ts +415 -238
  110. package/src/nodeSDKTypes.ts +30 -2
  111. package/src/orderExecutorTool.ts +48 -20
  112. package/src/perpetualDataHandler.ts +87 -45
  113. package/src/perpetualEventHandler.ts +6 -7
  114. package/src/polyMktsPxFeed.ts +30 -5
  115. package/src/priceFeeds.ts +41 -17
  116. package/src/version.ts +1 -1
  117. package/dist/cjs/abi/BeaconProxy.json +0 -71
  118. package/dist/cjs/abi/Maintainer.json +0 -774
  119. package/dist/cjs/abi/MockToken.json +0 -347
  120. package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
  121. package/dist/cjs/abi/WeETH.json +0 -310
  122. package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
  123. package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
  124. package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
  125. package/dist/cjs/contracts/BeaconProxy.js +0 -3
  126. package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
  127. package/dist/cjs/contracts/Maintainer.d.ts +0 -799
  128. package/dist/cjs/contracts/Maintainer.js +0 -3
  129. package/dist/cjs/contracts/Maintainer.js.map +0 -1
  130. package/dist/cjs/contracts/MockToken.d.ts +0 -263
  131. package/dist/cjs/contracts/MockToken.js +0 -3
  132. package/dist/cjs/contracts/MockToken.js.map +0 -1
  133. package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
  134. package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
  135. package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
  136. package/dist/cjs/contracts/WeETH.d.ts +0 -503
  137. package/dist/cjs/contracts/WeETH.js +0 -3
  138. package/dist/cjs/contracts/WeETH.js.map +0 -1
  139. package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  140. package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
  141. package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
  142. package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
  143. package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
  144. package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
  145. package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
  146. package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
  147. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  148. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
  149. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  150. package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
  151. package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
  152. package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
  153. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  154. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
  155. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  156. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  157. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
  158. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  159. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  160. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
  161. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  162. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  163. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
  164. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  165. package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
  166. package/dist/cjs/contracts/factories/lean0/index.js +0 -15
  167. package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
  168. package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  169. package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
  170. package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
  171. package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
  172. package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
  173. package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
  174. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  175. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
  176. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  177. package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
  178. package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
  179. package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
  180. package/dist/cjs/contracts/lean0/index.d.ts +0 -4
  181. package/dist/cjs/contracts/lean0/index.js +0 -3
  182. package/dist/cjs/contracts/lean0/index.js.map +0 -1
  183. package/dist/esm/abi/BeaconProxy.json +0 -71
  184. package/dist/esm/abi/Maintainer.json +0 -774
  185. package/dist/esm/abi/MockToken.json +0 -347
  186. package/dist/esm/abi/UUPSUpgradeable.json +0 -104
  187. package/dist/esm/abi/WeETH.json +0 -310
  188. package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
  189. package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
  190. package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
  191. package/dist/esm/abi/lean0/ShareToken.json +0 -438
  192. package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
  193. package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
  194. package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
  195. package/dist/esm/contracts/BeaconProxy.js +0 -2
  196. package/dist/esm/contracts/BeaconProxy.js.map +0 -1
  197. package/dist/esm/contracts/Maintainer.d.ts +0 -799
  198. package/dist/esm/contracts/Maintainer.js +0 -2
  199. package/dist/esm/contracts/Maintainer.js.map +0 -1
  200. package/dist/esm/contracts/MockToken.d.ts +0 -263
  201. package/dist/esm/contracts/MockToken.js +0 -2
  202. package/dist/esm/contracts/MockToken.js.map +0 -1
  203. package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
  204. package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
  205. package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
  206. package/dist/esm/contracts/WeETH.d.ts +0 -503
  207. package/dist/esm/contracts/WeETH.js +0 -2
  208. package/dist/esm/contracts/WeETH.js.map +0 -1
  209. package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  210. package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
  211. package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
  212. package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
  213. package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
  214. package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
  215. package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
  216. package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
  217. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  218. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
  219. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  220. package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
  221. package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
  222. package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
  223. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  224. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
  225. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  226. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  227. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
  228. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  229. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  230. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
  231. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  232. package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  233. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
  234. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  235. package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
  236. package/dist/esm/contracts/factories/lean0/index.js +0 -8
  237. package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
  238. package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  239. package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
  240. package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
  241. package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
  242. package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
  243. package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
  244. package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  245. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
  246. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  247. package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
  248. package/dist/esm/contracts/lean0/ShareToken.js +0 -2
  249. package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
  250. package/dist/esm/contracts/lean0/index.d.ts +0 -4
  251. package/dist/esm/contracts/lean0/index.js +0 -2
  252. package/dist/esm/contracts/lean0/index.js.map +0 -1
@@ -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, 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), [indexPriceInfo.s2, indexPriceInfo.s3], 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
  }
@@ -578,7 +550,7 @@ class MarketData extends perpetualDataHandler_1.default {
578
550
  ? Infinity
579
551
  : (Math.abs(newPositionBC) * Sm) / S3 / newMarginBalanceCC;
580
552
  // Liquidation params
581
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
553
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, newLockedInValueQC, newPositionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
582
554
  // New position risk
583
555
  let newPositionRisk = {
584
556
  symbol: account.symbol,
@@ -601,6 +573,18 @@ class MarketData extends perpetualDataHandler_1.default {
601
573
  maxShortTrade: maxShortTrade,
602
574
  };
603
575
  }
576
+ /**
577
+ * Fee is relative to base-currency amount (=trade amount)
578
+ * @param state current perpetual state (need longBC and shortBC)
579
+ * @param maxMaintMgnRate maintenance margin rate param for pred mkts
580
+ * @param Sm Mark price
581
+ * @param tradeAmtBC signed trade amount
582
+ * @param tradeMgnRate margin rate param from perpetual
583
+ * @returns relative exchange fee in decimals
584
+ */
585
+ static exchangeFeePrdMkts(state, maxMaintMgnRate, Sm, tradeAmtBC, tradeMgnRate) {
586
+ return (0, d8XMath_1.pmExchangeFee)(Sm - 1, maxMaintMgnRate, state.shortBC, state.longBC, tradeAmtBC, tradeMgnRate);
587
+ }
604
588
  /**
605
589
  * Estimates what the position risk will be if given amount of collateral is added/removed from the account.
606
590
  * @param {number} deltaCollateral Amount of collateral to add or remove (signed)
@@ -630,11 +614,17 @@ class MarketData extends perpetualDataHandler_1.default {
630
614
  throw new Error("not enough margin to remove");
631
615
  }
632
616
  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]];
617
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(account.symbol);
635
618
  }
636
619
  let perpetualState = await this.getPerpetualState(account.symbol, indexPriceInfo, overrides);
637
- let [S2, S3, Sm] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice, perpetualState.markPrice];
620
+ let Sm; //mark price
621
+ if (this.isPredictionMarket(account.symbol)) {
622
+ Sm = indexPriceInfo.ema + perpetualState.markPremium;
623
+ }
624
+ else {
625
+ Sm = perpetualState.indexPrice * (1 + perpetualState.markPremium);
626
+ }
627
+ let [S2, S3] = [perpetualState.indexPrice, perpetualState.collToQuoteIndexPrice];
638
628
  // no position: just increase collateral and kill liquidation vars
639
629
  if (account.positionNotionalBaseCCY == 0) {
640
630
  return {
@@ -674,7 +664,7 @@ class MarketData extends perpetualDataHandler_1.default {
674
664
  }
675
665
  let newLeverage = (Math.abs(positionBC) * Sm) / S3 / newMarginBalanceCC;
676
666
  // Liquidation params
677
- let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, this.symbolToPerpStaticInfo);
667
+ let [S2Liq, S3Liq, tau] = MarketData._getLiquidationParams(account.symbol, lockedInQC, positionBC, newMarginCashCC, Sm, S3, S2, this.symbolToPerpStaticInfo);
678
668
  // New position risk
679
669
  let newPositionRisk = {
680
670
  symbol: account.symbol,
@@ -693,35 +683,39 @@ class MarketData extends perpetualDataHandler_1.default {
693
683
  return newPositionRisk;
694
684
  }
695
685
  /**
696
- * Calculates liquidation prices for a given position
686
+ * Calculates liquidation prices for a position
687
+ * constructed in positionRiskOnTrade/positionRiskOnCollateralAction
697
688
  * @param symbol Perpetual symbol
698
689
  * @param lockedInQC Locked in value
699
690
  * @param signedPositionBC Signed position size
700
- * @param marginCashCC Cash in margin account
691
+ * @param marginCashCC Available cash in margin account (includes unpaid funding)
701
692
  * @param markPrice Mark price
702
- * @param collToQuoteConversion Collateral index price
693
+ * @param collToQuoteConversion Collateral index price (S3)
694
+ * @param S2 index price
703
695
  * @param symbolToPerpStaticInfo Symbol-to-perp static info mapping
704
696
  * @returns [Base index price, Collateral index price, Maintenance margin rate]
705
697
  * @ignore
706
698
  */
707
- static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, symbolToPerpStaticInfo) {
699
+ static _getLiquidationParams(symbol, lockedInQC, signedPositionBC, marginCashCC, markPrice, collToQuoteConversion, S2, symbolToPerpStaticInfo) {
708
700
  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;
701
+ const staticInfo = symbolToPerpStaticInfo.get(symbol);
702
+ let tau = staticInfo.maintenanceMarginRate;
703
+ let ccyType = staticInfo.collateralCurrencyType;
704
+ const isPred = MarketData.isPredictionMarketStatic(staticInfo);
705
+ const idx_availableCashCC = 2;
706
+ const idx_cash = 3;
707
+ const idx_notional = 4;
708
+ const idx_locked_in = 5;
709
+ const idx_mark_price = 8;
710
+ const idx_s3 = 9;
711
+ let traderState = new Array(10);
712
+ traderState[idx_availableCashCC] = (0, d8XMath_1.floatToABK64x64)(marginCashCC);
713
+ traderState[idx_cash] = traderState[idx_availableCashCC];
714
+ traderState[idx_notional] = (0, d8XMath_1.floatToABK64x64)(signedPositionBC);
715
+ traderState[idx_locked_in] = (0, d8XMath_1.floatToABK64x64)(lockedInQC);
716
+ traderState[idx_mark_price] = (0, d8XMath_1.floatToABK64x64)(markPrice);
717
+ traderState[idx_s3] = (0, d8XMath_1.floatToABK64x64)(collToQuoteConversion);
718
+ [S2Liq, S3Liq, tau, ,] = MarketData._calculateLiquidationPrice(symbol, traderState, S2, symbolToPerpStaticInfo, isPred);
725
719
  return [S2Liq, S3Liq, tau];
726
720
  }
727
721
  /**
@@ -889,22 +883,28 @@ class MarketData extends perpetualDataHandler_1.default {
889
883
  if (!this.proxyContract || !this.multicall) {
890
884
  throw new Error("proxy contract not initialized");
891
885
  }
886
+ if (this.isPredictionMarket(symbol)) {
887
+ // prediction markets
888
+ return this.pmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
889
+ }
890
+ // regular markets
891
+ return this.rmMaxOrderSizeForTrader(traderAddr, symbol, overrides);
892
+ }
893
+ async pmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
894
+ if (!this.proxyContract || !this.multicall) {
895
+ throw new Error("proxy contract not initialized");
896
+ }
897
+ const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
892
898
  const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
893
- const poolId = this.getPoolIdFromSymbol(symbol);
894
899
  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);
900
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
901
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
902
902
  const proxyCalls = [
903
903
  // 0: traderState
904
904
  {
905
905
  target: this.proxyContract.target,
906
906
  allowFailure: false,
907
- callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, fS2S3]),
907
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
908
908
  },
909
909
  // 1: wallet balance
910
910
  {
@@ -912,31 +912,53 @@ class MarketData extends perpetualDataHandler_1.default {
912
912
  allowFailure: false,
913
913
  callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
914
914
  },
915
- // 2: exchange fee
915
+ // 2: amm state
916
916
  {
917
917
  target: this.proxyContract.target,
918
918
  allowFailure: false,
919
- callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
920
- poolId,
921
- traderAddr,
922
- constants_1.ZERO_ADDRESS,
923
- ]),
919
+ callData: this.proxyContract.interface.encodeFunctionData("getAMMState", [perpId, [fS2, fS3]]),
924
920
  },
925
921
  ];
926
922
  // multicall
927
923
  const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
928
- // position risk
929
- const idxNotional = 4;
930
924
  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
925
  const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
926
+ const ammState = this.proxyContract.interface.decodeFunctionResult("getAMMState", encodedResults[2].returnData)[0];
927
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, true //isPredMkt
928
+ );
929
+ const openInterestBC = (0, d8XMath_1.ABK64x64ToFloat)(ammState[11]);
930
+ const net = -(0, d8XMath_1.ABK64x64ToFloat)(ammState[1]);
931
+ let totLong, totShort;
932
+ if (net < 0) {
933
+ totLong = openInterestBC;
934
+ totShort = openInterestBC - Math.abs(net);
935
+ }
936
+ else {
937
+ totLong = openInterestBC - net;
938
+ totShort = openInterestBC;
939
+ }
940
+ let currentPositionBC = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
941
+ const Sm = (0, d8XMath_1.ABK64x64ToFloat)(traderState[8]);
942
+ // settlement token must be equal to collateral token for walletBalance to be correct
943
+ const availCashCC = account.collateralCC + walletBalance + account.unrealizedFundingCollateralCCY;
944
+ const idxNotional = 4;
945
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
946
+ const maxShort = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
947
+ const maxLong = (0, d8XMath_1.pmFindMaxTradeSize)(-1, currentPositionBC, availCashCC, account.entryPrice * currentPositionBC, Sm, Sm, indexPriceInfo.s3, totLong, totShort, maxShortPosPerp, maxLongPosPerp);
948
+ return { buy: maxLong, sell: maxShort };
949
+ }
950
+ /**
951
+ * Returns the maximal allowed short pos and long pos (signed) for a trader
952
+ * with given notional (in ABDK format) in the perpetual, ignoring the traders wallet balance
953
+ * @param perpId
954
+ * @param currentTraderPos ABDK64x64 notional position of trader
955
+ * @param overrides
956
+ * @returns [maxShortPos, maxLongPos] signed maximal position sizes
957
+ */
958
+ async getMaxShortLongPos(perpId, currentTraderPos, overrides) {
959
+ if (!this.proxyContract || !this.multicall) {
960
+ throw new Error("proxy contract not initialized");
961
+ }
940
962
  const proxyCalls2 = [
941
963
  // 0: max long
942
964
  {
@@ -944,7 +966,7 @@ class MarketData extends perpetualDataHandler_1.default {
944
966
  allowFailure: false,
945
967
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
946
968
  perpId,
947
- traderState[idxNotional],
969
+ currentTraderPos,
948
970
  true,
949
971
  ]),
950
972
  },
@@ -954,7 +976,7 @@ class MarketData extends perpetualDataHandler_1.default {
954
976
  allowFailure: false,
955
977
  callData: this.proxyContract.interface.encodeFunctionData("getMaxSignedOpenTradeSizeForPos", [
956
978
  perpId,
957
- traderState[idxNotional],
979
+ currentTraderPos,
958
980
  false,
959
981
  ]),
960
982
  },
@@ -964,15 +986,66 @@ class MarketData extends perpetualDataHandler_1.default {
964
986
  // Max based on perp:
965
987
  // max buy
966
988
  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]);
989
+ const maxLongPosPerp = maxLongOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
968
990
  // max short
969
991
  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]);
992
+ const maxShortPosPerp = maxShortOrderPerp + (0, d8XMath_1.ABK64x64ToFloat)(currentTraderPos);
993
+ return [maxShortPosPerp, maxLongPosPerp];
994
+ }
995
+ async rmMaxOrderSizeForTrader(traderAddr, symbol, overrides) {
996
+ const perpId = perpetualDataHandler_1.default.symbolToPerpetualId(symbol, this.symbolToPerpStaticInfo);
997
+ const poolId = this.getPoolIdFromSymbol(symbol);
998
+ const poolInfo = this.poolStaticInfos[this.getPoolStaticInfoIndexFromSymbol(symbol)];
999
+ const perpInfo = this.getPerpetualStaticInfo(symbol);
1000
+ const IERC20 = new ethers_1.Interface(constants_1.ERC20_ABI);
1001
+ const isPredMkt = false;
1002
+ const indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1003
+ let coll2SettlePromise = this.fetchCollateralToSettlementConversion(symbol);
1004
+ const [fS2, fS3, fEma] = [indexPriceInfo.s2, indexPriceInfo.s3, indexPriceInfo.ema].map((x) => (0, d8XMath_1.floatToABK64x64)(x));
1005
+ if (!this.proxyContract || !this.multicall) {
1006
+ throw new Error("proxy contract not initialized");
1007
+ }
1008
+ const proxyCalls = [
1009
+ // 0: traderState
1010
+ {
1011
+ target: this.proxyContract.target,
1012
+ allowFailure: false,
1013
+ callData: this.proxyContract.interface.encodeFunctionData("getTraderState", [perpId, traderAddr, [fEma, fS3]]),
1014
+ },
1015
+ // 1: wallet balance
1016
+ {
1017
+ target: poolInfo.poolSettleTokenAddr,
1018
+ allowFailure: false,
1019
+ callData: IERC20.encodeFunctionData("balanceOf", [traderAddr]),
1020
+ },
1021
+ // 2: exchange fee
1022
+ {
1023
+ target: this.proxyContract.target,
1024
+ allowFailure: false,
1025
+ callData: this.proxyContract.interface.encodeFunctionData("queryExchangeFee", [
1026
+ poolId,
1027
+ traderAddr,
1028
+ constants_1.ZERO_ADDRESS,
1029
+ ]),
1030
+ },
1031
+ ];
1032
+ // multicall
1033
+ const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
1034
+ // position risk
1035
+ const idxNotional = 4;
1036
+ const traderState = this.proxyContract.interface.decodeFunctionResult("getTraderState", encodedResults[0].returnData)[0];
1037
+ const account = MarketData.buildMarginAccountFromState(symbol, traderState, this.symbolToPerpStaticInfo, indexPriceInfo, isPredMkt);
1038
+ // fee rate
1039
+ const feeRateTbps = this.proxyContract.interface.decodeFunctionResult("queryExchangeFee", encodedResults[2].returnData)[0];
1040
+ const feeRate = 1e-5 * Number(feeRateTbps);
1041
+ // Max based on margin requirements:
1042
+ const walletBalance = (0, d8XMath_1.decNToFloat)(IERC20.decodeFunctionResult("balanceOf", encodedResults[1].returnData)[0], poolInfo.poolSettleTokenDecimals);
1043
+ const [maxShortPosPerp, maxLongPosPerp] = await this.getMaxShortLongPos(perpId, traderState[idxNotional], overrides);
971
1044
  const curPos = (account.side == constants_1.BUY_SIDE ? 1 : -1) * account.positionNotionalBaseCCY;
972
1045
  const px = await coll2SettlePromise;
973
1046
  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);
1047
+ 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);
1048
+ 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
1049
  // max long/short all accounted for
977
1050
  const maxLong = Math.min(Math.abs(maxLongPosPerp), Math.abs(maxLongPosAccount));
978
1051
  const maxShort = Math.min(Math.abs(maxShortPosPerp), Math.abs(maxShortPosAccount));
@@ -1105,6 +1178,7 @@ class MarketData extends perpetualDataHandler_1.default {
1105
1178
  /**
1106
1179
  * Get the current mark price
1107
1180
  * @param symbol symbol of the form ETH-USD-MATIC
1181
+ * @param indexPrices optional. IdxPriceInfo
1108
1182
  * @example
1109
1183
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1110
1184
  * async function main() {
@@ -1126,15 +1200,15 @@ class MarketData extends perpetualDataHandler_1.default {
1126
1200
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1127
1201
  }
1128
1202
  if (indexPrices == undefined) {
1129
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1130
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1203
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1131
1204
  }
1132
- return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices);
1205
+ return await perpetualDataHandler_1.default._queryPerpetualMarkPrice(symbol, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, this.isPredictionMarket(symbol));
1133
1206
  }
1134
1207
  /**
1135
1208
  * get the current price for a given quantity
1136
1209
  * @param symbol symbol of the form ETH-USD-MATIC
1137
1210
  * @param quantity quantity to be traded, negative if short
1211
+ * @param priceInfo [s2, s3, conf, params]; for non-prediction markets conf/params can be 0
1138
1212
  * @example
1139
1213
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
1140
1214
  * async function main() {
@@ -1151,16 +1225,18 @@ class MarketData extends perpetualDataHandler_1.default {
1151
1225
  *
1152
1226
  * @returns {number} price
1153
1227
  */
1154
- async getPerpetualPrice(symbol, quantity, indexPrices, overrides) {
1228
+ async getPerpetualPrice(symbol, quantity, priceInfo, overrides) {
1155
1229
  if (this.proxyContract == null) {
1156
1230
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1157
1231
  }
1158
- if (indexPrices == undefined) {
1232
+ if (priceInfo == undefined) {
1159
1233
  // fetch from API
1160
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1161
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1234
+ priceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1162
1235
  }
1163
- return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, indexPrices, overrides);
1236
+ return await perpetualDataHandler_1.default._queryPerpetualPrice(symbol, quantity, this.symbolToPerpStaticInfo, this.proxyContract, [priceInfo.s2, priceInfo.s3], //s2,s3
1237
+ priceInfo.conf, //conf
1238
+ priceInfo.predMktCLOBParams, //params
1239
+ overrides);
1164
1240
  }
1165
1241
  /**
1166
1242
  * Query recent perpetual state from blockchain
@@ -1172,8 +1248,7 @@ class MarketData extends perpetualDataHandler_1.default {
1172
1248
  throw Error("no proxy contract initialized. Use createProxyInstance().");
1173
1249
  }
1174
1250
  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]];
1251
+ indexPriceInfo = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1177
1252
  }
1178
1253
  let state = await perpetualDataHandler_1.default._queryPerpetualState(symbol, this.symbolToPerpStaticInfo, this.proxyContract, this.multicall, indexPriceInfo, overrides);
1179
1254
  return state;
@@ -1369,7 +1444,7 @@ class MarketData extends perpetualDataHandler_1.default {
1369
1444
  * Result is in collateral currency
1370
1445
  * @param {string} traderAddr address of the trader
1371
1446
  * @param {string} symbol perpetual symbol of the form BTC-USD-MATIC
1372
- * @param indexPrices optional index prices, will otherwise fetch from REST API
1447
+ * @param indexPrices optional indexPriceInfo
1373
1448
  * @returns available margin in collateral currency
1374
1449
  * @example
1375
1450
  * import { MarketData, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
@@ -1391,11 +1466,10 @@ class MarketData extends perpetualDataHandler_1.default {
1391
1466
  }
1392
1467
  if (indexPrices == undefined) {
1393
1468
  // fetch from API
1394
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1395
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
1469
+ indexPrices = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
1396
1470
  }
1397
1471
  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 || {});
1472
+ 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
1473
  const idx_availableMargin = 1;
1400
1474
  let mgn = (0, d8XMath_1.ABK64x64ToFloat)(traderState[idx_availableMargin]);
1401
1475
  return mgn;
@@ -1662,7 +1736,7 @@ class MarketData extends perpetualDataHandler_1.default {
1662
1736
  quoteCurrency: (0, utils_1.contractSymbolToSymbol)(perp.S2QuoteCCY, _symbolList),
1663
1737
  indexPrice: 0,
1664
1738
  collToQuoteIndexPrice: 0,
1665
- markPrice: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
1739
+ markPremium: (0, d8XMath_1.ABK64x64ToFloat)(perp.currentMarkPremiumRate.fPrice),
1666
1740
  midPrice: 0,
1667
1741
  currentFundingRateBps: 1e4 * (0, d8XMath_1.ABK64x64ToFloat)(perp.fCurrentFundingRate),
1668
1742
  openInterestBC: (0, d8XMath_1.ABK64x64ToFloat)(perp.fOpenInterest),
@@ -1711,7 +1785,6 @@ class MarketData extends perpetualDataHandler_1.default {
1711
1785
  perp.isMarketClosed = perp.isMarketClosed || idxPriceS3Pair[1];
1712
1786
  }
1713
1787
  perp.indexPrice = idxPriceS2Pair[0];
1714
- perp.markPrice = idxPriceS2Pair[0] * (1 + perp.markPrice); // currently filled with mark premium rate
1715
1788
  let indexS3 = 1;
1716
1789
  if (info.collateralCurrencyType == constants_1.COLLATERAL_CURRENCY_BASE) {
1717
1790
  indexS3 = idxPriceS2Pair[0];