From 098e8ccf44c6762e9051008260a5a4a3d4b1f13b Mon Sep 17 00:00:00 2001 From: linxy Date: Thu, 22 May 2025 15:03:08 +0800 Subject: [PATCH 1/3] chore(ens): replacing common::ens with the alloy_ens crate. --- Cargo.lock | 19 ++- Cargo.toml | 1 + crates/cast/Cargo.toml | 1 + crates/cast/src/args.rs | 2 +- crates/cast/src/cmd/access_list.rs | 2 +- crates/cast/src/cmd/call.rs | 3 +- crates/cast/src/cmd/estimate.rs | 2 +- crates/cast/src/cmd/logs.rs | 4 +- crates/cast/src/cmd/mktx.rs | 2 +- crates/cast/src/cmd/send.rs | 2 +- crates/cast/src/cmd/storage.rs | 2 +- crates/cast/src/lib.rs | 2 +- crates/cast/src/opts.rs | 6 +- crates/cast/src/tx.rs | 5 +- crates/cheatcodes/Cargo.toml | 1 + crates/cheatcodes/src/utils.rs | 14 +- crates/cli/Cargo.toml | 1 + crates/cli/src/utils/abi.rs | 8 +- crates/common/Cargo.toml | 2 - crates/common/src/ens.rs | 249 ----------------------------- crates/common/src/lib.rs | 1 - 21 files changed, 47 insertions(+), 282 deletions(-) delete mode 100644 crates/common/src/ens.rs diff --git a/Cargo.lock b/Cargo.lock index a3556f64a74f9..b54463257cecd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -243,6 +243,20 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "alloy-ens" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75be61b140796044420ad1d5b31b415150c46e0a6e59c155d6f0e10e307b9ac" +dependencies = [ + "alloy-contract", + "alloy-primitives 1.1.0", + "alloy-provider", + "alloy-sol-types 1.1.0", + "async-trait", + "thiserror 2.0.12", +] + [[package]] name = "alloy-evm" version = "0.9.1" @@ -2464,6 +2478,7 @@ dependencies = [ "alloy-consensus", "alloy-contract", "alloy-dyn-abi 1.1.0", + "alloy-ens", "alloy-json-abi 1.1.0", "alloy-json-rpc", "alloy-network", @@ -4124,6 +4139,7 @@ dependencies = [ "alloy-chains", "alloy-consensus", "alloy-dyn-abi 1.1.0", + "alloy-ens", "alloy-evm", "alloy-genesis", "alloy-json-abi 1.1.0", @@ -4185,6 +4201,7 @@ dependencies = [ "alloy-chains", "alloy-dyn-abi 1.1.0", "alloy-eips 1.0.5", + "alloy-ens", "alloy-json-abi 1.1.0", "alloy-primitives 1.1.0", "alloy-provider", @@ -4228,7 +4245,6 @@ name = "foundry-common" version = "1.2.1" dependencies = [ "alloy-consensus", - "alloy-contract", "alloy-dyn-abi 1.1.0", "alloy-eips 1.0.5", "alloy-json-abi 1.1.0", @@ -4247,7 +4263,6 @@ dependencies = [ "alloy-transport-ws", "anstream", "anstyle", - "async-trait", "axum", "chrono", "ciborium", diff --git a/Cargo.toml b/Cargo.toml index b381f84565323..5b02447e18372 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -207,6 +207,7 @@ solar-sema = { version = "=0.1.3", default-features = false } alloy-consensus = { version = "1.0.5", default-features = false } alloy-contract = { version = "1.0.5", default-features = false } alloy-eips = { version = "1.0.5", default-features = false } +alloy-ens = { version = "1.0.5", default-features = false } alloy-genesis = { version = "1.0.5", default-features = false } alloy-json-rpc = { version = "1.0.5", default-features = false } alloy-network = { version = "1.0.5", default-features = false } diff --git a/crates/cast/Cargo.toml b/crates/cast/Cargo.toml index 82425a95f819c..38c1e4a36cf44 100644 --- a/crates/cast/Cargo.toml +++ b/crates/cast/Cargo.toml @@ -52,6 +52,7 @@ alloy-signer-local = { workspace = true, features = ["mnemonic", "keystore"] } alloy-signer.workspace = true alloy-sol-types.workspace = true alloy-transport.workspace = true +alloy-ens = { workspace = true, features = ["provider"] } chrono.workspace = true eyre.workspace = true diff --git a/crates/cast/src/args.rs b/crates/cast/src/args.rs index fb5ee336235c6..6487bbe527199 100644 --- a/crates/cast/src/args.rs +++ b/crates/cast/src/args.rs @@ -5,6 +5,7 @@ use crate::{ }; use alloy_consensus::transaction::{Recovered, SignerRecoverable}; use alloy_dyn_abi::{DynSolValue, ErrorExt, EventExt}; +use alloy_ens::{namehash, ProviderEnsExt}; use alloy_primitives::{eip191_hash_message, hex, keccak256, Address, B256}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, BlockNumberOrTag::Latest}; @@ -14,7 +15,6 @@ use eyre::Result; use foundry_cli::{handler, utils, utils::LoadConfig}; use foundry_common::{ abi::{get_error, get_event}, - ens::{namehash, ProviderEnsExt}, fmt::{format_tokens, format_tokens_raw, format_uint_exp}, fs, selectors::{ diff --git a/crates/cast/src/cmd/access_list.rs b/crates/cast/src/cmd/access_list.rs index 3c5654fd09b55..700a37b22a887 100644 --- a/crates/cast/src/cmd/access_list.rs +++ b/crates/cast/src/cmd/access_list.rs @@ -2,6 +2,7 @@ use crate::{ tx::{CastTxBuilder, SenderKind}, Cast, }; +use alloy_ens::NameOrAddress; use alloy_rpc_types::BlockId; use clap::Parser; use eyre::Result; @@ -9,7 +10,6 @@ use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, utils::{self, LoadConfig}, }; -use foundry_common::ens::NameOrAddress; use std::str::FromStr; /// CLI arguments for `cast access-list`. diff --git a/crates/cast/src/cmd/call.rs b/crates/cast/src/cmd/call.rs index 7499efe0ccee9..6a13678184d36 100644 --- a/crates/cast/src/cmd/call.rs +++ b/crates/cast/src/cmd/call.rs @@ -3,6 +3,7 @@ use crate::{ tx::{CastTxBuilder, SenderKind}, Cast, }; +use alloy_ens::NameOrAddress; use alloy_primitives::{Address, Bytes, TxKind, U256}; use alloy_rpc_types::{ state::{StateOverride, StateOverridesBuilder}, @@ -14,7 +15,7 @@ use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, utils::{self, handle_traces, parse_ether_value, TraceResult}, }; -use foundry_common::{ens::NameOrAddress, shell}; +use foundry_common::shell; use foundry_compilers::artifacts::EvmVersion; use foundry_config::{ figment::{ diff --git a/crates/cast/src/cmd/estimate.rs b/crates/cast/src/cmd/estimate.rs index 58f40efdec109..51368b6d0a538 100644 --- a/crates/cast/src/cmd/estimate.rs +++ b/crates/cast/src/cmd/estimate.rs @@ -1,4 +1,5 @@ use crate::tx::{CastTxBuilder, SenderKind}; +use alloy_ens::NameOrAddress; use alloy_primitives::U256; use alloy_provider::Provider; use alloy_rpc_types::BlockId; @@ -8,7 +9,6 @@ use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, utils::{self, parse_ether_value, LoadConfig}, }; -use foundry_common::ens::NameOrAddress; use std::str::FromStr; /// CLI arguments for `cast estimate`. diff --git a/crates/cast/src/cmd/logs.rs b/crates/cast/src/cmd/logs.rs index 1b3ce1fe9be66..aad30c6c475af 100644 --- a/crates/cast/src/cmd/logs.rs +++ b/crates/cast/src/cmd/logs.rs @@ -1,5 +1,6 @@ use crate::Cast; use alloy_dyn_abi::{DynSolType, DynSolValue, Specifier}; +use alloy_ens::NameOrAddress; use alloy_json_abi::Event; use alloy_network::AnyNetwork; use alloy_primitives::{hex::FromHex, Address, B256}; @@ -7,7 +8,6 @@ use alloy_rpc_types::{BlockId, BlockNumberOrTag, Filter, FilterBlockOption, Filt use clap::Parser; use eyre::Result; use foundry_cli::{opts::EthereumOpts, utils, utils::LoadConfig}; -use foundry_common::ens::NameOrAddress; use itertools::Itertools; use std::{io, str::FromStr}; @@ -77,7 +77,7 @@ impl LogsArgs { if !subscribe { let logs = cast.filter_logs(filter).await?; sh_println!("{logs}")?; - return Ok(()) + return Ok(()); } // FIXME: this is a hotfix for diff --git a/crates/cast/src/cmd/mktx.rs b/crates/cast/src/cmd/mktx.rs index a17f52be8071b..af06d556c23ff 100644 --- a/crates/cast/src/cmd/mktx.rs +++ b/crates/cast/src/cmd/mktx.rs @@ -1,4 +1,5 @@ use crate::tx::{self, CastTxBuilder}; +use alloy_ens::NameOrAddress; use alloy_network::{eip2718::Encodable2718, EthereumWallet, TransactionBuilder}; use alloy_primitives::hex; use alloy_signer::Signer; @@ -8,7 +9,6 @@ use foundry_cli::{ opts::{EthereumOpts, TransactionOpts}, utils::{get_provider, LoadConfig}, }; -use foundry_common::ens::NameOrAddress; use std::{path::PathBuf, str::FromStr}; /// CLI arguments for `cast mktx`. diff --git a/crates/cast/src/cmd/send.rs b/crates/cast/src/cmd/send.rs index 4109639db4aab..500c65f6723c2 100644 --- a/crates/cast/src/cmd/send.rs +++ b/crates/cast/src/cmd/send.rs @@ -2,6 +2,7 @@ use crate::{ tx::{self, CastTxBuilder}, Cast, }; +use alloy_ens::NameOrAddress; use alloy_network::{AnyNetwork, EthereumWallet}; use alloy_provider::{Provider, ProviderBuilder}; use alloy_rpc_types::TransactionRequest; @@ -14,7 +15,6 @@ use foundry_cli::{ utils, utils::LoadConfig, }; -use foundry_common::ens::NameOrAddress; use std::{path::PathBuf, str::FromStr}; /// CLI arguments for `cast send`. diff --git a/crates/cast/src/cmd/storage.rs b/crates/cast/src/cmd/storage.rs index b477ebf2b2637..1bd3cf1468ebc 100644 --- a/crates/cast/src/cmd/storage.rs +++ b/crates/cast/src/cmd/storage.rs @@ -1,4 +1,5 @@ use crate::{opts::parse_slot, Cast}; +use alloy_ens::NameOrAddress; use alloy_network::AnyNetwork; use alloy_primitives::{Address, B256, U256}; use alloy_provider::Provider; @@ -15,7 +16,6 @@ use foundry_cli::{ use foundry_common::{ abi::find_source, compile::{etherscan_project, ProjectCompiler}, - ens::NameOrAddress, shell, }; use foundry_compilers::{ diff --git a/crates/cast/src/lib.rs b/crates/cast/src/lib.rs index 104c3e9ee44cc..5351bdb7b3208 100644 --- a/crates/cast/src/lib.rs +++ b/crates/cast/src/lib.rs @@ -4,6 +4,7 @@ use alloy_consensus::TxEnvelope; use alloy_dyn_abi::{DynSolType, DynSolValue, FunctionExt}; +use alloy_ens::NameOrAddress; use alloy_json_abi::Function; use alloy_network::{AnyNetwork, AnyRpcTransaction}; use alloy_primitives::{ @@ -28,7 +29,6 @@ use foundry_block_explorers::Client; use foundry_common::{ abi::{encode_function_args, get_func}, compile::etherscan_project, - ens::NameOrAddress, fmt::*, fs, get_pretty_tx_receipt_attr, shell, TransactionReceiptWithRevertReason, }; diff --git a/crates/cast/src/opts.rs b/crates/cast/src/opts.rs index 90c39900f12c6..d38c565ce9f71 100644 --- a/crates/cast/src/opts.rs +++ b/crates/cast/src/opts.rs @@ -5,15 +5,13 @@ use crate::cmd::{ mktx::MakeTxArgs, rpc::RpcArgs, run::RunArgs, send::SendTxArgs, storage::StorageArgs, txpool::TxPoolSubcommands, wallet::WalletSubcommands, }; +use alloy_ens::NameOrAddress; use alloy_primitives::{Address, Selector, B256, U256}; use alloy_rpc_types::BlockId; use clap::{Parser, Subcommand, ValueHint}; use eyre::Result; use foundry_cli::opts::{EtherscanOpts, GlobalArgs, RpcOpts}; -use foundry_common::{ - ens::NameOrAddress, - version::{LONG_VERSION, SHORT_VERSION}, -}; +use foundry_common::version::{LONG_VERSION, SHORT_VERSION}; use std::{path::PathBuf, str::FromStr}; /// A Swiss Army knife for interacting with Ethereum applications from the command line. diff --git a/crates/cast/src/tx.rs b/crates/cast/src/tx.rs index 36b14807b98cd..a5f8f29fd25e5 100644 --- a/crates/cast/src/tx.rs +++ b/crates/cast/src/tx.rs @@ -1,6 +1,7 @@ use crate::traces::identifier::SignaturesIdentifier; use alloy_consensus::{SidecarBuilder, SignableTransaction, SimpleCoder}; use alloy_dyn_abi::ErrorExt; +use alloy_ens::NameOrAddress; use alloy_json_abi::Function; use alloy_network::{ AnyNetwork, AnyTypedTransaction, TransactionBuilder, TransactionBuilder4844, @@ -18,7 +19,7 @@ use foundry_cli::{ opts::{CliAuthorizationList, TransactionOpts}, utils::{self, parse_function_args}, }; -use foundry_common::{ens::NameOrAddress, fmt::format_tokens}; +use foundry_common::fmt::format_tokens; use foundry_config::{Chain, Config}; use foundry_wallets::{WalletOpts, WalletSigner}; use itertools::Itertools; @@ -477,7 +478,7 @@ async fn decode_execution_revert(data: &RawValue) -> Result> { write!(decoded_error, "({})", format_tokens(&error.body).format(", "))?; } } - return Ok(Some(decoded_error)) + return Ok(Some(decoded_error)); } Ok(None) } diff --git a/crates/cheatcodes/Cargo.toml b/crates/cheatcodes/Cargo.toml index 97eedfcc44200..8269364d231fb 100644 --- a/crates/cheatcodes/Cargo.toml +++ b/crates/cheatcodes/Cargo.toml @@ -42,6 +42,7 @@ alloy-consensus = { workspace = true, features = ["k256", "kzg"] } alloy-network.workspace = true alloy-rlp.workspace = true alloy-chains.workspace = true +alloy-ens.workspace = true base64.workspace = true dialoguer = "0.11" diff --git a/crates/cheatcodes/src/utils.rs b/crates/cheatcodes/src/utils.rs index e8ddcec78aea6..a4c71abcfc8e9 100644 --- a/crates/cheatcodes/src/utils.rs +++ b/crates/cheatcodes/src/utils.rs @@ -2,9 +2,9 @@ use crate::{Cheatcode, Cheatcodes, CheatcodesExecutor, CheatsCtxt, Result, Vm::*}; use alloy_dyn_abi::{DynSolType, DynSolValue}; +use alloy_ens::namehash; use alloy_primitives::{aliases::B32, map::HashMap, B64, U256}; use alloy_sol_types::SolValue; -use foundry_common::ens::namehash; use foundry_evm_core::constants::DEFAULT_CREATE2_DEPLOYER; use proptest::prelude::Strategy; use rand::{seq::SliceRandom, Rng, RngCore}; @@ -156,12 +156,12 @@ impl Cheatcode for pauseTracingCall { ) -> Result { let Some(tracer) = executor.tracing_inspector().and_then(|t| t.as_ref()) else { // No tracer -> nothing to pause - return Ok(Default::default()) + return Ok(Default::default()); }; // If paused earlier, ignore the call if ccx.state.ignored_traces.last_pause_call.is_some() { - return Ok(Default::default()) + return Ok(Default::default()); } let cur_node = &tracer.traces().nodes().last().expect("no trace nodes"); @@ -179,12 +179,12 @@ impl Cheatcode for resumeTracingCall { ) -> Result { let Some(tracer) = executor.tracing_inspector().and_then(|t| t.as_ref()) else { // No tracer -> nothing to unpause - return Ok(Default::default()) + return Ok(Default::default()); }; let Some(start) = ccx.state.ignored_traces.last_pause_call.take() else { // Nothing to unpause - return Ok(Default::default()) + return Ok(Default::default()); }; let node = &tracer.traces().nodes().last().expect("no trace nodes"); @@ -280,7 +280,7 @@ fn random_uint(state: &mut Cheatcodes, bits: Option, bounds: Option<(U256, .new_tree(state.test_runner()) .unwrap() .current() - .abi_encode()) + .abi_encode()); } if let Some((min, max)) = bounds { @@ -293,7 +293,7 @@ fn random_uint(state: &mut Cheatcodes, bits: Option, bounds: Option<(U256, random_number %= inclusive_modulo; } random_number += min; - return Ok(random_number.abi_encode()) + return Ok(random_number.abi_encode()); } // Generate random `uint256` value. diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index d47db852e1d5f..0257d0ee968e6 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -30,6 +30,7 @@ alloy-primitives.workspace = true alloy-provider.workspace = true alloy-rlp.workspace = true alloy-chains.workspace = true +alloy-ens.workspace = true cfg-if = "1.0" clap = { version = "4", features = ["derive", "env", "unicode", "wrap_help"] } diff --git a/crates/cli/src/utils/abi.rs b/crates/cli/src/utils/abi.rs index c037fd1e17961..2f76e01454fac 100644 --- a/crates/cli/src/utils/abi.rs +++ b/crates/cli/src/utils/abi.rs @@ -1,13 +1,11 @@ use alloy_chains::Chain; +use alloy_ens::NameOrAddress; use alloy_json_abi::Function; use alloy_primitives::{hex, Address}; use alloy_provider::{network::AnyNetwork, Provider}; use eyre::{OptionExt, Result}; use foundry_block_explorers::EtherscanApiVersion; -use foundry_common::{ - abi::{encode_function_args, get_func, get_func_etherscan}, - ens::NameOrAddress, -}; +use foundry_common::abi::{encode_function_args, get_func, get_func_etherscan}; use futures::future::join_all; async fn resolve_name_args>(args: &[String], provider: &P) -> Vec { @@ -41,7 +39,7 @@ pub async fn parse_function_args>( let args = resolve_name_args(&args, provider).await; if let Ok(data) = hex::decode(sig) { - return Ok((data, None)) + return Ok((data, None)); } let func = if sig.contains('(') { diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 0b81ac057e94e..ecfc9279ac39a 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -18,7 +18,6 @@ foundry-common-fmt.workspace = true foundry-compilers.workspace = true foundry-config.workspace = true -alloy-contract.workspace = true alloy-dyn-abi = { workspace = true, features = ["arbitrary", "eip712"] } alloy-eips.workspace = true alloy-json-abi.workspace = true @@ -50,7 +49,6 @@ solar-sema.workspace = true tower.workspace = true -async-trait.workspace = true clap = { version = "4", features = ["derive", "env", "unicode", "wrap_help"] } comfy-table.workspace = true dunce.workspace = true diff --git a/crates/common/src/ens.rs b/crates/common/src/ens.rs deleted file mode 100644 index 6a5d0630cbc27..0000000000000 --- a/crates/common/src/ens.rs +++ /dev/null @@ -1,249 +0,0 @@ -//! ENS Name resolving utilities. - -#![allow(missing_docs)] - -use self::EnsResolver::EnsResolverInstance; -use alloy_primitives::{address, Address, Keccak256, B256}; -use alloy_provider::{Network, Provider}; -use alloy_sol_types::sol; -use async_trait::async_trait; -use std::{borrow::Cow, str::FromStr}; - -// ENS Registry and Resolver contracts. -sol! { - /// ENS Registry contract. - #[sol(rpc)] - contract EnsRegistry { - /// Returns the resolver for the specified node. - function resolver(bytes32 node) view returns (address); - } - - /// ENS Resolver interface. - #[sol(rpc)] - contract EnsResolver { - /// Returns the address associated with the specified node. - function addr(bytes32 node) view returns (address); - - /// Returns the name associated with an ENS node, for reverse records. - function name(bytes32 node) view returns (string); - } -} - -/// ENS registry address (`0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e`) -pub const ENS_ADDRESS: Address = address!("0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"); - -pub const ENS_REVERSE_REGISTRAR_DOMAIN: &str = "addr.reverse"; - -/// Error type for ENS resolution. -#[derive(Debug, thiserror::Error)] -pub enum EnsError { - /// Failed to get resolver from the ENS registry. - #[error("Failed to get resolver from the ENS registry: {0}")] - Resolver(alloy_contract::Error), - /// Failed to get resolver from the ENS registry. - #[error("ENS resolver not found for name {0:?}")] - ResolverNotFound(String), - /// Failed to lookup ENS name from an address. - #[error("Failed to lookup ENS name from an address: {0}")] - Lookup(alloy_contract::Error), - /// Failed to resolve ENS name to an address. - #[error("Failed to resolve ENS name to an address: {0}")] - Resolve(alloy_contract::Error), -} - -/// ENS name or Ethereum Address. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum NameOrAddress { - /// An ENS Name (format does not get checked) - Name(String), - /// An Ethereum Address - Address(Address), -} - -impl NameOrAddress { - /// Resolves the name to an Ethereum Address. - pub async fn resolve>( - &self, - provider: &P, - ) -> Result { - match self { - Self::Name(name) => provider.resolve_name(name).await, - Self::Address(addr) => Ok(*addr), - } - } -} - -impl From for NameOrAddress { - fn from(name: String) -> Self { - Self::Name(name) - } -} - -impl From<&String> for NameOrAddress { - fn from(name: &String) -> Self { - Self::Name(name.clone()) - } -} - -impl From
for NameOrAddress { - fn from(addr: Address) -> Self { - Self::Address(addr) - } -} - -impl FromStr for NameOrAddress { - type Err =
::Err; - - fn from_str(s: &str) -> Result { - match Address::from_str(s) { - Ok(addr) => Ok(Self::Address(addr)), - Err(err) => { - if s.contains('.') { - Ok(Self::Name(s.to_string())) - } else { - Err(err) - } - } - } - } -} - -/// Extension trait for ENS contract calls. -#[async_trait] -pub trait ProviderEnsExt> { - /// Returns the resolver for the specified node. The `&str` is only used for error messages. - async fn get_resolver( - &self, - node: B256, - error_name: &str, - ) -> Result, EnsError>; - - /// Performs a forward lookup of an ENS name to an address. - async fn resolve_name(&self, name: &str) -> Result { - let node = namehash(name); - let resolver = self.get_resolver(node, name).await?; - let addr = - resolver.addr(node).call().await.map_err(EnsError::Resolve).inspect_err(|e| { - let _ = sh_eprintln!("{e:?}"); - })?; - Ok(addr) - } - - /// Performs a reverse lookup of an address to an ENS name. - async fn lookup_address(&self, address: &Address) -> Result { - let name = reverse_address(address); - let node = namehash(&name); - let resolver = self.get_resolver(node, &name).await?; - let name = resolver.name(node).call().await.map_err(EnsError::Lookup)?; - Ok(name) - } -} - -#[async_trait] -impl ProviderEnsExt for P -where - P: Provider, - N: Network, -{ - async fn get_resolver( - &self, - node: B256, - error_name: &str, - ) -> Result, EnsError> { - let registry = EnsRegistry::new(ENS_ADDRESS, self); - let address = registry.resolver(node).call().await.map_err(EnsError::Resolver)?; - if address == Address::ZERO { - return Err(EnsError::ResolverNotFound(error_name.to_string())); - } - Ok(EnsResolverInstance::new(address, self)) - } -} - -/// Returns the ENS namehash as specified in [EIP-137](https://eips.ethereum.org/EIPS/eip-137) -pub fn namehash(name: &str) -> B256 { - if name.is_empty() { - return B256::ZERO - } - - // Remove the variation selector `U+FE0F` if present. - const VARIATION_SELECTOR: char = '\u{fe0f}'; - let name = if name.contains(VARIATION_SELECTOR) { - Cow::Owned(name.replace(VARIATION_SELECTOR, "")) - } else { - Cow::Borrowed(name) - }; - - // Generate the node starting from the right. - // This buffer is `[node @ [u8; 32], label_hash @ [u8; 32]]`. - let mut buffer = [0u8; 64]; - for label in name.rsplit('.') { - // node = keccak256([node, keccak256(label)]) - - // Hash the label. - let mut label_hasher = Keccak256::new(); - label_hasher.update(label.as_bytes()); - label_hasher.finalize_into(&mut buffer[32..]); - - // Hash both the node and the label hash, writing into the node. - let mut buffer_hasher = Keccak256::new(); - buffer_hasher.update(buffer.as_slice()); - buffer_hasher.finalize_into(&mut buffer[..32]); - } - buffer[..32].try_into().unwrap() -} - -/// Returns the reverse-registrar name of an address. -pub fn reverse_address(addr: &Address) -> String { - format!("{addr:x}.{ENS_REVERSE_REGISTRAR_DOMAIN}") -} - -#[cfg(test)] -mod test { - use super::*; - use alloy_primitives::hex; - - fn assert_hex(hash: B256, val: &str) { - assert_eq!(hash.0[..], hex::decode(val).unwrap()[..]); - } - - #[test] - fn test_namehash() { - for (name, expected) in &[ - ("", "0x0000000000000000000000000000000000000000000000000000000000000000"), - ("eth", "0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae"), - ("foo.eth", "0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f"), - ("alice.eth", "0x787192fc5378cc32aa956ddfdedbf26b24e8d78e40109add0eea2c1a012c3dec"), - ("ret↩️rn.eth", "0x3de5f4c02db61b221e7de7f1c40e29b6e2f07eb48d65bf7e304715cd9ed33b24"), - ] { - assert_hex(namehash(name), expected); - } - } - - #[test] - fn test_reverse_address() { - for (addr, expected) in [ - ( - "0x314159265dd8dbb310642f98f50c066173c1259b", - "314159265dd8dbb310642f98f50c066173c1259b.addr.reverse", - ), - ( - "0x28679A1a632125fbBf7A68d850E50623194A709E", - "28679a1a632125fbbf7a68d850e50623194a709e.addr.reverse", - ), - ] { - assert_eq!(reverse_address(&addr.parse().unwrap()), expected, "{addr}"); - } - } - - #[test] - fn test_invalid_address() { - for addr in [ - "0x314618", - "0x000000000000000000000000000000000000000", // 41 - "0x00000000000000000000000000000000000000000", // 43 - "0x28679A1a632125fbBf7A68d850E50623194A709E123", // 44 - ] { - assert!(NameOrAddress::from_str(addr).is_err()); - } - } -} diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 5981d317ab1d9..a0912c38caf8e 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -21,7 +21,6 @@ pub mod calc; pub mod compile; pub mod constants; pub mod contracts; -pub mod ens; pub mod errors; pub mod evm; pub mod fs; From 64ee425eac73885d4928201026b98e690d205a62 Mon Sep 17 00:00:00 2001 From: linxy Date: Thu, 22 May 2025 15:21:18 +0800 Subject: [PATCH 2/3] reformat. --- crates/cast/src/cmd/logs.rs | 2 +- crates/cast/src/tx.rs | 2 +- crates/cheatcodes/src/utils.rs | 12 ++++++------ crates/cli/src/utils/abi.rs | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/cast/src/cmd/logs.rs b/crates/cast/src/cmd/logs.rs index aad30c6c475af..beb9afbef2015 100644 --- a/crates/cast/src/cmd/logs.rs +++ b/crates/cast/src/cmd/logs.rs @@ -77,7 +77,7 @@ impl LogsArgs { if !subscribe { let logs = cast.filter_logs(filter).await?; sh_println!("{logs}")?; - return Ok(()); + return Ok(()) } // FIXME: this is a hotfix for diff --git a/crates/cast/src/tx.rs b/crates/cast/src/tx.rs index a5f8f29fd25e5..651b11a64e30c 100644 --- a/crates/cast/src/tx.rs +++ b/crates/cast/src/tx.rs @@ -478,7 +478,7 @@ async fn decode_execution_revert(data: &RawValue) -> Result> { write!(decoded_error, "({})", format_tokens(&error.body).format(", "))?; } } - return Ok(Some(decoded_error)); + return Ok(Some(decoded_error)) } Ok(None) } diff --git a/crates/cheatcodes/src/utils.rs b/crates/cheatcodes/src/utils.rs index a4c71abcfc8e9..4bdc239036d53 100644 --- a/crates/cheatcodes/src/utils.rs +++ b/crates/cheatcodes/src/utils.rs @@ -156,12 +156,12 @@ impl Cheatcode for pauseTracingCall { ) -> Result { let Some(tracer) = executor.tracing_inspector().and_then(|t| t.as_ref()) else { // No tracer -> nothing to pause - return Ok(Default::default()); + return Ok(Default::default()) }; // If paused earlier, ignore the call if ccx.state.ignored_traces.last_pause_call.is_some() { - return Ok(Default::default()); + return Ok(Default::default()) } let cur_node = &tracer.traces().nodes().last().expect("no trace nodes"); @@ -179,12 +179,12 @@ impl Cheatcode for resumeTracingCall { ) -> Result { let Some(tracer) = executor.tracing_inspector().and_then(|t| t.as_ref()) else { // No tracer -> nothing to unpause - return Ok(Default::default()); + return Ok(Default::default()) }; let Some(start) = ccx.state.ignored_traces.last_pause_call.take() else { // Nothing to unpause - return Ok(Default::default()); + return Ok(Default::default()) }; let node = &tracer.traces().nodes().last().expect("no trace nodes"); @@ -280,7 +280,7 @@ fn random_uint(state: &mut Cheatcodes, bits: Option, bounds: Option<(U256, .new_tree(state.test_runner()) .unwrap() .current() - .abi_encode()); + .abi_encode()) } if let Some((min, max)) = bounds { @@ -293,7 +293,7 @@ fn random_uint(state: &mut Cheatcodes, bits: Option, bounds: Option<(U256, random_number %= inclusive_modulo; } random_number += min; - return Ok(random_number.abi_encode()); + return Ok(random_number.abi_encode()) } // Generate random `uint256` value. diff --git a/crates/cli/src/utils/abi.rs b/crates/cli/src/utils/abi.rs index 2f76e01454fac..d752312580df4 100644 --- a/crates/cli/src/utils/abi.rs +++ b/crates/cli/src/utils/abi.rs @@ -39,7 +39,7 @@ pub async fn parse_function_args>( let args = resolve_name_args(&args, provider).await; if let Ok(data) = hex::decode(sig) { - return Ok((data, None)); + return Ok((data, None)) } let func = if sig.contains('(') { From a848cfc94928ca83c8cc47a7277942ea82ff5bb0 Mon Sep 17 00:00:00 2001 From: linxy Date: Thu, 22 May 2025 15:36:03 +0800 Subject: [PATCH 3/3] add default feature. --- crates/cli/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 0257d0ee968e6..2eade5bdd2ccd 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -30,7 +30,7 @@ alloy-primitives.workspace = true alloy-provider.workspace = true alloy-rlp.workspace = true alloy-chains.workspace = true -alloy-ens.workspace = true +alloy-ens = { workspace = true, features = ["provider"] } cfg-if = "1.0" clap = { version = "4", features = ["derive", "env", "unicode", "wrap_help"] } @@ -66,4 +66,4 @@ tikv-jemallocator = { workspace = true, optional = true } tracy = ["dep:tracing-tracy"] tracy-allocator = ["dep:tracy-client", "tracy"] jemalloc = ["dep:tikv-jemallocator"] -mimalloc = ["dep:mimalloc"] \ No newline at end of file +mimalloc = ["dep:mimalloc"]