Flexible, checked-in gas snapshotting for Foundry.
Forge has native gas reporting with forge snapshot
and forge test --gas-report
, but neither perfectly fit my needs. Specifically, forge-gas-snapshot
aims to allow for:
- Gas reports over specific, known flows
- not entire tests and not an average of all calls
- Check gas diffs into version control
- See gas changes over time through commit history
forge install marktoda/forge-gas-snapshot
- NOTE: foundry.toml must be updated to allow forge to write the snapshots
[profile.default]
...
ffi = true
fs_permissions = [{ access = "read-write", path = ".forge-snapshots/"}]
By default, gas snapshots are automatically written to ./forge-snapshots/<test-name>.snap
on run.
Wrap arbitrary code in snapStart(testName)
and snapEnd
to snapshot gas usage.
import {GasSnapshot} from "forge-gas-snapshot/GasSnapshot.sol";
contract MyTest is GasSnapshot {
function test() public {
snapStart("test name");
// do stuff
snapEnd();
}
}
Snapshot a zero-parameter function pointer with snap
import {GasSnapshot} from "forge-gas-snapshot/GasSnapshot.sol";
contract MyTest is GasSnapshot {
function doStuff() internal {
// do stuff
}
function test() public {
snap("test name", doStuff);
}
}
Snapshot arbitrary values with snap
import {GasSnapshot} from "forge-gas-snapshot/GasSnapshot.sol";
contract MyTest is GasSnapshot {
function test() public {
uint256 value = getValue()
snap("test name", value);
}
}
Snapshot contract size with snapSize
import {GasSnapshot} from "forge-gas-snapshot/GasSnapshot.sol";
contract MyTest is GasSnapshot {
function test() public {
address addr = new Contract();
snapSize("test name", addr);
}
}
Snapshots can be run in check-mode where they revert on mismatch by setting an environment variable FORGE_SNAPSHOT_CHECK=true
- Introspection for file / function name
- Group related snapshots in a single file
- Check overhead and accuracy
- Env config for snap dir