agglayer_types/aggchain_data/
global.rs1use agglayer_primitives::{Address, Signature};
21use pessimistic_proof::core::{self, MultisigError};
22use serde::{Deserialize, Serialize};
23use thiserror::Error;
24
25use crate::aggchain_data::{aggchain_proof, multisig, PayloadWithCtx};
26
27#[derive(Clone, Debug, strum_macros::Display)]
31pub enum Payload {
32 LegacyEcdsa {
33 signature: Signature,
35 },
36 MultisigOnly(multisig::Payload),
37 MultisigAndAggchainProof {
38 multisig: multisig::Payload,
39 aggchain_proof: aggchain_proof::Payload,
40 },
41}
42
43#[derive(Clone, Debug, strum_macros::Display)]
45pub enum Context {
46 LegacyEcdsa {
47 signer: Address,
49 },
50 MultisigOnly(multisig::Ctx),
51 MultisigAndAggchainProof {
52 multisig_ctx: multisig::Ctx,
53 aggchain_proof_ctx: aggchain_proof::Context,
54 },
55}
56
57#[derive(Clone, Debug, Error, Deserialize, Serialize, Eq, PartialEq)]
58pub enum AggchainDataError {
59 #[error("Invalid variant: {0}")]
60 InvalidVariant(String),
61
62 #[error("Invalid multisig: {0}")]
63 InvalidMultisig(#[source] MultisigError),
64
65 #[error("Aggchain proof comes without its ECDSA")]
66 MissingSignature,
67}
68
69impl TryInto<core::AggchainData> for PayloadWithCtx<Payload, Context> {
71 type Error = AggchainDataError;
72
73 fn try_into(self) -> Result<core::AggchainData, Self::Error> {
74 let PayloadWithCtx(payload, ctx) = self;
75 match (payload, ctx) {
76 (Payload::LegacyEcdsa { signature }, Context::LegacyEcdsa { signer }) => {
77 Ok(core::AggchainData::LegacyEcdsa { signer, signature })
78 }
79 (Payload::MultisigOnly(payload), Context::MultisigOnly(ctx)) => {
80 let prehash = ctx.prehash;
81 let multisig = core::MultiSignature::from(PayloadWithCtx(payload, ctx));
82 multisig
83 .verify(prehash)
84 .map_err(AggchainDataError::InvalidMultisig)?;
85 Ok(core::AggchainData::MultisigOnly(multisig))
86 }
87 (
88 Payload::MultisigAndAggchainProof {
89 multisig,
90 aggchain_proof,
91 },
92 Context::MultisigAndAggchainProof {
93 multisig_ctx,
94 aggchain_proof_ctx,
95 },
96 ) => {
97 let prehash = multisig_ctx.prehash;
98 let multisig = core::MultiSignature::from(PayloadWithCtx(multisig, multisig_ctx));
99 multisig
100 .verify(prehash)
101 .map_err(AggchainDataError::InvalidMultisig)?;
102 Ok(core::AggchainData::MultisigAndAggchainProof {
103 multisig,
104 aggchain_proof: PayloadWithCtx(aggchain_proof, aggchain_proof_ctx).into(),
105 })
106 }
107 (payload, context) => Err(AggchainDataError::InvalidVariant(format!(
108 "payload: {payload}, context: {context}"
109 ))),
110 }
111 }
112}