PerpetualBaseAssertion
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
);