Skip to content

Commit f5a9d45

Browse files
committed
wormhole integration with tests works + type parsing in pyth contract works
1 parent 31d7747 commit f5a9d45

File tree

4 files changed

+11
-271
lines changed

4 files changed

+11
-271
lines changed

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

Lines changed: 3 additions & 222 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#[cfg(test)]
33
mod test {
44
use crate::PythReceiver;
5-
use crate::error::PythReceiverError;
65
use crate::test_data;
76
use alloy_primitives::{address, U256, Address};
87
use stylus_sdk::testing::TestVM;
@@ -59,224 +58,6 @@ mod test {
5958
contract
6059
}
6160

62-
fn create_valid_update_data() -> Vec<u8> {
63-
test_data::good_update1()
64-
}
65-
66-
fn create_invalid_magic_data() -> Vec<u8> {
67-
let mut data = Vec::new();
68-
data.extend_from_slice(&[0xFF, 0xFF, 0xFF, 0xFF]); // Invalid magic
69-
data.extend_from_slice(&[0u8; 100]);
70-
data
71-
}
72-
73-
fn create_short_data() -> Vec<u8> {
74-
vec![0u8; 2] // Too short for magic header
75-
}
76-
77-
fn create_invalid_vaa_data() -> Vec<u8> {
78-
let mut data = Vec::new();
79-
data.extend_from_slice(PYTHNET_ACCUMULATOR_UPDATE_MAGIC);
80-
data.extend_from_slice(&[0u8; 50]);
81-
data
82-
}
83-
84-
fn create_invalid_merkle_data() -> Vec<u8> {
85-
let mut data = Vec::new();
86-
data.extend_from_slice(PYTHNET_ACCUMULATOR_UPDATE_MAGIC);
87-
data.extend_from_slice(&[1u8; 80]);
88-
data
89-
}
90-
91-
// #[test]
92-
// fn test_initialize() {
93-
// let vm = TestVM::default();
94-
// let mut contract = PythReceiver::from(&vm);
95-
96-
// let wormhole_address = address!("0x3F38404A2e3Cb949bcDfA19a5C3bDf3fE375fEb0");
97-
// let single_update_fee = U256::from(100u64);
98-
// let valid_time_period = U256::from(3600u64);
99-
100-
// let data_source_chain_ids = vec![PYTHNET_CHAIN_ID];
101-
// let data_source_emitter_addresses = vec![PYTHNET_EMITTER_ADDRESS];
102-
103-
// let governance_chain_id = 1u16;
104-
// let governance_emitter_address = [3u8; 32];
105-
// let governance_initial_sequence = 0u64;
106-
// let data = vec![];
107-
108-
// contract.initialize(
109-
// wormhole_address,
110-
// single_update_fee,
111-
// valid_time_period,
112-
// data_source_chain_ids.clone(),
113-
// data_source_emitter_addresses.clone(),
114-
// governance_chain_id,
115-
// governance_emitter_address,
116-
// governance_initial_sequence,
117-
// data,
118-
// );
119-
120-
// let fee = contract.get_update_fee(vec![]);
121-
// assert_eq!(fee, U256::from(0u8)); // Fee calculation not implemented yet
122-
123-
// let twap_fee = contract.get_twap_update_fee(vec![]);
124-
// assert_eq!(twap_fee, U256::from(0u8)); // Fee calculation not implemented yet
125-
126-
// let test_price_id = TEST_PRICE_ID;
127-
// let price_result = contract.get_price_unsafe(test_price_id);
128-
// assert!(price_result.is_err());
129-
// assert!(matches!(price_result.unwrap_err(), PythReceiverError::PriceUnavailable));
130-
// }
131-
132-
// #[test]
133-
// fn test_update_new_price_feed() {
134-
// let vm = TestVM::default();
135-
// let mut contract = initialize_test_contract(&vm);
136-
137-
// let test_price_id = TEST_PRICE_ID;
138-
139-
// let update_data = test_data::good_update1();
140-
// let _result = contract.update_price_feeds(update_data);
141-
142-
143-
// let price_result = contract.get_price_unsafe(test_price_id);
144-
// assert!(price_result.is_err());
145-
// assert!(matches!(price_result.unwrap_err(), PythReceiverError::PriceUnavailable));
146-
// }
147-
148-
// #[test]
149-
// fn test_update_existing_price_feed() {
150-
// let vm = TestVM::default();
151-
// let mut contract = initialize_test_contract(&vm);
152-
153-
// let _test_price_id = TEST_PRICE_ID;
154-
155-
// let update_data1 = create_valid_update_data();
156-
// let _result1 = contract.update_price_feeds(update_data1);
157-
158-
// let update_data2 = create_valid_update_data();
159-
// let _result2 = contract.update_price_feeds(update_data2);
160-
161-
// }
162-
163-
// #[test]
164-
// fn test_invalid_magic_header() {
165-
// let vm = TestVM::default();
166-
// let mut contract = initialize_test_contract(&vm);
167-
168-
// let invalid_data = create_invalid_magic_data();
169-
// let result = contract.update_price_feeds(invalid_data);
170-
171-
// assert!(result.is_err());
172-
// assert!(matches!(result.unwrap_err(), PythReceiverError::InvalidAccumulatorMessage));
173-
// }
174-
175-
// #[test]
176-
// fn test_invalid_wire_format() {
177-
// let vm = TestVM::default();
178-
// let mut contract = initialize_test_contract(&vm);
179-
180-
// let short_data = create_short_data();
181-
// let result = contract.update_price_feeds(short_data);
182-
183-
// assert!(result.is_err());
184-
// assert!(matches!(result.unwrap_err(), PythReceiverError::InvalidUpdateData));
185-
// }
186-
187-
// #[test]
188-
// fn test_invalid_wormhole_vaa() {
189-
// let vm = TestVM::default();
190-
// let mut contract = initialize_test_contract(&vm);
191-
192-
// let invalid_vaa_data = create_invalid_vaa_data();
193-
// let result = contract.update_price_feeds(invalid_vaa_data);
194-
195-
// assert!(result.is_err());
196-
// }
197-
198-
// #[test]
199-
// fn test_invalid_merkle_proof() {
200-
// let vm = TestVM::default();
201-
// let mut contract = initialize_test_contract(&vm);
202-
203-
// let invalid_merkle_data = create_invalid_merkle_data();
204-
// let result = contract.update_price_feeds(invalid_merkle_data);
205-
206-
// assert!(result.is_err());
207-
// }
208-
209-
// #[test]
210-
// fn test_stale_price_rejection() {
211-
// let vm = TestVM::default();
212-
// let contract = initialize_test_contract(&vm);
213-
214-
// let test_price_id = TEST_PRICE_ID;
215-
// let price_result = contract.get_price_unsafe(test_price_id);
216-
// assert!(price_result.is_err());
217-
// assert!(matches!(price_result.unwrap_err(), PythReceiverError::PriceUnavailable));
218-
219-
// }
220-
221-
// #[test]
222-
// fn test_get_price_no_older_than_error() {
223-
// let vm = TestVM::default();
224-
// let contract = initialize_test_contract(&vm);
225-
226-
// let test_price_id = TEST_PRICE_ID;
227-
// let result = contract.get_price_no_older_than(test_price_id, 1);
228-
229-
// assert!(result.is_err());
230-
// assert!(matches!(result.unwrap_err(), PythReceiverError::PriceUnavailable));
231-
232-
// }
233-
234-
// #[test]
235-
// fn test_contract_state_after_init() {
236-
// let vm = TestVM::default();
237-
// let contract = initialize_test_contract(&vm);
238-
239-
// let fee = contract.get_update_fee(vec![]);
240-
// assert_eq!(fee, U256::from(0u8));
241-
242-
// let random_price_id = TEST_PRICE_ID;
243-
// let price_result = contract.get_price_unsafe(random_price_id);
244-
// assert!(price_result.is_err());
245-
246-
// let price_no_older_result = contract.get_price_no_older_than(random_price_id, 3600);
247-
// assert!(price_no_older_result.is_err());
248-
// }
249-
250-
// #[test]
251-
// fn test_successful_price_update_and_retrieval() {
252-
// let vm = TestVM::default();
253-
// let contract = initialize_test_contract(&vm);
254-
255-
// let initial_result = contract.get_price_unsafe(TEST_PRICE_ID);
256-
// assert!(initial_result.is_err());
257-
// assert!(matches!(initial_result.unwrap_err(), PythReceiverError::PriceUnavailable));
258-
259-
// }
260-
261-
// #[test]
262-
// fn test_realistic_test_data_functions() {
263-
// let good_update_data = test_data::good_update1();
264-
// assert!(!good_update_data.is_empty());
265-
// assert!(good_update_data.len() > 100);
266-
267-
// let vaa_data = test_data::good_vm1();
268-
// assert!(!vaa_data.is_empty());
269-
// assert!(vaa_data.len() > 50);
270-
271-
// let price_update_data = test_data::test_price_update1();
272-
// assert!(!price_update_data.is_empty());
273-
// assert!(price_update_data.len() > 100);
274-
275-
// let price_update2_data = test_data::test_price_update2();
276-
// assert!(!price_update2_data.is_empty());
277-
// assert!(price_update2_data.len() > 100);
278-
// }
279-
28061
#[cfg(test)]
28162
fn current_guardians() -> Vec<Address> {
28263
vec![
@@ -351,10 +132,10 @@ mod test {
351132
data,
352133
);
353134

354-
// let update_data = test_data::good_update1();
135+
let update_data = test_data::good_update1();
355136

356-
// let result = pyth_contract.sender(alice).update_price_feeds(update_data);
357-
// assert!(result.is_ok());
137+
let result = pyth_contract.sender(alice).update_price_feeds(update_data);
138+
assert!(result.is_ok());
358139

359140
// let price_result = pyth_contract.sender(alice).get_price_unsafe(TEST_PRICE_ID);
360141
// assert!(price_result.is_ok());

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ impl PythReceiver {
163163
// // dummy implementation
164164
// }
165165

166+
166167
// fn update_price_feeds_internal(&mut self, update_data: Vec<u8>, price_ids: Vec<Address>, min_publish_time: u64, max_publish_time: u64, unique: bool) -> Result<(), PythReceiverError> {
167168
fn update_price_feeds_internal(&mut self, update_data: Vec<u8>) -> Result<(), PythReceiverError> {
168169
let update_data_array: &[u8] = &update_data;
@@ -184,8 +185,8 @@ impl PythReceiver {
184185
Proof::WormholeMerkle { vaa, updates } => {
185186
let wormhole: IWormholeContract = IWormholeContract::new(self.wormhole.get());
186187
let config = Call::new();
187-
let parsed_vaa = wormhole.parse_and_verify_vm(config, Vec::from(vaa)).map_err(|_| PythReceiverError::InvalidWormholeMessage).unwrap();
188-
let vaa = Vaa::read(&mut parsed_vaa.as_slice()).unwrap();
188+
wormhole.parse_and_verify_vm(config, Vec::from(vaa.clone())).map_err(|_| PythReceiverError::InvalidWormholeMessage).unwrap();
189+
let vaa = Vaa::read(&mut Vec::from(vaa.clone()).as_slice()).unwrap();
189190

190191
let cur_emitter_address: &[u8; 32] = vaa.body.emitter_address.as_slice().try_into().expect("emitter address must be 32 bytes");
191192

@@ -302,4 +303,4 @@ fn parse_wormhole_proof(vaa: Vaa) -> Result<MerkleRoot<Keccak160>, PythReceiverE
302303
WormholePayload::Merkle(merkle_root) => merkle_root.root,
303304
});
304305
Ok(root)
305-
}
306+
}

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

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use alloy_primitives::U256;
2+
use hex::FromHex;
23

34
fn from_cairo_byte_array_data(data: &[U256], num_last_bytes: usize) -> Vec<u8> {
45
let mut result = Vec::new();
@@ -24,50 +25,9 @@ fn from_cairo_byte_array_data(data: &[U256], num_last_bytes: usize) -> Vec<u8> {
2425
}
2526

2627
pub fn good_update1() -> Vec<u8> {
27-
let bytes = [
28-
U256::from_str_radix("141887862745809943100717722154781668316147089807066324001213790862261653767", 10).unwrap(),
29-
U256::from_str_radix("451230040559159019530944948086670994623010697390864133264612902902585665886", 10).unwrap(),
30-
U256::from_str_radix("355897384610106978643111834734000274494997301794613218547634257521495150151", 10).unwrap(),
31-
U256::from_str_radix("140511063638834349363702006999356227863549404051701803148734324248522745879", 10).unwrap(),
32-
U256::from_str_radix("435849190784772134907557391544163070978531038970298390345939133663347953446", 10).unwrap(),
33-
U256::from_str_radix("416390591179833928094641114955594939466104495718036761707729297119441316151", 10).unwrap(),
34-
U256::from_str_radix("360454929416220920336539568461651500076647166763464050800345920693176904002", 10).unwrap(),
35-
U256::from_str_radix("316054999864337699543932294956493808847640383114707243342262764542081441331", 10).unwrap(),
36-
U256::from_str_radix("325277902980160684959962429721294603784343718796390808940252812862355246813", 10).unwrap(),
37-
U256::from_str_radix("43683235854839458868457367619068018785880460427473556950900276498953667", 10).unwrap(),
38-
U256::from_str_radix("448289429405712011882317781416869052550573589492688760675666957663813001522", 10).unwrap(),
39-
U256::from_str_radix("118081463902430977133121147164253483958565039026724621562859841189218059803", 10).unwrap(),
40-
U256::from_str_radix("194064310618695309465615383754562031677972810736048112738513050109934134235", 10).unwrap(),
41-
U256::from_str_radix("133901765334590923121691219814784557892214901646312752962904032795881821509", 10).unwrap(),
42-
U256::from_str_radix("404227501001709279944936006741063968912686453006275462577777397594240621266", 10).unwrap(),
43-
U256::from_str_radix("81649001731335394114026683805238949464016657447685509824621946636993704965", 10).unwrap(),
44-
U256::from_str_radix("32402065226491532148674904435794801976788068837745943243341272676331333141", 10).unwrap(),
45-
U256::from_str_radix("431262841416902409381606630149292665102873776020834630861578112749151562174", 10).unwrap(),
46-
U256::from_str_radix("6164523115980545628843981978797257048781800754033825701059814297149591186", 10).unwrap(),
47-
U256::from_str_radix("408761574582108996678203805090470134287794603493622537384530614829262728153", 10).unwrap(),
48-
U256::from_str_radix("185368533577943244707350150853170361880334596276529206938783888784867529821", 10).unwrap(),
49-
U256::from_str_radix("173578821500714074579643724957224629379984215847383417303110192934676518530", 10).unwrap(),
50-
U256::from_str_radix("90209855380378362490166376523380463998928070428866100240907090599465187835", 10).unwrap(),
51-
U256::from_str_radix("97758466908511588082569287391708453107999243934457382895073183209581711489", 10).unwrap(),
52-
U256::from_str_radix("132725011490528489913736834798247512772139171145730373610858422315799224432", 10).unwrap(),
53-
U256::from_str_radix("117123868005849140967825260063167768530251411611975150066586827543934313288", 10).unwrap(),
54-
U256::from_str_radix("408149062252618928234854115279677715692278734600386004492580987016428761675", 10).unwrap(),
55-
U256::from_str_radix("164529520317122600276020522906605877985809506451193373524142111430138855019", 10).unwrap(),
56-
U256::from_str_radix("444793051809958482843529748761971363435331354795896511243191618771787268378", 10).unwrap(),
57-
U256::from_str_radix("247660009137502548346315865368477795392972486141407800140910365553760622080", 10).unwrap(),
58-
U256::from_str_radix("3281582060272565111592312037403686940429019548922889497694300188", 10).unwrap(),
59-
U256::from_str_radix("93649805131515836129946966966350066506512123780266587069413066350925286142", 10).unwrap(),
60-
U256::from_str_radix("394112423559676785086098106350541172262729583743734966358666094809121292390", 10).unwrap(),
61-
U256::from_str_radix("35403101004688876764673991514113473446030702766599795822870037077688984558", 10).unwrap(),
62-
U256::from_str_radix("99366103604611980443183454746643823071419076016677225828619807954313149423", 10).unwrap(),
63-
U256::from_str_radix("10381657217606191031071521950784155484751645280452344547752823767622424055", 10).unwrap(),
64-
U256::from_str_radix("391045354044274401116419632681482293741435113770205621235865697077178955228", 10).unwrap(),
65-
U256::from_str_radix("311250087759201408758984550959714865999349469611700431708031036894849650573", 10).unwrap(),
66-
U256::from_str_radix("59953730895385399344628932835545900304309851622811198425230584225200786697", 10).unwrap(),
67-
U256::from_str_radix("226866843267230707879834616967256711063296411939069440476882347301771901839", 10).unwrap(),
68-
U256::from_str_radix("95752383404870925303422787", 10).unwrap(),
69-
];
70-
from_cairo_byte_array_data(&bytes, 11)
28+
let hex_str = "504e41550100000003b801000000040d0216f3809b6396fdb0708bc94515ddb96a3bc8fb1993916e74f522ab4c34a268836a0bb38786303b55cc40ecb50d18c92bf9fd61688a143f3d24a73a3f468e4ab0000365be4f3a330fe96bab246922d9fa4816a865dec40d7c522e37f7e3605673b8f52eb30a4dad7aee3e1ac4b21337b8831c6147ef6e359e843b307872e83b5c7fe80004b6f12766eb395d04bdb146b1b69a4b9a8831a9c9ea20ee841d55efe72c629aef17038b925584493af7882981260b09587d73b6463415f4e1f8fb0a2a2c959c8301065c18a776cf558e43494bf31dd26ac0e3aed07a01ca0063abcfca3736b892368e4bf8b957f2d2e83ff9eb3fa8f667ef97a5f48c286103f70fda4a72e077719a0200085896c930febfb864a8c292bde679092e386e53389cb2d26bd12ceed64d22c0cd27676dc5c46d3e3c5949abbce89d4cc5ec378cfbf9ab1b0c24cfeb3371df4864000a1c67e67adea9f8a71eee76765f1fe4c7d9539d21b62d0336513692897cc6acbe1c827599a1f8c73b7478e8d788443b4cfd4e373344ab1ac9f771c9c494124863000b7e08e1cc1291340e6ec7d1b04c6a9c63f74077a074ee68edf4f95cf24c9743620f8abc8213884c8e4848fb76ec319d365e0cdc746a6e534a4cb828e51719be79010c61a2fedeedf34e4c80624d80cb93e24bafe9f6d23339173004d84e61c2395bfb5f552e87b901beb192ba6f4fc905eae30317c52b8614071e08a265592f24e8de000de38d08612edc5ebc863ea5a96325cb991750a94ff0e50f86bc322cce81db7cd17cb4ed3703f7477eb111a9d881e1345f5b79d618814f31b46034196563ee6a18000e5b11510d585a2decaba0be9e71386865b6069061478f7254d7852d55116569eb426c385267e40264d16db08e0f1a9e2c44b7d1c926d3c3ba662b212572386483010fa1ad0278402104b146b6f4d1cf85ac4df961d24eea0c7948b700f9973596cad130abfff25feef37125ba38507f34308d967455651e7014e40264a0c6510d3af001101f2e4e70868d6c327c92229537f1ffa33e488da3140ccc086f8210b437b162190742bd01ad1cb495a93f20045b4bb47e1562fdd82a8a1548d87d788a492b17190111847f5095df3edefc58be0956aee19876e850516e132506fd67504afee3c8cf240f07fb607b3c8282a2e56dcad23959e6759bdf8ad345ba8150448da56ff34fcc016866baf800000000001ae101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71000000000880cea9014155575600000000000d8e5c8d0000271085e6ab1bb044f57c4cd6c1d32aa0a82a5032198301005500e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43000009f9828e420300000001284f2da6fffffff8000000006866baf8000000006866baf8000009f3b955a26000000001062cb8780c1283a49180b4986f0dec3c746d3daeb597887747b8f66a09876e1253a1ebb8a6bc4a5793daaa343db6057b82ec29715d7e1db0ffd6db523f7b80b03e3866ef5f5c80728801b92f5acecc28d8517e5615335d89c553f94b4370f3a20be0bc23e0fd401c4e5bd8bd32948a26233fc48f116428a490f087030ccfc442753e3074e2b9bbc1c61a009d86aaa200645c627a6b7f2f6597e34c60b14a58ef2583bcbb1d0e21b71a264fad2648ecc545031c7ed598772ffe875bf94a488389a49e6025e1b2a1f07ec598d0d9aa8ef7dd2733c8502c49d1d1323f1ae664e82e8a5e14978d52ab448ba9b1afc78f06c8cd17415a17";
29+
let bytes = Vec::from_hex(hex_str).expect("Invalid hex string");
30+
bytes
7131
}
7232

7333
pub fn good_vm1() -> Vec<u8> {

target_chains/stylus/contracts/wormhole/src/tests.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use super::*;
2-
31
#[cfg(all(test, feature = "std"))]
42
mod tests {
53
use super::*;

0 commit comments

Comments
 (0)