whisky_csl/tx_parser/
static_methods.rs1use 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}