@@ -145,22 +145,20 @@ impl WormholeContract {
145
145
Ok ( ( ) )
146
146
}
147
147
148
-
149
-
150
148
pub fn get_guardian_set ( & self , index : u32 ) -> Result < Vec < u8 > , Vec < u8 > > {
151
149
if !self . initialized . get ( ) {
152
150
return Err ( WormholeError :: NotInitialized . into ( ) ) ;
153
151
}
154
152
155
153
match self . get_gs_internal ( index) {
156
- Some ( guardian_set) => {
154
+ Ok ( guardian_set) => {
157
155
let mut encoded = Vec :: with_capacity ( guardian_set. keys . len ( ) * 20 ) ;
158
156
for address in & guardian_set. keys {
159
157
encoded. extend_from_slice ( address. as_slice ( ) ) ;
160
158
}
161
159
Ok ( encoded)
162
160
} ,
163
- None => Err ( WormholeError :: InvalidGuardianSetIndex . into ( ) ) ,
161
+ Err ( e ) => Err ( e . into ( ) ) ,
164
162
}
165
163
}
166
164
@@ -175,7 +173,7 @@ impl WormholeContract {
175
173
176
174
let vaa = self . parse_vm ( & encoded_vaa) ?;
177
175
178
- let _verified = self . verify_vm ( & vaa) ;
176
+ let _verified = self . verify_vm ( & vaa) ? ;
179
177
180
178
Ok ( vaa. payload )
181
179
}
@@ -300,9 +298,8 @@ impl WormholeContract {
300
298
}
301
299
302
300
fn verify_vm ( & self , vaa : & VerifiedVMM ) -> Result < ( ) , WormholeError > {
303
- let guardian_set = self . get_gs_internal ( vaa. guardian_set_index )
304
- . ok_or ( WormholeError :: InvalidGuardianSetIndex ) ?;
305
301
302
+ let guardian_set = self . get_gs_internal ( vaa. guardian_set_index ) ?;
306
303
if vaa. guardian_set_index != self . current_guardian_set_index . get ( ) . try_into ( ) . unwrap_or ( 0u32 )
307
304
&& guardian_set. expiration_time > 0 {
308
305
return Err ( WormholeError :: GuardianSetExpired )
@@ -379,6 +376,22 @@ impl WormholeContract {
379
376
Ok ( ( ) )
380
377
}
381
378
379
+ fn store_guardian_set ( & mut self , set_index : u32 , guardians : Vec < Address > , expiration_time : u32 ) -> Result < ( ) , WormholeError > {
380
+ if guardians. is_empty ( ) {
381
+ return Err ( WormholeError :: InvalidInput ) ;
382
+ }
383
+
384
+ self . guardian_set_sizes . setter ( U256 :: from ( set_index) ) . set ( U256 :: from ( guardians. len ( ) ) ) ;
385
+ self . guardian_set_expiry . setter ( U256 :: from ( set_index) ) . set ( U256 :: from ( expiration_time) ) ;
386
+
387
+ for ( i, guardian) in guardians. iter ( ) . enumerate ( ) {
388
+ let key = self . compute_gs_key ( set_index, i as u8 ) ;
389
+ self . guardian_keys . setter ( key) . set ( * guardian) ;
390
+ }
391
+
392
+ Ok ( ( ) )
393
+ }
394
+
382
395
fn verify_signature (
383
396
& self ,
384
397
hash : & FixedBytes < 32 > ,
@@ -414,10 +427,10 @@ impl WormholeContract {
414
427
Ok ( Address :: from ( address_bytes) == guardian_address)
415
428
}
416
429
417
- fn get_gs_internal ( & self , index : u32 ) -> Option < GuardianSet > {
430
+ fn get_gs_internal ( & self , index : u32 ) -> Result < GuardianSet , WormholeError > {
418
431
let size = self . guardian_set_sizes . getter ( U256 :: from ( index) ) . get ( ) ;
419
432
if size. is_zero ( ) {
420
- return None ;
433
+ return Err ( WormholeError :: InvalidGuardianSetIndex ) ;
421
434
}
422
435
423
436
let size_u32: u32 = size. try_into ( ) . unwrap_or ( 0 ) ;
@@ -426,7 +439,7 @@ impl WormholeContract {
426
439
let i_u8: u8 = match i. try_into ( ) {
427
440
Ok ( val) => val,
428
441
Err ( _) => {
429
- return None ;
442
+ return Err ( WormholeError :: InvalidGuardianIndex ) ;
430
443
}
431
444
} ;
432
445
let key = self . compute_gs_key ( index, i_u8) ;
@@ -436,7 +449,7 @@ impl WormholeContract {
436
449
437
450
let expiry = self . guardian_set_expiry . getter ( U256 :: from ( index) ) . get ( ) ;
438
451
let expiry_u32: u32 = expiry. try_into ( ) . unwrap_or ( 0 ) ;
439
- Some ( GuardianSet {
452
+ Ok ( GuardianSet {
440
453
keys,
441
454
expiration_time : expiry_u32,
442
455
} )
@@ -455,7 +468,7 @@ impl IWormhole for WormholeContract {
455
468
}
456
469
457
470
fn get_guardian_set ( & self , index : u32 ) -> Option < GuardianSet > {
458
- self . get_gs_internal ( index)
471
+ self . get_gs_internal ( index) . ok ( )
459
472
}
460
473
461
474
fn get_current_guardian_set_index ( & self ) -> u32 {
@@ -537,6 +550,31 @@ mod tests {
537
550
0x39 , 0x3a , 0x3b , 0x3c , 0x3d , 0x3e , 0x3f , 0x40 ,
538
551
]
539
552
}
553
+
554
+ #[ cfg( test) ]
555
+ fn current_guardians ( ) -> Vec < Address > {
556
+ vec ! [
557
+ Address :: from_str( "0x5893B5A76c3f739645648885bDCcC06cd70a3Cd3" ) . unwrap( ) , // Rockaway
558
+ Address :: from_str( "0xfF6CB952589BDE862c25Ef4392132fb9D4A42157" ) . unwrap( ) , // Staked
559
+ Address :: from_str( "0x114De8460193bdf3A2fCf81f86a09765F4762fD1" ) . unwrap( ) , // Figment
560
+ Address :: from_str( "0x107A0086b32d7A0977926A205131d8731D39cbEB" ) . unwrap( ) , // ChainodeTech
561
+ Address :: from_str( "0x8C82B2fd82FaeD2711d59AF0F2499D16e726f6b2" ) . unwrap( ) , // Inotel
562
+ Address :: from_str( "0x11b39756C042441BE6D8650b69b54EbE715E2343" ) . unwrap( ) , // HashKey Cloud
563
+ Address :: from_str( "0x54Ce5B4D348fb74B958e8966e2ec3dBd4958a7cd" ) . unwrap( ) , // ChainLayer
564
+ Address :: from_str( "0x15e7cAF07C4e3DC8e7C469f92C8Cd88FB8005a20" ) . unwrap( ) , // xLabs
565
+ Address :: from_str( "0x74a3bf913953D695260D88BC1aA25A4eeE363ef0" ) . unwrap( ) , // Forbole
566
+ Address :: from_str( "0x000aC0076727b35FBea2dAc28fEE5cCB0fEA768e" ) . unwrap( ) , // Staking Fund
567
+ Address :: from_str( "0xAF45Ced136b9D9e24903464AE889F5C8a723FC14" ) . unwrap( ) , // Moonlet Wallet
568
+ Address :: from_str( "0xf93124b7c738843CBB89E864c862c38cddCccF95" ) . unwrap( ) , // P2P Validator
569
+ Address :: from_str( "0xD2CC37A4dc036a8D232b48f62cDD4731412f4890" ) . unwrap( ) , // 01node
570
+ Address :: from_str( "0xDA798F6896A3331F64b48c12D1D57Fd9cbe70811" ) . unwrap( ) , // MCF
571
+ Address :: from_str( "0x71AA1BE1D36CaFE3867910F99C09e347899C19C3" ) . unwrap( ) , // Everstake
572
+ Address :: from_str( "0x8192b6E7387CCd768277c17DAb1b7a5027c0b3Cf" ) . unwrap( ) , // Chorus One
573
+ Address :: from_str( "0x178e21ad2E77AE06711549CFBB1f9c7a9d8096e8" ) . unwrap( ) , // Syncnode
574
+ Address :: from_str( "0x5E1487F35515d02A92753504a8D75471b9f49EdB" ) . unwrap( ) , // Triton
575
+ Address :: from_str( "0x6FbEBc898F403E4773E95feB15E80C9A99c8348d" ) . unwrap( ) , // Staking Facilities
576
+ ]
577
+ }
540
578
541
579
#[ cfg( test) ]
542
580
fn test_guardian_address1 ( ) -> Address {
@@ -575,6 +613,16 @@ mod tests {
575
613
contract. initialize ( guardians, CHAIN_ID , GOVERNANCE_CHAIN_ID , governance_contract) . unwrap ( ) ;
576
614
contract
577
615
}
616
+
617
+ #[ cfg( test) ]
618
+ fn deploy_with_real_guardians ( ) -> WormholeContract {
619
+ let mut contract = WormholeContract :: default ( ) ;
620
+ let guardians = current_guardians ( ) ;
621
+ let governance_contract = Address :: from_slice ( & GOVERNANCE_CONTRACT . to_be_bytes :: < 32 > ( ) [ 12 ..32 ] ) ;
622
+ contract. initialize ( guardians, CHAIN_ID , GOVERNANCE_CHAIN_ID , governance_contract) . unwrap ( ) ;
623
+ contract. store_guardian_set ( 4 , current_guardians ( ) , 0 ) ;
624
+ contract
625
+ }
578
626
579
627
#[ cfg( test) ]
580
628
fn deploy_with_current_guardians ( ) -> WormholeContract {
@@ -721,6 +769,14 @@ mod tests {
721
769
assert_eq ! ( WormholeContract :: quorum( 19 ) , 13 ) ;
722
770
}
723
771
772
+ #[ motsu:: test]
773
+ fn test_vaa_invalid_guardian_set_idx ( ) {
774
+ let contract = deploy_with_real_guardians ( ) ;
775
+ let test_vaa = create_vaa_bytes ( "AQAHHHQNAKPLun8KH+IfCb2c9rlKrXV8wDcZUeMtLeoxoJLHAu7kH40xE1IY5uaJLT4PRsWDDv+7GHNT8rDP+4hUaJNHMtkBAvbQ7aUofV+VAoXjfqrU+V4Vzgvkpwuowaj0BMzNTSp2PkKz5BsnfvC7cxVwOw9sJnQfPvN8KrmhA0IXgQdkQDIBA/0sVNcwZm1oic2G6r7c3x5DyEO9sRF2sTDyM4nuiOtaWPbgolaK6iU3yTx2bEzjdKsdVD2z3qs/QReV8ZxtA5MBBKSm2RKacsgdvwwNZPB3Ifw3P2niCAhZA435PkYeZpDBd8GQ4hALy+42lffR+AXJu19pNs+thWSxq7GRxF5oKz8BBYYS1n9/PJOybDhuWS+PI6YU0CFVTC9pTFSFTlMcEpjsUbT+cUKYCcFU63YaeVGUEPmhFYKeUeRhhQ5g2cCPIegABqts6uHMo5hrdXujJHVEqngLCSaQpB2W9I32LcIvKBfxLcx9IZTjxJ36tyNo7VJ6Fu1FbXnLW0lzaSIbmVmlGukABzpn+9z3bHT6g16HeroSW/YWNlZD5Jo6Zuw9/LT4VD0ET3DgFZtzytkWlJJKAuEB26wRHZbzLAKXfRl+j8kylWQACTTiIiCjZxmEUWjWzWe3JvvPKMNRvYkGkdGaQ7bWVvdiZvxoDq1XHB2H7WnqaAU6xY2pLyf6JG+lV+XZ/GEY+7YBDD/NU/C/gNZP9RP+UujaeJFWt2dau+/g2vtnX/gs2sgBf+yMYm6/dFaT0TiJAcG42zqOi24DLpsdVefaUV1G7CABDjmSRpA//pdAOL5ZxEFG1ia7TnwslsgsvVOa4pKUp5HSZv1JEUO6xMDkTOrBBt5vv9n6zYp3tpYHgUB/fZDh/qUBDzHxNtrQuL/n8a2HOY34yqljpBOCigAbHj+xQmu85u8ieUyge/2zqTn8PYMcka3pW1WTzOAOZf1pLHO+oPEfkTMBEGUS9UOAeY6IUabiEtAQ6qnR47WgPPHYSZUtKBkU0JscDgW0cFq47qmet9OCo79183dRDYE0kFIhnJDk/r7Cq4ABEfBBD83OEF2LJKKkJIBL/KBiD/Mjh3jwKXqqj28EJt1lKCYiGlPhqOCqRArydP94c37MSdrrPlkh0bhcFYs3deMAaEhJXwAAAAAABQAAAAAAAAAAAAAAACdCjdLT3TKk1/fEl+qqIxMNiUkRAAAAAAAEDRXIAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMMN2oOke3QAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABu3yoHkAEAAAAAAAAAAAAAAAAPpLFVLLUvQgzfCF8uDxxgOpZXNaAAAAAAAAAAAAAAAAegpThHd29+lMw1dClxrLIhew24EAAAAAAAAAAAAAAAB6ClOEd3b36UzDV0KXGssiF7DbgQAAAAAAAAAAAAAAACdCjdLT3TKk1/fEl+qqIxMNiUkRAA==" ) ;
776
+ let result = contract. parse_and_verify_vm ( test_vaa) ;
777
+ assert ! ( matches!( result, Err ( WormholeError :: InvalidGuardianSetIndex ) ) ) ;
778
+ }
779
+
724
780
#[ motsu:: test]
725
781
fn test_wormhole_vaa_parsing ( ) {
726
782
let vaa_vec = test_wormhole_vaa ( ) ;
@@ -853,7 +909,7 @@ mod tests {
853
909
let contract = deploy_with_test_guardian ( ) ;
854
910
855
911
let result = contract. get_gs_internal ( 999 ) ;
856
- assert ! ( result. is_none ( ) ) ;
912
+ assert ! ( result. is_err ( ) ) ;
857
913
}
858
914
859
915
#[ motsu:: test]
@@ -948,8 +1004,7 @@ mod tests {
948
1004
949
1005
let _ = contract. store_gs ( 0 , guardians. clone ( ) , 0 ) ;
950
1006
let retrieved_set = contract
951
- . get_gs_internal ( 0 )
952
- . ok_or ( WormholeError :: InvalidGuardianSetIndex ) ?;
1007
+ . get_gs_internal ( 0 ) ?;
953
1008
954
1009
assert_eq ! ( retrieved_set. keys, guardians) ;
955
1010
assert_eq ! ( retrieved_set. expiration_time, 0 ) ;
0 commit comments