agglayer_types/aggchain_data/
multisig.rs

1use agglayer_primitives::{Address, Signature, B256};
2use pessimistic_proof::core;
3
4use crate::aggchain_data::PayloadWithCtx;
5
6/// Multisig data from the chain.
7#[derive(Clone, Debug)]
8pub struct Payload {
9    pub(crate) signatures: Vec<Option<Signature>>,
10}
11
12impl From<Vec<Option<Signature>>> for Payload {
13    fn from(signatures: Vec<Option<Signature>>) -> Self {
14        Self { signatures }
15    }
16}
17
18impl From<&[Option<Signature>]> for Payload {
19    fn from(signatures: &[Option<Signature>]) -> Self {
20        Self {
21            signatures: signatures.to_vec(),
22        }
23    }
24}
25
26impl From<agglayer_interop_types::aggchain_proof::MultisigPayload> for Payload {
27    fn from(value: agglayer_interop_types::aggchain_proof::MultisigPayload) -> Self {
28        Self {
29            signatures: value.0,
30        }
31    }
32}
33
34impl From<&agglayer_interop_types::aggchain_proof::MultisigPayload> for Payload {
35    fn from(value: &agglayer_interop_types::aggchain_proof::MultisigPayload) -> Self {
36        Self {
37            signatures: value.0.clone(),
38        }
39    }
40}
41
42/// Multisig data from the L1 and enforced by the agglayer.
43#[derive(Clone, Debug)]
44pub struct Ctx {
45    /// Ordered list of all possible signers.
46    pub signers: Vec<Address>,
47    /// Inclusive threshold.
48    pub threshold: usize,
49    /// Prehash expected to be signed.
50    pub prehash: B256,
51}
52
53// Generate the prover inputs from the chain payload and the L1 context.
54impl From<PayloadWithCtx<Payload, Ctx>> for core::MultiSignature {
55    fn from(d: PayloadWithCtx<Payload, Ctx>) -> core::MultiSignature {
56        let PayloadWithCtx(Payload { signatures }, multisig) = d;
57
58        core::MultiSignature {
59            signatures,
60            expected_signers: multisig.signers,
61            threshold: multisig.threshold,
62        }
63    }
64}