pythnet_sdk/
wormhole.rs

1//! This module provides Wormhole primitives.
2//!
3//! Wormhole does not provide an SDK for working with Solana versions of Wormhole related types, so
4//! we clone the definitions from the Solana contracts here and adapt them to Pyth purposes. This
5//! allows us to emit and parse messages through Wormhole.
6use {
7    crate::Pubkey,
8    borsh::{
9        BorshDeserialize,
10        BorshSerialize,
11    },
12    serde::{
13        Deserialize,
14        Serialize,
15    },
16    std::{
17        io::{
18            // Error,
19            // ErrorKind::InvalidData,
20            Write,
21        },
22        ops::{
23            Deref,
24            DerefMut,
25        },
26    },
27};
28
29#[repr(transparent)]
30#[derive(Default, PartialEq, Debug)]
31pub struct PostedMessageUnreliableData {
32    pub message: MessageData,
33}
34
35#[derive(
36    Debug, Default, BorshSerialize, BorshDeserialize, Clone, Serialize, Deserialize, PartialEq,
37)]
38pub struct MessageData {
39    pub vaa_version:           u8,
40    pub consistency_level:     u8,
41    pub vaa_time:              u32,
42    pub vaa_signature_account: Pubkey,
43    pub submission_time:       u32,
44    pub nonce:                 u32,
45    pub sequence:              u64,
46    pub emitter_chain:         u16,
47    pub emitter_address:       [u8; 32],
48    pub payload:               Vec<u8>,
49}
50
51impl BorshSerialize for PostedMessageUnreliableData {
52    fn serialize<W: Write>(&self, writer: &mut W) -> std::io::Result<()> {
53        writer.write_all(b"msu")?;
54        BorshSerialize::serialize(&self.message, writer)
55    }
56}
57
58// impl BorshDeserialize for PostedMessageUnreliableData {
59//     fn deserialize_reader<R: std::io::prelude::Read>(reader: &mut R) -> std::io::Result<Self> {
60//         let mut magic = [0u8; 3];
61//         reader.read_exact(&mut magic)?;
62
63//         let expected = b"msu";
64//         if &magic != expected {
65//             return Err(Error::new(
66//                 InvalidData,
67//                 format!("Magic mismatch. Expected {expected:?} but got {magic:?}"),
68//             ));
69//         };
70//         Ok(PostedMessageUnreliableData {
71//             message: <MessageData as BorshDeserialize>::deserialize_reader(reader)?,
72//         })
73//     }
74// }
75
76impl Deref for PostedMessageUnreliableData {
77    type Target = MessageData;
78    fn deref(&self) -> &Self::Target {
79        &self.message
80    }
81}
82
83impl DerefMut for PostedMessageUnreliableData {
84    fn deref_mut(&mut self) -> &mut Self::Target {
85        &mut self.message
86    }
87}
88
89impl Clone for PostedMessageUnreliableData {
90    fn clone(&self) -> Self {
91        PostedMessageUnreliableData {
92            message: self.message.clone(),
93        }
94    }
95}
96
97#[derive(Default, Clone, Copy, BorshDeserialize, BorshSerialize)]
98pub struct AccumulatorSequenceTracker {
99    pub sequence: u64,
100}
101
102// #[test]
103// fn test_borsh_roundtrip() {
104//     let post_message_unreliable_data = PostedMessageUnreliableData {
105//         message: MessageData {
106//             vaa_version:           1,
107//             consistency_level:     2,
108//             vaa_time:              3,
109//             vaa_signature_account: [4u8; 32],
110//             submission_time:       5,
111//             nonce:                 6,
112//             sequence:              7,
113//             emitter_chain:         8,
114//             emitter_address:       [9u8; 32],
115//             payload:               vec![10u8; 32],
116//         },
117//     };
118
119
120//     let encoded = borsh::to_vec(&post_message_unreliable_data).unwrap();
121
122//     let decoded = PostedMessageUnreliableData::try_from_slice(encoded.as_slice()).unwrap();
123//     assert_eq!(decoded, post_message_unreliable_data);
124// }