Skip to content

Commit ffec1d2

Browse files
committed
Add onFnCall trigger interfaces
1 parent d587bd7 commit ffec1d2

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

src/Assertion.sol

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,26 @@ abstract contract Assertion is Credible, StateChanges {
7171
triggerRecorder.registerBalanceChangeTrigger(fnSelector);
7272
}
7373

74+
/// @notice Registers an onFnCall trigger for a specific adopter selector.
75+
/// @param fnSelector The function selector of the assertion function.
76+
/// @param triggerSelector The adopter function selector to watch.
77+
function registerFnCallTrigger(bytes4 fnSelector, bytes4 triggerSelector) internal view {
78+
triggerRecorder.registerFnCallTrigger(fnSelector, triggerSelector);
79+
}
80+
81+
/// @notice Registers a trigger that fires once after the transaction completes.
82+
/// @param fnSelector The function selector of the assertion function.
83+
function registerTxEndTrigger(bytes4 fnSelector) internal view {
84+
triggerRecorder.registerTxEndTrigger(fnSelector);
85+
}
86+
87+
/// @notice Registers a trigger that fires when the given token's balances change.
88+
/// @param fnSelector The function selector of the assertion function.
89+
/// @param token The ERC20 token address to watch.
90+
function registerErc20ChangeTrigger(bytes4 fnSelector, address token) internal view {
91+
triggerRecorder.registerErc20ChangeTrigger(fnSelector, token);
92+
}
93+
7494
/// @notice Registers the desired assertion spec. Must be called within the constructor.
7595
/// The assertion spec defines what subset of precompiles are available.
7696
/// Can only be called once. For an assertion to be valid, it needs a defined spec.

src/PhEvm.sol

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ interface PhEvm {
9393
uint256 callIndex;
9494
}
9595

96+
/// @notice Context for an onFnCall-triggered assertion invocation.
97+
/// @dev Only valid inside an assertion function triggered by registerFnCallTrigger.
98+
struct TriggerContext {
99+
/// @notice The adopter selector that triggered this assertion invocation.
100+
bytes4 selector;
101+
/// @notice Call index for constructing a PreCall fork.
102+
uint256 callStart;
103+
/// @notice Call index for constructing a PostCall fork.
104+
uint256 callEnd;
105+
}
106+
96107
/// @notice Fork to the state before the assertion-triggering transaction
97108
/// @dev Allows inspection of pre-transaction state for comparison
98109
function forkPreTx() external;
@@ -259,6 +270,10 @@ interface PhEvm {
259270
/// @return txObject The transaction data struct
260271
function getTxObject() external view returns (TxObject memory txObject);
261272

273+
/// @notice Returns the current onFnCall trigger context.
274+
/// @dev Reverts when called outside an onFnCall-triggered assertion execution.
275+
function context() external view returns (TriggerContext memory);
276+
262277
/// @notice Returns canonical Solidity key encodings h(key) for keys
263278
/// whose mapping entry at baseSlot was written during the tx.
264279
/// @dev Best-effort heuristic: traces KECCAK256 -> SSTORE provenance in the

src/TriggerRecorder.sol

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,18 @@ interface TriggerRecorder {
3131
/// if the assertion adopter is called.
3232
/// @param fnSelector The function selector of the assertion function.
3333
function registerCallTrigger(bytes4 fnSelector) external view;
34+
35+
/// @notice Registers a trigger that fires once per matching adopter call.
36+
/// @param fnSelector The function selector of the assertion function.
37+
/// @param triggerSelector The adopter function selector to watch.
38+
function registerFnCallTrigger(bytes4 fnSelector, bytes4 triggerSelector) external view;
39+
40+
/// @notice Registers a trigger that fires once after the transaction completes.
41+
/// @param fnSelector The function selector of the assertion function.
42+
function registerTxEndTrigger(bytes4 fnSelector) external view;
43+
44+
/// @notice Registers a trigger that fires when the given token's balances change.
45+
/// @param fnSelector The function selector of the assertion function.
46+
/// @param token The ERC20 token address to watch.
47+
function registerErc20ChangeTrigger(bytes4 fnSelector, address token) external view;
3448
}

0 commit comments

Comments
 (0)