pod_types/consensus/
attestation_metadata.rs1use 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}