whisky_csl/utils/
address.rs

1use cardano_serialization_lib::{self as csl};
2use whisky_common::DeserializedAddress;
3
4pub fn script_to_address(
5    network_id: u8,
6    script_hash: &str,
7    stake_hash: Option<(&str, bool)>,
8) -> String {
9    match stake_hash {
10        Some((stake, is_script)) => {
11            let stake_cred = if is_script {
12                csl::Credential::from_scripthash(&csl::ScriptHash::from_hex(stake).unwrap())
13            } else {
14                csl::Credential::from_keyhash(&csl::Ed25519KeyHash::from_hex(stake).unwrap())
15            };
16
17            csl::BaseAddress::new(
18                network_id,
19                &csl::Credential::from_scripthash(&csl::ScriptHash::from_hex(script_hash).unwrap()),
20                &stake_cred,
21            )
22            .to_address()
23            .to_bech32(None)
24            .unwrap()
25        }
26
27        None => csl::EnterpriseAddress::new(
28            network_id,
29            &csl::Credential::from_scripthash(&csl::ScriptHash::from_hex(script_hash).unwrap()),
30        )
31        .to_address()
32        .to_bech32(None)
33        .unwrap(),
34    }
35}
36
37pub fn deserialize_address(bech32_addr: &str) -> DeserializedAddress {
38    let csl_address =
39        csl::BaseAddress::from_address(&csl::Address::from_bech32(bech32_addr).unwrap());
40    match csl_address {
41        Some(address) => {
42            let csl_key_hash = address
43                .payment_cred()
44                .to_keyhash()
45                .map(|key_hash| key_hash.to_hex());
46
47            let csl_script_hash = address
48                .payment_cred()
49                .to_scripthash()
50                .map(|script_hash| script_hash.to_hex());
51
52            let csl_stake_key_hash = address
53                .stake_cred()
54                .to_keyhash()
55                .map(|stake_key_hash| stake_key_hash.to_hex());
56
57            let csl_stake_key_script_hash = address
58                .stake_cred()
59                .to_scripthash()
60                .map(|stake_key_script_hash| stake_key_script_hash.to_hex());
61
62            DeserializedAddress::new(
63                &csl_key_hash.unwrap_or("".to_string()),
64                &csl_script_hash.unwrap_or("".to_string()),
65                &csl_stake_key_hash.unwrap_or("".to_string()),
66                &csl_stake_key_script_hash.unwrap_or("".to_string()),
67            )
68        }
69        None => {
70            let csl_enterprize_address = csl::EnterpriseAddress::from_address(
71                &csl::Address::from_bech32(bech32_addr).unwrap(),
72            )
73            .unwrap();
74
75            let csl_key_hash = csl_enterprize_address
76                .payment_cred()
77                .to_keyhash()
78                .map(|key_hash| key_hash.to_hex());
79
80            let csl_script_hash = csl_enterprize_address
81                .payment_cred()
82                .to_scripthash()
83                .map(|script_hash| script_hash.to_hex());
84
85            DeserializedAddress::new(
86                &csl_key_hash.unwrap_or("".to_string()),
87                &csl_script_hash.unwrap_or("".to_string()),
88                "",
89                "",
90            )
91        }
92    }
93}