Skip to main content

cast/cmd/vaddr/
resolve.rs

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