whisky_pallas/wrapper/transaction_body/
stake_credential.rs1use std::str::FromStr;
2
3use pallas::crypto::hash::Hash;
4use pallas::ledger::primitives::{conway::StakeCredential as PallasStakeCredential, Fragment};
5use whisky_common::WError;
6
7pub enum StakeCredentialKind {
8 KeyHash { key_hash_hex: String },
9 ScriptHash { script_hash_hex: String },
10}
11
12#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)]
13pub struct StakeCredential {
14 pub inner: PallasStakeCredential,
15}
16
17impl StakeCredential {
18 pub fn new(stake_credential: StakeCredentialKind) -> Result<Self, WError> {
19 let pallas_stake_credential = match stake_credential {
20 StakeCredentialKind::KeyHash { key_hash_hex } => {
21 let key_hash = Hash::<28>::from_str(&key_hash_hex).map_err(|e| {
22 WError::new("StakeCredential - Invalid key hash length", &e.to_string())
23 })?;
24 PallasStakeCredential::AddrKeyhash(key_hash)
25 }
26
27 StakeCredentialKind::ScriptHash { script_hash_hex } => {
28 let script_hash = Hash::<28>::from_str(&script_hash_hex).map_err(|e| {
29 WError::new(
30 "StakeCredential - Invalid script hash length",
31 &e.to_string(),
32 )
33 })?;
34 PallasStakeCredential::ScriptHash(script_hash)
35 }
36 };
37
38 Ok(Self {
39 inner: pallas_stake_credential,
40 })
41 }
42
43 pub fn encode(&self) -> Result<String, WError> {
44 let encoded_fragment = self
45 .inner
46 .encode_fragment()
47 .map_err(|e| WError::new("StakeCredential - Fragment encode error", &e.to_string()))?;
48 Ok(hex::encode(encoded_fragment))
49 }
50
51 pub fn decode_bytes(bytes: &[u8]) -> Result<Self, WError> {
52 let inner = PallasStakeCredential::decode_fragment(&bytes)
53 .map_err(|e| WError::new("StakeCredential - Fragment decode error", &e.to_string()))?;
54 Ok(Self { inner })
55 }
56}