Skip to content

main goes red on RPC weather: 37 forks, no retry, and the fork/chain split does not hold #32

Description

@thedavidmeister

main is red right now, and was red at 8d1e5fd, from a provider returning HTTP error 500 … "Temporary internal error. Please retry" on vm.createSelectFork. Nothing about the repo changed. This recurs — #26's own PR body records base_sepolia answering 408 Request timeout on the free plan, PR #19's CI failed on two chain tests for the same reason, PR #20's on five.

A repo whose default branch reds on provider weather is a repo where red stops meaning anything.

Three things combine to cause it

1. The fork surface is large. 37 createSelectFork calls across three test files on main:

file calls
test/src/lib/LibRainDeploy.t.sol 31
test/src/abstract/RainDeployVerifyChain.t.sol 5
test/src/abstract/RainDeployVerifyChainCandidate.t.sol 1

2. The fork-free/chain split does not hold where it matters. #26 separated chain-anchored assertions into *Chain* contracts so an unreachable endpoint fails only those, and CLAUDE.md documents forge test --no-match-contract Chain as forking nothing. But LibRainDeployTest is not a Chain contract and holds 31 of the 37 forks — so that documented selection forks 31 times, and an outage fails it. The split is real for the verification abstracts and absent for the library's own suite.

3. Nothing retries. There is no retry or fallback around any createSelectFork in the repo. One transient 500 fails the job.

Many of those forks buy nothing

Some tests fork and then replace everything they touch with vm.etch, reading no chain state at all. testDeployZoltuFailedCallReportsZeroAddress (test/src/lib/LibRainDeploy.t.sol:399) forks Arbitrum, then etches the factory and deploys type(MockDeployable).creationCode — nothing in it depends on the fork. RainDeployVerifyBase.deriveDeployment proves the point by running deployZoltu on a bare local EVM.

testDeployZoltuRevertsWhenFactoryCallFailsWithAddressData (:1133) is a second instance and is also fully subsumed by the test at :399 — same fork, same etch, same call, but asserting only the revert selector where :399 asserts the exact payload. It can be deleted outright.

These are examples, not the list. The category is: a test that etches everything it reads does not need a fork.

Ask

  1. Audit all 37. Delete the fork from every test that reads no chain state; delete :1133 entirely.
  2. Whatever genuinely needs a chain moves into a *Chain* contract, so --no-match-contract Chain forks nothing, as CLAUDE.md already claims.
  3. Decide whether the remaining chain tests get a retry around createSelectFork. Shared CI concern — if the answer is yes, it likely belongs in rainix rather than here.

Ordering matters: (1) and (2) shrink the surface (3) has to cover.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions