@@ -3,6 +3,7 @@ pragma solidity ^0.8.13;
33
44import {Credible} from "./Credible.sol " ;
55import {TriggerRecorder} from "./TriggerRecorder.sol " ;
6+ import {SpecRecorder, AssertionSpec} from "./SpecRecorder.sol " ;
67import {StateChanges} from "./StateChanges.sol " ;
78
89/// @title Assertion
@@ -30,6 +31,10 @@ abstract contract Assertion is Credible, StateChanges {
3031 /// @dev Address is derived from a deterministic hash for consistency
3132 TriggerRecorder constant triggerRecorder = TriggerRecorder (address (uint160 (uint256 (keccak256 ("TriggerRecorder " )))));
3233
34+ /// @notice The spec recorder precompile for registering the assertion spec
35+ /// @dev Address is derived from keccak256("SpecRecorder")
36+ SpecRecorder constant specRecorder = SpecRecorder (address (uint160 (uint256 (keccak256 ("SpecRecorder " )))));
37+
3338 /// @notice Used to record fn selectors and their triggers.
3439 function triggers () external view virtual ;
3540
@@ -65,4 +70,12 @@ abstract contract Assertion is Credible, StateChanges {
6570 function registerBalanceChangeTrigger (bytes4 fnSelector ) internal view {
6671 triggerRecorder.registerBalanceChangeTrigger (fnSelector);
6772 }
73+
74+ /// @notice Registers the desired assertion spec. Must be called within the constructor.
75+ /// The assertion spec defines what subset of precompiles are available.
76+ /// Can only be called once. For an assertion to be valid, it needs a defined spec.
77+ /// @param spec The desired AssertionSpec.
78+ function registerAssertionSpec (AssertionSpec spec ) internal view {
79+ specRecorder.registerAssertionSpec (spec);
80+ }
6881}
0 commit comments