@panoptic-eng/sdk 1.0.61 → 1.0.62

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.
@@ -11964,4 +11964,4 @@ function formatPerSecondRateWadAsAprPct(ratePerSecondWad, precision) {
11964
11964
  }
11965
11965
 
11966
11966
  //#endregion
11967
- export { AccountInsolventError, AlreadyInitializedError, BatchValidationError, BelowMinimumRedemptionError, CastingError, ChunkHasZeroLiquidityError, ChunkLimitError, CrossPoolError, DEFAULT_MAX_SPREAD, DEFAULT_MINT_BUFFER, DEFAULT_VEGOID, DepositTooLargeError, DuplicateTokenIdError, EffectiveLiquidityAboveThresholdError, ExceedsMaximumRedemptionError, InputListFailError, InsufficientCreditLiquidityError, InvalidBuilderCodeError, InvalidHistoryRangeError, InvalidTickBoundError, InvalidTickError, InvalidTickLimitsError, InvalidTokenIdParameterError, InvalidUniswapCallbackError, LEG_BITS, LEG_LIMITS, LEG_MASKS, LengthMismatchError, LiquidityTooHighError, LoanSlotExhaustedError, MINT_BUFFER, MINT_BUFFER_DENOMINATOR, MaxRetriesExceededError, MissingPositionIdsError, MulticallNoDataError, MulticallResultFailedError, MulticallResultMissingError, NetLiquidityZeroError, NetworkMismatchError, NoLegsExercisableError, NoLoanPositionsError, NotALongLegError, NotBuilderError, NotEnoughLiquidityInChunkError, NotEnoughTokensError, NotGuardianError, NotMarginCalledError, NotPanopticPoolError, OracleRateLimitedError, PanopticError, PanopticHelperNotDeployedError, PanopticValidationError, PoolNotInitializedError, PositionCountNotZeroError, PositionNotOwnedError, PositionSnapshotNotFoundError, PositionTooLargeError, PriceBoundFailError, PriceImpactTooLargeError, ProviderLagError, ReentrancyError, RpcError, RpcResponseError, STANDARD_TICK_WIDTHS, STRIKE_CONVERSION_FACTOR, SafeModeError, StaleDataError, StaleOracleError, StorageDataNotFoundError, SwapTokenMismatchError, SyncTimeoutError, TOKEN_ID_BITS, TokenIdHasZeroLegsError, TooManyLegsOpenError, TransferFailedError, UnauthorizedUniswapCallbackError, UnderOverFlowError, UnhealthyPoolError, UnsafePremiumSettlementError, WrongPoolIdError, WrongUniswapPoolError, ZeroAddressError, ZeroCollateralRequirementError, annualizePerSecondRateWad, applyMintBuffer, applyMintBufferPerToken, availableToBorrow, clearTrackedPositions, collateralTrackerV2Abi, createFileStorage, createMemoryStorage, createTxResult, decodeAllDispatchCalldata, decodeDispatchCalldata, decodeLeftRightSigned, decodeLeftRightUnsigned, decodeOraclePack, decodeOracleRiskParameters, decodeOracleTiming, decodePosition, decodePositionBalance$1 as decodePositionBalance, decodeTickSpacing, diagnoseOracleSafeMode, fetchPoolId, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, formatRateWad, formatTokenAmount, formatTokenAmountSigned, formatTokenDelta, formatTokenFlow, formatWad, formatWadPercent, formatWadSigned, getBlockMeta, getClosedPositionsKey, getOpenPositionIds, getOracleRiskParameters, getOracleState, getPendingPositionsKey, getPool, getPoolCurrentTick, getPoolMetaKey, getPoolMetadata, getPoolPrefix, getPosition, getPositionGreeks, getPositionMetaKey, getPositions, getPositionsKey, getRiskParameters, getSchemaVersionKey, getSyncCheckpointKey, getTrackedChunksKey, getTrackedPositionIds, getUtilization, isPanopticErrorType, isPositionTracked, jsonSerializer, mintableAfterBuffer, oracleEpochAt, panopticErrorsAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticGuardianAbi, panopticLiquidatorAbi, panopticPoolV2Abi, panopticQueryAbi, parsePanopticError, parseTokenAmount, parseWad, recoverSnapshot, recoverSnapshotFromTx, riskEngineAbi, selectDispatchForAccount, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, stateViewAbi, submitWrite, uniswapV3PoolAbi, validateBuilderCode };
11967
+ export { AccountInsolventError, AlreadyInitializedError, BatchValidationError, BelowMinimumRedemptionError, CastingError, ChunkHasZeroLiquidityError, ChunkLimitError, CrossPoolError, DEFAULT_MAX_SPREAD, DEFAULT_MINT_BUFFER, DEFAULT_VEGOID, DepositTooLargeError, DuplicateTokenIdError, EffectiveLiquidityAboveThresholdError, ExceedsMaximumRedemptionError, InputListFailError, InsufficientCreditLiquidityError, InvalidBuilderCodeError, InvalidHistoryRangeError, InvalidTickBoundError, InvalidTickError, InvalidTickLimitsError, InvalidTokenIdParameterError, InvalidUniswapCallbackError, LEG_BITS, LEG_LIMITS, LEG_MASKS, LengthMismatchError, LiquidityTooHighError, LoanSlotExhaustedError, MINT_BUFFER, MINT_BUFFER_DENOMINATOR, MaxRetriesExceededError, MissingPositionIdsError, MulticallNoDataError, MulticallResultFailedError, MulticallResultMissingError, NetLiquidityZeroError, NetworkMismatchError, NoLegsExercisableError, NoLoanPositionsError, NotALongLegError, NotBuilderError, NotEnoughLiquidityInChunkError, NotEnoughTokensError, NotGuardianError, NotMarginCalledError, NotPanopticPoolError, OracleRateLimitedError, PanopticError, PanopticHelperNotDeployedError, PanopticValidationError, PoolNotInitializedError, PositionCountNotZeroError, PositionNotOwnedError, PositionSnapshotNotFoundError, PositionTooLargeError, PriceBoundFailError, PriceImpactTooLargeError, ProviderLagError, ReentrancyError, RpcError, RpcResponseError, STANDARD_TICK_WIDTHS, STRIKE_CONVERSION_FACTOR, SafeModeError, StaleDataError, StaleOracleError, StorageDataNotFoundError, SwapTokenMismatchError, SyncTimeoutError, TOKEN_ID_BITS, TokenIdHasZeroLegsError, TooManyLegsOpenError, TransferFailedError, UnauthorizedUniswapCallbackError, UnderOverFlowError, UnhealthyPoolError, UnsafePremiumSettlementError, WrongPoolIdError, WrongUniswapPoolError, ZeroAddressError, ZeroCollateralRequirementError, annualizePerSecondRateWad, applyMintBuffer, applyMintBufferPerToken, availableToBorrow, clearTrackedPositions, collateralTrackerV2Abi, createFileStorage, createMemoryStorage, createTxResult, decodeAllDispatchCalldata, decodeDispatchCalldata, decodeLeftRightSigned, decodeLeftRightUnsigned, decodeOraclePack, decodeOracleRiskParameters, decodeOracleTiming, decodePosition, decodePositionBalance$1 as decodePositionBalance, decodeTickSpacing as decodeTickSpacing$1, diagnoseOracleSafeMode, fetchPoolId, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, formatRateWad, formatTokenAmount, formatTokenAmountSigned, formatTokenDelta, formatTokenFlow, formatWad, formatWadPercent, formatWadSigned, getBlockMeta, getClosedPositionsKey, getOpenPositionIds, getOracleRiskParameters, getOracleState, getPendingPositionsKey, getPool, getPoolCurrentTick, getPoolMetaKey, getPoolMetadata, getPoolPrefix, getPosition, getPositionGreeks, getPositionMetaKey, getPositions, getPositionsKey, getRiskParameters, getSchemaVersionKey, getSyncCheckpointKey, getTrackedChunksKey, getTrackedPositionIds, getUtilization, isPanopticErrorType, isPositionTracked, jsonSerializer, mintableAfterBuffer, oracleEpochAt, panopticErrorsAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticGuardianAbi, panopticLiquidatorAbi, panopticPoolV2Abi, panopticQueryAbi, parsePanopticError, parseTokenAmount, parseWad, recoverSnapshot, recoverSnapshotFromTx, riskEngineAbi, selectDispatchForAccount, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, stateViewAbi, submitWrite, uniswapV3PoolAbi, validateBuilderCode };
@@ -1,6 +1,6 @@
1
- import { PanopticError, getBlockMeta, getPoolMetadata, submitWrite } from "./rates-CPHxWqpT.js";
1
+ import { PanopticError, getBlockMeta, getPoolMetadata, submitWrite } from "./rates-BwZnK0tG.js";
2
2
  import { tickToSqrtPriceX96 } from "./greeks-CNi1-cnp.js";
3
- import { decodeAllLegs } from "./writes-gs0k0uoN.js";
3
+ import { decodeAllLegs } from "./writes-B8NGXzUG.js";
4
4
  import { BaseError, ContractFunctionRevertedError, encodeAbiParameters, encodeFunctionData, encodePacked, isAddressEqual, zeroAddress } from "viem";
5
5
 
6
6
  //#region src/uniswap/lpDeposit.ts
@@ -1,5 +1,5 @@
1
- import { PanopticError, getBlockMeta, getPool, submitWrite } from "./rates-CPHxWqpT.js";
2
- import { AmountExceedsUint128Error, InvalidSwapTokenError, MissingSweepRecipientError, QuoterUnavailableError, getUniswapV4Addresses, universalRouterAbi } from "./router-BZGHjEcU.js";
1
+ import { PanopticError, getBlockMeta, getPool, submitWrite } from "./rates-BwZnK0tG.js";
2
+ import { AmountExceedsUint128Error, InvalidSwapTokenError, MissingSweepRecipientError, QuoterUnavailableError, getUniswapV4Addresses, universalRouterAbi } from "./router-Y1OxL9Nt.js";
3
3
  import { BaseError, ContractFunctionRevertedError, encodeAbiParameters, encodeFunctionData, encodePacked, erc20Abi, isAddressEqual, maxUint256, zeroAddress } from "viem";
4
4
 
5
5
  //#region src/uniswap/v4/router/encodeSwap.ts
@@ -1,4 +1,4 @@
1
- import { ROBINHOOD_CHAIN_ID } from "./chainDeployments-CmDzAmZ3.js";
1
+ import { ROBINHOOD_CHAIN_ID } from "./chainDeployments-BhXMBZ4B.js";
2
2
  import { hexToBigInt } from "viem";
3
3
  import { estimateFeesPerGas, getBlock, getFeeHistory } from "viem/actions";
4
4
 
@@ -1,9 +1,9 @@
1
- import { StateViewAbi, getAccountCollateral, panopticQueryAbi$1 as panopticQueryAbi, readBlockAndAggregate, requireReturnData } from "./irm-BEug2-TH.js";
2
- import { AccountInsolventError, ChunkLimitError, DEFAULT_VEGOID, InvalidHistoryRangeError, MulticallResultMissingError, NotEnoughTokensError, PanopticError, PanopticValidationError, SafeModeError, StaleDataError, StorageDataNotFoundError, UnhealthyPoolError, WrongUniswapPoolError, applyMintBufferPerToken, availableToBorrow, collateralTrackerV2Abi, decodeLeftRightSigned, decodeLeftRightUnsigned, decodePositionBalance, getBlockMeta, getClosedPositionsKey, getPendingPositionsKey, getPool, getPoolMetaKey, getPoolMetadata, getPositionMetaKey, getPositionsKey, getTrackedChunksKey, getTrackedPositionIds, isPanopticErrorType, jsonSerializer, mintableAfterBuffer, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticGuardianAbi, panopticLiquidatorAbi, panopticPoolV2Abi, panopticQueryAbi as panopticQueryAbi$1, parsePanopticError, riskEngineAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, stateViewAbi, uniswapV3PoolAbi } from "./rates-CPHxWqpT.js";
1
+ import { StateViewAbi, getAccountCollateral, panopticQueryAbi$1 as panopticQueryAbi, readBlockAndAggregate, requireReturnData } from "./irm-BDlcUNgJ.js";
2
+ import { AccountInsolventError, ChunkLimitError, DEFAULT_VEGOID, InvalidHistoryRangeError, MulticallResultMissingError, NotEnoughTokensError, PanopticError, PanopticValidationError, SafeModeError, StaleDataError, StorageDataNotFoundError, UnhealthyPoolError, WrongUniswapPoolError, applyMintBufferPerToken, availableToBorrow, collateralTrackerV2Abi, decodeLeftRightSigned, decodeLeftRightUnsigned, decodePositionBalance, getBlockMeta, getClosedPositionsKey, getPendingPositionsKey, getPool, getPoolMetaKey, getPoolMetadata, getPositionMetaKey, getPositionsKey, getTrackedChunksKey, getTrackedPositionIds, isPanopticErrorType, jsonSerializer, mintableAfterBuffer, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticGuardianAbi, panopticLiquidatorAbi, panopticPoolV2Abi, panopticQueryAbi as panopticQueryAbi$1, parsePanopticError, riskEngineAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, stateViewAbi, uniswapV3PoolAbi } from "./rates-BwZnK0tG.js";
3
3
  import { MAX_TICK, MAX_TRACKED_CHUNKS, MIN_TICK, NO_LOWER_LIQUIDATION_TICK, NO_UPPER_LIQUIDATION_TICK, WAD, calculatePositionDelta, calculatePositionDeltaDebtOnly, calculatePositionGamma, calculatePositionValue, priceToTick, sqrtPriceX96ToTick, tickLimits, tickToPriceDecimalScaled, tickToSqrtPriceX96, toVaultFrameAtTick } from "./greeks-CNi1-cnp.js";
4
- import { addLegToTokenId, buildBatchDispatchArgs, buildUniqueCredit, buildUniqueLoan, countLegs, createTokenIdBuilder, decodeAllLegs, decodeTokenId, getPoolTokensForSimulation, loadCheckpoint, resolveTokenIndex, simulateDispatch, simulateOpenPosition, simulateWithTokenFlow } from "./writes-gs0k0uoN.js";
5
- import { getLpPositionFunding, getMaxLpPositionSize } from "./router-BZGHjEcU.js";
6
- import { BaseError, ContractFunctionExecutionError, ContractFunctionRevertedError, ExecutionRevertedError, decodeFunctionResult, encodeAbiParameters, encodeFunctionData, getAddress, hexToString, keccak256, parseAbi, toHex, trim, zeroAddress } from "viem";
4
+ import { addLegToTokenId, buildBatchDispatchArgs, buildUniqueCredit, buildUniqueLoan, countLegs, createTokenIdBuilder, decodeAllLegs, decodeTokenId, getPoolTokensForSimulation, loadCheckpoint, resolveTokenIndex, simulateDispatch, simulateOpenPosition, simulateWithTokenFlow } from "./writes-B8NGXzUG.js";
5
+ import { getLpPositionFunding, getMaxLpPositionSize } from "./router-Y1OxL9Nt.js";
6
+ import { BaseError, ContractFunctionExecutionError, ContractFunctionRevertedError, ExecutionRevertedError, decodeFunctionResult, encodeAbiParameters, encodeFunctionData, getAddress, hexToString, keccak256, parseAbi, parseEventLogs, toHex, trim, zeroAddress } from "viem";
7
7
  import { multicall } from "viem/actions";
8
8
  import Decimal from "decimal.js";
9
9
 
@@ -4467,6 +4467,7 @@ async function fetchV3BlockSnapshot(client, poolAddress, blockNumber, uniqueTick
4467
4467
  for (let i = 0; i < uniqueTicks.length; i++) {
4468
4468
  const tickResult = results[3 + i];
4469
4469
  tickData.set(uniqueTicks[i], {
4470
+ liquidityGross: tickResult[0],
4470
4471
  feeGrowthOutside0: tickResult[2],
4471
4472
  feeGrowthOutside1: tickResult[3]
4472
4473
  });
@@ -4512,6 +4513,7 @@ async function fetchV4BlockSnapshot(client, stateViewAddress, poolId, blockNumbe
4512
4513
  for (let i = 0; i < uniqueTicks.length; i++) {
4513
4514
  const tickResult = results[2 + i];
4514
4515
  tickData.set(uniqueTicks[i], {
4516
+ liquidityGross: tickResult[0],
4515
4517
  feeGrowthOutside0: tickResult[2],
4516
4518
  feeGrowthOutside1: tickResult[3]
4517
4519
  });
@@ -9901,6 +9903,131 @@ function marketRiskFromValues({ lower, current, upper }) {
9901
9903
  };
9902
9904
  }
9903
9905
 
9906
+ //#endregion
9907
+ //#region src/panoptic/v2/greeks/positionVolatility.ts
9908
+ const Precision = Decimal.clone({ precision: 80 });
9909
+ const Q96 = 1n << 96n;
9910
+ const YEAR_SECONDS = new Precision(31536e3);
9911
+ /** The premium-free position curve, expressed in one quote token's human units. */
9912
+ function preparePositionGamma({ tokenId, positionSize, quoteIsToken0, quoteDecimals }) {
9913
+ if (positionSize <= 0n || positionSize >= 1n << 128n) throw new RangeError("Invalid position size");
9914
+ if (!Number.isInteger(quoteDecimals) || quoteDecimals < 0 || quoteDecimals > 255) throw new RangeError("Invalid quote decimals");
9915
+ const decoded = decodeTokenId(tokenId);
9916
+ const chunks = decoded.legs.flatMap((leg) => {
9917
+ if (leg.width === 0n) return [];
9918
+ const width = leg.width * decoded.tickSpacing;
9919
+ const lowerTick = leg.strike - width / 2n;
9920
+ const upperTick = leg.strike + (width + 1n) / 2n;
9921
+ if (lowerTick < -887272n || upperTick > 887272n || lowerTick >= upperTick) throw new RangeError("Invalid position range");
9922
+ const lower = tickToSqrtPriceX96(lowerTick);
9923
+ const upper = tickToSqrtPriceX96(upperTick);
9924
+ const amount = positionSize * leg.optionRatio;
9925
+ const liquidity = leg.asset === 0n ? amount * (lower * upper / Q96) / (upper - lower) : amount * Q96 / (upper - lower);
9926
+ if (liquidity >= 1n << 128n) throw new RangeError("Liquidity exceeds uint128");
9927
+ return [{
9928
+ lowerTick: Number(lowerTick),
9929
+ upperTick: Number(upperTick),
9930
+ liquidity,
9931
+ isLong: leg.isLong
9932
+ }];
9933
+ });
9934
+ const scale = new Precision(10).pow(quoteDecimals);
9935
+ const atTick = (tick) => {
9936
+ const netLiquidity = chunks.reduce((sum$1, chunk) => tick >= BigInt(chunk.lowerTick) && tick < BigInt(chunk.upperTick) ? sum$1 + (chunk.isLong ? -chunk.liquidity : chunk.liquidity) : sum$1, 0n);
9937
+ const sqrt = new Precision(tickToSqrtPriceX96(tick).toString()).div(Q96.toString());
9938
+ const gamma = new Precision(netLiquidity.toString()).neg().div(2).div(scale);
9939
+ return quoteIsToken0 ? gamma.div(sqrt) : gamma.mul(sqrt);
9940
+ };
9941
+ const inRange = (low, high) => {
9942
+ if (low > high) throw new RangeError("Invalid candle range");
9943
+ const ticks = new Set([low, high]);
9944
+ for (const chunk of chunks) for (const boundary of [BigInt(chunk.lowerTick), BigInt(chunk.upperTick)]) {
9945
+ if (boundary >= low && boundary <= high) ticks.add(boundary);
9946
+ if (boundary - 1n >= low && boundary - 1n <= high) ticks.add(boundary - 1n);
9947
+ }
9948
+ return [...ticks].map(atTick);
9949
+ };
9950
+ return {
9951
+ chunks,
9952
+ atTick,
9953
+ inRange
9954
+ };
9955
+ }
9956
+ /** Historical whole-position diagnostics, with signs retained independently of eligibility. */
9957
+ function calculatePositionVolatilityMetrics({ observations, netPremium, baseFees, quoteDecimals }) {
9958
+ if (observations.length < 2) throw new RangeError("At least two price observations are required");
9959
+ if (!Number.isInteger(quoteDecimals) || quoteDecimals < 0 || quoteDecimals > 255) throw new RangeError("Invalid quote decimals");
9960
+ const points = observations.map((point) => ({
9961
+ ...point,
9962
+ price: new Precision(point.price),
9963
+ gamma: new Precision(point.gamma),
9964
+ rangeGammas: (point.rangeGammas ?? []).map((gamma) => new Precision(gamma))
9965
+ }));
9966
+ for (const point of points) if (!point.price.isFinite() || point.price.lte(0) || !point.gamma.isFinite() || point.rangeGammas.some((gamma) => !gamma.isFinite())) throw new RangeError("Invalid price or gamma observation");
9967
+ const quantum = new Precision(10).pow(-quoteDecimals);
9968
+ const gammas = points.flatMap((point) => [point.gamma, ...point.rangeGammas]);
9969
+ const peak = gammas.reduce((max, gamma) => Precision.max(max, gamma.abs()), new Precision(0));
9970
+ const tolerance = Precision.max(quantum, peak.mul("1e-12"));
9971
+ const positive = gammas.some((gamma) => gamma.gt(tolerance));
9972
+ const negative = gammas.some((gamma) => gamma.lt(tolerance.neg()));
9973
+ const gammaSign = positive && negative ? "changing" : positive ? "positive" : negative ? "negative" : "zero";
9974
+ let exposure = new Precision(0);
9975
+ let signedConvexity = new Precision(0);
9976
+ let absoluteConvexity = new Precision(0);
9977
+ let years = new Precision(0);
9978
+ for (let i = 1; i < points.length; i++) {
9979
+ const previous = points[i - 1];
9980
+ const point = points[i];
9981
+ const seconds = point.timestamp - previous.timestamp;
9982
+ if (seconds <= 0n) throw new RangeError("Observations must have increasing timestamps");
9983
+ const elapsed = new Precision(seconds.toString()).div(YEAR_SECONDS);
9984
+ const squaredReturn = point.price.div(previous.price).ln().pow(2);
9985
+ exposure = exposure.plus(previous.gamma.abs().mul(elapsed));
9986
+ signedConvexity = signedConvexity.plus(previous.gamma.mul(squaredReturn).div(2));
9987
+ absoluteConvexity = absoluteConvexity.plus(previous.gamma.abs().mul(squaredReturn).div(2));
9988
+ years = years.plus(elapsed);
9989
+ }
9990
+ const sufficientExposure = exposure.gt(tolerance.mul(years).mul(100));
9991
+ const premium = netPremium === null ? null : new Precision(netPremium);
9992
+ const fees = baseFees == null ? null : new Precision(baseFees);
9993
+ if (premium !== null && !premium.isFinite() || fees !== null && !fees.isFinite()) throw new RangeError("Invalid accounting amount");
9994
+ const consistent = (amount) => gammaSign === "positive" ? amount.lte(quantum) : gammaSign === "negative" && amount.gte(quantum.neg());
9995
+ const reason = !sufficientExposure ? "insufficient-exposure" : gammaSign === "changing" ? "changing-sign" : premium === null ? "premium-unavailable" : !consistent(premium) ? "inconsistent-premium-direction" : null;
9996
+ const equivalent = (amount) => amount.abs().mul(2).div(exposure).sqrt().toString();
9997
+ const coverage = (amount) => absoluteConvexity.gt(quantum) ? amount.abs().div(absoluteConvexity).toString() : null;
9998
+ const eligibleFees = sufficientExposure && fees !== null && consistent(fees);
9999
+ return {
10000
+ gammaSign,
10001
+ exposure: exposure.toString(),
10002
+ signedConvexity: signedConvexity.toString(),
10003
+ absoluteConvexity: absoluteConvexity.toString(),
10004
+ netPremium: premium?.toString() ?? null,
10005
+ estimatedHedgedResult: premium?.plus(signedConvexity).toString() ?? null,
10006
+ weightedRealizedVolatility: sufficientExposure ? equivalent(absoluteConvexity) : null,
10007
+ premiumEquivalentVolatility: reason === null && premium !== null ? equivalent(premium) : null,
10008
+ premiumToConvexity: reason === null && premium !== null ? coverage(premium) : null,
10009
+ baseFees: fees?.toString() ?? null,
10010
+ feeEquivalentVolatility: eligibleFees ? equivalent(fees) : null,
10011
+ feeToConvexity: eligibleFees ? coverage(fees) : null,
10012
+ comparisonReason: reason
10013
+ };
10014
+ }
10015
+ /** Quote-value signed cumulative token increments, excluding revaluation of previous accrual. */
10016
+ function valuePositionAccrual({ snapshots, quoteIsToken0, quoteDecimals }) {
10017
+ let previous0 = 0n;
10018
+ let previous1 = 0n;
10019
+ let total = new Precision(0);
10020
+ for (const snapshot of snapshots) {
10021
+ const amount0 = new Precision((snapshot.token0 - previous0).toString());
10022
+ const amount1 = new Precision((snapshot.token1 - previous1).toString());
10023
+ const price = new Precision("1.0001").pow(snapshot.tick.toString());
10024
+ total = total.plus(quoteIsToken0 ? amount0.plus(amount1.div(price)) : amount1.plus(amount0.mul(price)));
10025
+ previous0 = snapshot.token0;
10026
+ previous1 = snapshot.token1;
10027
+ }
10028
+ return total.div(new Precision(10).pow(quoteDecimals));
10029
+ }
10030
+
9904
10031
  //#endregion
9905
10032
  //#region src/panoptic/v2/reads/collateralCurve.ts
9906
10033
  /** Native-token margin inputs, independent of the tick used to display the curve. */
@@ -10094,4 +10221,219 @@ function preparePositionValueCurve(curve) {
10094
10221
  }
10095
10222
 
10096
10223
  //#endregion
10097
- export { DEFAULT_MIN_SWAP_RATIO_BPS, DEFAULT_RECONNECT_CONFIG, MARKET_INDICATOR_PERIODS, REQUIRED_BASE_ERROR_SENTINEL, STRIKE_LADDER_TARGET_STRIKES, VARIANCE_RATIO_LAG, addPendingPosition, addTrackedChunks, apportion, assertCanBurn, assertCanForceExercise, assertCanLiquidate, assertCanMint, assertFresh, assertHealthy, assertLpPositionFunded, assertTradeable, buildCreditWrappedDispatch, buildSfpmSwapCalldata, buildSfpmSwapPlan, buildTemporaryLoanRecoveryDispatch, buildTokenShortfallRecoveryDispatch, calculateAccountGreeksPure, calculateMarketIndicator, calculateSpreadWad, calculateVarianceProfile, checkCollateralAcrossTicks, classifyStrategyGroups, classifyStrike, cleanupStalePendingPositions, clearPendingPositions, clearTrackedChunks, clearTradeHistory, collateralCurveTicks, collateralRuleKindFor, computeV4PoolId, confirmPendingPosition, convertToAssets, convertToShares, createEventPoller, createEventSubscription, createFlowNeutralTokenId, decodePanopticTokenURI, emptyLiquidateParams, encodePoolKeyBytes, encodeV3PoolKeyBytes, ensureSfpmV3PoolInitialized, estimateBlockNumbers, estimateCollateralBreakdown, estimateCollateralRequired, failPendingPosition, feeGrowthInsideX128, feesFromFeeGrowthDelta, fetchSfpmV3PoolId, fetchUniswapFeeData, getAccountBuyingPower, getAccountGreeks, getAccountHistory, getChunkLiquidities, getChunkSpreads, getClosedPositions, getCollateralCurve, getCollateralCurveInputs, getCollateralRequiredBase, getCollateralSharePrices, getCollateralTotalAssetsBatch, getDeltaHedgeParams, getEnforcedTickLimits, getExecutableLpMaxSize, getFactoryConstructMetadata, getFactoryOwnerOf, getFactoryTokenURI, getGuardianUnlockState, getHedgeLimits, getItmAmounts, getMarginBuffer, getMaxPositionSize, getMaxRedeem, getMaxWithdrawable, getNativeTokenPrice, getNotEnoughTokensError, getOpenPositionPreview, getPanopticPoolAddress, getPanopticPoolFromPoolId, getPendingPositions, getPoolCollateralAddresses, getPoolLiquidities, getPortfolioValue, getPositionChunkData, getPositionEnrichmentData, getPositionValueCurve, getPriceHistory, getRealizedPnL, getRequiredCreditForITM, getSafeMode, getStreamiaHistory, getSyncStatus, getTrackedChunks, getTradeHistory, getUniswapFeeHistory, getUniswapV3LpPositionState, getUniswapV3PoolFromId, getUniswapV3PoolInfo, getUniswapV3PoolLiquidities, getUniswapV4LpPositionState, getUniswapV4PoolBasicState, getUniswapV4PoolInfo, getUniswapV4PoolKeyFromId, getUniswapV4PoolLiquidities, interpolateBlocks, isGasError, isNonceError, isRetryableRpcError, isolateGroupTokenId, ladderStrikeSequence, logReturns, marketPnlInQuote, marketRiskFromValues, marketScenario, minePoolAddress, minePoolAddressLocalAsync, multicallRead, netLiquidationValueInQuote, optimizeTokenIdRiskPartners, parseCollateralLog, parsePoolLog, positionValueKey, positionValueTicks, prepareIndicatorCandles, preparePositionValueCurve, previewDeposit, previewMint, previewRedeem, previewWithdraw, quoteLiquidation, quoteOneTokenFlow, quoteSfpmSwap, quoteTemporaryLoanRecovery, quoteTokenShortfallRecovery, realizedBeta, removeTrackedChunks, resolveBlockNumbers, resolveLadderStrike, resolvePanopticPoolFromPoolId, resolveUniswapV4PoolKey, saveClosedPosition, scaleCollateralRequired, scanChunks, screenAccountExact, simulateBatchDispatch, simulateClosePosition, simulateDeployNewPool, simulateDeposit, simulateForceExercise, simulateLiquidate, simulateSFPMBurn, simulateSFPMMint, simulateSwapExactIn, simulateSwapExactOut, simulateWithdraw, slippageBpsToTickDistance, watchEvents };
10224
+ //#region src/panoptic/v2/reads/positionVolatilityHistory.ts
10225
+ const signedSlot = (value) => BigInt.asIntN(128, value);
10226
+ const unpack = (value) => ({
10227
+ token0: signedSlot(value),
10228
+ token1: signedSlot(value >> 128n)
10229
+ });
10230
+ /** RPC accounting for exactly one mint lifecycle; candle prices are supplied by the application. */
10231
+ async function getPositionVolatilityHistory({ client, poolAddress, account, tokenId, mintBlock, endBlock, poolConfig, includeBaseFees = false }) {
10232
+ if (mintBlock <= 0n || endBlock <= mintBlock) throw new RangeError("Insufficient lifecycle history");
10233
+ const [mints, burns] = await Promise.all([client.getContractEvents({
10234
+ address: poolAddress,
10235
+ abi: panopticPoolV2Abi,
10236
+ eventName: "OptionMinted",
10237
+ args: {
10238
+ recipient: account,
10239
+ tokenId
10240
+ },
10241
+ fromBlock: mintBlock,
10242
+ toBlock: mintBlock,
10243
+ strict: true
10244
+ }), client.getContractEvents({
10245
+ address: poolAddress,
10246
+ abi: panopticPoolV2Abi,
10247
+ eventName: "OptionBurnt",
10248
+ args: {
10249
+ recipient: account,
10250
+ tokenId
10251
+ },
10252
+ fromBlock: mintBlock,
10253
+ toBlock: endBlock,
10254
+ strict: true
10255
+ })]);
10256
+ const mint = mints[0];
10257
+ if (mints.length !== 1 || !mint) throw new Error("Opening event is missing or ambiguous");
10258
+ const balance = decodePositionBalance(mint.args.balanceData);
10259
+ const close = burns.filter((burn) => burn.blockNumber > mintBlock || burn.logIndex > mint.logIndex).sort((a, b) => a.blockNumber === b.blockNumber ? a.logIndex - b.logIndex : a.blockNumber < b.blockNumber ? -1 : 1)[0];
10260
+ const finalBlock = close?.blockNumber ?? endBlock;
10261
+ if (finalBlock <= mintBlock) throw new Error("Intrablock lifecycle cannot be reconstructed");
10262
+ if (close && close.args.positionSize !== balance.positionSize) throw new Error("Position size changed");
10263
+ const [start, end, boundaryPrices] = await Promise.all([
10264
+ getBlockMeta({
10265
+ client,
10266
+ blockNumber: mintBlock
10267
+ }),
10268
+ getBlockMeta({
10269
+ client,
10270
+ blockNumber: finalBlock
10271
+ }),
10272
+ getPriceHistory({
10273
+ client,
10274
+ poolConfig,
10275
+ blockNumbers: [mintBlock, finalBlock]
10276
+ })
10277
+ ]);
10278
+ const openingPrice = boundaryPrices.snapshots[0];
10279
+ const endingPrice = boundaryPrices.snapshots[1];
10280
+ if (!openingPrice || !endingPrice) throw new Error("Boundary prices unavailable");
10281
+ const pointCount = Math.min(200, Math.max(2, Number((end.blockTimestamp - start.blockTimestamp) / 900n) + 2));
10282
+ const blockNumbers = [...new Set(interpolateBlocks(mintBlock, finalBlock, pointCount))];
10283
+ const metadata = [];
10284
+ for (let i = 0; i < blockNumbers.length; i += 16) metadata.push(...await Promise.all(blockNumbers.slice(i, i + 16).map((blockNumber) => getBlockMeta({
10285
+ client,
10286
+ blockNumber
10287
+ }))));
10288
+ const timestamps = new Map(metadata.map((meta) => [meta.blockNumber, meta.blockTimestamp]));
10289
+ const chunks = preparePositionGamma({
10290
+ tokenId,
10291
+ positionSize: balance.positionSize,
10292
+ quoteIsToken0: false,
10293
+ quoteDecimals: 0
10294
+ }).chunks.filter((chunk) => chunk.liquidity > 0n);
10295
+ let premiumError = null;
10296
+ let feeError = includeBaseFees ? null : "Base fee history was not requested";
10297
+ let premium = null;
10298
+ let fees = null;
10299
+ try {
10300
+ const settlementLogs = await client.getContractEvents({
10301
+ address: poolAddress,
10302
+ abi: panopticPoolV2Abi,
10303
+ eventName: "PremiumSettled",
10304
+ args: {
10305
+ user: account,
10306
+ tokenId
10307
+ },
10308
+ fromBlock: mintBlock,
10309
+ toBlock: finalBlock,
10310
+ strict: true
10311
+ });
10312
+ const settled = [];
10313
+ const seen = new Set();
10314
+ for (const log of settlementLogs) {
10315
+ if (log.blockNumber === mintBlock && log.logIndex <= mint.logIndex) continue;
10316
+ if (close && log.blockNumber === finalBlock && log.logIndex >= close.logIndex) continue;
10317
+ const key = `${log.transactionHash}:${log.logIndex}`;
10318
+ if (seen.has(key)) continue;
10319
+ seen.add(key);
10320
+ const amounts = unpack(log.args.settledAmounts);
10321
+ settled.push({
10322
+ blockNumber: log.blockNumber,
10323
+ settled0: amounts.token0,
10324
+ settled1: amounts.token1
10325
+ });
10326
+ }
10327
+ if (close) {
10328
+ const receipt = await client.getTransactionReceipt({ hash: close.transactionHash });
10329
+ const liquidations = parseEventLogs({
10330
+ abi: panopticPoolV2Abi,
10331
+ logs: receipt.logs.filter((log) => log.address.toLowerCase() === poolAddress.toLowerCase()),
10332
+ eventName: "AccountLiquidated"
10333
+ });
10334
+ if (liquidations.some((event) => event.args.liquidatee.toLowerCase() === account.toLowerCase())) throw new Error("Liquidation premium requires haircut reconciliation");
10335
+ for (const packed of close.args.premiaByLeg) {
10336
+ const amounts = unpack(packed);
10337
+ settled.push({
10338
+ blockNumber: finalBlock,
10339
+ settled0: amounts.token0,
10340
+ settled1: amounts.token1
10341
+ });
10342
+ }
10343
+ }
10344
+ const readableBlocks = close ? blockNumbers.filter((block) => block < finalBlock) : blockNumbers;
10345
+ premium = [];
10346
+ for (let i = 0; i < readableBlocks.length; i += 16) {
10347
+ const history = await getStreamiaHistory({
10348
+ client,
10349
+ panopticPoolAddress: poolAddress,
10350
+ account,
10351
+ tokenId,
10352
+ blockNumbers: readableBlocks.slice(i, i + 16),
10353
+ legs: [],
10354
+ poolConfig,
10355
+ includeUniswapFees: false,
10356
+ settledEvents: settled,
10357
+ _meta: end
10358
+ });
10359
+ for (const snapshot of history.snapshots) {
10360
+ const timestamp = snapshot.blockNumber === void 0 ? void 0 : timestamps.get(snapshot.blockNumber);
10361
+ if (timestamp === void 0) throw new Error("Accounting timestamp missing");
10362
+ premium.push({
10363
+ timestamp,
10364
+ ...snapshot.cumulativePanopticPremia
10365
+ });
10366
+ }
10367
+ }
10368
+ if (close) premium.push({
10369
+ timestamp: end.blockTimestamp,
10370
+ ...settled.reduce((sum$1, event) => ({
10371
+ token0: sum$1.token0 + event.settled0,
10372
+ token1: sum$1.token1 + event.settled1
10373
+ }), {
10374
+ token0: 0n,
10375
+ token1: 0n
10376
+ })
10377
+ });
10378
+ const openingAccrual = premium[0];
10379
+ if (!openingAccrual || openingAccrual.timestamp !== start.blockTimestamp) throw new Error("Opening premium snapshot missing");
10380
+ premium = premium.map((snapshot) => ({
10381
+ timestamp: snapshot.timestamp,
10382
+ token0: snapshot.token0 - openingAccrual.token0,
10383
+ token1: snapshot.token1 - openingAccrual.token1
10384
+ }));
10385
+ } catch (error) {
10386
+ premium = null;
10387
+ premiumError = error instanceof Error ? error.message : "Premium history unavailable";
10388
+ }
10389
+ if (includeBaseFees) try {
10390
+ const feeBlocks = close ? blockNumbers.filter((block) => block < finalBlock) : blockNumbers;
10391
+ const data = [];
10392
+ for (let i = 0; i < feeBlocks.length; i += 16) data.push(...await fetchUniswapFeeData(client, feeBlocks.slice(i, i + 16), chunks, poolConfig));
10393
+ let total0 = 0n;
10394
+ let total1 = 0n;
10395
+ fees = [];
10396
+ for (let i = 0; i < data.length; i++) {
10397
+ const current = data[i];
10398
+ for (const chunk of chunks) {
10399
+ if ((current.tickData.get(chunk.lowerTick)?.liquidityGross ?? 0n) === 0n || (current.tickData.get(chunk.upperTick)?.liquidityGross ?? 0n) === 0n) throw new Error("LP range was uninitialized; complete base fee history is unavailable");
10400
+ if (i === 0) continue;
10401
+ const previous = feeGrowthInsideX128(data[i - 1], chunk.lowerTick, chunk.upperTick);
10402
+ const next = feeGrowthInsideX128(current, chunk.lowerTick, chunk.upperTick);
10403
+ if (!previous || !next) throw new Error("Range fee growth missing");
10404
+ if (BigInt.asUintN(256, next.feeGrowthInside0X128 - previous.feeGrowthInside0X128) > BigInt.asUintN(256, current.feeGrowthGlobal0 - data[i - 1].feeGrowthGlobal0) || BigInt.asUintN(256, next.feeGrowthInside1X128 - previous.feeGrowthInside1X128) > BigInt.asUintN(256, current.feeGrowthGlobal1 - data[i - 1].feeGrowthGlobal1)) throw new Error("Range fee growth is inconsistent with pool fee growth");
10405
+ const sign = chunk.isLong ? -1n : 1n;
10406
+ total0 += sign * feesFromFeeGrowthDelta(next.feeGrowthInside0X128, previous.feeGrowthInside0X128, chunk.liquidity);
10407
+ total1 += sign * feesFromFeeGrowthDelta(next.feeGrowthInside1X128, previous.feeGrowthInside1X128, chunk.liquidity);
10408
+ }
10409
+ fees.push({
10410
+ timestamp: metadata[i].blockTimestamp,
10411
+ token0: total0,
10412
+ token1: total1
10413
+ });
10414
+ }
10415
+ } catch (error) {
10416
+ fees = null;
10417
+ feeError = error instanceof Error ? error.message : "Base fee history unavailable";
10418
+ }
10419
+ return {
10420
+ start,
10421
+ end,
10422
+ positionSize: balance.positionSize,
10423
+ closed: close !== void 0,
10424
+ openingTick: BigInt(openingPrice.tick),
10425
+ endingTick: BigInt(endingPrice.tick),
10426
+ premium,
10427
+ fees,
10428
+ premiumError,
10429
+ feeError,
10430
+ accountingSamples: blockNumbers.length,
10431
+ maxAccountingIntervalSeconds: metadata.slice(1).reduce((maximum, meta, index) => {
10432
+ const interval = meta.blockTimestamp - metadata[index].blockTimestamp;
10433
+ return interval > maximum ? interval : maximum;
10434
+ }, 0n)
10435
+ };
10436
+ }
10437
+
10438
+ //#endregion
10439
+ export { DEFAULT_MIN_SWAP_RATIO_BPS, DEFAULT_RECONNECT_CONFIG, MARKET_INDICATOR_PERIODS, REQUIRED_BASE_ERROR_SENTINEL, STRIKE_LADDER_TARGET_STRIKES, VARIANCE_RATIO_LAG, addPendingPosition, addTrackedChunks, apportion, assertCanBurn, assertCanForceExercise, assertCanLiquidate, assertCanMint, assertFresh, assertHealthy, assertLpPositionFunded, assertTradeable, buildCreditWrappedDispatch, buildSfpmSwapCalldata, buildSfpmSwapPlan, buildTemporaryLoanRecoveryDispatch, buildTokenShortfallRecoveryDispatch, calculateAccountGreeksPure, calculateMarketIndicator, calculatePositionVolatilityMetrics, calculateSpreadWad, calculateVarianceProfile, checkCollateralAcrossTicks, classifyStrategyGroups, classifyStrike, cleanupStalePendingPositions, clearPendingPositions, clearTrackedChunks, clearTradeHistory, collateralCurveTicks, collateralRuleKindFor, computeV4PoolId, confirmPendingPosition, convertToAssets, convertToShares, createEventPoller, createEventSubscription, createFlowNeutralTokenId, decodePanopticTokenURI, emptyLiquidateParams, encodePoolKeyBytes, encodeV3PoolKeyBytes, ensureSfpmV3PoolInitialized, estimateBlockNumbers, estimateCollateralBreakdown, estimateCollateralRequired, failPendingPosition, feeGrowthInsideX128, feesFromFeeGrowthDelta, fetchSfpmV3PoolId, fetchUniswapFeeData, getAccountBuyingPower, getAccountGreeks, getAccountHistory, getChunkLiquidities, getChunkSpreads, getClosedPositions, getCollateralCurve, getCollateralCurveInputs, getCollateralRequiredBase, getCollateralSharePrices, getCollateralTotalAssetsBatch, getDeltaHedgeParams, getEnforcedTickLimits, getExecutableLpMaxSize, getFactoryConstructMetadata, getFactoryOwnerOf, getFactoryTokenURI, getGuardianUnlockState, getHedgeLimits, getItmAmounts, getMarginBuffer, getMaxPositionSize, getMaxRedeem, getMaxWithdrawable, getNativeTokenPrice, getNotEnoughTokensError, getOpenPositionPreview, getPanopticPoolAddress, getPanopticPoolFromPoolId, getPendingPositions, getPoolCollateralAddresses, getPoolLiquidities, getPortfolioValue, getPositionChunkData, getPositionEnrichmentData, getPositionValueCurve, getPositionVolatilityHistory, getPriceHistory, getRealizedPnL, getRequiredCreditForITM, getSafeMode, getStreamiaHistory, getSyncStatus, getTrackedChunks, getTradeHistory, getUniswapFeeHistory, getUniswapV3LpPositionState, getUniswapV3PoolFromId, getUniswapV3PoolInfo, getUniswapV3PoolLiquidities, getUniswapV4LpPositionState, getUniswapV4PoolBasicState, getUniswapV4PoolInfo, getUniswapV4PoolKeyFromId, getUniswapV4PoolLiquidities, interpolateBlocks, isGasError, isNonceError, isRetryableRpcError, isolateGroupTokenId, ladderStrikeSequence, logReturns, marketPnlInQuote, marketRiskFromValues, marketScenario, minePoolAddress, minePoolAddressLocalAsync, multicallRead, netLiquidationValueInQuote, optimizeTokenIdRiskPartners, parseCollateralLog, parsePoolLog, positionValueKey, positionValueTicks, prepareIndicatorCandles, preparePositionGamma, preparePositionValueCurve, previewDeposit, previewMint, previewRedeem, previewWithdraw, quoteLiquidation, quoteOneTokenFlow, quoteSfpmSwap, quoteTemporaryLoanRecovery, quoteTokenShortfallRecovery, realizedBeta, removeTrackedChunks, resolveBlockNumbers, resolveLadderStrike, resolvePanopticPoolFromPoolId, resolveUniswapV4PoolKey, saveClosedPosition, scaleCollateralRequired, scanChunks, screenAccountExact, simulateBatchDispatch, simulateClosePosition, simulateDeployNewPool, simulateDeposit, simulateForceExercise, simulateLiquidate, simulateSFPMBurn, simulateSFPMMint, simulateSwapExactIn, simulateSwapExactOut, simulateWithdraw, slippageBpsToTickDistance, valuePositionAccrual, watchEvents };
@@ -114,15 +114,29 @@ var _4663 = {
114
114
  "panoptic": {
115
115
  "pool": {
116
116
  "version": "v4",
117
- "panopticPool": "0x00000000989bcb6f24af4a1Ab2A6d6a31c98A58E",
118
- "collateralTracker0": "0x49eaAC32A7CD4B8fB2209a12859a95E0b20aB0e5",
119
- "collateralTracker1": "0x670C44a0FC35dbC410498e47A6290a1C3196d191"
117
+ "panopticPool": "0x000000000c21b38c54AcA7c7145Df01ff09d69Bb",
118
+ "collateralTracker0": "0xDc508622CD7e3850c8240e88c10361Cf493465b6",
119
+ "collateralTracker1": "0x9212d804953bAf89C24ceFa6545aA293bA08a876"
120
+ },
121
+ "additionalPools": {
122
+ "spyUsdg30bpsV4": {
123
+ "version": "v4",
124
+ "panopticPool": "0x00000000989bcb6f24af4a1Ab2A6d6a31c98A58E",
125
+ "collateralTracker0": "0x49eaAC32A7CD4B8fB2209a12859a95E0b20aB0e5",
126
+ "collateralTracker1": "0x670C44a0FC35dbC410498e47A6290a1C3196d191"
127
+ },
128
+ "spyUsdg5bpsV4": {
129
+ "version": "v4",
130
+ "panopticPool": "0x000000000c21b38c54AcA7c7145Df01ff09d69Bb",
131
+ "collateralTracker0": "0xDc508622CD7e3850c8240e88c10361Cf493465b6",
132
+ "collateralTracker1": "0x9212d804953bAf89C24ceFa6545aA293bA08a876"
133
+ }
120
134
  },
121
135
  "v2": {
122
136
  "semiFungiblePositionManagerV4": "0x00000000000005C3287f136Ef5AF56c68Ea6849f",
123
137
  "semiFungiblePositionManagerV3": "0x00000000000005E4693aDc8Ec0f12D686f728198",
124
138
  "builderFactory": "0x0000000000000a3D22E158417AA639D7F71b0FF7",
125
- "riskEngine": "0x000000000000075e29cdaa9cb640a69e148ca7da",
139
+ "riskEngine": "0x0000000000000fE1E261f66ce2F44def4F5Ae0CB",
126
140
  "panopticPoolImplementation": "0x000000000000135429F0DaCaB61639Bf6a63EbbC",
127
141
  "collateralTrackerImplementation": "0x0000000000001d9c38CA405A2e04420865A08A33",
128
142
  "panopticFactoryV4": "0x0000000000000c51d0f8cf4bd9adE7191372a625",
@@ -138,13 +152,29 @@ var _4663 = {
138
152
  "0x0000000000000fe1e261f66ce2f44def4f5ae0cb",
139
153
  "0x0000000000000f3fb82469581A74776178E76Ca4"
140
154
  ],
141
- "markets": { "spyUsdg": {
142
- "currency0": "0x117cc2133c37B721F49dE2A7a74833232B3B4C0C",
143
- "currency1": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
144
- "fee": 3e3,
145
- "tickSpacing": 60,
146
- "poolId": "0xfe2a80bb5618fd14984b92ca6d45bf5ba67443ddb1435e28b2e48df2fc1526cd"
147
- } },
155
+ "markets": {
156
+ "spyUsdg": {
157
+ "currency0": "0x117cc2133c37B721F49dE2A7a74833232B3B4C0C",
158
+ "currency1": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
159
+ "fee": 500,
160
+ "tickSpacing": 5,
161
+ "poolId": "0xe5923c8a8be481ec89a2ca784a2bbfa4235de6d88f92260fd66b660c4babf907"
162
+ },
163
+ "spyUsdg30bps": {
164
+ "currency0": "0x117cc2133c37B721F49dE2A7a74833232B3B4C0C",
165
+ "currency1": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
166
+ "fee": 3e3,
167
+ "tickSpacing": 60,
168
+ "poolId": "0xfe2a80bb5618fd14984b92ca6d45bf5ba67443ddb1435e28b2e48df2fc1526cd"
169
+ },
170
+ "spyUsdg5bps": {
171
+ "currency0": "0x117cc2133c37B721F49dE2A7a74833232B3B4C0C",
172
+ "currency1": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
173
+ "fee": 500,
174
+ "tickSpacing": 5,
175
+ "poolId": "0xe5923c8a8be481ec89a2ca784a2bbfa4235de6d88f92260fd66b660c4babf907"
176
+ }
177
+ },
148
178
  "subgraphs": {
149
179
  "hypovault": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/hypovault-subgraph-robinhood/prod/gn",
150
180
  "panoptic": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/panoptic-subgraph-robinhood/v2_prod/gn"
@@ -309,6 +339,10 @@ function getSpyUsdgMarket(deployment) {
309
339
  if (market === void 0) throw new Error(`Missing SPY/USDG market for chainId ${deployment.chainId}`);
310
340
  return market;
311
341
  }
342
+ function requireDeploymentValue(value, label) {
343
+ if (value === void 0) throw new Error(`Missing deployment value: ${label}`);
344
+ return value;
345
+ }
312
346
  const MAINNET_DEPLOYMENT = CHAIN_DEPLOYMENTS[MAINNET_CHAIN_ID];
313
347
  const MAINNET_ETH_USDC_5BPS_V3_PANOPTIC_POOL_ADDRESSES = MAINNET_DEPLOYMENT.panoptic.additionalPools?.ethUsdc5bpsV3;
314
348
  const MAINNET_PANOPTIC_V2_ADDRESSES = MAINNET_DEPLOYMENT.panoptic.v2;
@@ -337,9 +371,13 @@ const ROBINHOOD_HYPOVAULT_ADDRESSES = ROBINHOOD_DEPLOYMENT.hypovault.vaults;
337
371
  const ROBINHOOD_HYPOVAULT_MANAGER_ADDRESSES = ROBINHOOD_DEPLOYMENT.hypovault.managers;
338
372
  const ROBINHOOD_HYPOVAULT_MANAGER_TURNKEY_SIGNERS = ROBINHOOD_DEPLOYMENT.hypovault.turnkeySigners;
339
373
  const ROBINHOOD_PANOPTIC_POOL_ADDRESSES = ROBINHOOD_DEPLOYMENT.panoptic.pool;
374
+ const ROBINHOOD_SPY_USDG_30BPS_PANOPTIC_POOL_ADDRESSES = requireDeploymentValue(ROBINHOOD_DEPLOYMENT.panoptic.additionalPools?.spyUsdg30bpsV4, "Robinhood SPY/USDG 30bps Panoptic pool");
375
+ const ROBINHOOD_SPY_USDG_5BPS_PANOPTIC_POOL_ADDRESSES = requireDeploymentValue(ROBINHOOD_DEPLOYMENT.panoptic.additionalPools?.spyUsdg5bpsV4, "Robinhood SPY/USDG 5bps Panoptic pool");
340
376
  const ROBINHOOD_PANOPTIC_V2_ADDRESSES = ROBINHOOD_DEPLOYMENT.panoptic.v2;
341
377
  const ROBINHOOD_RISK_ENGINES = ROBINHOOD_DEPLOYMENT.riskEngines;
342
378
  const ROBINHOOD_SPY_USDG_MARKET = getSpyUsdgMarket(ROBINHOOD_DEPLOYMENT);
379
+ const ROBINHOOD_SPY_USDG_30BPS_MARKET = requireDeploymentValue(ROBINHOOD_DEPLOYMENT.markets.spyUsdg30bps, "Robinhood SPY/USDG 30bps market");
380
+ const ROBINHOOD_SPY_USDG_5BPS_MARKET = requireDeploymentValue(ROBINHOOD_DEPLOYMENT.markets.spyUsdg5bps, "Robinhood SPY/USDG 5bps market");
343
381
 
344
382
  //#endregion
345
383
  //#region ../deployments/src/vaultDisplayNames.js