@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
package/src/d8XMath.ts CHANGED
@@ -383,6 +383,7 @@ export function getNewPositionLeverage(
383
383
  * @param {number} price - price to trade amount 'tradeAmnt'
384
384
  * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
385
385
  * @param {number} S2Mark - mark price
386
+ * @param {boolean} isPredMkt - true if prediction market
386
387
  * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
387
388
  */
388
389
  export function getDepositAmountForLvgTrade(
@@ -392,11 +393,25 @@ export function getDepositAmountForLvgTrade(
392
393
  targetLvg: number,
393
394
  price: number,
394
395
  S3: number,
395
- S2Mark: number
396
+ S2Mark: number,
397
+ isPredMkt: boolean
396
398
  ) {
397
399
  let pnl = (tradeAmnt * (S2Mark - price)) / S3;
400
+ let S2MarkBefore = S2Mark;
401
+ if (isPredMkt) {
402
+ // adjust mark price to 'probability'
403
+ S2Mark = S2Mark - 1;
404
+ S2MarkBefore = S2Mark;
405
+ if (pos0 < 0) {
406
+ S2MarkBefore = 1 - S2Mark;
407
+ }
408
+ if (pos0 + tradeAmnt < 0) {
409
+ S2Mark = 1 - S2Mark;
410
+ }
411
+ }
398
412
  if (targetLvg == 0) {
399
- targetLvg = (Math.abs(pos0) * S2Mark) / S3 / b0;
413
+ // use current leverage
414
+ targetLvg = (Math.abs(pos0) * S2MarkBefore) / S3 / b0;
400
415
  }
401
416
  let b = (Math.abs(pos0 + tradeAmnt) * S2Mark) / S3 / targetLvg;
402
417
  return -(b0 + pnl - b);
@@ -422,3 +437,313 @@ export function priceToProb(px: number) {
422
437
  export function probToPrice(prob: number) {
423
438
  return 1 + prob;
424
439
  }
440
+
441
+ // shannon entropy
442
+ export function entropy(prob: number) {
443
+ if (prob < 1e-15 || prob - 1 > 1e-15) {
444
+ return 0;
445
+ }
446
+ return -prob * Math.log2(prob) - (1 - prob) * Math.log2(1 - prob);
447
+ }
448
+
449
+ /**
450
+ * Maintenance margin requirement for prediction markets
451
+ * @param pos signed position
452
+ * @param s2 mark price
453
+ * @param s3 collateral to quote conversion
454
+ * @param m base margin rate
455
+ * @returns required margin balance
456
+ */
457
+ function pmMarginThresh(pos: number, s2: number, s3: number, m: number | undefined = 0.18) {
458
+ let p = s2 - 1;
459
+ if (pos < 0) {
460
+ p = 1 - p;
461
+ }
462
+ const h = entropy(p);
463
+ const tau = m + (0.4 - m) * h;
464
+ return (Math.abs(pos) * p * tau) / s3;
465
+ }
466
+
467
+ /**
468
+ * Maintenance margin rate for prediction markets.
469
+ * @param posSign sign of position in base currency (can be signed position or -1, 1)
470
+ * @param sm mark-price (=1+p)
471
+ * @param m max margin rate from fInitialMarginRate
472
+ * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
473
+ */
474
+ export function pmMaintenanceMarginRate(posSign: number, sm: number, m: number | undefined = 0.18): number {
475
+ let p = sm - 1;
476
+ if (posSign < 0) {
477
+ p = 1 - p;
478
+ }
479
+ const h = entropy(p);
480
+ return m + (0.4 - m) * h;
481
+ }
482
+
483
+ /**
484
+ * Maintenance margin rate for prediction markets.
485
+ * @param posSign sign of position in base currency (can be signed position or -1, 1)
486
+ * @param sm mark-price (=1+p)
487
+ * @param m max margin rate from fMaintenanceMarginRate
488
+ * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
489
+ */
490
+ export function pmInitialMarginRate(posSign: number, sm: number, m: number | undefined = 0.2): number {
491
+ let p = sm - 1;
492
+ if (posSign < 0) {
493
+ p = 1 - p;
494
+ }
495
+ const h = entropy(p);
496
+ return m + (0.5 - m) * h;
497
+ }
498
+
499
+ /**
500
+ * Calculate the expected loss for a prediction market trade used for
501
+ * prediction market fees
502
+ * @param p probability derived from mark price (long)
503
+ * @param m maximal maintenance rate from which we defer the actual maintenance margin rate
504
+ * @param totLong total long in base currency
505
+ * @param totShort total short
506
+ * @param tradeAmt signed trade amount, can be zero
507
+ * @param tradeMgnRate margin rate of the trader
508
+ */
509
+ export function expectedLoss(
510
+ p: number,
511
+ m: number,
512
+ totLong: number,
513
+ totShort: number,
514
+ tradeAmt: number,
515
+ tradeMgnRate: number
516
+ ): number {
517
+ // maintenance margin rate
518
+ m = (0.4 - m) * entropy(p) + m;
519
+ let dlm = 0;
520
+ let dl = 0;
521
+ let dsm = 0;
522
+ let ds = 0;
523
+ if (tradeAmt > 0) {
524
+ dlm = p * tradeAmt * tradeMgnRate;
525
+ dl = tradeAmt;
526
+ } else if (tradeAmt < 0) {
527
+ dsm = (1 - p) * Math.abs(tradeAmt) * tradeMgnRate;
528
+ ds = Math.abs(tradeAmt);
529
+ }
530
+ const a = Math.max(0, dl + totLong - m * totShort - dsm);
531
+ const b = Math.max(0, ds + totShort - m * totLong + dsm);
532
+ return p * (1 - p) * (a + b);
533
+ }
534
+
535
+ /**
536
+ * Exchange fee as a rate for prediction markets
537
+ * @param prob long probability
538
+ * @param m max maintenance margin rate (0.18)
539
+ * @param totShort
540
+ * @param totLong
541
+ * @param tradeAmt trade amount in base currency
542
+ * @param tradeMgnRate margin rate for this trade
543
+ * @returns fee relative to tradeAmt
544
+ */
545
+ export function pmExchangeFee(
546
+ prob: number,
547
+ m: number,
548
+ totShort: number,
549
+ totLong: number,
550
+ tradeAmt: number,
551
+ tradeMgnRate: number
552
+ ): number {
553
+ const el0 = expectedLoss(prob, m, totLong, totShort, 0, 0);
554
+ const el1 = expectedLoss(prob, m, totLong, totShort, tradeAmt, tradeMgnRate);
555
+ const fee = (el1 - el0) / Math.abs(tradeAmt);
556
+ return Math.max(fee, 0.001);
557
+ }
558
+
559
+ /**
560
+ * Margin balance for prediction markets
561
+ * @param pos signed position
562
+ * @param s2 mark price
563
+ * @param s3 collateral to quote conversion
564
+ * @param ell locked in value
565
+ * @param mc margin cash in collateral currency
566
+ * @returns current margin balance
567
+ */
568
+ function pmMarginBalance(pos: number, s2: number, s3: number, ell: number, mc: number): number {
569
+ return (pos * s2) / s3 - ell / s3 + mc;
570
+ }
571
+
572
+ function pmExcessBalance(pos: number, s2: number, s3: number, ell: number, mc: number, m: number | undefined): number {
573
+ return pmMarginBalance(pos, mc, s2, s3, ell) - pmMarginThresh(pos, s2, s3, m);
574
+ }
575
+
576
+ // finds the liquidation price for prediction markets
577
+ // using Newton's algorithm
578
+ export function pmFindLiquidationPrice(
579
+ pos: number,
580
+ s3: number,
581
+ ell: number,
582
+ mc: number,
583
+ baseMarginRate: number | undefined,
584
+ s2Start: number | undefined = 0.5
585
+ ): number {
586
+ const delta_s = 0.01;
587
+ let s = 100;
588
+ let s_new = s2Start;
589
+
590
+ while (Math.abs(s_new - s) > 0.01) {
591
+ s = s_new;
592
+ const f = Math.pow(pmExcessBalance(pos, s, s3, ell, mc, baseMarginRate), 2);
593
+ const ds = (Math.pow(pmExcessBalance(pos, s + delta_s, s3, ell, mc, baseMarginRate), 2) - f) / delta_s;
594
+ s_new = s - f / ds;
595
+
596
+ if (s_new < 1) {
597
+ return 1;
598
+ }
599
+ if (s_new > 2) {
600
+ return 2;
601
+ }
602
+ }
603
+ return s;
604
+ }
605
+
606
+ /**
607
+ * Calculate the excess margin defined as
608
+ * excess := margin balance - trading fee - initial margin threshold
609
+ * for the given trade and position
610
+ * @param tradeAmt
611
+ * @param currentCashCC
612
+ * @param currentPos
613
+ * @param currentLockedInQC
614
+ * @param limitPrice
615
+ * @param Sm
616
+ * @param S3
617
+ * @param totLong
618
+ * @param totShort
619
+ * @returns excess margin as defined above
620
+ */
621
+ function excessMargin(
622
+ tradeAmt: number,
623
+ currentCashCC: number,
624
+ currentPos: number,
625
+ currentLockedInQC: number,
626
+ limitPrice: number,
627
+ Sm: number,
628
+ S3: number,
629
+ totLong: number,
630
+ totShort: number
631
+ ): number {
632
+ const m = 0.18; //max maintenance margin rate
633
+ const m0 = 0.2; //max initial margin rate
634
+ const pos = currentPos + tradeAmt;
635
+ let p = Sm - 1;
636
+ if (pos < 0) {
637
+ p = 2 - Sm; //=1-(Sm-1)
638
+ }
639
+ const h = entropy(p);
640
+ const tau = m0 + (0.5 - m0) * h;
641
+ const thresh = Math.abs(pos) * p * tau;
642
+ const b0 = currentCashCC + Math.abs(currentPos) * Sm - currentLockedInQC + Math.max(0, tradeAmt * (Sm - limitPrice));
643
+ // b0 + margin - fee > threshold
644
+ // margin = threshold - b0 + fee
645
+ const fee_cc = pmExchangeFee(p, m, totShort, totLong, tradeAmt, tau) / S3;
646
+
647
+ // missing: referral rebate
648
+ return b0 / S3 - thresh / S3 - fee_cc;
649
+ }
650
+
651
+ /**
652
+ * Find maximal trade size (short dir=-1 or long dir=1) for prediction
653
+ * markets.
654
+ * @param dir
655
+ * @param currentPosition
656
+ * @param currentCashCC
657
+ * @param currentLockedInValue
658
+ * @param limitPrice
659
+ * @param Sm
660
+ * @param S3
661
+ * @param totLong
662
+ * @param totShort
663
+ * @param maxShort
664
+ * @param maxLong
665
+ * @returns signed max trade size
666
+ */
667
+ export function pmFindMaxTradeSize(
668
+ dir: number,
669
+ currentPosition: number,
670
+ currentCashCC: number,
671
+ currentLockedInValue: number,
672
+ limitPrice: number,
673
+ Sm: number,
674
+ S3: number,
675
+ totLong: number,
676
+ totShort: number,
677
+ maxShort: number,
678
+ maxLong: number
679
+ ): number {
680
+ if (dir < 0) {
681
+ dir = -1;
682
+ } else {
683
+ dir = 1;
684
+ }
685
+ const lot = 10;
686
+ const deltaS = 1; //for derivative
687
+ const f0 = excessMargin(
688
+ dir * deltaS,
689
+ currentCashCC,
690
+ currentPosition,
691
+ currentLockedInValue,
692
+ limitPrice,
693
+ Sm,
694
+ S3,
695
+ totLong,
696
+ totShort
697
+ );
698
+ if (f0 < lot) {
699
+ // no trade possible
700
+ return 0;
701
+ }
702
+ // numerically find maximal trade size
703
+ let sNew = dir * lot * 10;
704
+ let s = 2 * sNew;
705
+ while (true) {
706
+ let count = 0;
707
+ while (Math.abs(sNew - s) > 1 && count < 100) {
708
+ s = sNew;
709
+ const f =
710
+ excessMargin(s, currentCashCC, currentPosition, currentLockedInValue, limitPrice, Sm, S3, totLong, totShort) **
711
+ 2;
712
+ const f2 =
713
+ excessMargin(
714
+ s + deltaS,
715
+ currentCashCC,
716
+ currentPosition,
717
+ currentLockedInValue,
718
+ limitPrice,
719
+ Sm,
720
+ S3,
721
+ totLong,
722
+ totShort
723
+ ) ** 2;
724
+ let ds = (f2 - f) / deltaS;
725
+ sNew = s - f / ds;
726
+ count += 1;
727
+ }
728
+ if (count < 100) {
729
+ break;
730
+ }
731
+ // Newton algorithm failed,
732
+ // choose new starting value
733
+ if (dir > 0) {
734
+ sNew = Math.random() * (maxLong - currentPosition);
735
+ } else {
736
+ sNew = -Math.random() * (Math.abs(maxShort) + currentPosition);
737
+ }
738
+ }
739
+ // ensure trade maximal trade sNew does not exceed
740
+ // the contract limits
741
+ if (currentPosition + sNew < maxShort) {
742
+ sNew = maxShort - currentPosition;
743
+ } else if (currentPosition + sNew > maxLong) {
744
+ sNew = maxLong - currentPosition;
745
+ }
746
+ // round trade size down to lot
747
+ sNew = Math.sign(sNew) * Math.floor(Math.abs(sNew) / lot) * lot;
748
+ return sNew;
749
+ }
@@ -1,9 +1,8 @@
1
1
  import { ContractTransactionResponse, JsonRpcProvider, Overrides, Signer, TransactionResponse } from "ethers";
2
2
  import { PayableOverrides } from "./contracts/common";
3
3
  import { IPyth__factory } from "./contracts/factories";
4
- import { ABK64x64ToFloat, floatToABK64x64 } from "./d8XMath";
4
+ import { ABK64x64ToFloat, floatToABK64x64, entropy } from "./d8XMath";
5
5
  import type { NodeSDKConfig, PriceFeedSubmission } from "./nodeSDKTypes";
6
- import PerpetualDataHandler from "./perpetualDataHandler";
7
6
  import WriteAccessHandler from "./writeAccessHandler";
8
7
 
9
8
  /**
@@ -221,15 +220,18 @@ export default class LiquidatorTool extends WriteAccessHandler {
221
220
  if (indexPrices == undefined) {
222
221
  // fetch from API
223
222
  let obj = await this.priceFeedGetter.fetchPricesForPerpetual(symbol);
224
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
223
+
224
+ indexPrices = [
225
+ obj.ema, // ema (pred mkts) or s2
226
+ obj.s3 ?? 0, // s3
227
+ ];
225
228
  }
226
- let traderState: bigint[] = await this.proxyContract.getTraderState(
227
- perpID,
228
- traderAddr,
229
- indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)) as [bigint, bigint],
230
- overrides || {}
231
- );
232
- if (traderState[idx_notional] == 0n) {
229
+ const fIdxPx = indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x)) as [
230
+ bigint,
231
+ bigint
232
+ ];
233
+ let traderState = await this.proxyContract.getTraderState(perpID, traderAddr, fIdxPx, overrides || {});
234
+ if (traderState[idx_notional] === 0n) {
233
235
  // trader does not have open position
234
236
  return true;
235
237
  }
@@ -242,15 +244,28 @@ export default class LiquidatorTool extends WriteAccessHandler {
242
244
  const pos = ABK64x64ToFloat(traderState[idx_marginAccountPositionBC]);
243
245
  const marginbalance = ABK64x64ToFloat(traderState[idx_marginBalance]);
244
246
  const coll2quote = ABK64x64ToFloat(traderState[idx_collateralToQuoteConversion]);
245
- let base2collateral = indexPrices[0] / coll2quote;
247
+ let threshold: number;
246
248
  if (this.isPredictionMarket(symbol)) {
247
- // flat margin rate for prediction markets
248
- base2collateral = 1;
249
+ const idx_markPrice = 8;
250
+ const markPrice = ABK64x64ToFloat(traderState[idx_markPrice]);
251
+ threshold = LiquidatorTool.maintenanceMarginPredMkts(maintMgnRate, pos, coll2quote, markPrice);
252
+ } else {
253
+ const base2collateral = indexPrices[0] / coll2quote;
254
+ threshold = Math.abs(pos * base2collateral * maintMgnRate);
249
255
  }
250
- const threshold = Math.abs(pos * base2collateral * maintMgnRate);
251
256
  return marginbalance >= threshold;
252
257
  }
253
258
 
259
+ public static maintenanceMarginPredMkts(maintMgnRateBase: number, pos: number, s3: number, markPx: number) {
260
+ let p = markPx - 1;
261
+ // p: price = 1+prob
262
+ if (pos < 0) {
263
+ p = 1 - p;
264
+ }
265
+ const tau = maintMgnRateBase + (0.4 - maintMgnRateBase) * entropy(p);
266
+ return (Math.abs(pos) * p * tau) / s3;
267
+ }
268
+
254
269
  /**
255
270
  * Total number of active accounts for this symbol, i.e. accounts with positions that are currently open.
256
271
  * @param {string} symbol Symbol of the form ETH-USD-MATIC.