diff --git a/.gitmodules b/.gitmodules index de7fe4a..f91e60e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "contracts/lib/forge-std"] path = contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "contracts/lib/gas-killer-avs-sol"] - path = contracts/lib/gas-killer-avs-sol - url = https://github.com/BreadchainCoop/gas-killer-avs-sol +[submodule "contracts/lib/solidity-sdk"] + path = contracts/lib/solidity-sdk + url = https://github.com/gas-killer/solidity-sdk diff --git a/Cargo.lock b/Cargo.lock index e3db4ff..4cf7870 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3296,6 +3296,8 @@ version = "0.1.0" dependencies = [ "alloy-dyn-abi", "alloy-primitives", + "alloy-signer", + "alloy-signer-local", "alloy-sol-types", "anyhow", "gas-analyzer-core", @@ -3310,8 +3312,14 @@ name = "gas-analyzer-evmsketch" version = "0.1.0" dependencies = [ "alloy", + "alloy-consensus", "alloy-eips", + "alloy-evm 0.25.2", + "alloy-hardforks 0.4.7", + "alloy-json-rpc", "alloy-provider", + "alloy-rpc-client", + "alloy-transport", "anyhow", "gas-analyzer-core", "gas-analyzer-estimator", @@ -3321,6 +3329,7 @@ dependencies = [ "sp1-cc-client-executor", "sp1-cc-host-executor", "tokio", + "tower", "url", ] @@ -3331,8 +3340,11 @@ dependencies = [ "alloy", "alloy-eips", "alloy-provider", + "alloy-rpc-types", "anyhow", "gas-analyzer-core", + "gas-analyzer-estimator", + "revm 31.0.2", ] [[package]] diff --git a/abis/SimEnvOptsCallee.json b/abis/SimEnvOptsCallee.json index 2d93bd4..34707dd 100644 --- a/abis/SimEnvOptsCallee.json +++ b/abis/SimEnvOptsCallee.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"test","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b50604051610b40380380610b408339818101604052810190610031919061017e565b865f5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550855f60010181905550845f6002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550835f60030181905550825f60040181905550815f60050181905550805f600601819055505050505050505061021b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61011a826100f1565b9050919050565b61012a81610110565b8114610134575f5ffd5b50565b5f8151905061014581610121565b92915050565b5f819050919050565b61015d8161014b565b8114610167575f5ffd5b50565b5f8151905061017881610154565b92915050565b5f5f5f5f5f5f5f60e0888a031215610199576101986100ed565b5b5f6101a68a828b01610137565b97505060206101b78a828b0161016a565b96505060406101c88a828b01610137565b95505060606101d98a828b0161016a565b94505060806101ea8a828b0161016a565b93505060a06101fb8a828b0161016a565b92505060c061020c8a828b0161016a565b91505092959891949750929550565b610918806102285f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f6040518060e00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050610129610434565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610267575f915080604051602001610255919061050e565b60405160208183030381529060405290505b836020015183602001511461029c575f91508060405160200161028a9190610559565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff16146102fd575f9150806040516020016102eb91906105a4565b60405160208183030381529060405290505b8360600151836060015114610332575f91508060405160200161032091906105ef565b60405160208183030381529060405290505b8360800151836080015114610367575f915080604051602001610355919061063a565b60405160208183030381529060405290505b8360a001518360a001511461039c575f91508060405160200161038a9190610685565b60405160208183030381529060405290505b8360c001518360c00151146103d1575f9150806040516020016103bf91906106d0565b60405160208183030381529060405290505b81610417578383826040517fe7fd0aab00000000000000000000000000000000000000000000000000000000815260040161040e93929190610830565b60405180910390fd5b60075f8154809291906104299061089b565b919050555050505050565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6104c282610496565b6104cc81856104a0565b93506104dc8185602086016104aa565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61051982846104b8565b9150610524826104e8565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f61056482846104b8565b915061056f82610533565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6105af82846104b8565b91506105ba8261057e565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f6105fa82846104b8565b9150610605826105c9565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f61064582846104b8565b915061065082610614565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f61069082846104b8565b915061069b8261065f565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f6106db82846104b8565b91506106e6826106aa565b60118201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61071e826106f5565b9050919050565b61072e81610714565b82525050565b5f819050919050565b61074681610734565b82525050565b60e082015f8201516107605f850182610725565b506020820151610773602085018261073d565b5060408201516107866040850182610725565b506060820151610799606085018261073d565b5060808201516107ac608085018261073d565b5060a08201516107bf60a085018261073d565b5060c08201516107d260c085018261073d565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f61080282610496565b61080c81856107d8565b935061081c8185602086016104aa565b610825816107e8565b840191505092915050565b5f6101e0820190506108445f83018661074c565b61085160e083018561074c565b8181036101c083015261086481846107f8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6108a582610734565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d7576108d661086e565b5b60018201905091905056fea2646970667358221220eb6c986fd33dc61bb93734548731c7d1c04f9b48c5c9649c0a7a9b7d8f71612e64736f6c634300081e0033","sourceMap":"1255:2470:20:-:0;;;1418:544;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1675:8;1657:6;:15;;;:26;;;;;;;;;;;;;;;;;;1713:10;1693:6;:17;;:30;;;;1756:13;1733:6;:20;;;:36;;;;;;;;;;;;;;;;;;1800:11;1779:6;:18;;:32;;;;1845:14;1821:6;:21;;:38;;;;1892:13;1869:6;:20;;:36;;;;1940:15;1915:6;:22;;:40;;;;1418:544;;;;;;;1255:2470;;88:117:22;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:77::-;882:7;911:5;900:16;;845:77;;;:::o;928:122::-;1001:24;1019:5;1001:24;:::i;:::-;994:5;991:35;981:63;;1040:1;1037;1030:12;981:63;928:122;:::o;1056:143::-;1113:5;1144:6;1138:13;1129:22;;1160:33;1187:5;1160:33;:::i;:::-;1056:143;;;;:::o;1205:1291::-;1329:6;1337;1345;1353;1361;1369;1377;1426:3;1414:9;1405:7;1401:23;1397:33;1394:120;;;1433:79;;:::i;:::-;1394:120;1553:1;1578:64;1634:7;1625:6;1614:9;1610:22;1578:64;:::i;:::-;1568:74;;1524:128;1691:2;1717:64;1773:7;1764:6;1753:9;1749:22;1717:64;:::i;:::-;1707:74;;1662:129;1830:2;1856:64;1912:7;1903:6;1892:9;1888:22;1856:64;:::i;:::-;1846:74;;1801:129;1969:2;1995:64;2051:7;2042:6;2031:9;2027:22;1995:64;:::i;:::-;1985:74;;1940:129;2108:3;2135:64;2191:7;2182:6;2171:9;2167:22;2135:64;:::i;:::-;2125:74;;2079:130;2248:3;2275:64;2331:7;2322:6;2311:9;2307:22;2275:64;:::i;:::-;2265:74;;2219:130;2388:3;2415:64;2471:7;2462:6;2451:9;2447:22;2415:64;:::i;:::-;2405:74;;2359:130;1205:1291;;;;;;;;;;:::o;1255:2470:20:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f6040518060e00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050610129610434565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610267575f915080604051602001610255919061050e565b60405160208183030381529060405290505b836020015183602001511461029c575f91508060405160200161028a9190610559565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff16146102fd575f9150806040516020016102eb91906105a4565b60405160208183030381529060405290505b8360600151836060015114610332575f91508060405160200161032091906105ef565b60405160208183030381529060405290505b8360800151836080015114610367575f915080604051602001610355919061063a565b60405160208183030381529060405290505b8360a001518360a001511461039c575f91508060405160200161038a9190610685565b60405160208183030381529060405290505b8360c001518360c00151146103d1575f9150806040516020016103bf91906106d0565b60405160208183030381529060405290505b81610417578383826040517fe7fd0aab00000000000000000000000000000000000000000000000000000000815260040161040e93929190610830565b60405180910390fd5b60075f8154809291906104299061089b565b919050555050505050565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6104c282610496565b6104cc81856104a0565b93506104dc8185602086016104aa565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61051982846104b8565b9150610524826104e8565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f61056482846104b8565b915061056f82610533565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6105af82846104b8565b91506105ba8261057e565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f6105fa82846104b8565b9150610605826105c9565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f61064582846104b8565b915061065082610614565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f61069082846104b8565b915061069b8261065f565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f6106db82846104b8565b91506106e6826106aa565b60118201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61071e826106f5565b9050919050565b61072e81610714565b82525050565b5f819050919050565b61074681610734565b82525050565b60e082015f8201516107605f850182610725565b506020820151610773602085018261073d565b5060408201516107866040850182610725565b506060820151610799606085018261073d565b5060808201516107ac608085018261073d565b5060a08201516107bf60a085018261073d565b5060c08201516107d260c085018261073d565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f61080282610496565b61080c81856107d8565b935061081c8185602086016104aa565b610825816107e8565b840191505092915050565b5f6101e0820190506108445f83018661074c565b61085160e083018561074c565b8181036101c083015261086481846107f8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6108a582610734565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d7576108d661086e565b5b60018201905091905056fea2646970667358221220eb6c986fd33dc61bb93734548731c7d1c04f9b48c5c9649c0a7a9b7d8f71612e64736f6c634300081e0033","sourceMap":"1255:2470:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1968:1755;;;:::i;:::-;;;2003:26;2032:6;2003:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2048:24;;:::i;:::-;2100:9;2082:6;:15;;:27;;;;;;;;;;;2139:11;2119:6;:17;;:31;;;;;2183:14;2160:6;:20;;:37;;;;;;;;;;;2228:12;2207:6;:18;;:33;;;;;2274:15;2250:6;:21;;:39;;;;;2322:14;2299:6;:20;;:37;;;;;2371:16;2346:6;:22;;:41;;;;;2398:12;2413:4;2398:19;;2427:20;:44;;;;;;;;;;;;;;;;;;;2504:8;:17;;;2485:36;;:6;:15;;;:36;;;2481:140;;2547:5;2537:15;;2589:6;2575:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;2566:44;;2481:140;2655:8;:19;;;2634:6;:17;;;:40;2630:146;;2700:5;2690:15;;2742:6;2728:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;2719:46;;2630:146;2813:8;:22;;;2789:46;;:6;:20;;;:46;;;2785:155;;2861:5;2851:15;;2903:6;2889:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;2880:49;;2785:155;2975:8;:20;;;2953:6;:18;;;:42;2949:149;;3021:5;3011:15;;3063:6;3049:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;3040:47;;2949:149;3136:8;:23;;;3111:6;:21;;;:48;3107:158;;3185:5;3175:15;;3227:6;3213:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;3204:50;;3107:158;3302:8;:22;;;3278:6;:20;;;:46;3274:155;;3350:5;3340:15;;3392:6;3378:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;3369:49;;3274:155;3468:8;:24;;;3442:6;:22;;;:50;3438:161;;3518:5;3508:15;;3560:6;3546:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;3537:51;;3438:161;3614:7;3609:91;;3664:8;3674:6;3682;3644:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;3609:91;3709:5;;:7;;;;;;;;;:::i;:::-;;;;;;1993:1730;;;;1968:1755::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:22:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:148::-;214:11;251:3;236:18;;112:148;;;;:::o;266:139::-;355:6;350:3;345;339:23;396:1;387:6;382:3;378:16;371:27;266:139;;;:::o;411:390::-;517:3;545:39;578:5;545:39;:::i;:::-;600:89;682:6;677:3;600:89;:::i;:::-;593:96;;698:65;756:6;751:3;744:4;737:5;733:16;698:65;:::i;:::-;788:6;783:3;779:16;772:23;;521:280;411:390;;;;:::o;807:188::-;976:12;971:3;964:25;807:188;:::o;1001:542::-;1224:3;1246:95;1337:3;1328:6;1246:95;:::i;:::-;1239:102;;1351:138;1485:3;1351:138;:::i;:::-;1514:2;1509:3;1505:12;1498:19;;1534:3;1527:10;;1001:542;;;;:::o;1549:190::-;1718:14;1713:3;1706:27;1549:190;:::o;1745:542::-;1968:3;1990:95;2081:3;2072:6;1990:95;:::i;:::-;1983:102;;2095:138;2229:3;2095:138;:::i;:::-;2258:2;2253:3;2249:12;2242:19;;2278:3;2271:10;;1745:542;;;;:::o;2293:193::-;2462:17;2457:3;2450:30;2293:193;:::o;2492:542::-;2715:3;2737:95;2828:3;2819:6;2737:95;:::i;:::-;2730:102;;2842:138;2976:3;2842:138;:::i;:::-;3005:2;3000:3;2996:12;2989:19;;3025:3;3018:10;;2492:542;;;;:::o;3040:191::-;3209:15;3204:3;3197:28;3040:191;:::o;3237:542::-;3460:3;3482:95;3573:3;3564:6;3482:95;:::i;:::-;3475:102;;3587:138;3721:3;3587:138;:::i;:::-;3750:2;3745:3;3741:12;3734:19;;3770:3;3763:10;;3237:542;;;;:::o;3785:194::-;3954:18;3949:3;3942:31;3785:194;:::o;3985:542::-;4208:3;4230:95;4321:3;4312:6;4230:95;:::i;:::-;4223:102;;4335:138;4469:3;4335:138;:::i;:::-;4498:2;4493:3;4489:12;4482:19;;4518:3;4511:10;;3985:542;;;;:::o;4533:193::-;4702:17;4697:3;4690:30;4533:193;:::o;4732:542::-;4955:3;4977:95;5068:3;5059:6;4977:95;:::i;:::-;4970:102;;5082:138;5216:3;5082:138;:::i;:::-;5245:2;5240:3;5236:12;5229:19;;5265:3;5258:10;;4732:542;;;;:::o;5280:195::-;5449:19;5444:3;5437:32;5280:195;:::o;5481:542::-;5704:3;5726:95;5817:3;5808:6;5726:95;:::i;:::-;5719:102;;5831:138;5965:3;5831:138;:::i;:::-;5994:2;5989:3;5985:12;5978:19;;6014:3;6007:10;;5481:542;;;;:::o;6029:126::-;6066:7;6106:42;6099:5;6095:54;6084:65;;6029:126;;;:::o;6161:96::-;6198:7;6227:24;6245:5;6227:24;:::i;:::-;6216:35;;6161:96;;;:::o;6263:108::-;6340:24;6358:5;6340:24;:::i;:::-;6335:3;6328:37;6263:108;;:::o;6377:77::-;6414:7;6443:5;6432:16;;6377:77;;;:::o;6460:108::-;6537:24;6555:5;6537:24;:::i;:::-;6532:3;6525:37;6460:108;;:::o;6656:1441::-;6811:4;6806:3;6802:14;6902:4;6895:5;6891:16;6885:23;6921:63;6978:4;6973:3;6969:14;6955:12;6921:63;:::i;:::-;6826:168;7082:4;7075:5;7071:16;7065:23;7101:63;7158:4;7153:3;7149:14;7135:12;7101:63;:::i;:::-;7004:170;7265:4;7258:5;7254:16;7248:23;7284:63;7341:4;7336:3;7332:14;7318:12;7284:63;:::i;:::-;7184:173;7446:4;7439:5;7435:16;7429:23;7465:63;7522:4;7517:3;7513:14;7499:12;7465:63;:::i;:::-;7367:171;7630:4;7623:5;7619:16;7613:23;7649:63;7706:4;7701:3;7697:14;7683:12;7649:63;:::i;:::-;7548:174;7813:4;7806:5;7802:16;7796:23;7832:63;7889:4;7884:3;7880:14;7866:12;7832:63;:::i;:::-;7732:173;7998:4;7991:5;7987:16;7981:23;8017:63;8074:4;8069:3;8065:14;8051:12;8017:63;:::i;:::-;7915:175;6780:1317;6656:1441;;:::o;8103:169::-;8187:11;8221:6;8216:3;8209:19;8261:4;8256:3;8252:14;8237:29;;8103:169;;;;:::o;8278:102::-;8319:6;8370:2;8366:7;8361:2;8354:5;8350:14;8346:28;8336:38;;8278:102;;;:::o;8386:377::-;8474:3;8502:39;8535:5;8502:39;:::i;:::-;8557:71;8621:6;8616:3;8557:71;:::i;:::-;8550:78;;8637:65;8695:6;8690:3;8683:4;8676:5;8672:16;8637:65;:::i;:::-;8727:29;8749:6;8727:29;:::i;:::-;8722:3;8718:39;8711:46;;8478:285;8386:377;;;;:::o;8769:768::-;9054:4;9092:3;9081:9;9077:19;9069:27;;9106:129;9232:1;9221:9;9217:17;9208:6;9106:129;:::i;:::-;9245:131;9371:3;9360:9;9356:19;9347:6;9245:131;:::i;:::-;9424:9;9418:4;9414:20;9408:3;9397:9;9393:19;9386:49;9452:78;9525:4;9516:6;9452:78;:::i;:::-;9444:86;;8769:768;;;;;;:::o;9543:180::-;9591:77;9588:1;9581:88;9688:4;9685:1;9678:15;9712:4;9709:1;9702:15;9729:233;9768:3;9791:24;9809:5;9791:24;:::i;:::-;9782:33;;9837:66;9830:5;9827:77;9824:103;;9907:18;;:::i;:::-;9824:103;9954:1;9947:5;9943:13;9936:20;;9729:233;;;:::o","linkReferences":{}},"methodIdentifiers":{"test()":"f8a8fd6d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"test\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsCallee\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f\",\"dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"test"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsCallee"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050","urls":["bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f","dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"test","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b50604051610c0f380380610c0f83398181016040528101906100319190610188565b875f5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550865f60010181905550855f6002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550845f60030181905550835f60040181905550825f60050181905550815f60060181905550805f600701819055505050505050505050610239565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610124826100fb565b9050919050565b6101348161011a565b811461013e575f5ffd5b50565b5f8151905061014f8161012b565b92915050565b5f819050919050565b61016781610155565b8114610171575f5ffd5b50565b5f815190506101828161015e565b92915050565b5f5f5f5f5f5f5f5f610100898b0312156101a5576101a46100f7565b5b5f6101b28b828c01610141565b98505060206101c38b828c01610174565b97505060406101d48b828c01610141565b96505060606101e58b828c01610174565b95505060806101f68b828c01610174565b94505060a06102078b828c01610174565b93505060c06102188b828c01610174565b92505060e06102298b828c01610174565b9150509295985092959890939650565b6109c9806102465f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f604051806101000160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050905061013461047e565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c0018181525050488160e00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff161461027c575f91508060405160200161026a919061055f565b60405160208183030381529060405290505b83602001518360200151146102b1575f91508060405160200161029f91906105aa565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff1614610312575f91508060405160200161030091906105f5565b60405160208183030381529060405290505b8360600151836060015114610347575f9150806040516020016103359190610640565b60405160208183030381529060405290505b836080015183608001511461037c575f91508060405160200161036a919061068b565b60405160208183030381529060405290505b8360a001518360a00151146103b1575f91508060405160200161039f91906106d6565b60405160208183030381529060405290505b8360c001518360c00151146103e6575f9150806040516020016103d49190610721565b60405160208183030381529060405290505b8360e001518360e001511461041b575f915080604051602001610409919061076c565b60405160208183030381529060405290505b81610461578383826040517f9e95e280000000000000000000000000000000000000000000000000000000008152600401610458939291906108e0565b60405180910390fd5b60085f8154809291906104739061094c565b919050555050505050565b6040518061010001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610513826104e7565b61051d81856104f1565b935061052d8185602086016104fb565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61056a8284610509565b915061057582610539565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f6105b58284610509565b91506105c082610584565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6106008284610509565b915061060b826105cf565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f61064b8284610509565b91506106568261061a565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f6106968284610509565b91506106a182610665565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f6106e18284610509565b91506106ec826106b0565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f61072c8284610509565b9150610737826106fb565b60118201915081905092915050565b7f626c6f636b426173654665652c20000000000000000000000000000000000000815250565b5f6107778284610509565b915061078282610746565b600e8201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107ba82610791565b9050919050565b6107ca816107b0565b82525050565b5f819050919050565b6107e2816107d0565b82525050565b61010082015f8201516107fd5f8501826107c1565b50602082015161081060208501826107d9565b50604082015161082360408501826107c1565b50606082015161083660608501826107d9565b50608082015161084960808501826107d9565b5060a082015161085c60a08501826107d9565b5060c082015161086f60c08501826107d9565b5060e082015161088260e08501826107d9565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6108b2826104e7565b6108bc8185610888565b93506108cc8185602086016104fb565b6108d581610898565b840191505092915050565b5f610220820190506108f45f8301866107e8565b6109026101008301856107e8565b81810361020083015261091581846108a8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610956826107d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109885761098761091f565b5b60018201905091905056fea2646970667358221220304854ebfccca711ddaa0310dd162c246ca088276b21e1a64283d70875c5dc6064736f6c634300081e0033","sourceMap":"1337:2750:20:-:0;;;1500:618;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1787:8;1769:6;:15;;;:26;;;;;;;;;;;;;;;;;;1825:10;1805:6;:17;;:30;;;;1868:13;1845:6;:20;;;:36;;;;;;;;;;;;;;;;;;1912:11;1891:6;:18;;:32;;;;1957:14;1933:6;:21;;:38;;;;2004:13;1981:6;:20;;:36;;;;2052:15;2027:6;:22;;:40;;;;2099:12;2077:6;:19;;:34;;;;1500:618;;;;;;;;1337:2750;;88:117:22;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:77::-;882:7;911:5;900:16;;845:77;;;:::o;928:122::-;1001:24;1019:5;1001:24;:::i;:::-;994:5;991:35;981:63;;1040:1;1037;1030:12;981:63;928:122;:::o;1056:143::-;1113:5;1144:6;1138:13;1129:22;;1160:33;1187:5;1160:33;:::i;:::-;1056:143;;;;:::o;1205:1448::-;1338:6;1346;1354;1362;1370;1378;1386;1394;1443:3;1431:9;1422:7;1418:23;1414:33;1411:120;;;1450:79;;:::i;:::-;1411:120;1570:1;1595:64;1651:7;1642:6;1631:9;1627:22;1595:64;:::i;:::-;1585:74;;1541:128;1708:2;1734:64;1790:7;1781:6;1770:9;1766:22;1734:64;:::i;:::-;1724:74;;1679:129;1847:2;1873:64;1929:7;1920:6;1909:9;1905:22;1873:64;:::i;:::-;1863:74;;1818:129;1986:2;2012:64;2068:7;2059:6;2048:9;2044:22;2012:64;:::i;:::-;2002:74;;1957:129;2125:3;2152:64;2208:7;2199:6;2188:9;2184:22;2152:64;:::i;:::-;2142:74;;2096:130;2265:3;2292:64;2348:7;2339:6;2328:9;2324:22;2292:64;:::i;:::-;2282:74;;2236:130;2405:3;2432:64;2488:7;2479:6;2468:9;2464:22;2432:64;:::i;:::-;2422:74;;2376:130;2545:3;2572:64;2628:7;2619:6;2608:9;2604:22;2572:64;:::i;:::-;2562:74;;2516:130;1205:1448;;;;;;;;;;;:::o;1337:2750:20:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f604051806101000160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050905061013461047e565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c0018181525050488160e00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff161461027c575f91508060405160200161026a919061055f565b60405160208183030381529060405290505b83602001518360200151146102b1575f91508060405160200161029f91906105aa565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff1614610312575f91508060405160200161030091906105f5565b60405160208183030381529060405290505b8360600151836060015114610347575f9150806040516020016103359190610640565b60405160208183030381529060405290505b836080015183608001511461037c575f91508060405160200161036a919061068b565b60405160208183030381529060405290505b8360a001518360a00151146103b1575f91508060405160200161039f91906106d6565b60405160208183030381529060405290505b8360c001518360c00151146103e6575f9150806040516020016103d49190610721565b60405160208183030381529060405290505b8360e001518360e001511461041b575f915080604051602001610409919061076c565b60405160208183030381529060405290505b81610461578383826040517f9e95e280000000000000000000000000000000000000000000000000000000008152600401610458939291906108e0565b60405180910390fd5b60085f8154809291906104739061094c565b919050555050505050565b6040518061010001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610513826104e7565b61051d81856104f1565b935061052d8185602086016104fb565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61056a8284610509565b915061057582610539565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f6105b58284610509565b91506105c082610584565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6106008284610509565b915061060b826105cf565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f61064b8284610509565b91506106568261061a565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f6106968284610509565b91506106a182610665565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f6106e18284610509565b91506106ec826106b0565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f61072c8284610509565b9150610737826106fb565b60118201915081905092915050565b7f626c6f636b426173654665652c20000000000000000000000000000000000000815250565b5f6107778284610509565b915061078282610746565b600e8201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107ba82610791565b9050919050565b6107ca816107b0565b82525050565b5f819050919050565b6107e2816107d0565b82525050565b61010082015f8201516107fd5f8501826107c1565b50602082015161081060208501826107d9565b50604082015161082360408501826107c1565b50606082015161083660608501826107d9565b50608082015161084960808501826107d9565b5060a082015161085c60a08501826107d9565b5060c082015161086f60c08501826107d9565b5060e082015161088260e08501826107d9565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6108b2826104e7565b6108bc8185610888565b93506108cc8185602086016104fb565b6108d581610898565b840191505092915050565b5f610220820190506108f45f8301866107e8565b6109026101008301856107e8565b81810361020083015261091581846108a8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610956826107d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109885761098761091f565b5b60018201905091905056fea2646970667358221220304854ebfccca711ddaa0310dd162c246ca088276b21e1a64283d70875c5dc6064736f6c634300081e0033","sourceMap":"1337:2750:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2124:1961;;;:::i;:::-;;;2159:26;2188:6;2159:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2204:24;;:::i;:::-;2256:9;2238:6;:15;;:27;;;;;;;;;;;2295:11;2275:6;:17;;:31;;;;;2339:14;2316:6;:20;;:37;;;;;;;;;;;2384:12;2363:6;:18;;:33;;;;;2430:15;2406:6;:21;;:39;;;;;2478:14;2455:6;:20;;:37;;;;;2527:16;2502:6;:22;;:41;;;;;2575:13;2553:6;:19;;:35;;;;;2599:12;2614:4;2599:19;;2628:20;:44;;;;;;;;;;;;;;;;;;;2705:8;:17;;;2686:36;;:6;:15;;;:36;;;2682:140;;2748:5;2738:15;;2790:6;2776:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;2767:44;;2682:140;2856:8;:19;;;2835:6;:17;;;:40;2831:146;;2901:5;2891:15;;2943:6;2929:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;2920:46;;2831:146;3014:8;:22;;;2990:46;;:6;:20;;;:46;;;2986:155;;3062:5;3052:15;;3104:6;3090:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;3081:49;;2986:155;3176:8;:20;;;3154:6;:18;;;:42;3150:149;;3222:5;3212:15;;3264:6;3250:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;3241:47;;3150:149;3337:8;:23;;;3312:6;:21;;;:48;3308:158;;3386:5;3376:15;;3428:6;3414:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;3405:50;;3308:158;3503:8;:22;;;3479:6;:20;;;:46;3475:155;;3551:5;3541:15;;3593:6;3579:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;3570:49;;3475:155;3669:8;:24;;;3643:6;:22;;;:50;3639:161;;3719:5;3709:15;;3761:6;3747:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;3738:51;;3639:161;3836:8;:21;;;3813:6;:19;;;:44;3809:152;;3883:5;3873:15;;3925:6;3911:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;3902:48;;3809:152;3976:7;3971:91;;4026:8;4036:6;4044;4006:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;3971:91;4071:5;;:7;;;;;;;;;:::i;:::-;;;;;;2149:1936;;;;2124:1961::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:22:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:148::-;214:11;251:3;236:18;;112:148;;;;:::o;266:139::-;355:6;350:3;345;339:23;396:1;387:6;382:3;378:16;371:27;266:139;;;:::o;411:390::-;517:3;545:39;578:5;545:39;:::i;:::-;600:89;682:6;677:3;600:89;:::i;:::-;593:96;;698:65;756:6;751:3;744:4;737:5;733:16;698:65;:::i;:::-;788:6;783:3;779:16;772:23;;521:280;411:390;;;;:::o;807:188::-;976:12;971:3;964:25;807:188;:::o;1001:542::-;1224:3;1246:95;1337:3;1328:6;1246:95;:::i;:::-;1239:102;;1351:138;1485:3;1351:138;:::i;:::-;1514:2;1509:3;1505:12;1498:19;;1534:3;1527:10;;1001:542;;;;:::o;1549:190::-;1718:14;1713:3;1706:27;1549:190;:::o;1745:542::-;1968:3;1990:95;2081:3;2072:6;1990:95;:::i;:::-;1983:102;;2095:138;2229:3;2095:138;:::i;:::-;2258:2;2253:3;2249:12;2242:19;;2278:3;2271:10;;1745:542;;;;:::o;2293:193::-;2462:17;2457:3;2450:30;2293:193;:::o;2492:542::-;2715:3;2737:95;2828:3;2819:6;2737:95;:::i;:::-;2730:102;;2842:138;2976:3;2842:138;:::i;:::-;3005:2;3000:3;2996:12;2989:19;;3025:3;3018:10;;2492:542;;;;:::o;3040:191::-;3209:15;3204:3;3197:28;3040:191;:::o;3237:542::-;3460:3;3482:95;3573:3;3564:6;3482:95;:::i;:::-;3475:102;;3587:138;3721:3;3587:138;:::i;:::-;3750:2;3745:3;3741:12;3734:19;;3770:3;3763:10;;3237:542;;;;:::o;3785:194::-;3954:18;3949:3;3942:31;3785:194;:::o;3985:542::-;4208:3;4230:95;4321:3;4312:6;4230:95;:::i;:::-;4223:102;;4335:138;4469:3;4335:138;:::i;:::-;4498:2;4493:3;4489:12;4482:19;;4518:3;4511:10;;3985:542;;;;:::o;4533:193::-;4702:17;4697:3;4690:30;4533:193;:::o;4732:542::-;4955:3;4977:95;5068:3;5059:6;4977:95;:::i;:::-;4970:102;;5082:138;5216:3;5082:138;:::i;:::-;5245:2;5240:3;5236:12;5229:19;;5265:3;5258:10;;4732:542;;;;:::o;5280:195::-;5449:19;5444:3;5437:32;5280:195;:::o;5481:542::-;5704:3;5726:95;5817:3;5808:6;5726:95;:::i;:::-;5719:102;;5831:138;5965:3;5831:138;:::i;:::-;5994:2;5989:3;5985:12;5978:19;;6014:3;6007:10;;5481:542;;;;:::o;6029:192::-;6198:16;6193:3;6186:29;6029:192;:::o;6227:542::-;6450:3;6472:95;6563:3;6554:6;6472:95;:::i;:::-;6465:102;;6577:138;6711:3;6577:138;:::i;:::-;6740:2;6735:3;6731:12;6724:19;;6760:3;6753:10;;6227:542;;;;:::o;6775:126::-;6812:7;6852:42;6845:5;6841:54;6830:65;;6775:126;;;:::o;6907:96::-;6944:7;6973:24;6991:5;6973:24;:::i;:::-;6962:35;;6907:96;;;:::o;7009:108::-;7086:24;7104:5;7086:24;:::i;:::-;7081:3;7074:37;7009:108;;:::o;7123:77::-;7160:7;7189:5;7178:16;;7123:77;;;:::o;7206:108::-;7283:24;7301:5;7283:24;:::i;:::-;7278:3;7271:37;7206:108;;:::o;7402:1625::-;7557:6;7552:3;7548:16;7650:4;7643:5;7639:16;7633:23;7669:63;7726:4;7721:3;7717:14;7703:12;7669:63;:::i;:::-;7574:168;7830:4;7823:5;7819:16;7813:23;7849:63;7906:4;7901:3;7897:14;7883:12;7849:63;:::i;:::-;7752:170;8013:4;8006:5;8002:16;7996:23;8032:63;8089:4;8084:3;8080:14;8066:12;8032:63;:::i;:::-;7932:173;8194:4;8187:5;8183:16;8177:23;8213:63;8270:4;8265:3;8261:14;8247:12;8213:63;:::i;:::-;8115:171;8378:4;8371:5;8367:16;8361:23;8397:63;8454:4;8449:3;8445:14;8431:12;8397:63;:::i;:::-;8296:174;8561:4;8554:5;8550:16;8544:23;8580:63;8637:4;8632:3;8628:14;8614:12;8580:63;:::i;:::-;8480:173;8746:4;8739:5;8735:16;8729:23;8765:63;8822:4;8817:3;8813:14;8799:12;8765:63;:::i;:::-;8663:175;8928:4;8921:5;8917:16;8911:23;8947:63;9004:4;8999:3;8995:14;8981:12;8947:63;:::i;:::-;8848:172;7526:1501;7402:1625;;:::o;9033:169::-;9117:11;9151:6;9146:3;9139:19;9191:4;9186:3;9182:14;9167:29;;9033:169;;;;:::o;9208:102::-;9249:6;9300:2;9296:7;9291:2;9284:5;9280:14;9276:28;9266:38;;9208:102;;;:::o;9316:377::-;9404:3;9432:39;9465:5;9432:39;:::i;:::-;9487:71;9551:6;9546:3;9487:71;:::i;:::-;9480:78;;9567:65;9625:6;9620:3;9613:4;9606:5;9602:16;9567:65;:::i;:::-;9657:29;9679:6;9657:29;:::i;:::-;9652:3;9648:39;9641:46;;9408:285;9316:377;;;;:::o;9699:768::-;9984:4;10022:3;10011:9;10007:19;9999:27;;10036:129;10162:1;10151:9;10147:17;10138:6;10036:129;:::i;:::-;10175:131;10301:3;10290:9;10286:19;10277:6;10175:131;:::i;:::-;10354:9;10348:4;10344:20;10338:3;10327:9;10323:19;10316:49;10382:78;10455:4;10446:6;10382:78;:::i;:::-;10374:86;;9699:768;;;;;;:::o;10473:180::-;10521:77;10518:1;10511:88;10618:4;10615:1;10608:15;10642:4;10639:1;10632:15;10659:233;10698:3;10721:24;10739:5;10721:24;:::i;:::-;10712:33;;10767:66;10760:5;10757:77;10754:103;;10837:18;;:::i;:::-;10754:103;10884:1;10877:5;10873:13;10866:20;;10659:233;;;:::o","linkReferences":{}},"methodIdentifiers":{"test()":"f8a8fd6d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"test\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsCallee\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065\",\"dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"test"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsCallee"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95","urls":["bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065","dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file diff --git a/abis/SimEnvOptsStructs.json b/abis/SimEnvOptsStructs.json index 8ab20af..14d1a42 100644 --- a/abis/SimEnvOptsStructs.json +++ b/abis/SimEnvOptsStructs.json @@ -1 +1 @@ -{"abi":[{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsStructs\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f\",\"dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsStructs"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050","urls":["bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f","dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file +{"abi":[{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsStructs\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065\",\"dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsStructs"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95","urls":["bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065","dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file diff --git a/abis/SimEnvOptsTestMain.json b/abis/SimEnvOptsTestMain.json index 8c6f72c..c43d6d2 100644 --- a/abis/SimEnvOptsTestMain.json +++ b/abis/SimEnvOptsTestMain.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"call","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b50604051610ead380380610ead83398181016040528101906100319190610156565b86868686868686604051610044906100b8565b6100549796959493929190610211565b604051809103905ff08015801561006d573d5f5f3e3d5ffd5b505f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505061027e565b610b408061036d83390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100f2826100c9565b9050919050565b610102816100e8565b811461010c575f5ffd5b50565b5f8151905061011d816100f9565b92915050565b5f819050919050565b61013581610123565b811461013f575f5ffd5b50565b5f815190506101508161012c565b92915050565b5f5f5f5f5f5f5f60e0888a031215610171576101706100c5565b5b5f61017e8a828b0161010f565b975050602061018f8a828b01610142565b96505060406101a08a828b0161010f565b95505060606101b18a828b01610142565b94505060806101c28a828b01610142565b93505060a06101d38a828b01610142565b92505060c06101e48a828b01610142565b91505092959891949750929550565b6101fc816100e8565b82525050565b61020b81610123565b82525050565b5f60e0820190506102245f83018a6101f3565b6102316020830189610202565b61023e60408301886101f3565b61024b6060830187610202565b6102586080830186610202565b61026560a0830185610202565b61027260c0830184610202565b98975050505050505050565b60e38061028a5f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c806328b5e32b14602a575b5f5ffd5b60306032565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8a8fd6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156096575f5ffd5b505af115801560a7573d5f5f3e3d5ffd5b5050505056fea2646970667358221220034c5d0d32da7bd82a83a8645a84a4e576d66b930b06a5a2376feebb603681e664736f6c634300081e0033608060405234801561000f575f5ffd5b50604051610b40380380610b408339818101604052810190610031919061017e565b865f5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550855f60010181905550845f6002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550835f60030181905550825f60040181905550815f60050181905550805f600601819055505050505050505061021b565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61011a826100f1565b9050919050565b61012a81610110565b8114610134575f5ffd5b50565b5f8151905061014581610121565b92915050565b5f819050919050565b61015d8161014b565b8114610167575f5ffd5b50565b5f8151905061017881610154565b92915050565b5f5f5f5f5f5f5f60e0888a031215610199576101986100ed565b5b5f6101a68a828b01610137565b97505060206101b78a828b0161016a565b96505060406101c88a828b01610137565b95505060606101d98a828b0161016a565b94505060806101ea8a828b0161016a565b93505060a06101fb8a828b0161016a565b92505060c061020c8a828b0161016a565b91505092959891949750929550565b610918806102285f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f6040518060e00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050610129610434565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff1614610267575f915080604051602001610255919061050e565b60405160208183030381529060405290505b836020015183602001511461029c575f91508060405160200161028a9190610559565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff16146102fd575f9150806040516020016102eb91906105a4565b60405160208183030381529060405290505b8360600151836060015114610332575f91508060405160200161032091906105ef565b60405160208183030381529060405290505b8360800151836080015114610367575f915080604051602001610355919061063a565b60405160208183030381529060405290505b8360a001518360a001511461039c575f91508060405160200161038a9190610685565b60405160208183030381529060405290505b8360c001518360c00151146103d1575f9150806040516020016103bf91906106d0565b60405160208183030381529060405290505b81610417578383826040517fe7fd0aab00000000000000000000000000000000000000000000000000000000815260040161040e93929190610830565b60405180910390fd5b60075f8154809291906104299061089b565b919050555050505050565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6104c282610496565b6104cc81856104a0565b93506104dc8185602086016104aa565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61051982846104b8565b9150610524826104e8565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f61056482846104b8565b915061056f82610533565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6105af82846104b8565b91506105ba8261057e565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f6105fa82846104b8565b9150610605826105c9565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f61064582846104b8565b915061065082610614565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f61069082846104b8565b915061069b8261065f565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f6106db82846104b8565b91506106e6826106aa565b60118201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61071e826106f5565b9050919050565b61072e81610714565b82525050565b5f819050919050565b61074681610734565b82525050565b60e082015f8201516107605f850182610725565b506020820151610773602085018261073d565b5060408201516107866040850182610725565b506060820151610799606085018261073d565b5060808201516107ac608085018261073d565b5060a08201516107bf60a085018261073d565b5060c08201516107d260c085018261073d565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f61080282610496565b61080c81856107d8565b935061081c8185602086016104aa565b610825816107e8565b840191505092915050565b5f6101e0820190506108445f83018661074c565b61085160e083018561074c565b8181036101c083015261086481846107f8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6108a582610734565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d7576108d661086e565b5b60018201905091905056fea2646970667358221220eb6c986fd33dc61bb93734548731c7d1c04f9b48c5c9649c0a7a9b7d8f71612e64736f6c634300081e0033","sourceMap":"604:649:20:-:0;;;703:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;995:8;1017:10;1041:13;1068:11;1093:14;1121:13;1148:15;961:212;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;942:16;;:231;;;;;;;;;;;;;;;;;;703:477;;;;;;;604:649;;;;;;;;;;:::o;88:117:22:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:77::-;882:7;911:5;900:16;;845:77;;;:::o;928:122::-;1001:24;1019:5;1001:24;:::i;:::-;994:5;991:35;981:63;;1040:1;1037;1030:12;981:63;928:122;:::o;1056:143::-;1113:5;1144:6;1138:13;1129:22;;1160:33;1187:5;1160:33;:::i;:::-;1056:143;;;;:::o;1205:1291::-;1329:6;1337;1345;1353;1361;1369;1377;1426:3;1414:9;1405:7;1401:23;1397:33;1394:120;;;1433:79;;:::i;:::-;1394:120;1553:1;1578:64;1634:7;1625:6;1614:9;1610:22;1578:64;:::i;:::-;1568:74;;1524:128;1691:2;1717:64;1773:7;1764:6;1753:9;1749:22;1717:64;:::i;:::-;1707:74;;1662:129;1830:2;1856:64;1912:7;1903:6;1892:9;1888:22;1856:64;:::i;:::-;1846:74;;1801:129;1969:2;1995:64;2051:7;2042:6;2031:9;2027:22;1995:64;:::i;:::-;1985:74;;1940:129;2108:3;2135:64;2191:7;2182:6;2171:9;2167:22;2135:64;:::i;:::-;2125:74;;2079:130;2248:3;2275:64;2331:7;2322:6;2311:9;2307:22;2275:64;:::i;:::-;2265:74;;2219:130;2388:3;2415:64;2471:7;2462:6;2451:9;2447:22;2415:64;:::i;:::-;2405:74;;2359:130;1205:1291;;;;;;;;;;:::o;2502:118::-;2589:24;2607:5;2589:24;:::i;:::-;2584:3;2577:37;2502:118;;:::o;2626:::-;2713:24;2731:5;2713:24;:::i;:::-;2708:3;2701:37;2626:118;;:::o;2750:886::-;3011:4;3049:3;3038:9;3034:19;3026:27;;3063:71;3131:1;3120:9;3116:17;3107:6;3063:71;:::i;:::-;3144:72;3212:2;3201:9;3197:18;3188:6;3144:72;:::i;:::-;3226;3294:2;3283:9;3279:18;3270:6;3226:72;:::i;:::-;3308;3376:2;3365:9;3361:18;3352:6;3308:72;:::i;:::-;3390:73;3458:3;3447:9;3443:19;3434:6;3390:73;:::i;:::-;3473;3541:3;3530:9;3526:19;3517:6;3473:73;:::i;:::-;3556;3624:3;3613:9;3609:19;3600:6;3556:73;:::i;:::-;2750:886;;;;;;;;;;:::o;604:649:20:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600e575f5ffd5b50600436106026575f3560e01c806328b5e32b14602a575b5f5ffd5b60306032565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8a8fd6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156096575f5ffd5b505af115801560a7573d5f5f3e3d5ffd5b5050505056fea2646970667358221220034c5d0d32da7bd82a83a8645a84a4e576d66b930b06a5a2376feebb603681e664736f6c634300081e0033","sourceMap":"604:649:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1186:65;;;:::i;:::-;;;1221:16;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1186:65::o","linkReferences":{}},"methodIdentifiers":{"call()":"28b5e32b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"call\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Rubydusa\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Simulation Environment Test\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Not covered: Blobs (BLOBHASH, BLOBBASEFEE), Block (BLOCKHASH). Possibly more\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsTestMain\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f\",\"dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"call"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsTestMain"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x4b26cc81af932fc8b0519d150f87c8a64a0420dfc18e4cde6ee123ead1bcb050","urls":["bzz-raw://5de62851e89892f07df802cf002af218800b37ce5eac699fbff4537a3218a80f","dweb:/ipfs/QmRLScFhCKHoGWpzA7EsUxzRgBShc9LtMgJArgSbSpXvyx"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"call","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"error","name":"EnvironmentMismatch","inputs":[{"name":"expected","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"actual","type":"tuple","internalType":"struct SimEnvOptsStructs.SimEnvOpts","components":[{"name":"txOrigin","type":"address","internalType":"address"},{"name":"txGasPrice","type":"uint256","internalType":"uint256"},{"name":"blockCoinbase","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","internalType":"uint256"},{"name":"blockGasLimit","type":"uint256","internalType":"uint256"},{"name":"blockPrevRandao","type":"uint256","internalType":"uint256"},{"name":"blockBaseFee","type":"uint256","internalType":"uint256"}]},{"name":"explanation","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b50604051610fa2380380610fa283398181016040528101906100319190610159565b8787878787878787604051610045906100bb565b610056989796959493929190610228565b604051809103905ff08015801561006f573d5f5f3e3d5ffd5b505f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050506102a4565b610c0f8061039383390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100f5826100cc565b9050919050565b610105816100eb565b811461010f575f5ffd5b50565b5f81519050610120816100fc565b92915050565b5f819050919050565b61013881610126565b8114610142575f5ffd5b50565b5f815190506101538161012f565b92915050565b5f5f5f5f5f5f5f5f610100898b031215610176576101756100c8565b5b5f6101838b828c01610112565b98505060206101948b828c01610145565b97505060406101a58b828c01610112565b96505060606101b68b828c01610145565b95505060806101c78b828c01610145565b94505060a06101d88b828c01610145565b93505060c06101e98b828c01610145565b92505060e06101fa8b828c01610145565b9150509295985092959890939650565b610213816100eb565b82525050565b61022281610126565b82525050565b5f6101008201905061023c5f83018b61020a565b610249602083018a610219565b610256604083018961020a565b6102636060830188610219565b6102706080830187610219565b61027d60a0830186610219565b61028a60c0830185610219565b61029760e0830184610219565b9998505050505050505050565b60e3806102b05f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c806328b5e32b14602a575b5f5ffd5b60306032565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8a8fd6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156096575f5ffd5b505af115801560a7573d5f5f3e3d5ffd5b5050505056fea26469706673582212204fe2105e2bf8d7690651745d6fd39b9ffffff2f2ad419dee55ad5566110eb06464736f6c634300081e0033608060405234801561000f575f5ffd5b50604051610c0f380380610c0f83398181016040528101906100319190610188565b875f5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550865f60010181905550855f6002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550845f60030181905550835f60040181905550825f60050181905550815f60060181905550805f600701819055505050505050505050610239565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610124826100fb565b9050919050565b6101348161011a565b811461013e575f5ffd5b50565b5f8151905061014f8161012b565b92915050565b5f819050919050565b61016781610155565b8114610171575f5ffd5b50565b5f815190506101828161015e565b92915050565b5f5f5f5f5f5f5f5f610100898b0312156101a5576101a46100f7565b5b5f6101b28b828c01610141565b98505060206101c38b828c01610174565b97505060406101d48b828c01610141565b96505060606101e58b828c01610174565b95505060806101f68b828c01610174565b94505060a06102078b828c01610174565b93505060c06102188b828c01610174565b92505060e06102298b828c01610174565b9150509295985092959890939650565b6109c9806102465f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063f8a8fd6d1461002d575b5f5ffd5b610035610037565b005b5f5f604051806101000160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050905061013461047e565b32815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503a81602001818152505041816040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250504381606001818152505042816080018181525050458160a0018181525050448160c0018181525050488160e00181815250505f600190505f6040518060400160405280601381526020017f4d69736d617463686564206669656c64733a20000000000000000000000000008152509050835f015173ffffffffffffffffffffffffffffffffffffffff16835f015173ffffffffffffffffffffffffffffffffffffffff161461027c575f91508060405160200161026a919061055f565b60405160208183030381529060405290505b83602001518360200151146102b1575f91508060405160200161029f91906105aa565b60405160208183030381529060405290505b836040015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff1614610312575f91508060405160200161030091906105f5565b60405160208183030381529060405290505b8360600151836060015114610347575f9150806040516020016103359190610640565b60405160208183030381529060405290505b836080015183608001511461037c575f91508060405160200161036a919061068b565b60405160208183030381529060405290505b8360a001518360a00151146103b1575f91508060405160200161039f91906106d6565b60405160208183030381529060405290505b8360c001518360c00151146103e6575f9150806040516020016103d49190610721565b60405160208183030381529060405290505b8360e001518360e001511461041b575f915080604051602001610409919061076c565b60405160208183030381529060405290505b81610461578383826040517f9e95e280000000000000000000000000000000000000000000000000000000008152600401610458939291906108e0565b60405180910390fd5b60085f8154809291906104739061094c565b919050555050505050565b6040518061010001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610513826104e7565b61051d81856104f1565b935061052d8185602086016104fb565b80840191505092915050565b7f74784f726967696e2c2000000000000000000000000000000000000000000000815250565b5f61056a8284610509565b915061057582610539565b600a8201915081905092915050565b7f747847617350726963652c200000000000000000000000000000000000000000815250565b5f6105b58284610509565b91506105c082610584565b600c8201915081905092915050565b7f626c6f636b436f696e626173652c200000000000000000000000000000000000815250565b5f6106008284610509565b915061060b826105cf565b600f8201915081905092915050565b7f626c6f636b4e756d6265722c2000000000000000000000000000000000000000815250565b5f61064b8284610509565b91506106568261061a565b600d8201915081905092915050565b7f626c6f636b54696d657374616d702c2000000000000000000000000000000000815250565b5f6106968284610509565b91506106a182610665565b60108201915081905092915050565b7f626c6f636b4761734c696d69742c200000000000000000000000000000000000815250565b5f6106e18284610509565b91506106ec826106b0565b600f8201915081905092915050565b7f626c6f636b5072657652616e64616f2c20000000000000000000000000000000815250565b5f61072c8284610509565b9150610737826106fb565b60118201915081905092915050565b7f626c6f636b426173654665652c20000000000000000000000000000000000000815250565b5f6107778284610509565b915061078282610746565b600e8201915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107ba82610791565b9050919050565b6107ca816107b0565b82525050565b5f819050919050565b6107e2816107d0565b82525050565b61010082015f8201516107fd5f8501826107c1565b50602082015161081060208501826107d9565b50604082015161082360408501826107c1565b50606082015161083660608501826107d9565b50608082015161084960808501826107d9565b5060a082015161085c60a08501826107d9565b5060c082015161086f60c08501826107d9565b5060e082015161088260e08501826107d9565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6108b2826104e7565b6108bc8185610888565b93506108cc8185602086016104fb565b6108d581610898565b840191505092915050565b5f610220820190506108f45f8301866107e8565b6109026101008301856107e8565b81810361020083015261091581846108a8565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610956826107d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036109885761098761091f565b5b60018201905091905056fea2646970667358221220304854ebfccca711ddaa0310dd162c246ca088276b21e1a64283d70875c5dc6064736f6c634300081e0033","sourceMap":"634:701:20:-:0;;;729:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1051:8;1073:10;1097:13;1124:11;1149:14;1177:13;1204:15;1233:12;1017:238;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;998:16;;:257;;;;;;;;;;;;;;;;;;729:533;;;;;;;;634:701;;;;;;;;;;:::o;88:117:22:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:77::-;882:7;911:5;900:16;;845:77;;;:::o;928:122::-;1001:24;1019:5;1001:24;:::i;:::-;994:5;991:35;981:63;;1040:1;1037;1030:12;981:63;928:122;:::o;1056:143::-;1113:5;1144:6;1138:13;1129:22;;1160:33;1187:5;1160:33;:::i;:::-;1056:143;;;;:::o;1205:1448::-;1338:6;1346;1354;1362;1370;1378;1386;1394;1443:3;1431:9;1422:7;1418:23;1414:33;1411:120;;;1450:79;;:::i;:::-;1411:120;1570:1;1595:64;1651:7;1642:6;1631:9;1627:22;1595:64;:::i;:::-;1585:74;;1541:128;1708:2;1734:64;1790:7;1781:6;1770:9;1766:22;1734:64;:::i;:::-;1724:74;;1679:129;1847:2;1873:64;1929:7;1920:6;1909:9;1905:22;1873:64;:::i;:::-;1863:74;;1818:129;1986:2;2012:64;2068:7;2059:6;2048:9;2044:22;2012:64;:::i;:::-;2002:74;;1957:129;2125:3;2152:64;2208:7;2199:6;2188:9;2184:22;2152:64;:::i;:::-;2142:74;;2096:130;2265:3;2292:64;2348:7;2339:6;2328:9;2324:22;2292:64;:::i;:::-;2282:74;;2236:130;2405:3;2432:64;2488:7;2479:6;2468:9;2464:22;2432:64;:::i;:::-;2422:74;;2376:130;2545:3;2572:64;2628:7;2619:6;2608:9;2604:22;2572:64;:::i;:::-;2562:74;;2516:130;1205:1448;;;;;;;;;;;:::o;2659:118::-;2746:24;2764:5;2746:24;:::i;:::-;2741:3;2734:37;2659:118;;:::o;2783:::-;2870:24;2888:5;2870:24;:::i;:::-;2865:3;2858:37;2783:118;;:::o;2907:997::-;3196:4;3234:3;3223:9;3219:19;3211:27;;3248:71;3316:1;3305:9;3301:17;3292:6;3248:71;:::i;:::-;3329:72;3397:2;3386:9;3382:18;3373:6;3329:72;:::i;:::-;3411;3479:2;3468:9;3464:18;3455:6;3411:72;:::i;:::-;3493;3561:2;3550:9;3546:18;3537:6;3493:72;:::i;:::-;3575:73;3643:3;3632:9;3628:19;3619:6;3575:73;:::i;:::-;3658;3726:3;3715:9;3711:19;3702:6;3658:73;:::i;:::-;3741;3809:3;3798:9;3794:19;3785:6;3741:73;:::i;:::-;3824;3892:3;3881:9;3877:19;3868:6;3824:73;:::i;:::-;2907:997;;;;;;;;;;;:::o;634:701:20:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600e575f5ffd5b50600436106026575f3560e01c806328b5e32b14602a575b5f5ffd5b60306032565b005b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8a8fd6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156096575f5ffd5b505af115801560a7573d5f5f3e3d5ffd5b5050505056fea26469706673582212204fe2105e2bf8d7690651745d6fd39b9ffffff2f2ad419dee55ad5566110eb06464736f6c634300081e0033","sourceMap":"634:701:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1268:65;;;:::i;:::-;;;1303:16;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1268:65::o","linkReferences":{}},"methodIdentifiers":{"call()":"28b5e32b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"expected\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"txOrigin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"txGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"blockCoinbase\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockPrevRandao\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockBaseFee\",\"type\":\"uint256\"}],\"internalType\":\"struct SimEnvOptsStructs.SimEnvOpts\",\"name\":\"actual\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"explanation\",\"type\":\"string\"}],\"name\":\"EnvironmentMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"call\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Rubydusa\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Simulation Environment Test\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Not covered: Blobs (BLOBHASH, BLOBBASEFEE), Block (BLOCKHASH). Possibly more\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimEnvTestContracts.sol\":\"SimEnvOptsTestMain\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/\",\":@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/\",\":erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gas-killer-avs-sol/=lib/gas-killer-avs-sol/\",\":gk/=lib/gas-killer-avs-sol/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/\"]},\"sources\":{\"src/SimEnvTestContracts.sol\":{\"keccak256\":\"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065\",\"dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"expected","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"struct SimEnvOptsStructs.SimEnvOpts","name":"actual","type":"tuple","components":[{"internalType":"address","name":"txOrigin","type":"address"},{"internalType":"uint256","name":"txGasPrice","type":"uint256"},{"internalType":"address","name":"blockCoinbase","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"internalType":"uint256","name":"blockGasLimit","type":"uint256"},{"internalType":"uint256","name":"blockPrevRandao","type":"uint256"},{"internalType":"uint256","name":"blockBaseFee","type":"uint256"}]},{"internalType":"string","name":"explanation","type":"string"}],"type":"error","name":"EnvironmentMismatch"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"call"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/src/","@openzeppelin-upgrades/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-middleware/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/","erc4626-tests/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gas-killer-avs-sol/=lib/gas-killer-avs-sol/","gk/=lib/gas-killer-avs-sol/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","zeus-templates/=lib/gas-killer-avs-sol/lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/zeus-templates/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/SimEnvTestContracts.sol":"SimEnvOptsTestMain"},"evmVersion":"prague","libraries":{}},"sources":{"src/SimEnvTestContracts.sol":{"keccak256":"0x9c5582c4ee5ee152bf4d1bf016f8eff5333873a2d9572b38db689ce157fb6f95","urls":["bzz-raw://778911f636fe3d5336bdad0a50a6b5538722a6c1fed13c1e66b7b0192478a065","dweb:/ipfs/QmRTJLND6CwHiNTyU9J3M77ChXFrrC7XYkA4gTRgNEahp8"],"license":"MIT"}},"version":1},"id":20} \ No newline at end of file diff --git a/contracts/README.md b/contracts/README.md index effa9fe..5ff70df 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -4,7 +4,7 @@ Solidity contracts used by the Gas Analyzer for on-chain gas estimation and inte ## Contents -- **`src/StateChangeHandlerGasEstimator.sol`** — Wrapper around `StateChangeHandlerLib` from [gas-killer-avs-sol](https://github.com/BreadchainCoop/gas-killer-avs-sol). Deployed to an Anvil fork to measure the actual gas cost of replaying a transaction's state updates. +- **`src/StateChangeHandlerGasEstimator.sol`** — Wrapper around `StateChangeHandlerLib` from [solidity-sdk](https://github.com/gas-killer/solidity-sdk). Deployed to an Anvil fork to measure the actual gas cost of replaying a transaction's state updates. - **`src/AccessControlTestContracts.sol`** — Test contracts for verifying state update extraction across access-controlled calls. - **`src/DelegateCallTestContracts.sol`** — Test contracts for verifying correct state update extraction with `DELEGATECALL` (only top-level context changes should be captured). - **`script/`** — Foundry deployment scripts for the test contracts. @@ -18,7 +18,7 @@ Solidity contracts used by the Gas Analyzer for on-chain gas estimation and inte ```bash cd contracts -# Install dependencies (forge-std, gas-killer-avs-sol) +# Install dependencies (forge-std, solidity-sdk) forge install # Build diff --git a/contracts/foundry.lock b/contracts/foundry.lock index cb7b6dd..e59f3b3 100644 --- a/contracts/foundry.lock +++ b/contracts/foundry.lock @@ -2,7 +2,7 @@ "lib/forge-std": { "rev": "77041d2ce690e692d6e03cc812b57d1ddaa4d505" }, - "lib/gas-killer-avs-sol": { - "rev": "33ef63ec63dccf6f7de98778de1cbbf2754489a6" + "lib/solidity-sdk": { + "rev": "ca0be7078f77e414952e7723c9b92a2d4d4f8e54" } } \ No newline at end of file diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 647f756..3421414 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -4,7 +4,7 @@ out = "out" libs = ["lib"] remappings = [ - "gk/=lib/gas-killer-avs-sol/src/" + "gk/=lib/solidity-sdk/src/" ] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/contracts/lib/gas-killer-avs-sol b/contracts/lib/gas-killer-avs-sol deleted file mode 160000 index 33ef63e..0000000 --- a/contracts/lib/gas-killer-avs-sol +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 33ef63ec63dccf6f7de98778de1cbbf2754489a6 diff --git a/contracts/lib/solidity-sdk b/contracts/lib/solidity-sdk new file mode 160000 index 0000000..ca0be70 --- /dev/null +++ b/contracts/lib/solidity-sdk @@ -0,0 +1 @@ +Subproject commit ca0be7078f77e414952e7723c9b92a2d4d4f8e54 diff --git a/contracts/src/SimEnvTestContracts.sol b/contracts/src/SimEnvTestContracts.sol index d39b8aa..d7a613d 100644 --- a/contracts/src/SimEnvTestContracts.sol +++ b/contracts/src/SimEnvTestContracts.sol @@ -12,6 +12,7 @@ interface SimEnvOptsStructs { uint256 blockTimestamp; uint256 blockGasLimit; uint256 blockPrevRandao; + uint256 blockBaseFee; } error EnvironmentMismatch(SimEnvOpts expected, SimEnvOpts actual, string explanation); @@ -23,7 +24,7 @@ interface SimEnvOptsStructs { /// @notice Not covered: Blobs (BLOBHASH, BLOBBASEFEE), Block (BLOCKHASH). Possibly more contract SimEnvOptsTestMain is SimEnvOptsStructs { SimEnvOptsCallee simEnvOptsCallee; - + constructor ( address txOrigin, uint256 txGasPrice, @@ -31,7 +32,8 @@ contract SimEnvOptsTestMain is SimEnvOptsStructs { uint256 blockNumber, uint256 blockTimestamp, uint256 blockGasLimit, - uint256 blockPrevRandao + uint256 blockPrevRandao, + uint256 blockBaseFee ) { simEnvOptsCallee = new SimEnvOptsCallee( txOrigin, @@ -40,7 +42,8 @@ contract SimEnvOptsTestMain is SimEnvOptsStructs { blockNumber, blockTimestamp, blockGasLimit, - blockPrevRandao + blockPrevRandao, + blockBaseFee ); } @@ -61,7 +64,8 @@ contract SimEnvOptsCallee is SimEnvOptsStructs { uint256 blockNumber, uint256 blockTimestamp, uint256 blockGasLimit, - uint256 blockPrevRandao + uint256 blockPrevRandao, + uint256 blockBaseFee ) { simEnv.txOrigin = txOrigin; simEnv.txGasPrice = txGasPrice; @@ -70,6 +74,7 @@ contract SimEnvOptsCallee is SimEnvOptsStructs { simEnv.blockTimestamp = blockTimestamp; simEnv.blockGasLimit = blockGasLimit; simEnv.blockPrevRandao = blockPrevRandao; + simEnv.blockBaseFee = blockBaseFee; } function test() external { @@ -82,6 +87,7 @@ contract SimEnvOptsCallee is SimEnvOptsStructs { actual.blockTimestamp = block.timestamp; actual.blockGasLimit = block.gaslimit; actual.blockPrevRandao = block.prevrandao; + actual.blockBaseFee = block.basefee; bool correct = true; string memory reason = "Mismatched fields: "; @@ -113,6 +119,10 @@ contract SimEnvOptsCallee is SimEnvOptsStructs { correct = false; reason = string.concat(reason, "blockPrevRandao, "); } + if (actual.blockBaseFee != expected.blockBaseFee) { + correct = false; + reason = string.concat(reason, "blockBaseFee, "); + } if (!correct) { revert EnvironmentMismatch(expected, actual, reason); diff --git a/contracts/src/StateChangeHandlerGasEstimator.sol b/contracts/src/StateChangeHandlerGasEstimator.sol index 05e029e..884d6bc 100644 --- a/contracts/src/StateChangeHandlerGasEstimator.sol +++ b/contracts/src/StateChangeHandlerGasEstimator.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; -import { StateChangeHandlerLib, StateUpdateType } from "../lib/gas-killer-avs-sol/src/StateChangeHandlerLib.sol"; +import { StateChangeHandlerLib, StateUpdateType } from "../lib/solidity-sdk/src/StateChangeHandlerLib.sol"; /// @notice Gas estimator with transparent-proxy fallback. /// diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 567e886..3f11a58 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -116,6 +116,9 @@ async fn execute_command(cli_args: CliArgs) -> Result<()> { let block_number = receipt .block_number .expect("couldn't retrieve block number"); + let tx_index = receipt + .transaction_index + .expect("couldn't retrieve transaction index"); let gas_used = receipt.gas_used; let original_status = receipt.status(); let tx_sender = receipt.from; @@ -296,9 +299,37 @@ async fn execute_command(cli_args: CliArgs) -> Result<()> { .build() .await?; - // Try measured gas estimation first - match gk.estimate_state_changes_gas(contract_address, tx_sender, &state_updates) - { + // Fetch preceding transactions for mid-block state accuracy. + // We fail hard here rather than falling back to block-N-1 state: + // a silent fallback can produce a confidently wrong gas number for + // any tx that depends on mid-block state. + let preceding_txs = gas_analyzer_rpc::get_preceding_transactions( + &provider, + block_number, + tx_index, + ) + .await + .map_err(|e| { + anyhow::Error::msg(format!( + "Failed to fetch preceding transactions for block {} (tx index {}): {}", + block_number, tx_index, e + )) + })?; + + if !preceding_txs.is_empty() { + println!( + "Replaying {} preceding transaction(s) for accurate mid-block state...", + preceding_txs.len() + ); + } + + // Try measured gas estimation with preceding tx replay + match gk.estimate_state_changes_gas_with_preceding( + contract_address, + tx_sender, + &state_updates, + &preceding_txs, + ) { Ok(gas) => (gas + TURETZKY_UPPER_GAS_LIMIT, false), Err(e) => { // Fall back to heuristic estimation @@ -378,9 +409,10 @@ async fn execute_command(cli_args: CliArgs) -> Result<()> { println!("\n{}", "=== Gas Analysis ===".blue().bold()); println!("Transaction: 0x{}", hex::encode(bytes)); println!( - "Block: {} ({})", + "Block: {} ({}) | Tx Index: {}", block_number, - receipt.block_hash.unwrap_or_default() + receipt.block_hash.unwrap_or_default(), + tx_index ); println!("Gas used: {}", gas_used); let estimate_type = if use_fallback { diff --git a/crates/core/src/trace.rs b/crates/core/src/trace.rs index a9514cd..83910bc 100644 --- a/crates/core/src/trace.rs +++ b/crates/core/src/trace.rs @@ -28,9 +28,15 @@ pub fn copy_memory(memory: &[u8], offset: usize, length: usize) -> Vec { } /// Parse trace memory from Geth format (hex strings) to bytes. +/// +/// Accepts entries with or without an `0x` prefix — Anvil began emitting prefixed +/// memory words after revm-inspectors v0.38.1 (Foundry v1.7.0), while geth/erigon +/// and older Anvil emit bare hex. pub fn parse_trace_memory(memory: Vec) -> Vec { memory - .join("") + .iter() + .map(|s| s.strip_prefix("0x").unwrap_or(s)) + .collect::() .chars() .collect::>() .chunks(2) @@ -253,3 +259,32 @@ pub fn compute_state_updates( Ok((state_updates, skipped_opcodes, total_call_gas)) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_trace_memory_handles_both_prefixed_and_bare_hex() { + let bare = vec![ + "00000000000000000000000000000000000000000000000000000000000000ff".to_string(), + "1100000000000000000000000000000000000000000000000000000000000000".to_string(), + ]; + let prefixed = vec![ + "0x00000000000000000000000000000000000000000000000000000000000000ff".to_string(), + "0x1100000000000000000000000000000000000000000000000000000000000000".to_string(), + ]; + let mixed = vec![ + "0x00000000000000000000000000000000000000000000000000000000000000ff".to_string(), + "1100000000000000000000000000000000000000000000000000000000000000".to_string(), + ]; + + let expected = parse_trace_memory(bare); + assert_eq!(expected.len(), 64); + assert_eq!(expected[31], 0xff); + assert_eq!(expected[32], 0x11); + + assert_eq!(parse_trace_memory(prefixed), expected); + assert_eq!(parse_trace_memory(mixed), expected); + } +} diff --git a/crates/evmsketch/Cargo.toml b/crates/evmsketch/Cargo.toml index 33d5657..5cfabb0 100644 --- a/crates/evmsketch/Cargo.toml +++ b/crates/evmsketch/Cargo.toml @@ -9,6 +9,7 @@ gas-analyzer-rpc = { path = "../rpc" } gas-analyzer-estimator = { path = "../gas-estimator" } alloy = { version = "1.0.37", features = ["rpc", "rpc-types"] } alloy-eips = "1.0.37" +alloy-evm = "0.25" alloy-provider = { version = "1.0.37", features = ["debug-api"] } anyhow = "1.0.98" tokio = { version = "1", features = ["rt"] } @@ -17,3 +18,12 @@ reth-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.1" revm = { version = "31.0.1" } sp1-cc-host-executor = { git = "https://github.com/BreadchainCoop/sp1-contract-call", branch = "cancun-v1", package = "sp1-cc-host-executor" } sp1-cc-client-executor = { git = "https://github.com/BreadchainCoop/sp1-contract-call", branch = "cancun-v1", package = "sp1-cc-client-executor" } + +[dev-dependencies] +alloy-consensus = "1" +alloy-hardforks = "0.4" +alloy-json-rpc = "1" +alloy-rpc-client = "1" +alloy-transport = "1" +tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] } +tower = "0.5" diff --git a/crates/evmsketch/src/lib.rs b/crates/evmsketch/src/lib.rs index eab5591..12fb122 100644 --- a/crates/evmsketch/src/lib.rs +++ b/crates/evmsketch/src/lib.rs @@ -12,6 +12,7 @@ use alloy::providers::ProviderBuilder; use alloy::rpc::types::eth::TransactionRequest; use alloy_eips::BlockId; use alloy_eips::BlockNumberOrTag; +use alloy_evm::eth::spec::EthSpec; use alloy_provider::Provider; use alloy_provider::RootProvider; use alloy_provider::ext::DebugApi; @@ -20,10 +21,34 @@ use anyhow::{Result, anyhow}; use reth_primitives::EthPrimitives; use revm::database::CacheDB; use sp1_cc_client_executor::{ContractCalldata, ContractInput}; -use sp1_cc_host_executor::EvmSketch; +use sp1_cc_host_executor::{EvmSketch, Genesis}; use std::collections::HashSet; use url::Url; +/// Ethereum mainnet chain ID. +pub const MAINNET_CHAIN_ID: u64 = 1; +/// Ethereum Sepolia chain ID. +pub const SEPOLIA_CHAIN_ID: u64 = 11_155_111; + +/// Map a chain ID to the corresponding `Genesis` for `EvmSketch` and the +/// matching `EthSpec` for hardfork derivation. +/// +/// Only Ethereum mainnet and Sepolia are supported — other chain IDs return +/// an error rather than silently defaulting to mainnet, which would produce +/// a wrong `SpecId` whenever the active hardfork on the target chain +/// differs from mainnet at the same height/timestamp. +pub fn chain_id_to_genesis_and_spec(chain_id: u64) -> Result<(Genesis, EthSpec)> { + match chain_id { + MAINNET_CHAIN_ID => Ok((Genesis::Mainnet, EthSpec::mainnet())), + SEPOLIA_CHAIN_ID => Ok((Genesis::Sepolia, EthSpec::sepolia())), + other => Err(anyhow!( + "unsupported chain id {other}: only mainnet ({}) and sepolia ({}) are supported", + MAINNET_CHAIN_ID, + SEPOLIA_CHAIN_ID, + )), + } +} + pub mod simple_rpc_db; use simple_rpc_db::SimpleRpcDb; @@ -31,7 +56,7 @@ use gas_analyzer_core::{ Opcode, StateUpdate, compute_state_updates, encode_state_updates_to_abi, estimate_gas_from_operations, extract_operation_counts_from_trace, }; -use gas_analyzer_estimator::SimEnvOpts; +use gas_analyzer_estimator::{PrecedingTx, SimEnvOpts}; use gas_analyzer_rpc::get_trace_from_call; // ============================================================================ @@ -86,6 +111,10 @@ pub fn tx_request_to_contract_input(tx_request: &TransactionRequest) -> Result { /// The underlying EvmSketch instance pub sketch: EvmSketch, + /// The chain ID detected from the RPC at build time. Used by `sim_env` + /// to pick the right `EthSpec` so hardfork derivation matches the + /// network being analyzed (mainnet vs Sepolia). + pub chain_id: u64, } /// Builder for EvmSketchExecutor @@ -114,17 +143,31 @@ impl EvmSketchExecutorBuilder { } /// Build the EvmSketchExecutor. + /// + /// Queries `eth_chainId` from the RPC and selects the matching `Genesis` + /// (and, later, `EthSpec` in `sim_env`). Errors if the chain is neither + /// mainnet nor Sepolia: silently defaulting to mainnet when pointed at a + /// different network would yield wrong hardfork activation and corrupt + /// gas estimation. pub async fn build(self) -> Result { let rpc_url = self.rpc_url.ok_or_else(|| anyhow!("RPC URL is required"))?; + let chain_probe = RootProvider::::new_http(rpc_url.clone()); + let chain_id = chain_probe + .get_chain_id() + .await + .map_err(|e| anyhow!("Failed to query eth_chainId: {}", e))?; + let (genesis, _spec) = chain_id_to_genesis_and_spec(chain_id)?; + let sketch = EvmSketch::builder() .at_block(self.block) .el_rpc_url(rpc_url) + .with_genesis(genesis) .build() .await .map_err(|e| anyhow!("Failed to build EvmSketch: {}", e))?; - Ok(EvmSketchExecutor { sketch }) + Ok(EvmSketchExecutor { sketch, chain_id }) } } @@ -132,6 +175,11 @@ impl DefaultEvmSketchExecutor { /// Estimate gas for executing a set of state updates using pre-built calldata. /// /// Delegates to the shared gas-analyzer-estimator crate which uses revm directly. + /// + /// Storage is read at `block_number - 1` via `SimpleRpcDb`, matching the + /// other estimation entry points. Anchoring to `block_number` itself + /// returns post-block state from `eth_getStorageAt` — the analyzed tx + /// would observe its own writes already applied. pub fn estimate_state_changes_gas_raw( &self, contract_address: Address, @@ -139,7 +187,12 @@ impl DefaultEvmSketchExecutor { calldata: Bytes, gas_price: u128, ) -> Result { - let mut cache_db = CacheDB::new(&self.sketch.rpc_db); + let state_block = self.anchor_block_number().saturating_sub(1); + let simple_db = SimpleRpcDb { + provider: self.sketch.provider.clone(), + block_number: state_block, + }; + let mut cache_db = CacheDB::new(simple_db); let mut sim_env = self.sim_env(); sim_env.gas_price = gas_price; gas_analyzer_estimator::estimate_gas_raw( @@ -155,8 +208,17 @@ impl DefaultEvmSketchExecutor { /// /// `gas_price` defaults to 0 since it is a transaction-level field; /// callers with access to the original transaction can override it. + /// `basefee` comes from the header (0 for pre-EIP-1559 blocks). + /// `spec` is derived from the header against the chain detected at + /// build time (mainnet or Sepolia hardforks); `difficulty` carries the + /// legacy PoW value (zero post-Merge). pub fn sim_env(&self) -> SimEnvOpts { let header = self.sketch.anchor.header(); + let eth_spec = match self.chain_id { + SEPOLIA_CHAIN_ID => EthSpec::sepolia(), + _ => EthSpec::mainnet(), + }; + let spec = alloy_evm::spec(ð_spec, header); SimEnvOpts { number: header.number, timestamp: header.timestamp, @@ -164,9 +226,17 @@ impl DefaultEvmSketchExecutor { coinbase: header.beneficiary, prevrandao: header.mix_hash, gas_price: 0, + basefee: header.base_fee_per_gas.unwrap_or(0), + difficulty: header.difficulty, + spec, } } + /// Returns the chain ID detected from the RPC at build time. + pub fn chain_id(&self) -> u64 { + self.chain_id + } + /// Get the block hash that the executor is anchored to. pub fn anchor_block_hash(&self) -> B256 { self.sketch.anchor.resolve().hash @@ -264,6 +334,62 @@ impl GasKillerEvmSketchDefault { ) } + /// Estimate gas for state changes, replaying preceding transactions first. + /// + /// Creates a single CacheDB, replays all preceding transactions to bring + /// it to the correct mid-block state, then runs gas estimation on that + /// state. This ensures the simulation sees the same state the original + /// transaction executed against. + /// + /// If `preceding_txs` is empty (first-in-block), this behaves identically + /// to `estimate_state_changes_gas`. + pub fn estimate_state_changes_gas_with_preceding( + &self, + contract_address: Address, + caller_address: Address, + state_updates: &[StateUpdate], + preceding_txs: &[PrecedingTx], + ) -> Result { + // Source storage from block N-1 (pre-block state). Anchoring to + // `block_number` itself makes RPC reads return state at the *end* of + // block N — after every tx in that block (including the one we're + // analyzing) has already been applied. `replay_preceding_transactions` + // would then re-apply txs `[0..tx_index)` on top of post-block state, + // compounding the error. + // + // Reading from N-1 puts the DB in the correct pre-block state, and + // the subsequent replay brings it to the right mid-block point. + // + // The most visible failure mode is any replayed call whose logic + // depends on state mutated earlier in the same block — e.g. an + // EIP-2612 `permit` whose nonce was already consumed by the original + // tx, causing signature recovery to mismatch and the call to revert + // with "invalid signature". + let state_block = self.executor.anchor_block_number().saturating_sub(1); + let simple_db = SimpleRpcDb { + provider: self.executor.sketch.provider.clone(), + block_number: state_block, + }; + let mut cache_db = CacheDB::new(simple_db); + let sim_env = self.executor.sim_env(); + + if !preceding_txs.is_empty() { + gas_analyzer_estimator::replay_preceding_transactions( + &mut cache_db, + preceding_txs, + &sim_env, + )?; + } + + gas_analyzer_estimator::estimate_state_changes_gas( + &mut cache_db, + contract_address, + caller_address, + state_updates, + &sim_env, + ) + } + /// Estimate gas using a fallback heuristic based on the original transaction trace. /// /// This extracts operations (SSTORE, LOG, CALL) from the original transaction trace @@ -380,4 +506,242 @@ mod tests { let result = tx_request_to_contract_input(&tx_request); assert!(result.is_err()); } + + /// `SimEnvOpts::spec` must reflect the mainnet hardfork active at the + /// anchored block. Synthesized headers at known mainnet + /// Berlin/London/Paris/Shanghai/Cancun heights are fed through the + /// same `alloy_evm::spec(&EthSpec::mainnet(), ...)` call `sim_env()` + /// uses; an accidental chainspec swap (e.g. to Sepolia, where these + /// heights differ) would surface as a wrong `SpecId`. + #[test] + fn test_sim_env_spec_derivation_against_mainnet() { + use alloy_consensus::Header; + use alloy_evm::eth::spec::EthSpec; + use revm::primitives::hardfork::SpecId; + + let mainnet = EthSpec::mainnet(); + + // Mainnet historical fork heights / timestamps. Hardcoded so the + // test fails loudly if the chainspec is ever swapped (e.g. for + // Sepolia, where these heights are different). + let cases: &[(&str, u64, u64, SpecId)] = &[ + ("Berlin", 12_244_000, 0, SpecId::BERLIN), + ("London", 12_965_000, 0, SpecId::LONDON), + ("Paris", 15_537_394, 0, SpecId::MERGE), + ("Shanghai", 17_034_870, 1_681_338_455, SpecId::SHANGHAI), + ("Cancun", 19_426_587, 1_710_338_135, SpecId::CANCUN), + ]; + + for &(name, number, timestamp, expected) in cases { + let header = Header { + number, + timestamp, + ..Default::default() + }; + let actual = alloy_evm::spec(&mainnet, &header); + assert_eq!( + actual, expected, + "{name} header (block {number}, ts {timestamp}) mapped to {actual:?}, \ + expected {expected:?} — sim_env() may be using the wrong chainspec", + ); + } + + // A wildly future timestamp should map to the latest known spec + // (at least Prague — chainspec library may have rolled forward). + let future = Header { + number: 50_000_000, + timestamp: 5_000_000_000, + ..Default::default() + }; + let fut_spec = alloy_evm::spec(&mainnet, &future); + assert!( + fut_spec >= SpecId::PRAGUE, + "future block should map to at least Prague, got {:?}", + fut_spec + ); + } + + /// `SimpleRpcDb::storage_ref` must issue `eth_getStorageAt` with its + /// configured `block_number` as the block tag — the gas estimators rely + /// on this to anchor reads at block N-1 (pre-block state) rather than + /// at the post-block state of the anchor itself. A recording + /// `tower::Service` captures the JSON-RPC params so the block tag can + /// be asserted directly. + #[tokio::test(flavor = "multi_thread")] + async fn test_simple_rpc_db_queries_at_configured_block() { + use alloy_json_rpc::{RequestPacket, Response, ResponsePacket}; + use alloy_provider::RootProvider; + use alloy_provider::network::AnyNetwork; + use alloy_rpc_client::RpcClient; + use alloy_transport::{TransportError, TransportFut, mock::Asserter}; + use revm::database_interface::DatabaseRef; + use std::sync::{Arc, Mutex}; + use std::task::{Context, Poll}; + use tower::Service; + + use crate::simple_rpc_db::SimpleRpcDb; + use alloy::primitives::{U256, address}; + + /// A tower::Service that records every JSON-RPC request and pulls + /// canned responses from an `Asserter`. + #[derive(Clone)] + struct RecordingTransport { + asserter: Asserter, + requests: Arc>>, + } + + impl Service for RecordingTransport { + type Response = ResponsePacket; + type Error = TransportError; + type Future = TransportFut<'static>; + + fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: RequestPacket) -> Self::Future { + let me = self.clone(); + Box::pin(async move { + match req { + RequestPacket::Single(r) => { + let method = r.method().to_string(); + let params = + r.params().map(|p| p.get().to_string()).unwrap_or_default(); + me.requests.lock().unwrap().push((method, params)); + let payload = me.asserter.pop_response().expect("response queue empty"); + Ok(ResponsePacket::Single(Response { + id: r.id().clone(), + payload, + })) + } + RequestPacket::Batch(_) => unreachable!("batch not used in this test"), + } + }) + } + } + + let asserter = Asserter::new(); + // `eth_getStorageAt` returns a 32-byte hex value. Push 0x...42. + asserter.push_success(&format!("0x{:0>64}", "42")); + + let transport = RecordingTransport { + asserter, + requests: Arc::new(Mutex::new(Vec::new())), + }; + let recorded = transport.requests.clone(); + let client = RpcClient::new(transport, true); + let provider: RootProvider = RootProvider::new(client); + + let db = SimpleRpcDb { + provider, + block_number: 99, + }; + + // SimpleRpcDb's storage_ref blocks the current thread; spawn_blocking + // gives it the worker thread it needs under multi_thread runtime. + let val = tokio::task::spawn_blocking(move || { + db.storage_ref( + address!("0x0000000000000000000000000000000000001234"), + U256::from(7u64), + ) + }) + .await + .expect("join") + .expect("storage_ref"); + + assert_eq!(val, U256::from(0x42u64)); + + let reqs = recorded.lock().unwrap().clone(); + assert_eq!(reqs.len(), 1, "expected exactly one RPC call"); + assert_eq!(reqs[0].0, "eth_getStorageAt", "wrong RPC method"); + // 99 = 0x63. Block tag is the third positional param. + assert!( + reqs[0].1.contains("\"0x63\""), + "request params {:?} did not carry block tag 0x63 (=99) — \ + SimpleRpcDb is ignoring its configured block_number, which \ + would defeat N-1 anchoring in the gas estimators", + reqs[0].1 + ); + } + + /// `chain_id_to_genesis_and_spec` must accept mainnet (1) and Sepolia + /// (11_155_111) and reject anything else. Silently mapping an unknown + /// chain ID to mainnet would let `sim_env()` derive the wrong `SpecId` + /// for any non-mainnet target (e.g. Cancun activates ~3 days earlier + /// on Sepolia than on mainnet, see `test_sepolia_spec_diverges_from_mainnet`). + #[test] + fn test_chain_id_to_genesis_and_spec_supported_and_rejected_chains() { + use alloy_hardforks::{EthereumHardfork, EthereumHardforks, ForkCondition}; + + let (mainnet_genesis, mainnet_spec) = + chain_id_to_genesis_and_spec(MAINNET_CHAIN_ID).expect("mainnet should be supported"); + assert!(matches!(mainnet_genesis, Genesis::Mainnet)); + // Sanity-check the EthSpec wiring: mainnet activates Cancun at the + // well-known timestamp 1_710_338_135. If this drifts the + // `EthSpec::mainnet()` constructor was swapped or the upstream + // chainspec changed. + assert_eq!( + mainnet_spec.ethereum_fork_activation(EthereumHardfork::Cancun), + ForkCondition::Timestamp(1_710_338_135), + ); + + let (sepolia_genesis, sepolia_spec) = + chain_id_to_genesis_and_spec(SEPOLIA_CHAIN_ID).expect("sepolia should be supported"); + assert!(matches!(sepolia_genesis, Genesis::Sepolia)); + assert_eq!( + sepolia_spec.ethereum_fork_activation(EthereumHardfork::Cancun), + ForkCondition::Timestamp(1_706_655_072), + ); + + // Holesky (17_000) and Anvil (31_337) must error rather than silently + // pretending to be mainnet — the wrong chainspec produces wrong + // hardfork activation, which corrupts gas estimation. + assert!(chain_id_to_genesis_and_spec(17_000).is_err()); + assert!(chain_id_to_genesis_and_spec(31_337).is_err()); + assert!(chain_id_to_genesis_and_spec(0).is_err()); + } + + /// At a header with a timestamp that falls *between* the Sepolia and + /// mainnet Cancun activation timestamps, `alloy_evm::spec` must return + /// different `SpecId`s for the two chains. This pins the fact that + /// chain selection is load-bearing — picking the wrong `EthSpec` here + /// would silently misclassify Sepolia headers as Shanghai when they + /// are already Cancun (or vice versa for the symmetric range). + #[test] + fn test_sepolia_spec_diverges_from_mainnet() { + use alloy_consensus::Header; + use revm::primitives::hardfork::SpecId; + + // Sepolia Cancun: 1_706_655_072. Mainnet Cancun: 1_710_338_135. + // Pick a timestamp strictly inside that window. + const TS_BETWEEN_SEPOLIA_AND_MAINNET_CANCUN: u64 = 1_708_000_000; + + let header = Header { + // Block number high enough to be post-Shanghai on both networks. + number: 18_000_000, + timestamp: TS_BETWEEN_SEPOLIA_AND_MAINNET_CANCUN, + ..Default::default() + }; + + let mainnet_spec = alloy_evm::spec(&EthSpec::mainnet(), &header); + let sepolia_spec = alloy_evm::spec(&EthSpec::sepolia(), &header); + + assert_eq!( + mainnet_spec, + SpecId::SHANGHAI, + "mainnet at ts {} should still be Shanghai (Cancun activates at 1_710_338_135)", + TS_BETWEEN_SEPOLIA_AND_MAINNET_CANCUN, + ); + assert_eq!( + sepolia_spec, + SpecId::CANCUN, + "sepolia at ts {} should already be Cancun (activated at 1_706_655_072)", + TS_BETWEEN_SEPOLIA_AND_MAINNET_CANCUN, + ); + assert_ne!( + mainnet_spec, sepolia_spec, + "specs must differ across chains in the inter-activation window — \ + a hardcoded mainnet EthSpec would silently break Sepolia analysis here", + ); + } } diff --git a/crates/gas-estimator/Cargo.toml b/crates/gas-estimator/Cargo.toml index 867e5c3..4c69835 100644 --- a/crates/gas-estimator/Cargo.toml +++ b/crates/gas-estimator/Cargo.toml @@ -20,6 +20,8 @@ revm = { version = "31.0.1", default-features = false, features = [ [dev-dependencies] alloy-sol-types = { version = "1", features = ["json"] } +alloy-signer = "1" +alloy-signer-local = "1" # For WASM builds, the consumer must enable getrandom/js. # This feature enables it from this crate for testing. diff --git a/crates/gas-estimator/src/lib.rs b/crates/gas-estimator/src/lib.rs index d3eb982..db4f953 100644 --- a/crates/gas-estimator/src/lib.rs +++ b/crates/gas-estimator/src/lib.rs @@ -12,17 +12,47 @@ use alloy_dyn_abi::DynSolValue; use alloy_primitives::{Address, B256, Bytes, U256}; use anyhow::{Result, anyhow}; use revm::context::result::ExecutionResult; +use revm::context_interface::transaction::{AccessList, SignedAuthorization}; use revm::database::CacheDB; +use revm::primitives::TxKind; +use revm::primitives::hardfork::SpecId; use revm::state::AccountInfo; use gas_analyzer_core::encoding::encode_state_updates_to_sol; use gas_analyzer_core::types::StateUpdate; +/// EIP-7825 per-tx gas cap, activated in Osaka (Fusaka). The block gas limit +/// can exceed this, but a single tx cannot use more than `2^24` gas. +const EIP7825_TX_GAS_CAP: u64 = 1 << 24; + +/// Apply the EIP-7825 per-tx cap if the spec is Osaka or later. +/// +/// Pre-Osaka blocks must not be capped — a legitimate ~30M-gas tx would +/// otherwise OOG mid-execution during replay, which (in `transact_commit`) +/// drops storage writes and silently corrupts the CacheDB. +pub(crate) fn effective_tx_gas_limit(gas_limit: u64, spec: SpecId) -> u64 { + if spec >= SpecId::OSAKA { + gas_limit.min(EIP7825_TX_GAS_CAP) + } else { + gas_limit + } +} + /// Environment fields for the gas estimation simulation. /// /// These are set on revm's `BlockEnv` and `TxEnv` so that contracts reading -/// opcodes like COINBASE, TIMESTAMP, NUMBER, GASLIMIT, GASPRICE, or -/// PREVRANDAO see realistic values. +/// opcodes like COINBASE, TIMESTAMP, NUMBER, GASLIMIT, GASPRICE, BASEFEE, +/// PREVRANDAO, or DIFFICULTY see realistic values. +/// +/// `spec` selects the EVM hardfork rules. It must be derived from the block +/// being simulated — using a newer spec for an older block applies wrong gas +/// schedules, opcode availability, and per-tx limits, which can flip +/// success/revert outcomes during preceding-tx replay and corrupt the +/// CacheDB state the analyzed tx will read. +/// +/// `difficulty` is the legacy DIFFICULTY opcode value. Post-Merge it is zero +/// by protocol; pre-Merge it carries real PoW difficulty and is read directly +/// by the opcode under pre-Paris specs. #[derive(Clone, Debug)] pub struct SimEnvOpts { pub number: u64, @@ -31,6 +61,9 @@ pub struct SimEnvOpts { pub coinbase: Address, pub prevrandao: B256, pub gas_price: u128, + pub basefee: u64, + pub difficulty: U256, + pub spec: SpecId, } /// Embedded ABI JSON for StateChangeHandlerGasEstimator - loaded at compile time @@ -174,6 +207,7 @@ where cfg.disable_balance_check = true; cfg.disable_base_fee = true; cfg.disable_fee_charge = true; + cfg.spec = sim_env.spec; }) .modify_block_chained(|block| { block.number = U256::from(sim_env.number); @@ -181,18 +215,20 @@ where block.gas_limit = sim_env.gas_limit; block.beneficiary = sim_env.coinbase; block.prevrandao = Some(sim_env.prevrandao); - block.basefee = 0; - block.difficulty = U256::ZERO; + block.basefee = sim_env.basefee; + block.difficulty = sim_env.difficulty; }); let mut evm = ctx.build_mainnet(); + let tx_gas_limit = effective_tx_gas_limit(sim_env.gas_limit, sim_env.spec); + let tx = TxEnv::builder() .caller(caller_address) .kind(revm::primitives::TxKind::Call(contract_address)) .data(calldata) .value(U256::ZERO) - .gas_limit(sim_env.gas_limit) + .gas_limit(tx_gas_limit) .gas_price(sim_env.gas_price) .build() .map_err(|e| anyhow!("Failed to build tx env: {:?}", e))?; @@ -253,6 +289,126 @@ where ) } +// ============================================================================ +// Preceding Transaction Replay +// ============================================================================ + +/// A simplified representation of a preceding transaction for replay. +/// +/// This avoids bringing alloy-rpc-types into the gas-estimator crate, +/// keeping it WASM-compatible. The conversion from alloy's `Transaction` +/// type happens in the calling code. +/// +/// `gas_price` is the *effective* per-gas price of the tx (post-EIP-1559: +/// `min(maxFeePerGas, baseFee + maxPriorityFeePerGas)`), so the GASPRICE +/// opcode returns the same value the original tx observed. +/// +/// `access_list` (EIP-2930) pre-warms addresses and storage slots, lowering +/// SLOAD/cold-access costs. Omitting it makes replay gas costs higher than +/// the original tx, and a tight-budget tx can OOG mid-replay; an OOG halt +/// in `transact_commit` does not commit storage writes (only the nonce +/// bump), which silently corrupts the CacheDB state the analyzed tx will +/// then read against. +/// +/// `authorization_list` (EIP-7702) carries set-code authorizations. Without +/// it, replay skips the EOA-to-bytecode delegation, so any later tx in the +/// block that calls into those EOAs sees an empty account. +#[derive(Clone, Debug)] +pub struct PrecedingTx { + pub from: Address, + pub kind: TxKind, + pub input: Bytes, + pub value: U256, + pub gas_limit: u64, + pub nonce: u64, + pub gas_price: u128, + pub access_list: AccessList, + pub authorization_list: Vec, +} + +/// Replay preceding transactions against a CacheDB to bring it to the +/// correct mid-block state. +/// +/// Given transactions `txs[0..tx_index-1]` from block N, this function +/// executes each one via revm's `transact_commit`, which commits state +/// changes to the underlying CacheDB. After this function returns, the +/// CacheDB reflects the state as if those transactions had already been +/// mined. +/// +/// `sim_env` supplies the block-level context (number, timestamp, gas +/// limit, coinbase, prevrandao, basefee) so opcodes like BASEFEE, +/// COINBASE, NUMBER, TIMESTAMP, and GASLIMIT return the same values they +/// would in the real block. Per-tx GASPRICE comes from `PrecedingTx::gas_price`. +/// +/// Transaction results (success/revert/halt) are intentionally ignored — +/// in a real block even a reverted transaction still bumps the sender's +/// nonce. Fee transfers to the coinbase are *not* applied: replay sets +/// `disable_fee_charge`, so coinbase balance won't move and senders are +/// not debited for gas. Downstream callers must not rely on either. +pub fn replay_preceding_transactions( + cache_db: &mut CacheDB, + preceding_txs: &[PrecedingTx], + sim_env: &SimEnvOpts, +) -> Result> +where + DB: revm::database_interface::DatabaseRef, + ::Error: core::fmt::Debug, +{ + use revm::context::{Context, TxEnv}; + use revm::{ExecuteCommitEvm, MainBuilder, MainContext}; + + let mut evm = Context::mainnet() + .with_db(&mut *cache_db) + .modify_cfg_chained(|cfg| { + cfg.disable_nonce_check = true; + cfg.disable_balance_check = true; + cfg.disable_base_fee = true; + cfg.disable_fee_charge = true; + cfg.spec = sim_env.spec; + }) + .modify_block_chained(|block| { + block.number = U256::from(sim_env.number); + block.timestamp = U256::from(sim_env.timestamp); + block.gas_limit = sim_env.gas_limit; + block.beneficiary = sim_env.coinbase; + block.prevrandao = Some(sim_env.prevrandao); + block.basefee = sim_env.basefee; + block.difficulty = sim_env.difficulty; + }) + .build_mainnet(); + + let mut results = Vec::with_capacity(preceding_txs.len()); + for (i, tx) in preceding_txs.iter().enumerate() { + // No EIP-7825 cap here. With `disable_fee_charge = true` the gas + // limit is irrelevant to fee accounting, and capping would refuse + // legitimate >16.7M-gas txs from pre-Osaka blocks. An OOG halt in + // `transact_commit` would not commit storage writes — only bump + // the nonce — silently corrupting the CacheDB state seen by every + // subsequent replay and by the analyzed tx itself. + let revm_tx = TxEnv::builder() + .caller(tx.from) + .kind(tx.kind) + .data(tx.input.clone()) + .value(tx.value) + .gas_limit(tx.gas_limit) + .nonce(tx.nonce) + .gas_price(tx.gas_price) + .access_list(tx.access_list.clone()) + .authorization_list_signed(tx.authorization_list.clone()) + .build() + .map_err(|e| anyhow!("Failed to build tx env for preceding tx {}: {:?}", i, e))?; + + // transact_commit executes and commits state changes to the CacheDB. + // Reverted/halted txs still bump nonces; results are returned for + // observability (gas accounting, halt reasons) and may be ignored. + let result = evm + .transact_commit(revm_tx) + .map_err(|e| anyhow!("Failed to replay preceding tx {}: {:?}", i, e))?; + results.push(result); + } + Ok(results) +} + #[cfg(test)] mod tests { use super::*; @@ -355,6 +511,7 @@ mod tests { DynSolValue::Uint(U256::from(sim_env.timestamp), 256), DynSolValue::Uint(U256::from(sim_env.gas_limit), 256), DynSolValue::Uint(sim_env.prevrandao.into(), 256), + DynSolValue::Uint(U256::from(sim_env.basefee), 256), ]); let encoded_args = constructor_args.abi_encode_params(); @@ -380,6 +537,7 @@ mod tests { cfg.disable_balance_check = true; cfg.disable_base_fee = true; cfg.disable_fee_charge = true; + cfg.spec = sim_env.spec; }) .modify_block_chained(|block| { block.number = U256::from(sim_env.number); @@ -387,8 +545,8 @@ mod tests { block.gas_limit = sim_env.gas_limit; block.beneficiary = sim_env.coinbase; block.prevrandao = Some(sim_env.prevrandao); - block.basefee = 0; - block.difficulty = U256::ZERO; + block.basefee = sim_env.basefee; + block.difficulty = sim_env.difficulty; }); let mut evm = ctx.build_mainnet(); @@ -398,7 +556,9 @@ mod tests { .kind(revm::primitives::TxKind::Create) .data(deploy_data.into()) .value(U256::ZERO) - .gas_limit(30_000_000) + // Stay under EIP-7825's 2^24 per-tx cap; SimEnvTestMain's + // constructor uses well under this. + .gas_limit(EIP7825_TX_GAS_CAP) .gas_price(sim_env.gas_price) .build() .unwrap(); @@ -435,6 +595,9 @@ mod tests { coinbase: address!("0x00000000000000000000000000000000c01ba5e0"), prevrandao: B256::from(U256::from(0xdeadbeef_u64)), gas_price: 1_000_000_000, + basefee: 25_000_000_000, + difficulty: U256::ZERO, + spec: SpecId::OSAKA, }; let (mut cache_db, callee_address) = deploy_sim_env_test(caller, &sim_env); @@ -479,6 +642,9 @@ mod tests { coinbase: address!("0x00000000000000000000000000000000c01ba5e0"), prevrandao: B256::from(U256::from(0xdeadbeef_u64)), gas_price: 1_000_000_000, + basefee: 25_000_000_000, + difficulty: U256::ZERO, + spec: SpecId::OSAKA, }; let (mut cache_db, callee_address) = deploy_sim_env_test(caller, &sim_env); @@ -512,6 +678,52 @@ mod tests { ); } + #[test] + fn test_sim_env_wrong_basefee_reverts() { + let caller = address!("0x000000000000000000000000000000000000c411"); + let sim_env = SimEnvOpts { + number: 42, + timestamp: 1_700_000_000, + gas_limit: 30_000_000, + coinbase: address!("0x00000000000000000000000000000000c01ba5e0"), + prevrandao: B256::from(U256::from(0xdeadbeef_u64)), + gas_price: 1_000_000_000, + basefee: 25_000_000_000, + difficulty: U256::ZERO, + spec: SpecId::OSAKA, + }; + + let (mut cache_db, callee_address) = deploy_sim_env_test(caller, &sim_env); + + let test_selector = Bytes::from(vec![0xf8, 0xa8, 0xfd, 0x6d]); + let state_updates = vec![StateUpdate::Call(IStateUpdateTypes::Call { + target: callee_address, + value: U256::ZERO, + callargs: test_selector, + })]; + + let estimator_address = address!("0x000000000000000000000000000000000000E570"); + + // Use a wrong basefee — SimEnvCallee.test() should revert + let wrong_env = SimEnvOpts { + basefee: 1, + ..sim_env + }; + + let result = estimate_state_changes_gas( + &mut cache_db, + estimator_address, + caller, + &state_updates, + &wrong_env, + ); + + assert!( + result.is_err(), + "estimate_state_changes_gas should fail when basefee mismatches" + ); + } + #[test] fn test_sim_env_wrong_block_number_reverts() { let caller = address!("0x000000000000000000000000000000000000c411"); @@ -522,6 +734,9 @@ mod tests { coinbase: address!("0x00000000000000000000000000000000c01ba5e0"), prevrandao: B256::from(U256::from(0xdeadbeef_u64)), gas_price: 1_000_000_000, + basefee: 25_000_000_000, + difficulty: U256::ZERO, + spec: SpecId::OSAKA, }; let (mut cache_db, callee_address) = deploy_sim_env_test(caller, &sim_env); @@ -554,4 +769,326 @@ mod tests { "estimate_state_changes_gas should fail when block number mismatches" ); } + + /// Convenience: SimEnvOpts with sensible defaults at a chosen spec. + fn sim_env_with_spec(spec: SpecId) -> SimEnvOpts { + SimEnvOpts { + number: 100, + timestamp: 1_700_000_000, + gas_limit: 30_000_000, + coinbase: address!("0x00000000000000000000000000000000c01ba5e0"), + prevrandao: B256::ZERO, + gas_price: 0, + basefee: 0, + difficulty: U256::ZERO, + spec, + } + } + + fn fund(cache_db: &mut CacheDB, addr: Address) { + cache_db.insert_account_info( + addr, + AccountInfo { + balance: U256::from(10u128.pow(24)), + nonce: 0, + code_hash: B256::ZERO, + code: None, + }, + ); + } + + /// EIP-7825's 2^24 per-tx gas cap is an Osaka-and-later rule. Pre-Osaka + /// specs must pass `gas_limit` through unchanged — capping a historical + /// 30M-gas tx at 16.7M would OOG it mid-replay and silently drop its + /// storage writes. + #[test] + fn test_effective_tx_gas_limit_only_caps_under_osaka() { + // Pre-Osaka: cap not applied. + assert_eq!( + effective_tx_gas_limit(30_000_000, SpecId::SHANGHAI), + 30_000_000 + ); + assert_eq!( + effective_tx_gas_limit(30_000_000, SpecId::CANCUN), + 30_000_000 + ); + assert_eq!( + effective_tx_gas_limit(30_000_000, SpecId::PRAGUE), + 30_000_000 + ); + + // Osaka onward: capped at 2^24. + assert_eq!( + effective_tx_gas_limit(30_000_000, SpecId::OSAKA), + EIP7825_TX_GAS_CAP + ); + // Below the cap is left alone even under Osaka. + assert_eq!(effective_tx_gas_limit(1_000_000, SpecId::OSAKA), 1_000_000); + } + + /// A pre-Osaka preceding tx with `gas_limit > 2^24` must execute against + /// its real limit during replay, not a truncated 16.7M. A `JUMPDEST/JUMP` + /// gas burner is given 25M gas under Shanghai; its OOG `gas_used` must + /// exceed 2^24, proving the limit was not capped before being handed + /// to revm. + #[test] + fn test_replay_does_not_apply_eip7825_cap_pre_osaka() { + let sender = address!("0x000000000000000000000000000000000000beef"); + let mut cache_db = CacheDB::new(EmptyDB::default()); + fund(&mut cache_db, sender); + + // JUMPDEST PUSH1 0 JUMP — infinite loop that burns gas until OOG. + let burner_init = Bytes::from(hex::decode("5b600056").unwrap()); + + let preceding = vec![PrecedingTx { + from: sender, + kind: TxKind::Create, + input: burner_init, + value: U256::ZERO, + gas_limit: 25_000_000, + nonce: 0, + gas_price: 0, + access_list: Default::default(), + authorization_list: Default::default(), + }]; + + let sim_env = sim_env_with_spec(SpecId::SHANGHAI); + let results = + replay_preceding_transactions(&mut cache_db, &preceding, &sim_env).expect("replay"); + + let result = &results[0]; + assert!( + matches!(result, ExecutionResult::Halt { .. }), + "burner should OOG-halt, got {:?}", + result + ); + let gas_used = result.gas_used(); + assert!( + gas_used > EIP7825_TX_GAS_CAP, + "gas burner only used {} gas — replay path is applying the EIP-7825 cap of {}", + gas_used, + EIP7825_TX_GAS_CAP + ); + assert!( + gas_used <= 25_000_000, + "gas burner used {} > tx gas_limit", + gas_used + ); + } + + /// Under pre-Paris specs the DIFFICULTY opcode reads from + /// `BlockEnv::difficulty`, so `SimEnvOpts::difficulty` must be plumbed + /// through. Pre-deployed runtime `DIFFICULTY PUSH1 0 SSTORE` is invoked + /// under GRAY_GLACIER and slot 0 of the target must equal + /// `sim_env.difficulty` afterward. + #[test] + fn test_difficulty_propagates_to_block_env() { + use revm::context::{Context, TxEnv}; + use revm::{ExecuteCommitEvm, MainBuilder, MainContext}; + + let sender = address!("0x000000000000000000000000000000000000beef"); + let target = address!("0x00000000000000000000000000000000d1ff1c11"); + + // DIFFICULTY (0x44) PUSH1 0 (0x6000) SSTORE (0x55) STOP (0x00) + let runtime = + revm::state::Bytecode::new_raw(Bytes::from(hex::decode("4460005500").unwrap())); + + let mut cache_db = CacheDB::new(EmptyDB::default()); + fund(&mut cache_db, sender); + cache_db.insert_account_info( + target, + AccountInfo { + balance: U256::ZERO, + nonce: 0, + code_hash: B256::ZERO, + code: Some(runtime), + }, + ); + + let mut sim_env = sim_env_with_spec(SpecId::GRAY_GLACIER); // pre-Paris + sim_env.difficulty = U256::from(0xdeadbeef_u64); + + // Mirror the production replay setup so we directly test the + // BlockEnv plumbing of `sim_env.difficulty`. + let mut evm = Context::mainnet() + .with_db(&mut cache_db) + .modify_cfg_chained(|cfg| { + cfg.disable_nonce_check = true; + cfg.disable_balance_check = true; + cfg.disable_base_fee = true; + cfg.disable_fee_charge = true; + cfg.spec = sim_env.spec; + }) + .modify_block_chained(|block| { + block.number = U256::from(sim_env.number); + block.timestamp = U256::from(sim_env.timestamp); + block.gas_limit = sim_env.gas_limit; + block.beneficiary = sim_env.coinbase; + block.basefee = sim_env.basefee; + block.difficulty = sim_env.difficulty; + }) + .build_mainnet(); + + let tx = TxEnv::builder() + .caller(sender) + .kind(TxKind::Call(target)) + .gas_limit(1_000_000) + .gas_price(0) + .build() + .unwrap(); + evm.transact_commit(tx).expect("difficulty contract call"); + + use revm::database_interface::DatabaseRef; + let stored = cache_db + .storage_ref(target, U256::ZERO) + .expect("storage_ref"); + assert_eq!( + stored, + U256::from(0xdeadbeef_u64), + "DIFFICULTY opcode read {:?}, expected sim_env.difficulty 0xdeadbeef", + stored + ); + } + + /// `PrecedingTx::access_list` must reach revm's `TxEnv` during replay. + /// EIP-2930 charges 2400 (address) + 1900 (slot) = 4300 intrinsic gas + /// per entry, partly offset by 2000 saved on the first warm SLOAD; the + /// same SLOAD tx with vs without the slot pre-warmed should differ by + /// exactly 2300 gas. A delta of zero would mean the field is being + /// dropped before it reaches revm. + #[test] + fn test_access_list_threaded_through_replay() { + use revm::context_interface::transaction::AccessListItem; + + let sender = address!("0x000000000000000000000000000000000000beef"); + let target = address!("0x000000000000000000000000000000000000515a"); + + // PUSH1 5 SLOAD STOP — just touches slot 5 once. + let runtime = revm::state::Bytecode::new_raw(Bytes::from(hex::decode("60055400").unwrap())); + + let make_db = || { + let mut db = CacheDB::new(EmptyDB::default()); + fund(&mut db, sender); + db.insert_account_info( + target, + AccountInfo { + balance: U256::ZERO, + nonce: 0, + code_hash: B256::ZERO, + code: Some(runtime.clone()), + }, + ); + db + }; + + let base_tx = || PrecedingTx { + from: sender, + kind: TxKind::Call(target), + input: Bytes::new(), + value: U256::ZERO, + gas_limit: 100_000, + nonce: 0, + gas_price: 0, + access_list: Default::default(), + authorization_list: Default::default(), + }; + + let sim_env = sim_env_with_spec(SpecId::SHANGHAI); + + let mut db_no_al = make_db(); + let mut tx_no_al = base_tx(); + let no_al_results = + replay_preceding_transactions(&mut db_no_al, &[tx_no_al.clone()], &sim_env) + .expect("replay no_al"); + + let mut db_with_al = make_db(); + tx_no_al.access_list = AccessList(vec![AccessListItem { + address: target, + storage_keys: vec![B256::from(U256::from(5u64))], + }]); + let with_al_results = replay_preceding_transactions(&mut db_with_al, &[tx_no_al], &sim_env) + .expect("replay with_al"); + + let gas_no_al = no_al_results[0].gas_used(); + let gas_with_al = with_al_results[0].gas_used(); + assert_eq!( + gas_with_al as i64 - gas_no_al as i64, + 2300, + "access list field is not being threaded into the replay TxEnv \ + (gas_used: with_al={} no_al={})", + gas_with_al, + gas_no_al + ); + } + + /// A signed EIP-7702 authorization carried in + /// `PrecedingTx::authorization_list` must be applied during replay: the + /// authority's account in the `CacheDB` should gain the 23-byte + /// `0xef0100 || delegated_address` indicator code post-replay. + #[test] + fn test_authorization_list_applies_delegation() { + use alloy_signer::SignerSync; + use alloy_signer_local::PrivateKeySigner; + use revm::context_interface::transaction::Authorization; + use revm::database_interface::DatabaseRef; + + // A test private key (32 bytes of 0x42). + let signer = PrivateKeySigner::from_bytes(&B256::repeat_byte(0x42)).unwrap(); + let authority: Address = signer.address(); + let delegated = address!("0x00000000000000000000000000000000de1e6a7e"); + + // EIP-7702 requires chain_id == tx.chain_id || 0. revm's + // mainnet config defaults to chain_id 1. Sign for chain 1. + let auth = Authorization { + chain_id: U256::from(1u64), + address: delegated, + nonce: 0, + }; + let sig = signer.sign_hash_sync(&auth.signature_hash()).unwrap(); + let signed = auth.into_signed(sig); + + let funder = address!("0x000000000000000000000000000000000000beef"); + let recipient = address!("0x000000000000000000000000000000000000d057"); + let mut cache_db = CacheDB::new(EmptyDB::default()); + fund(&mut cache_db, funder); + // The authority itself needs to exist (nonce 0) for the + // authorization to apply. + fund(&mut cache_db, authority); + + // The "preceding tx" that carries the authorization. A simple value + // transfer is enough — the authorization is applied during + // intrinsic-gas processing regardless of execution outcome. + let tx = PrecedingTx { + from: funder, + kind: TxKind::Call(recipient), + input: Bytes::new(), + value: U256::ZERO, + gas_limit: 200_000, + nonce: 0, + gas_price: 0, + access_list: Default::default(), + authorization_list: vec![signed], + }; + + let sim_env = sim_env_with_spec(SpecId::PRAGUE); // 7702 active + + replay_preceding_transactions(&mut cache_db, &[tx], &sim_env).expect("replay"); + + let info = cache_db + .basic_ref(authority) + .expect("basic_ref") + .expect("authority must exist"); + let code = info.code.expect("authority must have code post-delegation"); + let bytes = code.original_bytes(); + // EIP-7702 delegation indicator: 0xef0100 || target_address (23 bytes). + assert_eq!( + bytes.len(), + 23, + "expected 23-byte delegation indicator, got {} bytes — \ + authorization_list is not reaching the replay TxEnv", + bytes.len() + ); + assert_eq!(&bytes[..3], &[0xef, 0x01, 0x00], "delegation prefix"); + assert_eq!(&bytes[3..], delegated.as_slice(), "delegated address"); + } } diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml index 73e120a..807d9d3 100644 --- a/crates/rpc/Cargo.toml +++ b/crates/rpc/Cargo.toml @@ -5,7 +5,10 @@ edition = "2024" [dependencies] gas-analyzer-core = { path = "../core" } +gas-analyzer-estimator = { path = "../gas-estimator" } alloy = { version = "1.0.37", features = ["rpc", "rpc-types"] } alloy-eips = "1.0.37" alloy-provider = { version = "1.0.37", features = ["debug-api"] } +alloy-rpc-types = "1.0.37" +revm = { version = "31.0.1", default-features = false, features = ["std"] } anyhow = "1.0.98" diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index 25b5c4f..e193ba2 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -14,10 +14,12 @@ use alloy::rpc::types::trace::geth::{ use alloy_eips::BlockId; use alloy_provider::Provider; use alloy_provider::ext::DebugApi; +use alloy_rpc_types::TransactionTrait; use anyhow::{Result, anyhow, bail}; use gas_analyzer_core::trace::compute_state_updates; use gas_analyzer_core::types::{Opcode, StateUpdate}; +use gas_analyzer_estimator::PrecedingTx; /// Get transaction trace from a provider using debug_traceTransaction. /// @@ -111,3 +113,74 @@ pub async fn compute_state_updates_from_tx( tx_hash ) } + +// ============================================================================ +// Block Transaction Fetching +// ============================================================================ + +/// Fetch preceding transactions from a block for replay. +/// +/// Calls `eth_getBlockByNumber(block_number, true)` to get the block with +/// full transaction objects, then converts transactions at indices `0..tx_index` +/// into `PrecedingTx` structs suitable for replay in revm. +/// +/// Returns an empty vec if `tx_index` is 0 (first in block). +pub async fn get_preceding_transactions( + provider: &P, + block_number: u64, + tx_index: u64, +) -> Result> { + if tx_index == 0 { + return Ok(Vec::new()); + } + + let block = provider + .get_block_by_number(block_number.into()) + .full() + .await? + .ok_or_else(|| anyhow!("Block {} not found", block_number))?; + + let base_fee = block.header.base_fee_per_gas; + let txs: Vec<_> = block.transactions.into_transactions().collect(); + + if (tx_index as usize) >= txs.len() { + bail!( + "Transaction index {} exceeds block transaction count {}", + tx_index, + txs.len() + ); + } + + let preceding: Vec = txs[..tx_index as usize] + .iter() + .map(|tx| { + let kind = match tx.inner.to() { + Some(addr) => revm::primitives::TxKind::Call(addr), + None => revm::primitives::TxKind::Create, + }; + // EIP-2930 access list pre-warms slots/addresses; without it + // replay sees higher gas costs than the original tx and can + // OOG-halt, dropping storage writes from the CacheDB. + let access_list = tx.inner.access_list().cloned().unwrap_or_default(); + // EIP-7702 set-code authorizations; only present on type-4 txs. + let authorization_list = tx + .inner + .authorization_list() + .map(<[_]>::to_vec) + .unwrap_or_default(); + PrecedingTx { + from: tx.inner.signer(), + kind, + input: tx.inner.input().clone(), + value: tx.inner.value(), + gas_limit: tx.inner.gas_limit(), + nonce: tx.inner.nonce(), + gas_price: tx.inner.effective_gas_price(base_fee), + access_list, + authorization_list, + } + }) + .collect(); + + Ok(preceding) +} diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index 17c16bb..3495527 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Address, B256}; +use alloy_primitives::{Address, B256, U256}; use alloy_rpc_types::trace::geth::DefaultFrame; use gas_analyzer_core::{ StateUpdate, compute_state_updates, encode_state_updates_to_abi, @@ -6,6 +6,7 @@ use gas_analyzer_core::{ }; use gas_analyzer_estimator::{SimEnvOpts, estimate_state_changes_gas}; use revm::database::{CacheDB, EmptyDB}; +use revm::primitives::hardfork::SpecId; use serde::Serialize; use std::collections::HashSet; use wasm_bindgen::prelude::*; @@ -93,6 +94,11 @@ pub fn analyze_trace_inner( coinbase: Address::ZERO, prevrandao: B256::ZERO, gas_price: 0, + basefee: 0, + difficulty: U256::ZERO, + // WASM runs against EmptyDB with no real chain state; pick the newest + // spec so post-Pectra opcodes don't halt with `NotActivated`. + spec: SpecId::OSAKA, }; let (gas_estimate, is_heuristic) =