Skip to content

Commit 9c43c5d

Browse files
committed
set up framework for contract initialization (i.e. constructor) and update all price feeds
1 parent 1442303 commit 9c43c5d

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

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

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ mod structs;
99
mod error;
1010

1111
use alloc::vec::Vec;
12-
use stylus_sdk::{alloy_primitives::{U256, U64, I32, I64, FixedBytes, Bytes},
12+
use stylus_sdk::{alloy_primitives::{U16, U32, U256, U64, I32, I64, FixedBytes, Bytes, Address},
1313
prelude::*,
14-
storage::{StorageAddress, StorageVec, StorageMap, StorageUint, StorageBool, StorageU256},
14+
storage::{StorageAddress, StorageVec, StorageMap, StorageUint, StorageBool, StorageU256, StorageU16, StorageFixedBytes},
1515
call::Call};
1616

17-
use structs::{DataSourceStorage, PriceInfoReturn, PriceInfoStorage};
17+
use structs::{PriceInfoReturn, PriceInfoStorage};
1818
use error::{PythReceiverError};
1919
use pythnet_sdk::{wire::{v1::{
2020
AccumulatorUpdateData, Proof,
@@ -32,11 +32,13 @@ sol_interface! {
3232
#[entrypoint]
3333
pub struct PythReceiver {
3434
pub wormhole: StorageAddress,
35-
pub valid_data_sources: StorageVec<DataSourceStorage>,
35+
pub valid_data_source_chain_ids: StorageVec<StorageU16>,
36+
pub valid_data_source_emitter_addresses: StorageVec<StorageFixedBytes<32>>,
3637
pub is_valid_data_source: StorageMap<FixedBytes<32>, StorageBool>,
3738
pub single_update_fee_in_wei: StorageU256,
3839
pub valid_time_period_seconds: StorageU256,
39-
pub governance_data_source: DataSourceStorage,
40+
pub governance_data_source_chain_id: StorageU16,
41+
pub governance_data_source_emitter_address: StorageFixedBytes<32>,
4042
pub last_executed_governance_sequence: StorageUint<64, 1>,
4143
pub governance_data_source_index: StorageUint<32, 1>,
4244
pub latest_price_info: StorageMap<FixedBytes<32>, PriceInfoStorage>,
@@ -45,6 +47,38 @@ pub struct PythReceiver {
4547

4648
#[public]
4749
impl PythReceiver {
50+
pub fn initialize(&mut self, _wormhole: Address, _single_update_fee_in_wei: U256, _valid_time_period_seconds: U256,
51+
data_source_emitter_chain_ids: Vec<u16>, data_source_emitter_addresses: Vec<[u8; 32]>,
52+
governance_emitter_chain_id: u16, governance_emitter_address: [u8; 32],
53+
governance_initial_sequence: u64, _data: Vec<u8>) {
54+
self.wormhole.set(_wormhole);
55+
self.single_update_fee_in_wei.set(_single_update_fee_in_wei);
56+
self.valid_time_period_seconds.set(_valid_time_period_seconds);
57+
58+
self.governance_data_source_chain_id.set(U16::from(governance_emitter_chain_id));
59+
self.governance_data_source_emitter_address.set(FixedBytes::<32>::from(governance_emitter_address));
60+
61+
// Initialize other fields
62+
self.last_executed_governance_sequence.set(U64::from(governance_initial_sequence));
63+
self.governance_data_source_index.set(U32::ZERO);
64+
65+
for (i, chain_id) in data_source_emitter_chain_ids.iter().enumerate() {
66+
let emitter_address = FixedBytes::<32>::from(data_source_emitter_addresses[i]);
67+
68+
// Get a new storage slot in the vector and set its value
69+
let mut chain_id_storage = self.valid_data_source_chain_ids.grow();
70+
chain_id_storage.set(U16::from(*chain_id));
71+
72+
let mut emitter_address_storage = self.valid_data_source_emitter_addresses.grow();
73+
emitter_address_storage.set(emitter_address);
74+
75+
self.is_valid_data_source
76+
.setter(emitter_address)
77+
.set(true);
78+
}
79+
80+
}
81+
4882
pub fn get_price_unsafe(&self, _id: [u8; 32]) -> Result<PriceInfoReturn, PythReceiverError> {
4983
let id_fb = FixedBytes::<32>::from(_id);
5084

@@ -88,11 +122,11 @@ impl PythReceiver {
88122
Proof::WormholeMerkle { vaa, updates } => {
89123
let wormhole: IWormhole = IWormhole::new(self.wormhole.get());
90124
let config = Call::new_in(self);
91-
let parsed_vaa = wormhole.parse_and_verify_vm(config, Bytes::from(Vec::from(vaa))).map_err(|_| PythReceiverError::PriceUnavailable).unwrap();
125+
let _parsed_vaa = wormhole.parse_and_verify_vm(config, Bytes::from(Vec::from(vaa))).map_err(|_| PythReceiverError::PriceUnavailable).unwrap();
92126

93-
// for update in updates {
94-
95-
// }
127+
for update in updates {
128+
// fill in update processign logic.
129+
}
96130
}
97131
};
98132
}

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@ use alloc::vec::Vec;
22
use stylus_sdk::{prelude::*, storage::{StorageU16, StorageU64, StorageI32, StorageI64, StorageFixedBytes}};
33
use stylus_sdk::alloy_primitives::{U64, I32, I64};
44

5-
// DataSource struct to store chain/emitter pairs
6-
#[storage]
7-
pub struct DataSourceStorage {
8-
pub chain_id: StorageU16,
9-
pub emitter_address: StorageFixedBytes<32>,
10-
}
11-
125
// PriceInfo struct storing price information
136
#[storage]
147
pub struct PriceInfoStorage {

0 commit comments

Comments
 (0)