diff --git a/STATE.md b/STATE.md index b534f1b..12221bb 100644 --- a/STATE.md +++ b/STATE.md @@ -36,4 +36,4 @@ - [2026-03-14] remove MAX_ANCHOR_WIDTH clamp in ThreePositionStrategy (#783) - [2026-03-14] increase CALCULATE_PARAMS_GAS_LIMIT from 200k to 500k (#782) - [2026-03-15] add evolution run 8 champion to seed pool (#781) -- [2026-03-15] FitnessEvaluator.t.sol broken on Base mainnet fork (#780) +- [2026-03-15] fix FitnessEvaluator.t.sol broken on Base mainnet fork (#780) diff --git a/onchain/test/FitnessEvaluator.t.sol b/onchain/test/FitnessEvaluator.t.sol index ca7c258..755c44d 100644 --- a/onchain/test/FitnessEvaluator.t.sol +++ b/onchain/test/FitnessEvaluator.t.sol @@ -143,6 +143,11 @@ contract FitnessEvaluator is Test { address internal constant NPM_ADDR = 0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1; // Base mainnet Uniswap V3 Factory — https://basescan.org/address/0x33128a8fC17869897dcE68Ed026d694621f6FDfD address internal constant V3_FACTORY = 0x33128a8fC17869897dcE68Ed026d694621f6FDfD; + /// @dev Intentionally differs from DeployBaseMainnet.sol (0xf6a3...D9011). + /// On a Base mainnet fork that address already has contract bytecode, which + /// causes LiquidityManager.setFeeDestination() to set feeDestinationLocked=true + /// and subsequently revert if called again during snapshot/revert cycles. + /// This keccak-derived address is a guaranteed EOA on any live network. address internal constant FEE_DEST = 0x8A9145E1Ea4C4d7FB08cF1011c8ac1F0e10F9383; /// @dev Fixed address used with vm.etch to inject candidate bytecode. @@ -230,7 +235,10 @@ contract FitnessEvaluator is Test { string memory candidateId = vm.readLine(idsFile); string memory bytecodeHex = vm.readLine(bytecodesFile); if (bytes(candidateId).length == 0) break; - if (bytes(bytecodeHex).length == 0) break; + if (bytes(bytecodeHex).length == 0) { + console.log("FitnessEvaluator: bytecodes.txt EOF before ids.txt - pipeline mismatch, stopping"); + break; + } // Revert to clean post-deploy state for each candidate. vm.revertTo(baseSnap);