From 249cb509cfba9ff0c7e8532e5bf1a650846db951 Mon Sep 17 00:00:00 2001 From: baku-ccron Date: Thu, 20 Aug 2026 17:01:29 +0000 Subject: [PATCH 1/2] test: delete skip-gated start-block tests, fork ethereum for deploy address The org no-ignored-tests gate greps the whole checkout, so the four vm.skip(vm.envOr("CI", false)) lines redded BOTH the rainix-sol and rainix-rs static lanes. Per the gate's rule they are deleted, not re-enabled: findDeployBlock's rollFork binary search rate-limits real RPCs (the reason they were skip-gated), and on Arbitrum rollFork maps L1 block numbers. The pinned constants stay covered for real by the testIsStartBlock* fork tests; the discovery rationale is kept as a comment. The unused findStartBlock helper, ARBITRUM_NITRO_GENESIS_BLOCK constant and commented-out Arbitrum test go with them. testDeployAddress forked ETH_RPC_URL, which rainix-sol-test binds to the raw CI_DEPLOY_SEPOLIA_RPC_URL secret/var - empty on 2026-08-19 runs, with no rpc-preflight failover and no public default. Switch to ETHEREUM_RPC_URL: the rainix rpc-preflight demand-scans tracked files for this exact name, then health-probes and exports a working URL (secret, then var, then public archive defaults). Ethereum mainnet has the zoltu factory deployed and no MetaBoard at the pinned address, so the deterministic deploy cannot collide with a live deployment. Co-Authored-By: Claude Fable 5 --- test/lib/deploy/LibMetaBoardDeploy.t.sol | 56 +++++------------------- 1 file changed, 10 insertions(+), 46 deletions(-) diff --git a/test/lib/deploy/LibMetaBoardDeploy.t.sol b/test/lib/deploy/LibMetaBoardDeploy.t.sol index 89e5a0ba..a0538bfa 100644 --- a/test/lib/deploy/LibMetaBoardDeploy.t.sol +++ b/test/lib/deploy/LibMetaBoardDeploy.t.sol @@ -8,11 +8,11 @@ import {LibMetaBoardDeploy} from "src/lib/deploy/LibMetaBoardDeploy.sol"; import {MetaBoard} from "src/concrete/MetaBoard.sol"; contract LibMetaBoardDeployTest is Test { - /// Arbitrum Nitro genesis block. Archive RPCs can't serve blocks before this. - uint256 constant ARBITRUM_NITRO_GENESIS_BLOCK = 22207817; - function testDeployAddress() external { - vm.createSelectFork(vm.envString("ETH_RPC_URL")); + // Ethereum mainnet has the zoltu factory deployed but no MetaBoard, + // so the deterministic deploy cannot collide with a live deployment. + // ETHEREUM_RPC_URL is exported by the rainix rpc-preflight in CI. + vm.createSelectFork(vm.envString("ETHEREUM_RPC_URL")); address deployedAddress = LibRainDeploy.deployZoltu(type(MetaBoard).creationCode); @@ -59,48 +59,12 @@ contract LibMetaBoardDeployTest is Test { checkProdDeployment("POLYGON_RPC_URL"); } - function findStartBlock(string memory rpcEnvVar, uint256 searchFrom) internal returns (uint256) { - vm.createSelectFork(vm.envString(rpcEnvVar)); - return LibRainDeploy.findDeployBlock( - vm, - LibMetaBoardDeploy.METABOARD_DEPLOYED_ADDRESS, - LibMetaBoardDeploy.METABOARD_DEPLOYED_CODEHASH, - searchFrom - ); - } - - /// findDeployBlock binary searches via rollFork which hits RPC rate limits - /// in CI. Skipped there; the isStartBlock tests verify correctness cheaply. - /// Arbitrum is always skipped because Foundry's rollFork maps to L1 block - /// numbers, not L2. The Arbitrum start block was found via manual binary - /// search using eth_getCode RPC calls against L2 block numbers. - // function testStartBlockArbitrum() external { - // assertEq( - // findStartBlock("ARBITRUM_RPC_URL", ARBITRUM_NITRO_GENESIS_BLOCK), - // LibMetaBoardDeploy.METABOARD_START_BLOCK_ARBITRUM - // ); - // } - - function testStartBlockBase() external { - vm.skip(vm.envOr("CI", false)); - assertEq(findStartBlock("BASE_RPC_URL", 0), LibMetaBoardDeploy.METABOARD_START_BLOCK_BASE); - } - - function testStartBlockBaseSepolia() external { - vm.skip(vm.envOr("CI", false)); - assertEq(findStartBlock("BASE_SEPOLIA_RPC_URL", 0), LibMetaBoardDeploy.METABOARD_START_BLOCK_BASE_SEPOLIA); - } - - function testStartBlockFlare() external { - vm.skip(vm.envOr("CI", false)); - assertEq(findStartBlock("FLARE_RPC_URL", 0), LibMetaBoardDeploy.METABOARD_START_BLOCK_FLARE); - } - - function testStartBlockPolygon() external { - vm.skip(vm.envOr("CI", false)); - assertEq(findStartBlock("POLYGON_RPC_URL", 0), LibMetaBoardDeploy.METABOARD_START_BLOCK_POLYGON); - } - + /// Start block DISCOVERY (`LibRainDeploy.findDeployBlock`) is deliberately + /// not tested here: its rollFork binary search hits RPC rate limits, and on + /// Arbitrum rollFork maps to L1 block numbers, not L2 (the Arbitrum start + /// block was found via manual binary search using eth_getCode RPC calls + /// against L2 block numbers). The `testIsStartBlock*` tests below verify + /// the pinned constants directly and cheaply instead. function checkIsStartBlock(string memory rpcEnvVar, uint256 startBlock) internal { vm.createSelectFork(vm.envString(rpcEnvVar)); assertTrue( From 4836159a4b9694c7e44267d3ed819a23a8768d03 Mon Sep 17 00:00:00 2001 From: baku-ccron Date: Thu, 20 Aug 2026 17:01:29 +0000 Subject: [PATCH 2/2] fix: exclude .prettierignore from the soldeer zip so push never prompts forge soldeer push has failed in CI since 2026-06-15 with 'error during IO operation for "": not connected': soldeer's interactive sensitive- files confirm cannot be answered in a non-TTY shell. soldeer filters the copy list through .gitignore + .soldeerignore first and prompts iff any dotfile survives; the only survivor was .prettierignore. With it ignored the zip is dotfile-free (verified via --dry-run: 39 entries, zero dotfiles; pre-fix the zip contained .prettierignore), so the prompt can never fire and the push is fully non-interactive. Co-Authored-By: Claude Fable 5 --- .soldeerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.soldeerignore b/.soldeerignore index 27e94292..d13dd8e6 100644 --- a/.soldeerignore +++ b/.soldeerignore @@ -8,6 +8,7 @@ .gitignore .gitmodules .pre-commit-config.yaml +.prettierignore .soldeerignore .vscode CLAUDE.md