wormhole_sdk/
lib.rs

1//! The `core` module provides all the pure Rust Wormhole primitives.
2//!
3//! This crate provides chain-agnostic types from Wormhole for consumption in on-chain contracts
4//! and within other chain-specific Wormhole Rust SDK's. It includes:
5//!
6//! - Constants containing known network data/addresses.
7//! - Parsers for VAA's and Payloads.
8//! - Data types for Wormhole primitives such as GuardianSets and signatures.
9//! - Verification Primitives for securely checking payloads.
10
11#![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
34/// The `GOVERNANCE_EMITTER` is a special address Wormhole guardians trust to observe governance
35/// actions from. The value is "0000000000000000000000000000000000000000000000000000000000000004".
36pub 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/// Wormhole specifies addresses as 32 bytes. Addresses that are shorter, for example 20 byte
47/// Ethereum addresses, are left zero padded to 32.
48#[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/// Wormhole specifies an amount as a uint256 encoded in big-endian order.
64#[derive(
65    Serialize, Deserialize, Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash,
66)]
67pub struct Amount(pub [u8; 32]);
68
69/// A `GuardianSet` is a versioned set of keys that can sign Wormhole messages.
70#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
71pub struct GuardianSetInfo {
72    /// The set of guardians public keys, in Ethereum's compressed format.
73    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}