Skip to content

Commit 32b32c6

Browse files
authored
fix: use rpc url as alias when resolving etherscan (#3341)
1 parent 3da1ab3 commit 32b32c6

File tree

2 files changed

+76
-5
lines changed

2 files changed

+76
-5
lines changed

cli/src/cmd/forge/script/mod.rs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ mod tests {
683683
[profile.default]
684684
685685
[rpc_endpoints]
686-
polygonMumbai = "https://polygon-mumbai.g.alchemy.com/v2/${_EXTRACT_RPC_ALIAS}"
686+
polygonMumbai = "https://polygon-mumbai.g.alchemy.com/v2/${_CAN_EXTRACT_RPC_ALIAS}"
687687
"#;
688688

689689
let toml_file = root.join(Config::FILE_NAME);
@@ -701,7 +701,7 @@ mod tests {
701701

702702
assert!(err.downcast::<UnresolvedEnvVarError>().is_ok());
703703

704-
std::env::set_var("_EXTRACT_RPC_ALIAS", "123456");
704+
std::env::set_var("_CAN_EXTRACT_RPC_ALIAS", "123456");
705705
let (config, evm_opts) = args.load_config_and_evm_opts().unwrap();
706706
assert_eq!(config.eth_rpc_url, Some("polygonMumbai".to_string()));
707707
assert_eq!(
@@ -754,4 +754,46 @@ mod tests {
754754
let etherscan = config.get_etherscan_api_key(Option::<u64>::None);
755755
assert_eq!(etherscan, Some("polygonkey".to_string()));
756756
}
757+
758+
#[test]
759+
fn can_extract_script_rpc_and_sole_etherscan_alias() {
760+
let temp = tempdir().unwrap();
761+
let root = temp.path();
762+
763+
let config = r#"
764+
[profile.default]
765+
766+
[rpc_endpoints]
767+
mumbai = "https://polygon-mumbai.g.alchemy.com/v2/${_SOLE_EXTRACT_RPC_ALIAS}"
768+
769+
[etherscan]
770+
mumbai = { key = "${_SOLE_POLYSCAN_API_KEY}" }
771+
"#;
772+
773+
let toml_file = root.join(Config::FILE_NAME);
774+
fs::write(toml_file, config).unwrap();
775+
let args: ScriptArgs = ScriptArgs::parse_from([
776+
"foundry-cli",
777+
"DeployV1",
778+
"--rpc-url",
779+
"mumbai",
780+
"--root",
781+
root.as_os_str().to_str().unwrap(),
782+
]);
783+
let err = args.load_config_and_evm_opts().unwrap_err();
784+
785+
assert!(err.downcast::<UnresolvedEnvVarError>().is_ok());
786+
787+
std::env::set_var("_SOLE_EXTRACT_RPC_ALIAS", "123456");
788+
std::env::set_var("_SOLE_POLYSCAN_API_KEY", "polygonkey");
789+
let (config, evm_opts) = args.load_config_and_evm_opts().unwrap();
790+
assert_eq!(
791+
evm_opts.fork_url,
792+
Some("https://polygon-mumbai.g.alchemy.com/v2/123456".to_string())
793+
);
794+
let etherscan = config.get_etherscan_api_key(Some(80001u64));
795+
assert_eq!(etherscan, Some("polygonkey".to_string()));
796+
let etherscan = config.get_etherscan_api_key(Option::<u64>::None);
797+
assert_eq!(etherscan, Some("polygonkey".to_string()));
798+
}
757799
}

config/src/lib.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ impl Config {
739739
/// # }
740740
/// ```
741741
pub fn get_rpc_url(&self) -> Option<Result<Cow<str>, UnresolvedEnvVarError>> {
742-
let eth_rpc_url = self.eth_rpc_url.as_ref()?;
742+
let eth_rpc_url = self.eth_rpc_url.as_ref().or(self.etherscan_api_key.as_ref())?;
743743
let mut endpoints = self.rpc_endpoints.clone().resolved();
744744
if let Some(alias) = endpoints.remove(eth_rpc_url) {
745745
Some(alias.map(Cow::Owned))
@@ -808,7 +808,7 @@ impl Config {
808808
pub fn get_etherscan_config(
809809
&self,
810810
) -> Option<Result<ResolvedEtherscanConfig, EtherscanConfigError>> {
811-
let maybe_alias = self.etherscan_api_key.as_ref()?;
811+
let maybe_alias = self.etherscan_api_key.as_ref().or(self.eth_rpc_url.as_ref())?;
812812
if self.etherscan.contains_key(maybe_alias) {
813813
// etherscan points to an alias in the `etherscan` table, so we try to resolve
814814
// that
@@ -831,7 +831,7 @@ impl Config {
831831
chain: Option<impl Into<Chain>>,
832832
) -> Result<Option<ResolvedEtherscanConfig>, EtherscanConfigError> {
833833
let chain = chain.map(Into::into);
834-
if let Some(maybe_alias) = self.etherscan_api_key.as_ref() {
834+
if let Some(maybe_alias) = self.etherscan_api_key.as_ref().or(self.eth_rpc_url.as_ref()) {
835835
if self.etherscan.contains_key(maybe_alias) {
836836
let mut resolved = self.etherscan.clone().resolved();
837837
return resolved.remove(maybe_alias).transpose()
@@ -2998,6 +2998,35 @@ mod tests {
29982998
});
29992999
}
30003000

3001+
#[test]
3002+
fn test_extract_etherscan_config_by_chain_and_alias() {
3003+
figment::Jail::expect_with(|jail| {
3004+
jail.create_file(
3005+
"foundry.toml",
3006+
r#"
3007+
[profile.default]
3008+
eth_rpc_url = "mumbai"
3009+
3010+
[etherscan]
3011+
mumbai = { key = "https://etherscan-mumbai.com/" }
3012+
3013+
[rpc_endpoints]
3014+
mumbai = "https://polygon-mumbai.g.alchemy.com/v2/mumbai"
3015+
"#,
3016+
)?;
3017+
3018+
let config = Config::load();
3019+
3020+
let mumbai =
3021+
config.get_etherscan_config_with_chain(Option::<u64>::None).unwrap().unwrap();
3022+
assert_eq!(mumbai.key, "https://etherscan-mumbai.com/".to_string());
3023+
3024+
let mumbai_rpc = config.get_rpc_url().unwrap().unwrap();
3025+
assert_eq!(mumbai_rpc, "https://polygon-mumbai.g.alchemy.com/v2/mumbai");
3026+
Ok(())
3027+
});
3028+
}
3029+
30013030
#[test]
30023031
fn test_toml_file() {
30033032
figment::Jail::expect_with(|jail| {

0 commit comments

Comments
 (0)