Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PerpetualBaseAssertion

Git Source

Inherits: Assertion

Title: PerpetualBaseAssertion

Author: Phylax Systems

Generic operation-safety assertion for perpetual protocols.

Inherit this together with a concrete IPerpetualProtectionSuite implementation. The base contract handles one decode pass per triggered call, then enforces any suite-provided execution, oracle, funding, liquidity, and liquidation checks before applying the shared post-mutation risk gate for non-liquidation operations.

Functions

_suite

Returns the protocol-specific perpetual suite that powers this assertion.

function _suite() internal view virtual returns (IPerpetualProtectionSuite);

triggers

Registers one generic perpetual operation-safety check for every monitored selector.

function triggers() external view virtual override;

assertOperationSafety

Enforces the shared perpetual operation-safety invariants for a successful call.

function assertOperationSafety() external view;

assertPostMutationRisk

Backwards-compatible alias for integrations that only reference the risk-gate name.

function assertPostMutationRisk() external view;

_assertOperationSafety

Internal implementation shared by the public perpetual assertion entrypoints.

function _assertOperationSafety() internal view;

_enabledCheckKinds

function _enabledCheckKinds(IPerpetualProtectionSuite suite)
    internal
    view
    returns (IPerpetualProtectionSuite.EnabledCheckKinds memory enabled);

_assertExecutionPriceChecks

Enforces suite-provided taker execution bounds for the triggered operation.

function _assertExecutionPriceChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertLiquidityCoverageChecks

Enforces suite-provided liquidity and liability coverage bounds.

function _assertLiquidityCoverageChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertFundingDeltaChecks

Enforces suite-provided cumulative-funding settlement bounds.

function _assertFundingDeltaChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertLiquidationChecks

Enforces suite-provided liquidation gating and loss-accounting bounds.

function _assertLiquidationChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertOracleAnchorChecks

Enforces suite-provided oracle-anchor bounds for risk-critical transitions.

function _assertOracleAnchorChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertAccountingConservationChecks

Enforces suite-provided accounting-conservation bounds for settlement paths.

Solvency-only checks are insufficient for exploit families where stale LP share math, double-counted PnL, or accounting drift create unjustified economic gain while the account remains non-negative. These checks compare the actual economic delta of an operation against protocol-derived bounds.

function _assertAccountingConservationChecks(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory beforeFork,
    PhEvm.ForkId memory afterFork
) internal view;

_assertPostMutationRisk

Enforces the shared post-mutation risk gate for non-liquidation operations.

function _assertPostMutationRisk(
    IPerpetualProtectionSuite suite,
    IPerpetualProtectionSuite.TriggeredCall memory triggered,
    IPerpetualProtectionSuite.OperationContext memory operation,
    PhEvm.ForkId memory afterFork
) internal view;

_resolveTriggeredCall

Resolves the exact adopter frame that caused the current assertion execution.

function _resolveTriggeredCall() internal view returns (IPerpetualProtectionSuite.TriggeredCall memory triggered);

_isWithinUintRange

Returns whether value lies within the inclusive [minimum, maximum] range.

function _isWithinUintRange(uint256 value, uint256 minimum, uint256 maximum) internal pure returns (bool);

_isWithinIntRange

Returns whether value lies within the inclusive [minimum, maximum] range.

function _isWithinIntRange(int256 value, int256 minimum, int256 maximum) internal pure returns (bool);

_positivePart

Returns the non-negative component of a signed deficit.

function _positivePart(int256 value) internal pure returns (uint256);

Errors

PerpetualTriggeredCallNotFound

error PerpetualTriggeredCallNotFound(bytes4 selector, uint256 callStart);

PerpetualOperationAccountMissing

error PerpetualOperationAccountMissing(bytes4 selector);

PerpetualExecutionPriceViolated

error PerpetualExecutionPriceViolated(
    address account,
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 checkName,
    address market,
    uint256 executionPrice,
    uint256 minExecutionPrice,
    uint256 maxExecutionPrice
);

PerpetualLiquidityCoverageViolated

error PerpetualLiquidityCoverageViolated(
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 checkName,
    address market,
    uint256 requiredAmount,
    uint256 availableAmount
);

PerpetualFundingDeltaViolated

error PerpetualFundingDeltaViolated(
    address account,
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 checkName,
    address market,
    int256 actualFunding,
    int256 minExpectedFunding,
    int256 maxExpectedFunding
);

PerpetualLiquidationViolated

error PerpetualLiquidationViolated(
    address account,
    bytes4 selector,
    bytes32 checkName,
    address market,
    bool wasLiquidatableBefore,
    int256 lossCreated,
    uint256 absorbedLoss
);

PerpetualOracleAnchorViolated

error PerpetualOracleAnchorViolated(
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 checkName,
    address market,
    uint256 usedPrice,
    uint256 minOraclePrice,
    uint256 maxOraclePrice
);

PerpetualAccountingConservationViolated

error PerpetualAccountingConservationViolated(
    address account,
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 checkName,
    address market,
    int256 actualDelta,
    int256 minAllowedDelta,
    int256 maxAllowedDelta
);

PerpetualSelfBadDebtCreated

error PerpetualSelfBadDebtCreated(
    address account, bytes4 selector, IPerpetualProtectionSuite.OperationKind kind, int256 equity
);

PerpetualPostMutationRiskViolated

error PerpetualPostMutationRiskViolated(
    address account,
    bytes4 selector,
    IPerpetualProtectionSuite.OperationKind kind,
    bytes32 metricName,
    int256 metricValue,
    int256 thresholdValue
);