@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.
- package/dist/cjs/abi/IPerpetualManager.json +154 -4
- package/dist/cjs/abi/OracleFactory.json +94 -25
- package/dist/cjs/abi/PerpetualManagerProxy.json +212 -2
- package/dist/cjs/accountTrade.d.ts +3 -3
- package/dist/cjs/accountTrade.js +1 -1
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.d.ts +5 -1
- package/dist/cjs/brokerTool.js +20 -7
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/defaultConfig.json +0 -12
- package/dist/cjs/config/priceFeedConfig.json +1 -19
- package/dist/cjs/constants.d.ts +0 -1
- package/dist/cjs/constants.js +2 -3
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/contracts/IPerpetualManager.d.ts +93 -13
- package/dist/cjs/contracts/OracleFactory.d.ts +69 -20
- package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +118 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +154 -4
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/cjs/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/cjs/d8XMath.d.ts +59 -1
- package/dist/cjs/d8XMath.js +259 -3
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/liquidatorTool.d.ts +1 -0
- package/dist/cjs/liquidatorTool.js +24 -7
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/marketData.d.ts +45 -23
- package/dist/cjs/marketData.js +292 -197
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +24 -1
- package/dist/cjs/nodeSDKTypes.js.map +1 -1
- package/dist/cjs/orderExecutorTool.d.ts +3 -3
- package/dist/cjs/orderExecutorTool.js +38 -13
- package/dist/cjs/orderExecutorTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +28 -17
- package/dist/cjs/perpetualDataHandler.js +71 -45
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.d.ts +1 -1
- package/dist/cjs/perpetualEventHandler.js +6 -7
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/polyMktsPxFeed.d.ts +5 -3
- package/dist/cjs/polyMktsPxFeed.js +34 -2
- package/dist/cjs/polyMktsPxFeed.js.map +1 -1
- package/dist/cjs/priceFeeds.d.ts +6 -7
- package/dist/cjs/priceFeeds.js +36 -14
- 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/cjs/writeAccessHandler.js +1 -1
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/abi/IPerpetualManager.json +154 -4
- package/dist/esm/abi/OracleFactory.json +94 -25
- package/dist/esm/abi/PerpetualManagerProxy.json +212 -2
- package/dist/esm/accountTrade.d.ts +3 -3
- package/dist/esm/accountTrade.js +1 -1
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.d.ts +5 -1
- package/dist/esm/brokerTool.js +21 -8
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/defaultConfig.json +0 -12
- package/dist/esm/config/priceFeedConfig.json +1 -19
- package/dist/esm/constants.d.ts +0 -1
- package/dist/esm/constants.js +1 -2
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/contracts/IPerpetualManager.d.ts +93 -13
- package/dist/esm/contracts/OracleFactory.d.ts +69 -20
- package/dist/esm/contracts/PerpetualManagerProxy.d.ts +109 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +118 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +154 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +75 -20
- package/dist/esm/contracts/factories/OracleFactory__factory.js +94 -25
- package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/{cjs/contracts/factories/MockToken__factory.d.ts → esm/contracts/factories/PerpStorage__factory.d.ts} +115 -128
- package/dist/esm/contracts/factories/{MockToken__factory.js → PerpStorage__factory.js} +128 -139
- package/dist/esm/contracts/factories/PerpStorage__factory.js.map +1 -0
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +159 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +212 -2
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +59 -1
- package/dist/esm/d8XMath.js +251 -2
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.d.ts +1 -0
- package/dist/esm/liquidatorTool.js +25 -8
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/marketData.d.ts +45 -23
- package/dist/esm/marketData.js +295 -200
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +24 -1
- package/dist/esm/nodeSDKTypes.js.map +1 -1
- package/dist/esm/orderExecutorTool.d.ts +3 -3
- package/dist/esm/orderExecutorTool.js +38 -13
- package/dist/esm/orderExecutorTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +28 -17
- package/dist/esm/perpetualDataHandler.js +74 -48
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.d.ts +1 -1
- package/dist/esm/perpetualEventHandler.js +6 -7
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/polyMktsPxFeed.d.ts +5 -3
- package/dist/esm/polyMktsPxFeed.js +34 -2
- package/dist/esm/polyMktsPxFeed.js.map +1 -1
- package/dist/esm/priceFeeds.d.ts +6 -7
- package/dist/esm/priceFeeds.js +36 -14
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/writeAccessHandler.js +3 -3
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/doc/brokerTool.md +3 -1
- package/doc/d8x-perpetuals-sdk.md +804 -132
- package/doc/marketData.md +813 -0
- package/doc/perpetualDataHandler.md +76 -7
- package/package.json +1 -1
- package/src/abi/IPerpetualManager.json +154 -4
- package/src/abi/OracleFactory.json +523 -454
- package/src/abi/PerpetualManagerProxy.json +1596 -1386
- package/src/accountTrade.ts +3 -3
- package/src/brokerTool.ts +22 -8
- package/src/config/defaultConfig.json +0 -13
- package/src/config/priceFeedConfig.json +1 -19
- package/src/constants.ts +1 -2
- package/src/contracts/IPerpetualManager.ts +140 -10
- package/src/contracts/OracleFactory.ts +100 -26
- package/src/contracts/PerpetualManagerProxy.ts +192 -3
- package/src/contracts/factories/IPerpetualManager__factory.ts +154 -4
- package/src/contracts/factories/OracleFactory__factory.ts +94 -25
- package/src/contracts/factories/PerpetualManagerProxy__factory.ts +212 -2
- package/src/d8XMath.ts +327 -2
- package/src/liquidatorTool.ts +29 -14
- package/src/marketData.ts +448 -250
- package/src/nodeSDKTypes.ts +30 -1
- package/src/orderExecutorTool.ts +48 -20
- package/src/perpetualDataHandler.ts +108 -55
- package/src/perpetualEventHandler.ts +6 -7
- package/src/polyMktsPxFeed.ts +40 -4
- package/src/priceFeeds.ts +41 -17
- package/src/version.ts +1 -1
- package/src/writeAccessHandler.ts +2 -2
- package/dist/cjs/abi/BeaconProxy.json +0 -71
- package/dist/cjs/abi/Maintainer.json +0 -774
- package/dist/cjs/abi/MockToken.json +0 -347
- package/dist/cjs/abi/UUPSUpgradeable.json +0 -104
- package/dist/cjs/abi/WeETH.json +0 -310
- package/dist/cjs/abi-zkevm/LimitOrderBook.json +0 -910
- package/dist/cjs/abi-zkevm/LimitOrderBookFactory.json +0 -236
- 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/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/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/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/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.js +0 -365
- package/dist/cjs/contracts/factories/MockToken__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/BeaconProxy.json +0 -71
- package/dist/esm/abi/Maintainer.json +0 -774
- package/dist/esm/abi/MockToken.json +0 -347
- 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/LimitOrderBook.json +0 -910
- package/dist/esm/abi-zkevm/LimitOrderBookFactory.json +0 -236
- 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/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/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/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/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.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/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
|
-
|
|
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
|
+
}
|
package/src/liquidatorTool.ts
CHANGED
|
@@ -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
|
-
|
|
223
|
+
|
|
224
|
+
indexPrices = [
|
|
225
|
+
obj.ema, // ema (pred mkts) or s2
|
|
226
|
+
obj.s3 ?? 0, // s3
|
|
227
|
+
];
|
|
225
228
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
|
247
|
+
let threshold: number;
|
|
246
248
|
if (this.isPredictionMarket(symbol)) {
|
|
247
|
-
|
|
248
|
-
|
|
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.
|