From 60d8bb501025705d1dc1d3d39963d7a13ad88f47 Mon Sep 17 00:00:00 2001 From: Umberto Date: Wed, 1 Oct 2025 12:26:00 +0200 Subject: [PATCH] feat(op-deployer): customize etherscan URL from CLI and environment --- op-deployer/pkg/deployer/flags.go | 8 ++++++++ op-deployer/pkg/deployer/verify/verifier.go | 18 ++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/op-deployer/pkg/deployer/flags.go b/op-deployer/pkg/deployer/flags.go index bcd3a71d49d74..da62eb4fef22f 100644 --- a/op-deployer/pkg/deployer/flags.go +++ b/op-deployer/pkg/deployer/flags.go @@ -24,6 +24,7 @@ const ( PrivateKeyFlagName = "private-key" IntentTypeFlagName = "intent-type" EtherscanAPIKeyFlagName = "etherscan-api-key" + EtherscanUrlFlagName = "etherscan-url" InputFileFlagName = "input-file" ContractNameFlagName = "contract-name" ) @@ -104,6 +105,12 @@ var ( EnvVars: PrefixEnvVar("ETHERSCAN_API_KEY"), Required: true, } + EtherscanUrlFlag = &cli.StringFlag{ + Name: EtherscanUrlFlagName, + Usage: "etherscan API URL for contract verification. when empty, default URLs are used.", + EnvVars: PrefixEnvVar("ETHERSCAN_API_URL"), + Required: false, + } InputFileFlag = &cli.StringFlag{ Name: InputFileFlagName, Usage: "filepath of input file for command", @@ -143,6 +150,7 @@ var VerifyFlags = []cli.Flag{ L1RPCURLFlag, ArtifactsLocatorFlag, EtherscanAPIKeyFlag, + EtherscanUrlFlag, InputFileFlag, ContractNameFlag, } diff --git a/op-deployer/pkg/deployer/verify/verifier.go b/op-deployer/pkg/deployer/verify/verifier.go index 0bc9e3c3bf187..29d02e22e3de0 100644 --- a/op-deployer/pkg/deployer/verify/verifier.go +++ b/op-deployer/pkg/deployer/verify/verifier.go @@ -30,12 +30,17 @@ type Verifier struct { numFailed int } -func NewVerifier(apiKey string, l1ChainID uint64, artifactsFS foundry.StatDirFs, l log.Logger, l1Client *ethclient.Client) (*Verifier, error) { - etherscanUrl, err := getAPIEndpoint(l1ChainID) - if err != nil { - return nil, fmt.Errorf("unsupported L1 chain ID: %d", l1ChainID) +func NewVerifier(apiKey string, l1ChainID uint64, artifactsFS foundry.StatDirFs, l log.Logger, l1Client *ethclient.Client, etherscanUrl string) (*Verifier, error) { + if len(etherscanUrl) == 0 { + var err error + etherscanUrl, err = getAPIEndpoint(l1ChainID) + if err != nil { + return nil, fmt.Errorf("unsupported L1 chain ID: %d", l1ChainID) + } + l.Info("found etherscan url", "url", etherscanUrl) + } else { + l.Info("using provided etherscan url", "url", etherscanUrl) } - l.Info("found etherscan url", "url", etherscanUrl) etherscan := NewEtherscanClient(apiKey, etherscanUrl, rate.NewLimiter(rate.Limit(1), 1)) @@ -94,7 +99,8 @@ func VerifyCLI(cliCtx *cli.Context) error { } l.Info("Downloaded artifacts", "path", artifactsFS) - v, err := NewVerifier(etherscanAPIKey, l1ChainId, artifactsFS, l, l1Client) + etherscanUrl := cliCtx.String(deployer.EtherscanUrlFlagName) + v, err := NewVerifier(etherscanAPIKey, l1ChainId, artifactsFS, l, l1Client, etherscanUrl) if err != nil { return fmt.Errorf("failed to create verifier: %w", err) }