cast/cmd/vaddr/
resolve.rs1use crate::{cmd::print_json_or, tempo::tempo_provider};
2use alloy_primitives::Address;
3use eyre::Result;
4use foundry_cli::opts::RpcOpts;
5use serde_json::json;
6use tempo_alloy::contracts::precompiles::{ADDRESS_REGISTRY_ADDRESS, IAddressRegistry};
7
8pub(super) async fn run(addr: Address, rpc: RpcOpts) -> Result<()> {
9 let (_, provider) = tempo_provider(&rpc)?;
10 let registry = IAddressRegistry::new(ADDRESS_REGISTRY_ADDRESS, &provider);
11
12 let decode = registry.decodeVirtualAddress(addr);
13 let resolve = registry.resolveVirtualAddress(addr);
14 let (decoded, master) = tokio::try_join!(decode.call(), resolve.call())?;
15
16 if !decoded.isVirtual {
17 return sh_println!("{addr} is not a virtual address");
18 }
19
20 let master_address = (!master.is_zero()).then(|| format!("{master}"));
21 let payload = json!({
22 "address": format!("{addr}"),
23 "master_id": format!("{}", decoded.masterId),
24 "user_tag": format!("{}", decoded.userTag),
25 "master_address": master_address,
26 });
27 print_json_or(
28 payload,
29 format!(
30 "Virtual address: {addr}\nMaster ID: {}\nUser tag: {}\nMaster address: {}",
31 decoded.masterId,
32 decoded.userTag,
33 master_address.as_deref().unwrap_or("(unregistered)"),
34 ),
35 )
36}