1#![deny(warnings)]
12#![deny(unused_results)]
13
14use std::fmt;
15
16use serde::{Deserialize, Serialize};
17
18pub mod accountant;
19pub mod accountant_modification;
20mod arraystring;
21pub mod core;
22pub mod ibc_receiver;
23pub mod ibc_translator;
24pub mod nft;
25pub mod ntt_accountant;
26pub mod relayer;
27mod serde_array;
28pub mod token;
29pub mod vaa;
30
31pub use vaa::Vaa;
32pub use wormhole_supported_chains::Chain;
33
34pub const GOVERNANCE_EMITTER: Address = Address([
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
39]);
40
41#[derive(
42 Serialize, Deserialize, Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash,
43)]
44pub struct GuardianAddress(pub [u8; 20]);
45
46#[derive(
49 Serialize, Deserialize, Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash,
50)]
51pub struct Address(pub [u8; 32]);
52
53impl fmt::Display for Address {
54 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55 for b in self.0 {
56 write!(f, "{b:02x}")?;
57 }
58
59 Ok(())
60 }
61}
62
63#[derive(
65 Serialize, Deserialize, Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash,
66)]
67pub struct Amount(pub [u8; 32]);
68
69#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
71pub struct GuardianSetInfo {
72 pub addresses: Vec<GuardianAddress>,
74}
75
76impl GuardianSetInfo {
77 pub fn quorum(&self) -> usize {
78 (self.addresses.len() * 2) / 3 + 1
79 }
80}
81
82#[cfg(test)]
83mod test {
84 use super::*;
85
86 #[test]
87 fn quorum() {
88 let tests = [
89 (0, 1),
90 (1, 1),
91 (2, 2),
92 (3, 3),
93 (4, 3),
94 (5, 4),
95 (6, 5),
96 (7, 5),
97 (8, 6),
98 (9, 7),
99 (10, 7),
100 (11, 8),
101 (12, 9),
102 (13, 9),
103 (14, 10),
104 (15, 11),
105 (16, 11),
106 (17, 12),
107 (18, 13),
108 (19, 13),
109 (50, 34),
110 (100, 67),
111 (1000, 667),
112 ];
113
114 for (count, quorum) in tests {
115 let gs = GuardianSetInfo {
116 addresses: vec![Default::default(); count],
117 };
118
119 assert_eq!(quorum, gs.quorum());
120 }
121 }
122}