@d8x/perpetuals-sdk 2.6.23 → 2.7.0

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 (253) hide show
  1. package/dist/cjs/config/defaultConfig.json +2 -2
  2. package/dist/cjs/constants.js.map +1 -1
  3. package/dist/cjs/d8XMath.d.ts +42 -25
  4. package/dist/cjs/d8XMath.js +188 -151
  5. package/dist/cjs/d8XMath.js.map +1 -1
  6. package/dist/cjs/liquidatorTool.d.ts +1 -1
  7. package/dist/cjs/liquidatorTool.js +9 -9
  8. package/dist/cjs/liquidatorTool.js.map +1 -1
  9. package/dist/cjs/marketData.d.ts +6 -6
  10. package/dist/cjs/marketData.js +9 -12
  11. package/dist/cjs/marketData.js.map +1 -1
  12. package/dist/cjs/perpetualDataHandler.d.ts +12 -12
  13. package/dist/cjs/perpetualDataHandler.js +13 -14
  14. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  15. package/dist/cjs/polyMktsPxFeed.js +2 -2
  16. package/dist/cjs/polyMktsPxFeed.js.map +1 -1
  17. package/dist/cjs/priceFeeds.d.ts +1 -0
  18. package/dist/cjs/priceFeeds.js +19 -3
  19. package/dist/cjs/priceFeeds.js.map +1 -1
  20. package/dist/cjs/version.d.ts +1 -1
  21. package/dist/cjs/version.js +1 -1
  22. package/dist/esm/config/defaultConfig.json +2 -2
  23. package/dist/esm/constants.js.map +1 -1
  24. package/dist/esm/d8XMath.d.ts +42 -25
  25. package/dist/esm/d8XMath.js +187 -150
  26. package/dist/esm/d8XMath.js.map +1 -1
  27. package/dist/esm/liquidatorTool.d.ts +1 -1
  28. package/dist/esm/liquidatorTool.js +10 -10
  29. package/dist/esm/liquidatorTool.js.map +1 -1
  30. package/dist/esm/marketData.d.ts +6 -6
  31. package/dist/esm/marketData.js +9 -12
  32. package/dist/esm/marketData.js.map +1 -1
  33. package/dist/esm/perpetualDataHandler.d.ts +12 -12
  34. package/dist/esm/perpetualDataHandler.js +13 -14
  35. package/dist/esm/perpetualDataHandler.js.map +1 -1
  36. package/dist/esm/polyMktsPxFeed.js +2 -2
  37. package/dist/esm/polyMktsPxFeed.js.map +1 -1
  38. package/dist/esm/priceFeeds.d.ts +1 -0
  39. package/dist/esm/priceFeeds.js +19 -3
  40. package/dist/esm/priceFeeds.js.map +1 -1
  41. package/dist/esm/version.d.ts +1 -1
  42. package/dist/esm/version.js +1 -1
  43. package/doc/d8x-perpetuals-sdk.md +116 -64
  44. package/package.json +1 -1
  45. package/src/config/defaultConfig.json +2 -2
  46. package/src/constants.ts +0 -1
  47. package/src/d8XMath.ts +210 -167
  48. package/src/liquidatorTool.ts +16 -10
  49. package/src/marketData.ts +33 -25
  50. package/src/perpetualDataHandler.ts +28 -34
  51. package/src/polyMktsPxFeed.ts +6 -7
  52. package/src/priceFeeds.ts +20 -4
  53. package/src/version.ts +1 -1
  54. package/dist/cjs/abi/AMMPerpLogic.json +0 -580
  55. package/dist/cjs/abi/BeaconProxy.json +0 -71
  56. package/dist/cjs/abi/IPerpetualManager copy.json +0 -5599
  57. package/dist/cjs/abi/IPerpetualMarginViewLogic.json +0 -286
  58. package/dist/cjs/abi/Maintainer.json +0 -774
  59. package/dist/cjs/abi/MockToken.json +0 -347
  60. package/dist/cjs/abi/MockUSD.json +0 -413
  61. package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
  62. package/dist/cjs/abi/WeETH.json +0 -310
  63. package/dist/cjs/abi-zkevm/IPerpetualManager.json +0 -5366
  64. package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
  65. package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
  66. package/dist/cjs/contracts/AMMPerpLogic.d.ts +0 -303
  67. package/dist/cjs/contracts/AMMPerpLogic.js +0 -3
  68. package/dist/cjs/contracts/AMMPerpLogic.js.map +0 -1
  69. package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
  70. package/dist/cjs/contracts/BeaconProxy.js +0 -3
  71. package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
  72. package/dist/cjs/contracts/IPerpetualManagerCopy.d.ts +0 -3223
  73. package/dist/cjs/contracts/IPerpetualManagerCopy.js +0 -3
  74. package/dist/cjs/contracts/IPerpetualManagerCopy.js.map +0 -1
  75. package/dist/cjs/contracts/IPerpetualMarginViewLogic.d.ts +0 -183
  76. package/dist/cjs/contracts/IPerpetualMarginViewLogic.js +0 -3
  77. package/dist/cjs/contracts/IPerpetualMarginViewLogic.js.map +0 -1
  78. package/dist/cjs/contracts/Maintainer.d.ts +0 -799
  79. package/dist/cjs/contracts/Maintainer.js +0 -3
  80. package/dist/cjs/contracts/Maintainer.js.map +0 -1
  81. package/dist/cjs/contracts/MockToken.d.ts +0 -263
  82. package/dist/cjs/contracts/MockToken.js +0 -3
  83. package/dist/cjs/contracts/MockToken.js.map +0 -1
  84. package/dist/cjs/contracts/MockUSD.d.ts +0 -186
  85. package/dist/cjs/contracts/MockUSD.js +0 -3
  86. package/dist/cjs/contracts/MockUSD.js.map +0 -1
  87. package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
  88. package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
  89. package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
  90. package/dist/cjs/contracts/WeETH.d.ts +0 -503
  91. package/dist/cjs/contracts/WeETH.js +0 -3
  92. package/dist/cjs/contracts/WeETH.js.map +0 -1
  93. package/dist/cjs/contracts/factories/AMMPerpLogic__factory.d.ts +0 -452
  94. package/dist/cjs/contracts/factories/AMMPerpLogic__factory.js +0 -598
  95. package/dist/cjs/contracts/factories/AMMPerpLogic__factory.js.map +0 -1
  96. package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  97. package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
  98. package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
  99. package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.d.ts +0 -4358
  100. package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.js +0 -5617
  101. package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.js.map +0 -1
  102. package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.d.ts +0 -221
  103. package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.js +0 -304
  104. package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.js.map +0 -1
  105. package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
  106. package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
  107. package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
  108. package/dist/cjs/contracts/factories/MockToken__factory.d.ts +0 -273
  109. package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
  110. package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
  111. package/dist/cjs/contracts/factories/MockUSD__factory.d.ts +0 -320
  112. package/dist/cjs/contracts/factories/MockUSD__factory.js +0 -431
  113. package/dist/cjs/contracts/factories/MockUSD__factory.js.map +0 -1
  114. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  115. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
  116. package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  117. package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
  118. package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
  119. package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
  120. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  121. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
  122. package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  123. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  124. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
  125. package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  126. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  127. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
  128. package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  129. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  130. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
  131. package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  132. package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
  133. package/dist/cjs/contracts/factories/lean0/index.js +0 -15
  134. package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
  135. package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  136. package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
  137. package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
  138. package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
  139. package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
  140. package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
  141. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  142. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
  143. package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  144. package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
  145. package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
  146. package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
  147. package/dist/cjs/contracts/lean0/index.d.ts +0 -4
  148. package/dist/cjs/contracts/lean0/index.js +0 -3
  149. package/dist/cjs/contracts/lean0/index.js.map +0 -1
  150. package/dist/esm/abi/AMMPerpLogic.json +0 -580
  151. package/dist/esm/abi/BeaconProxy.json +0 -71
  152. package/dist/esm/abi/IPerpetualManager copy.json +0 -5599
  153. package/dist/esm/abi/IPerpetualMarginViewLogic.json +0 -286
  154. package/dist/esm/abi/Maintainer.json +0 -774
  155. package/dist/esm/abi/MockToken.json +0 -347
  156. package/dist/esm/abi/MockUSD.json +0 -413
  157. package/dist/esm/abi/UUPSUpgradeable.json +0 -104
  158. package/dist/esm/abi/WeETH.json +0 -310
  159. package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
  160. package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
  161. package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
  162. package/dist/esm/abi/lean0/ShareToken.json +0 -438
  163. package/dist/esm/abi-zkevm/IPerpetualManager.json +0 -5366
  164. package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
  165. package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
  166. package/dist/esm/contracts/AMMPerpLogic.d.ts +0 -303
  167. package/dist/esm/contracts/AMMPerpLogic.js +0 -2
  168. package/dist/esm/contracts/AMMPerpLogic.js.map +0 -1
  169. package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
  170. package/dist/esm/contracts/BeaconProxy.js +0 -2
  171. package/dist/esm/contracts/BeaconProxy.js.map +0 -1
  172. package/dist/esm/contracts/IPerpetualManagerCopy.d.ts +0 -3223
  173. package/dist/esm/contracts/IPerpetualManagerCopy.js +0 -2
  174. package/dist/esm/contracts/IPerpetualManagerCopy.js.map +0 -1
  175. package/dist/esm/contracts/IPerpetualMarginViewLogic.d.ts +0 -183
  176. package/dist/esm/contracts/IPerpetualMarginViewLogic.js +0 -2
  177. package/dist/esm/contracts/IPerpetualMarginViewLogic.js.map +0 -1
  178. package/dist/esm/contracts/Maintainer.d.ts +0 -799
  179. package/dist/esm/contracts/Maintainer.js +0 -2
  180. package/dist/esm/contracts/Maintainer.js.map +0 -1
  181. package/dist/esm/contracts/MockToken.d.ts +0 -263
  182. package/dist/esm/contracts/MockToken.js +0 -2
  183. package/dist/esm/contracts/MockToken.js.map +0 -1
  184. package/dist/esm/contracts/MockUSD.d.ts +0 -186
  185. package/dist/esm/contracts/MockUSD.js +0 -2
  186. package/dist/esm/contracts/MockUSD.js.map +0 -1
  187. package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
  188. package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
  189. package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
  190. package/dist/esm/contracts/WeETH.d.ts +0 -503
  191. package/dist/esm/contracts/WeETH.js +0 -2
  192. package/dist/esm/contracts/WeETH.js.map +0 -1
  193. package/dist/esm/contracts/factories/AMMPerpLogic__factory.d.ts +0 -452
  194. package/dist/esm/contracts/factories/AMMPerpLogic__factory.js +0 -594
  195. package/dist/esm/contracts/factories/AMMPerpLogic__factory.js.map +0 -1
  196. package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
  197. package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
  198. package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
  199. package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.d.ts +0 -4358
  200. package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.js +0 -5613
  201. package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.js.map +0 -1
  202. package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.d.ts +0 -221
  203. package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.js +0 -300
  204. package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.js.map +0 -1
  205. package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
  206. package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
  207. package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
  208. package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
  209. package/dist/esm/contracts/factories/MockToken__factory.js +0 -361
  210. package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
  211. package/dist/esm/contracts/factories/MockUSD__factory.d.ts +0 -320
  212. package/dist/esm/contracts/factories/MockUSD__factory.js +0 -427
  213. package/dist/esm/contracts/factories/MockUSD__factory.js.map +0 -1
  214. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
  215. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
  216. package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
  217. package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
  218. package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
  219. package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
  220. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
  221. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
  222. package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
  223. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
  224. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
  225. package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
  226. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
  227. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
  228. package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
  229. package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
  230. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
  231. package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
  232. package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
  233. package/dist/esm/contracts/factories/lean0/index.js +0 -8
  234. package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
  235. package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
  236. package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
  237. package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
  238. package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
  239. package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
  240. package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
  241. package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
  242. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
  243. package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
  244. package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
  245. package/dist/esm/contracts/lean0/ShareToken.js +0 -2
  246. package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
  247. package/dist/esm/contracts/lean0/index.d.ts +0 -4
  248. package/dist/esm/contracts/lean0/index.js +0 -2
  249. package/dist/esm/contracts/lean0/index.js.map +0 -1
  250. package/src/contracts/IPerpetualMarginViewLogic.ts +0 -347
  251. package/src/contracts/MockUSD.ts +0 -378
  252. package/src/contracts/factories/IPerpetualMarginViewLogic__factory.ts +0 -313
  253. package/src/contracts/factories/MockUSD__factory.ts +0 -430
@@ -28,8 +28,8 @@
28
28
  {
29
29
  "name": "base_sepolia",
30
30
  "chainId": 84532,
31
- "version": 1,
32
- "proxyAddr": "0xa7868558E094E58251c6D12f407294c11522E88D",
31
+ "version": 3,
32
+ "proxyAddr": "0xfaC638d51B769D060aFC5953C41bF35595620b1c",
33
33
  "nodeURL": "https://sepolia.base.org",
34
34
  "priceFeedConfigNetwork": "mainnet",
35
35
  "shareTokenABILocation": "./abi/ShareToken.json",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"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"}
@@ -160,10 +160,27 @@ export declare function getNewPositionLeverage(tradeAmount: number, marginCollat
160
160
  * @param {number} price - price to trade amount 'tradeAmnt'
161
161
  * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
162
162
  * @param {number} S2Mark - mark price
163
- * @param {boolean} isPredMkt - true if prediction market
163
+ * @param {number} cmin - Absolute minimum margin per contract, only for pred markets
164
164
  * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
165
165
  */
166
- export declare function getDepositAmountForLvgTrade(pos0: number, b0: number, tradeAmnt: number, targetLvg: number, price: number, S3: number, S2Mark: number, isPredMkt: boolean): number;
166
+ export declare function getDepositAmountForLvgTrade(pos0: number, b0: number, tradeAmnt: number, targetLvg: number, price: number, S3: number, S2Mark: number, cmin: number | undefined): number;
167
+ /**
168
+ * Determine amount to be deposited into margin account so that the given leverage
169
+ * is obtained when opening a prediction market position
170
+ * Does NOT include fees, but accounts for a possible non-zero current position
171
+ * Smart contract equivalent: getDepositAmountForPredMktLvgPosition
172
+ * @param {number} pos0 - current position
173
+ * @param {number} b0 - current balance
174
+ * @param {number} c0 - current available cash
175
+ * @param {number} tradeAmnt - amount to trade
176
+ * @param {number} targetLvg - target leverage
177
+ * @param {number} prob - prob to trade amount 'tradeAmnt'
178
+ * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
179
+ * @param {number} markProb - mark prob
180
+ * @param {number} imr - minimum absolute margin per contract (fInitialMarginRate)
181
+ * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
182
+ */
183
+ export declare function getDepositAmountForPredMktLvgTrade(pos0: number, b0: number, c0: number, tradeAmnt: number, targetLvg: number, prob: number, S3: number, markProb: number, imr: number): number;
167
184
  /**
168
185
  * Convert a perpetual price to probability (predtictive markets)
169
186
  * @param px Perpetual price
@@ -179,32 +196,22 @@ export declare function probToPrice(prob: number): number;
179
196
  export declare function entropy(prob: number): number;
180
197
  /**
181
198
  * Maintenance margin rate for prediction markets.
182
- * @param posSign sign of position in base currency (can be signed position or -1, 1)
199
+ * @param position signed position in base currency
200
+ * @param lockedInQC locked in value, p or 1-p times number of contracts
183
201
  * @param sm mark-price (=1+p)
184
- * @param m max margin rate from fInitialMarginRate
185
- * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
202
+ * @param m absolute maintenance buffer per contract (mu_m, fMaintenanceMarginRate)
203
+ * @returns {number} The margin rate to be applied: (Math.abs(pos) * p * tau) / s3
186
204
  */
187
- export declare function pmMaintenanceMarginRate(posSign: number, sm: number, m?: number | undefined): number;
205
+ export declare function pmMaintenanceMarginRate(position: number, lockedInQC: number, sm: number, m: number): number;
188
206
  /**
189
- * Maintenance margin rate for prediction markets.
207
+ * Initial margin rate for prediction markets.
190
208
  * @param posSign sign of position in base currency (can be signed position or -1, 1)
209
+ * @param s0 trade price
191
210
  * @param sm mark-price (=1+p)
192
- * @param m max margin rate from fMaintenanceMarginRate
193
- * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
194
- */
195
- export declare function pmInitialMarginRate(posSign: number, sm: number, m?: number | undefined): number;
196
- /**
197
- * Calculate the expected loss for a prediction market trade used for
198
- * prediction market fees
199
- * @param p probability derived from mark price (long)
200
- * @param m maximal maintenance rate from which we defer the actual maintenance margin rate
201
- * @param totLong total long in base currency
202
- * @param totShort total short
203
- * @param tradeAmt signed trade amount, can be zero
204
- * @param tradeMgnRate margin rate of the trader
205
- * @returns expected loss in dollars
211
+ * @param cmin Absolute min margin saved as `fInitialMarginRate`
212
+ * @returns {number} The margin rate to be applied: `(Math.abs(pos) * p * tau) / s3`
206
213
  */
207
- export declare function expectedLoss(p: number, m: number, totLong: number, totShort: number, tradeAmt: number, tradeMgnRate: number): number;
214
+ export declare function pmInitialMarginRate(posSign: number, s0: number, sm: number, cmin: number): number;
208
215
  /**
209
216
  * Exchange fee as a rate for prediction markets
210
217
  * For opening trades only
@@ -225,8 +232,18 @@ export declare function pmExchangeFee(prob: number, m: number, tradeAmt: number,
225
232
  * @returns current margin balance
226
233
  */
227
234
  export declare function pmMarginBalance(pos: number, s2: number, s3: number, ell: number, mc: number): number;
228
- export declare function pmExcessBalance(pos: number, s2: number, s3: number, ell: number, mc: number, m: number | undefined): number;
229
- export declare function pmFindLiquidationPrice(pos: number, s3: number, ell: number, mc: number, baseMarginRate: number | undefined, s2Start?: number | undefined): number;
235
+ export declare function pmExcessBalance(pos: number, s2: number, s3: number, ell: number, mc: number, m: number): number;
236
+ /**
237
+ *
238
+ * @param pos Signed position size
239
+ * @param s3 Collateral to quote conversion at spot
240
+ * @param ell Locked-in value
241
+ * @param mc Margin collateral
242
+ * @param baseMarginRate Maintenance margin per contract (mu_m)
243
+ * @param sm Mark price at entry
244
+ * @returns {number} Liquidation price as a probability in the range [0, 1]
245
+ */
246
+ export declare function pmFindLiquidationPrice(pos: number, s3: number, ell: number, mc: number, baseMarginRate: number): number;
230
247
  /**
231
248
  * Find maximal *affordable* trade size (short dir=-1 or long dir=1) for prediction
232
249
  * markets at provided leverage and incorporating the current position
@@ -254,6 +271,6 @@ export declare function pmFindMaxPersonalTradeSizeAtLeverage(dir: number, lvg: n
254
271
  * @param short Short open OI
255
272
  * @param sm Mark price (>1)
256
273
  * @param isBuy True if trade is long
257
- * @param mr Maintenance margin rate
274
+ * @param mr Margin threshold per contract for liquidation (mu_m)
258
275
  */
259
276
  export declare function pmMaxSignedOpenTradeSize(long: number, short: number, sm: number, isBuy: boolean, mr: number, ammFundsQC: number): number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pmMaxSignedOpenTradeSize = exports.pmFindMaxPersonalTradeSizeAtLeverage = exports.pmFindLiquidationPrice = exports.pmExcessBalance = exports.pmMarginBalance = exports.pmExchangeFee = exports.expectedLoss = exports.pmInitialMarginRate = exports.pmMaintenanceMarginRate = exports.entropy = exports.probToPrice = exports.priceToProb = exports.getDepositAmountForLvgTrade = exports.getNewPositionLeverage = exports.getMaxSignedPositionSize = exports.getMarginRequiredForLeveragedTrade = exports.calculateLiquidationPriceCollateralQuote = exports.calculateLiquidationPriceCollateralQuanto = exports.calculateLiquidationPriceCollateralQuantoConservative = exports.calculateLiquidationPriceCollateralBase = exports.div64x64 = exports.mul64x64 = exports.roundToLotString = exports.countDecimalsOf = exports.floatToDecN = exports.floatToDec18 = exports.floatToABK64x64 = exports.dec18ToFloat = exports.decNToFloat = exports.ABK64x64ToFloat = exports.ABDK29ToFloat = void 0;
3
+ exports.pmMaxSignedOpenTradeSize = exports.pmFindMaxPersonalTradeSizeAtLeverage = exports.pmFindLiquidationPrice = exports.pmExcessBalance = exports.pmMarginBalance = exports.pmExchangeFee = exports.pmInitialMarginRate = exports.pmMaintenanceMarginRate = exports.entropy = exports.probToPrice = exports.priceToProb = exports.getDepositAmountForPredMktLvgTrade = exports.getDepositAmountForLvgTrade = exports.getNewPositionLeverage = exports.getMaxSignedPositionSize = exports.getMarginRequiredForLeveragedTrade = exports.calculateLiquidationPriceCollateralQuote = exports.calculateLiquidationPriceCollateralQuanto = exports.calculateLiquidationPriceCollateralQuantoConservative = exports.calculateLiquidationPriceCollateralBase = exports.div64x64 = exports.mul64x64 = exports.roundToLotString = exports.countDecimalsOf = exports.floatToDecN = exports.floatToDec18 = exports.floatToABK64x64 = exports.dec18ToFloat = exports.decNToFloat = exports.ABK64x64ToFloat = exports.ABDK29ToFloat = void 0;
4
4
  const constants_1 = require("./constants");
5
5
  /**
6
6
  * @module d8xMath
@@ -352,31 +352,102 @@ exports.getNewPositionLeverage = getNewPositionLeverage;
352
352
  * @param {number} price - price to trade amount 'tradeAmnt'
353
353
  * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
354
354
  * @param {number} S2Mark - mark price
355
- * @param {boolean} isPredMkt - true if prediction market
355
+ * @param {number} cmin - Absolute minimum margin per contract, only for pred markets
356
356
  * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
357
357
  */
358
- function getDepositAmountForLvgTrade(pos0, b0, tradeAmnt, targetLvg, price, S3, S2Mark, isPredMkt) {
359
- let pnl = (tradeAmnt * (S2Mark - price)) / S3;
360
- let S2MarkBefore = S2Mark;
361
- if (isPredMkt) {
362
- // adjust mark price to 'probability'
363
- S2Mark = S2Mark - 1;
364
- S2MarkBefore = S2Mark;
365
- if (pos0 < 0) {
366
- S2MarkBefore = 1 - S2Mark;
367
- }
368
- if (pos0 + tradeAmnt < 0) {
369
- S2Mark = 1 - S2Mark;
358
+ function getDepositAmountForLvgTrade(pos0, b0, tradeAmnt, targetLvg, price, S3, S2Mark, cmin) {
359
+ if (cmin && cmin > 0) {
360
+ // TODO: c0?
361
+ if (b0 != 0) {
362
+ console.log("b0 != 0");
370
363
  }
364
+ return getDepositAmountForPredMktLvgTrade(pos0, b0, 0, tradeAmnt, targetLvg, price - 1, S3, S2Mark - 1, cmin);
371
365
  }
366
+ let pnl = (tradeAmnt * (S2Mark - price)) / S3;
372
367
  if (targetLvg == 0) {
373
368
  // use current leverage
374
- targetLvg = (Math.abs(pos0) * S2MarkBefore) / S3 / b0;
369
+ targetLvg = (Math.abs(pos0) * S2Mark) / S3 / b0;
375
370
  }
376
371
  let b = (Math.abs(pos0 + tradeAmnt) * S2Mark) / S3 / targetLvg;
377
372
  return -(b0 + pnl - b);
378
373
  }
379
374
  exports.getDepositAmountForLvgTrade = getDepositAmountForLvgTrade;
375
+ /**
376
+ * Determine amount to be deposited into margin account so that the given leverage
377
+ * is obtained when opening a prediction market position
378
+ * Does NOT include fees, but accounts for a possible non-zero current position
379
+ * Smart contract equivalent: getDepositAmountForPredMktLvgPosition
380
+ * @param {number} pos0 - current position
381
+ * @param {number} b0 - current balance
382
+ * @param {number} c0 - current available cash
383
+ * @param {number} tradeAmnt - amount to trade
384
+ * @param {number} targetLvg - target leverage
385
+ * @param {number} prob - prob to trade amount 'tradeAmnt'
386
+ * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
387
+ * @param {number} markProb - mark prob
388
+ * @param {number} imr - minimum absolute margin per contract (fInitialMarginRate)
389
+ * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
390
+ */
391
+ function getDepositAmountForPredMktLvgTrade(pos0, b0, c0, tradeAmnt, targetLvg, prob, S3, markProb, imr) {
392
+ /**
393
+ * Smart contract implementation:
394
+ // find smallest x such that:
395
+ // bal * s3 >= pos value / lvg
396
+ // where:
397
+ // pos value / lvg = |pos| * R(pm, sign(pos)) * margin rate
398
+ // pos = pos0 + k
399
+ // cash = cash0 + x
400
+ // ell = ell0 + px * k
401
+ // bal * s3 = cash * s3 + pos * sm - ell
402
+ // = bal0 * s3 + x * s3 + k * (sm - px)
403
+
404
+ // subject to:
405
+ // x >= 0
406
+ // cash * s3 >= |pos| * min(cmin, prob(sign(pos)))
407
+ // k * (sm - px) <= 0 a.s.
408
+ // (positive pnl does not contribute, i.e. ignore px better than mark)
409
+
410
+ // solution:
411
+ // bal0 * s3 + x * s3 >= pos value / lvg + (k * (px - sm))_+ = v * s3
412
+ // -->
413
+ // x >= v + (cash0 - bal0)_+ - cash0 = v - min(bal0, cash0)
414
+ // = pos value / lvg/ s3 + (k * (px - sm))_+ / s3 - min (bal0, cash0)
415
+ // = A + B - C
416
+ // x >= |pos| * min(cmin, prob(sign(pos))) / s3 - cash0
417
+ // x >= 0
418
+
419
+ // init x = A = pos value / lvg / s3
420
+ int128 fNewPos = _fPosition0.add(_fTradeAmount);
421
+ int128 v = (
422
+ fNewPos > 0 ? fNewPos.mul(_fMarkProb) : fNewPos.neg().mul(ONE_64x64.sub(_fMarkProb))
423
+ ).mul(_fMarginRate).div(_fS3);
424
+ // + B = max(0,k * (px - sm)) / s3
425
+ {
426
+ int128 fPnL = _fTradeAmount.mul(_fMarkProb.sub(_fTradeProb));
427
+ if (fPnL < 0) {
428
+ v = v.sub(fPnL.div(_fS3)); // pnl < 0 -> increase v
429
+ }
430
+ }
431
+ // - C = - min(bal0, cash0) = - Equity
432
+ {
433
+ int128 equity = _fCash0CC < _fBalance0 ? _fCash0CC : _fBalance0;
434
+ v = v.sub(equity); // equity can be used / must be covered if negative
435
+ }
436
+ return v > 0 ? v : int128(0);
437
+ */
438
+ const newPos = pos0 + tradeAmnt;
439
+ const posProb = newPos > 0 ? markProb : 1 - markProb; // R(pm, sign(new pos))
440
+ const maxLvg = pmMaxLeverage(newPos, markProb, imr);
441
+ targetLvg = targetLvg > maxLvg ? maxLvg : targetLvg;
442
+ const posValue = (Math.abs(newPos) * posProb) / S3;
443
+ const tradeLoss = Math.max(0, tradeAmnt * (prob - markProb)) / S3;
444
+ const curEquity = Math.min(c0, b0);
445
+ return Math.max(posValue / targetLvg + tradeLoss - curEquity, 0);
446
+ }
447
+ exports.getDepositAmountForPredMktLvgTrade = getDepositAmountForPredMktLvgTrade;
448
+ function pmMaxLeverage(posSign, markProb, minMarginPerCtrct) {
449
+ return Math.round(100 * (posSign > 0 ? markProb / minMarginPerCtrct : (1 - markProb) / minMarginPerCtrct)) / 100;
450
+ }
380
451
  /**
381
452
  * Convert a perpetual price to probability (predtictive markets)
382
453
  * @param px Perpetual price
@@ -392,7 +463,7 @@ exports.priceToProb = priceToProb;
392
463
  * @returns Perpetual price
393
464
  */
394
465
  function probToPrice(prob) {
395
- return 1 + prob;
466
+ return Math.max(1, Math.min(2, 1 + prob));
396
467
  }
397
468
  exports.probToPrice = probToPrice;
398
469
  // shannon entropy
@@ -406,113 +477,59 @@ exports.entropy = entropy;
406
477
  /**
407
478
  * Maintenance margin requirement for prediction markets
408
479
  * @param pos signed position
480
+ * @param lockedInQC locked in value
409
481
  * @param s2 mark price
410
482
  * @param s3 collateral to quote conversion
411
483
  * @param m base margin rate
412
484
  * @returns required margin balance
413
485
  */
414
- function pmMarginThresh(pos, s2, s3, m = 0.18) {
415
- let p = s2 - 1;
416
- if (pos < 0) {
417
- p = 1 - p;
418
- }
419
- const h = entropy(p);
420
- const tau = m + (0.4 - m) * h;
421
- return (Math.abs(pos) * p * tau) / s3;
486
+ function pmMarginThresh(pos, lockedInQC, s2, s3, m) {
487
+ return (pmMaintenanceMarginRate(pos, lockedInQC, s2, m) * Math.abs(pos)) / s3;
422
488
  }
423
489
  /**
424
490
  * Maintenance margin rate for prediction markets.
425
- * @param posSign sign of position in base currency (can be signed position or -1, 1)
491
+ * @param position signed position in base currency
492
+ * @param lockedInQC locked in value, p or 1-p times number of contracts
426
493
  * @param sm mark-price (=1+p)
427
- * @param m max margin rate from fInitialMarginRate
428
- * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
429
- */
430
- function pmMaintenanceMarginRate(posSign, sm, m = 0.18) {
431
- let p = sm - 1;
432
- if (posSign < 0) {
433
- p = 1 - p;
494
+ * @param m absolute maintenance buffer per contract (mu_m, fMaintenanceMarginRate)
495
+ * @returns {number} The margin rate to be applied: (Math.abs(pos) * p * tau) / s3
496
+ */
497
+ function pmMaintenanceMarginRate(position, lockedInQC, sm, m) {
498
+ let pm = sm - 1;
499
+ let entryP = position == 0 ? pm : Math.abs(lockedInQC / position) - 1;
500
+ if (position < 0) {
501
+ pm = 1 - pm;
502
+ entryP = 1 - entryP;
434
503
  }
435
- const h = entropy(p);
436
- return m + (0.4 - m) * h;
504
+ const L = Math.max(entryP - pm, 0);
505
+ const balAtLiq = Math.min(m + L, entryP) * Math.abs(position) + position * sm - lockedInQC;
506
+ return balAtLiq / (Math.abs(position) * pm);
437
507
  }
438
508
  exports.pmMaintenanceMarginRate = pmMaintenanceMarginRate;
439
509
  /**
440
- * Maintenance margin rate for prediction markets.
510
+ * Initial margin rate for prediction markets.
441
511
  * @param posSign sign of position in base currency (can be signed position or -1, 1)
512
+ * @param s0 trade price
442
513
  * @param sm mark-price (=1+p)
443
- * @param m max margin rate from fMaintenanceMarginRate
444
- * @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3;
514
+ * @param cmin Absolute min margin saved as `fInitialMarginRate`
515
+ * @returns {number} The margin rate to be applied: `(Math.abs(pos) * p * tau) / s3`
445
516
  */
446
- function pmInitialMarginRate(posSign, sm, m = 0.2) {
447
- let p = sm - 1;
517
+ function pmInitialMarginRate(posSign, s0, sm, cmin) {
518
+ let pm = sm - 1;
519
+ let p0 = s0 - 1;
448
520
  if (posSign < 0) {
449
- p = 1 - p;
521
+ pm = 1 - pm; // R(p_mark, sign(pos))
522
+ p0 = 1 - p0; // R(p_entry, sign(pos))
450
523
  }
451
- const h = entropy(p);
452
- return m + (0.5 - m) * h;
524
+ // mu0 = max(Rm/lvg, min(Rm, cmin))
525
+ // balance = (mu0 * |k| + k *(sm - s0)) / s3
526
+ // pos value = |k| * Rm / s3
527
+ // at max init lvg: Rm/lvg = min(cmin, Rm)
528
+ // --> margin rate = (mu0 + Rm - R0) / Rm
529
+ const mu0 = Math.min(pm, cmin) + Math.max(0, p0 - pm);
530
+ return (mu0 + pm - p0) / pm;
453
531
  }
454
532
  exports.pmInitialMarginRate = pmInitialMarginRate;
455
- /**
456
- * Calculate the expected loss for a prediction market trade used for
457
- * prediction market fees
458
- * @param p probability derived from mark price (long)
459
- * @param m maximal maintenance rate from which we defer the actual maintenance margin rate
460
- * @param totLong total long in base currency
461
- * @param totShort total short
462
- * @param tradeAmt signed trade amount, can be zero
463
- * @param tradeMgnRate margin rate of the trader
464
- * @returns expected loss in dollars
465
- */
466
- function expectedLoss(p, m, totLong, totShort, tradeAmt, tradeMgnRate) {
467
- // maintenance margin rate
468
- m = (0.4 - m) * entropy(p) + m;
469
- let dlm = 0;
470
- let dl = 0;
471
- let dsm = 0;
472
- let ds = 0;
473
- if (tradeAmt > 0) {
474
- dlm = p * tradeAmt * tradeMgnRate;
475
- dl = tradeAmt;
476
- }
477
- else if (tradeAmt < 0) {
478
- dsm = (1 - p) * Math.abs(tradeAmt) * tradeMgnRate;
479
- ds = Math.abs(tradeAmt);
480
- }
481
- const a = dl + totLong - m * totShort - dsm;
482
- const b = ds + totShort - m * totLong - dlm;
483
- return p * (1 - p) * Math.max(0, a + b);
484
- }
485
- exports.expectedLoss = expectedLoss;
486
- /**
487
- * Equivalent to
488
- * const el0 = expectedLoss(prob, m, totLong, totShort, 0, 0);
489
- * const el1 = expectedLoss(prob, m, totLong, totShort, tradeAmt, tradeMgnRate)
490
- * const fee = (el1 - el0) / Math.abs(tradeAmt);
491
- * @param p prob long probability
492
- * @param m max maintenance margin rate (0.18)
493
- * @param tradeAmt trade amount in base currency
494
- * @param tradeMgnRate margin rate for this trade
495
- * @returns dollar fee
496
- */
497
- function expectedLossImpact(p, m, tradeAmt, tradeMgnRate) {
498
- m = (0.4 - m) * entropy(p) + m;
499
- let dlm = 0;
500
- let dl = 0;
501
- let dsm = 0;
502
- let ds = 0;
503
- if (tradeAmt > 0) {
504
- dlm = p * tradeAmt * tradeMgnRate;
505
- dl = tradeAmt;
506
- }
507
- else if (tradeAmt < 0) {
508
- dsm = (1 - p) * Math.abs(tradeAmt) * tradeMgnRate;
509
- ds = Math.abs(tradeAmt);
510
- }
511
- //long: p * (1 - p) max(0, dl-dlm) = p * (1 - p) max(0, tradeAmt - p * tradeAmt * tradeMgnRate)
512
- const a = dl - dsm;
513
- const b = ds - dlm;
514
- return p * (1 - p) * Math.max(0, a + b);
515
- }
516
533
  /**
517
534
  * Exchange fee as a rate for prediction markets
518
535
  * For opening trades only
@@ -523,13 +540,12 @@ function expectedLossImpact(p, m, tradeAmt, tradeMgnRate) {
523
540
  * @returns dollar fee relative to tradeAmt
524
541
  */
525
542
  function pmExchangeFee(prob, m, tradeAmt, tradeMgnRate) {
526
- /*
527
- equivalent:
528
- const el0 = expectedLoss(prob, m, totLong, totShort, 0, 0);
529
- const el1 = expectedLoss(prob, m, totLong, totShort, tradeAmt, tradeMgnRate);
530
- const fee = (el1 - el0) / Math.abs(tradeAmt);
531
- */
532
- let fee = expectedLossImpact(prob, m, tradeAmt, tradeMgnRate) / Math.abs(tradeAmt);
543
+ // TODO: port contract logic here
544
+ const [kappa, es] = [0, 0];
545
+ prob = tradeAmt > 0 ? prob : 1 - prob;
546
+ let fee = prob * (1 - kappa);
547
+ const scaledLvg = prob * tradeMgnRate * (1 - fee);
548
+ fee = fee * (1 - prob) - scaledLvg + es;
533
549
  return Math.max(fee, 0.001);
534
550
  }
535
551
  exports.pmExchangeFee = pmExchangeFee;
@@ -547,28 +563,40 @@ function pmMarginBalance(pos, s2, s3, ell, mc) {
547
563
  }
548
564
  exports.pmMarginBalance = pmMarginBalance;
549
565
  function pmExcessBalance(pos, s2, s3, ell, mc, m) {
550
- return pmMarginBalance(pos, s2, s3, ell, mc) - pmMarginThresh(pos, s2, s3, m);
566
+ return pmMarginBalance(pos, s2, s3, ell, mc) - pmMarginThresh(pos, ell, s2, s3, m);
551
567
  }
552
568
  exports.pmExcessBalance = pmExcessBalance;
553
- // finds the liquidation price for prediction markets
554
- // using Newton's algorithm
555
- function pmFindLiquidationPrice(pos, s3, ell, mc, baseMarginRate, s2Start = 0.5) {
556
- const delta_s = 0.01;
557
- let s = 100;
558
- let s_new = s2Start;
559
- while (Math.abs(s_new - s) > 0.01) {
560
- s = s_new;
561
- const f = Math.pow(pmExcessBalance(pos, s, s3, ell, mc, baseMarginRate), 2);
562
- const ds = (Math.pow(pmExcessBalance(pos, s + delta_s, s3, ell, mc, baseMarginRate), 2) - f) / delta_s;
563
- s_new = s - f / ds;
564
- if (s_new < 1) {
565
- return 1;
566
- }
567
- if (s_new > 2) {
568
- return 2;
569
- }
569
+ /**
570
+ *
571
+ * @param pos Signed position size
572
+ * @param s3 Collateral to quote conversion at spot
573
+ * @param ell Locked-in value
574
+ * @param mc Margin collateral
575
+ * @param baseMarginRate Maintenance margin per contract (mu_m)
576
+ * @param sm Mark price at entry
577
+ * @returns {number} Liquidation price as a probability in the range [0, 1]
578
+ */
579
+ function pmFindLiquidationPrice(pos, s3, ell, mc, baseMarginRate) {
580
+ // liq <--> (A) c / |k| < R0 && (B) E < |k| * mu_m
581
+ // if not (A), return 0 (long) or 1 (short) [no liq]
582
+ // else, solve for pm:
583
+ // E = c - |k| max(0, s * (p0 - pm)) = |k| * mu_m
584
+ // if c/|k| < mu_m:
585
+ // any number would do --> return 1 (long) or 0 (short)
586
+ // else:
587
+ // pm = p0 - s * (c/|k| - mu_m)
588
+ const p0 = Math.abs(ell / pos) - 1;
589
+ const R0 = pos > 0 ? p0 : 1 - p0;
590
+ const excessPerCtrct = (mc * s3) / Math.abs(pos) - baseMarginRate; // c/|k| - mu_m, mu_m < CMINUS
591
+ if (mc * s3 > R0 * Math.abs(pos)) {
592
+ // c > |k| R(p0, s) --> no liquidation
593
+ return probToPrice(pos > 0 ? 0.0001 : 0.9999);
594
+ }
595
+ if (excessPerCtrct < 0) {
596
+ // already underwater
597
+ return probToPrice(pos > 0 ? 0.9999 : 0.0001);
570
598
  }
571
- return s;
599
+ return probToPrice(pos > 0 ? p0 - excessPerCtrct : p0 + excessPerCtrct);
572
600
  }
573
601
  exports.pmFindLiquidationPrice = pmFindLiquidationPrice;
574
602
  /**
@@ -613,19 +641,22 @@ function excessMargin(tradeAmt, currentCashCC, currentPos, currentLockedInQC, li
613
641
  * @returns deposit amount
614
642
  */
615
643
  function pmGetDepositAmtForLvgTrade(tradeAmt, targetLvg, price, S3, S2Mark) {
616
- const pnl = (tradeAmt * (S2Mark - price)) / S3;
617
- let p = S2Mark - 1;
618
- if (tradeAmt < 0) {
619
- p = 1 - p;
620
- }
621
- const b = (Math.abs(tradeAmt) * p) / S3 / targetLvg;
622
- const amt = -(pnl - b);
623
- // check:
624
- //bal = amt+pnl
625
- //pos_val = (np.abs(trade_amt) * p) / S3
626
- //lvg = pos_val/bal
627
- //assert(np.abs(lvg-targetLvg)<0.1)
628
- return amt;
644
+ const cmin = 0.05;
645
+ // refer to main contract function for this:
646
+ return getDepositAmountForPredMktLvgTrade(0, 0, 0, tradeAmt, targetLvg, price - 1, S3, S2Mark - 1, cmin);
647
+ // const pnl = (tradeAmt * (S2Mark - price)) / S3;
648
+ // let p = S2Mark - 1;
649
+ // if (tradeAmt < 0) {
650
+ // p = 1 - p;
651
+ // }
652
+ // const b = (Math.abs(tradeAmt) * p) / S3 / targetLvg;
653
+ // const amt = -(pnl - b);
654
+ // // check:
655
+ // //bal = amt+pnl
656
+ // //pos_val = (np.abs(trade_amt) * p) / S3
657
+ // //lvg = pos_val/bal
658
+ // //assert(np.abs(lvg-targetLvg)<0.1)
659
+ // return amt;
629
660
  }
630
661
  /**
631
662
  * Internal function to calculate cash over initial margin rate
@@ -645,16 +676,19 @@ function pmGetDepositAmtForLvgTrade(tradeAmt, targetLvg, price, S3, S2Mark) {
645
676
  * @returns excess cash
646
677
  */
647
678
  function pmExcessCashAtLvg(tradeAmt, lvg, walletBalCC, currentCashCC, currentPosition, currentLockedInValue, slippage, S2, Sm, S3) {
679
+ const cmin = 0.05;
680
+ const mu_m = 0.01;
681
+ const maxLvg = pmMaxLeverage(currentPosition + tradeAmt, Sm - 1, cmin);
682
+ lvg = lvg < maxLvg ? lvg : maxLvg;
648
683
  //determine deposit amount for given leverage
649
684
  const limitPrice = S2 * (1 + Math.sign(tradeAmt) * slippage);
650
685
  const depositFromWallet = pmGetDepositAmtForLvgTrade(tradeAmt, lvg, limitPrice, S3, Sm);
651
- const m0 = 0.18;
652
686
  //leverage fee
653
687
  let p0 = Sm - 1;
654
688
  if (tradeAmt < 0) {
655
689
  p0 = 2 - Sm; //=1-(Sm-1)
656
690
  }
657
- const feeCc = (Math.abs(tradeAmt) * pmExchangeFee(p0, m0, tradeAmt, 1 / lvg)) / S3;
691
+ const feeCc = (Math.abs(tradeAmt) * pmExchangeFee(p0, mu_m, tradeAmt, 1 / lvg)) / S3;
658
692
  //excess cash
659
693
  let exc = walletBalCC - depositFromWallet - feeCc;
660
694
  if (exc < 0) {
@@ -663,12 +697,13 @@ function pmExcessCashAtLvg(tradeAmt, lvg, walletBalCC, currentCashCC, currentPos
663
697
  // margin balance
664
698
  let pos = currentPosition + tradeAmt;
665
699
  let p = Sm - 1;
700
+ let entryP = limitPrice - 1;
666
701
  if (pos < 0) {
667
- p = 2 - Sm;
702
+ p = 1 - Sm;
703
+ entryP = 1 - entryP;
668
704
  }
669
- const h = entropy(p);
670
- const tau = m0 + (0.5 - m0) * h;
671
- const thresh = Math.abs(pos) * p * tau;
705
+ const mu0 = p / lvg + Math.max(0, entryP - p);
706
+ const thresh = Math.abs(pos) * mu0;
672
707
  const b0 = depositFromWallet +
673
708
  currentCashCC +
674
709
  Math.abs(currentPosition) * Sm -
@@ -781,13 +816,15 @@ exports.pmFindMaxPersonalTradeSizeAtLeverage = pmFindMaxPersonalTradeSizeAtLever
781
816
  * @param short Short open OI
782
817
  * @param sm Mark price (>1)
783
818
  * @param isBuy True if trade is long
784
- * @param mr Maintenance margin rate
819
+ * @param mr Margin threshold per contract for liquidation (mu_m)
785
820
  */
786
821
  function pmMaxSignedOpenTradeSize(long, short, sm, isBuy, mr, ammFundsQC) {
787
- if (sm < 1) {
822
+ if (sm <= 1 || sm >= 2) {
823
+ // closed
788
824
  return 0;
789
825
  }
790
- const m = pmMaintenanceMarginRate(isBuy ? 1 : -1, sm, mr);
826
+ const counterPos = isBuy ? -short : long;
827
+ const m = pmMaintenanceMarginRate(counterPos, counterPos * sm, sm, mr);
791
828
  let p = !isBuy ? sm - 1 : 2 - sm;
792
829
  p = p < 0.01 ? 0.01 : p > 0.99 ? 0.99 : p; // same cap as contract
793
830
  return isBuy ? (ammFundsQC + m * p * short) / p - long : -(ammFundsQC + m * p * long) / p + short;