New to backtesting? Start with the Backtesting Guide to understand the basics before diving into this reference.
Configuration Parameters
targetContract
The address of the contract (Assertion Adopter) to test assertions against. The backtesting tool will find all transactions that interact with this contract, including both direct calls and internal calls (e.g., through routers or aggregators).
endBlock
The last block in the range to test. The tool runs on the block range from endBlock - blockRange to endBlock.
blockRange
Number of blocks to test, counting backwards from endBlock. The tool will test blocks from endBlock - blockRange to endBlock.
assertionCreationCode
The bytecode of your assertion contract. Use type(YourAssertion).creationCode to get this value.
assertionSelector
The function selector of the assertion function to trigger. This determines which assertion method runs during validation.
rpcUrl
The RPC endpoint URL to use for fetching blockchain data. Can also be set via the RPC_URL environment variable.
forkByTxHash
Controls how the EVM state is forked for each transaction replay. This parameter is kept for interface compatibility but is effectively always true internally to ensure correct pre-transaction state.
detailedBlocks
Controls logging verbosity. Currently reserved for future functionality.
API Reference
executeBacktest
Executes a backtest with the provided configuration and returns detailed results.config: Configuration struct containing all backtesting parameters
results: Results struct containing test execution statistics
executeBacktestForTransaction
Executes a backtest for a single transaction specified by its hash. This is useful for:- Testing assertions against specific known transactions (such as historical exploits)
- Debugging potential false positives reported during staging (see Testing Strategy for more on the staging workflow)
- Quickly validating assertion behavior on a problematic transaction without specifying a block range
txHash: The transaction hash to backtesttargetContract: The target contract address (assertion adopter)assertionCreationCode: The assertion contract creation codeassertionSelector: The assertion function selectorrpcUrl: The RPC URL to use
results: Results struct containing test execution statistics
BacktestingConfig
Configuration struct for backtesting parameters.| Field | Type | Description |
|---|---|---|
targetContract | address | Contract address to test assertions against |
endBlock | uint256 | Most recent block in the test range |
blockRange | uint256 | Number of blocks to test backwards from endBlock |
assertionCreationCode | bytes | Bytecode of the assertion contract |
assertionSelector | bytes4 | Function selector of the assertion to execute |
rpcUrl | string | RPC endpoint URL for blockchain data |
detailedBlocks | bool | Enable detailed logging (reserved for future use) |
forkByTxHash | bool | Fork at exact transaction (kept for interface compatibility) |
BacktestingResults
Results struct returned after backtesting execution.| Field | Type | Description |
|---|---|---|
totalTransactions | uint256 | Total number of transactions found in the block range |
processedTransactions | uint256 | Number of transactions that were validated |
successfulValidations | uint256 | Transactions that passed validation |
skippedTransactions | uint256 | Transactions where the assertion wasn’t triggered (function selector didn’t match) |
assertionFailures | uint256 | Number of protocol violations detected (assertion reverted) |
replayFailures | uint256 | Transactions that failed to replay before assertion could execute |
unknownErrors | uint256 | Unexpected errors during execution |
assertionFailures field indicates how many transactions triggered assertion reverts. Since backtesting runs against historical transactions, non-zero values most commonly indicate false positives in your assertion logic rather than actual exploits.
- False positives: Assertion logic incorrectly flags legitimate protocol behavior (most common)
- Gas limit exceeded: Assertion ran out of gas (300k limit) during complex operations
- Assertion bugs: Logic errors in the assertion code
- Known exploits: If testing against historical exploit blocks, failures may be expected

