1pub use enum_dispatch::enum_dispatch;
6use iota_sdk_crypto::{Verifier, multisig::MultisigVerifier};
7pub use iota_sdk_types::crypto::{
8 BitmapUnit, MultisigAggregatedSignature as MultiSig, MultisigCommittee as MultiSigPublicKey,
9 MultisigMember, MultisigMemberSignature, ThresholdUnit, WeightUnit,
10};
11use iota_sdk_types::{Address, crypto::IntentMessage};
12use serde::Serialize;
13
14use crate::{
15 error::IotaError,
16 signature::{AuthenticatorTrait, VerifyParams},
17};
18
19#[cfg(test)]
20#[path = "unit_tests/multisig_tests.rs"]
21mod multisig_tests;
22
23impl AuthenticatorTrait for MultiSig {
24 fn verify_claims<T>(
25 &self,
26 intent_message: &IntentMessage<T>,
27 multisig_address: Address,
28 verify_params: &VerifyParams,
29 ) -> Result<(), IotaError>
30 where
31 T: Serialize,
32 {
33 let digest = intent_message.signing_digest();
34 let verifier = MultisigVerifier::new()
35 .with_address(multisig_address)
36 .with_accept_passkey_in_multisig(verify_params.accept_passkey_in_multisig)
37 .with_additional_multisig_checks(verify_params.additional_multisig_checks);
38
39 verifier
40 .verify(&*digest, self)
41 .map_err(|e| IotaError::InvalidSignature {
42 error: format!("Invalid multisig: {e}"),
43 })
44 }
45}