@@ -9,12 +9,12 @@ mod structs;
9
9
mod error;
10
10
11
11
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 } ,
13
13
prelude:: * ,
14
- storage:: { StorageAddress , StorageVec , StorageMap , StorageUint , StorageBool , StorageU256 } ,
14
+ storage:: { StorageAddress , StorageVec , StorageMap , StorageUint , StorageBool , StorageU256 , StorageU16 , StorageFixedBytes } ,
15
15
call:: Call } ;
16
16
17
- use structs:: { DataSourceStorage , PriceInfoReturn , PriceInfoStorage } ;
17
+ use structs:: { PriceInfoReturn , PriceInfoStorage } ;
18
18
use error:: { PythReceiverError } ;
19
19
use pythnet_sdk:: { wire:: { v1:: {
20
20
AccumulatorUpdateData , Proof ,
@@ -32,11 +32,13 @@ sol_interface! {
32
32
#[ entrypoint]
33
33
pub struct PythReceiver {
34
34
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 > > ,
36
37
pub is_valid_data_source : StorageMap < FixedBytes < 32 > , StorageBool > ,
37
38
pub single_update_fee_in_wei : StorageU256 ,
38
39
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 > ,
40
42
pub last_executed_governance_sequence : StorageUint < 64 , 1 > ,
41
43
pub governance_data_source_index : StorageUint < 32 , 1 > ,
42
44
pub latest_price_info : StorageMap < FixedBytes < 32 > , PriceInfoStorage > ,
@@ -45,6 +47,38 @@ pub struct PythReceiver {
45
47
46
48
#[ public]
47
49
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
+
48
82
pub fn get_price_unsafe ( & self , _id : [ u8 ; 32 ] ) -> Result < PriceInfoReturn , PythReceiverError > {
49
83
let id_fb = FixedBytes :: < 32 > :: from ( _id) ;
50
84
@@ -88,11 +122,11 @@ impl PythReceiver {
88
122
Proof :: WormholeMerkle { vaa, updates } => {
89
123
let wormhole: IWormhole = IWormhole :: new ( self . wormhole . get ( ) ) ;
90
124
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 ( ) ;
92
126
93
- // for update in updates {
94
-
95
- // }
127
+ for update in updates {
128
+ // fill in update processign logic.
129
+ }
96
130
}
97
131
} ;
98
132
}
0 commit comments