@@ -52,7 +52,9 @@ fn decode_event(mut event: Event) -> PythEvent {
5252 };
5353 PythEvent :: PriceFeedUpdated (event )
5454 } else if key0 == event_name_hash (' FeeSet' ) {
55- let event = FeeSet { old_fee : event . data. pop_u256 (), new_fee : event . data. pop_u256 (), };
55+ let event = FeeSet {
56+ old_fee : event . data. pop_u256 (), new_fee : event . data. pop_u256 (), token : event . data. pop (),
57+ };
5658 PythEvent :: FeeSet (event )
5759 } else if key0 == event_name_hash (' DataSourcesSet' ) {
5860 let event = DataSourcesSet {
@@ -692,11 +694,16 @@ fn test_governance_set_fee_works() {
692694 let (from , event ) = spy . events. pop_front (). unwrap ();
693695 assert! (from == pyth . contract_address);
694696 let event = decode_event (event );
695- let expected = FeeSet { old_fee : 1000 , new_fee : 4200 , };
697+ let expected = FeeSet {
698+ old_fee : 1000 , new_fee : 4200 , token : ctx . fee_contract. contract_address
699+ };
696700 assert! (event == PythEvent :: FeeSet (expected ));
697701
698702 let fee2 = pyth . get_update_fee (data :: test_price_update2 (), ctx . fee_contract. contract_address);
699703 assert! (fee2 == 4200 );
704+ let fee2_alt = pyth
705+ . get_update_fee (data :: test_price_update2 (), ctx . fee_contract2. contract_address);
706+ assert! (fee2_alt == 2000 );
700707
701708 start_prank (CheatTarget :: One (pyth . contract_address), user );
702709 pyth . update_price_feeds (data :: test_price_update2 ());
@@ -709,6 +716,62 @@ fn test_governance_set_fee_works() {
709716 assert! (last_price . price == 6281522520745 );
710717}
711718
719+ #[test]
720+ fn test_governance_set_fee_in_token_works () {
721+ let ctx = deploy_test ();
722+ let pyth = ctx . pyth;
723+ let fee_contract = ctx . fee_contract;
724+ let user = ctx . user;
725+
726+ let fee1 = pyth . get_update_fee (data :: test_price_update1 (), ctx . fee_contract. contract_address);
727+ assert! (fee1 == 1000 );
728+ ctx . approve_fee (1000 );
729+
730+ let mut balance = fee_contract . balanceOf (user );
731+ start_prank (CheatTarget :: One (pyth . contract_address), user );
732+ pyth . update_price_feeds (data :: test_price_update1 ());
733+ stop_prank (CheatTarget :: One (pyth . contract_address));
734+ let new_balance = fee_contract . balanceOf (user );
735+ assert! (balance - new_balance == 1000 );
736+ balance = new_balance ;
737+ let last_price = pyth
738+ . get_price_unsafe (0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43 )
739+ . unwrap_with_felt252 ();
740+ assert! (last_price . price == 6281060000000 );
741+
742+ let mut spy = spy_events (SpyOn :: One (pyth . contract_address));
743+
744+ pyth . execute_governance_instruction (data :: pyth_set_fee_in_token ());
745+
746+ spy . fetch_events ();
747+ assert! (spy . events. len () == 1 );
748+ let (from , event ) = spy . events. pop_front (). unwrap ();
749+ assert! (from == pyth . contract_address);
750+ let event = decode_event (event );
751+ let expected = FeeSet {
752+ old_fee : 2000 , new_fee : 4200 , token : ctx . fee_contract2. contract_address
753+ };
754+ assert! (event == PythEvent :: FeeSet (expected ));
755+
756+ let fee2 = pyth . get_update_fee (data :: test_price_update2 (), ctx . fee_contract. contract_address);
757+ assert! (fee2 == 1000 );
758+ let fee2_alt = pyth
759+ . get_update_fee (data :: test_price_update2 (), ctx . fee_contract2. contract_address);
760+ assert! (fee2_alt == 4200 );
761+ ctx . approve_fee2 (4200 );
762+
763+ let balance2 = ctx . fee_contract2. balanceOf (user );
764+ start_prank (CheatTarget :: One (pyth . contract_address), user );
765+ pyth . update_price_feeds (data :: test_price_update2 ());
766+ stop_prank (CheatTarget :: One (pyth . contract_address));
767+ let new_balance2 = ctx . fee_contract2. balanceOf (user );
768+ assert! (balance2 - new_balance2 == 4200 );
769+ let last_price = pyth
770+ . get_price_unsafe (0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43 )
771+ . unwrap_with_felt252 ();
772+ assert! (last_price . price == 6281522520745 );
773+ }
774+
712775#[test]
713776#[fuzzer(runs: 100, seed: 0)]
714777#[should_panic]
@@ -806,8 +869,8 @@ fn test_governance_set_wormhole_works() {
806869
807870 let user = ' user' . try_into (). unwrap ();
808871 let fee_class = declare (" ERC20" );
809- let fee_contract = deploy_fee_contract (fee_class , user );
810- let fee_contract2 = deploy_fee_contract (fee_class , user );
872+ let fee_contract = deploy_fee_contract (fee_class , fee_address1 (), user );
873+ let fee_contract2 = deploy_fee_contract (fee_class , fee_address2 (), user );
811874 let pyth = deploy_pyth_default (
812875 wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
813876 );
@@ -892,8 +955,8 @@ fn test_rejects_set_wormhole_without_deploying() {
892955
893956 let user = ' user' . try_into (). unwrap ();
894957 let fee_class = declare (" ERC20" );
895- let fee_contract = deploy_fee_contract (fee_class , user );
896- let fee_contract2 = deploy_fee_contract (fee_class , user );
958+ let fee_contract = deploy_fee_contract (fee_class , fee_address1 (), user );
959+ let fee_contract2 = deploy_fee_contract (fee_class , fee_address2 (), user );
897960 let pyth = deploy_pyth_default (
898961 wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
899962 );
@@ -912,8 +975,8 @@ fn test_rejects_set_wormhole_with_incompatible_guardians() {
912975
913976 let user = ' user' . try_into (). unwrap ();
914977 let fee_class = declare (" ERC20" );
915- let fee_contract = deploy_fee_contract (fee_class , user );
916- let fee_contract2 = deploy_fee_contract (fee_class , user );
978+ let fee_contract = deploy_fee_contract (fee_class , fee_address1 (), user );
979+ let fee_contract2 = deploy_fee_contract (fee_class , fee_address2 (), user );
917980 let pyth = deploy_pyth_default (
918981 wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
919982 );
@@ -1058,8 +1121,8 @@ fn deploy_test() -> Context {
10581121 let user = ' user' . try_into (). unwrap ();
10591122 let wormhole = super :: wormhole :: deploy_with_test_guardian ();
10601123 let fee_class = declare (" ERC20" );
1061- let fee_contract = deploy_fee_contract (fee_class , user );
1062- let fee_contract2 = deploy_fee_contract (fee_class , user );
1124+ let fee_contract = deploy_fee_contract (fee_class , fee_address1 (), user );
1125+ let fee_contract2 = deploy_fee_contract (fee_class , fee_address2 (), user );
10631126 let pyth = deploy_pyth_default (
10641127 wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
10651128 );
@@ -1070,8 +1133,8 @@ fn deploy_mainnet() -> Context {
10701133 let user = ' user' . try_into (). unwrap ();
10711134 let wormhole = super :: wormhole :: deploy_with_mainnet_guardians ();
10721135 let fee_class = declare (" ERC20" );
1073- let fee_contract = deploy_fee_contract (fee_class , user );
1074- let fee_contract2 = deploy_fee_contract (fee_class , user );
1136+ let fee_contract = deploy_fee_contract (fee_class , fee_address1 (), user );
1137+ let fee_contract2 = deploy_fee_contract (fee_class , fee_address2 (), user );
10751138 let pyth = deploy_pyth_default (
10761139 wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
10771140 );
@@ -1125,12 +1188,21 @@ fn deploy_pyth(
11251188 IPythDispatcher { contract_address }
11261189}
11271190
1128- fn deploy_fee_contract (class : ContractClass , recipient : ContractAddress ) -> IERC20CamelDispatcher {
1191+ fn fee_address1 () -> ContractAddress {
1192+ 0x1010 . try_into (). unwrap ()
1193+ }
1194+ fn fee_address2 () -> ContractAddress {
1195+ 0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 . try_into (). unwrap ()
1196+ }
1197+
1198+ fn deploy_fee_contract (
1199+ class : ContractClass , at : ContractAddress , recipient : ContractAddress
1200+ ) -> IERC20CamelDispatcher {
11291201 let mut args = array! [];
11301202 let name : ByteArray = " eth" ;
11311203 let symbol : ByteArray = " eth" ;
11321204 (name , symbol , 100000_u256 , recipient ). serialize (ref args );
1133- let contract_address = match class . deploy (@ args ) {
1205+ let contract_address = match class . deploy_at (@ args , at ) {
11341206 Result :: Ok (v ) => { v },
11351207 Result :: Err (err ) => { panic (err . panic_data) },
11361208 };
0 commit comments