whisky_csl/tx_parser/
static_methods.rs

1use cardano_serialization_lib as csl;
2use std::collections::HashSet;
3
4use whisky_common::WError;
5
6use crate::{blake2b256, CSLParser};
7
8impl CSLParser {
9    pub fn check_all_required_signers(&mut self, tx_hex: &str) -> Result<bool, WError> {
10        self.extract_required_signatures()
11            .map_err(WError::from_err(
12                "CSLParser - check_all_required_signers - required_signatures",
13            ))?;
14
15        let signers = &self.tx_body.required_signatures;
16        let mut signer_set: HashSet<String> = HashSet::new();
17
18        let fixed_tx = csl::FixedTransaction::from_hex(tx_hex).map_err(WError::from_err(
19            "CSLParser - check_all_required_signers - from_hex",
20        ))?;
21        for signer in signers {
22            signer_set.insert(signer.clone());
23        }
24
25        let csl_vkeys = self
26            .csl_witness_set
27            .vkeys()
28            .unwrap_or(csl::Vkeywitnesses::new());
29
30        for i in 0..csl_vkeys.len() {
31            let vkey_witness = csl_vkeys.get(i);
32            let pub_key = vkey_witness.vkey().public_key();
33            if !pub_key.verify(&blake2b256(&fixed_tx.raw_body()), &vkey_witness.signature()) {
34                return Ok(false);
35            } else {
36                signer_set.remove(&pub_key.hash().to_hex());
37            };
38        }
39        Ok(signer_set.is_empty())
40    }
41}