Ver Fonte

feat(target_chains/starknet): add remaining events and fix naming (#1609)

* feat(target_chains/starknet): add DataSourcesSet event

* feat(target_chains/starknet): add FeeSet event

* refactor(target_chains/starknet): rename PriceFeedUpdateEvent to PriceFeedUpdated
Pavel Strakhov há 1 ano atrás
pai
commit
81c24937a3

+ 35 - 9
target_chains/starknet/contracts/src/pyth.cairo

@@ -6,7 +6,8 @@ mod governance;
 mod fake_upgrades;
 
 pub use pyth::{
-    Event, PriceFeedUpdateEvent, WormholeAddressSet, GovernanceDataSourceSet, ContractUpgraded
+    Event, PriceFeedUpdated, WormholeAddressSet, GovernanceDataSourceSet, ContractUpgraded,
+    DataSourcesSet, FeeSet,
 };
 pub use errors::{GetPriceUnsafeError, GovernanceActionError, UpdatePriceFeedsError};
 pub use interface::{IPyth, IPythDispatcher, IPythDispatcherTrait, DataSource, Price};
@@ -37,14 +38,16 @@ mod pyth {
     #[event]
     #[derive(Drop, PartialEq, starknet::Event)]
     pub enum Event {
-        PriceFeedUpdate: PriceFeedUpdateEvent,
+        PriceFeedUpdated: PriceFeedUpdated,
+        FeeSet: FeeSet,
+        DataSourcesSet: DataSourcesSet,
         WormholeAddressSet: WormholeAddressSet,
         GovernanceDataSourceSet: GovernanceDataSourceSet,
         ContractUpgraded: ContractUpgraded,
     }
 
     #[derive(Drop, PartialEq, starknet::Event)]
-    pub struct PriceFeedUpdateEvent {
+    pub struct PriceFeedUpdated {
         #[key]
         pub price_id: u256,
         pub publish_time: u64,
@@ -52,6 +55,18 @@ mod pyth {
         pub conf: u64,
     }
 
+    #[derive(Drop, PartialEq, starknet::Event)]
+    pub struct FeeSet {
+        pub old_fee: u256,
+        pub new_fee: u256,
+    }
+
+    #[derive(Drop, PartialEq, starknet::Event)]
+    pub struct DataSourcesSet {
+        pub old_data_sources: Array<DataSource>,
+        pub new_data_sources: Array<DataSource>,
+    }
+
     #[derive(Drop, PartialEq, starknet::Event)]
     pub struct WormholeAddressSet {
         pub old_address: ContractAddress,
@@ -114,7 +129,7 @@ mod pyth {
         self.wormhole_address.write(wormhole_address);
         self.fee_contract_address.write(fee_contract_address);
         self.single_update_fee.write(single_update_fee);
-        self.write_data_sources(data_sources);
+        self.write_data_sources(@data_sources);
         self
             .governance_data_source
             .write(
@@ -213,11 +228,17 @@ mod pyth {
             }
             match instruction.payload {
                 GovernancePayload::SetFee(payload) => {
-                    let value = apply_decimal_expo(payload.value, payload.expo);
-                    self.single_update_fee.write(value);
+                    let new_fee = apply_decimal_expo(payload.value, payload.expo);
+                    let old_fee = self.single_update_fee.read();
+                    self.single_update_fee.write(new_fee);
+                    let event = FeeSet { old_fee, new_fee };
+                    self.emit(event);
                 },
                 GovernancePayload::SetDataSources(payload) => {
-                    self.write_data_sources(payload.sources);
+                    let new_data_sources = payload.sources;
+                    let old_data_sources = self.write_data_sources(@new_data_sources);
+                    let event = DataSourcesSet { old_data_sources, new_data_sources };
+                    self.emit(event);
                 },
                 GovernancePayload::SetWormholeAddress(payload) => {
                     if instruction.target_chain_id == 0 {
@@ -254,11 +275,15 @@ mod pyth {
 
     #[generate_trait]
     impl PrivateImpl of PrivateTrait {
-        fn write_data_sources(ref self: ContractState, data_sources: Array<DataSource>) {
+        fn write_data_sources(
+            ref self: ContractState, data_sources: @Array<DataSource>
+        ) -> Array<DataSource> {
             let num_old = self.num_data_sources.read();
             let mut i = 0;
+            let mut old_data_sources = array![];
             while i < num_old {
                 let old_source = self.data_sources.read(i);
+                old_data_sources.append(old_source);
                 self.is_valid_data_source.write(old_source, false);
                 self.data_sources.write(i, Default::default());
                 i += 1;
@@ -272,6 +297,7 @@ mod pyth {
                 self.data_sources.write(i, *source);
                 i += 1;
             };
+            old_data_sources
         }
 
         fn update_latest_price_if_necessary(ref self: ContractState, message: PriceFeedMessage) {
@@ -287,7 +313,7 @@ mod pyth {
                 };
                 self.latest_price_info.write(message.price_id, info);
 
-                let event = PriceFeedUpdateEvent {
+                let event = PriceFeedUpdated {
                     price_id: message.price_id,
                     publish_time: message.publish_time,
                     price: message.price,

+ 61 - 7
target_chains/starknet/contracts/tests/pyth.cairo

@@ -3,8 +3,8 @@ use snforge_std::{
     EventFetcher, event_name_hash, Event
 };
 use pyth::pyth::{
-    IPythDispatcher, IPythDispatcherTrait, DataSource, Event as PythEvent, PriceFeedUpdateEvent,
-    WormholeAddressSet, GovernanceDataSourceSet, ContractUpgraded,
+    IPythDispatcher, IPythDispatcherTrait, DataSource, Event as PythEvent, PriceFeedUpdated,
+    WormholeAddressSet, GovernanceDataSourceSet, ContractUpgraded, DataSourcesSet, FeeSet,
 };
 use pyth::byte_array::{ByteArray, ByteArrayImpl};
 use pyth::util::{array_try_into, UnwrapWithFelt252};
@@ -27,18 +27,38 @@ impl DecodeEventHelpers of DecodeEventHelpersTrait {
     fn pop_data_source(ref self: Array<felt252>) -> DataSource {
         DataSource { emitter_chain_id: self.pop(), emitter_address: self.pop_u256(), }
     }
+
+    fn pop_data_sources(ref self: Array<felt252>) -> Array<DataSource> {
+        let count: usize = self.pop();
+        let mut i = 0;
+        let mut output = array![];
+        while i < count {
+            output.append(self.pop_data_source());
+            i += 1;
+        };
+        output
+    }
 }
 
 fn decode_event(mut event: Event) -> PythEvent {
     let key0: felt252 = event.keys.pop();
-    let output = if key0 == event_name_hash('PriceFeedUpdate') {
-        let event = PriceFeedUpdateEvent {
+    let output = if key0 == event_name_hash('PriceFeedUpdated') {
+        let event = PriceFeedUpdated {
             price_id: event.keys.pop_u256(),
             publish_time: event.data.pop(),
             price: event.data.pop(),
             conf: event.data.pop(),
         };
-        PythEvent::PriceFeedUpdate(event)
+        PythEvent::PriceFeedUpdated(event)
+    } else if key0 == event_name_hash('FeeSet') {
+        let event = FeeSet { old_fee: event.data.pop_u256(), new_fee: event.data.pop_u256(), };
+        PythEvent::FeeSet(event)
+    } else if key0 == event_name_hash('DataSourcesSet') {
+        let event = DataSourcesSet {
+            old_data_sources: event.data.pop_data_sources(),
+            new_data_sources: event.data.pop_data_sources(),
+        };
+        PythEvent::DataSourcesSet(event)
     } else if key0 == event_name_hash('WormholeAddressSet') {
         let event = WormholeAddressSet {
             old_address: event.data.pop(), new_address: event.data.pop(),
@@ -84,13 +104,13 @@ fn update_price_feeds_works() {
     let (from, event) = spy.events.pop_front().unwrap();
     assert!(from == pyth.contract_address);
     let event = decode_event(event);
-    let expected = PriceFeedUpdateEvent {
+    let expected = PriceFeedUpdated {
         price_id: 0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43,
         publish_time: 1712589206,
         price: 7192002930010,
         conf: 3596501465,
     };
-    assert!(event == PythEvent::PriceFeedUpdate(expected));
+    assert!(event == PythEvent::PriceFeedUpdated(expected));
 
     let last_price = pyth
         .get_price_unsafe(0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43)
@@ -132,8 +152,18 @@ fn test_governance_set_fee_works() {
         .unwrap_with_felt252();
     assert!(last_price.price == 6281060000000);
 
+    let mut spy = spy_events(SpyOn::One(pyth.contract_address));
+
     pyth.execute_governance_instruction(data::pyth_set_fee());
 
+    spy.fetch_events();
+    assert!(spy.events.len() == 1);
+    let (from, event) = spy.events.pop_front().unwrap();
+    assert!(from == pyth.contract_address);
+    let event = decode_event(event);
+    let expected = FeeSet { old_fee: 1000, new_fee: 4200, };
+    assert!(event == PythEvent::FeeSet(expected));
+
     start_prank(CheatTarget::One(pyth.contract_address), user);
     pyth.update_price_feeds(data::test_price_update2());
     stop_prank(CheatTarget::One(pyth.contract_address));
@@ -177,8 +207,32 @@ fn test_governance_set_data_sources_works() {
         .unwrap_with_felt252();
     assert!(last_price.price == 6281060000000);
 
+    let mut spy = spy_events(SpyOn::One(pyth.contract_address));
+
     pyth.execute_governance_instruction(data::pyth_set_data_sources());
 
+    spy.fetch_events();
+    assert!(spy.events.len() == 1);
+    let (from, event) = spy.events.pop_front().unwrap();
+    assert!(from == pyth.contract_address);
+    let event = decode_event(event);
+    let expected = DataSourcesSet {
+        old_data_sources: array![
+            DataSource {
+                emitter_chain_id: 26,
+                emitter_address: 0xe101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa71,
+            }
+        ],
+        new_data_sources: array![
+            DataSource {
+                emitter_chain_id: 1,
+                emitter_address: 0x6bb14509a612f01fbbc4cffeebd4bbfb492a86df717ebe92eb6df432a3f00a25,
+            },
+            DataSource { emitter_chain_id: 3, emitter_address: 0x12d, },
+        ],
+    };
+    assert!(event == PythEvent::DataSourcesSet(expected));
+
     start_prank(CheatTarget::One(pyth.contract_address), user);
     pyth.update_price_feeds(data::test_update2_alt_emitter());
     stop_prank(CheatTarget::One(pyth.contract_address));