Skip to content

Commit f792e26

Browse files
committed
finishing first governance test
1 parent 35a333b commit f792e26

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ mod test {
4242
Ok(get_total_fee(total_num_updates))
4343
}
4444

45+
#[cfg(test)]
4546
fn get_total_fee(total_num_updates: u64) -> U256 {
4647
U256::from(total_num_updates).saturating_mul(SINGLE_UPDATE_FEE_IN_WEI)
4748
+ TRANSACTION_FEE_IN_WEI

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ mod error;
99
mod governance_structs;
1010
#[cfg(test)]
1111
mod integration_tests;
12+
#[cfg(test)]
13+
mod pyth_governance_test;
1214
mod structs;
1315
#[cfg(test)]
1416
mod test_data;
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#[cfg(test)]
2+
mod test {
3+
use crate::error::PythReceiverError;
4+
use crate::test_data::*;
5+
use crate::PythReceiver;
6+
use alloy_primitives::{Address, U256};
7+
use mock_instant::global::MockClock;
8+
use motsu::prelude::*;
9+
use pythnet_sdk::wire::v1::{AccumulatorUpdateData, Proof};
10+
use std::time::Duration;
11+
use hex::FromHex;
12+
use wormhole_contract::WormholeContract;
13+
14+
const PYTHNET_CHAIN_ID: u16 = 26;
15+
const PYTHNET_EMITTER_ADDRESS: [u8; 32] = [
16+
0xe1, 0x01, 0xfa, 0xed, 0xac, 0x58, 0x51, 0xe3, 0x2b, 0x9b, 0x23, 0xb5, 0xf9, 0x41, 0x1a,
17+
0x8c, 0x2b, 0xac, 0x4a, 0xae, 0x3e, 0xd4, 0xdd, 0x7b, 0x81, 0x1d, 0xd1, 0xa7, 0x2e, 0xa4,
18+
0xaa, 0x71,
19+
];
20+
21+
const CHAIN_ID: u16 = 60051;
22+
const GOVERNANCE_CONTRACT: U256 = U256::from_limbs([4, 0, 0, 0]);
23+
24+
const SINGLE_UPDATE_FEE_IN_WEI: U256 = U256::from_limbs([100, 0, 0, 0]);
25+
const TRANSACTION_FEE_IN_WEI: U256 = U256::from_limbs([32, 0, 0, 0]);
26+
27+
const TEST_SIGNER1: Address = Address::from_slice(&Vec::from_hex("beFA429d57cD18b7F8A4d91A2da9AB4AF05d0FBe").expect("Invalid hex for TEST_SIGNER1"));
28+
const TEST_SIGNER2: Address = Address::from_slice(&Vec::from_hex("4ba0C2db9A26208b3bB1a50B01b16941c10D76db").expect("Invalid hex for TEST_SIGNER2"));
29+
const GOVERNANCE_CHAIN_ID: u16 = 1;
30+
const GOVERNANCE_EMITTER: [u8; 32] = {
31+
let v = Vec::from_hex("0000000000000000000000000000000000000000000000000000000000000011").expect("Invalid hex for GOVERNANCE_EMITTER");
32+
let mut arr = [0u8; 32];
33+
arr.copy_from_slice(&v);
34+
arr
35+
};
36+
const TEST_PYTH2_WORMHOLE_CHAIN_ID: u16 = 1;
37+
const TEST_PYTH2_WORMHOLE_EMITTER: [u8; 32] = {
38+
let v = Vec::from_hex("71f8dcb863d176e2c420ad6610cf687359612b6fb392e0642b0ca6b1f186aa3b").expect("Invalid hex for TEST_PYTH2_WORMHOLE_EMITTER");
39+
let mut arr = [0u8; 32];
40+
arr.copy_from_slice(&v);
41+
arr
42+
};
43+
const TARGET_CHAIN_ID: u16 = 2;
44+
45+
#[cfg(test)]
46+
fn pyth_wormhole_init(
47+
pyth_contract: &Contract<PythReceiver>,
48+
wormhole_contract: &Contract<WormholeContract>,
49+
alice: &Address,
50+
) {
51+
let guardians = current_guardians();
52+
let governance_contract =
53+
Address::from_slice(&GOVERNANCE_CONTRACT.to_be_bytes::<32>()[12..32]);
54+
wormhole_contract
55+
.sender(*alice)
56+
.initialize(
57+
guardians,
58+
4,
59+
CHAIN_ID,
60+
GOVERNANCE_CHAIN_ID,
61+
governance_contract,
62+
)
63+
.unwrap();
64+
65+
let single_update_fee = SINGLE_UPDATE_FEE_IN_WEI;
66+
let valid_time_period = U256::from(3600u64);
67+
68+
let data_source_chain_ids = vec![PYTHNET_CHAIN_ID];
69+
let data_source_emitter_addresses = vec![PYTHNET_EMITTER_ADDRESS];
70+
71+
let governance_chain_id = 1u16;
72+
let governance_initial_sequence = 0u64;
73+
74+
pyth_contract.sender(*alice).initialize(
75+
wormhole_contract.address(),
76+
single_update_fee,
77+
valid_time_period,
78+
data_source_chain_ids,
79+
data_source_emitter_addresses,
80+
governance_chain_id,
81+
GOVERNANCE_EMITTER,
82+
governance_initial_sequence,
83+
);
84+
}
85+
86+
#[motsu::test]
87+
fn test_set_data_sources(
88+
pyth_contract: Contract<PythReceiver>,
89+
wormhole_contract: Contract<WormholeContract>,
90+
alice: Address,
91+
) {
92+
pyth_wormhole_init(&pyth_contract, &wormhole_contract, &alice);
93+
94+
let old_data_sources = vec![PYTHNET_CHAIN_ID];
95+
96+
let hex_str = "01000000000100a53d7675143a514fa10756ef19e1281648aec03be2ea071c139f241839cb01206ce5c7f3673fc446a045cab2d4f97ef0de01de70269ab2678bba76b41c3a60ce010000000100000000000100000000000000000000000000000000000000000000000000000000000000110000000000000001005054474d010200020100010000000000000000000000000000000000000000000000000000000000001111";
97+
let bytes = Vec::from_hex(hex_str).expect("Invalid hex string");
98+
99+
let result = pyth_contract.sender(alice).execute_governance_instruction(bytes);
100+
assert!(result.is_ok());
101+
}
102+
103+
}

0 commit comments

Comments
 (0)