From ef3f6945f21e5487a13560e2207b71bfef6ef021 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 15 Mar 2026 01:50:54 +0000 Subject: [PATCH 1/3] fix: fix: FitnessEvaluator.t.sol broken on Base mainnet fork (#780) - Replace Base Sepolia addresses with Base mainnet: - V3_FACTORY: 0x33128a8fC17869897dcE68Ed026d694621f6FDfD - SWAP_ROUTER: 0x2626664c2603336E57B271c5C0b26F421741e481 - NPM_ADDR: 0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1 - Fix FEE_DEST to keccak-derived EOA (0x8A9145E1...9383) to avoid feeDestination lock triggered by contract code at the old address - Add vm.warp(block.timestamp + 600) alongside vm.roll in bootstrap retry loop so _isPriceStable() TWAP check accumulates 300s+ history - Guard vm.readLine(bytecodesFile) with empty-string break to prevent vm.parseBytes("") revert on trailing EOF line Co-Authored-By: Claude Sonnet 4.6 --- onchain/test/FitnessEvaluator.t.sol | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/onchain/test/FitnessEvaluator.t.sol b/onchain/test/FitnessEvaluator.t.sol index 1b30c55..ca7c258 100644 --- a/onchain/test/FitnessEvaluator.t.sol +++ b/onchain/test/FitnessEvaluator.t.sol @@ -138,12 +138,12 @@ contract FitnessEvaluator is Test { uint24 internal constant POOL_FEE = 10_000; address internal constant WETH_ADDR = 0x4200000000000000000000000000000000000006; - address internal constant SWAP_ROUTER = 0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4; - // Base mainnet NonfungiblePositionManager — https://basescan.org/address/0x03a520B32c04bf3beef7BEb72E919cF822Ed34F3 - address internal constant NPM_ADDR = 0x03a520B32c04bf3beef7BEb72E919cF822Ed34F3; - // Base mainnet Uniswap V3 Factory — https://basescan.org/address/0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24 - address internal constant V3_FACTORY = 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24; - address internal constant FEE_DEST = 0xf6a3eef9088A255c32b6aD2025f83E57291D9011; + address internal constant SWAP_ROUTER = 0x2626664c2603336E57B271c5C0b26F421741e481; + // Base mainnet NonfungiblePositionManager — https://basescan.org/address/0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1 + address internal constant NPM_ADDR = 0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1; + // Base mainnet Uniswap V3 Factory — https://basescan.org/address/0x33128a8fC17869897dcE68Ed026d694621f6FDfD + address internal constant V3_FACTORY = 0x33128a8fC17869897dcE68Ed026d694621f6FDfD; + address internal constant FEE_DEST = 0x8A9145E1Ea4C4d7FB08cF1011c8ac1F0e10F9383; /// @dev Fixed address used with vm.etch to inject candidate bytecode. /// Chosen to be deterministic and not collide with real Base addresses. @@ -230,6 +230,7 @@ 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; // Revert to clean post-deploy state for each candidate. vm.revertTo(baseSnap); @@ -401,7 +402,10 @@ contract FitnessEvaluator is Test { // candidate score identically (all lm_eth_total = free WETH only, no positions). bool recentered = false; for (uint256 _attempt = 0; _attempt < 5; _attempt++) { - if (_attempt > 0) vm.roll(block.number + 50); + if (_attempt > 0) { + vm.roll(block.number + 50); + vm.warp(block.timestamp + 600); + } vm.prank(recenterAddr); try ILM(lmAddr).recenter() returns (bool) { recentered = true; From b3007e8f117593a08f3c3e5c8b3cb490c1e6ff7e Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 15 Mar 2026 01:51:08 +0000 Subject: [PATCH 2/3] fix: fix: FitnessEvaluator.t.sol broken on Base mainnet fork (#780) --- STATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/STATE.md b/STATE.md index ca0e598..b534f1b 100644 --- a/STATE.md +++ b/STATE.md @@ -36,3 +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) From cef4c3038bbeab368dc66cd3ec29d1f48de44683 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 15 Mar 2026 02:13:04 +0000 Subject: [PATCH 3/3] fix: fix: FitnessEvaluator.t.sol broken on Base mainnet fork (#780) Address review feedback: - Add comment on FEE_DEST explaining why it differs from DeployBaseMainnet.sol: on a Base mainnet fork, 0xf6a3...D9011 has contract code which triggers feeDestinationLocked=true; keccak-derived address is a guaranteed EOA - Expand bytecodes.txt EOF guard with a pipeline-mismatch warning log - Fix STATE.md entry to use imperative verb form per project convention Co-Authored-By: Claude Sonnet 4.6 --- STATE.md | 2 +- onchain/test/FitnessEvaluator.t.sol | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) 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);