Skip to main content

wavs_types/
aggregator_types.rs

1use layer_climb_address::{CosmosAddr, EvmAddr};
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4
5use crate::{ChainKey, Duration, EventId, Submission};
6
7#[derive(
8    Hash, Serialize, Deserialize, Clone, Debug, PartialEq, Eq, bincode::Encode, bincode::Decode,
9)]
10pub struct QuorumQueueId {
11    pub event_id: EventId,
12    pub action: SubmitAction,
13}
14
15impl QuorumQueueId {
16    pub fn to_bytes(&self) -> Result<Vec<u8>, bincode::error::EncodeError> {
17        bincode::encode_to_vec(self, bincode::config::standard())
18    }
19
20    pub fn from_bytes(bytes: &[u8]) -> Result<Self, bincode::error::DecodeError> {
21        Ok(bincode::borrow_decode_from_slice(bytes, bincode::config::standard())?.0)
22    }
23}
24
25#[derive(Serialize, Deserialize, Clone, Debug)]
26#[serde(rename_all = "snake_case")]
27pub enum QuorumQueue {
28    /// Queue that has been processed and submitted on-chain
29    /// Includes timestamp (seconds since UNIX epoch) when it was burned
30    Burned(u64),
31    Active(Vec<Submission>),
32}
33
34impl Default for QuorumQueue {
35    fn default() -> Self {
36        QuorumQueue::Active(Vec::new())
37    }
38}
39
40#[derive(
41    Serialize,
42    Deserialize,
43    Clone,
44    Debug,
45    PartialEq,
46    Eq,
47    Hash,
48    PartialOrd,
49    Ord,
50    bincode::Encode,
51    bincode::Decode,
52    ToSchema,
53)]
54pub enum SubmitAction {
55    Evm(EvmSubmitAction),
56    Cosmos(CosmosSubmitAction),
57}
58
59impl SubmitAction {
60    pub fn chain(&self) -> &ChainKey {
61        match self {
62            SubmitAction::Evm(action) => &action.chain,
63            SubmitAction::Cosmos(action) => &action.chain,
64        }
65    }
66}
67
68#[derive(
69    Serialize,
70    Deserialize,
71    Clone,
72    Debug,
73    PartialEq,
74    Eq,
75    Hash,
76    PartialOrd,
77    Ord,
78    bincode::Encode,
79    bincode::Decode,
80    ToSchema,
81)]
82pub struct EvmSubmitAction {
83    pub chain: ChainKey,
84    // using EvmAddr from climb instead of alloy::primitives::Address for bincode support
85    pub address: EvmAddr,
86    pub gas_price: Option<u128>,
87}
88
89#[derive(
90    Serialize,
91    Deserialize,
92    Clone,
93    Debug,
94    PartialEq,
95    Eq,
96    Hash,
97    PartialOrd,
98    Ord,
99    bincode::Encode,
100    bincode::Decode,
101    ToSchema,
102)]
103pub struct CosmosSubmitAction {
104    pub chain: ChainKey,
105    pub address: CosmosAddr,
106    pub gas_price: Option<u128>,
107}
108
109#[derive(
110    Serialize,
111    Deserialize,
112    Clone,
113    Debug,
114    PartialEq,
115    Eq,
116    Hash,
117    bincode::Encode,
118    bincode::Decode,
119    ToSchema,
120)]
121pub struct TimerAction {
122    pub delay: Duration,
123}
124
125#[derive(
126    Serialize,
127    Deserialize,
128    Clone,
129    Debug,
130    PartialEq,
131    Eq,
132    Hash,
133    bincode::Encode,
134    bincode::Decode,
135    ToSchema,
136)]
137pub enum AggregatorAction {
138    Submit(SubmitAction),
139    Timer(TimerAction),
140}