{"key":"gates-1",
"gates":{"10000":[448.261189,443.455598,443.522608,443.66352],"10001":[576.779199,571.463409,571.623551,571.977293],"10002":[531.886497,525.168028,525.865859,526.411631],"match":true},
"bounds":{"gas_per_callback":250000,"storage_slots":32,"inline_assembly":false,"code_size_bytes":24576,"solc":"0.8.24 (pragma ^0.8.24; py-solc-x compile_standard)","optimizer":"enabled, runs 200, viaIR true, evmVersion paris","other":"Gas limit 250,000 per afterInitialize and per afterSwap, 50,000 for getName, 10,000,000 for deploy; measured gas includes the 21,000 intrinsic tx cost. Contract must be named Strategy, inherit AMMStrategyBase, import only ./AMMStrategyBase.sol and ./IAMMStrategy.sol, and define afterInitialize, afterSwap, getName. No custom interfaces, no new contracts, no .call/.delegatecall/.staticcall/.callcode/.transfer/.send/selfdestruct/.code/.codehash/coinbase (regex on source with comments and strings stripped). Bytecode scan rejects BALANCE, EXTCODESIZE, EXTCODECOPY, EXTCODEHASH, CREATE, CALL, CALLCODE, DELEGATECALL, CREATE2, STATICCALL, SELFDESTRUCT in creation and runtime code. Storage layout may hold only slots at slot 0 (uint256[32]); constants are fine. Fees must be in 0..MAX_FEE = 1e17 (10%), or the engine rejects the return. Revert, OutOfGas or a bad return is an engine error. Code size: no custom revm cfg, so the default EIP-170 limit applies. Tested here: 20,466-byte runtime deploys, 27,834 halts with CreateContractSizeLimit in both validate (pyrevm) and amm_sim_rs.","enforced_in":["amm_sim_rs/src/evm/strategy.rs","amm_competition/evm/executor.py","amm_competition/evm/compiler.py","amm_competition/evm/validator.py","amm_sim_rs/src/types/trade_info.rs","amm_sim_rs/src/types/wad.rs","contracts/src/AMMStrategyBase.sol","amm_sim_rs/Cargo.toml"]},
"ib":{"validate":"pass","summary":"amm-match validate: Strategy 'inputs_b' validated successfully; source 27,524 bytes, sha256 301941829a44bb60977bb28181a5e4bfa6544f3696763f987054789b2611d686 matches the artifact's code_sha256. Engine seeds 0..255 vs VanillaStrategy: 2,774,490 afterSwap calls, 0 OOG, 0 revert, mean 135,138 gas; afterInitialize 243,227 gas.","bytecode_bytes":14528,"peak_afterswap_gas":237009},
"engine":"ok",
"blocked":null,
"notes":"All 12 gate numbers match the README to the digit; gates.py takes 7 s. Setup worked on Linux x86_64 with 6 CPUs; 256 IB seeds took 68 s in the engine. The engine's gas_stats() counts gas with the 21,000 intrinsic cost included (Vanilla afterSwap peaks at 22,592), so 245,000 leaves about 224,000 for execution. IB's afterInitialize uses 243,227 of its 250,000, so a port that fills slots or tables in afterInitialize has little room. IB's afterSwap peak was 237,009 on engine seeds 0..255, above the 234,849 the artifact reports on its own 512 seeds: peaks rise with seed count, so leave margin. IB runtime is 14,528 bytes, leaving about 10,000 under 24,576 for tables. Code-size overhead is high for literal tables: 9 x 2,000-byte hex literals compiled to 20,466 bytes. One 23,000-byte hex literal made solc 0.8.24 viaIR segfault (rc -11), so split tables into chunks. Engine seeds used: 0..255 and 0..5 (match-runner seeds, gas only, no scoring); none at or above 12,000,000. The source checks are regexes run after comments and strings are stripped. Any state variable other than slots fails at compile time (storageLayout check), not as a warning."}
