Skip to content

Commit b3ddc02

Browse files
feat: convert DataSource structs to use proper serde serialization
- Replace manual byteorder::BigEndian with pythnet_sdk::wire::to_vec - Create SerializableDataSource struct with #[derive(Serialize)] - Use pythnet_sdk wire format for big-endian serialization - Maintain exact same 34-byte layout (u16 big-endian + 32 bytes) - Add proper error handling for serialization failures - Verify compatibility with original implementation via test Link to Devin run: https://app.devin.ai/sessions/36a1fbc73ac54482bb564c88fe1ecdae Requested by: @ayushboss Co-Authored-By: [email protected] <[email protected]>
1 parent 28598b9 commit b3ddc02

File tree

1 file changed

+34
-16
lines changed
  • target_chains/stylus/contracts/pyth-receiver/src

1 file changed

+34
-16
lines changed

target_chains/stylus/contracts/pyth-receiver/src/structs.rs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use alloc::vec::Vec;
2-
use byteorder::{BigEndian, ByteOrder};
1+
use alloc::{vec::Vec, boxed::Box, format};
2+
use pythnet_sdk::wire::to_vec;
3+
use serde::Serialize;
34
use stylus_sdk::{
45
prelude::*,
56
storage::{
@@ -9,13 +10,27 @@ use stylus_sdk::{
910
use stylus_sdk::alloy_primitives::{U16, FixedBytes,U64, I32, I64, B256, U256, keccak256};
1011
use pythnet_sdk::messages::PriceFeedMessage;
1112

12-
fn serialize_data_source_to_bytes(chain_id: u16, emitter_address: &[u8; 32]) -> [u8; 34] {
13-
let mut bytes = [0u8; 34];
14-
15-
BigEndian::write_u16(&mut bytes[0..2], chain_id);
16-
bytes[2..].copy_from_slice(emitter_address);
13+
#[derive(Serialize)]
14+
struct SerializableDataSource {
15+
chain_id: u16,
16+
#[serde(with = "pythnet_sdk::wire::array")]
17+
emitter_address: [u8; 32],
18+
}
1719

18-
bytes
20+
fn serialize_data_source_to_bytes(chain_id: u16, emitter_address: &[u8; 32]) -> Result<[u8; 34], Box<dyn core::error::Error>> {
21+
let data_source = SerializableDataSource {
22+
chain_id,
23+
emitter_address: *emitter_address,
24+
};
25+
26+
let bytes = to_vec::<_, byteorder::BE>(&data_source)?;
27+
if bytes.len() != 34 {
28+
return Err(format!("Expected 34 bytes, got {}", bytes.len()).into());
29+
}
30+
31+
let mut result = [0u8; 34];
32+
result.copy_from_slice(&bytes);
33+
Ok(result)
1934
}
2035

2136
#[derive(Debug)]
@@ -35,9 +50,10 @@ impl StorageKey for DataSourceStorage {
3550
fn to_slot(&self, root: B256) -> U256 {
3651
let chain_id: u16 = self.chain_id.get().to::<u16>();
3752
let emitter_address = self.emitter_address.get();
38-
39-
let bytes = serialize_data_source_to_bytes(chain_id, emitter_address.as_slice().try_into().unwrap());
40-
53+
54+
let bytes = serialize_data_source_to_bytes(chain_id, emitter_address.as_slice().try_into().unwrap())
55+
.expect("Failed to serialize DataSource");
56+
4157
keccak256(bytes).to_slot(root)
4258
}
4359
}
@@ -46,9 +62,10 @@ impl StorageKey for DataSource {
4662
fn to_slot(&self, root: B256) -> U256 {
4763
let chain_id: u16 = self.chain_id.to::<u16>();
4864
let emitter_address: [u8; 32] = self.emitter_address.as_slice().try_into().unwrap();
49-
50-
let bytes = serialize_data_source_to_bytes(chain_id, &emitter_address);
51-
65+
66+
let bytes = serialize_data_source_to_bytes(chain_id, &emitter_address)
67+
.expect("Failed to serialize DataSource");
68+
5269
keccak256(bytes).to_slot(root)
5370
}
5471
}
@@ -124,8 +141,9 @@ mod tests {
124141
expected_bytes[0..2].copy_from_slice(&chain_id.to_be_bytes());
125142
expected_bytes[2..].copy_from_slice(&emitter_address);
126143

127-
let actual_bytes = serialize_data_source_to_bytes(chain_id, &emitter_address);
128-
144+
let actual_bytes = serialize_data_source_to_bytes(chain_id, &emitter_address)
145+
.expect("Serialization should succeed");
146+
129147
assert_eq!(actual_bytes, expected_bytes, "Serialization should produce identical bytes");
130148
}
131149
}

0 commit comments

Comments
 (0)