RainDeployVerifyChain.testSuitesLiveOnEverySupportedNetwork and RainDeployVerifySnapshot.testSupportedNetworksAreFullyConfigured both read LibRainDeploy.supportedNetworks(), which is internal pure with a fixed list of nine. Neither the function nor the tests are virtual, so a consumer whose deploy targets are a subset of the org's nine cannot bind RainDeployVerify at all.
st0x.deploy is that consumer. It deploys to five — Base, Ethereum, HyperEVM, Robinhood, BSC — and LibRainDeploy.supportedNetworks() adds Arbitrum, Base Sepolia, Flare and Polygon. Binding the stack today fails two ways:
- Chain group. Every released suite must be live on all nine. st0x's are live on its five, so the other four report
NotDeployedOnNetwork for every release — not a defect in st0x, a different question being asked.
- Config group. Every supported network must carry an
[etherscan] key. st0x deliberately has none for Robinhood: chain 4663 is not indexed by Etherscan's v2 API, and its own comment records that an entry there "would only make foundry demand an API key it cannot use". Its verification path is --verifier sourcify instead. So the one check that enforces the [etherscan] half fails on a config that is correct.
The asymmetry is already acknowledged for the broadcast: RainDeployBroadcast.deployNetworks() is virtual, and its docstring names st0x's per-dispatch network selection as the reason. The verification side has no equivalent, so the same consumer can deploy through this package but cannot verify through it.
What makes this more than a config nit
The README's argument for RainDeployVerify being the ONE binding is that "a check a repo has to opt into is a check most repos do not run". A consumer that cannot bind it runs none of them, which is strictly worse than opting out of one — st0x currently hand-enumerates ~695 lines of per-version, per-chain pins, which is exactly what this package exists to delete.
Shape of a fix, for discussion
A deployTargets() hook on RainDeploySuitesBase defaulting to LibRainDeploy.supportedNetworks(), read by both groups in place of the direct call. That keeps the default behaviour for a repo that deploys everywhere, and it is the same override shape deployNetworks() already has, so the declaration stays the single place a repo says where it deploys.
The [etherscan] half needs its own answer regardless, since a network with no Etherscan deployment is a fact about the network rather than about any consumer — perhaps membership against the networks that have one, rather than against every target.
🤖 Generated with Claude Code
RainDeployVerifyChain.testSuitesLiveOnEverySupportedNetworkandRainDeployVerifySnapshot.testSupportedNetworksAreFullyConfiguredboth readLibRainDeploy.supportedNetworks(), which isinternal purewith a fixed list of nine. Neither the function nor the tests arevirtual, so a consumer whose deploy targets are a subset of the org's nine cannot bindRainDeployVerifyat all.st0x.deployis that consumer. It deploys to five — Base, Ethereum, HyperEVM, Robinhood, BSC — andLibRainDeploy.supportedNetworks()adds Arbitrum, Base Sepolia, Flare and Polygon. Binding the stack today fails two ways:NotDeployedOnNetworkfor every release — not a defect in st0x, a different question being asked.[etherscan]key. st0x deliberately has none for Robinhood: chain 4663 is not indexed by Etherscan's v2 API, and its own comment records that an entry there "would only make foundry demand an API key it cannot use". Its verification path is--verifier sourcifyinstead. So the one check that enforces the[etherscan]half fails on a config that is correct.The asymmetry is already acknowledged for the broadcast:
RainDeployBroadcast.deployNetworks()isvirtual, and its docstring names st0x's per-dispatch network selection as the reason. The verification side has no equivalent, so the same consumer can deploy through this package but cannot verify through it.What makes this more than a config nit
The README's argument for
RainDeployVerifybeing the ONE binding is that "a check a repo has to opt into is a check most repos do not run". A consumer that cannot bind it runs none of them, which is strictly worse than opting out of one — st0x currently hand-enumerates ~695 lines of per-version, per-chain pins, which is exactly what this package exists to delete.Shape of a fix, for discussion
A
deployTargets()hook onRainDeploySuitesBasedefaulting toLibRainDeploy.supportedNetworks(), read by both groups in place of the direct call. That keeps the default behaviour for a repo that deploys everywhere, and it is the same override shapedeployNetworks()already has, so the declaration stays the single place a repo says where it deploys.The
[etherscan]half needs its own answer regardless, since a network with no Etherscan deployment is a fact about the network rather than about any consumer — perhaps membership against the networks that have one, rather than against every target.🤖 Generated with Claude Code