diff --git a/.changelog/unreleased/improvements/1850-cli-parse-eth-addrs.md b/.changelog/unreleased/improvements/1850-cli-parse-eth-addrs.md new file mode 100644 index 0000000000..280d7f8f45 --- /dev/null +++ b/.changelog/unreleased/improvements/1850-cli-parse-eth-addrs.md @@ -0,0 +1,2 @@ +- Parse Eth addresses from the CLI + ([\#1850](https://github.com/anoma/namada/pull/1850)) \ No newline at end of file diff --git a/apps/src/lib/cli/context.rs b/apps/src/lib/cli/context.rs index 8a24af54b7..c09c92b911 100644 --- a/apps/src/lib/cli/context.rs +++ b/apps/src/lib/cli/context.rs @@ -8,8 +8,9 @@ use std::str::FromStr; use color_eyre::eyre::Result; use namada::ledger::masp::ShieldedContext; use namada::ledger::wallet::Wallet; -use namada::types::address::Address; +use namada::types::address::{Address, InternalAddress}; use namada::types::chain::ChainId; +use namada::types::ethereum_events::EthAddress; use namada::types::key::*; use namada::types::masp::*; @@ -345,16 +346,25 @@ impl ArgFromContext for Address { ctx: &Context, raw: impl AsRef, ) -> Result { + struct Skip; let raw = raw.as_ref(); // An address can be either raw (bech32m encoding) FromStr::from_str(raw) - // Or it can be an alias that may be found in the wallet + // An Ethereum address .or_else(|_| { - ctx.wallet - .find_address(raw) - .cloned() - .ok_or_else(|| format!("Unknown address {}", raw)) + (raw.len() == 42 && raw.starts_with("0x")) + .then(|| { + raw.parse::() + .map(|addr| { + Address::Internal(InternalAddress::Erc20(addr)) + }) + .map_err(|_| Skip) + }) + .unwrap_or(Err(Skip)) }) + // Or it can be an alias that may be found in the wallet + .or_else(|_| ctx.wallet.find_address(raw).cloned().ok_or(Skip)) + .map_err(|_| format!("Unknown address {raw}")) } }