cast/cmd/vaddr/
resolve.rs1use alloy_primitives::{Address, hex};
2use eyre::Result;
3use foundry_cli::{opts::RpcOpts, utils::LoadConfig};
4use foundry_common::{provider::ProviderBuilder, shell};
5use serde_json::json;
6use tempo_alloy::{
7 TempoNetwork,
8 contracts::precompiles::{ADDRESS_REGISTRY_ADDRESS, IAddressRegistry},
9};
10
11pub(super) async fn run(addr: Address, rpc: RpcOpts) -> Result<()> {
12 let config = rpc.load_config()?;
13 let provider = ProviderBuilder::<TempoNetwork>::from_config(&config)?.build()?;
14 let registry = IAddressRegistry::new(ADDRESS_REGISTRY_ADDRESS, &provider);
15
16 let decode_builder = registry.decodeVirtualAddress(addr);
17 let resolve_builder = registry.resolveVirtualAddress(addr);
18 let (decoded, master) = tokio::try_join!(decode_builder.call(), resolve_builder.call())?;
19
20 if !decoded.isVirtual {
21 sh_println!("{addr} is not a virtual address")?;
22 return Ok(());
23 }
24
25 let master_id = decoded.masterId;
26 let user_tag = decoded.userTag;
27 let master: Address = master;
28
29 if shell::is_json() {
30 let master_address = if master.is_zero() { None } else { Some(format!("{master}")) };
31 sh_println!(
32 "{}",
33 serde_json::to_string_pretty(&json!({
34 "address": format!("{addr}"),
35 "master_id": format!("0x{}", hex::encode(master_id)),
36 "user_tag": format!("0x{}", hex::encode(user_tag)),
37 "master_address": master_address,
38 }))?
39 )?;
40 } else {
41 sh_println!("Virtual address: {addr}")?;
42 sh_println!("Master ID: 0x{}", hex::encode(master_id))?;
43 sh_println!("User tag: 0x{}", hex::encode(user_tag))?;
44 if master.is_zero() {
45 sh_println!("Master address: (unregistered)")?;
46 } else {
47 sh_println!("Master address: {master}")?;
48 }
49 }
50
51 Ok(())
52}