whisky_csl/utils/
address.rs1use 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}