Skip to content

A consumer deploying to a subset of supportedNetworks() cannot bind RainDeployVerify #250

Description

@thedavidmeister

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

Activity

  1. thedavidmeister commented on Oct 5, 2026

    @thedavidmeister
    ContributorAuthor

    Duplicate of #246 — same gap, same consumer, same proposed shape. Consolidating
    on #246 because it is already labelled and has a PR in progress against it.

    Two things stated here and not there, ported onto #246 so they are not lost:

    1. The [etherscan] half needs its own answer. A network with no Etherscan
      deployment is a fact about the network rather than about any consumer, so
      scoping testSupportedNetworksAreFullyConfigured to the consumer's own
      roster still fails on st0x's correct config — Robinhood has no entry on
      purpose, since chain 4663 is not indexed by Etherscan v2 and it verifies
      through Sourcify. Membership against the networks that HAVE an Etherscan
      deployment, rather than against every deploy target.

    2. Why it is 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 worse than opting out of one — st0x hand-enumerates
      ~695 lines of per-version, per-chain pins instead, which is what this
      package exists to delete.

    The call-site inventories also differ: this issue names
    RainDeployVerifyChain.testSuitesLiveOnEverySupportedNetwork, #246 names
    checkDeployedOnSupportedNetworks and testSupportedNetworkChainIdsAreBound.
    All three are being checked against the current tree rather than either list
    being trusted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    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