2
2
3
3
use cosmwasm_std:: { entry_point, Binary , Deps , DepsMut , Env , MessageInfo , Response } ;
4
4
5
- use crate :: msg:: { ExecuteMsg , InstantiateMsg , QueryMsg , SudoMsg } ;
6
- use crate :: { custom_query:: EthereumCustomQuery , instantiate, msg :: MigrateMsg , query } ;
5
+ use crate :: msg:: { ExecuteMsg , InstantiateMsg , MigrateMsg , Migration , QueryMsg , SudoMsg } ;
6
+ use crate :: { custom_query:: EthereumCustomQuery , instantiate, query , state } ;
7
7
use crate :: { sudo, ContractError } ;
8
8
9
9
/// The version of the contracts state.
@@ -109,9 +109,23 @@ pub fn migrate(
109
109
// Check if the state version is older than the current one and update it
110
110
cw2:: ensure_from_older_version ( deps. storage , CONTRACT_NAME , STATE_VERSION ) ?;
111
111
112
- // Re-initialize the client if needed.
113
- if let Some ( instantiate_msg) = msg. instantiate_msg {
114
- instantiate:: client ( deps. storage , instantiate_msg) ?;
112
+ // Perform the migration
113
+ match msg. migration {
114
+ Migration :: CodeOnly => { } // do nothing here
115
+ Migration :: Reinstantiate ( instantiate_msg) => {
116
+ // Re-instantiate the client
117
+ instantiate:: client ( deps. storage , instantiate_msg) ?;
118
+ }
119
+ Migration :: UpdateForkParameters ( fork_parameters) => {
120
+ // Change the fork parameters
121
+ let mut client_state = state:: get_eth_client_state ( deps. storage ) ?;
122
+ client_state. fork_parameters = fork_parameters;
123
+ let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state)
124
+ . map_err ( ContractError :: SerializeClientStateFailed ) ?;
125
+ let mut wasm_client_state = state:: get_wasm_client_state ( deps. storage ) ?;
126
+ wasm_client_state. data = client_state_bz;
127
+ state:: store_client_state ( deps. storage , & wasm_client_state) ?;
128
+ }
115
129
}
116
130
117
131
Ok ( Response :: default ( ) )
@@ -283,8 +297,8 @@ mod tests {
283
297
use crate :: {
284
298
contract:: { instantiate, migrate, query, sudo} ,
285
299
msg:: {
286
- Height , InstantiateMsg , MerklePath , MigrateMsg , QueryMsg , SudoMsg , UpdateStateMsg ,
287
- UpdateStateResult , VerifyClientMessageMsg , VerifyMembershipMsg ,
300
+ Height , InstantiateMsg , MerklePath , MigrateMsg , Migration , QueryMsg , SudoMsg ,
301
+ UpdateStateMsg , UpdateStateResult , VerifyClientMessageMsg , VerifyMembershipMsg ,
288
302
} ,
289
303
state:: HOST_CLIENT_STATE_KEY ,
290
304
test:: mk_deps,
@@ -311,7 +325,7 @@ mod tests {
311
325
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
312
326
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
313
327
314
- let msg = crate :: msg :: InstantiateMsg {
328
+ let msg = InstantiateMsg {
315
329
client_state : Binary :: from ( client_state_bz) ,
316
330
consensus_state : Binary :: from ( consensus_state_bz) ,
317
331
checksum : b"checksum" . into ( ) ,
@@ -412,7 +426,7 @@ mod tests {
412
426
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
413
427
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
414
428
415
- let msg = crate :: msg :: InstantiateMsg {
429
+ let msg = InstantiateMsg {
416
430
client_state : Binary :: from ( client_state_bz) ,
417
431
consensus_state : Binary :: from ( consensus_state_bz) ,
418
432
checksum : b"checksum" . into ( ) ,
@@ -583,7 +597,7 @@ mod tests {
583
597
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
584
598
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
585
599
586
- let msg = crate :: msg :: InstantiateMsg {
600
+ let msg = InstantiateMsg {
587
601
client_state : Binary :: from ( client_state_bz) ,
588
602
consensus_state : Binary :: from ( consensus_state_bz) ,
589
603
checksum : b"checksum" . into ( ) ,
@@ -632,7 +646,7 @@ mod tests {
632
646
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
633
647
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
634
648
635
- let msg = crate :: msg :: InstantiateMsg {
649
+ let msg = InstantiateMsg {
636
650
client_state : Binary :: from ( client_state_bz) ,
637
651
consensus_state : Binary :: from ( consensus_state_bz) ,
638
652
checksum : b"checksum" . into ( ) ,
@@ -733,7 +747,7 @@ mod tests {
733
747
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
734
748
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
735
749
736
- let msg = crate :: msg :: InstantiateMsg {
750
+ let msg = InstantiateMsg {
737
751
client_state : Binary :: from ( client_state_bz) ,
738
752
consensus_state : Binary :: from ( consensus_state_bz) ,
739
753
checksum : b"checksum" . into ( ) ,
@@ -901,7 +915,7 @@ mod tests {
901
915
let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
902
916
let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
903
917
904
- let msg = crate :: msg :: InstantiateMsg {
918
+ let msg = InstantiateMsg {
905
919
client_state : Binary :: from ( client_state_bz) ,
906
920
consensus_state : Binary :: from ( consensus_state_bz) ,
907
921
checksum : b"checksum" . into ( ) ,
@@ -913,8 +927,8 @@ mod tests {
913
927
migrate (
914
928
deps. as_mut ( ) ,
915
929
mock_env ( ) ,
916
- crate :: msg :: MigrateMsg {
917
- instantiate_msg : None ,
930
+ MigrateMsg {
931
+ migration : Migration :: CodeOnly ,
918
932
} ,
919
933
)
920
934
. unwrap ( ) ;
@@ -1008,7 +1022,7 @@ mod tests {
1008
1022
} ;
1009
1023
1010
1024
let migrate_msg = MigrateMsg {
1011
- instantiate_msg : Some ( msg. clone ( ) ) ,
1025
+ migration : Migration :: Reinstantiate ( msg. clone ( ) ) ,
1012
1026
} ;
1013
1027
1014
1028
// Migrate without any changes (i.e. same state version)
@@ -1026,5 +1040,128 @@ mod tests {
1026
1040
client_state. latest_slot
1027
1041
) ;
1028
1042
}
1043
+
1044
+ #[ allow( clippy:: too_many_lines) ]
1045
+ #[ test]
1046
+ fn test_migrate_with_fork_parameters ( ) {
1047
+ let mut deps = mk_deps ( ) ;
1048
+ let creator = deps. api . addr_make ( "creator" ) ;
1049
+ let info = message_info ( & creator, & coins ( 1 , "uatom" ) ) ;
1050
+
1051
+ let client_state = EthClientState {
1052
+ chain_id : 0 ,
1053
+ genesis_validators_root : B256 :: from ( [ 0 ; 32 ] ) ,
1054
+ min_sync_committee_participants : 0 ,
1055
+ genesis_time : 0 ,
1056
+ genesis_slot : 0 ,
1057
+ fork_parameters : ForkParameters {
1058
+ genesis_fork_version : FixedBytes ( [ 0 ; 4 ] ) ,
1059
+ genesis_slot : 0 ,
1060
+ altair : Fork {
1061
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1062
+ epoch : 0 ,
1063
+ } ,
1064
+ bellatrix : Fork {
1065
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1066
+ epoch : 0 ,
1067
+ } ,
1068
+ capella : Fork {
1069
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1070
+ epoch : 0 ,
1071
+ } ,
1072
+ deneb : Fork {
1073
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1074
+ epoch : 0 ,
1075
+ } ,
1076
+ electra : Fork {
1077
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1078
+ epoch : 0 ,
1079
+ } ,
1080
+ } ,
1081
+ sync_committee_size : 512 ,
1082
+ seconds_per_slot : 10 ,
1083
+ slots_per_epoch : 8 ,
1084
+ epochs_per_sync_committee_period : 0 ,
1085
+ latest_slot : 42 ,
1086
+ latest_execution_block_number : 38 ,
1087
+ ibc_commitment_slot : U256 :: from ( 0 ) ,
1088
+ ibc_contract_address : Address :: default ( ) ,
1089
+ is_frozen : false ,
1090
+ } ;
1091
+ let client_state_bz: Vec < u8 > = serde_json:: to_vec ( & client_state) . unwrap ( ) ;
1092
+
1093
+ let consensus_state = EthConsensusState {
1094
+ slot : 42 ,
1095
+ state_root : B256 :: from ( [ 0 ; 32 ] ) ,
1096
+ storage_root : B256 :: from ( [ 0 ; 32 ] ) ,
1097
+ timestamp : 0 ,
1098
+ current_sync_committee : SummarizedSyncCommittee :: default ( ) ,
1099
+ next_sync_committee : None ,
1100
+ } ;
1101
+ let consensus_state_bz: Vec < u8 > = serde_json:: to_vec ( & consensus_state) . unwrap ( ) ;
1102
+
1103
+ let msg = InstantiateMsg {
1104
+ client_state : client_state_bz. into ( ) ,
1105
+ consensus_state : consensus_state_bz. into ( ) ,
1106
+ checksum : b"checksum" . into ( ) ,
1107
+ } ;
1108
+ let msg_copy = msg. clone ( ) ;
1109
+
1110
+ let res = instantiate ( deps. as_mut ( ) , mock_env ( ) , info, msg) . unwrap ( ) ;
1111
+ assert_eq ! ( 0 , res. messages. len( ) ) ;
1112
+
1113
+ let migrate_msg = MigrateMsg {
1114
+ migration : Migration :: UpdateForkParameters ( ForkParameters {
1115
+ genesis_fork_version : FixedBytes ( [ 0 ; 4 ] ) ,
1116
+ genesis_slot : 0 ,
1117
+ altair : Fork {
1118
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1119
+ epoch : 0 ,
1120
+ } ,
1121
+ bellatrix : Fork {
1122
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1123
+ epoch : 0 ,
1124
+ } ,
1125
+ capella : Fork {
1126
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1127
+ epoch : 0 ,
1128
+ } ,
1129
+ deneb : Fork {
1130
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1131
+ epoch : 0 ,
1132
+ } ,
1133
+ electra : Fork {
1134
+ version : FixedBytes ( [ 0 ; 4 ] ) ,
1135
+ epoch : 5000 ,
1136
+ } ,
1137
+ } ) ,
1138
+ } ;
1139
+
1140
+ // Migrate without any changes and without reinitializing (i.e. same state version)
1141
+ migrate ( deps. as_mut ( ) , mock_env ( ) , migrate_msg) . unwrap ( ) ;
1142
+
1143
+ let actual_wasm_client_state_any_bz =
1144
+ deps. storage . get ( HOST_CLIENT_STATE_KEY . as_bytes ( ) ) . unwrap ( ) ;
1145
+ let actual_wasm_client_state_any =
1146
+ Any :: decode ( actual_wasm_client_state_any_bz. as_slice ( ) ) . unwrap ( ) ;
1147
+ let wasm_client_state =
1148
+ WasmClientState :: decode ( actual_wasm_client_state_any. value . as_slice ( ) ) . unwrap ( ) ;
1149
+ // verify checksum hasn't changed
1150
+ assert_eq ! ( msg_copy. checksum, wasm_client_state. checksum) ;
1151
+ // verify latest height hasn't changed
1152
+ assert_eq ! (
1153
+ wasm_client_state. latest_height. unwrap( ) . revision_height,
1154
+ client_state. latest_slot
1155
+ ) ;
1156
+ // verify fork parameters have changed
1157
+ let eth_client_state: EthClientState =
1158
+ serde_json:: from_slice ( & wasm_client_state. data ) . unwrap ( ) ;
1159
+ assert_eq ! ( eth_client_state. latest_slot, client_state. latest_slot) ;
1160
+ assert_ne ! (
1161
+ eth_client_state. fork_parameters. electra. epoch,
1162
+ client_state. fork_parameters. electra. epoch
1163
+ ) ;
1164
+ assert_eq ! ( eth_client_state. fork_parameters. electra. epoch, 5000 ) ;
1165
+ }
1029
1166
}
1030
1167
}
0 commit comments