@@ -52,7 +52,9 @@ fn decode_event(mut event: Event) -> PythEvent {
52
52
};
53
53
PythEvent :: PriceFeedUpdated (event )
54
54
} 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
+ };
56
58
PythEvent :: FeeSet (event )
57
59
} else if key0 == event_name_hash (' DataSourcesSet' ) {
58
60
let event = DataSourcesSet {
@@ -692,11 +694,16 @@ fn test_governance_set_fee_works() {
692
694
let (from , event ) = spy . events. pop_front (). unwrap ();
693
695
assert! (from == pyth . contract_address);
694
696
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
+ };
696
700
assert! (event == PythEvent :: FeeSet (expected ));
697
701
698
702
let fee2 = pyth . get_update_fee (data :: test_price_update2 (), ctx . fee_contract. contract_address);
699
703
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 );
700
707
701
708
start_prank (CheatTarget :: One (pyth . contract_address), user );
702
709
pyth . update_price_feeds (data :: test_price_update2 ());
@@ -709,6 +716,62 @@ fn test_governance_set_fee_works() {
709
716
assert! (last_price . price == 6281522520745 );
710
717
}
711
718
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
+
712
775
#[test]
713
776
#[fuzzer(runs: 100, seed: 0)]
714
777
#[should_panic]
@@ -806,8 +869,8 @@ fn test_governance_set_wormhole_works() {
806
869
807
870
let user = ' user' . try_into (). unwrap ();
808
871
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 );
811
874
let pyth = deploy_pyth_default (
812
875
wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
813
876
);
@@ -892,8 +955,8 @@ fn test_rejects_set_wormhole_without_deploying() {
892
955
893
956
let user = ' user' . try_into (). unwrap ();
894
957
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 );
897
960
let pyth = deploy_pyth_default (
898
961
wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
899
962
);
@@ -912,8 +975,8 @@ fn test_rejects_set_wormhole_with_incompatible_guardians() {
912
975
913
976
let user = ' user' . try_into (). unwrap ();
914
977
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 );
917
980
let pyth = deploy_pyth_default (
918
981
wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
919
982
);
@@ -1058,8 +1121,8 @@ fn deploy_test() -> Context {
1058
1121
let user = ' user' . try_into (). unwrap ();
1059
1122
let wormhole = super :: wormhole :: deploy_with_test_guardian ();
1060
1123
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 );
1063
1126
let pyth = deploy_pyth_default (
1064
1127
wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
1065
1128
);
@@ -1070,8 +1133,8 @@ fn deploy_mainnet() -> Context {
1070
1133
let user = ' user' . try_into (). unwrap ();
1071
1134
let wormhole = super :: wormhole :: deploy_with_mainnet_guardians ();
1072
1135
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 );
1075
1138
let pyth = deploy_pyth_default (
1076
1139
wormhole . contract_address, fee_contract . contract_address, fee_contract2 . contract_address
1077
1140
);
@@ -1125,12 +1188,21 @@ fn deploy_pyth(
1125
1188
IPythDispatcher { contract_address }
1126
1189
}
1127
1190
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 {
1129
1201
let mut args = array! [];
1130
1202
let name : ByteArray = " eth" ;
1131
1203
let symbol : ByteArray = " eth" ;
1132
1204
(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 ) {
1134
1206
Result :: Ok (v ) => { v },
1135
1207
Result :: Err (err ) => { panic (err . panic_data) },
1136
1208
};
0 commit comments