pod_types/consensus/
attestation_metadata.rs

1use crate::{Hash, Hashable, Timestamp};
2use alloy_primitives::Address;
3use alloy_sol_types::SolStruct;
4use serde::{Deserialize, Serialize};
5use std::collections::BTreeMap;
6
7mod sol {
8    alloy_sol_types::sol! {
9        struct ContractSeq {
10            address addr;
11            uint64  seq;
12        }
13
14        struct AttestationMetadata712 {
15            uint128 timestamp_micros;
16            uint64  global_sequence;
17            ContractSeq[] contract_sequences;
18        }
19    }
20}
21
22use sol::{AttestationMetadata712, ContractSeq};
23
24#[derive(Clone, Debug, Serialize, Deserialize)]
25#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
26pub struct AttestationMetadata {
27    pub timestamp: Timestamp,
28    pub global_sequence: u64,
29    pub contract_sequences: BTreeMap<Address, u64>,
30}
31
32impl Hashable for AttestationMetadata {
33    fn hash_custom(&self) -> Hash {
34        let seqs: Vec<ContractSeq> = self
35            .contract_sequences
36            .iter()
37            .map(|(addr, seq)| ContractSeq {
38                addr: *addr,
39                seq: *seq,
40            })
41            .collect();
42
43        let typed = AttestationMetadata712 {
44            timestamp_micros: self.timestamp.as_micros(),
45            global_sequence: self.global_sequence,
46            contract_sequences: seqs,
47        };
48
49        typed.eip712_signing_hash(&alloy_sol_types::eip712_domain! {
50            name: "attestation_metadata",
51            version: "1",
52            chain_id: 0x50d,
53        })
54    }
55}