1
1
mod errors ;
2
2
mod interface ;
3
3
mod price_update ;
4
- mod governance ;
4
+ pub mod governance ;
5
5
6
6
mod fake_upgrades ;
7
7
@@ -97,7 +97,7 @@ mod pyth {
97
97
#[storage]
98
98
struct Storage {
99
99
wormhole_address : ContractAddress ,
100
- fee_contract_address : ContractAddress ,
100
+ fee_token_address : ContractAddress ,
101
101
single_update_fee : u256 ,
102
102
data_sources : LegacyMap <usize , DataSource >,
103
103
num_data_sources : usize ,
@@ -115,28 +115,28 @@ mod pyth {
115
115
///
116
116
/// `wormhole_address` is the address of the deployed Wormhole contract implemented in the `wormhole` module.
117
117
///
118
- /// `fee_contract_address ` is the address of the ERC20 token used to pay fees to Pyth
118
+ /// `fee_token_address ` is the address of the ERC20 token used to pay fees to Pyth
119
119
/// for price updates. There is no native token on Starknet so an ERC20 contract has to be used.
120
120
/// On Katana, an ETH fee contract is pre-deployed. On Starknet testnet, ETH and STRK fee tokens are
121
121
/// available. Any other ERC20-compatible token can also be used.
122
122
/// In a Starknet Forge testing environment, a fee contract must be deployed manually.
123
123
///
124
- /// `single_update_fee` is the number of tokens of `fee_contract_address ` charged for a single price update.
124
+ /// `single_update_fee` is the number of tokens of `fee_token_address ` charged for a single price update.
125
125
///
126
126
/// `data_sources` is the list of Wormhole data sources accepted by this contract.
127
127
#[constructor]
128
128
fn constructor (
129
129
ref self : ContractState ,
130
130
wormhole_address : ContractAddress ,
131
- fee_contract_address : ContractAddress ,
131
+ fee_token_address : ContractAddress ,
132
132
single_update_fee : u256 ,
133
133
data_sources : Array <DataSource >,
134
134
governance_emitter_chain_id : u16 ,
135
135
governance_emitter_address : u256 ,
136
136
governance_initial_sequence : u64 ,
137
137
) {
138
138
self . wormhole_address. write (wormhole_address );
139
- self . fee_contract_address . write (fee_contract_address );
139
+ self . fee_token_address . write (fee_token_address );
140
140
self . single_update_fee. write (single_update_fee );
141
141
self . write_data_sources (@ data_sources );
142
142
self
@@ -239,6 +239,16 @@ mod pyth {
239
239
Result :: Ok (feed )
240
240
}
241
241
242
+ fn price_feed_exists (self : @ ContractState , price_id : u256 ) -> bool {
243
+ let info = self . latest_price_info. read (price_id );
244
+ info . publish_time != 0
245
+ }
246
+
247
+ fn latest_price_info_publish_time (self : @ ContractState , price_id : u256 ) -> u64 {
248
+ let info = self . latest_price_info. read (price_id );
249
+ info . publish_time
250
+ }
251
+
242
252
fn update_price_feeds (ref self : ContractState , data : ByteArray ) {
243
253
self . update_price_feeds_internal (data , array! [], 0 , 0 , false );
244
254
}
@@ -300,6 +310,54 @@ mod pyth {
300
310
)
301
311
}
302
312
313
+ fn wormhole_address (self : @ ContractState ) -> ContractAddress {
314
+ self . wormhole_address. read ()
315
+ }
316
+
317
+ fn fee_token_address (self : @ ContractState ) -> ContractAddress {
318
+ self . fee_token_address. read ()
319
+ }
320
+
321
+ fn get_single_update_fee (self : @ ContractState ) -> u256 {
322
+ self . single_update_fee. read ()
323
+ }
324
+
325
+ fn valid_data_sources (self : @ ContractState ) -> Array <DataSource > {
326
+ let count = self . num_data_sources. read ();
327
+ let mut i = 0 ;
328
+ let mut output = array! [];
329
+ while i < count {
330
+ output . append (self . data_sources. read (i ));
331
+ i += 1 ;
332
+ };
333
+ output
334
+ }
335
+
336
+ fn is_valid_data_source (self : @ ContractState , source : DataSource ) -> bool {
337
+ self . is_valid_data_source. read (source )
338
+ }
339
+
340
+ fn governance_data_source (self : @ ContractState ) -> DataSource {
341
+ self . governance_data_source. read ()
342
+ }
343
+
344
+ fn is_valid_governance_data_source (self : @ ContractState , source : DataSource ) -> bool {
345
+ self . governance_data_source. read () == source
346
+ }
347
+
348
+ fn last_executed_governance_sequence (self : @ ContractState ) -> u64 {
349
+ self . last_executed_governance_sequence. read ()
350
+ }
351
+
352
+ fn governance_data_source_index (self : @ ContractState ) -> u32 {
353
+ self . governance_data_source_index. read ()
354
+ }
355
+
356
+ fn chain_id (self : @ ContractState ) -> u16 {
357
+ let wormhole = IWormholeDispatcher { contract_address : self . wormhole_address. read () };
358
+ wormhole . chain_id ()
359
+ }
360
+
303
361
fn execute_governance_instruction (ref self : ContractState , data : ByteArray ) {
304
362
let wormhole = IWormholeDispatcher { contract_address : self . wormhole_address. read () };
305
363
let vm = wormhole . parse_and_verify_vm (data . clone ());
@@ -555,7 +613,7 @@ mod pyth {
555
613
let num_updates = reader . read_u8 ();
556
614
let total_fee = self . get_total_fee (num_updates );
557
615
let fee_contract = IERC20CamelDispatcher {
558
- contract_address : self . fee_contract_address . read ()
616
+ contract_address : self . fee_token_address . read ()
559
617
};
560
618
let execution_info = get_execution_info (). unbox ();
561
619
let caller = execution_info . caller_address;
0 commit comments