From 70eafc29534fe0e0b377f41a11687574caa491db Mon Sep 17 00:00:00 2001 From: Maurelian Date: Wed, 7 Oct 2026 18:49:08 -0400 Subject: [PATCH] fix(StdCheats): exclude P256VERIFY precompile in assumeNotPrecompile assumeNotPrecompile only excluded 0x01-0xff, so fuzzers could pick 0x100, the P256VERIFY precompile added in Osaka (EIP-7951). --- src/StdCheats.sol | 3 ++- test/StdCheats.t.sol | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/StdCheats.sol b/src/StdCheats.sol index 95a5bf95..cc12f121 100644 --- a/src/StdCheats.sol +++ b/src/StdCheats.sol @@ -327,7 +327,8 @@ abstract contract StdCheatsSafe { // address), but the same rationale for excluding them applies so we include those too. // These are reserved by Ethereum and may be on all EVM-compatible chains. - vm.assume(addr < address(0x1) || addr > address(0xff)); + // 0x100 is P256VERIFY (EIP-7951). + vm.assume(addr < address(0x1) || addr > address(0x100)); // forgefmt: disable-start if (chainId == 10 || chainId == 420 || chainId == 11155420) { diff --git a/test/StdCheats.t.sol b/test/StdCheats.t.sol index 868829dd..99c1396d 100644 --- a/test/StdCheats.t.sol +++ b/test/StdCheats.t.sol @@ -401,11 +401,19 @@ contract StdCheatsTest is Test { function testFuzz_AssumeNotPrecompile(address addr) external { assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId); assertTrue( - addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) + addr < address(1) || (addr > address(0x100) && addr < address(0x4200000000000000000000000000000000000000)) || addr > address(0x4200000000000000000000000000000000000800) ); } + function test_AssumeNotPrecompileP256Verify() external { + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // P256VERIFY (EIP-7951) + vm.expectRevert(); + stdCheatsMock.exposedAssumeNotPrecompile(address(0x100)); + } + function testFuzz_AssumeNotForgeAddress(address addr) external pure { assumeNotForgeAddress(addr); assertTrue( @@ -508,6 +516,10 @@ contract StdCheatsMock is StdCheats { function exposedAssumeNotBlacklisted(address token, address addr) external view { return assumeNotBlacklisted(token, addr); } + + function exposedAssumeNotPrecompile(address addr) external pure { + assumeNotPrecompile(addr); + } } contract StdCheatsForkTest is Test {