@d8x/perpetuals-sdk 2.6.23 → 2.7.1
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.
- package/dist/cjs/config/defaultConfig.json +2 -2
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/d8XMath.d.ts +40 -29
- package/dist/cjs/d8XMath.js +244 -151
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/liquidatorTool.d.ts +1 -1
- package/dist/cjs/liquidatorTool.js +9 -9
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/main.d.ts +1 -0
- package/dist/cjs/main.js +15 -0
- package/dist/cjs/main.js.map +1 -0
- package/dist/cjs/marketData.d.ts +7 -11
- package/dist/cjs/marketData.js +31 -20
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +12 -12
- package/dist/cjs/perpetualDataHandler.js +13 -14
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/polyMktsPxFeed.js +2 -2
- package/dist/cjs/polyMktsPxFeed.js.map +1 -1
- package/dist/cjs/priceFeeds.d.ts +1 -0
- package/dist/cjs/priceFeeds.js +19 -3
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/config/defaultConfig.json +2 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +40 -29
- package/dist/esm/d8XMath.js +241 -150
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.d.ts +1 -1
- package/dist/esm/liquidatorTool.js +10 -10
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/main.d.ts +1 -0
- package/dist/esm/main.js +13 -0
- package/dist/esm/main.js.map +1 -0
- package/dist/esm/main2.d.ts +1 -0
- package/dist/esm/main2.js +18 -0
- package/dist/esm/main2.js.map +1 -0
- package/dist/esm/marketData.d.ts +7 -11
- package/dist/esm/marketData.js +32 -21
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +12 -12
- package/dist/esm/perpetualDataHandler.js +13 -14
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/polyMktsPxFeed.js +2 -2
- package/dist/esm/polyMktsPxFeed.js.map +1 -1
- package/dist/esm/priceFeeds.d.ts +1 -0
- package/dist/esm/priceFeeds.js +19 -3
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/doc/d8x-perpetuals-sdk.md +109 -81
- package/doc/marketData.md +2 -10
- package/package.json +5 -2
- package/src/config/defaultConfig.json +2 -2
- package/src/constants.ts +0 -1
- package/src/d8XMath.ts +268 -167
- package/src/liquidatorTool.ts +16 -10
- package/src/marketData.ts +62 -35
- package/src/perpetualDataHandler.ts +28 -34
- package/src/polyMktsPxFeed.ts +6 -7
- package/src/priceFeeds.ts +20 -4
- package/src/version.ts +1 -1
- package/dist/cjs/abi/AMMPerpLogic.json +0 -580
- package/dist/cjs/abi/BeaconProxy.json +0 -71
- package/dist/cjs/abi/IPerpetualManager copy.json +0 -5599
- package/dist/cjs/abi/IPerpetualMarginViewLogic.json +0 -286
- package/dist/cjs/abi/Maintainer.json +0 -774
- package/dist/cjs/abi/MockToken.json +0 -347
- package/dist/cjs/abi/MockUSD.json +0 -413
- package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
- package/dist/cjs/abi/WeETH.json +0 -310
- package/dist/cjs/abi-zkevm/IPerpetualManager.json +0 -5366
- package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/cjs/contracts/AMMPerpLogic.d.ts +0 -303
- package/dist/cjs/contracts/AMMPerpLogic.js +0 -3
- package/dist/cjs/contracts/AMMPerpLogic.js.map +0 -1
- package/dist/cjs/contracts/BeaconProxy.d.ts +0 -63
- package/dist/cjs/contracts/BeaconProxy.js +0 -3
- package/dist/cjs/contracts/BeaconProxy.js.map +0 -1
- package/dist/cjs/contracts/IPerpetualManagerCopy.d.ts +0 -3223
- package/dist/cjs/contracts/IPerpetualManagerCopy.js +0 -3
- package/dist/cjs/contracts/IPerpetualManagerCopy.js.map +0 -1
- package/dist/cjs/contracts/IPerpetualMarginViewLogic.d.ts +0 -183
- package/dist/cjs/contracts/IPerpetualMarginViewLogic.js +0 -3
- package/dist/cjs/contracts/IPerpetualMarginViewLogic.js.map +0 -1
- package/dist/cjs/contracts/Maintainer.d.ts +0 -799
- package/dist/cjs/contracts/Maintainer.js +0 -3
- package/dist/cjs/contracts/Maintainer.js.map +0 -1
- package/dist/cjs/contracts/MockToken.d.ts +0 -263
- package/dist/cjs/contracts/MockToken.js +0 -3
- package/dist/cjs/contracts/MockToken.js.map +0 -1
- package/dist/cjs/contracts/MockUSD.d.ts +0 -186
- package/dist/cjs/contracts/MockUSD.js +0 -3
- package/dist/cjs/contracts/MockUSD.js.map +0 -1
- package/dist/cjs/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/cjs/contracts/UUPSUpgradeable.js +0 -3
- package/dist/cjs/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/cjs/contracts/WeETH.d.ts +0 -503
- package/dist/cjs/contracts/WeETH.js +0 -3
- package/dist/cjs/contracts/WeETH.js.map +0 -1
- package/dist/cjs/contracts/factories/AMMPerpLogic__factory.d.ts +0 -452
- package/dist/cjs/contracts/factories/AMMPerpLogic__factory.js +0 -598
- package/dist/cjs/contracts/factories/AMMPerpLogic__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js +0 -89
- package/dist/cjs/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.d.ts +0 -4358
- package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.js +0 -5617
- package/dist/cjs/contracts/factories/IPerpetualManagerCopy__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.d.ts +0 -221
- package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.js +0 -304
- package/dist/cjs/contracts/factories/IPerpetualMarginViewLogic__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/cjs/contracts/factories/Maintainer__factory.js +0 -792
- package/dist/cjs/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/MockToken__factory.d.ts +0 -273
- package/dist/cjs/contracts/factories/MockToken__factory.js +0 -365
- package/dist/cjs/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/MockUSD__factory.d.ts +0 -320
- package/dist/cjs/contracts/factories/MockUSD__factory.js +0 -431
- package/dist/cjs/contracts/factories/MockUSD__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js +0 -122
- package/dist/cjs/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/cjs/contracts/factories/WeETH__factory.js +0 -721
- package/dist/cjs/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5324
- package/dist/cjs/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -254
- package/dist/cjs/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js +0 -928
- package/dist/cjs/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js +0 -456
- package/dist/cjs/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/cjs/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/factories/lean0/index.js +0 -15
- package/dist/cjs/contracts/factories/lean0/index.js.map +0 -1
- package/dist/cjs/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/cjs/contracts/lean0/IPerpetualManager.js +0 -3
- package/dist/cjs/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/cjs/contracts/lean0/LimitOrderBook.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js +0 -3
- package/dist/cjs/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/cjs/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/cjs/contracts/lean0/ShareToken.js +0 -3
- package/dist/cjs/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/cjs/contracts/lean0/index.d.ts +0 -4
- package/dist/cjs/contracts/lean0/index.js +0 -3
- package/dist/cjs/contracts/lean0/index.js.map +0 -1
- package/dist/esm/abi/AMMPerpLogic.json +0 -580
- package/dist/esm/abi/BeaconProxy.json +0 -71
- package/dist/esm/abi/IPerpetualManager copy.json +0 -5599
- package/dist/esm/abi/IPerpetualMarginViewLogic.json +0 -286
- package/dist/esm/abi/Maintainer.json +0 -774
- package/dist/esm/abi/MockToken.json +0 -347
- package/dist/esm/abi/MockUSD.json +0 -413
- package/dist/esm/abi/UUPSUpgradeable.json +0 -104
- package/dist/esm/abi/WeETH.json +0 -310
- package/dist/esm/abi/lean0/IPerpetualManager.json +0 -5306
- package/dist/esm/abi/lean0/LimitOrderBook.json +0 -910
- package/dist/esm/abi/lean0/LimitOrderBookFactory.json +0 -236
- package/dist/esm/abi/lean0/ShareToken.json +0 -438
- package/dist/esm/abi-zkevm/IPerpetualManager.json +0 -5366
- package/dist/esm/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
- package/dist/esm/contracts/AMMPerpLogic.d.ts +0 -303
- package/dist/esm/contracts/AMMPerpLogic.js +0 -2
- package/dist/esm/contracts/AMMPerpLogic.js.map +0 -1
- package/dist/esm/contracts/BeaconProxy.d.ts +0 -63
- package/dist/esm/contracts/BeaconProxy.js +0 -2
- package/dist/esm/contracts/BeaconProxy.js.map +0 -1
- package/dist/esm/contracts/IPerpetualManagerCopy.d.ts +0 -3223
- package/dist/esm/contracts/IPerpetualManagerCopy.js +0 -2
- package/dist/esm/contracts/IPerpetualManagerCopy.js.map +0 -1
- package/dist/esm/contracts/IPerpetualMarginViewLogic.d.ts +0 -183
- package/dist/esm/contracts/IPerpetualMarginViewLogic.js +0 -2
- package/dist/esm/contracts/IPerpetualMarginViewLogic.js.map +0 -1
- package/dist/esm/contracts/Maintainer.d.ts +0 -799
- package/dist/esm/contracts/Maintainer.js +0 -2
- package/dist/esm/contracts/Maintainer.js.map +0 -1
- package/dist/esm/contracts/MockToken.d.ts +0 -263
- package/dist/esm/contracts/MockToken.js +0 -2
- package/dist/esm/contracts/MockToken.js.map +0 -1
- package/dist/esm/contracts/MockUSD.d.ts +0 -186
- package/dist/esm/contracts/MockUSD.js +0 -2
- package/dist/esm/contracts/MockUSD.js.map +0 -1
- package/dist/esm/contracts/UUPSUpgradeable.d.ts +0 -118
- package/dist/esm/contracts/UUPSUpgradeable.js +0 -2
- package/dist/esm/contracts/UUPSUpgradeable.js.map +0 -1
- package/dist/esm/contracts/WeETH.d.ts +0 -503
- package/dist/esm/contracts/WeETH.js +0 -2
- package/dist/esm/contracts/WeETH.js.map +0 -1
- package/dist/esm/contracts/factories/AMMPerpLogic__factory.d.ts +0 -452
- package/dist/esm/contracts/factories/AMMPerpLogic__factory.js +0 -594
- package/dist/esm/contracts/factories/AMMPerpLogic__factory.js.map +0 -1
- package/dist/esm/contracts/factories/BeaconProxy__factory.d.ts +0 -61
- package/dist/esm/contracts/factories/BeaconProxy__factory.js +0 -85
- package/dist/esm/contracts/factories/BeaconProxy__factory.js.map +0 -1
- package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.d.ts +0 -4358
- package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.js +0 -5613
- package/dist/esm/contracts/factories/IPerpetualManagerCopy__factory.js.map +0 -1
- package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.d.ts +0 -221
- package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.js +0 -300
- package/dist/esm/contracts/factories/IPerpetualMarginViewLogic__factory.js.map +0 -1
- package/dist/esm/contracts/factories/Maintainer__factory.d.ts +0 -609
- package/dist/esm/contracts/factories/Maintainer__factory.js +0 -788
- package/dist/esm/contracts/factories/Maintainer__factory.js.map +0 -1
- package/dist/esm/contracts/factories/MockToken__factory.d.ts +0 -273
- package/dist/esm/contracts/factories/MockToken__factory.js +0 -361
- package/dist/esm/contracts/factories/MockToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/MockUSD__factory.d.ts +0 -320
- package/dist/esm/contracts/factories/MockUSD__factory.js +0 -427
- package/dist/esm/contracts/factories/MockUSD__factory.js.map +0 -1
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.d.ts +0 -87
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js +0 -118
- package/dist/esm/contracts/factories/UUPSUpgradeable__factory.js.map +0 -1
- package/dist/esm/contracts/factories/WeETH__factory.d.ts +0 -545
- package/dist/esm/contracts/factories/WeETH__factory.js +0 -717
- package/dist/esm/contracts/factories/WeETH__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.d.ts +0 -4136
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js +0 -5320
- package/dist/esm/contracts/factories/lean0/IPerpetualManager__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.d.ts +0 -189
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js +0 -250
- package/dist/esm/contracts/factories/lean0/LimitOrderBookFactory__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.d.ts +0 -715
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js +0 -924
- package/dist/esm/contracts/factories/lean0/LimitOrderBook__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.d.ts +0 -344
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js +0 -452
- package/dist/esm/contracts/factories/lean0/ShareToken__factory.js.map +0 -1
- package/dist/esm/contracts/factories/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/factories/lean0/index.js +0 -8
- package/dist/esm/contracts/factories/lean0/index.js.map +0 -1
- package/dist/esm/contracts/lean0/IPerpetualManager.d.ts +0 -2821
- package/dist/esm/contracts/lean0/IPerpetualManager.js +0 -2
- package/dist/esm/contracts/lean0/IPerpetualManager.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBook.d.ts +0 -533
- package/dist/esm/contracts/lean0/LimitOrderBook.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBook.js.map +0 -1
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.d.ts +0 -210
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js +0 -2
- package/dist/esm/contracts/lean0/LimitOrderBookFactory.js.map +0 -1
- package/dist/esm/contracts/lean0/ShareToken.d.ts +0 -320
- package/dist/esm/contracts/lean0/ShareToken.js +0 -2
- package/dist/esm/contracts/lean0/ShareToken.js.map +0 -1
- package/dist/esm/contracts/lean0/index.d.ts +0 -4
- package/dist/esm/contracts/lean0/index.js +0 -2
- package/dist/esm/contracts/lean0/index.js.map +0 -1
- package/src/contracts/IPerpetualMarginViewLogic.ts +0 -347
- package/src/contracts/MockUSD.ts +0 -378
- package/src/contracts/factories/IPerpetualMarginViewLogic__factory.ts +0 -313
- package/src/contracts/factories/MockUSD__factory.ts +0 -430
package/dist/esm/d8XMath.d.ts
CHANGED
|
@@ -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 {
|
|
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,
|
|
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
|
|
@@ -177,34 +194,16 @@ export declare function priceToProb(px: number): number;
|
|
|
177
194
|
*/
|
|
178
195
|
export declare function probToPrice(prob: number): number;
|
|
179
196
|
export declare function entropy(prob: number): number;
|
|
197
|
+
export declare function pmMaintenanceMarginRate(position: number, lockedInQC: number, sm: number, m: number): number;
|
|
180
198
|
/**
|
|
181
|
-
*
|
|
199
|
+
* Initial margin rate for prediction markets.
|
|
182
200
|
* @param posSign sign of position in base currency (can be signed position or -1, 1)
|
|
201
|
+
* @param s0 trade price
|
|
183
202
|
* @param sm mark-price (=1+p)
|
|
184
|
-
* @param
|
|
185
|
-
* @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3
|
|
203
|
+
* @param cmin Absolute min margin saved as `fInitialMarginRate`
|
|
204
|
+
* @returns {number} The margin rate to be applied: `(Math.abs(pos) * p * tau) / s3`
|
|
186
205
|
*/
|
|
187
|
-
export declare function
|
|
188
|
-
/**
|
|
189
|
-
* Maintenance margin rate for prediction markets.
|
|
190
|
-
* @param posSign sign of position in base currency (can be signed position or -1, 1)
|
|
191
|
-
* @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
|
|
206
|
-
*/
|
|
207
|
-
export declare function expectedLoss(p: number, m: number, totLong: number, totShort: number, tradeAmt: number, tradeMgnRate: number): number;
|
|
206
|
+
export declare function pmInitialMarginRate(posSign: number, s0: number, sm: number, cmin: number): number;
|
|
208
207
|
/**
|
|
209
208
|
* Exchange fee as a rate for prediction markets
|
|
210
209
|
* For opening trades only
|
|
@@ -215,6 +214,8 @@ export declare function expectedLoss(p: number, m: number, totLong: number, totS
|
|
|
215
214
|
* @returns dollar fee relative to tradeAmt
|
|
216
215
|
*/
|
|
217
216
|
export declare function pmExchangeFee(prob: number, m: number, tradeAmt: number, tradeMgnRate: number): number;
|
|
217
|
+
export declare function pmExitFee(varphi: number, varphiBar: number, mu_m: number, m_0: number, sigt: number, jump: number): number;
|
|
218
|
+
export declare function pmOpenFee(varphi: number, varphiBar: number, mu_m: number, m_0: number, sigt: number, jump: number): number;
|
|
218
219
|
/**
|
|
219
220
|
* Margin balance for prediction markets
|
|
220
221
|
* @param pos signed position
|
|
@@ -225,8 +226,18 @@ export declare function pmExchangeFee(prob: number, m: number, tradeAmt: number,
|
|
|
225
226
|
* @returns current margin balance
|
|
226
227
|
*/
|
|
227
228
|
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
|
|
229
|
-
|
|
229
|
+
export declare function pmExcessBalance(pos: number, s2: number, s3: number, ell: number, mc: number, m: number): number;
|
|
230
|
+
/**
|
|
231
|
+
*
|
|
232
|
+
* @param pos Signed position size
|
|
233
|
+
* @param s3 Collateral to quote conversion at spot
|
|
234
|
+
* @param ell Locked-in value
|
|
235
|
+
* @param mc Margin collateral
|
|
236
|
+
* @param baseMarginRate Maintenance margin per contract (mu_m)
|
|
237
|
+
* @param sm Mark price at entry
|
|
238
|
+
* @returns {number} Liquidation price as a probability in the range [0, 1]
|
|
239
|
+
*/
|
|
240
|
+
export declare function pmFindLiquidationPrice(pos: number, s3: number, ell: number, mc: number, baseMarginRate: number): number;
|
|
230
241
|
/**
|
|
231
242
|
* Find maximal *affordable* trade size (short dir=-1 or long dir=1) for prediction
|
|
232
243
|
* markets at provided leverage and incorporating the current position
|
|
@@ -254,6 +265,6 @@ export declare function pmFindMaxPersonalTradeSizeAtLeverage(dir: number, lvg: n
|
|
|
254
265
|
* @param short Short open OI
|
|
255
266
|
* @param sm Mark price (>1)
|
|
256
267
|
* @param isBuy True if trade is long
|
|
257
|
-
* @param mr
|
|
268
|
+
* @param mr Margin threshold per contract for liquidation (mu_m)
|
|
258
269
|
*/
|
|
259
270
|
export declare function pmMaxSignedOpenTradeSize(long: number, short: number, sm: number, isBuy: boolean, mr: number, ammFundsQC: number): number;
|
package/dist/esm/d8XMath.js
CHANGED
|
@@ -331,30 +331,100 @@ export function getNewPositionLeverage(tradeAmount, marginCollateral, currentPos
|
|
|
331
331
|
* @param {number} price - price to trade amount 'tradeAmnt'
|
|
332
332
|
* @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
|
|
333
333
|
* @param {number} S2Mark - mark price
|
|
334
|
-
* @param {
|
|
334
|
+
* @param {number} cmin - Absolute minimum margin per contract, only for pred markets
|
|
335
335
|
* @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
|
|
336
336
|
*/
|
|
337
|
-
export function getDepositAmountForLvgTrade(pos0, b0, tradeAmnt, targetLvg, price, S3, S2Mark,
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
S2Mark = S2Mark - 1;
|
|
343
|
-
S2MarkBefore = S2Mark;
|
|
344
|
-
if (pos0 < 0) {
|
|
345
|
-
S2MarkBefore = 1 - S2Mark;
|
|
346
|
-
}
|
|
347
|
-
if (pos0 + tradeAmnt < 0) {
|
|
348
|
-
S2Mark = 1 - S2Mark;
|
|
337
|
+
export function getDepositAmountForLvgTrade(pos0, b0, tradeAmnt, targetLvg, price, S3, S2Mark, cmin) {
|
|
338
|
+
if (cmin && cmin > 0) {
|
|
339
|
+
// TODO: c0?
|
|
340
|
+
if (b0 != 0) {
|
|
341
|
+
console.log("b0 != 0");
|
|
349
342
|
}
|
|
343
|
+
return getDepositAmountForPredMktLvgTrade(pos0, b0, 0, tradeAmnt, targetLvg, price - 1, S3, S2Mark - 1, cmin);
|
|
350
344
|
}
|
|
345
|
+
let pnl = (tradeAmnt * (S2Mark - price)) / S3;
|
|
351
346
|
if (targetLvg == 0) {
|
|
352
347
|
// use current leverage
|
|
353
|
-
targetLvg = (Math.abs(pos0) *
|
|
348
|
+
targetLvg = (Math.abs(pos0) * S2Mark) / S3 / b0;
|
|
354
349
|
}
|
|
355
350
|
let b = (Math.abs(pos0 + tradeAmnt) * S2Mark) / S3 / targetLvg;
|
|
356
351
|
return -(b0 + pnl - b);
|
|
357
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* Determine amount to be deposited into margin account so that the given leverage
|
|
355
|
+
* is obtained when opening a prediction market position
|
|
356
|
+
* Does NOT include fees, but accounts for a possible non-zero current position
|
|
357
|
+
* Smart contract equivalent: getDepositAmountForPredMktLvgPosition
|
|
358
|
+
* @param {number} pos0 - current position
|
|
359
|
+
* @param {number} b0 - current balance
|
|
360
|
+
* @param {number} c0 - current available cash
|
|
361
|
+
* @param {number} tradeAmnt - amount to trade
|
|
362
|
+
* @param {number} targetLvg - target leverage
|
|
363
|
+
* @param {number} prob - prob to trade amount 'tradeAmnt'
|
|
364
|
+
* @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto)
|
|
365
|
+
* @param {number} markProb - mark prob
|
|
366
|
+
* @param {number} imr - minimum absolute margin per contract (fInitialMarginRate)
|
|
367
|
+
* @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees
|
|
368
|
+
*/
|
|
369
|
+
export function getDepositAmountForPredMktLvgTrade(pos0, b0, c0, tradeAmnt, targetLvg, prob, S3, markProb, imr) {
|
|
370
|
+
/**
|
|
371
|
+
* Smart contract implementation:
|
|
372
|
+
// find smallest x such that:
|
|
373
|
+
// bal * s3 >= pos value / lvg
|
|
374
|
+
// where:
|
|
375
|
+
// pos value / lvg = |pos| * R(pm, sign(pos)) * margin rate
|
|
376
|
+
// pos = pos0 + k
|
|
377
|
+
// cash = cash0 + x
|
|
378
|
+
// ell = ell0 + px * k
|
|
379
|
+
// bal * s3 = cash * s3 + pos * sm - ell
|
|
380
|
+
// = bal0 * s3 + x * s3 + k * (sm - px)
|
|
381
|
+
|
|
382
|
+
// subject to:
|
|
383
|
+
// x >= 0
|
|
384
|
+
// cash * s3 >= |pos| * min(cmin, prob(sign(pos)))
|
|
385
|
+
// k * (sm - px) <= 0 a.s.
|
|
386
|
+
// (positive pnl does not contribute, i.e. ignore px better than mark)
|
|
387
|
+
|
|
388
|
+
// solution:
|
|
389
|
+
// bal0 * s3 + x * s3 >= pos value / lvg + (k * (px - sm))_+ = v * s3
|
|
390
|
+
// -->
|
|
391
|
+
// x >= v + (cash0 - bal0)_+ - cash0 = v - min(bal0, cash0)
|
|
392
|
+
// = pos value / lvg/ s3 + (k * (px - sm))_+ / s3 - min (bal0, cash0)
|
|
393
|
+
// = A + B - C
|
|
394
|
+
// x >= |pos| * min(cmin, prob(sign(pos))) / s3 - cash0
|
|
395
|
+
// x >= 0
|
|
396
|
+
|
|
397
|
+
// init x = A = pos value / lvg / s3
|
|
398
|
+
int128 fNewPos = _fPosition0.add(_fTradeAmount);
|
|
399
|
+
int128 v = (
|
|
400
|
+
fNewPos > 0 ? fNewPos.mul(_fMarkProb) : fNewPos.neg().mul(ONE_64x64.sub(_fMarkProb))
|
|
401
|
+
).mul(_fMarginRate).div(_fS3);
|
|
402
|
+
// + B = max(0,k * (px - sm)) / s3
|
|
403
|
+
{
|
|
404
|
+
int128 fPnL = _fTradeAmount.mul(_fMarkProb.sub(_fTradeProb));
|
|
405
|
+
if (fPnL < 0) {
|
|
406
|
+
v = v.sub(fPnL.div(_fS3)); // pnl < 0 -> increase v
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// - C = - min(bal0, cash0) = - Equity
|
|
410
|
+
{
|
|
411
|
+
int128 equity = _fCash0CC < _fBalance0 ? _fCash0CC : _fBalance0;
|
|
412
|
+
v = v.sub(equity); // equity can be used / must be covered if negative
|
|
413
|
+
}
|
|
414
|
+
return v > 0 ? v : int128(0);
|
|
415
|
+
*/
|
|
416
|
+
const newPos = pos0 + tradeAmnt;
|
|
417
|
+
const posProb = newPos > 0 ? markProb : 1 - markProb; // R(pm, sign(new pos))
|
|
418
|
+
const maxLvg = pmMaxLeverage(newPos, markProb, imr);
|
|
419
|
+
targetLvg = targetLvg > maxLvg ? maxLvg : targetLvg;
|
|
420
|
+
const posValue = (Math.abs(newPos) * posProb) / S3;
|
|
421
|
+
const tradeLoss = Math.max(0, tradeAmnt * (prob - markProb)) / S3;
|
|
422
|
+
const curEquity = Math.min(c0, b0);
|
|
423
|
+
return Math.max(posValue / targetLvg + tradeLoss - curEquity, 0);
|
|
424
|
+
}
|
|
425
|
+
function pmMaxLeverage(posSign, markProb, minMarginPerCtrct) {
|
|
426
|
+
return Math.round(100 * (posSign > 0 ? markProb / minMarginPerCtrct : (1 - markProb) / minMarginPerCtrct)) / 100;
|
|
427
|
+
}
|
|
358
428
|
/**
|
|
359
429
|
* Convert a perpetual price to probability (predtictive markets)
|
|
360
430
|
* @param px Perpetual price
|
|
@@ -369,7 +439,7 @@ export function priceToProb(px) {
|
|
|
369
439
|
* @returns Perpetual price
|
|
370
440
|
*/
|
|
371
441
|
export function probToPrice(prob) {
|
|
372
|
-
return 1 + prob;
|
|
442
|
+
return Math.max(1, Math.min(2, 1 + prob));
|
|
373
443
|
}
|
|
374
444
|
// shannon entropy
|
|
375
445
|
export function entropy(prob) {
|
|
@@ -381,109 +451,61 @@ export function entropy(prob) {
|
|
|
381
451
|
/**
|
|
382
452
|
* Maintenance margin requirement for prediction markets
|
|
383
453
|
* @param pos signed position
|
|
454
|
+
* @param lockedInQC locked in value
|
|
384
455
|
* @param s2 mark price
|
|
385
456
|
* @param s3 collateral to quote conversion
|
|
386
457
|
* @param m base margin rate
|
|
387
458
|
* @returns required margin balance
|
|
388
459
|
*/
|
|
389
|
-
function pmMarginThresh(pos, s2, s3, m
|
|
390
|
-
|
|
391
|
-
if (pos < 0) {
|
|
392
|
-
p = 1 - p;
|
|
393
|
-
}
|
|
394
|
-
const h = entropy(p);
|
|
395
|
-
const tau = m + (0.4 - m) * h;
|
|
396
|
-
return (Math.abs(pos) * p * tau) / s3;
|
|
460
|
+
function pmMarginThresh(pos, lockedInQC, s2, s3, m) {
|
|
461
|
+
return (pmMaintenanceMarginRate(pos, lockedInQC, s2, m) * Math.abs(pos)) / s3;
|
|
397
462
|
}
|
|
398
463
|
/**
|
|
399
464
|
* Maintenance margin rate for prediction markets.
|
|
400
|
-
* @param
|
|
465
|
+
* @param position signed position in base currency
|
|
466
|
+
* @param lockedInQC locked in value, p or 1-p times number of contracts
|
|
401
467
|
* @param sm mark-price (=1+p)
|
|
402
|
-
* @param m
|
|
403
|
-
* @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3
|
|
404
|
-
*/
|
|
405
|
-
export function pmMaintenanceMarginRate(
|
|
406
|
-
let
|
|
407
|
-
|
|
408
|
-
|
|
468
|
+
* @param m absolute maintenance buffer per contract (mu_m, fMaintenanceMarginRate)
|
|
469
|
+
* @returns {number} The margin rate to be applied: (Math.abs(pos) * p * tau) / s3
|
|
470
|
+
*/ pmExchangeFee;
|
|
471
|
+
export function pmMaintenanceMarginRate(position, lockedInQC, sm, m) {
|
|
472
|
+
let pm = sm - 1;
|
|
473
|
+
let entryP = position == 0 ? pm : Math.abs(lockedInQC / position) - 1;
|
|
474
|
+
if (position < 0) {
|
|
475
|
+
pm = 1 - pm;
|
|
476
|
+
entryP = 1 - entryP;
|
|
477
|
+
}
|
|
478
|
+
const L = Math.max(entryP - pm, 0);
|
|
479
|
+
if (position == 0) {
|
|
480
|
+
return Math.min(m + L, entryP) / pm;
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
const balAtLiq = Math.min(m + L, entryP) * Math.abs(position) + (position * sm - lockedInQC);
|
|
484
|
+
return balAtLiq / pm / Math.abs(position);
|
|
409
485
|
}
|
|
410
|
-
const h = entropy(p);
|
|
411
|
-
return m + (0.4 - m) * h;
|
|
412
486
|
}
|
|
413
487
|
/**
|
|
414
|
-
*
|
|
488
|
+
* Initial margin rate for prediction markets.
|
|
415
489
|
* @param posSign sign of position in base currency (can be signed position or -1, 1)
|
|
490
|
+
* @param s0 trade price
|
|
416
491
|
* @param sm mark-price (=1+p)
|
|
417
|
-
* @param
|
|
418
|
-
* @returns margin rate to be applied (Math.abs(pos) * p * tau) / s3
|
|
492
|
+
* @param cmin Absolute min margin saved as `fInitialMarginRate`
|
|
493
|
+
* @returns {number} The margin rate to be applied: `(Math.abs(pos) * p * tau) / s3`
|
|
419
494
|
*/
|
|
420
|
-
export function pmInitialMarginRate(posSign, sm,
|
|
421
|
-
let
|
|
495
|
+
export function pmInitialMarginRate(posSign, s0, sm, cmin) {
|
|
496
|
+
let pm = sm - 1;
|
|
497
|
+
let p0 = s0 - 1;
|
|
422
498
|
if (posSign < 0) {
|
|
423
|
-
|
|
499
|
+
pm = 1 - pm; // R(p_mark, sign(pos))
|
|
500
|
+
p0 = 1 - p0; // R(p_entry, sign(pos))
|
|
424
501
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
* @param m maximal maintenance rate from which we defer the actual maintenance margin rate
|
|
433
|
-
* @param totLong total long in base currency
|
|
434
|
-
* @param totShort total short
|
|
435
|
-
* @param tradeAmt signed trade amount, can be zero
|
|
436
|
-
* @param tradeMgnRate margin rate of the trader
|
|
437
|
-
* @returns expected loss in dollars
|
|
438
|
-
*/
|
|
439
|
-
export function expectedLoss(p, m, totLong, totShort, tradeAmt, tradeMgnRate) {
|
|
440
|
-
// maintenance margin rate
|
|
441
|
-
m = (0.4 - m) * entropy(p) + m;
|
|
442
|
-
let dlm = 0;
|
|
443
|
-
let dl = 0;
|
|
444
|
-
let dsm = 0;
|
|
445
|
-
let ds = 0;
|
|
446
|
-
if (tradeAmt > 0) {
|
|
447
|
-
dlm = p * tradeAmt * tradeMgnRate;
|
|
448
|
-
dl = tradeAmt;
|
|
449
|
-
}
|
|
450
|
-
else if (tradeAmt < 0) {
|
|
451
|
-
dsm = (1 - p) * Math.abs(tradeAmt) * tradeMgnRate;
|
|
452
|
-
ds = Math.abs(tradeAmt);
|
|
453
|
-
}
|
|
454
|
-
const a = dl + totLong - m * totShort - dsm;
|
|
455
|
-
const b = ds + totShort - m * totLong - dlm;
|
|
456
|
-
return p * (1 - p) * Math.max(0, a + b);
|
|
457
|
-
}
|
|
458
|
-
/**
|
|
459
|
-
* Equivalent to
|
|
460
|
-
* const el0 = expectedLoss(prob, m, totLong, totShort, 0, 0);
|
|
461
|
-
* const el1 = expectedLoss(prob, m, totLong, totShort, tradeAmt, tradeMgnRate)
|
|
462
|
-
* const fee = (el1 - el0) / Math.abs(tradeAmt);
|
|
463
|
-
* @param p prob long probability
|
|
464
|
-
* @param m max maintenance margin rate (0.18)
|
|
465
|
-
* @param tradeAmt trade amount in base currency
|
|
466
|
-
* @param tradeMgnRate margin rate for this trade
|
|
467
|
-
* @returns dollar fee
|
|
468
|
-
*/
|
|
469
|
-
function expectedLossImpact(p, m, tradeAmt, tradeMgnRate) {
|
|
470
|
-
m = (0.4 - m) * entropy(p) + m;
|
|
471
|
-
let dlm = 0;
|
|
472
|
-
let dl = 0;
|
|
473
|
-
let dsm = 0;
|
|
474
|
-
let ds = 0;
|
|
475
|
-
if (tradeAmt > 0) {
|
|
476
|
-
dlm = p * tradeAmt * tradeMgnRate;
|
|
477
|
-
dl = tradeAmt;
|
|
478
|
-
}
|
|
479
|
-
else if (tradeAmt < 0) {
|
|
480
|
-
dsm = (1 - p) * Math.abs(tradeAmt) * tradeMgnRate;
|
|
481
|
-
ds = Math.abs(tradeAmt);
|
|
482
|
-
}
|
|
483
|
-
//long: p * (1 - p) max(0, dl-dlm) = p * (1 - p) max(0, tradeAmt - p * tradeAmt * tradeMgnRate)
|
|
484
|
-
const a = dl - dsm;
|
|
485
|
-
const b = ds - dlm;
|
|
486
|
-
return p * (1 - p) * Math.max(0, a + b);
|
|
502
|
+
// mu0 = max(Rm/lvg, min(Rm, cmin))
|
|
503
|
+
// balance = (mu0 * |k| + k *(sm - s0)) / s3
|
|
504
|
+
// pos value = |k| * Rm / s3
|
|
505
|
+
// at max init lvg: Rm/lvg = min(cmin, Rm)
|
|
506
|
+
// --> margin rate = (mu0 + Rm - R0) / Rm
|
|
507
|
+
const mu0 = Math.min(pm, cmin) + Math.max(0, p0 - pm);
|
|
508
|
+
return (mu0 + pm - p0) / pm;
|
|
487
509
|
}
|
|
488
510
|
/**
|
|
489
511
|
* Exchange fee as a rate for prediction markets
|
|
@@ -495,15 +517,63 @@ function expectedLossImpact(p, m, tradeAmt, tradeMgnRate) {
|
|
|
495
517
|
* @returns dollar fee relative to tradeAmt
|
|
496
518
|
*/
|
|
497
519
|
export function pmExchangeFee(prob, m, tradeAmt, tradeMgnRate) {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
let fee = expectedLossImpact(prob, m, tradeAmt, tradeMgnRate) / Math.abs(tradeAmt);
|
|
520
|
+
// TODO: port contract logic here
|
|
521
|
+
const [kappa, es] = [0, 0];
|
|
522
|
+
prob = tradeAmt > 0 ? prob : 1 - prob;
|
|
523
|
+
let fee = prob * (1 - kappa);
|
|
524
|
+
const scaledLvg = prob * tradeMgnRate * (1 - fee);
|
|
525
|
+
fee = fee * (1 - prob) - scaledLvg + es;
|
|
505
526
|
return Math.max(fee, 0.001);
|
|
506
527
|
}
|
|
528
|
+
export function pmExitFee(varphi, varphiBar, mu_m, m_0, sigt, jump) {
|
|
529
|
+
const pLiq = varphi + mu_m - m_0;
|
|
530
|
+
const kappa = calcKappa(varphiBar, pLiq, sigt);
|
|
531
|
+
let fee = prdMktLvgFee(kappa, varphi, m_0);
|
|
532
|
+
return fee;
|
|
533
|
+
}
|
|
534
|
+
export function pmOpenFee(varphi, varphiBar, mu_m, m_0, sigt, jump) {
|
|
535
|
+
const pLiq = varphi + mu_m - m_0;
|
|
536
|
+
const kappa = calcKappa(varphiBar, pLiq, sigt);
|
|
537
|
+
const es = calcJumpRisk(kappa, varphiBar, jump);
|
|
538
|
+
const feecap = (1 - varphiBar) * varphiBar - (1 - varphiBar) * m_0;
|
|
539
|
+
let fee = prdMktLvgFee(kappa, varphi, m_0);
|
|
540
|
+
fee = fee + es;
|
|
541
|
+
if (fee > feecap) {
|
|
542
|
+
fee = feecap;
|
|
543
|
+
}
|
|
544
|
+
if (fee < 0.001) {
|
|
545
|
+
fee = 0.001;
|
|
546
|
+
}
|
|
547
|
+
return fee;
|
|
548
|
+
}
|
|
549
|
+
//sigt = sigma*sqrt(t)
|
|
550
|
+
function calcKappa(varphi, varphiLiq, sigt) {
|
|
551
|
+
const p = 1 - varphi;
|
|
552
|
+
const pStar = 1 - varphiLiq;
|
|
553
|
+
const x0 = Math.log(p / (1 - p));
|
|
554
|
+
const a = Math.log(pStar / (1 - pStar));
|
|
555
|
+
const kappa = 2 * (1 - cdfNormalStd((a - x0) / sigt));
|
|
556
|
+
return kappa;
|
|
557
|
+
}
|
|
558
|
+
function calcJumpRisk(kappa, varphi, jump) {
|
|
559
|
+
jump = Math.floor(jump / 0.05) * 0.05;
|
|
560
|
+
const jr = jump * (1 - varphi * (1 - kappa));
|
|
561
|
+
return jr;
|
|
562
|
+
}
|
|
563
|
+
//opening leverage fee with cash per contract of m0, without jump risk
|
|
564
|
+
function prdMktLvgFee(kappa, varphi, m0) {
|
|
565
|
+
const f = (1 - kappa) * varphi * (1 - varphi) - (1 - varphi * (1 - kappa)) * m0;
|
|
566
|
+
return f;
|
|
567
|
+
}
|
|
568
|
+
function cdfNormalStd(x) {
|
|
569
|
+
const t = 1 / (1 + 0.2315419 * Math.abs(x));
|
|
570
|
+
const d = 0.3989423 * Math.exp((-x * x) / 2);
|
|
571
|
+
let prob = d * t * (0.3193815 + t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));
|
|
572
|
+
if (x > 0) {
|
|
573
|
+
prob = 1 - prob;
|
|
574
|
+
}
|
|
575
|
+
return prob;
|
|
576
|
+
}
|
|
507
577
|
/**
|
|
508
578
|
* Margin balance for prediction markets
|
|
509
579
|
* @param pos signed position
|
|
@@ -517,27 +587,39 @@ export function pmMarginBalance(pos, s2, s3, ell, mc) {
|
|
|
517
587
|
return (pos * s2) / s3 - ell / s3 + mc;
|
|
518
588
|
}
|
|
519
589
|
export function pmExcessBalance(pos, s2, s3, ell, mc, m) {
|
|
520
|
-
return pmMarginBalance(pos, s2, s3, ell, mc) - pmMarginThresh(pos, s2, s3, m);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
590
|
+
return pmMarginBalance(pos, s2, s3, ell, mc) - pmMarginThresh(pos, ell, s2, s3, m);
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
*
|
|
594
|
+
* @param pos Signed position size
|
|
595
|
+
* @param s3 Collateral to quote conversion at spot
|
|
596
|
+
* @param ell Locked-in value
|
|
597
|
+
* @param mc Margin collateral
|
|
598
|
+
* @param baseMarginRate Maintenance margin per contract (mu_m)
|
|
599
|
+
* @param sm Mark price at entry
|
|
600
|
+
* @returns {number} Liquidation price as a probability in the range [0, 1]
|
|
601
|
+
*/
|
|
602
|
+
export function pmFindLiquidationPrice(pos, s3, ell, mc, baseMarginRate) {
|
|
603
|
+
// liq <--> (A) c / |k| < R0 && (B) E < |k| * mu_m
|
|
604
|
+
// if not (A), return 0 (long) or 1 (short) [no liq]
|
|
605
|
+
// else, solve for pm:
|
|
606
|
+
// E = c - |k| max(0, s * (p0 - pm)) = |k| * mu_m
|
|
607
|
+
// if c/|k| < mu_m:
|
|
608
|
+
// any number would do --> return 1 (long) or 0 (short)
|
|
609
|
+
// else:
|
|
610
|
+
// pm = p0 - s * (c/|k| - mu_m)
|
|
611
|
+
const p0 = Math.abs(ell / pos) - 1;
|
|
612
|
+
const R0 = pos > 0 ? p0 : 1 - p0;
|
|
613
|
+
const excessPerCtrct = (mc * s3) / Math.abs(pos) - baseMarginRate; // c/|k| - mu_m, mu_m < CMINUS
|
|
614
|
+
if (mc * s3 > R0 * Math.abs(pos)) {
|
|
615
|
+
// c > |k| R(p0, s) --> no liquidation
|
|
616
|
+
return probToPrice(pos > 0 ? 0.0001 : 0.9999);
|
|
539
617
|
}
|
|
540
|
-
|
|
618
|
+
if (excessPerCtrct < 0) {
|
|
619
|
+
// already underwater
|
|
620
|
+
return probToPrice(pos > 0 ? 0.9999 : 0.0001);
|
|
621
|
+
}
|
|
622
|
+
return probToPrice(pos > 0 ? p0 - excessPerCtrct : p0 + excessPerCtrct);
|
|
541
623
|
}
|
|
542
624
|
/**
|
|
543
625
|
* Calculate the excess margin defined as
|
|
@@ -581,19 +663,22 @@ function excessMargin(tradeAmt, currentCashCC, currentPos, currentLockedInQC, li
|
|
|
581
663
|
* @returns deposit amount
|
|
582
664
|
*/
|
|
583
665
|
function pmGetDepositAmtForLvgTrade(tradeAmt, targetLvg, price, S3, S2Mark) {
|
|
584
|
-
const
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
//
|
|
592
|
-
//
|
|
593
|
-
//
|
|
594
|
-
//
|
|
595
|
-
//
|
|
596
|
-
|
|
666
|
+
const cmin = 0.05;
|
|
667
|
+
// refer to main contract function for this:
|
|
668
|
+
return getDepositAmountForPredMktLvgTrade(0, 0, 0, tradeAmt, targetLvg, price - 1, S3, S2Mark - 1, cmin);
|
|
669
|
+
// const pnl = (tradeAmt * (S2Mark - price)) / S3;
|
|
670
|
+
// let p = S2Mark - 1;
|
|
671
|
+
// if (tradeAmt < 0) {
|
|
672
|
+
// p = 1 - p;
|
|
673
|
+
// }
|
|
674
|
+
// const b = (Math.abs(tradeAmt) * p) / S3 / targetLvg;
|
|
675
|
+
// const amt = -(pnl - b);
|
|
676
|
+
// // check:
|
|
677
|
+
// //bal = amt+pnl
|
|
678
|
+
// //pos_val = (np.abs(trade_amt) * p) / S3
|
|
679
|
+
// //lvg = pos_val/bal
|
|
680
|
+
// //assert(np.abs(lvg-targetLvg)<0.1)
|
|
681
|
+
// return amt;
|
|
597
682
|
}
|
|
598
683
|
/**
|
|
599
684
|
* Internal function to calculate cash over initial margin rate
|
|
@@ -613,16 +698,19 @@ function pmGetDepositAmtForLvgTrade(tradeAmt, targetLvg, price, S3, S2Mark) {
|
|
|
613
698
|
* @returns excess cash
|
|
614
699
|
*/
|
|
615
700
|
function pmExcessCashAtLvg(tradeAmt, lvg, walletBalCC, currentCashCC, currentPosition, currentLockedInValue, slippage, S2, Sm, S3) {
|
|
701
|
+
const cmin = 0.05;
|
|
702
|
+
const mu_m = 0.01;
|
|
703
|
+
const maxLvg = pmMaxLeverage(currentPosition + tradeAmt, Sm - 1, cmin);
|
|
704
|
+
lvg = lvg < maxLvg ? lvg : maxLvg;
|
|
616
705
|
//determine deposit amount for given leverage
|
|
617
706
|
const limitPrice = S2 * (1 + Math.sign(tradeAmt) * slippage);
|
|
618
707
|
const depositFromWallet = pmGetDepositAmtForLvgTrade(tradeAmt, lvg, limitPrice, S3, Sm);
|
|
619
|
-
const m0 = 0.18;
|
|
620
708
|
//leverage fee
|
|
621
709
|
let p0 = Sm - 1;
|
|
622
710
|
if (tradeAmt < 0) {
|
|
623
711
|
p0 = 2 - Sm; //=1-(Sm-1)
|
|
624
712
|
}
|
|
625
|
-
const feeCc = (Math.abs(tradeAmt) * pmExchangeFee(p0,
|
|
713
|
+
const feeCc = (Math.abs(tradeAmt) * pmExchangeFee(p0, mu_m, tradeAmt, 1 / lvg)) / S3;
|
|
626
714
|
//excess cash
|
|
627
715
|
let exc = walletBalCC - depositFromWallet - feeCc;
|
|
628
716
|
if (exc < 0) {
|
|
@@ -631,12 +719,13 @@ function pmExcessCashAtLvg(tradeAmt, lvg, walletBalCC, currentCashCC, currentPos
|
|
|
631
719
|
// margin balance
|
|
632
720
|
let pos = currentPosition + tradeAmt;
|
|
633
721
|
let p = Sm - 1;
|
|
722
|
+
let entryP = limitPrice - 1;
|
|
634
723
|
if (pos < 0) {
|
|
635
|
-
p =
|
|
724
|
+
p = 1 - Sm;
|
|
725
|
+
entryP = 1 - entryP;
|
|
636
726
|
}
|
|
637
|
-
const
|
|
638
|
-
const
|
|
639
|
-
const thresh = Math.abs(pos) * p * tau;
|
|
727
|
+
const mu0 = p / lvg + Math.max(0, entryP - p);
|
|
728
|
+
const thresh = Math.abs(pos) * mu0;
|
|
640
729
|
const b0 = depositFromWallet +
|
|
641
730
|
currentCashCC +
|
|
642
731
|
Math.abs(currentPosition) * Sm -
|
|
@@ -748,13 +837,15 @@ export function pmFindMaxPersonalTradeSizeAtLeverage(dir, lvg, walletBalCC, slip
|
|
|
748
837
|
* @param short Short open OI
|
|
749
838
|
* @param sm Mark price (>1)
|
|
750
839
|
* @param isBuy True if trade is long
|
|
751
|
-
* @param mr
|
|
840
|
+
* @param mr Margin threshold per contract for liquidation (mu_m)
|
|
752
841
|
*/
|
|
753
842
|
export function pmMaxSignedOpenTradeSize(long, short, sm, isBuy, mr, ammFundsQC) {
|
|
754
|
-
if (sm
|
|
843
|
+
if (sm <= 1 || sm >= 2) {
|
|
844
|
+
// closed
|
|
755
845
|
return 0;
|
|
756
846
|
}
|
|
757
|
-
const
|
|
847
|
+
const counterPos = isBuy ? -short : long;
|
|
848
|
+
const m = pmMaintenanceMarginRate(counterPos, counterPos * sm, sm, mr);
|
|
758
849
|
let p = !isBuy ? sm - 1 : 2 - sm;
|
|
759
850
|
p = p < 0.01 ? 0.01 : p > 0.99 ? 0.99 : p; // same cap as contract
|
|
760
851
|
return isBuy ? (ammFundsQC + m * p * short) / p - long : -(ammFundsQC + m * p * long) / p + short;
|