@reyaxyz/common 0.333.1 → 0.334.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.
package/README.md CHANGED
@@ -6,5 +6,5 @@
6
6
 
7
7
  | Statements | Branches | Functions | Lines |
8
8
  | --------------------------- | ----------------------- | ------------------------- | ----------------- |
9
- | ![Statements](https://img.shields.io/badge/statements-23.3%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-20.44%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-13.15%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-24.89%25-red.svg?style=flat) |
9
+ | ![Statements](https://img.shields.io/badge/statements-25.18%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-24.02%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-13.85%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-26.72%25-red.svg?style=flat) |
10
10
 
@@ -505,6 +505,12 @@ var ExposureCommand = /** @class */ (function () {
505
505
  }
506
506
  return ExposureCommand.exchangeWithPriceHaircut(marginBalance, exchangeInfo.price, exchangeInfo.priceHaircut);
507
507
  };
508
+ /**
509
+ * @audit This function uses a linear approximation that is not aligned with the on-chain
510
+ * exponential logPriceMultiplier pricing logic (PriceMultiplier.sol). The intention is to
511
+ * deprecate this function completely once downstream consumers (PoolLiquidityCommand,
512
+ * updateLiquidity.task, marketDataLiquidity.task) are migrated.
513
+ */
508
514
  ExposureCommand.prototype.getSlippage = function (deltaBase, marketConfiguration, marketStorage) {
509
515
  var deltaExposure = (0, bignumber_js_1.default)(this.oraclePricePerMarket[marketConfiguration.market_id])
510
516
  .times(deltaBase)
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"/","sources":["commands/exposure/command.ts"],"names":[],"mappings":"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","sourcesContent":["import BigNumber from 'bignumber.js';\nimport cloneDeep from 'lodash.clonedeep';\nimport {\n AccountAssetBalance,\n CollateralAddressToExchangePriceMap,\n CollateralInfo,\n ExchangeInfo,\n ExposureCommandState,\n MarginInfo,\n MarketConfiguration,\n MarketIdToOraclePriceMap,\n MarketStorage,\n PositionInfo,\n PositionInfoMarketConfiguration,\n RiskMatrix,\n RiskMultipliersConfiguration,\n EditCollateralAction,\n} from './types';\nimport {\n amountNormalizer,\n MA_HEALTH_DANGER_THRESHOLD,\n MA_HEALTH_WARNING_THRESHOLD,\n POOL_IMR,\n} from '../../utils';\n\nexport class ExposureCommand {\n accountId: number;\n rootCollateralPoolId: number;\n oraclePricePerMarket: MarketIdToOraclePriceMap;\n accountBalancePerAsset: AccountAssetBalance[];\n groupedByCollateral: Record<string, AccountAssetBalance>;\n riskMultipliers: RiskMultipliersConfiguration;\n riskMatrices: RiskMatrix[];\n exchangeInfoPerAsset: ExchangeInfo[];\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[];\n uniqueTokenAddresses: string[];\n uniqueQuoteCollaterals: string[];\n tokenMarginInfoPerAsset: MarginInfo[];\n realizedPnLSum: BigNumber;\n unrealizedPnLSum: BigNumber;\n mtmRpnlSum: BigNumber;\n collateralAddressToExchangePrice: CollateralAddressToExchangePriceMap;\n constructor(\n accountId: number,\n rootCollateralPoolId: number,\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n accountBalancePerAsset: AccountAssetBalance[],\n groupedByCollateral: Record<string, AccountAssetBalance>,\n riskMultipliers: RiskMultipliersConfiguration,\n riskMatrices: RiskMatrix[],\n exchangeInfoPerAsset: ExchangeInfo[],\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[],\n uniqueTokenAddresses: string[],\n uniqueQuoteCollaterals: string[],\n tokenMarginInfoPerAsset: MarginInfo[],\n realizedPnLSum: BigNumber,\n unrealizedPnLSum: BigNumber,\n mtmRpnlSum: BigNumber,\n collateralAddressToExchangePrice: CollateralAddressToExchangePriceMap,\n ) {\n this.accountId = accountId;\n this.rootCollateralPoolId = rootCollateralPoolId;\n this.oraclePricePerMarket = oraclePricePerMarket;\n this.accountBalancePerAsset = accountBalancePerAsset;\n this.groupedByCollateral = groupedByCollateral;\n this.riskMultipliers = riskMultipliers;\n this.riskMatrices = riskMatrices;\n this.exchangeInfoPerAsset = exchangeInfoPerAsset;\n this.positionInfoMarketConfiguration = positionInfoMarketConfiguration;\n this.uniqueTokenAddresses = uniqueTokenAddresses;\n this.uniqueQuoteCollaterals = uniqueQuoteCollaterals;\n this.tokenMarginInfoPerAsset = tokenMarginInfoPerAsset;\n this.realizedPnLSum = realizedPnLSum;\n this.unrealizedPnLSum = unrealizedPnLSum;\n this.mtmRpnlSum = mtmRpnlSum;\n this.collateralAddressToExchangePrice = collateralAddressToExchangePrice;\n }\n\n getState(): ExposureCommandState {\n return {\n accountId: this.accountId,\n rootCollateralPoolId: this.rootCollateralPoolId,\n oraclePricePerMarket: this.oraclePricePerMarket,\n accountBalancePerAsset: this.accountBalancePerAsset,\n groupedByCollateral: this.groupedByCollateral,\n riskMultipliers: this.riskMultipliers,\n riskMatrices: this.riskMatrices,\n exchangeInfoPerAsset: this.exchangeInfoPerAsset,\n positionInfoMarketConfiguration: this.positionInfoMarketConfiguration,\n uniqueTokenAddresses: this.uniqueTokenAddresses,\n uniqueQuoteCollaterals: this.uniqueQuoteCollaterals,\n tokenMarginInfoPerAsset: this.tokenMarginInfoPerAsset,\n realizedPnLSum: this.realizedPnLSum,\n unrealizedPnLSum: this.unrealizedPnLSum,\n mtmRpnlSum: this.mtmRpnlSum,\n collateralAddressToExchangePrice: this.collateralAddressToExchangePrice,\n };\n }\n\n get getUsdNodeMarginInfo() {\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n this.uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n this.tokenMarginInfoPerAsset,\n );\n }\n\n get balancePerAsset() {\n return this.tokenMarginInfoPerAsset;\n }\n get exchangePricePerAsset() {\n return this.exchangeInfoPerAsset;\n }\n\n getUsdNodeMarginInfoPostTrade(\n positionAmount: number,\n collateralAddress: string,\n marketConfiguration: MarketConfiguration,\n riskBlockId: number,\n ) {\n // perform deep copy of the object\n const positionInfoMarketConfiguration: PositionInfoMarketConfiguration[] =\n cloneDeep(this.positionInfoMarketConfiguration);\n\n // Check if the market_id already exists in the array\n const existingConfigIndex = positionInfoMarketConfiguration.findIndex(\n (config) =>\n config.market_id ===\n BigNumber(String(marketConfiguration.market_id)).toNumber(),\n );\n\n if (existingConfigIndex !== -1) {\n // If it exists, update the amount\n positionInfoMarketConfiguration[existingConfigIndex].base = BigNumber(\n positionInfoMarketConfiguration[existingConfigIndex].base,\n ).plus(positionAmount);\n } else {\n // If it doesn't exist, add a new element\n positionInfoMarketConfiguration.push({\n base: BigNumber(positionAmount),\n realized_pnl: BigNumber(0),\n realized_pnl_with_mtm: BigNumber(0),\n realized_pnl_latest_snapshot: BigNumber(0),\n latest_funding_cashflow: BigNumber(0),\n last_price: BigNumber(0),\n average_entry_price_off_chain_tracker: BigNumber(0),\n funding_value_off_chain_tracker: BigNumber(0),\n average_entry_price: BigNumber(0),\n last_timestamp: BigNumber(0),\n funding_value: BigNumber(0),\n base_multiplier: BigNumber(0),\n adl_unwind_price: BigNumber(0),\n market_id: BigNumber(String(marketConfiguration.market_id)).toNumber(),\n account_id: this.accountId,\n market_configuration: marketConfiguration,\n risk_block_id: riskBlockId,\n });\n }\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n uniqueQuoteCollaterals.add(collateralAddress);\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n this.groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n if (!this.uniqueTokenAddresses.includes(collateralAddress)) {\n uniqueTokenAddresses.push(collateralAddress);\n }\n\n return {\n usdNodeMarginInfo: ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n ),\n tokenMarginInfoPerAsset: tokenMarginInfoPerAsset,\n positionInfoMarketConfiguration: positionInfoMarketConfiguration,\n };\n }\n\n getEditCollateralActionsToCoverMargin(\n requiredMargin: number,\n ): EditCollateralAction[] {\n /*\n * Note, this function is implicitely making an assumption that required margin can be covered by\n * the account without breaching account IMR\n * */\n const editCollateralActions: EditCollateralAction[] = [];\n let marginToCover = requiredMargin;\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n this.groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n // todo: p2: consider prioritising rUSD when looping through token infos & document math in comments\n for (const tokenInfo of tokenMarginInfoPerAsset) {\n if (tokenInfo.marginBalance < 0) {\n continue;\n }\n\n // todo: p1: haircut and exchange rate adjustment should not be done for rUSD\n // does exchangeInfo currently return haircut as zero and price as 1?\n // todo: p2: can just look at net deposits rather than margin balance for non-rusd as non pnl\n\n const exchangeInfo = this.exchangeInfoPerAsset.find((exchangeInfo) => {\n return tokenInfo.assetAddress === exchangeInfo.tokenAddress;\n });\n\n if (!exchangeInfo) {\n throw new Error(\n 'Unable to retrieve exchange info when calculating collaterals needed to cover margin',\n );\n }\n\n const marginBalanceWithHaircutInRUSD =\n ExposureCommand.exchangeWithPriceHaircut(\n tokenInfo.marginBalance,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n\n if (marginBalanceWithHaircutInRUSD > marginToCover) {\n const collateralDelta =\n -ExposureCommand.reverseExchangeWithPriceHaircut(\n marginToCover,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n editCollateralActions.push({\n collateralAddress: tokenInfo.assetAddress,\n collateralDelta: collateralDelta,\n });\n break;\n } else {\n editCollateralActions.push({\n collateralAddress: tokenInfo.assetAddress,\n collateralDelta: -tokenInfo.marginBalance,\n });\n marginToCover = marginToCover - marginBalanceWithHaircutInRUSD;\n }\n }\n return editCollateralActions;\n }\n\n getUsdNodeMarginInfoPostEditCollaterals(\n editCollateralActions: EditCollateralAction[],\n ) {\n // todo: check if there's a way to simplify this function & deprecate the single edit collateral sim below as it's a\n // subset of this function\n\n // perform deep copy of the object\n const groupedByCollateral: Record<string, AccountAssetBalance> = cloneDeep(\n this.groupedByCollateral,\n );\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n\n // counterfactual update deep copy\n\n for (const action of editCollateralActions) {\n if (groupedByCollateral[action.collateralAddress]) {\n groupedByCollateral[action.collateralAddress] = {\n ...groupedByCollateral[action.collateralAddress],\n amount:\n groupedByCollateral[action.collateralAddress].amount +\n action.collateralDelta,\n };\n } else {\n groupedByCollateral[action.collateralAddress] = {\n accountId: this.accountId,\n collateral: action.collateralAddress,\n amount: action.collateralDelta,\n };\n }\n\n uniqueQuoteCollaterals.add(action.collateralAddress);\n\n if (!this.uniqueTokenAddresses.includes(action.collateralAddress)) {\n uniqueTokenAddresses.push(action.collateralAddress);\n }\n }\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n );\n }\n\n getUsdNodeMarginInfoPostEditCollateral(\n collateralDelta: number,\n collateralAddress: string,\n ) {\n // perform deep copy of the object\n const groupedByCollateral: Record<string, AccountAssetBalance> = cloneDeep(\n this.groupedByCollateral,\n );\n\n // counterfactual update deep copy\n if (groupedByCollateral[collateralAddress]) {\n groupedByCollateral[collateralAddress] = {\n ...groupedByCollateral[collateralAddress],\n amount: groupedByCollateral[collateralAddress].amount + collateralDelta,\n };\n } else {\n groupedByCollateral[collateralAddress] = {\n accountId: this.accountId,\n collateral: collateralAddress,\n amount: collateralDelta,\n };\n }\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n if (!this.uniqueTokenAddresses.includes(collateralAddress)) {\n uniqueTokenAddresses.push(collateralAddress);\n }\n\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n );\n }\n\n static calculateTokenMarginInfoPerAsset(\n groupedByCollateral: Record<string, AccountAssetBalance>,\n rootCollateralPoolId: number,\n riskMatrices: RiskMatrix[],\n riskMultipliers: RiskMultipliersConfiguration,\n uniqueQuoteCollaterals: Set<string>,\n realizedPnLSum: BigNumber,\n unrealizedPnLSum: BigNumber,\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n ): MarginInfo[] {\n const tokenMarginInfoPerAsset: MarginInfo[] = [];\n\n // todo: p2: investigate the ts-expect-error cases below\n // @ts-expect-error no easy way to make sure string can be casted to Lowercase<string> type\n const uniqueQuoteTokens: Lowercase<string>[] = Array.from(\n uniqueQuoteCollaterals,\n );\n\n // @ts-expect-error no easy way to make sure string can be casted to Lowercase<string> type\n const tokenUnion: Set<Lowercase<string>> = new Set([\n ...Object.keys(groupedByCollateral),\n ...uniqueQuoteTokens,\n ]); // get unique union of those arrays\n const uniqueTokenAddresses: Lowercase<string>[] = Array.from(tokenUnion);\n\n for (const token of uniqueTokenAddresses) {\n tokenMarginInfoPerAsset.push(\n ExposureCommand.getTokenMarginInfo(\n rootCollateralPoolId,\n riskMatrices,\n riskMultipliers,\n ExposureCommand.getCollateralInfo(\n token,\n uniqueQuoteCollaterals.has(token) ? realizedPnLSum : BigNumber(0),\n uniqueQuoteCollaterals.has(token) ? unrealizedPnLSum : BigNumber(0),\n groupedByCollateral[token]?.amount || 0,\n ),\n token,\n positionInfoMarketConfiguration,\n oraclePricePerMarket,\n uniqueQuoteTokens,\n ),\n );\n }\n\n return tokenMarginInfoPerAsset;\n }\n static calculateLiquidation(\n marginBalance: number,\n liquidationMarginRequirement: number,\n oraclePrice: number,\n positionBase: number,\n ): BigNumber {\n if (positionBase === 0 || liquidationMarginRequirement === 0) {\n return BigNumber(0);\n }\n const liquidationPrice = BigNumber(oraclePrice).minus(\n BigNumber(marginBalance)\n .minus(liquidationMarginRequirement)\n .div(positionBase),\n );\n\n return BigNumber.max(0, liquidationPrice);\n }\n\n static calculateImpliedLeverage(\n notionalExposure: number,\n oldIMR: number,\n newIMR: number,\n ): number {\n const changeInImr = BigNumber(newIMR).minus(oldIMR);\n\n if (changeInImr.eq(0)) {\n return 0;\n }\n return BigNumber(notionalExposure).div(changeInImr).toNumber();\n }\n\n static combineMarginInfo(\n parentMarginInfo: MarginInfo,\n sonMarginInfo: MarginInfo,\n sonParentExchangeInfo: ExchangeInfo,\n ): MarginInfo {\n return {\n assetAddress: parentMarginInfo.assetAddress,\n marginBalance: BigNumber(parentMarginInfo.marginBalance)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.marginBalance,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n realBalance: BigNumber(parentMarginInfo.realBalance)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.realBalance,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n initialDelta: BigNumber(parentMarginInfo.initialDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.realBalance,\n sonMarginInfo.initialDelta,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n maintenanceDelta: BigNumber(parentMarginInfo.maintenanceDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.maintenanceDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n liquidationDelta: BigNumber(parentMarginInfo.liquidationDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.liquidationDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n dutchDelta: BigNumber(parentMarginInfo.dutchDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.dutchDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n adlDelta: BigNumber(parentMarginInfo.adlDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.adlDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n\n initialBufferDelta: BigNumber(parentMarginInfo.initialBufferDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.initialBufferDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n liquidationMarginRequirement: BigNumber(\n parentMarginInfo.liquidationMarginRequirement,\n )\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.liquidationMarginRequirement,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n };\n }\n\n static getUsdNodeMarginInfo(\n accountCollateralPoolId: number,\n quoteTokens: string[],\n exchangeInfoPerAsset: ExchangeInfo[],\n marginInfoPerToken: MarginInfo[],\n ) {\n let usdNodeMarginInfo: MarginInfo = {\n assetAddress: '',\n marginBalance: 0,\n realBalance: 0,\n initialDelta: 0,\n maintenanceDelta: 0,\n liquidationDelta: 0,\n dutchDelta: 0,\n adlDelta: 0,\n initialBufferDelta: 0,\n liquidationMarginRequirement: 0,\n };\n for (const quoteToken of quoteTokens) {\n const exchangeInfo = exchangeInfoPerAsset.find((exchangeInfo) => {\n return quoteToken === exchangeInfo.tokenAddress;\n });\n\n const marginInfo = marginInfoPerToken.find((marginInfo) => {\n return quoteToken === marginInfo.assetAddress;\n });\n\n if (!exchangeInfo || !marginInfo) {\n throw Error(`Missing exchangeInfo/marginInfo for ${quoteToken}`);\n }\n\n usdNodeMarginInfo = ExposureCommand.combineMarginInfo(\n usdNodeMarginInfo,\n marginInfo,\n exchangeInfo,\n );\n }\n\n return usdNodeMarginInfo;\n }\n static getCollateralInfo(\n collateralAddress: string,\n realisedPnl: BigNumber,\n unrealizedPnL: BigNumber,\n netDeposits: number,\n ): CollateralInfo {\n return {\n netDeposits: netDeposits,\n marginBalance: BigNumber(netDeposits)\n .plus(realisedPnl)\n .plus(unrealizedPnL)\n .toNumber(),\n realBalance: BigNumber(netDeposits).plus(realisedPnl).toNumber(),\n };\n }\n\n static getTokenMarginInfo(\n rootCollateralPoolId: number,\n riskMatrices: RiskMatrix[],\n riskMultipliers: RiskMultipliersConfiguration,\n collateralInfo: CollateralInfo,\n collateralAddress: Lowercase<string>,\n positions: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n uniqueQuoteTokens: string[],\n ): MarginInfo {\n const marginRequirements = {\n liquidationMarginRequirement: 0,\n initialMarginRequirement: 0,\n maintenanceMarginRequirement: 0,\n dutchMarginRequirement: 0,\n adlMarginRequirement: 0,\n initialBufferMarginRequirement: 0,\n };\n if (uniqueQuoteTokens.includes(collateralAddress)) {\n // uniqueQuoteTokens is list is active markets tokens\n for (const riskMatrix of riskMatrices) {\n const filledExposures = ExposureCommand.getBlockExposures(\n positions,\n oraclePricePerMarket,\n riskMatrix.risk_block_id,\n );\n\n marginRequirements.liquidationMarginRequirement = BigNumber(\n marginRequirements.liquidationMarginRequirement,\n )\n .plus(\n ExposureCommand.computeLiquidationMarginRequirement(\n riskMatrix.matrix,\n filledExposures,\n ),\n )\n .toNumber();\n }\n\n // Get the initial margin requirement\n marginRequirements.initialMarginRequirement = amountNormalizer(\n String(riskMultipliers.im_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n // Get the maintenance margin requirement\n marginRequirements.maintenanceMarginRequirement = amountNormalizer(\n String(riskMultipliers.mmr_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n // Get the dutch margin requirement\n marginRequirements.dutchMarginRequirement = amountNormalizer(\n String(riskMultipliers.dutch_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n\n // Get the adl margin requirement\n marginRequirements.adlMarginRequirement = amountNormalizer(\n String(riskMultipliers.adl_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n\n // Get the initial buffer margin requirement\n marginRequirements.initialBufferMarginRequirement = amountNormalizer(\n String(riskMultipliers.im_buffer_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n }\n return {\n assetAddress: collateralAddress,\n marginBalance: collateralInfo.marginBalance,\n realBalance: collateralInfo.realBalance,\n initialDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.initialMarginRequirement)\n .toNumber(),\n maintenanceDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.maintenanceMarginRequirement)\n .toNumber(),\n liquidationDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.liquidationMarginRequirement)\n .toNumber(),\n dutchDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.dutchMarginRequirement)\n .toNumber(),\n adlDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.adlMarginRequirement)\n .toNumber(),\n initialBufferDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.initialBufferMarginRequirement)\n .toNumber(),\n liquidationMarginRequirement:\n marginRequirements.liquidationMarginRequirement,\n };\n }\n\n static computeLiquidationMarginRequirement(\n matrix: BigNumber[][],\n filledExposures: BigNumber[],\n ): number {\n let lmrFilledSquared = 0;\n\n for (let i = 0; i < filledExposures.length; i++) {\n if (BigNumber(filledExposures[i]).eq(0)) {\n continue;\n }\n for (let j = 0; j < filledExposures.length; j++) {\n const riskParam = matrix[i][j];\n\n if (BigNumber(filledExposures[j]).eq(0) || BigNumber(riskParam).eq(0)) {\n continue;\n }\n\n lmrFilledSquared = BigNumber(lmrFilledSquared)\n .plus(\n BigNumber(filledExposures[i])\n .multipliedBy(filledExposures[j])\n .multipliedBy(riskParam),\n )\n .toNumber();\n }\n }\n return BigNumber(lmrFilledSquared).sqrt().toNumber();\n }\n\n static getBlockExposures(\n positions: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n riskBlockId: number,\n ): BigNumber[] {\n const filledExposures: number[] = [];\n let maxIndex = 0; // Keep track of the highest riskMatrixIndex encountered\n\n for (const position of positions) {\n if (riskBlockId !== position.risk_block_id) continue;\n const marketFilledExposure = ExposureCommand.getAccountFilledExposures(\n position,\n position.market_configuration,\n oraclePricePerMarket[position.market_id],\n );\n const index = marketFilledExposure.riskMatrixIndex;\n filledExposures[index] = BigNumber(filledExposures[index] || 0)\n .plus(marketFilledExposure.exposure)\n .toNumber();\n\n if (index > maxIndex) maxIndex = index;\n }\n\n // Ensure filledExposures array is correctly populated up to maxIndex\n for (let i = 0; i <= maxIndex; i++) {\n if (filledExposures[i] === undefined) {\n filledExposures[i] = 0;\n }\n }\n return filledExposures.map((num) => BigNumber(num));\n }\n\n static getAccountFilledExposures(\n position: PositionInfo,\n marketConfiguration: MarketConfiguration,\n oraclePrice: number,\n ) {\n const base = position.base;\n return {\n exposure: BigNumber(oraclePrice).multipliedBy(base),\n riskMatrixIndex: BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber(),\n };\n }\n\n static computePricePnL(\n openBase: BigNumber,\n openPrice: BigNumber,\n exitPrice: BigNumber,\n ) {\n return BigNumber(\n BigNumber(exitPrice).minus(openPrice).multipliedBy(openBase),\n );\n }\n\n static getMarginRatio(\n marginInfo: Pick<\n MarginInfo,\n 'marginBalance' | 'liquidationMarginRequirement'\n >,\n ) {\n if (marginInfo.liquidationMarginRequirement === 0) {\n return 0;\n }\n\n if (marginInfo.marginBalance <= 0) {\n return 1;\n }\n\n const health = BigNumber(marginInfo.liquidationMarginRequirement).div(\n marginInfo.marginBalance,\n );\n\n if (health.gt(1)) {\n return 1;\n }\n return health.toNumber();\n }\n\n static exchangeWithPriceHaircut(\n quantity: number,\n price: number,\n haircut: number,\n ) {\n // For positive quantities, the haircut is `quantity * (1 - haircut)`\n // For negative values, the haircut is `quantity / (1 - haircut)` because a negative value means the haircut should be applied from B to A.\n const calHelper = BigNumber(quantity).gt(0)\n ? BigNumber(1).minus(haircut)\n : BigNumber(1).div(BigNumber(1).minus(haircut));\n const haircutPrice = BigNumber(price).multipliedBy(calHelper);\n\n return haircutPrice.multipliedBy(quantity).toNumber();\n }\n\n static reverseExchangeWithPriceHaircut(\n quantity: number,\n price: number,\n haircut: number,\n ) {\n /*\n * this operation takes quantity in rUSD terms, price between collateral token (e.g. weth) and rusd\n * alongside the haircut between weth and rusd\n * it then returns a quantity in collateral token terms (e.g. weth) which would return quantity if it were to be\n * passed through the exchangeWithPriceHaircut function\n * */\n // todo: p2: consider abstracting haircut price calculation into separate function as duplciated\n // For positive quantities, the haircut is `quantity * (1 - haircut)`\n // For negative values, the haircut is `quantity / (1 - haircut)` because a negative value means the haircut should be applied from B to A.\n const calHelper = BigNumber(quantity).gt(0)\n ? BigNumber(1).minus(haircut)\n : BigNumber(1).div(BigNumber(1).minus(haircut));\n const haircutPrice = BigNumber(price).multipliedBy(calHelper);\n\n return BigNumber(quantity).dividedBy(haircutPrice).toNumber();\n }\n\n static getBalanceWithHaircut(\n exchangeInfoPerAsset: ExchangeInfo[],\n assetAddress: string,\n marginBalance: number,\n ) {\n // todo: p1: haircut and exchange rate adjustment should not be done for rUSD\n // does exchangeInfo currently return haircut as zero and price as 1?\n // todo: p2: can just look at net deposits rather than margin balance for non-rusd as non pnl\n\n const exchangeInfo = exchangeInfoPerAsset.find((exchangeInfo) => {\n return assetAddress === exchangeInfo.tokenAddress;\n });\n\n if (!exchangeInfo) {\n throw new Error(\n 'Unable to retrieve exchange info when calculating collaterals needed to cover margin',\n );\n }\n\n return ExposureCommand.exchangeWithPriceHaircut(\n marginBalance,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n }\n\n getSlippage(\n deltaBase: number,\n marketConfiguration: MarketConfiguration,\n marketStorage: MarketStorage,\n ): number {\n const deltaExposure = BigNumber(\n this.oraclePricePerMarket[marketConfiguration.market_id],\n )\n .times(deltaBase)\n .toNumber();\n\n const riskMatrixIndex = BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber();\n\n // isPool is true as we only get slippage for the pool\n const { maxExposureShort, maxExposureLong, exposures } =\n this.getMaxExposure(marketConfiguration, marketStorage, true);\n\n const netExposure = exposures[riskMatrixIndex].plus(deltaExposure);\n const maxExposure = netExposure.lt(0) ? maxExposureShort : maxExposureLong;\n\n return BigNumber(netExposure)\n .negated()\n .div(\n BigNumber(maxExposure)\n .times(amountNormalizer(marketConfiguration.depth_factor))\n .plus(netExposure),\n )\n .toNumber();\n }\n\n getMaxExposure(\n marketConfiguration: MarketConfiguration,\n marketStorage: MarketStorage,\n isPool: boolean,\n ) {\n // todo: p2: cosider turning this into a hashmap vs. an array so that O(1) access\n const riskMatrix = this.riskMatrices.find((riskMatrix) => {\n return (\n riskMatrix.risk_block_id ===\n BigNumber(String(marketStorage.risk_block_id)).toNumber()\n );\n });\n\n if (!riskMatrix) {\n throw new Error(\"RiskMatrix Doesn't exist\");\n }\n\n const riskMatrixIndex = BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber();\n\n let imrMultiplier;\n if (isPool) {\n imrMultiplier = POOL_IMR;\n } else {\n imrMultiplier = amountNormalizer(\n String(this.riskMultipliers.im_multiplier),\n ).toNumber();\n }\n\n const marginInfo = this.tokenMarginInfoPerAsset.find((marginInfo) => {\n return marginInfo.assetAddress === marketStorage.quote_collateral;\n });\n\n if (!marginInfo) {\n throw new Error(\"marginInfo doesn't exist\");\n }\n\n const exposures = ExposureCommand.getBlockExposures(\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n BigNumber(String(marketStorage.risk_block_id)).toNumber(),\n );\n\n const { maxExposureShort, maxExposureLong } =\n ExposureCommand.computeMaxExposures(\n riskMatrix.matrix,\n exposures,\n marginInfo.liquidationMarginRequirement,\n marginInfo.marginBalance < 0 ? 0 : marginInfo.marginBalance,\n imrMultiplier,\n riskMatrixIndex,\n );\n\n return {\n maxExposureShort,\n maxExposureLong,\n exposures,\n riskMatrixIndex,\n };\n }\n\n static computeMaxExposures(\n riskMatrix: BigNumber[][],\n exposures: BigNumber[],\n lmr: number,\n balance: number,\n imrMultiplier: number,\n exposureIndex: number,\n ) {\n let b = BigNumber(0);\n\n for (let i = 0; i < exposures.length; i++) {\n b = BigNumber(b).plus(\n BigNumber(exposures[i]).multipliedBy(\n BigNumber(riskMatrix[exposureIndex][i]).plus(\n riskMatrix[i][exposureIndex],\n ),\n ),\n );\n }\n const { x1, x2 } = this.solveQuadraticEquation(\n BigNumber(riskMatrix[exposureIndex][exposureIndex]).toNumber(), // changes here\n b.toNumber(),\n this.computeC(lmr, balance, imrMultiplier),\n );\n\n const maxShortExposure = BigNumber(x1).plus(exposures[exposureIndex]);\n const maxLongExposure = BigNumber(x2).plus(exposures[exposureIndex]);\n\n const availableShortExposure = maxShortExposure.lt(0)\n ? maxShortExposure.negated().toNumber()\n : 0;\n\n const availableLongExposure = maxLongExposure.gt(0)\n ? maxLongExposure.toNumber()\n : 0;\n\n return {\n maxExposureShort: availableShortExposure,\n maxExposureLong: availableLongExposure,\n };\n }\n\n static solveQuadraticEquation(a: number, b: number, c: number) {\n if (BigNumber(a).eq(0)) {\n throw new Error('ZeroQuadraticCoefficient');\n }\n\n const delta = BigNumber(b)\n .multipliedBy(b)\n .minus(BigNumber(4).multipliedBy(a).multipliedBy(c));\n\n if (delta.lt(0)) {\n return {\n x1: BigNumber(0),\n x2: BigNumber(0),\n };\n }\n\n const rootDelta = delta.sqrt();\n\n const x1 = BigNumber(b)\n .multipliedBy(-1)\n .minus(rootDelta)\n .div(BigNumber(2).multipliedBy(a));\n\n const x2 = BigNumber(b)\n .multipliedBy(-1)\n .plus(rootDelta)\n .div(BigNumber(2).multipliedBy(a));\n\n return {\n x1,\n x2,\n };\n }\n\n static computeC(lmr: number, balance: number, imrMultiplier: number): number {\n const lmrSD = BigNumber(lmr);\n const lmrSquared = lmrSD.multipliedBy(lmrSD);\n\n const balanceSD = BigNumber(balance);\n const balanceSquared = balanceSD.multipliedBy(balanceSD);\n\n const imrMultiplierSD = BigNumber(imrMultiplier);\n const imrMultiplierSquared = imrMultiplierSD.multipliedBy(imrMultiplierSD);\n\n return lmrSquared\n .minus(balanceSquared.div(imrMultiplierSquared))\n .toNumber();\n }\n\n static calculateRebalancingOrderBase({\n poolBasePreTrade,\n orderBase,\n }: {\n poolBasePreTrade: number;\n orderBase: number;\n }): number {\n if (poolBasePreTrade > 0) {\n if (orderBase < 0) {\n return 0;\n }\n\n return Math.min(poolBasePreTrade, orderBase);\n }\n\n if (orderBase > 0) {\n return 0;\n }\n\n return Math.max(poolBasePreTrade, orderBase);\n }\n\n static calculateFee({\n oraclePrice,\n poolBasePreTrade,\n orderBase,\n feeParameter,\n rebalancingFeeParameter,\n }: {\n oraclePrice: number;\n poolBasePreTrade: number;\n orderBase: number;\n feeParameter: BigNumber;\n rebalancingFeeParameter: BigNumber;\n }): {\n rebalancingFee: number;\n imbalancingFee: number;\n fee: number;\n } {\n const rebalancingOrderBase = this.calculateRebalancingOrderBase({\n poolBasePreTrade,\n orderBase,\n });\n\n const imbalancingOrderBase = orderBase - rebalancingOrderBase;\n\n const imbalancingFee = BigNumber(oraclePrice)\n .times(imbalancingOrderBase)\n .times(feeParameter)\n .abs()\n .toNumber();\n\n const rebalancingFee = BigNumber(oraclePrice)\n .times(rebalancingOrderBase)\n .times(rebalancingFeeParameter)\n .abs()\n .toNumber();\n\n return {\n imbalancingFee,\n rebalancingFee,\n fee: imbalancingFee + rebalancingFee,\n };\n }\n\n static calculateEstimatedPrice(price: number, slippage: number): number {\n return BigNumber(price).times(BigNumber(1).plus(slippage)).toNumber();\n }\n\n static evaluateHealthStatus(marginRatioPercentage: number) {\n if (marginRatioPercentage >= MA_HEALTH_DANGER_THRESHOLD) {\n return 'danger';\n } else if (marginRatioPercentage >= MA_HEALTH_WARNING_THRESHOLD) {\n return 'warning';\n } else {\n return 'healthy';\n }\n }\n\n static getFundingPeriods(lastFundingTimeStamp: BigNumber) {\n const secondsElapsed = BigNumber(Date.now() / 1000).minus(\n lastFundingTimeStamp,\n );\n const ONE_DAY_IN_SECONDS = 86400;\n return BigNumber(secondsElapsed).div(ONE_DAY_IN_SECONDS);\n }\n\n static getHourlyFundingPeriods(lastFundingTimeStamp: BigNumber) {\n const secondsElapsed = BigNumber(Date.now() / 1000).minus(\n lastFundingTimeStamp,\n );\n const ONE_HOUR_IN_SECONDS = 3600;\n return BigNumber(secondsElapsed).div(ONE_HOUR_IN_SECONDS);\n }\n\n static getFundingRateDelta(\n fundingPeriods: BigNumber,\n lastFundingVelocity: BigNumber,\n ) {\n return lastFundingVelocity.multipliedBy(fundingPeriods);\n }\n\n static getCurrentFundingRate(\n last_funding_timestamp: BigNumber,\n lastFundingVelocity: BigNumber,\n lastFundingRate: BigNumber,\n ) {\n const fundingPeriods = ExposureCommand.getFundingPeriods(\n last_funding_timestamp,\n );\n const fundingRateDelta = ExposureCommand.getFundingRateDelta(\n fundingPeriods,\n lastFundingVelocity,\n );\n\n return lastFundingRate.plus(fundingRateDelta);\n }\n\n static getCurrentHourlyFundingRate(\n last_funding_timestamp: BigNumber,\n lastFundingVelocity: BigNumber,\n lastFundingRate: BigNumber,\n ) {\n const dailyFundingRate = this.getCurrentFundingRate(\n last_funding_timestamp,\n lastFundingVelocity,\n lastFundingRate,\n );\n return dailyFundingRate.div(24);\n }\n\n static getCurrentFundingValue(\n spotPrice: BigNumber,\n lastFundingValue: BigNumber,\n baseMultiplier: BigNumber,\n currentHourlyFundingRate: BigNumber,\n previousDailyFundingRate: BigNumber,\n lastFundingTimestamp: BigNumber,\n ) {\n const hourlyFundingPeriods =\n this.getHourlyFundingPeriods(lastFundingTimestamp);\n\n const previousHourlyFundingRate = previousDailyFundingRate.div(24);\n\n return lastFundingValue.plus(\n baseMultiplier\n .times(spotPrice)\n .times(previousHourlyFundingRate.plus(currentHourlyFundingRate).div(2))\n .times(hourlyFundingPeriods),\n );\n }\n\n convertToUsd(amount: number, tokenAddress: string): number {\n return BigNumber(amount)\n .times(this.collateralAddressToExchangePrice[tokenAddress])\n .toNumber();\n }\n\n getExchangeRate(tokenAddress: string): number {\n return this.collateralAddressToExchangePrice[tokenAddress];\n }\n\n get realisedPnl() {\n return this.realizedPnLSum.toNumber();\n }\n\n get unRealisedPnl() {\n return this.unrealizedPnLSum.toNumber();\n }\n\n get accountTotalBalanceUsd() {\n let accountTotalBalance = 0;\n\n for (const collateralAsset of this.tokenMarginInfoPerAsset) {\n const collateralPrice =\n this.collateralAddressToExchangePrice[collateralAsset.assetAddress] ||\n 0;\n\n const balanceInUSD = BigNumber(collateralPrice)\n .times(collateralAsset.marginBalance)\n .toNumber();\n accountTotalBalance += balanceInUSD;\n }\n\n return accountTotalBalance;\n }\n\n get accountTotalBalanceWithHaircutUsd() {\n let accountTotalBalance = 0;\n\n for (const collateralAsset of this.tokenMarginInfoPerAsset) {\n const collateralPriceWithHaircut = ExposureCommand.getBalanceWithHaircut(\n this.exchangeInfoPerAsset,\n collateralAsset.assetAddress,\n collateralAsset.marginBalance,\n );\n\n accountTotalBalance += collateralPriceWithHaircut;\n }\n\n return accountTotalBalance;\n }\n\n getMtmRpnlSum() {\n return this.mtmRpnlSum.toNumber();\n }\n}\n"]}
1
+ {"version":3,"file":"command.js","sourceRoot":"/","sources":["commands/exposure/command.ts"],"names":[],"mappings":"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","sourcesContent":["import BigNumber from 'bignumber.js';\nimport cloneDeep from 'lodash.clonedeep';\nimport {\n AccountAssetBalance,\n CollateralAddressToExchangePriceMap,\n CollateralInfo,\n ExchangeInfo,\n ExposureCommandState,\n MarginInfo,\n MarketConfiguration,\n MarketIdToOraclePriceMap,\n MarketStorage,\n PositionInfo,\n PositionInfoMarketConfiguration,\n RiskMatrix,\n RiskMultipliersConfiguration,\n EditCollateralAction,\n} from './types';\nimport {\n amountNormalizer,\n MA_HEALTH_DANGER_THRESHOLD,\n MA_HEALTH_WARNING_THRESHOLD,\n POOL_IMR,\n} from '../../utils';\n\nexport class ExposureCommand {\n accountId: number;\n rootCollateralPoolId: number;\n oraclePricePerMarket: MarketIdToOraclePriceMap;\n accountBalancePerAsset: AccountAssetBalance[];\n groupedByCollateral: Record<string, AccountAssetBalance>;\n riskMultipliers: RiskMultipliersConfiguration;\n riskMatrices: RiskMatrix[];\n exchangeInfoPerAsset: ExchangeInfo[];\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[];\n uniqueTokenAddresses: string[];\n uniqueQuoteCollaterals: string[];\n tokenMarginInfoPerAsset: MarginInfo[];\n realizedPnLSum: BigNumber;\n unrealizedPnLSum: BigNumber;\n mtmRpnlSum: BigNumber;\n collateralAddressToExchangePrice: CollateralAddressToExchangePriceMap;\n constructor(\n accountId: number,\n rootCollateralPoolId: number,\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n accountBalancePerAsset: AccountAssetBalance[],\n groupedByCollateral: Record<string, AccountAssetBalance>,\n riskMultipliers: RiskMultipliersConfiguration,\n riskMatrices: RiskMatrix[],\n exchangeInfoPerAsset: ExchangeInfo[],\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[],\n uniqueTokenAddresses: string[],\n uniqueQuoteCollaterals: string[],\n tokenMarginInfoPerAsset: MarginInfo[],\n realizedPnLSum: BigNumber,\n unrealizedPnLSum: BigNumber,\n mtmRpnlSum: BigNumber,\n collateralAddressToExchangePrice: CollateralAddressToExchangePriceMap,\n ) {\n this.accountId = accountId;\n this.rootCollateralPoolId = rootCollateralPoolId;\n this.oraclePricePerMarket = oraclePricePerMarket;\n this.accountBalancePerAsset = accountBalancePerAsset;\n this.groupedByCollateral = groupedByCollateral;\n this.riskMultipliers = riskMultipliers;\n this.riskMatrices = riskMatrices;\n this.exchangeInfoPerAsset = exchangeInfoPerAsset;\n this.positionInfoMarketConfiguration = positionInfoMarketConfiguration;\n this.uniqueTokenAddresses = uniqueTokenAddresses;\n this.uniqueQuoteCollaterals = uniqueQuoteCollaterals;\n this.tokenMarginInfoPerAsset = tokenMarginInfoPerAsset;\n this.realizedPnLSum = realizedPnLSum;\n this.unrealizedPnLSum = unrealizedPnLSum;\n this.mtmRpnlSum = mtmRpnlSum;\n this.collateralAddressToExchangePrice = collateralAddressToExchangePrice;\n }\n\n getState(): ExposureCommandState {\n return {\n accountId: this.accountId,\n rootCollateralPoolId: this.rootCollateralPoolId,\n oraclePricePerMarket: this.oraclePricePerMarket,\n accountBalancePerAsset: this.accountBalancePerAsset,\n groupedByCollateral: this.groupedByCollateral,\n riskMultipliers: this.riskMultipliers,\n riskMatrices: this.riskMatrices,\n exchangeInfoPerAsset: this.exchangeInfoPerAsset,\n positionInfoMarketConfiguration: this.positionInfoMarketConfiguration,\n uniqueTokenAddresses: this.uniqueTokenAddresses,\n uniqueQuoteCollaterals: this.uniqueQuoteCollaterals,\n tokenMarginInfoPerAsset: this.tokenMarginInfoPerAsset,\n realizedPnLSum: this.realizedPnLSum,\n unrealizedPnLSum: this.unrealizedPnLSum,\n mtmRpnlSum: this.mtmRpnlSum,\n collateralAddressToExchangePrice: this.collateralAddressToExchangePrice,\n };\n }\n\n get getUsdNodeMarginInfo() {\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n this.uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n this.tokenMarginInfoPerAsset,\n );\n }\n\n get balancePerAsset() {\n return this.tokenMarginInfoPerAsset;\n }\n get exchangePricePerAsset() {\n return this.exchangeInfoPerAsset;\n }\n\n getUsdNodeMarginInfoPostTrade(\n positionAmount: number,\n collateralAddress: string,\n marketConfiguration: MarketConfiguration,\n riskBlockId: number,\n ) {\n // perform deep copy of the object\n const positionInfoMarketConfiguration: PositionInfoMarketConfiguration[] =\n cloneDeep(this.positionInfoMarketConfiguration);\n\n // Check if the market_id already exists in the array\n const existingConfigIndex = positionInfoMarketConfiguration.findIndex(\n (config) =>\n config.market_id ===\n BigNumber(String(marketConfiguration.market_id)).toNumber(),\n );\n\n if (existingConfigIndex !== -1) {\n // If it exists, update the amount\n positionInfoMarketConfiguration[existingConfigIndex].base = BigNumber(\n positionInfoMarketConfiguration[existingConfigIndex].base,\n ).plus(positionAmount);\n } else {\n // If it doesn't exist, add a new element\n positionInfoMarketConfiguration.push({\n base: BigNumber(positionAmount),\n realized_pnl: BigNumber(0),\n realized_pnl_with_mtm: BigNumber(0),\n realized_pnl_latest_snapshot: BigNumber(0),\n latest_funding_cashflow: BigNumber(0),\n last_price: BigNumber(0),\n average_entry_price_off_chain_tracker: BigNumber(0),\n funding_value_off_chain_tracker: BigNumber(0),\n average_entry_price: BigNumber(0),\n last_timestamp: BigNumber(0),\n funding_value: BigNumber(0),\n base_multiplier: BigNumber(0),\n adl_unwind_price: BigNumber(0),\n market_id: BigNumber(String(marketConfiguration.market_id)).toNumber(),\n account_id: this.accountId,\n market_configuration: marketConfiguration,\n risk_block_id: riskBlockId,\n });\n }\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n uniqueQuoteCollaterals.add(collateralAddress);\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n this.groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n if (!this.uniqueTokenAddresses.includes(collateralAddress)) {\n uniqueTokenAddresses.push(collateralAddress);\n }\n\n return {\n usdNodeMarginInfo: ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n ),\n tokenMarginInfoPerAsset: tokenMarginInfoPerAsset,\n positionInfoMarketConfiguration: positionInfoMarketConfiguration,\n };\n }\n\n getEditCollateralActionsToCoverMargin(\n requiredMargin: number,\n ): EditCollateralAction[] {\n /*\n * Note, this function is implicitely making an assumption that required margin can be covered by\n * the account without breaching account IMR\n * */\n const editCollateralActions: EditCollateralAction[] = [];\n let marginToCover = requiredMargin;\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n this.groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n // todo: p2: consider prioritising rUSD when looping through token infos & document math in comments\n for (const tokenInfo of tokenMarginInfoPerAsset) {\n if (tokenInfo.marginBalance < 0) {\n continue;\n }\n\n // todo: p1: haircut and exchange rate adjustment should not be done for rUSD\n // does exchangeInfo currently return haircut as zero and price as 1?\n // todo: p2: can just look at net deposits rather than margin balance for non-rusd as non pnl\n\n const exchangeInfo = this.exchangeInfoPerAsset.find((exchangeInfo) => {\n return tokenInfo.assetAddress === exchangeInfo.tokenAddress;\n });\n\n if (!exchangeInfo) {\n throw new Error(\n 'Unable to retrieve exchange info when calculating collaterals needed to cover margin',\n );\n }\n\n const marginBalanceWithHaircutInRUSD =\n ExposureCommand.exchangeWithPriceHaircut(\n tokenInfo.marginBalance,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n\n if (marginBalanceWithHaircutInRUSD > marginToCover) {\n const collateralDelta =\n -ExposureCommand.reverseExchangeWithPriceHaircut(\n marginToCover,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n editCollateralActions.push({\n collateralAddress: tokenInfo.assetAddress,\n collateralDelta: collateralDelta,\n });\n break;\n } else {\n editCollateralActions.push({\n collateralAddress: tokenInfo.assetAddress,\n collateralDelta: -tokenInfo.marginBalance,\n });\n marginToCover = marginToCover - marginBalanceWithHaircutInRUSD;\n }\n }\n return editCollateralActions;\n }\n\n getUsdNodeMarginInfoPostEditCollaterals(\n editCollateralActions: EditCollateralAction[],\n ) {\n // todo: check if there's a way to simplify this function & deprecate the single edit collateral sim below as it's a\n // subset of this function\n\n // perform deep copy of the object\n const groupedByCollateral: Record<string, AccountAssetBalance> = cloneDeep(\n this.groupedByCollateral,\n );\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n\n // counterfactual update deep copy\n\n for (const action of editCollateralActions) {\n if (groupedByCollateral[action.collateralAddress]) {\n groupedByCollateral[action.collateralAddress] = {\n ...groupedByCollateral[action.collateralAddress],\n amount:\n groupedByCollateral[action.collateralAddress].amount +\n action.collateralDelta,\n };\n } else {\n groupedByCollateral[action.collateralAddress] = {\n accountId: this.accountId,\n collateral: action.collateralAddress,\n amount: action.collateralDelta,\n };\n }\n\n uniqueQuoteCollaterals.add(action.collateralAddress);\n\n if (!this.uniqueTokenAddresses.includes(action.collateralAddress)) {\n uniqueTokenAddresses.push(action.collateralAddress);\n }\n }\n\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n );\n }\n\n getUsdNodeMarginInfoPostEditCollateral(\n collateralDelta: number,\n collateralAddress: string,\n ) {\n // perform deep copy of the object\n const groupedByCollateral: Record<string, AccountAssetBalance> = cloneDeep(\n this.groupedByCollateral,\n );\n\n // counterfactual update deep copy\n if (groupedByCollateral[collateralAddress]) {\n groupedByCollateral[collateralAddress] = {\n ...groupedByCollateral[collateralAddress],\n amount: groupedByCollateral[collateralAddress].amount + collateralDelta,\n };\n } else {\n groupedByCollateral[collateralAddress] = {\n accountId: this.accountId,\n collateral: collateralAddress,\n amount: collateralDelta,\n };\n }\n\n const uniqueQuoteCollaterals = new Set(this.uniqueQuoteCollaterals);\n const tokenMarginInfoPerAsset =\n ExposureCommand.calculateTokenMarginInfoPerAsset(\n groupedByCollateral,\n this.rootCollateralPoolId,\n this.riskMatrices,\n this.riskMultipliers,\n uniqueQuoteCollaterals,\n this.realizedPnLSum,\n this.unrealizedPnLSum,\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n );\n\n const uniqueTokenAddresses = [...this.uniqueTokenAddresses];\n if (!this.uniqueTokenAddresses.includes(collateralAddress)) {\n uniqueTokenAddresses.push(collateralAddress);\n }\n\n return ExposureCommand.getUsdNodeMarginInfo(\n this.rootCollateralPoolId,\n uniqueTokenAddresses,\n this.exchangeInfoPerAsset,\n tokenMarginInfoPerAsset,\n );\n }\n\n static calculateTokenMarginInfoPerAsset(\n groupedByCollateral: Record<string, AccountAssetBalance>,\n rootCollateralPoolId: number,\n riskMatrices: RiskMatrix[],\n riskMultipliers: RiskMultipliersConfiguration,\n uniqueQuoteCollaterals: Set<string>,\n realizedPnLSum: BigNumber,\n unrealizedPnLSum: BigNumber,\n positionInfoMarketConfiguration: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n ): MarginInfo[] {\n const tokenMarginInfoPerAsset: MarginInfo[] = [];\n\n // todo: p2: investigate the ts-expect-error cases below\n // @ts-expect-error no easy way to make sure string can be casted to Lowercase<string> type\n const uniqueQuoteTokens: Lowercase<string>[] = Array.from(\n uniqueQuoteCollaterals,\n );\n\n // @ts-expect-error no easy way to make sure string can be casted to Lowercase<string> type\n const tokenUnion: Set<Lowercase<string>> = new Set([\n ...Object.keys(groupedByCollateral),\n ...uniqueQuoteTokens,\n ]); // get unique union of those arrays\n const uniqueTokenAddresses: Lowercase<string>[] = Array.from(tokenUnion);\n\n for (const token of uniqueTokenAddresses) {\n tokenMarginInfoPerAsset.push(\n ExposureCommand.getTokenMarginInfo(\n rootCollateralPoolId,\n riskMatrices,\n riskMultipliers,\n ExposureCommand.getCollateralInfo(\n token,\n uniqueQuoteCollaterals.has(token) ? realizedPnLSum : BigNumber(0),\n uniqueQuoteCollaterals.has(token) ? unrealizedPnLSum : BigNumber(0),\n groupedByCollateral[token]?.amount || 0,\n ),\n token,\n positionInfoMarketConfiguration,\n oraclePricePerMarket,\n uniqueQuoteTokens,\n ),\n );\n }\n\n return tokenMarginInfoPerAsset;\n }\n static calculateLiquidation(\n marginBalance: number,\n liquidationMarginRequirement: number,\n oraclePrice: number,\n positionBase: number,\n ): BigNumber {\n if (positionBase === 0 || liquidationMarginRequirement === 0) {\n return BigNumber(0);\n }\n const liquidationPrice = BigNumber(oraclePrice).minus(\n BigNumber(marginBalance)\n .minus(liquidationMarginRequirement)\n .div(positionBase),\n );\n\n return BigNumber.max(0, liquidationPrice);\n }\n\n static calculateImpliedLeverage(\n notionalExposure: number,\n oldIMR: number,\n newIMR: number,\n ): number {\n const changeInImr = BigNumber(newIMR).minus(oldIMR);\n\n if (changeInImr.eq(0)) {\n return 0;\n }\n return BigNumber(notionalExposure).div(changeInImr).toNumber();\n }\n\n static combineMarginInfo(\n parentMarginInfo: MarginInfo,\n sonMarginInfo: MarginInfo,\n sonParentExchangeInfo: ExchangeInfo,\n ): MarginInfo {\n return {\n assetAddress: parentMarginInfo.assetAddress,\n marginBalance: BigNumber(parentMarginInfo.marginBalance)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.marginBalance,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n realBalance: BigNumber(parentMarginInfo.realBalance)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.realBalance,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n initialDelta: BigNumber(parentMarginInfo.initialDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.realBalance,\n sonMarginInfo.initialDelta,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n maintenanceDelta: BigNumber(parentMarginInfo.maintenanceDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.maintenanceDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n liquidationDelta: BigNumber(parentMarginInfo.liquidationDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.liquidationDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n dutchDelta: BigNumber(parentMarginInfo.dutchDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.dutchDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n adlDelta: BigNumber(parentMarginInfo.adlDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.adlDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n\n initialBufferDelta: BigNumber(parentMarginInfo.initialBufferDelta)\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n BigNumber.min(\n sonMarginInfo.initialBufferDelta,\n sonMarginInfo.realBalance,\n ).toNumber(),\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n liquidationMarginRequirement: BigNumber(\n parentMarginInfo.liquidationMarginRequirement,\n )\n .plus(\n ExposureCommand.exchangeWithPriceHaircut(\n sonMarginInfo.liquidationMarginRequirement,\n sonParentExchangeInfo.price,\n sonParentExchangeInfo.priceHaircut,\n ),\n )\n .toNumber(),\n };\n }\n\n static getUsdNodeMarginInfo(\n accountCollateralPoolId: number,\n quoteTokens: string[],\n exchangeInfoPerAsset: ExchangeInfo[],\n marginInfoPerToken: MarginInfo[],\n ) {\n let usdNodeMarginInfo: MarginInfo = {\n assetAddress: '',\n marginBalance: 0,\n realBalance: 0,\n initialDelta: 0,\n maintenanceDelta: 0,\n liquidationDelta: 0,\n dutchDelta: 0,\n adlDelta: 0,\n initialBufferDelta: 0,\n liquidationMarginRequirement: 0,\n };\n for (const quoteToken of quoteTokens) {\n const exchangeInfo = exchangeInfoPerAsset.find((exchangeInfo) => {\n return quoteToken === exchangeInfo.tokenAddress;\n });\n\n const marginInfo = marginInfoPerToken.find((marginInfo) => {\n return quoteToken === marginInfo.assetAddress;\n });\n\n if (!exchangeInfo || !marginInfo) {\n throw Error(`Missing exchangeInfo/marginInfo for ${quoteToken}`);\n }\n\n usdNodeMarginInfo = ExposureCommand.combineMarginInfo(\n usdNodeMarginInfo,\n marginInfo,\n exchangeInfo,\n );\n }\n\n return usdNodeMarginInfo;\n }\n static getCollateralInfo(\n collateralAddress: string,\n realisedPnl: BigNumber,\n unrealizedPnL: BigNumber,\n netDeposits: number,\n ): CollateralInfo {\n return {\n netDeposits: netDeposits,\n marginBalance: BigNumber(netDeposits)\n .plus(realisedPnl)\n .plus(unrealizedPnL)\n .toNumber(),\n realBalance: BigNumber(netDeposits).plus(realisedPnl).toNumber(),\n };\n }\n\n static getTokenMarginInfo(\n rootCollateralPoolId: number,\n riskMatrices: RiskMatrix[],\n riskMultipliers: RiskMultipliersConfiguration,\n collateralInfo: CollateralInfo,\n collateralAddress: Lowercase<string>,\n positions: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n uniqueQuoteTokens: string[],\n ): MarginInfo {\n const marginRequirements = {\n liquidationMarginRequirement: 0,\n initialMarginRequirement: 0,\n maintenanceMarginRequirement: 0,\n dutchMarginRequirement: 0,\n adlMarginRequirement: 0,\n initialBufferMarginRequirement: 0,\n };\n if (uniqueQuoteTokens.includes(collateralAddress)) {\n // uniqueQuoteTokens is list is active markets tokens\n for (const riskMatrix of riskMatrices) {\n const filledExposures = ExposureCommand.getBlockExposures(\n positions,\n oraclePricePerMarket,\n riskMatrix.risk_block_id,\n );\n\n marginRequirements.liquidationMarginRequirement = BigNumber(\n marginRequirements.liquidationMarginRequirement,\n )\n .plus(\n ExposureCommand.computeLiquidationMarginRequirement(\n riskMatrix.matrix,\n filledExposures,\n ),\n )\n .toNumber();\n }\n\n // Get the initial margin requirement\n marginRequirements.initialMarginRequirement = amountNormalizer(\n String(riskMultipliers.im_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n // Get the maintenance margin requirement\n marginRequirements.maintenanceMarginRequirement = amountNormalizer(\n String(riskMultipliers.mmr_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n // Get the dutch margin requirement\n marginRequirements.dutchMarginRequirement = amountNormalizer(\n String(riskMultipliers.dutch_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n\n // Get the adl margin requirement\n marginRequirements.adlMarginRequirement = amountNormalizer(\n String(riskMultipliers.adl_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n\n // Get the initial buffer margin requirement\n marginRequirements.initialBufferMarginRequirement = amountNormalizer(\n String(riskMultipliers.im_buffer_multiplier),\n )\n .multipliedBy(marginRequirements.liquidationMarginRequirement)\n .toNumber();\n }\n return {\n assetAddress: collateralAddress,\n marginBalance: collateralInfo.marginBalance,\n realBalance: collateralInfo.realBalance,\n initialDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.initialMarginRequirement)\n .toNumber(),\n maintenanceDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.maintenanceMarginRequirement)\n .toNumber(),\n liquidationDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.liquidationMarginRequirement)\n .toNumber(),\n dutchDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.dutchMarginRequirement)\n .toNumber(),\n adlDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.adlMarginRequirement)\n .toNumber(),\n initialBufferDelta: BigNumber(collateralInfo.marginBalance)\n .minus(marginRequirements.initialBufferMarginRequirement)\n .toNumber(),\n liquidationMarginRequirement:\n marginRequirements.liquidationMarginRequirement,\n };\n }\n\n static computeLiquidationMarginRequirement(\n matrix: BigNumber[][],\n filledExposures: BigNumber[],\n ): number {\n let lmrFilledSquared = 0;\n\n for (let i = 0; i < filledExposures.length; i++) {\n if (BigNumber(filledExposures[i]).eq(0)) {\n continue;\n }\n for (let j = 0; j < filledExposures.length; j++) {\n const riskParam = matrix[i][j];\n\n if (BigNumber(filledExposures[j]).eq(0) || BigNumber(riskParam).eq(0)) {\n continue;\n }\n\n lmrFilledSquared = BigNumber(lmrFilledSquared)\n .plus(\n BigNumber(filledExposures[i])\n .multipliedBy(filledExposures[j])\n .multipliedBy(riskParam),\n )\n .toNumber();\n }\n }\n return BigNumber(lmrFilledSquared).sqrt().toNumber();\n }\n\n static getBlockExposures(\n positions: PositionInfoMarketConfiguration[],\n oraclePricePerMarket: MarketIdToOraclePriceMap,\n riskBlockId: number,\n ): BigNumber[] {\n const filledExposures: number[] = [];\n let maxIndex = 0; // Keep track of the highest riskMatrixIndex encountered\n\n for (const position of positions) {\n if (riskBlockId !== position.risk_block_id) continue;\n const marketFilledExposure = ExposureCommand.getAccountFilledExposures(\n position,\n position.market_configuration,\n oraclePricePerMarket[position.market_id],\n );\n const index = marketFilledExposure.riskMatrixIndex;\n filledExposures[index] = BigNumber(filledExposures[index] || 0)\n .plus(marketFilledExposure.exposure)\n .toNumber();\n\n if (index > maxIndex) maxIndex = index;\n }\n\n // Ensure filledExposures array is correctly populated up to maxIndex\n for (let i = 0; i <= maxIndex; i++) {\n if (filledExposures[i] === undefined) {\n filledExposures[i] = 0;\n }\n }\n return filledExposures.map((num) => BigNumber(num));\n }\n\n static getAccountFilledExposures(\n position: PositionInfo,\n marketConfiguration: MarketConfiguration,\n oraclePrice: number,\n ) {\n const base = position.base;\n return {\n exposure: BigNumber(oraclePrice).multipliedBy(base),\n riskMatrixIndex: BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber(),\n };\n }\n\n static computePricePnL(\n openBase: BigNumber,\n openPrice: BigNumber,\n exitPrice: BigNumber,\n ) {\n return BigNumber(\n BigNumber(exitPrice).minus(openPrice).multipliedBy(openBase),\n );\n }\n\n static getMarginRatio(\n marginInfo: Pick<\n MarginInfo,\n 'marginBalance' | 'liquidationMarginRequirement'\n >,\n ) {\n if (marginInfo.liquidationMarginRequirement === 0) {\n return 0;\n }\n\n if (marginInfo.marginBalance <= 0) {\n return 1;\n }\n\n const health = BigNumber(marginInfo.liquidationMarginRequirement).div(\n marginInfo.marginBalance,\n );\n\n if (health.gt(1)) {\n return 1;\n }\n return health.toNumber();\n }\n\n static exchangeWithPriceHaircut(\n quantity: number,\n price: number,\n haircut: number,\n ) {\n // For positive quantities, the haircut is `quantity * (1 - haircut)`\n // For negative values, the haircut is `quantity / (1 - haircut)` because a negative value means the haircut should be applied from B to A.\n const calHelper = BigNumber(quantity).gt(0)\n ? BigNumber(1).minus(haircut)\n : BigNumber(1).div(BigNumber(1).minus(haircut));\n const haircutPrice = BigNumber(price).multipliedBy(calHelper);\n\n return haircutPrice.multipliedBy(quantity).toNumber();\n }\n\n static reverseExchangeWithPriceHaircut(\n quantity: number,\n price: number,\n haircut: number,\n ) {\n /*\n * this operation takes quantity in rUSD terms, price between collateral token (e.g. weth) and rusd\n * alongside the haircut between weth and rusd\n * it then returns a quantity in collateral token terms (e.g. weth) which would return quantity if it were to be\n * passed through the exchangeWithPriceHaircut function\n * */\n // todo: p2: consider abstracting haircut price calculation into separate function as duplciated\n // For positive quantities, the haircut is `quantity * (1 - haircut)`\n // For negative values, the haircut is `quantity / (1 - haircut)` because a negative value means the haircut should be applied from B to A.\n const calHelper = BigNumber(quantity).gt(0)\n ? BigNumber(1).minus(haircut)\n : BigNumber(1).div(BigNumber(1).minus(haircut));\n const haircutPrice = BigNumber(price).multipliedBy(calHelper);\n\n return BigNumber(quantity).dividedBy(haircutPrice).toNumber();\n }\n\n static getBalanceWithHaircut(\n exchangeInfoPerAsset: ExchangeInfo[],\n assetAddress: string,\n marginBalance: number,\n ) {\n // todo: p1: haircut and exchange rate adjustment should not be done for rUSD\n // does exchangeInfo currently return haircut as zero and price as 1?\n // todo: p2: can just look at net deposits rather than margin balance for non-rusd as non pnl\n\n const exchangeInfo = exchangeInfoPerAsset.find((exchangeInfo) => {\n return assetAddress === exchangeInfo.tokenAddress;\n });\n\n if (!exchangeInfo) {\n throw new Error(\n 'Unable to retrieve exchange info when calculating collaterals needed to cover margin',\n );\n }\n\n return ExposureCommand.exchangeWithPriceHaircut(\n marginBalance,\n exchangeInfo.price,\n exchangeInfo.priceHaircut,\n );\n }\n\n /**\n * @audit This function uses a linear approximation that is not aligned with the on-chain\n * exponential logPriceMultiplier pricing logic (PriceMultiplier.sol). The intention is to\n * deprecate this function completely once downstream consumers (PoolLiquidityCommand,\n * updateLiquidity.task, marketDataLiquidity.task) are migrated.\n */\n getSlippage(\n deltaBase: number,\n marketConfiguration: MarketConfiguration,\n marketStorage: MarketStorage,\n ): number {\n const deltaExposure = BigNumber(\n this.oraclePricePerMarket[marketConfiguration.market_id],\n )\n .times(deltaBase)\n .toNumber();\n\n const riskMatrixIndex = BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber();\n\n // isPool is true as we only get slippage for the pool\n const { maxExposureShort, maxExposureLong, exposures } =\n this.getMaxExposure(marketConfiguration, marketStorage, true);\n\n const netExposure = exposures[riskMatrixIndex].plus(deltaExposure);\n const maxExposure = netExposure.lt(0) ? maxExposureShort : maxExposureLong;\n\n return BigNumber(netExposure)\n .negated()\n .div(\n BigNumber(maxExposure)\n .times(amountNormalizer(marketConfiguration.depth_factor))\n .plus(netExposure),\n )\n .toNumber();\n }\n\n getMaxExposure(\n marketConfiguration: MarketConfiguration,\n marketStorage: MarketStorage,\n isPool: boolean,\n ) {\n // todo: p2: cosider turning this into a hashmap vs. an array so that O(1) access\n const riskMatrix = this.riskMatrices.find((riskMatrix) => {\n return (\n riskMatrix.risk_block_id ===\n BigNumber(String(marketStorage.risk_block_id)).toNumber()\n );\n });\n\n if (!riskMatrix) {\n throw new Error(\"RiskMatrix Doesn't exist\");\n }\n\n const riskMatrixIndex = BigNumber(\n String(marketConfiguration.risk_matrix_index),\n ).toNumber();\n\n let imrMultiplier;\n if (isPool) {\n imrMultiplier = POOL_IMR;\n } else {\n imrMultiplier = amountNormalizer(\n String(this.riskMultipliers.im_multiplier),\n ).toNumber();\n }\n\n const marginInfo = this.tokenMarginInfoPerAsset.find((marginInfo) => {\n return marginInfo.assetAddress === marketStorage.quote_collateral;\n });\n\n if (!marginInfo) {\n throw new Error(\"marginInfo doesn't exist\");\n }\n\n const exposures = ExposureCommand.getBlockExposures(\n this.positionInfoMarketConfiguration,\n this.oraclePricePerMarket,\n BigNumber(String(marketStorage.risk_block_id)).toNumber(),\n );\n\n const { maxExposureShort, maxExposureLong } =\n ExposureCommand.computeMaxExposures(\n riskMatrix.matrix,\n exposures,\n marginInfo.liquidationMarginRequirement,\n marginInfo.marginBalance < 0 ? 0 : marginInfo.marginBalance,\n imrMultiplier,\n riskMatrixIndex,\n );\n\n return {\n maxExposureShort,\n maxExposureLong,\n exposures,\n riskMatrixIndex,\n };\n }\n\n static computeMaxExposures(\n riskMatrix: BigNumber[][],\n exposures: BigNumber[],\n lmr: number,\n balance: number,\n imrMultiplier: number,\n exposureIndex: number,\n ) {\n let b = BigNumber(0);\n\n for (let i = 0; i < exposures.length; i++) {\n b = BigNumber(b).plus(\n BigNumber(exposures[i]).multipliedBy(\n BigNumber(riskMatrix[exposureIndex][i]).plus(\n riskMatrix[i][exposureIndex],\n ),\n ),\n );\n }\n const { x1, x2 } = this.solveQuadraticEquation(\n BigNumber(riskMatrix[exposureIndex][exposureIndex]).toNumber(), // changes here\n b.toNumber(),\n this.computeC(lmr, balance, imrMultiplier),\n );\n\n const maxShortExposure = BigNumber(x1).plus(exposures[exposureIndex]);\n const maxLongExposure = BigNumber(x2).plus(exposures[exposureIndex]);\n\n const availableShortExposure = maxShortExposure.lt(0)\n ? maxShortExposure.negated().toNumber()\n : 0;\n\n const availableLongExposure = maxLongExposure.gt(0)\n ? maxLongExposure.toNumber()\n : 0;\n\n return {\n maxExposureShort: availableShortExposure,\n maxExposureLong: availableLongExposure,\n };\n }\n\n static solveQuadraticEquation(a: number, b: number, c: number) {\n if (BigNumber(a).eq(0)) {\n throw new Error('ZeroQuadraticCoefficient');\n }\n\n const delta = BigNumber(b)\n .multipliedBy(b)\n .minus(BigNumber(4).multipliedBy(a).multipliedBy(c));\n\n if (delta.lt(0)) {\n return {\n x1: BigNumber(0),\n x2: BigNumber(0),\n };\n }\n\n const rootDelta = delta.sqrt();\n\n const x1 = BigNumber(b)\n .multipliedBy(-1)\n .minus(rootDelta)\n .div(BigNumber(2).multipliedBy(a));\n\n const x2 = BigNumber(b)\n .multipliedBy(-1)\n .plus(rootDelta)\n .div(BigNumber(2).multipliedBy(a));\n\n return {\n x1,\n x2,\n };\n }\n\n static computeC(lmr: number, balance: number, imrMultiplier: number): number {\n const lmrSD = BigNumber(lmr);\n const lmrSquared = lmrSD.multipliedBy(lmrSD);\n\n const balanceSD = BigNumber(balance);\n const balanceSquared = balanceSD.multipliedBy(balanceSD);\n\n const imrMultiplierSD = BigNumber(imrMultiplier);\n const imrMultiplierSquared = imrMultiplierSD.multipliedBy(imrMultiplierSD);\n\n return lmrSquared\n .minus(balanceSquared.div(imrMultiplierSquared))\n .toNumber();\n }\n\n static calculateRebalancingOrderBase({\n poolBasePreTrade,\n orderBase,\n }: {\n poolBasePreTrade: number;\n orderBase: number;\n }): number {\n if (poolBasePreTrade > 0) {\n if (orderBase < 0) {\n return 0;\n }\n\n return Math.min(poolBasePreTrade, orderBase);\n }\n\n if (orderBase > 0) {\n return 0;\n }\n\n return Math.max(poolBasePreTrade, orderBase);\n }\n\n static calculateFee({\n oraclePrice,\n poolBasePreTrade,\n orderBase,\n feeParameter,\n rebalancingFeeParameter,\n }: {\n oraclePrice: number;\n poolBasePreTrade: number;\n orderBase: number;\n feeParameter: BigNumber;\n rebalancingFeeParameter: BigNumber;\n }): {\n rebalancingFee: number;\n imbalancingFee: number;\n fee: number;\n } {\n const rebalancingOrderBase = this.calculateRebalancingOrderBase({\n poolBasePreTrade,\n orderBase,\n });\n\n const imbalancingOrderBase = orderBase - rebalancingOrderBase;\n\n const imbalancingFee = BigNumber(oraclePrice)\n .times(imbalancingOrderBase)\n .times(feeParameter)\n .abs()\n .toNumber();\n\n const rebalancingFee = BigNumber(oraclePrice)\n .times(rebalancingOrderBase)\n .times(rebalancingFeeParameter)\n .abs()\n .toNumber();\n\n return {\n imbalancingFee,\n rebalancingFee,\n fee: imbalancingFee + rebalancingFee,\n };\n }\n\n static calculateEstimatedPrice(price: number, slippage: number): number {\n return BigNumber(price).times(BigNumber(1).plus(slippage)).toNumber();\n }\n\n static evaluateHealthStatus(marginRatioPercentage: number) {\n if (marginRatioPercentage >= MA_HEALTH_DANGER_THRESHOLD) {\n return 'danger';\n } else if (marginRatioPercentage >= MA_HEALTH_WARNING_THRESHOLD) {\n return 'warning';\n } else {\n return 'healthy';\n }\n }\n\n static getFundingPeriods(lastFundingTimeStamp: BigNumber) {\n const secondsElapsed = BigNumber(Date.now() / 1000).minus(\n lastFundingTimeStamp,\n );\n const ONE_DAY_IN_SECONDS = 86400;\n return BigNumber(secondsElapsed).div(ONE_DAY_IN_SECONDS);\n }\n\n static getHourlyFundingPeriods(lastFundingTimeStamp: BigNumber) {\n const secondsElapsed = BigNumber(Date.now() / 1000).minus(\n lastFundingTimeStamp,\n );\n const ONE_HOUR_IN_SECONDS = 3600;\n return BigNumber(secondsElapsed).div(ONE_HOUR_IN_SECONDS);\n }\n\n static getFundingRateDelta(\n fundingPeriods: BigNumber,\n lastFundingVelocity: BigNumber,\n ) {\n return lastFundingVelocity.multipliedBy(fundingPeriods);\n }\n\n static getCurrentFundingRate(\n last_funding_timestamp: BigNumber,\n lastFundingVelocity: BigNumber,\n lastFundingRate: BigNumber,\n ) {\n const fundingPeriods = ExposureCommand.getFundingPeriods(\n last_funding_timestamp,\n );\n const fundingRateDelta = ExposureCommand.getFundingRateDelta(\n fundingPeriods,\n lastFundingVelocity,\n );\n\n return lastFundingRate.plus(fundingRateDelta);\n }\n\n static getCurrentHourlyFundingRate(\n last_funding_timestamp: BigNumber,\n lastFundingVelocity: BigNumber,\n lastFundingRate: BigNumber,\n ) {\n const dailyFundingRate = this.getCurrentFundingRate(\n last_funding_timestamp,\n lastFundingVelocity,\n lastFundingRate,\n );\n return dailyFundingRate.div(24);\n }\n\n static getCurrentFundingValue(\n spotPrice: BigNumber,\n lastFundingValue: BigNumber,\n baseMultiplier: BigNumber,\n currentHourlyFundingRate: BigNumber,\n previousDailyFundingRate: BigNumber,\n lastFundingTimestamp: BigNumber,\n ) {\n const hourlyFundingPeriods =\n this.getHourlyFundingPeriods(lastFundingTimestamp);\n\n const previousHourlyFundingRate = previousDailyFundingRate.div(24);\n\n return lastFundingValue.plus(\n baseMultiplier\n .times(spotPrice)\n .times(previousHourlyFundingRate.plus(currentHourlyFundingRate).div(2))\n .times(hourlyFundingPeriods),\n );\n }\n\n convertToUsd(amount: number, tokenAddress: string): number {\n return BigNumber(amount)\n .times(this.collateralAddressToExchangePrice[tokenAddress])\n .toNumber();\n }\n\n getExchangeRate(tokenAddress: string): number {\n return this.collateralAddressToExchangePrice[tokenAddress];\n }\n\n get realisedPnl() {\n return this.realizedPnLSum.toNumber();\n }\n\n get unRealisedPnl() {\n return this.unrealizedPnLSum.toNumber();\n }\n\n get accountTotalBalanceUsd() {\n let accountTotalBalance = 0;\n\n for (const collateralAsset of this.tokenMarginInfoPerAsset) {\n const collateralPrice =\n this.collateralAddressToExchangePrice[collateralAsset.assetAddress] ||\n 0;\n\n const balanceInUSD = BigNumber(collateralPrice)\n .times(collateralAsset.marginBalance)\n .toNumber();\n accountTotalBalance += balanceInUSD;\n }\n\n return accountTotalBalance;\n }\n\n get accountTotalBalanceWithHaircutUsd() {\n let accountTotalBalance = 0;\n\n for (const collateralAsset of this.tokenMarginInfoPerAsset) {\n const collateralPriceWithHaircut = ExposureCommand.getBalanceWithHaircut(\n this.exchangeInfoPerAsset,\n collateralAsset.assetAddress,\n collateralAsset.marginBalance,\n );\n\n accountTotalBalance += collateralPriceWithHaircut;\n }\n\n return accountTotalBalance;\n }\n\n getMtmRpnlSum() {\n return this.mtmRpnlSum.toNumber();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"trading-api-types.js","sourceRoot":"/","sources":["trading-api-types.ts"],"names":[],"mappings":";;;AAYa,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC","sourcesContent":["import { ParamsDictionary, Query } from 'express-serve-static-core';\nimport { AssetPair, CollateralPrice, MarketPrice } from './types';\nimport {\n AddressParam,\n ApiEndpoint,\n ApiInfiniteListEndpoint,\n ApiListEndpoint,\n Decimal,\n PaginatedQueryParams,\n Stringified,\n} from './api-types';\n\nexport const AccountStatusValues = {\n OPEN: 'OPEN',\n CLOSED: 'CLOSED',\n};\n\nexport type AccountStatus =\n (typeof AccountStatusValues)[keyof typeof AccountStatusValues];\n\ntype CandleResolution = '1' | '5' | '15' | '30' | '60' | '240' | '1D';\n\ntype Candle = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n assetPairId: AssetPair;\n resolution: CandleResolution;\n};\n\ntype Order = {\n id: string;\n market_id: Decimal | null;\n account_id: Decimal | null;\n executed_base: Decimal | null;\n fee: Decimal | null;\n price: Decimal | null;\n is_match_order: boolean | null;\n liquidation_type: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n event_sequence_number: bigint | null;\n exchange_id: Decimal | null;\n created_at: Date;\n counterparty_account_id: Decimal | null;\n counterparty_adl_unwind_price: Decimal | null;\n counterparty_average_entry_funding_value: Decimal | null;\n counterparty_base: Decimal | null;\n counterparty_base_multiplier: Decimal | null;\n counterparty_funding_value: Decimal | null;\n counterparty_last_price: Decimal | null;\n counterparty_last_price_timestamp: Decimal | null;\n counterparty_realized_pnl: Decimal | null;\n counterparty_session: Decimal | null;\n position_adl_unwind_price: Decimal | null;\n position_average_entry_funding_value: Decimal | null;\n position_base: Decimal | null;\n position_base_multiplier: Decimal | null;\n position_funding_value: Decimal | null;\n position_last_price: Decimal | null;\n position_last_price_timestamp: Decimal | null;\n position_realized_pnl: Decimal | null;\n position_session: Decimal | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n};\n\ntype Position = {\n market_id: Decimal;\n account_id: Decimal;\n base: Decimal | null;\n realized_pnl: Decimal | null;\n last_price: Decimal | null;\n last_price_timestamp: Decimal | null;\n funding_value: Decimal | null;\n base_multiplier: Decimal | null;\n adl_unwind_price: Decimal | null;\n average_entry_funding_value: Decimal | null;\n session: Decimal | null;\n exchange_id: Decimal | null;\n event_sequence_number: bigint | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n adjusted_base: Decimal | null;\n adl_realized_pnl: Decimal | null;\n};\n\ntype ConditionalOrder = {\n id: string;\n account_id: Decimal;\n market_id: Decimal;\n order_type: string;\n is_long: boolean;\n trigger_price: number;\n order_base: Decimal;\n status: string;\n creation_timestamp_ms: bigint;\n last_update_timestamp_ms: bigint;\n transaction_hash: string | null;\n};\n\ntype ConditionalOrderSensitive = ConditionalOrder & {\n exchange_id: bigint;\n inputs: string;\n counterparty_account_id: bigint;\n reya_chain_id: bigint;\n deadline: bigint;\n signer_address: string;\n nonce: Decimal;\n signature: string;\n};\n\ntype Market = {\n id: Decimal;\n assetPairId: AssetPair;\n ticker: string;\n isActive: boolean;\n maxLeverage: number;\n description: string;\n name: string;\n tickSizeDecimals: number;\n priority: number;\n underlyingAssetId: string;\n quoteTokenId: string;\n};\n\ntype Account = {\n account_id: Decimal;\n name: string;\n status: AccountStatus;\n updated_timestamp_ms: Decimal;\n source: string | null;\n};\n\ntype AccountBalance = {\n account_id: Decimal | null;\n collateral: string | null;\n balance?: Decimal | null;\n delta?: Decimal | null;\n};\n\ntype spot_execution = {\n account_id: Decimal;\n counterparty_account_id: Decimal;\n exchange_id: Decimal;\n executed_base: Decimal;\n price: Decimal;\n account_order_id: bigint;\n counterparty_order_id: bigint;\n spot_market_id: Decimal;\n is_auto_exchange: boolean;\n is_long: boolean;\n event_sequence_number: bigint;\n parent_event_sequence_number: bigint | null;\n block_timestamp: Decimal;\n block_number: Decimal;\n transaction_hash: string;\n created_at: string;\n};\n\ntype account_real_balance = {\n account_id: Decimal;\n collateral: string;\n balance: Decimal;\n rpnl: Decimal;\n event_sequence_number: bigint | null;\n transfer_event_sequence_number: bigint | null;\n parent_event_sequence_number: bigint | null;\n block_timestamp: Decimal;\n block_number: Decimal;\n transaction_hash: string;\n};\n\ntype AutoExchange = {\n id: string;\n liquidated_account_id: Decimal | null;\n liquidator_account_id: Decimal | null;\n requested_quote_amount: Decimal | null;\n collateral_out_address: string | null;\n collateral_in_address: string | null;\n collateral_amount_to_liquidator: Decimal | null;\n quote_amount_to_insurance_fund: Decimal | null;\n quote_amount_to_account: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n transaction_hash: string;\n unique_id: bigint | null;\n};\n\ntype Leverage = {\n accountId: Decimal;\n marketId: Decimal;\n leverage: number;\n createdAt: Date;\n updatedAt: Date;\n};\n\ntype WalletStats = {\n volume_14d: Decimal;\n};\n\ntype MarketData = {\n marketId: string;\n updatedAt: number;\n longOI: number;\n shortOI: number;\n longSkewPercentage: number;\n shortSkewPercentage: number;\n openInterest?: number;\n fundingRate?: number;\n fundingRateVelocity?: number;\n longFundingValue?: number;\n shortFundingValue?: number;\n last24hVolume: number;\n priceChange24H?: number;\n priceChange24HPercentage?: number;\n maxAmountBaseLong?: number;\n maxAmountSizeLong?: number;\n maxAmountBaseShort?: number;\n maxAmountSizeShort?: number;\n oraclePrice?: number;\n poolPrice?: number;\n pricesUpdatedAt?: number;\n longBaseMultiplier?: number;\n shortBaseMultiplier?: number;\n longAdlUnwindPrice?: number;\n shortAdlUnwindPrice?: number;\n};\n\ntype MarketTrackers = {\n market_data_id: Decimal;\n passive_pool_id: Decimal | null;\n pool_account_id: Decimal | null;\n quote_token: string | null;\n quote_token_decimals: Decimal | null;\n last_funding_velocity: Decimal | null;\n last_funding_timestamp: Decimal | null;\n last_mtm_price: Decimal | null;\n last_mtm_timestamp: Decimal | null;\n long_trackers_funding_value: Decimal | null;\n last_funding_rate: Decimal | null;\n long_trackers_base_multiplier: Decimal | null;\n long_trackers_adl_unwind_price: Decimal | null;\n short_trackers_funding_value: Decimal | null;\n short_trackers_base_multiplier: Decimal | null;\n short_trackers_adl_unwind_price: Decimal | null;\n open_interest: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n};\n\nexport type TradingApiReplication<\n ReplicationTable extends ReplicationModel = never,\n Replication = never,\n> = {\n replication: ReplicationTable extends never\n ? never\n : GenericReplicationMessage<Replication, ReplicationTable>;\n};\n\nexport type TradingApiEndpoint<\n Response,\n Params,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = never,\n> = ApiEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiListEndpoint<\n Response,\n Params = never,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = never,\n> = ApiListEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiInfiniteListEndpoint<\n Response,\n Params = never,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = PaginatedQueryParams,\n> = ApiInfiniteListEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiSource = {\n 'poolBalance/:poolId': TradingApiEndpoint<\n {\n id: number;\n timestamp: bigint;\n pool_id: number;\n value: Decimal;\n apy: Decimal;\n share_price: Decimal;\n share_price_index: Decimal;\n } | null,\n {\n poolId?: string;\n }\n >;\n 'wallet/:address/leverages': TradingApiListEndpoint<\n Leverage,\n { address: string },\n 'accountLeveragePerMarket'\n >;\n markets: TradingApiListEndpoint<Market>;\n 'markets/data': TradingApiListEndpoint<MarketData, never, 'marketData'>;\n 'markets/configuration': TradingApiListEndpoint<{\n market_id: Decimal;\n risk_matrix_index: Decimal | null;\n max_open_base: Decimal | null;\n velocity_multiplier: Decimal | null;\n minimum_order_base: Decimal | null;\n base_spacing: Decimal | null;\n price_spacing: Decimal | null;\n oracle_node_id: string | null;\n mtm_window: Decimal | null;\n dutch_config_lambda: Decimal | null;\n dutch_config_min_base: Decimal | null;\n slippage_params_phi: Decimal | null;\n slippage_params_beta: Decimal | null;\n depth_factor: Decimal | null;\n max_exposure_factor: Decimal | null;\n max_p_slippage: Decimal | null;\n price_spread: Decimal | null;\n volatility_index_multiplier: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'markets/storage': TradingApiListEndpoint<{\n market_id: Decimal;\n quote_collateral: string | null;\n instrument_address: string | null;\n name: string | null;\n risk_block_id: Decimal | null;\n collateral_pool_id: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'markets/trackers': TradingApiListEndpoint<\n MarketTrackers,\n never,\n 'marketTrackers'\n >;\n 'market/:marketId/trackers': TradingApiEndpoint<\n MarketTrackers,\n {\n marketId: string;\n },\n 'marketTrackers'\n >;\n 'market/:marketId': TradingApiEndpoint<\n Market,\n {\n marketId: string;\n }\n >;\n 'market/:marketId/data': TradingApiEndpoint<\n MarketData,\n {\n marketId: string;\n },\n 'marketData'\n >;\n 'market/:marketId/trades': TradingApiInfiniteListEndpoint<\n Order,\n {\n marketId: string;\n },\n 'orders'\n >;\n 'wallet/:address/positions': TradingApiListEndpoint<\n Position,\n AddressParam,\n 'position',\n Omit<Position, 'adjusted_base' | 'adl_realized_pnl'>\n >;\n 'wallet/:address/openOrders': TradingApiListEndpoint<\n ConditionalOrder,\n AddressParam,\n 'ConditionalOrders'\n >;\n assets: TradingApiListEndpoint<{\n address: string;\n name: string;\n short: string;\n createdAt: Date;\n updatedAt: Date;\n asset_price_contract_id: string | null;\n asset_price_usdc_contract_id: string | null;\n decimals: number;\n }>;\n prices: TradingApiEndpoint<\n Partial<Record<AssetPair, MarketPrice | CollateralPrice>>,\n never\n >;\n 'prices/:assetPairId': TradingApiEndpoint<\n MarketPrice | CollateralPrice | undefined,\n {\n assetPairId: string;\n },\n 'price'\n >;\n 'wallet/:address/accounts': TradingApiListEndpoint<\n Account,\n AddressParam,\n 'AccountProfile'\n >;\n 'wallet/:address/accounts/tiers': TradingApiListEndpoint<\n {\n market_id: Decimal;\n account_id: Decimal;\n tier_id: Decimal | null;\n },\n AddressParam\n >;\n 'wallet/:address/accounts/balances': TradingApiListEndpoint<\n AccountBalance,\n AddressParam,\n 'account_balances'\n >;\n 'wallet/:address/autoExchange': TradingApiInfiniteListEndpoint<\n AutoExchange,\n AddressParam,\n 'auto_exchange'\n >;\n 'wallet/:address/balanceHistory/:timestamp': TradingApiListEndpoint<\n {\n timestamp: number;\n balance: number;\n },\n {\n address: string;\n timestamp: string;\n }\n >;\n 'wallet/:address/trades': TradingApiInfiniteListEndpoint<\n Order,\n {\n address: string;\n },\n 'order_history'\n >;\n 'wallet/:address/trades/:type': TradingApiInfiniteListEndpoint<\n Order,\n {\n address: string;\n type?: 'matchOrder' | 'liquidation';\n },\n 'order_history'\n >;\n riskMatrices: TradingApiListEndpoint<\n {\n blockId: Decimal;\n matrix: string[][];\n },\n {\n poolId: string;\n }\n >;\n tierFees: TradingApiListEndpoint<{\n market_id: Decimal;\n tier_id: Decimal;\n fee_parameter: Decimal | null;\n }>;\n collateralConfiguration: TradingApiListEndpoint<{\n assetPairId?: AssetPair;\n name?: string;\n collateral_pool_id: Decimal;\n collateral_address: string;\n price_haircut: Decimal | null;\n auto_exchange_discount: Decimal | null;\n oracle_node_id: string | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'candle/:assetPairId/:resolution': TradingApiEndpoint<\n Candle | null,\n {\n resolution: CandleResolution;\n assetPairId: AssetPair;\n },\n 'storkPriceCandle',\n Candle\n >;\n 'candles/:assetPairId/:resolution': TradingApiEndpoint<\n {\n t: number[];\n o: number[];\n h: number[];\n l: number[];\n c: number[];\n },\n {\n resolution: CandleResolution;\n assetPairId: AssetPair;\n },\n never,\n never,\n {\n to: string;\n from: string;\n countBack?: string;\n }\n >;\n feeTierParameters: TradingApiListEndpoint<{\n tier_id: Decimal;\n taker_fee: Decimal;\n maker_fee: Decimal;\n volume: Decimal;\n }>;\n globalFeeParameters: TradingApiEndpoint<\n {\n og_discount: Decimal;\n vltz_discount: Decimal;\n referee_discount: Decimal;\n referrer_rebate: Decimal;\n affiliate_referrer_rebate: Decimal;\n },\n never\n >;\n 'wallet/:address/configuration': TradingApiEndpoint<\n {\n tier_id: Decimal;\n og_status: boolean;\n vltz_status: boolean;\n affiliate_status: boolean;\n referee_status: boolean;\n spread_discount_status: boolean;\n main_account_id: Decimal;\n },\n {\n address: string;\n }\n >;\n 'wallet/:address/stats': TradingApiEndpoint<\n WalletStats,\n {\n address: string;\n }\n >;\n 'wallet/:address/apiWalletStatus': TradingApiEndpoint<\n {\n enabledApiWallets: string[];\n },\n {\n address: string;\n }\n >;\n};\n\nexport type Req<P = ParamsDictionary, ReqQuery = Query> = {\n params: P;\n query: ReqQuery;\n};\n\nexport type TradingApi = {\n [K in keyof TradingApiSource as K]: {\n params: TradingApiSource[K]['params'];\n query: TradingApiSource[K]['query'];\n response: Stringified<TradingApiSource[K]['response']>;\n replication: Stringified<TradingApiSource[K]['replication']>;\n };\n};\n\ntype ReplicationModel = string | never;\n\nexport type GenericReplicationMessage<T, model extends ReplicationModel> =\n | {\n model: model;\n result: T;\n operation: 'create' | 'update' | 'upsert' | 'delete';\n }\n | {\n model: model;\n result: T[];\n operation: 'updateMany';\n }\n | {\n model: model;\n result: T[];\n operation: 'createMany';\n };\n\ntype account_collateral_balance_entries = {\n id: string;\n account_id: Decimal | null;\n collateral: string | null;\n amount: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n};\n\ntype account_owner_updated_snapshot = {\n account_id: Decimal;\n transaction_hash: string;\n new_owner: string | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n};\n\ntype positions_migration = {\n market_id: Decimal;\n account_id: Decimal;\n base: Decimal | null;\n realized_pnl: Decimal | null;\n last_price: Decimal | null;\n last_price_timestamp: Decimal | null;\n funding_value: Decimal | null;\n base_multiplier: Decimal | null;\n adl_unwind_price: Decimal | null;\n average_entry_funding_value: Decimal | null;\n session: Decimal | null;\n exchange_id: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n event_sequence_number: bigint | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n};\n\ntype ReplicationMessage =\n // Extract the union of all `replication` values from TradingApiSource\n | Exclude<TradingApiSource[keyof TradingApiSource]['replication'], never>\n // add messages that do not exists in TradingApiSource\n | GenericReplicationMessage<\n account_owner_updated_snapshot,\n 'account_owner_updated_snapshot'\n >\n | GenericReplicationMessage<\n account_collateral_balance_entries,\n 'account_collateral_balance_entries'\n >\n | GenericReplicationMessage<account_real_balance, 'account_real_balances'>\n | GenericReplicationMessage<\n ConditionalOrderSensitive,\n 'ConditionalOrdersSensitive'\n >\n | GenericReplicationMessage<\n // Todo: remove after migration\n positions_migration,\n 'positions_migration'\n >\n | GenericReplicationMessage<spot_execution, 'spot_executions'>;\n\nexport type Replication = {\n [K in ReplicationMessage as `replication:${K['model']}`]: Extract<\n ReplicationMessage,\n { model: K['model'] }\n >;\n};\n"]}
1
+ {"version":3,"file":"trading-api-types.js","sourceRoot":"/","sources":["trading-api-types.ts"],"names":[],"mappings":";;;AAYa,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAC","sourcesContent":["import { ParamsDictionary, Query } from 'express-serve-static-core';\nimport { AssetPair, CollateralPrice, MarketPrice } from './types';\nimport {\n AddressParam,\n ApiEndpoint,\n ApiInfiniteListEndpoint,\n ApiListEndpoint,\n Decimal,\n PaginatedQueryParams,\n Stringified,\n} from './api-types';\n\nexport const AccountStatusValues = {\n OPEN: 'OPEN',\n CLOSED: 'CLOSED',\n};\n\nexport type AccountStatus =\n (typeof AccountStatusValues)[keyof typeof AccountStatusValues];\n\ntype CandleResolution = '1' | '5' | '15' | '30' | '60' | '240' | '1D';\n\ntype Candle = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n assetPairId: AssetPair;\n resolution: CandleResolution;\n};\n\ntype Order = {\n id: string;\n market_id: Decimal | null;\n account_id: Decimal | null;\n executed_base: Decimal | null;\n fee: Decimal | null;\n price: Decimal | null;\n is_match_order: boolean | null;\n liquidation_type: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n event_sequence_number: bigint | null;\n exchange_id: Decimal | null;\n created_at: Date;\n counterparty_account_id: Decimal | null;\n counterparty_adl_unwind_price: Decimal | null;\n counterparty_average_entry_funding_value: Decimal | null;\n counterparty_base: Decimal | null;\n counterparty_base_multiplier: Decimal | null;\n counterparty_funding_value: Decimal | null;\n counterparty_last_price: Decimal | null;\n counterparty_last_price_timestamp: Decimal | null;\n counterparty_realized_pnl: Decimal | null;\n counterparty_session: Decimal | null;\n position_adl_unwind_price: Decimal | null;\n position_average_entry_funding_value: Decimal | null;\n position_base: Decimal | null;\n position_base_multiplier: Decimal | null;\n position_funding_value: Decimal | null;\n position_last_price: Decimal | null;\n position_last_price_timestamp: Decimal | null;\n position_realized_pnl: Decimal | null;\n position_session: Decimal | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n};\n\ntype Position = {\n market_id: Decimal;\n account_id: Decimal;\n base: Decimal | null;\n realized_pnl: Decimal | null;\n last_price: Decimal | null;\n last_price_timestamp: Decimal | null;\n funding_value: Decimal | null;\n base_multiplier: Decimal | null;\n adl_unwind_price: Decimal | null;\n average_entry_funding_value: Decimal | null;\n session: Decimal | null;\n exchange_id: Decimal | null;\n event_sequence_number: bigint | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n adjusted_base: Decimal | null;\n adl_realized_pnl: Decimal | null;\n};\n\ntype ConditionalOrder = {\n id: string;\n account_id: Decimal;\n market_id: Decimal;\n order_type: string;\n is_long: boolean;\n trigger_price: number;\n order_base: Decimal;\n status: string;\n creation_timestamp_ms: bigint;\n last_update_timestamp_ms: bigint;\n transaction_hash: string | null;\n};\n\ntype ConditionalOrderSensitive = ConditionalOrder & {\n exchange_id: bigint;\n inputs: string;\n counterparty_account_id: bigint;\n reya_chain_id: bigint;\n deadline: bigint;\n signer_address: string;\n nonce: Decimal;\n signature: string;\n};\n\ntype Market = {\n id: Decimal;\n assetPairId: AssetPair;\n ticker: string;\n isActive: boolean;\n maxLeverage: number;\n description: string;\n name: string;\n tickSizeDecimals: number;\n priority: number;\n underlyingAssetId: string;\n quoteTokenId: string;\n};\n\ntype Account = {\n account_id: Decimal;\n name: string;\n status: AccountStatus;\n updated_timestamp_ms: Decimal;\n source: string | null;\n};\n\ntype AccountBalance = {\n account_id: Decimal | null;\n collateral: string | null;\n balance?: Decimal | null;\n delta?: Decimal | null;\n};\n\ntype spot_execution = {\n account_id: Decimal;\n counterparty_account_id: Decimal;\n exchange_id: Decimal;\n executed_base: Decimal;\n price: Decimal;\n account_order_id: bigint;\n counterparty_order_id: bigint;\n spot_market_id: Decimal;\n is_auto_exchange: boolean;\n is_long: boolean;\n event_sequence_number: bigint;\n parent_event_sequence_number: bigint | null;\n block_timestamp: Decimal;\n block_number: Decimal;\n transaction_hash: string;\n created_at: string;\n};\n\ntype account_real_balance = {\n account_id: Decimal;\n collateral: string;\n balance: Decimal;\n rpnl: Decimal;\n event_sequence_number: bigint | null;\n transfer_event_sequence_number: bigint | null;\n parent_event_sequence_number: bigint | null;\n block_timestamp: Decimal;\n block_number: Decimal;\n transaction_hash: string;\n};\n\ntype AutoExchange = {\n id: string;\n liquidated_account_id: Decimal | null;\n liquidator_account_id: Decimal | null;\n requested_quote_amount: Decimal | null;\n collateral_out_address: string | null;\n collateral_in_address: string | null;\n collateral_amount_to_liquidator: Decimal | null;\n quote_amount_to_insurance_fund: Decimal | null;\n quote_amount_to_account: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n transaction_hash: string;\n unique_id: bigint | null;\n};\n\ntype Leverage = {\n accountId: Decimal;\n marketId: Decimal;\n leverage: number;\n createdAt: Date;\n updatedAt: Date;\n};\n\ntype WalletStats = {\n volume_14d: Decimal;\n};\n\ntype MarketData = {\n marketId: string;\n updatedAt: number;\n longOI: number;\n shortOI: number;\n longSkewPercentage: number;\n shortSkewPercentage: number;\n openInterest?: number;\n fundingRate?: number;\n fundingRateVelocity?: number;\n longFundingValue?: number;\n shortFundingValue?: number;\n last24hVolume: number;\n priceChange24H?: number;\n priceChange24HPercentage?: number;\n maxAmountBaseLong?: number;\n maxAmountSizeLong?: number;\n maxAmountBaseShort?: number;\n maxAmountSizeShort?: number;\n oraclePrice?: number;\n poolPrice?: number;\n pricesUpdatedAt?: number;\n longBaseMultiplier?: number;\n shortBaseMultiplier?: number;\n longAdlUnwindPrice?: number;\n shortAdlUnwindPrice?: number;\n depthFactor?: number;\n priceSpread?: number;\n logPriceMultiplier?: number;\n};\n\ntype MarketTrackers = {\n market_data_id: Decimal;\n passive_pool_id: Decimal | null;\n pool_account_id: Decimal | null;\n quote_token: string | null;\n quote_token_decimals: Decimal | null;\n last_funding_velocity: Decimal | null;\n last_funding_timestamp: Decimal | null;\n last_mtm_price: Decimal | null;\n last_mtm_timestamp: Decimal | null;\n long_trackers_funding_value: Decimal | null;\n last_funding_rate: Decimal | null;\n long_trackers_base_multiplier: Decimal | null;\n long_trackers_adl_unwind_price: Decimal | null;\n short_trackers_funding_value: Decimal | null;\n short_trackers_base_multiplier: Decimal | null;\n short_trackers_adl_unwind_price: Decimal | null;\n open_interest: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n price_spread: Decimal | null;\n depth_factor: Decimal | null;\n log_price_multiplier: Decimal | null;\n};\n\nexport type TradingApiReplication<\n ReplicationTable extends ReplicationModel = never,\n Replication = never,\n> = {\n replication: ReplicationTable extends never\n ? never\n : GenericReplicationMessage<Replication, ReplicationTable>;\n};\n\nexport type TradingApiEndpoint<\n Response,\n Params,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = never,\n> = ApiEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiListEndpoint<\n Response,\n Params = never,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = never,\n> = ApiListEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiInfiniteListEndpoint<\n Response,\n Params = never,\n ReplicationTable extends ReplicationModel = never,\n Replication = Response,\n Query = PaginatedQueryParams,\n> = ApiInfiniteListEndpoint<Response, Params, Query> &\n TradingApiReplication<ReplicationTable, Replication>;\n\nexport type TradingApiSource = {\n 'poolBalance/:poolId': TradingApiEndpoint<\n {\n id: number;\n timestamp: bigint;\n pool_id: number;\n value: Decimal;\n apy: Decimal;\n share_price: Decimal;\n share_price_index: Decimal;\n } | null,\n {\n poolId?: string;\n }\n >;\n 'wallet/:address/leverages': TradingApiListEndpoint<\n Leverage,\n { address: string },\n 'accountLeveragePerMarket'\n >;\n markets: TradingApiListEndpoint<Market>;\n 'markets/data': TradingApiListEndpoint<MarketData, never, 'marketData'>;\n 'markets/configuration': TradingApiListEndpoint<{\n market_id: Decimal;\n risk_matrix_index: Decimal | null;\n max_open_base: Decimal | null;\n velocity_multiplier: Decimal | null;\n minimum_order_base: Decimal | null;\n base_spacing: Decimal | null;\n price_spacing: Decimal | null;\n oracle_node_id: string | null;\n mtm_window: Decimal | null;\n dutch_config_lambda: Decimal | null;\n dutch_config_min_base: Decimal | null;\n slippage_params_phi: Decimal | null;\n slippage_params_beta: Decimal | null;\n depth_factor: Decimal | null;\n max_exposure_factor: Decimal | null;\n max_p_slippage: Decimal | null;\n price_spread: Decimal | null;\n volatility_index_multiplier: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'markets/storage': TradingApiListEndpoint<{\n market_id: Decimal;\n quote_collateral: string | null;\n instrument_address: string | null;\n name: string | null;\n risk_block_id: Decimal | null;\n collateral_pool_id: Decimal | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'markets/trackers': TradingApiListEndpoint<\n MarketTrackers,\n never,\n 'marketTrackers'\n >;\n 'market/:marketId/trackers': TradingApiEndpoint<\n MarketTrackers,\n {\n marketId: string;\n },\n 'marketTrackers'\n >;\n 'market/:marketId': TradingApiEndpoint<\n Market,\n {\n marketId: string;\n }\n >;\n 'market/:marketId/data': TradingApiEndpoint<\n MarketData,\n {\n marketId: string;\n },\n 'marketData'\n >;\n 'market/:marketId/trades': TradingApiInfiniteListEndpoint<\n Order,\n {\n marketId: string;\n },\n 'orders'\n >;\n 'wallet/:address/positions': TradingApiListEndpoint<\n Position,\n AddressParam,\n 'position',\n Omit<Position, 'adjusted_base' | 'adl_realized_pnl'>\n >;\n 'wallet/:address/openOrders': TradingApiListEndpoint<\n ConditionalOrder,\n AddressParam,\n 'ConditionalOrders'\n >;\n assets: TradingApiListEndpoint<{\n address: string;\n name: string;\n short: string;\n createdAt: Date;\n updatedAt: Date;\n asset_price_contract_id: string | null;\n asset_price_usdc_contract_id: string | null;\n decimals: number;\n }>;\n prices: TradingApiEndpoint<\n Partial<Record<AssetPair, MarketPrice | CollateralPrice>>,\n never\n >;\n 'prices/:assetPairId': TradingApiEndpoint<\n MarketPrice | CollateralPrice | undefined,\n {\n assetPairId: string;\n },\n 'price'\n >;\n 'wallet/:address/accounts': TradingApiListEndpoint<\n Account,\n AddressParam,\n 'AccountProfile'\n >;\n 'wallet/:address/accounts/tiers': TradingApiListEndpoint<\n {\n market_id: Decimal;\n account_id: Decimal;\n tier_id: Decimal | null;\n },\n AddressParam\n >;\n 'wallet/:address/accounts/balances': TradingApiListEndpoint<\n AccountBalance,\n AddressParam,\n 'account_balances'\n >;\n 'wallet/:address/autoExchange': TradingApiInfiniteListEndpoint<\n AutoExchange,\n AddressParam,\n 'auto_exchange'\n >;\n 'wallet/:address/balanceHistory/:timestamp': TradingApiListEndpoint<\n {\n timestamp: number;\n balance: number;\n },\n {\n address: string;\n timestamp: string;\n }\n >;\n 'wallet/:address/trades': TradingApiInfiniteListEndpoint<\n Order,\n {\n address: string;\n },\n 'order_history'\n >;\n 'wallet/:address/trades/:type': TradingApiInfiniteListEndpoint<\n Order,\n {\n address: string;\n type?: 'matchOrder' | 'liquidation';\n },\n 'order_history'\n >;\n riskMatrices: TradingApiListEndpoint<\n {\n blockId: Decimal;\n matrix: string[][];\n },\n {\n poolId: string;\n }\n >;\n tierFees: TradingApiListEndpoint<{\n market_id: Decimal;\n tier_id: Decimal;\n fee_parameter: Decimal | null;\n }>;\n collateralConfiguration: TradingApiListEndpoint<{\n assetPairId?: AssetPair;\n name?: string;\n collateral_pool_id: Decimal;\n collateral_address: string;\n price_haircut: Decimal | null;\n auto_exchange_discount: Decimal | null;\n oracle_node_id: string | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n }>;\n 'candle/:assetPairId/:resolution': TradingApiEndpoint<\n Candle | null,\n {\n resolution: CandleResolution;\n assetPairId: AssetPair;\n },\n 'storkPriceCandle',\n Candle\n >;\n 'candles/:assetPairId/:resolution': TradingApiEndpoint<\n {\n t: number[];\n o: number[];\n h: number[];\n l: number[];\n c: number[];\n },\n {\n resolution: CandleResolution;\n assetPairId: AssetPair;\n },\n never,\n never,\n {\n to: string;\n from: string;\n countBack?: string;\n }\n >;\n feeTierParameters: TradingApiListEndpoint<{\n tier_id: Decimal;\n taker_fee: Decimal;\n maker_fee: Decimal;\n volume: Decimal;\n }>;\n globalFeeParameters: TradingApiEndpoint<\n {\n og_discount: Decimal;\n vltz_discount: Decimal;\n referee_discount: Decimal;\n referrer_rebate: Decimal;\n affiliate_referrer_rebate: Decimal;\n },\n never\n >;\n 'wallet/:address/configuration': TradingApiEndpoint<\n {\n tier_id: Decimal;\n og_status: boolean;\n vltz_status: boolean;\n affiliate_status: boolean;\n referee_status: boolean;\n spread_discount_status: boolean;\n main_account_id: Decimal;\n },\n {\n address: string;\n }\n >;\n 'wallet/:address/stats': TradingApiEndpoint<\n WalletStats,\n {\n address: string;\n }\n >;\n 'wallet/:address/apiWalletStatus': TradingApiEndpoint<\n {\n enabledApiWallets: string[];\n },\n {\n address: string;\n }\n >;\n rlp: TradingApiEndpoint<\n {\n tvlInUsdc: number;\n tvlInRlp: number;\n rlpUsdcPrice: number;\n apy: {\n '1d': number;\n '7d': number;\n '30d': number;\n '365d': number;\n };\n numberOfDepositors: number;\n ageSeconds: number;\n },\n never\n >;\n 'wallet/:address/rlp': TradingApiEndpoint<\n {\n balanceInUsdc: number;\n balanceInRlp: number;\n },\n {\n address: string;\n }\n >;\n};\n\nexport type Req<P = ParamsDictionary, ReqQuery = Query> = {\n params: P;\n query: ReqQuery;\n};\n\nexport type TradingApi = {\n [K in keyof TradingApiSource as K]: {\n params: TradingApiSource[K]['params'];\n query: TradingApiSource[K]['query'];\n response: Stringified<TradingApiSource[K]['response']>;\n replication: Stringified<TradingApiSource[K]['replication']>;\n };\n};\n\ntype ReplicationModel = string | never;\n\nexport type GenericReplicationMessage<T, model extends ReplicationModel> =\n | {\n model: model;\n result: T;\n operation: 'create' | 'update' | 'upsert' | 'delete';\n }\n | {\n model: model;\n result: T[];\n operation: 'updateMany';\n }\n | {\n model: model;\n result: T[];\n operation: 'createMany';\n };\n\ntype account_collateral_balance_entries = {\n id: string;\n account_id: Decimal | null;\n collateral: string | null;\n amount: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n};\n\ntype account_owner_updated_snapshot = {\n account_id: Decimal;\n transaction_hash: string;\n new_owner: string | null;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n};\n\ntype positions_migration = {\n market_id: Decimal;\n account_id: Decimal;\n base: Decimal | null;\n realized_pnl: Decimal | null;\n last_price: Decimal | null;\n last_price_timestamp: Decimal | null;\n funding_value: Decimal | null;\n base_multiplier: Decimal | null;\n adl_unwind_price: Decimal | null;\n average_entry_funding_value: Decimal | null;\n session: Decimal | null;\n exchange_id: Decimal | null;\n transaction_hash: string;\n block_timestamp: Decimal | null;\n block_number: Decimal;\n unique_id: bigint | null;\n event_sequence_number: bigint | null;\n referrer_account_id: Decimal | null;\n referrer_fee_credit: Decimal | null;\n};\n\ntype ReplicationMessage =\n // Extract the union of all `replication` values from TradingApiSource\n | Exclude<TradingApiSource[keyof TradingApiSource]['replication'], never>\n // add messages that do not exists in TradingApiSource\n | GenericReplicationMessage<\n account_owner_updated_snapshot,\n 'account_owner_updated_snapshot'\n >\n | GenericReplicationMessage<\n account_collateral_balance_entries,\n 'account_collateral_balance_entries'\n >\n | GenericReplicationMessage<account_real_balance, 'account_real_balances'>\n | GenericReplicationMessage<\n ConditionalOrderSensitive,\n 'ConditionalOrdersSensitive'\n >\n | GenericReplicationMessage<\n // Todo: remove after migration\n positions_migration,\n 'positions_migration'\n >\n | GenericReplicationMessage<spot_execution, 'spot_executions'>;\n\nexport type Replication = {\n [K in ReplicationMessage as `replication:${K['model']}`]: Extract<\n ReplicationMessage,\n { model: K['model'] }\n >;\n};\n"]}
@@ -48,6 +48,12 @@ export declare class ExposureCommand {
48
48
  static exchangeWithPriceHaircut(quantity: number, price: number, haircut: number): number;
49
49
  static reverseExchangeWithPriceHaircut(quantity: number, price: number, haircut: number): number;
50
50
  static getBalanceWithHaircut(exchangeInfoPerAsset: ExchangeInfo[], assetAddress: string, marginBalance: number): number;
51
+ /**
52
+ * @audit This function uses a linear approximation that is not aligned with the on-chain
53
+ * exponential logPriceMultiplier pricing logic (PriceMultiplier.sol). The intention is to
54
+ * deprecate this function completely once downstream consumers (PoolLiquidityCommand,
55
+ * updateLiquidity.task, marketDataLiquidity.task) are migrated.
56
+ */
51
57
  getSlippage(deltaBase: number, marketConfiguration: MarketConfiguration, marketStorage: MarketStorage): number;
52
58
  getMaxExposure(marketConfiguration: MarketConfiguration, marketStorage: MarketStorage, isPool: boolean): {
53
59
  maxExposureShort: number;
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"/","sources":["commands/exposure/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"/","sources":["commands/exposure/command.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EACL,mBAAmB,EACnB,mCAAmC,EACnC,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,YAAY,EACZ,+BAA+B,EAC/B,UAAU,EACV,4BAA4B,EAC5B,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAQjB,qBAAa,eAAe;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,sBAAsB,EAAE,mBAAmB,EAAE,CAAC;IAC9C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACzD,eAAe,EAAE,4BAA4B,CAAC;IAC9C,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,oBAAoB,EAAE,YAAY,EAAE,CAAC;IACrC,+BAA+B,EAAE,+BAA+B,EAAE,CAAC;IACnE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,uBAAuB,EAAE,UAAU,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,CAAC;IAC1B,gBAAgB,EAAE,SAAS,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC;IACtB,gCAAgC,EAAE,mCAAmC,CAAC;gBAEpE,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,MAAM,EAC5B,oBAAoB,EAAE,wBAAwB,EAC9C,sBAAsB,EAAE,mBAAmB,EAAE,EAC7C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACxD,eAAe,EAAE,4BAA4B,EAC7C,YAAY,EAAE,UAAU,EAAE,EAC1B,oBAAoB,EAAE,YAAY,EAAE,EACpC,+BAA+B,EAAE,+BAA+B,EAAE,EAClE,oBAAoB,EAAE,MAAM,EAAE,EAC9B,sBAAsB,EAAE,MAAM,EAAE,EAChC,uBAAuB,EAAE,UAAU,EAAE,EACrC,cAAc,EAAE,SAAS,EACzB,gBAAgB,EAAE,SAAS,EAC3B,UAAU,EAAE,SAAS,EACrB,gCAAgC,EAAE,mCAAmC;IAoBvE,QAAQ,IAAI,oBAAoB;IAqBhC,IAAI,oBAAoB,eAOvB;IAED,IAAI,eAAe,iBAElB;IACD,IAAI,qBAAqB,mBAExB;IAED,6BAA6B,CAC3B,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,MAAM;;;;;IA0ErB,qCAAqC,CACnC,cAAc,EAAE,MAAM,GACrB,oBAAoB,EAAE;IAyEzB,uCAAuC,CACrC,qBAAqB,EAAE,oBAAoB,EAAE;IA2D/C,sCAAsC,CACpC,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM;IAgD3B,MAAM,CAAC,gCAAgC,CACrC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACxD,oBAAoB,EAAE,MAAM,EAC5B,YAAY,EAAE,UAAU,EAAE,EAC1B,eAAe,EAAE,4BAA4B,EAC7C,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,EACnC,cAAc,EAAE,SAAS,EACzB,gBAAgB,EAAE,SAAS,EAC3B,+BAA+B,EAAE,+BAA+B,EAAE,EAClE,oBAAoB,EAAE,wBAAwB,GAC7C,UAAU,EAAE;IAsCf,MAAM,CAAC,oBAAoB,CACzB,aAAa,EAAE,MAAM,EACrB,4BAA4B,EAAE,MAAM,EACpC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,SAAS;IAaZ,MAAM,CAAC,wBAAwB,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,MAAM;IAST,MAAM,CAAC,iBAAiB,CACtB,gBAAgB,EAAE,UAAU,EAC5B,aAAa,EAAE,UAAU,EACzB,qBAAqB,EAAE,YAAY,GAClC,UAAU;IA4Gb,MAAM,CAAC,oBAAoB,CACzB,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,oBAAoB,EAAE,YAAY,EAAE,EACpC,kBAAkB,EAAE,UAAU,EAAE;IAoClC,MAAM,CAAC,iBAAiB,CACtB,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,SAAS,EACtB,aAAa,EAAE,SAAS,EACxB,WAAW,EAAE,MAAM,GAClB,cAAc;IAWjB,MAAM,CAAC,kBAAkB,CACvB,oBAAoB,EAAE,MAAM,EAC5B,YAAY,EAAE,UAAU,EAAE,EAC1B,eAAe,EAAE,4BAA4B,EAC7C,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,SAAS,CAAC,MAAM,CAAC,EACpC,SAAS,EAAE,+BAA+B,EAAE,EAC5C,oBAAoB,EAAE,wBAAwB,EAC9C,iBAAiB,EAAE,MAAM,EAAE,GAC1B,UAAU;IA0Fb,MAAM,CAAC,mCAAmC,CACxC,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,eAAe,EAAE,SAAS,EAAE,GAC3B,MAAM;IA0BT,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,+BAA+B,EAAE,EAC5C,oBAAoB,EAAE,wBAAwB,EAC9C,WAAW,EAAE,MAAM,GAClB,SAAS,EAAE;IA4Bd,MAAM,CAAC,yBAAyB,CAC9B,QAAQ,EAAE,YAAY,EACtB,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,MAAM;;;;IAWrB,MAAM,CAAC,eAAe,CACpB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS;IAOtB,MAAM,CAAC,cAAc,CACnB,UAAU,EAAE,IAAI,CACd,UAAU,EACV,eAAe,GAAG,8BAA8B,CACjD;IAoBH,MAAM,CAAC,wBAAwB,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM;IAYjB,MAAM,CAAC,+BAA+B,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM;IAmBjB,MAAM,CAAC,qBAAqB,CAC1B,oBAAoB,EAAE,YAAY,EAAE,EACpC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM;IAuBvB;;;;;OAKG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,GAC3B,MAAM;IA4BT,cAAc,CACZ,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,OAAO;;;;;;IA2DjB,MAAM,CAAC,mBAAmB,CACxB,UAAU,EAAE,SAAS,EAAE,EAAE,EACzB,SAAS,EAAE,SAAS,EAAE,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM;;;;IAoCvB,MAAM,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;;;;IAkC7D,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;IAe5E,MAAM,CAAC,6BAA6B,CAAC,EACnC,gBAAgB,EAChB,SAAS,GACV,EAAE;QACD,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,MAAM;IAgBV,MAAM,CAAC,YAAY,CAAC,EAClB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,uBAAuB,GACxB,EAAE;QACD,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,SAAS,CAAC;QACxB,uBAAuB,EAAE,SAAS,CAAC;KACpC,GAAG;QACF,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;KACb;IA2BD,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIvE,MAAM,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,MAAM;IAUzD,MAAM,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,SAAS;IAQxD,MAAM,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,SAAS;IAQ9D,MAAM,CAAC,mBAAmB,CACxB,cAAc,EAAE,SAAS,EACzB,mBAAmB,EAAE,SAAS;IAKhC,MAAM,CAAC,qBAAqB,CAC1B,sBAAsB,EAAE,SAAS,EACjC,mBAAmB,EAAE,SAAS,EAC9B,eAAe,EAAE,SAAS;IAa5B,MAAM,CAAC,2BAA2B,CAChC,sBAAsB,EAAE,SAAS,EACjC,mBAAmB,EAAE,SAAS,EAC9B,eAAe,EAAE,SAAS;IAU5B,MAAM,CAAC,sBAAsB,CAC3B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,SAAS,EAC3B,cAAc,EAAE,SAAS,EACzB,wBAAwB,EAAE,SAAS,EACnC,wBAAwB,EAAE,SAAS,EACnC,oBAAoB,EAAE,SAAS;IAejC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAM1D,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAI7C,IAAI,WAAW,WAEd;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,sBAAsB,WAezB;IAED,IAAI,iCAAiC,WAcpC;IAED,aAAa;CAGd"}
@@ -207,6 +207,9 @@ type MarketData = {
207
207
  shortBaseMultiplier?: number;
208
208
  longAdlUnwindPrice?: number;
209
209
  shortAdlUnwindPrice?: number;
210
+ depthFactor?: number;
211
+ priceSpread?: number;
212
+ logPriceMultiplier?: number;
210
213
  };
211
214
  type MarketTrackers = {
212
215
  market_data_id: Decimal;
@@ -229,6 +232,9 @@ type MarketTrackers = {
229
232
  block_timestamp: Decimal | null;
230
233
  block_number: Decimal;
231
234
  unique_id: bigint | null;
235
+ price_spread: Decimal | null;
236
+ depth_factor: Decimal | null;
237
+ log_price_multiplier: Decimal | null;
232
238
  };
233
239
  export type TradingApiReplication<ReplicationTable extends ReplicationModel = never, Replication = never> = {
234
240
  replication: ReplicationTable extends never ? never : GenericReplicationMessage<Replication, ReplicationTable>;
@@ -411,6 +417,25 @@ export type TradingApiSource = {
411
417
  }, {
412
418
  address: string;
413
419
  }>;
420
+ rlp: TradingApiEndpoint<{
421
+ tvlInUsdc: number;
422
+ tvlInRlp: number;
423
+ rlpUsdcPrice: number;
424
+ apy: {
425
+ '1d': number;
426
+ '7d': number;
427
+ '30d': number;
428
+ '365d': number;
429
+ };
430
+ numberOfDepositors: number;
431
+ ageSeconds: number;
432
+ }, never>;
433
+ 'wallet/:address/rlp': TradingApiEndpoint<{
434
+ balanceInUsdc: number;
435
+ balanceInRlp: number;
436
+ }, {
437
+ address: string;
438
+ }>;
414
439
  };
415
440
  export type Req<P = ParamsDictionary, ReqQuery = Query> = {
416
441
  params: P;
@@ -1 +1 @@
1
- {"version":3,"file":"trading-api-types.d.ts","sourceRoot":"/","sources":["trading-api-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trading-api-types.d.ts","sourceRoot":"/","sources":["trading-api-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,uBAAuB,EACvB,eAAe,EACf,OAAO,EACP,oBAAoB,EACpB,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAEF,MAAM,MAAM,aAAa,GACvB,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE,KAAK,gBAAgB,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;AAEtE,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,IAAI,CAAC;IACjB,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,6BAA6B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,wCAAwC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzD,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,4BAA4B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,0BAA0B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3C,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,iCAAiC,EAAE,OAAO,GAAG,IAAI,CAAC;IAClD,yBAAyB,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,yBAAyB,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,oCAAoC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,wBAAwB,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,6BAA6B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,KAAK,yBAAyB,GAAG,gBAAgB,GAAG;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB,EAAE,MAAM,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,+BAA+B,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,8BAA8B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,uBAAuB,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,6BAA6B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9C,8BAA8B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,4BAA4B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,8BAA8B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,+BAA+B,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAC/B,gBAAgB,SAAS,gBAAgB,GAAG,KAAK,EACjD,WAAW,GAAG,KAAK,IACjB;IACF,WAAW,EAAE,gBAAgB,SAAS,KAAK,GACvC,KAAK,GACL,yBAAyB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAC5B,QAAQ,EACR,MAAM,EACN,gBAAgB,SAAS,gBAAgB,GAAG,KAAK,EACjD,WAAW,GAAG,QAAQ,EACtB,KAAK,GAAG,KAAK,IACX,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,GACtC,qBAAqB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAEvD,MAAM,MAAM,sBAAsB,CAChC,QAAQ,EACR,MAAM,GAAG,KAAK,EACd,gBAAgB,SAAS,gBAAgB,GAAG,KAAK,EACjD,WAAW,GAAG,QAAQ,EACtB,KAAK,GAAG,KAAK,IACX,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,GAC1C,qBAAqB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAEvD,MAAM,MAAM,8BAA8B,CACxC,QAAQ,EACR,MAAM,GAAG,KAAK,EACd,gBAAgB,SAAS,gBAAgB,GAAG,KAAK,EACjD,WAAW,GAAG,QAAQ,EACtB,KAAK,GAAG,oBAAoB,IAC1B,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,GAClD,qBAAqB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qBAAqB,EAAE,kBAAkB,CACvC;QACE,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,OAAO,CAAC;KAC5B,GAAG,IAAI,EACR;QACE,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;IACF,2BAA2B,EAAE,sBAAsB,CACjD,QAAQ,EACR;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,EACnB,0BAA0B,CAC3B,CAAC;IACF,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,cAAc,EAAE,sBAAsB,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACxE,uBAAuB,EAAE,sBAAsB,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC;QACnB,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;QAClC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;QAC9B,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;QACpC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;QACnC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;QAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;QAC3B,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;QACpC,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAAC;QACtC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;QACpC,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;QACrC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;QAC7B,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;QACpC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;QAC/B,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;QAC7B,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC;QAC5C,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,iBAAiB,EAAE,sBAAsB,CAAC;QACxC,SAAS,EAAE,OAAO,CAAC;QACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;QAC9B,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;QACnC,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,kBAAkB,EAAE,sBAAsB,CACxC,cAAc,EACd,KAAK,EACL,gBAAgB,CACjB,CAAC;IACF,2BAA2B,EAAE,kBAAkB,CAC7C,cAAc,EACd;QACE,QAAQ,EAAE,MAAM,CAAC;KAClB,EACD,gBAAgB,CACjB,CAAC;IACF,kBAAkB,EAAE,kBAAkB,CACpC,MAAM,EACN;QACE,QAAQ,EAAE,MAAM,CAAC;KAClB,CACF,CAAC;IACF,uBAAuB,EAAE,kBAAkB,CACzC,UAAU,EACV;QACE,QAAQ,EAAE,MAAM,CAAC;KAClB,EACD,YAAY,CACb,CAAC;IACF,yBAAyB,EAAE,8BAA8B,CACvD,KAAK,EACL;QACE,QAAQ,EAAE,MAAM,CAAC;KAClB,EACD,QAAQ,CACT,CAAC;IACF,2BAA2B,EAAE,sBAAsB,CACjD,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAAC,CACrD,CAAC;IACF,4BAA4B,EAAE,sBAAsB,CAClD,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAE,sBAAsB,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,IAAI,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;QAChB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;QACvC,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5C,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,MAAM,EAAE,kBAAkB,CACxB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC,EACzD,KAAK,CACN,CAAC;IACF,qBAAqB,EAAE,kBAAkB,CACvC,WAAW,GAAG,eAAe,GAAG,SAAS,EACzC;QACE,WAAW,EAAE,MAAM,CAAC;KACrB,EACD,OAAO,CACR,CAAC;IACF,0BAA0B,EAAE,sBAAsB,CAChD,OAAO,EACP,YAAY,EACZ,gBAAgB,CACjB,CAAC;IACF,gCAAgC,EAAE,sBAAsB,CACtD;QACE,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;KACzB,EACD,YAAY,CACb,CAAC;IACF,mCAAmC,EAAE,sBAAsB,CACzD,cAAc,EACd,YAAY,EACZ,kBAAkB,CACnB,CAAC;IACF,8BAA8B,EAAE,8BAA8B,CAC5D,YAAY,EACZ,YAAY,EACZ,eAAe,CAChB,CAAC;IACF,2CAA2C,EAAE,sBAAsB,CACjE;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,EACD;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CACF,CAAC;IACF,wBAAwB,EAAE,8BAA8B,CACtD,KAAK,EACL;QACE,OAAO,EAAE,MAAM,CAAC;KACjB,EACD,eAAe,CAChB,CAAC;IACF,8BAA8B,EAAE,8BAA8B,CAC5D,KAAK,EACL;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;KACrC,EACD,eAAe,CAChB,CAAC;IACF,YAAY,EAAE,sBAAsB,CAClC;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;KACpB,EACD;QACE,MAAM,EAAE,MAAM,CAAC;KAChB,CACF,CAAC;IACF,QAAQ,EAAE,sBAAsB,CAAC;QAC/B,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;KAC/B,CAAC,CAAC;IACH,uBAAuB,EAAE,sBAAsB,CAAC;QAC9C,WAAW,CAAC,EAAE,SAAS,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kBAAkB,EAAE,OAAO,CAAC;QAC5B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;QAC9B,sBAAsB,EAAE,OAAO,GAAG,IAAI,CAAC;QACvC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;QAChC,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,iCAAiC,EAAE,kBAAkB,CACnD,MAAM,GAAG,IAAI,EACb;QACE,UAAU,EAAE,gBAAgB,CAAC;QAC7B,WAAW,EAAE,SAAS,CAAC;KACxB,EACD,kBAAkB,EAClB,MAAM,CACP,CAAC;IACF,kCAAkC,EAAE,kBAAkB,CACpD;QACE,CAAC,EAAE,MAAM,EAAE,CAAC;QACZ,CAAC,EAAE,MAAM,EAAE,CAAC;QACZ,CAAC,EAAE,MAAM,EAAE,CAAC;QACZ,CAAC,EAAE,MAAM,EAAE,CAAC;QACZ,CAAC,EAAE,MAAM,EAAE,CAAC;KACb,EACD;QACE,UAAU,EAAE,gBAAgB,CAAC;QAC7B,WAAW,EAAE,SAAS,CAAC;KACxB,EACD,KAAK,EACL,KAAK,EACL;QACE,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CACF,CAAC;IACF,iBAAiB,EAAE,sBAAsB,CAAC;QACxC,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IACH,mBAAmB,EAAE,kBAAkB,CACrC;QACE,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,OAAO,CAAC;QACzB,yBAAyB,EAAE,OAAO,CAAC;KACpC,EACD,KAAK,CACN,CAAC;IACF,+BAA+B,EAAE,kBAAkB,CACjD;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,OAAO,CAAC;QACxB,sBAAsB,EAAE,OAAO,CAAC;QAChC,eAAe,EAAE,OAAO,CAAC;KAC1B,EACD;QACE,OAAO,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;IACF,uBAAuB,EAAE,kBAAkB,CACzC,WAAW,EACX;QACE,OAAO,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;IACF,iCAAiC,EAAE,kBAAkB,CACnD;QACE,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,EACD;QACE,OAAO,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;IACF,GAAG,EAAE,kBAAkB,CACrB;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE;YACH,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;KACpB,EACD,KAAK,CACN,CAAC;IACF,qBAAqB,EAAE,kBAAkB,CACvC;QACE,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,EACD;QACE,OAAO,EAAE,MAAM,CAAC;KACjB,CACF,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,QAAQ,GAAG,KAAK,IAAI;IACxD,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,QAAQ,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;KACtB,CAAC,IAAI,MAAM,gBAAgB,IAAI,CAAC,GAAG;QAClC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,WAAW,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAC9D;CACF,CAAC;AAEF,KAAK,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;AAEvC,MAAM,MAAM,yBAAyB,CAAC,CAAC,EAAE,KAAK,SAAS,gBAAgB,IACnE;IACE,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACtD,GACD;IACE,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,SAAS,EAAE,YAAY,CAAC;CACzB,GACD;IACE,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEN,KAAK,kCAAkC,GAAG;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,KAAK,8BAA8B,GAAG;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,KAAK,kBAAkB,GAEnB,OAAO,CAAC,gBAAgB,CAAC,MAAM,gBAAgB,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,GAEvE,yBAAyB,CACvB,8BAA8B,EAC9B,gCAAgC,CACjC,GACD,yBAAyB,CACvB,kCAAkC,EAClC,oCAAoC,CACrC,GACD,yBAAyB,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GACxE,yBAAyB,CACvB,yBAAyB,EACzB,4BAA4B,CAC7B,GACD,yBAAyB,CAEvB,mBAAmB,EACnB,qBAAqB,CACtB,GACD,yBAAyB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG;KACvB,CAAC,IAAI,kBAAkB,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAC/D,kBAAkB,EAClB;QAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;KAAE,CACtB;CACF,CAAC"}
@@ -30,13 +30,46 @@ export declare const calculateMaxExposure: ({ poolBalance, riskFactor, poolIMR,
30
30
  poolIMR?: number | undefined;
31
31
  riskFactor: number;
32
32
  }) => number;
33
- export declare const calculateEstimatedExecutionPrice: ({ poolPrice, oraclePrice, tradeBaseSize, poolMaxExposure, marketDepthFactor, marketSpread, }: {
34
- poolPrice: number;
33
+ /**
34
+ * Splits a trade exposure into rebalancing and unbalancing portions relative to pool net exposure.
35
+ * Rebalancing reduces pool's absolute exposure; unbalancing increases it.
36
+ */
37
+ export declare const splitTradeExposure: (tradeExposure: number, poolNetExposure: number) => {
38
+ rebalancing: number;
39
+ unbalancing: number;
40
+ };
41
+ /**
42
+ * Computes the new log price multiplier (logF) after a trade, handling both
43
+ * rebalancing and unbalancing portions.
44
+ *
45
+ * Mirrors on-chain logic in PriceMultiplier.sol:computeNewLogPriceMultiplier.
46
+ */
47
+ export declare const computeNewLogF: ({ currentLogF, tradeExposure, poolNetExposure, depthFactor, maxExposure, }: {
48
+ currentLogF: number;
49
+ tradeExposure: number;
50
+ poolNetExposure: number;
51
+ depthFactor: number;
52
+ maxExposure: number;
53
+ }) => number;
54
+ /**
55
+ * Estimates the execution price for a trade using the exponential logPriceMultiplier formula.
56
+ *
57
+ * Mirrors on-chain logic:
58
+ * 1. computeNewLogPriceMultiplier (PriceMultiplier.sol)
59
+ * 2. computeAmmPrice: ammPrice = oraclePrice * exp(logF)
60
+ * 3. computeSignedSpread: executionPrice = ammPrice * (1 + signedSpread)
61
+ *
62
+ * @audit spreadDiscount not applied — known limitation, to be addressed later
63
+ * @audit priceSpacing rounding not applied
64
+ */
65
+ export declare const calculateEstimatedExecutionPrice: ({ oraclePrice, currentLogF, tradeExposure, poolNetExposure, depthFactor, maxExposure, priceSpread, }: {
35
66
  oraclePrice: number;
36
- tradeBaseSize: number;
37
- poolMaxExposure: number;
38
- marketDepthFactor: number;
39
- marketSpread: number;
67
+ currentLogF: number;
68
+ tradeExposure: number;
69
+ poolNetExposure: number;
70
+ depthFactor: number;
71
+ maxExposure: number;
72
+ priceSpread: number;
40
73
  }) => number;
41
74
  export declare const calculateTradeFee: ({ feeRate, tradeNotional, }: {
42
75
  feeRate: number;
@@ -1 +1 @@
1
- {"version":3,"file":"calculate.d.ts","sourceRoot":"/","sources":["utils/calculate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calculate.d.ts","sourceRoot":"/","sources":["utils/calculate.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import BigNumber from 'bignumber.js';
2
2
  export declare function amountNormalizer(value: BigNumber | number | string, decimals?: number): BigNumber;
3
3
  export declare function amountDenormalizer(value: BigNumber | number | string, decimals?: number): BigNumber;
4
+ export declare const floorTo: (value: number, decimals: number) => number;
4
5
  //# sourceMappingURL=number.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"/","sources":["utils/number.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAKrC,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAClC,QAAQ,GAAE,MAAW,GACpB,SAAS,CAIX;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAClC,QAAQ,GAAE,MAAW,GACpB,SAAS,CAIX"}
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"/","sources":["utils/number.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAKrC,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAClC,QAAQ,GAAE,MAAW,GACpB,SAAS,CAIX;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAClC,QAAQ,GAAE,MAAW,GACpB,SAAS,CAIX;AAGD,eAAO,MAAM,OAAO,UAAW,MAAM,YAAY,MAAM,WAGtD,CAAC"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.calculatePositionAdlPnL = exports.calculatePositionAdjustedQty = exports.calculateRealBalance = exports.calculatePricePnl = exports.calculateFundingPnl = exports.calculateTotalMargin = exports.calculateMarginRatio = exports.calculateLMR = exports.calculateIMR = exports.calculateMaxOrderSize = exports.calculateRequiredMargin = exports.calculateLeverage = exports.calculateEstimatedLiquidationPrice = exports.calculateSpread = exports.calculateTradeFee = exports.calculateEstimatedExecutionPrice = exports.calculateMaxExposure = exports.calculateMaxWithdraw = exports.POOL_IMR = void 0;
6
+ exports.calculatePositionAdlPnL = exports.calculatePositionAdjustedQty = exports.calculateRealBalance = exports.calculatePricePnl = exports.calculateFundingPnl = exports.calculateTotalMargin = exports.calculateMarginRatio = exports.calculateLMR = exports.calculateIMR = exports.calculateMaxOrderSize = exports.calculateRequiredMargin = exports.calculateLeverage = exports.calculateEstimatedLiquidationPrice = exports.calculateSpread = exports.calculateTradeFee = exports.calculateEstimatedExecutionPrice = exports.computeNewLogF = exports.splitTradeExposure = exports.calculateMaxExposure = exports.calculateMaxWithdraw = exports.POOL_IMR = void 0;
7
7
  var struct_1 = require("./struct");
8
8
  var bignumber_js_1 = __importDefault(require("bignumber.js"));
9
9
  exports.POOL_IMR = 9.1;
@@ -32,15 +32,92 @@ var calculateMaxExposure = function (_a) {
32
32
  return poolBalance / (poolIMR * Math.sqrt(riskFactor));
33
33
  };
34
34
  exports.calculateMaxExposure = calculateMaxExposure;
35
+ /**
36
+ * Splits a trade exposure into rebalancing and unbalancing portions relative to pool net exposure.
37
+ * Rebalancing reduces pool's absolute exposure; unbalancing increases it.
38
+ */
39
+ var splitTradeExposure = function (tradeExposure, poolNetExposure) {
40
+ if (tradeExposure === 0) {
41
+ return { rebalancing: 0, unbalancing: 0 };
42
+ }
43
+ // If pool has no exposure, entire trade is unbalancing
44
+ if (poolNetExposure === 0) {
45
+ return { rebalancing: 0, unbalancing: tradeExposure };
46
+ }
47
+ // Opposite sign means trade increases pool exposure → pure unbalancing
48
+ var sameSign = (poolNetExposure > 0 && tradeExposure > 0) ||
49
+ (poolNetExposure < 0 && tradeExposure < 0);
50
+ if (!sameSign) {
51
+ return { rebalancing: 0, unbalancing: tradeExposure };
52
+ }
53
+ // Same sign: trade reduces pool exposure (pool takes opposite side)
54
+ var absPool = Math.abs(poolNetExposure);
55
+ var absTrade = Math.abs(tradeExposure);
56
+ if (absTrade <= absPool) {
57
+ // Pure rebalancing — trade doesn't cross zero
58
+ return { rebalancing: tradeExposure, unbalancing: 0 };
59
+ }
60
+ // Mixed: rebalance up to pool exposure, then unbalance the rest
61
+ var rebalancing = poolNetExposure;
62
+ var unbalancing = tradeExposure - rebalancing;
63
+ return { rebalancing: rebalancing, unbalancing: unbalancing };
64
+ };
65
+ exports.splitTradeExposure = splitTradeExposure;
66
+ /**
67
+ * Computes the new log price multiplier (logF) after a trade, handling both
68
+ * rebalancing and unbalancing portions.
69
+ *
70
+ * Mirrors on-chain logic in PriceMultiplier.sol:computeNewLogPriceMultiplier.
71
+ */
72
+ var computeNewLogF = function (_a) {
73
+ var currentLogF = _a.currentLogF, tradeExposure = _a.tradeExposure, poolNetExposure = _a.poolNetExposure, depthFactor = _a.depthFactor, maxExposure = _a.maxExposure;
74
+ if (tradeExposure === 0)
75
+ return currentLogF;
76
+ var _b = (0, exports.splitTradeExposure)(tradeExposure, poolNetExposure), rebalancing = _b.rebalancing, unbalancing = _b.unbalancing;
77
+ // Case 1: Has unbalancing portion (includes mixed trades)
78
+ if (unbalancing !== 0) {
79
+ // If also rebalancing, it brings logF to 0 by definition (trade crosses zero)
80
+ var startLogF = rebalancing === 0 ? currentLogF : 0;
81
+ return startLogF + unbalancing / (depthFactor * maxExposure);
82
+ }
83
+ // Case 2: Only rebalancing
84
+ // Both rebalancing and poolNetExposure have the same sign, so ratio is in [0, 1]
85
+ if (rebalancing !== 0 && poolNetExposure !== 0) {
86
+ var ratio = rebalancing / poolNetExposure;
87
+ return currentLogF * (1 - ratio);
88
+ }
89
+ return currentLogF;
90
+ };
91
+ exports.computeNewLogF = computeNewLogF;
92
+ /**
93
+ * Estimates the execution price for a trade using the exponential logPriceMultiplier formula.
94
+ *
95
+ * Mirrors on-chain logic:
96
+ * 1. computeNewLogPriceMultiplier (PriceMultiplier.sol)
97
+ * 2. computeAmmPrice: ammPrice = oraclePrice * exp(logF)
98
+ * 3. computeSignedSpread: executionPrice = ammPrice * (1 + signedSpread)
99
+ *
100
+ * @audit spreadDiscount not applied — known limitation, to be addressed later
101
+ * @audit priceSpacing rounding not applied
102
+ */
35
103
  var calculateEstimatedExecutionPrice = function (_a) {
36
- var poolPrice = _a.poolPrice, oraclePrice = _a.oraclePrice, tradeBaseSize = _a.tradeBaseSize, poolMaxExposure = _a.poolMaxExposure, marketDepthFactor = _a.marketDepthFactor, marketSpread = _a.marketSpread;
37
- if (tradeBaseSize === 0) {
38
- return poolPrice;
104
+ var oraclePrice = _a.oraclePrice, currentLogF = _a.currentLogF, tradeExposure = _a.tradeExposure, poolNetExposure = _a.poolNetExposure, depthFactor = _a.depthFactor, maxExposure = _a.maxExposure, priceSpread = _a.priceSpread;
105
+ if (tradeExposure === 0) {
106
+ return oraclePrice * Math.exp(currentLogF);
39
107
  }
40
- var poolDeviation = (tradeBaseSize * oraclePrice) / (marketDepthFactor * poolMaxExposure);
41
- var appliedSpread = tradeBaseSize > 0 ? marketSpread : -marketSpread;
42
- var estExecutionPrice = poolPrice * (1 + poolDeviation + appliedSpread);
43
- return Math.max(0, estExecutionPrice);
108
+ // 1. Compute new logF after trade impact
109
+ var newLogF = (0, exports.computeNewLogF)({
110
+ currentLogF: currentLogF,
111
+ tradeExposure: tradeExposure,
112
+ poolNetExposure: poolNetExposure,
113
+ depthFactor: depthFactor,
114
+ maxExposure: maxExposure,
115
+ });
116
+ // 2. Compute AMM price: oraclePrice * exp(newLogF)
117
+ var ammPrice = oraclePrice * Math.exp(newLogF);
118
+ // 3. Apply signed spread
119
+ var signedSpread = tradeExposure > 0 ? priceSpread : -priceSpread;
120
+ return Math.max(0, ammPrice * (1 + signedSpread));
44
121
  };
45
122
  exports.calculateEstimatedExecutionPrice = calculateEstimatedExecutionPrice;
46
123
  var calculateTradeFee = function (_a) {
@@ -1 +1 @@
1
- {"version":3,"file":"calculate.js","sourceRoot":"/","sources":["utils/calculate.ts"],"names":[],"mappings":"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","sourcesContent":["import { mergeMap } from './struct';\nimport BigNumber from 'bignumber.js';\n\nexport const POOL_IMR = 9.1;\n\ntype MarketId = string;\ntype Address = string;\n\n/**\n * Calculates the maximum amount that can be withdrawn in terms of the token\n * (e.g., if rUSD then in rUSD terms, if WETH then in WETH terms)\n */\nexport const calculateMaxWithdraw = ({\n currentIMR,\n marginBalance,\n realBalance,\n haircut,\n price,\n}: {\n /** Current Initial Margin Requirement of the account in rUSD terms */\n currentIMR: number;\n /** Current margin balance of the account (expected to already include haircuts) in rUSD terms */\n marginBalance: number;\n /**\n * Current real balance of the token the user wants to withdraw in token terms.\n * For rUSD: this equals net deposits (balanceDeprecated from v2 endpoints + realized PnL).\n * For all other tokens: this equals balanceDeprecated (since realized PnL is 0 for them).\n */\n realBalance: number;\n /**\n * Haircut parameter of the token.\n * Note: haircut for rUSD is always expected to be 0.\n */\n haircut: number;\n /** Price of the token in rUSD terms */\n price: number;\n}): number => {\n if (currentIMR < 0 || price < 0 || haircut < 0) {\n throw new Error('currentIMR, price, and haircut cannot be negative');\n }\n\n if (currentIMR === 0) {\n return realBalance;\n }\n\n if (haircut === 1 || price === 0) {\n return 0;\n }\n\n const availableMargin = marginBalance - currentIMR;\n const maxFromMargin = availableMargin / (price * (1 - haircut));\n\n return Math.max(0, Math.min(realBalance, maxFromMargin));\n};\n\nexport const calculateMaxExposure = ({\n poolBalance,\n riskFactor,\n poolIMR = POOL_IMR,\n}: {\n poolBalance: number;\n poolIMR?: number;\n riskFactor: number;\n}) => poolBalance / (poolIMR * Math.sqrt(riskFactor));\n\nexport const calculateEstimatedExecutionPrice = ({\n poolPrice,\n oraclePrice,\n tradeBaseSize,\n poolMaxExposure,\n marketDepthFactor,\n marketSpread,\n}: {\n poolPrice: number;\n oraclePrice: number;\n tradeBaseSize: number;\n poolMaxExposure: number;\n marketDepthFactor: number;\n marketSpread: number;\n}): number => {\n if (tradeBaseSize === 0) {\n return poolPrice;\n }\n\n const poolDeviation =\n (tradeBaseSize * oraclePrice) / (marketDepthFactor * poolMaxExposure);\n const appliedSpread = tradeBaseSize > 0 ? marketSpread : -marketSpread;\n const estExecutionPrice = poolPrice * (1 + poolDeviation + appliedSpread);\n\n return Math.max(0, estExecutionPrice);\n};\n\nexport const calculateTradeFee = ({\n feeRate,\n tradeNotional,\n}: {\n feeRate: number;\n tradeNotional: number;\n}) => feeRate * Math.abs(tradeNotional);\n\nexport const calculateSpread = ({\n depthFactor,\n maxExposure,\n oraclePrice,\n poolPrice,\n tradeNotional,\n}: {\n depthFactor: number;\n maxExposure: number;\n oraclePrice: number;\n poolPrice: number;\n tradeNotional: number;\n}) =>\n (poolPrice / oraclePrice) *\n (1 + tradeNotional / (depthFactor * maxExposure) - 1) *\n tradeNotional;\n\nexport const calculateEstimatedLiquidationPrice = ({\n LMR,\n accountBalance,\n isShort,\n notional,\n oraclePrice,\n}: {\n LMR: number;\n accountBalance: number;\n isShort: boolean;\n notional: number;\n oraclePrice: number;\n}) =>\n Math.max(\n 0,\n oraclePrice *\n (1 - ((accountBalance - LMR) / notional) * (isShort ? -1 : 1)),\n );\n\nexport const calculateLeverage = ({\n imrMultiplier,\n riskFactor,\n}: {\n imrMultiplier: number;\n riskFactor: number;\n}) => 1 / (imrMultiplier * Math.sqrt(riskFactor));\n\nexport const calculateRequiredMargin = ({\n currIMR,\n currentNotional,\n leverage,\n tradeNotional,\n}: {\n currIMR: number;\n currentNotional: number;\n leverage: number;\n tradeNotional: number;\n}) =>\n currIMR +\n (Math.abs(currentNotional + tradeNotional) - Math.abs(currentNotional)) /\n leverage;\n\nexport const calculateMaxOrderSize = ({\n currIMR,\n currNodeBalance,\n currNotional,\n depthFactor,\n extendingPosition,\n feeRate,\n isShortTrade,\n leverage,\n maxExposure,\n oraclePrice,\n poolPrice,\n}: {\n currIMR: number;\n currNodeBalance: number;\n currNotional: number;\n depthFactor: number;\n extendingPosition: boolean;\n feeRate: number;\n isShortTrade: boolean;\n leverage: number;\n maxExposure: number;\n oraclePrice: number;\n poolPrice: number;\n}) => {\n const a = poolPrice / oraclePrice;\n const c = 1 / (depthFactor * maxExposure);\n const R = a - 1 - feeRate * (isShortTrade ? -1 : 1);\n const SN = currNotional < 0 ? -1 : 1;\n const Q = R - (SN / leverage) * (extendingPosition ? 1 : -1);\n return Math.abs(\n (-1 * Q +\n Math.sqrt(\n Math.pow(Q, 2) -\n 4 *\n a *\n c *\n (currNodeBalance -\n currIMR +\n (extendingPosition ? 0 : ((2 * SN) / leverage) * currNotional)),\n ) *\n (isShortTrade ? 1 : -1)) /\n (2 * a * c),\n );\n};\n\nexport const calculateIMR = ({\n marketLeverages,\n marketPrices,\n positions,\n}: {\n marketLeverages: Map<MarketId, number>;\n marketPrices: Map<MarketId, number>;\n positions: Map<MarketId, number>;\n}) => {\n return Array.from(positions.entries()).reduce(\n (sum, [marketId, positionSize]) => {\n const leverage = marketLeverages.get(marketId);\n return leverage\n ? sum +\n (Math.abs(positionSize) * (marketPrices.get(marketId) ?? 0)) /\n leverage\n : sum;\n },\n 0,\n );\n};\n\nexport const calculateLMR = ({\n marketPrices,\n positions,\n riskFactors,\n marketId,\n tradeSize,\n}: {\n marketId?: string;\n marketPrices: Map<MarketId, number>;\n positions: Map<MarketId, number>;\n riskFactors: Map<MarketId, number>;\n tradeSize?: number;\n}) =>\n Array.from(\n (marketId && tradeSize\n ? mergeMap(positions, [\n [marketId, (positions.get(marketId) ?? 0) + tradeSize],\n ])\n : positions\n ).entries(),\n ).reduce((sum, [marketId, positionSize]) => {\n const riskFactor = riskFactors.get(marketId);\n return riskFactor\n ? sum +\n Math.abs(positionSize) *\n (marketPrices.get(marketId) ?? 0) *\n Math.sqrt(riskFactor)\n : sum;\n }, 0);\n\n// if account balance is below LMR position is liquidable\n\nexport const calculateMarginRatio = ({\n LMR,\n totalBalance,\n tradeCost,\n}: {\n LMR: number;\n totalBalance: number;\n tradeCost: number;\n}) => {\n if (LMR === 0) {\n return 0;\n }\n if (tradeCost > totalBalance) {\n return 1;\n }\n if (totalBalance === tradeCost) {\n return Infinity;\n }\n return Math.min(1, LMR / (totalBalance - tradeCost));\n};\n\nexport const calculateTotalMargin = ({\n marketsTrackers,\n accountBalances,\n assetPrices,\n marketsTokenInfo,\n positions,\n rUSDAddress,\n}: {\n accountBalances: Map<Address, number>;\n assetPrices: Map<Address, number>;\n marketsTokenInfo: Map<\n MarketId,\n {\n quoteTokenId: string;\n underlyingAssetId: string;\n }\n >;\n marketsTrackers: Map<\n MarketId,\n {\n longADLUnwindPrice: number;\n longBaseMultiplier: number;\n longFundingValue: number;\n shortADLUnwindPrice: number;\n shortBaseMultiplier: number;\n shortFundingValue: number;\n }\n >;\n positions: {\n adlUnwindPrice: number;\n base: number;\n baseMultiplier: number;\n fundingValue: number;\n lastPrice: number;\n marketId: string;\n realizedPnl: number;\n }[];\n rUSDAddress?: string;\n}) => {\n const pnl = new Map<Address, number>();\n const rUSDPrice = (rUSDAddress && assetPrices.get(rUSDAddress)) ?? 1;\n positions.forEach((position) => {\n const marketTracker = marketsTrackers?.get(position.marketId);\n const tokenInfo = marketsTokenInfo.get(position.marketId);\n if (!tokenInfo) return;\n let fundingCashFlow = 0;\n let adlCashFlow = 0;\n\n if (marketTracker) {\n // fundingCashFlow\n const marketTrackerFundingValue =\n position.base < 0\n ? marketTracker.shortFundingValue\n : marketTracker.longFundingValue;\n const trackerDelta = marketTrackerFundingValue - position.fundingValue;\n fundingCashFlow =\n (trackerDelta / position.baseMultiplier) * -1 * position.base;\n\n // adlCashFlow\n const adlUnwindPrice =\n ((position.base < 0\n ? marketTracker.shortADLUnwindPrice\n : marketTracker.longADLUnwindPrice) -\n position.adlUnwindPrice) /\n position.baseMultiplier;\n const baseMultiplier =\n (position.base < 0\n ? marketTracker.shortBaseMultiplier\n : marketTracker.longBaseMultiplier) / position.baseMultiplier;\n const lastPriceCoefficient = 1 - baseMultiplier;\n const initialPrice = lastPriceCoefficient * position.lastPrice;\n adlCashFlow = (adlUnwindPrice - initialPrice) * position.base;\n }\n\n const unrealizedPnl =\n ((assetPrices.get(tokenInfo.quoteTokenId) ?? 0) - position.lastPrice) *\n position.base;\n\n pnl.set(\n tokenInfo.underlyingAssetId,\n (pnl.get(tokenInfo.underlyingAssetId) ?? 0) +\n position.realizedPnl +\n fundingCashFlow +\n adlCashFlow +\n unrealizedPnl,\n );\n });\n\n return Array.from(accountBalances.entries()).reduce(\n (sum, [address, balance]) =>\n sum +\n (balance + (pnl.get(address) ?? 0)) *\n (address === rUSDAddress\n ? 1\n : (assetPrices.get(address) ?? 0) / (rUSDPrice || 1)),\n 0,\n );\n};\n\nexport const calculateFundingPnl = ({\n marketFundingValue,\n marketBaseMultiplier,\n positionAvgEntryFundingValue,\n positionAdjustedBase,\n}: {\n marketFundingValue: number;\n marketBaseMultiplier: number;\n positionAvgEntryFundingValue: number;\n positionAdjustedBase: number;\n}): number => {\n return (\n -1 *\n (((marketFundingValue - positionAvgEntryFundingValue) *\n positionAdjustedBase) /\n marketBaseMultiplier)\n );\n};\n\nexport const calculatePricePnl = ({\n price,\n positionAvgEntryPrice,\n positionAdjustedBase,\n}: {\n price: number;\n positionAvgEntryPrice: number;\n positionAdjustedBase: number;\n}): number => {\n return (price - positionAvgEntryPrice) * positionAdjustedBase;\n};\n\nexport const calculateRealBalance = (\n netDeposits: BigNumber,\n realized_pnl: BigNumber,\n) => {\n return netDeposits.plus(realized_pnl);\n};\n\nexport const calculatePositionAdjustedQty = (\n origQty: BigNumber,\n marketBaseMultiplier: BigNumber,\n positionBaseMultiplier: BigNumber,\n): BigNumber => {\n return origQty.times(marketBaseMultiplier).div(positionBaseMultiplier);\n};\n\n/**\n * Note: This function assumes all the inputs are scaled by 10^18.\n */\nexport const calculatePositionAdlPnL = ({\n marketTrackerAdlUnwindPrice,\n marketTrackerBaseMultiplier,\n positionBase,\n positionAvgEntryPrice,\n positionTrackerBaseMultiplier,\n positionTrackerAdlUnwindPrice,\n}: {\n marketTrackerAdlUnwindPrice: BigNumber;\n marketTrackerBaseMultiplier: BigNumber;\n positionBase: BigNumber;\n positionAvgEntryPrice: BigNumber;\n positionTrackerBaseMultiplier: BigNumber;\n positionTrackerAdlUnwindPrice: BigNumber;\n}): BigNumber => {\n const currentAdlUnwindPrice = marketTrackerAdlUnwindPrice\n .minus(positionTrackerAdlUnwindPrice)\n .multipliedBy(1e18)\n .div(positionTrackerBaseMultiplier);\n\n const initialPrice = positionAvgEntryPrice\n .times(\n BigNumber(1e18).minus(\n marketTrackerBaseMultiplier\n .multipliedBy(1e18)\n .div(positionTrackerBaseMultiplier),\n ),\n )\n .div(1e18);\n\n const adlPnL = positionBase\n .times(currentAdlUnwindPrice.minus(initialPrice))\n .div(1e18);\n\n return adlPnL;\n};\n"]}
1
+ {"version":3,"file":"calculate.js","sourceRoot":"/","sources":["utils/calculate.ts"],"names":[],"mappings":"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","sourcesContent":["import { mergeMap } from './struct';\nimport BigNumber from 'bignumber.js';\n\nexport const POOL_IMR = 9.1;\n\ntype MarketId = string;\ntype Address = string;\n\n/**\n * Calculates the maximum amount that can be withdrawn in terms of the token\n * (e.g., if rUSD then in rUSD terms, if WETH then in WETH terms)\n */\nexport const calculateMaxWithdraw = ({\n currentIMR,\n marginBalance,\n realBalance,\n haircut,\n price,\n}: {\n /** Current Initial Margin Requirement of the account in rUSD terms */\n currentIMR: number;\n /** Current margin balance of the account (expected to already include haircuts) in rUSD terms */\n marginBalance: number;\n /**\n * Current real balance of the token the user wants to withdraw in token terms.\n * For rUSD: this equals net deposits (balanceDeprecated from v2 endpoints + realized PnL).\n * For all other tokens: this equals balanceDeprecated (since realized PnL is 0 for them).\n */\n realBalance: number;\n /**\n * Haircut parameter of the token.\n * Note: haircut for rUSD is always expected to be 0.\n */\n haircut: number;\n /** Price of the token in rUSD terms */\n price: number;\n}): number => {\n if (currentIMR < 0 || price < 0 || haircut < 0) {\n throw new Error('currentIMR, price, and haircut cannot be negative');\n }\n\n if (currentIMR === 0) {\n return realBalance;\n }\n\n if (haircut === 1 || price === 0) {\n return 0;\n }\n\n const availableMargin = marginBalance - currentIMR;\n const maxFromMargin = availableMargin / (price * (1 - haircut));\n\n return Math.max(0, Math.min(realBalance, maxFromMargin));\n};\n\nexport const calculateMaxExposure = ({\n poolBalance,\n riskFactor,\n poolIMR = POOL_IMR,\n}: {\n poolBalance: number;\n poolIMR?: number;\n riskFactor: number;\n}) => poolBalance / (poolIMR * Math.sqrt(riskFactor));\n\n/**\n * Splits a trade exposure into rebalancing and unbalancing portions relative to pool net exposure.\n * Rebalancing reduces pool's absolute exposure; unbalancing increases it.\n */\nexport const splitTradeExposure = (\n tradeExposure: number,\n poolNetExposure: number,\n): { rebalancing: number; unbalancing: number } => {\n if (tradeExposure === 0) {\n return { rebalancing: 0, unbalancing: 0 };\n }\n\n // If pool has no exposure, entire trade is unbalancing\n if (poolNetExposure === 0) {\n return { rebalancing: 0, unbalancing: tradeExposure };\n }\n\n // Opposite sign means trade increases pool exposure → pure unbalancing\n const sameSign =\n (poolNetExposure > 0 && tradeExposure > 0) ||\n (poolNetExposure < 0 && tradeExposure < 0);\n if (!sameSign) {\n return { rebalancing: 0, unbalancing: tradeExposure };\n }\n\n // Same sign: trade reduces pool exposure (pool takes opposite side)\n const absPool = Math.abs(poolNetExposure);\n const absTrade = Math.abs(tradeExposure);\n\n if (absTrade <= absPool) {\n // Pure rebalancing — trade doesn't cross zero\n return { rebalancing: tradeExposure, unbalancing: 0 };\n }\n\n // Mixed: rebalance up to pool exposure, then unbalance the rest\n const rebalancing = poolNetExposure;\n const unbalancing = tradeExposure - rebalancing;\n return { rebalancing, unbalancing };\n};\n\n/**\n * Computes the new log price multiplier (logF) after a trade, handling both\n * rebalancing and unbalancing portions.\n *\n * Mirrors on-chain logic in PriceMultiplier.sol:computeNewLogPriceMultiplier.\n */\nexport const computeNewLogF = ({\n currentLogF,\n tradeExposure,\n poolNetExposure,\n depthFactor,\n maxExposure,\n}: {\n currentLogF: number;\n tradeExposure: number;\n poolNetExposure: number;\n depthFactor: number;\n maxExposure: number;\n}): number => {\n if (tradeExposure === 0) return currentLogF;\n\n const { rebalancing, unbalancing } = splitTradeExposure(\n tradeExposure,\n poolNetExposure,\n );\n\n // Case 1: Has unbalancing portion (includes mixed trades)\n if (unbalancing !== 0) {\n // If also rebalancing, it brings logF to 0 by definition (trade crosses zero)\n const startLogF = rebalancing === 0 ? currentLogF : 0;\n return startLogF + unbalancing / (depthFactor * maxExposure);\n }\n\n // Case 2: Only rebalancing\n // Both rebalancing and poolNetExposure have the same sign, so ratio is in [0, 1]\n if (rebalancing !== 0 && poolNetExposure !== 0) {\n const ratio = rebalancing / poolNetExposure;\n return currentLogF * (1 - ratio);\n }\n\n return currentLogF;\n};\n\n/**\n * Estimates the execution price for a trade using the exponential logPriceMultiplier formula.\n *\n * Mirrors on-chain logic:\n * 1. computeNewLogPriceMultiplier (PriceMultiplier.sol)\n * 2. computeAmmPrice: ammPrice = oraclePrice * exp(logF)\n * 3. computeSignedSpread: executionPrice = ammPrice * (1 + signedSpread)\n *\n * @audit spreadDiscount not applied — known limitation, to be addressed later\n * @audit priceSpacing rounding not applied\n */\nexport const calculateEstimatedExecutionPrice = ({\n oraclePrice,\n currentLogF,\n tradeExposure,\n poolNetExposure,\n depthFactor,\n maxExposure,\n priceSpread,\n}: {\n oraclePrice: number;\n currentLogF: number;\n tradeExposure: number;\n poolNetExposure: number;\n depthFactor: number;\n maxExposure: number;\n priceSpread: number;\n}): number => {\n if (tradeExposure === 0) {\n return oraclePrice * Math.exp(currentLogF);\n }\n\n // 1. Compute new logF after trade impact\n const newLogF = computeNewLogF({\n currentLogF,\n tradeExposure,\n poolNetExposure,\n depthFactor,\n maxExposure,\n });\n\n // 2. Compute AMM price: oraclePrice * exp(newLogF)\n const ammPrice = oraclePrice * Math.exp(newLogF);\n\n // 3. Apply signed spread\n const signedSpread = tradeExposure > 0 ? priceSpread : -priceSpread;\n return Math.max(0, ammPrice * (1 + signedSpread));\n};\n\nexport const calculateTradeFee = ({\n feeRate,\n tradeNotional,\n}: {\n feeRate: number;\n tradeNotional: number;\n}) => feeRate * Math.abs(tradeNotional);\n\nexport const calculateSpread = ({\n depthFactor,\n maxExposure,\n oraclePrice,\n poolPrice,\n tradeNotional,\n}: {\n depthFactor: number;\n maxExposure: number;\n oraclePrice: number;\n poolPrice: number;\n tradeNotional: number;\n}) =>\n (poolPrice / oraclePrice) *\n (1 + tradeNotional / (depthFactor * maxExposure) - 1) *\n tradeNotional;\n\nexport const calculateEstimatedLiquidationPrice = ({\n LMR,\n accountBalance,\n isShort,\n notional,\n oraclePrice,\n}: {\n LMR: number;\n accountBalance: number;\n isShort: boolean;\n notional: number;\n oraclePrice: number;\n}) =>\n Math.max(\n 0,\n oraclePrice *\n (1 - ((accountBalance - LMR) / notional) * (isShort ? -1 : 1)),\n );\n\nexport const calculateLeverage = ({\n imrMultiplier,\n riskFactor,\n}: {\n imrMultiplier: number;\n riskFactor: number;\n}) => 1 / (imrMultiplier * Math.sqrt(riskFactor));\n\nexport const calculateRequiredMargin = ({\n currIMR,\n currentNotional,\n leverage,\n tradeNotional,\n}: {\n currIMR: number;\n currentNotional: number;\n leverage: number;\n tradeNotional: number;\n}) =>\n currIMR +\n (Math.abs(currentNotional + tradeNotional) - Math.abs(currentNotional)) /\n leverage;\n\nexport const calculateMaxOrderSize = ({\n currIMR,\n currNodeBalance,\n currNotional,\n depthFactor,\n extendingPosition,\n feeRate,\n isShortTrade,\n leverage,\n maxExposure,\n oraclePrice,\n poolPrice,\n}: {\n currIMR: number;\n currNodeBalance: number;\n currNotional: number;\n depthFactor: number;\n extendingPosition: boolean;\n feeRate: number;\n isShortTrade: boolean;\n leverage: number;\n maxExposure: number;\n oraclePrice: number;\n poolPrice: number;\n}) => {\n const a = poolPrice / oraclePrice;\n const c = 1 / (depthFactor * maxExposure);\n const R = a - 1 - feeRate * (isShortTrade ? -1 : 1);\n const SN = currNotional < 0 ? -1 : 1;\n const Q = R - (SN / leverage) * (extendingPosition ? 1 : -1);\n return Math.abs(\n (-1 * Q +\n Math.sqrt(\n Math.pow(Q, 2) -\n 4 *\n a *\n c *\n (currNodeBalance -\n currIMR +\n (extendingPosition ? 0 : ((2 * SN) / leverage) * currNotional)),\n ) *\n (isShortTrade ? 1 : -1)) /\n (2 * a * c),\n );\n};\n\nexport const calculateIMR = ({\n marketLeverages,\n marketPrices,\n positions,\n}: {\n marketLeverages: Map<MarketId, number>;\n marketPrices: Map<MarketId, number>;\n positions: Map<MarketId, number>;\n}) => {\n return Array.from(positions.entries()).reduce(\n (sum, [marketId, positionSize]) => {\n const leverage = marketLeverages.get(marketId);\n return leverage\n ? sum +\n (Math.abs(positionSize) * (marketPrices.get(marketId) ?? 0)) /\n leverage\n : sum;\n },\n 0,\n );\n};\n\nexport const calculateLMR = ({\n marketPrices,\n positions,\n riskFactors,\n marketId,\n tradeSize,\n}: {\n marketId?: string;\n marketPrices: Map<MarketId, number>;\n positions: Map<MarketId, number>;\n riskFactors: Map<MarketId, number>;\n tradeSize?: number;\n}) =>\n Array.from(\n (marketId && tradeSize\n ? mergeMap(positions, [\n [marketId, (positions.get(marketId) ?? 0) + tradeSize],\n ])\n : positions\n ).entries(),\n ).reduce((sum, [marketId, positionSize]) => {\n const riskFactor = riskFactors.get(marketId);\n return riskFactor\n ? sum +\n Math.abs(positionSize) *\n (marketPrices.get(marketId) ?? 0) *\n Math.sqrt(riskFactor)\n : sum;\n }, 0);\n\n// if account balance is below LMR position is liquidable\n\nexport const calculateMarginRatio = ({\n LMR,\n totalBalance,\n tradeCost,\n}: {\n LMR: number;\n totalBalance: number;\n tradeCost: number;\n}) => {\n if (LMR === 0) {\n return 0;\n }\n if (tradeCost > totalBalance) {\n return 1;\n }\n if (totalBalance === tradeCost) {\n return Infinity;\n }\n return Math.min(1, LMR / (totalBalance - tradeCost));\n};\n\nexport const calculateTotalMargin = ({\n marketsTrackers,\n accountBalances,\n assetPrices,\n marketsTokenInfo,\n positions,\n rUSDAddress,\n}: {\n accountBalances: Map<Address, number>;\n assetPrices: Map<Address, number>;\n marketsTokenInfo: Map<\n MarketId,\n {\n quoteTokenId: string;\n underlyingAssetId: string;\n }\n >;\n marketsTrackers: Map<\n MarketId,\n {\n longADLUnwindPrice: number;\n longBaseMultiplier: number;\n longFundingValue: number;\n shortADLUnwindPrice: number;\n shortBaseMultiplier: number;\n shortFundingValue: number;\n }\n >;\n positions: {\n adlUnwindPrice: number;\n base: number;\n baseMultiplier: number;\n fundingValue: number;\n lastPrice: number;\n marketId: string;\n realizedPnl: number;\n }[];\n rUSDAddress?: string;\n}) => {\n const pnl = new Map<Address, number>();\n const rUSDPrice = (rUSDAddress && assetPrices.get(rUSDAddress)) ?? 1;\n positions.forEach((position) => {\n const marketTracker = marketsTrackers?.get(position.marketId);\n const tokenInfo = marketsTokenInfo.get(position.marketId);\n if (!tokenInfo) return;\n let fundingCashFlow = 0;\n let adlCashFlow = 0;\n\n if (marketTracker) {\n // fundingCashFlow\n const marketTrackerFundingValue =\n position.base < 0\n ? marketTracker.shortFundingValue\n : marketTracker.longFundingValue;\n const trackerDelta = marketTrackerFundingValue - position.fundingValue;\n fundingCashFlow =\n (trackerDelta / position.baseMultiplier) * -1 * position.base;\n\n // adlCashFlow\n const adlUnwindPrice =\n ((position.base < 0\n ? marketTracker.shortADLUnwindPrice\n : marketTracker.longADLUnwindPrice) -\n position.adlUnwindPrice) /\n position.baseMultiplier;\n const baseMultiplier =\n (position.base < 0\n ? marketTracker.shortBaseMultiplier\n : marketTracker.longBaseMultiplier) / position.baseMultiplier;\n const lastPriceCoefficient = 1 - baseMultiplier;\n const initialPrice = lastPriceCoefficient * position.lastPrice;\n adlCashFlow = (adlUnwindPrice - initialPrice) * position.base;\n }\n\n const unrealizedPnl =\n ((assetPrices.get(tokenInfo.quoteTokenId) ?? 0) - position.lastPrice) *\n position.base;\n\n pnl.set(\n tokenInfo.underlyingAssetId,\n (pnl.get(tokenInfo.underlyingAssetId) ?? 0) +\n position.realizedPnl +\n fundingCashFlow +\n adlCashFlow +\n unrealizedPnl,\n );\n });\n\n return Array.from(accountBalances.entries()).reduce(\n (sum, [address, balance]) =>\n sum +\n (balance + (pnl.get(address) ?? 0)) *\n (address === rUSDAddress\n ? 1\n : (assetPrices.get(address) ?? 0) / (rUSDPrice || 1)),\n 0,\n );\n};\n\nexport const calculateFundingPnl = ({\n marketFundingValue,\n marketBaseMultiplier,\n positionAvgEntryFundingValue,\n positionAdjustedBase,\n}: {\n marketFundingValue: number;\n marketBaseMultiplier: number;\n positionAvgEntryFundingValue: number;\n positionAdjustedBase: number;\n}): number => {\n return (\n -1 *\n (((marketFundingValue - positionAvgEntryFundingValue) *\n positionAdjustedBase) /\n marketBaseMultiplier)\n );\n};\n\nexport const calculatePricePnl = ({\n price,\n positionAvgEntryPrice,\n positionAdjustedBase,\n}: {\n price: number;\n positionAvgEntryPrice: number;\n positionAdjustedBase: number;\n}): number => {\n return (price - positionAvgEntryPrice) * positionAdjustedBase;\n};\n\nexport const calculateRealBalance = (\n netDeposits: BigNumber,\n realized_pnl: BigNumber,\n) => {\n return netDeposits.plus(realized_pnl);\n};\n\nexport const calculatePositionAdjustedQty = (\n origQty: BigNumber,\n marketBaseMultiplier: BigNumber,\n positionBaseMultiplier: BigNumber,\n): BigNumber => {\n return origQty.times(marketBaseMultiplier).div(positionBaseMultiplier);\n};\n\n/**\n * Note: This function assumes all the inputs are scaled by 10^18.\n */\nexport const calculatePositionAdlPnL = ({\n marketTrackerAdlUnwindPrice,\n marketTrackerBaseMultiplier,\n positionBase,\n positionAvgEntryPrice,\n positionTrackerBaseMultiplier,\n positionTrackerAdlUnwindPrice,\n}: {\n marketTrackerAdlUnwindPrice: BigNumber;\n marketTrackerBaseMultiplier: BigNumber;\n positionBase: BigNumber;\n positionAvgEntryPrice: BigNumber;\n positionTrackerBaseMultiplier: BigNumber;\n positionTrackerAdlUnwindPrice: BigNumber;\n}): BigNumber => {\n const currentAdlUnwindPrice = marketTrackerAdlUnwindPrice\n .minus(positionTrackerAdlUnwindPrice)\n .multipliedBy(1e18)\n .div(positionTrackerBaseMultiplier);\n\n const initialPrice = positionAvgEntryPrice\n .times(\n BigNumber(1e18).minus(\n marketTrackerBaseMultiplier\n .multipliedBy(1e18)\n .div(positionTrackerBaseMultiplier),\n ),\n )\n .div(1e18);\n\n const adlPnL = positionBase\n .times(currentAdlUnwindPrice.minus(initialPrice))\n .div(1e18);\n\n return adlPnL;\n};\n"]}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.amountDenormalizer = exports.amountNormalizer = void 0;
6
+ exports.floorTo = exports.amountDenormalizer = exports.amountNormalizer = void 0;
7
7
  var bignumber_js_1 = __importDefault(require("bignumber.js"));
8
8
  var ten = (0, bignumber_js_1.default)(10);
9
9
  var powCache = {};
@@ -17,4 +17,10 @@ function amountDenormalizer(value, decimals) {
17
17
  return (0, bignumber_js_1.default)(value).times(powCache[decimals] || (powCache[decimals] = ten.pow(decimals)));
18
18
  }
19
19
  exports.amountDenormalizer = amountDenormalizer;
20
+ // Floors to `decimals` decimal places
21
+ var floorTo = function (value, decimals) {
22
+ var factor = Math.pow(10, decimals);
23
+ return Math.floor(value * factor) / factor;
24
+ };
25
+ exports.floorTo = floorTo;
20
26
  //# sourceMappingURL=number.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"number.js","sourceRoot":"/","sources":["utils/number.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAqC;AAErC,IAAM,GAAG,GAAG,IAAA,sBAAS,EAAC,EAAE,CAAC,CAAC;AAC1B,IAAM,QAAQ,GAA8B,EAAE,CAAC;AAE/C,SAAgB,gBAAgB,CAC9B,KAAkC,EAClC,QAAqB;IAArB,yBAAA,EAAA,aAAqB;IAErB,OAAO,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC,GAAG,CACzB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAPD,4CAOC;AAED,SAAgB,kBAAkB,CAChC,KAAkC,EAClC,QAAqB;IAArB,yBAAA,EAAA,aAAqB;IAErB,OAAO,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC,KAAK,CAC3B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAPD,gDAOC","sourcesContent":["import BigNumber from 'bignumber.js';\n\nconst ten = BigNumber(10);\nconst powCache: Record<number, BigNumber> = {};\n\nexport function amountNormalizer(\n value: BigNumber | number | string,\n decimals: number = 18,\n): BigNumber {\n return BigNumber(value).div(\n powCache[decimals] || (powCache[decimals] = ten.pow(decimals)),\n );\n}\n\nexport function amountDenormalizer(\n value: BigNumber | number | string,\n decimals: number = 18,\n): BigNumber {\n return BigNumber(value).times(\n powCache[decimals] || (powCache[decimals] = ten.pow(decimals)),\n );\n}\n"]}
1
+ {"version":3,"file":"number.js","sourceRoot":"/","sources":["utils/number.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAqC;AAErC,IAAM,GAAG,GAAG,IAAA,sBAAS,EAAC,EAAE,CAAC,CAAC;AAC1B,IAAM,QAAQ,GAA8B,EAAE,CAAC;AAE/C,SAAgB,gBAAgB,CAC9B,KAAkC,EAClC,QAAqB;IAArB,yBAAA,EAAA,aAAqB;IAErB,OAAO,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC,GAAG,CACzB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAPD,4CAOC;AAED,SAAgB,kBAAkB,CAChC,KAAkC,EAClC,QAAqB;IAArB,yBAAA,EAAA,aAAqB;IAErB,OAAO,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC,KAAK,CAC3B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAPD,gDAOC;AAED,sCAAsC;AAC/B,IAAM,OAAO,GAAG,UAAC,KAAa,EAAE,QAAgB;IACrD,IAAM,MAAM,GAAG,SAAA,EAAE,EAAI,QAAQ,CAAA,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC,CAAC;AAHW,QAAA,OAAO,WAGlB","sourcesContent":["import BigNumber from 'bignumber.js';\n\nconst ten = BigNumber(10);\nconst powCache: Record<number, BigNumber> = {};\n\nexport function amountNormalizer(\n value: BigNumber | number | string,\n decimals: number = 18,\n): BigNumber {\n return BigNumber(value).div(\n powCache[decimals] || (powCache[decimals] = ten.pow(decimals)),\n );\n}\n\nexport function amountDenormalizer(\n value: BigNumber | number | string,\n decimals: number = 18,\n): BigNumber {\n return BigNumber(value).times(\n powCache[decimals] || (powCache[decimals] = ten.pow(decimals)),\n );\n}\n\n// Floors to `decimals` decimal places\nexport const floorTo = (value: number, decimals: number) => {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reyaxyz/common",
3
- "version": "0.333.1",
3
+ "version": "0.334.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -44,5 +44,5 @@
44
44
  "generate:coverage-badges": "npx istanbul-badges-readme --silent"
45
45
  },
46
46
  "packageManager": "pnpm@8.3.1",
47
- "gitHead": "5c95786b481ead419ecc1b2bd3dc675a9530f155"
47
+ "gitHead": "dd24f4ded375cdf56b8884ef0efc74c0855d1b7b"
48
48
  }
@@ -894,6 +894,12 @@ export class ExposureCommand {
894
894
  );
895
895
  }
896
896
 
897
+ /**
898
+ * @audit This function uses a linear approximation that is not aligned with the on-chain
899
+ * exponential logPriceMultiplier pricing logic (PriceMultiplier.sol). The intention is to
900
+ * deprecate this function completely once downstream consumers (PoolLiquidityCommand,
901
+ * updateLiquidity.task, marketDataLiquidity.task) are migrated.
902
+ */
897
903
  getSlippage(
898
904
  deltaBase: number,
899
905
  marketConfiguration: MarketConfiguration,
@@ -233,6 +233,9 @@ type MarketData = {
233
233
  shortBaseMultiplier?: number;
234
234
  longAdlUnwindPrice?: number;
235
235
  shortAdlUnwindPrice?: number;
236
+ depthFactor?: number;
237
+ priceSpread?: number;
238
+ logPriceMultiplier?: number;
236
239
  };
237
240
 
238
241
  type MarketTrackers = {
@@ -256,6 +259,9 @@ type MarketTrackers = {
256
259
  block_timestamp: Decimal | null;
257
260
  block_number: Decimal;
258
261
  unique_id: bigint | null;
262
+ price_spread: Decimal | null;
263
+ depth_factor: Decimal | null;
264
+ log_price_multiplier: Decimal | null;
259
265
  };
260
266
 
261
267
  export type TradingApiReplication<
@@ -561,6 +567,31 @@ export type TradingApiSource = {
561
567
  address: string;
562
568
  }
563
569
  >;
570
+ rlp: TradingApiEndpoint<
571
+ {
572
+ tvlInUsdc: number;
573
+ tvlInRlp: number;
574
+ rlpUsdcPrice: number;
575
+ apy: {
576
+ '1d': number;
577
+ '7d': number;
578
+ '30d': number;
579
+ '365d': number;
580
+ };
581
+ numberOfDepositors: number;
582
+ ageSeconds: number;
583
+ },
584
+ never
585
+ >;
586
+ 'wallet/:address/rlp': TradingApiEndpoint<
587
+ {
588
+ balanceInUsdc: number;
589
+ balanceInRlp: number;
590
+ },
591
+ {
592
+ address: string;
593
+ }
594
+ >;
564
595
  };
565
596
 
566
597
  export type Req<P = ParamsDictionary, ReqQuery = Query> = {
@@ -63,31 +63,136 @@ export const calculateMaxExposure = ({
63
63
  riskFactor: number;
64
64
  }) => poolBalance / (poolIMR * Math.sqrt(riskFactor));
65
65
 
66
+ /**
67
+ * Splits a trade exposure into rebalancing and unbalancing portions relative to pool net exposure.
68
+ * Rebalancing reduces pool's absolute exposure; unbalancing increases it.
69
+ */
70
+ export const splitTradeExposure = (
71
+ tradeExposure: number,
72
+ poolNetExposure: number,
73
+ ): { rebalancing: number; unbalancing: number } => {
74
+ if (tradeExposure === 0) {
75
+ return { rebalancing: 0, unbalancing: 0 };
76
+ }
77
+
78
+ // If pool has no exposure, entire trade is unbalancing
79
+ if (poolNetExposure === 0) {
80
+ return { rebalancing: 0, unbalancing: tradeExposure };
81
+ }
82
+
83
+ // Opposite sign means trade increases pool exposure → pure unbalancing
84
+ const sameSign =
85
+ (poolNetExposure > 0 && tradeExposure > 0) ||
86
+ (poolNetExposure < 0 && tradeExposure < 0);
87
+ if (!sameSign) {
88
+ return { rebalancing: 0, unbalancing: tradeExposure };
89
+ }
90
+
91
+ // Same sign: trade reduces pool exposure (pool takes opposite side)
92
+ const absPool = Math.abs(poolNetExposure);
93
+ const absTrade = Math.abs(tradeExposure);
94
+
95
+ if (absTrade <= absPool) {
96
+ // Pure rebalancing — trade doesn't cross zero
97
+ return { rebalancing: tradeExposure, unbalancing: 0 };
98
+ }
99
+
100
+ // Mixed: rebalance up to pool exposure, then unbalance the rest
101
+ const rebalancing = poolNetExposure;
102
+ const unbalancing = tradeExposure - rebalancing;
103
+ return { rebalancing, unbalancing };
104
+ };
105
+
106
+ /**
107
+ * Computes the new log price multiplier (logF) after a trade, handling both
108
+ * rebalancing and unbalancing portions.
109
+ *
110
+ * Mirrors on-chain logic in PriceMultiplier.sol:computeNewLogPriceMultiplier.
111
+ */
112
+ export const computeNewLogF = ({
113
+ currentLogF,
114
+ tradeExposure,
115
+ poolNetExposure,
116
+ depthFactor,
117
+ maxExposure,
118
+ }: {
119
+ currentLogF: number;
120
+ tradeExposure: number;
121
+ poolNetExposure: number;
122
+ depthFactor: number;
123
+ maxExposure: number;
124
+ }): number => {
125
+ if (tradeExposure === 0) return currentLogF;
126
+
127
+ const { rebalancing, unbalancing } = splitTradeExposure(
128
+ tradeExposure,
129
+ poolNetExposure,
130
+ );
131
+
132
+ // Case 1: Has unbalancing portion (includes mixed trades)
133
+ if (unbalancing !== 0) {
134
+ // If also rebalancing, it brings logF to 0 by definition (trade crosses zero)
135
+ const startLogF = rebalancing === 0 ? currentLogF : 0;
136
+ return startLogF + unbalancing / (depthFactor * maxExposure);
137
+ }
138
+
139
+ // Case 2: Only rebalancing
140
+ // Both rebalancing and poolNetExposure have the same sign, so ratio is in [0, 1]
141
+ if (rebalancing !== 0 && poolNetExposure !== 0) {
142
+ const ratio = rebalancing / poolNetExposure;
143
+ return currentLogF * (1 - ratio);
144
+ }
145
+
146
+ return currentLogF;
147
+ };
148
+
149
+ /**
150
+ * Estimates the execution price for a trade using the exponential logPriceMultiplier formula.
151
+ *
152
+ * Mirrors on-chain logic:
153
+ * 1. computeNewLogPriceMultiplier (PriceMultiplier.sol)
154
+ * 2. computeAmmPrice: ammPrice = oraclePrice * exp(logF)
155
+ * 3. computeSignedSpread: executionPrice = ammPrice * (1 + signedSpread)
156
+ *
157
+ * @audit spreadDiscount not applied — known limitation, to be addressed later
158
+ * @audit priceSpacing rounding not applied
159
+ */
66
160
  export const calculateEstimatedExecutionPrice = ({
67
- poolPrice,
68
161
  oraclePrice,
69
- tradeBaseSize,
70
- poolMaxExposure,
71
- marketDepthFactor,
72
- marketSpread,
162
+ currentLogF,
163
+ tradeExposure,
164
+ poolNetExposure,
165
+ depthFactor,
166
+ maxExposure,
167
+ priceSpread,
73
168
  }: {
74
- poolPrice: number;
75
169
  oraclePrice: number;
76
- tradeBaseSize: number;
77
- poolMaxExposure: number;
78
- marketDepthFactor: number;
79
- marketSpread: number;
170
+ currentLogF: number;
171
+ tradeExposure: number;
172
+ poolNetExposure: number;
173
+ depthFactor: number;
174
+ maxExposure: number;
175
+ priceSpread: number;
80
176
  }): number => {
81
- if (tradeBaseSize === 0) {
82
- return poolPrice;
177
+ if (tradeExposure === 0) {
178
+ return oraclePrice * Math.exp(currentLogF);
83
179
  }
84
180
 
85
- const poolDeviation =
86
- (tradeBaseSize * oraclePrice) / (marketDepthFactor * poolMaxExposure);
87
- const appliedSpread = tradeBaseSize > 0 ? marketSpread : -marketSpread;
88
- const estExecutionPrice = poolPrice * (1 + poolDeviation + appliedSpread);
181
+ // 1. Compute new logF after trade impact
182
+ const newLogF = computeNewLogF({
183
+ currentLogF,
184
+ tradeExposure,
185
+ poolNetExposure,
186
+ depthFactor,
187
+ maxExposure,
188
+ });
189
+
190
+ // 2. Compute AMM price: oraclePrice * exp(newLogF)
191
+ const ammPrice = oraclePrice * Math.exp(newLogF);
89
192
 
90
- return Math.max(0, estExecutionPrice);
193
+ // 3. Apply signed spread
194
+ const signedSpread = tradeExposure > 0 ? priceSpread : -priceSpread;
195
+ return Math.max(0, ammPrice * (1 + signedSpread));
91
196
  };
92
197
 
93
198
  export const calculateTradeFee = ({
@@ -20,3 +20,9 @@ export function amountDenormalizer(
20
20
  powCache[decimals] || (powCache[decimals] = ten.pow(decimals)),
21
21
  );
22
22
  }
23
+
24
+ // Floors to `decimals` decimal places
25
+ export const floorTo = (value: number, decimals: number) => {
26
+ const factor = 10 ** decimals;
27
+ return Math.floor(value * factor) / factor;
28
+ };