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// }