whisky_pallas/wrapper/transaction_body/
stake_credential.rs

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