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 (either directly or internally, depending on useTraceFilter).
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.
useTraceFilter
Controls how transactions are detected in the block range.
true (recommended): Uses the trace_filter RPC method
- Fetches all transactions in a single RPC call per batch
- Detects both direct calls and internal calls to the target contract
- RPC calls for 100 blocks: ~1-2 calls
false: Scans each block individually
- One
eth_getBlockByNumbercall per block - Only detects direct calls where
tx.to == targetContract - RPC calls for 100 blocks: ~100 calls
trace_filter for large block ranges or when you need to detect internal calls. Use block scanning when your RPC provider doesn’t support trace_filter.
forkByTxHash
Controls how the EVM state is forked for each transaction replay.
false (recommended): Forks at the start of the block
- Uses
vm.createSelectFork(rpcUrl, blockNumber) - Faster and more RPC-efficient
- Suitable for most backtesting scenarios
true: Forks at the exact transaction
- Uses
vm.createSelectFork(rpcUrl, txHash) - Replays all prior transactions in the block to get exact state
- Slower but necessary for transactions where transactions earlier in the block change the state of the target contract
false for normal backtesting. Use true only when debugging specific failures where exact transaction state is needed.
detailedBlocks
Controls logging verbosity. Currently reserved for future functionality.
RPC Call Estimates
Understanding RPC usage helps you plan for rate limits and choose the right RPC provider.With trace_filter (Recommended)
Configuration:- Fetching: 1-2 calls
- Validation: 50 calls (one per transaction)
- Total: ~52 RPC calls
Without trace_filter
Configuration:- Fetching: 100 calls (one per block)
- Validation: 50 calls (one per transaction)
- Total: ~150 RPC calls
For large block ranges (>1,000 blocks), use paid RPC providers to avoid rate limiting. The
useTraceFilter option significantly reduces RPC calls.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
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) |
useTraceFilter | bool | Use trace_filter API for transaction detection |
forkByTxHash | bool | Fork at exact transaction vs. block start |
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 |
failedValidations | uint256 | Transactions that failed validation |
assertionFailures | uint256 | Number of protocol violations detected |
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

