Skip to main content

cast/cmd/vaddr/
resolve.rs

1use 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}