agglayer_types/aggchain_data/
mod.rs

1use agglayer_interop_types::aggchain_proof::AggchainData;
2
3mod aggchain_proof;
4mod global;
5mod multisig;
6
7// TODO: better naming for all the structures in this module, including this
8// module name
9pub use crate::aggchain_data::{
10    aggchain_proof::{Context as AggchainProofCtx, Payload as AggchainProofPayload},
11    global::{
12        AggchainDataError, Context as CertificateAggchainDataCtx,
13        Payload as CertificateAggchainData,
14    },
15    multisig::{Ctx as MultisigCtx, Payload as MultisigPayload},
16    PayloadWithCtx as CertificateAggchainDataWithCtx,
17};
18
19/// Represents the payload from the chain, with the context fetched from the L1.
20#[derive(Clone, Debug)]
21pub struct PayloadWithCtx<Payload, Context>(pub Payload, pub Context);
22
23// FIXME: To remove, global::Payload should replace all the aggchain data from
24// the Certificate and API
25// NOTE: This is temporary to have minimal backward compatibility
26impl TryFrom<AggchainData> for global::Payload {
27    type Error = AggchainDataError;
28    fn try_from(value: AggchainData) -> Result<Self, Self::Error> {
29        Ok(match value {
30            AggchainData::ECDSA { signature } => global::Payload::LegacyEcdsa { signature },
31            AggchainData::Generic {
32                proof,
33                aggchain_params,
34                signature,
35                public_values,
36            } => global::Payload::MultisigAndAggchainProof {
37                aggchain_proof: aggchain_proof::Payload {
38                    proof,
39                    aggchain_params,
40                    public_values,
41                },
42                multisig: multisig::Payload {
43                    signatures: vec![Some(*signature.ok_or(AggchainDataError::MissingSignature)?)],
44                },
45            },
46            AggchainData::MultisigOnly { multisig } => {
47                global::Payload::MultisigOnly(multisig.into())
48            }
49            AggchainData::MultisigAndAggchainProof {
50                multisig,
51                aggchain_proof:
52                    agglayer_interop_types::aggchain_proof::AggchainProof {
53                        proof,
54                        aggchain_params,
55                        public_values,
56                    },
57            } => global::Payload::MultisigAndAggchainProof {
58                multisig: multisig.into(),
59                aggchain_proof: aggchain_proof::Payload {
60                    proof,
61                    aggchain_params,
62                    public_values,
63                },
64            },
65        })
66    }
67}