whisky_csl/tx_parser/
required_signatures.rs1use std::collections::HashSet;
2
3use crate::{blake2b256, csl};
4use whisky_common::WError;
5
6use super::TxParser;
7
8impl TxParser {
9 pub fn required_signatures(&mut self) -> Result<Vec<String>, WError> {
10 let mut required_signer_hashes = vec![];
11 let required_signers_key_hashes = self
12 .csl_tx_body
13 .required_signers()
14 .unwrap_or(csl::Ed25519KeyHashes::new());
15 for i in 0..required_signers_key_hashes.len() {
16 let signer = required_signers_key_hashes.get(i);
17 required_signer_hashes.push(signer.to_hex())
18 }
19 self.tx_body.required_signatures = required_signer_hashes.clone();
20 Ok(required_signer_hashes)
21 }
22
23 pub fn check_all_required_signers(&self) -> bool {
24 let signers = &self.tx_body.required_signatures;
25 let mut signer_set: HashSet<String> = HashSet::new();
26 let fixed_tx = csl::FixedTransaction::from_hex(&self.tx_hex).unwrap();
27 for signer in signers {
28 signer_set.insert(signer.clone());
29 }
30 let csl_vkeys = self
34 .csl_witness_set
35 .vkeys()
36 .unwrap_or(csl::Vkeywitnesses::new());
37 for i in 0..csl_vkeys.len() {
38 let vkey_witness = csl_vkeys.get(i);
39 let pub_key = vkey_witness.vkey().public_key();
40 if !pub_key.verify(&blake2b256(&fixed_tx.raw_body()), &vkey_witness.signature()) {
41 return false;
42 } else {
43 signer_set.remove(&pub_key.hash().to_hex());
44 };
45 }
46 signer_set.is_empty()
47 }
48}