forc_crypto/
address.rs

1use anyhow::anyhow;
2use fuel_crypto::fuel_types::Address;
3use fuels_core::types::bech32::Bech32Address;
4use serde_json::json;
5use std::str::{from_utf8, FromStr};
6
7forc_util::cli_examples! {
8    crate::Command {
9        [ Convert an address to another format => "forc crypto address fuel12e0xwx34nfp7jrzvn9mp5qkac3yvp7h8fx37ghl7klf82vv2wkys6wd523" ]
10    }
11}
12
13#[derive(Debug, clap::Args)]
14#[clap(
15    version,
16    about = "Converts an address to another format",
17    after_help = help(),
18)]
19pub struct Args {
20    /// The address to convert. It can be either a valid address in any format
21    /// (Bech32 or hex)
22    pub address: String,
23}
24
25/// Takes a valid address in any supported format and returns them in all
26/// supported format. This is meant to be a tool that can be used to convert any
27/// address format to all other formats
28pub fn dump_address<T: AsRef<[u8]>>(data: T) -> anyhow::Result<serde_json::Value> {
29    let bytes_32: Result<[u8; 32], _> = data.as_ref().try_into();
30    let (bech32, addr) = match bytes_32 {
31        Ok(bytes) => (
32            Bech32Address::from(Address::from(bytes)),
33            Address::from(bytes),
34        ),
35        Err(_) => handle_string_conversion(data)?,
36    };
37
38    Ok(json!({
39        "Bench32": bech32.to_string(),
40        "Address": addr.to_string(),
41    }))
42}
43
44fn handle_string_conversion<T: AsRef<[u8]>>(data: T) -> anyhow::Result<(Bech32Address, Address)> {
45    let addr = from_utf8(data.as_ref())?;
46    if let Ok(bech32) = Bech32Address::from_str(addr) {
47        Ok((bech32.clone(), Address::from(bech32)))
48    } else if let Ok(addr) = Address::from_str(addr) {
49        Ok((Bech32Address::from(addr), addr))
50    } else {
51        Err(anyhow!("{} cannot be parsed to a valid address", addr))
52    }
53}