@@ -191,108 +191,133 @@ impl WormholeContract {
191191 if encoded_vaa. len ( ) < 6 {
192192 return Err ( WormholeError :: InvalidVAAFormat ) ;
193193 }
194-
194+
195195 let mut cursor = 0 ;
196-
197- let version = encoded_vaa[ cursor] ;
196+
197+ // Get version
198+ let version = encoded_vaa. get ( cursor)
199+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
198200 cursor += 1 ;
199-
200- if version != 1 {
201+
202+ if * version != 1 {
201203 return Err ( WormholeError :: InvalidVAAFormat ) ;
202204 }
203-
204- let gsi_bytes: [ u8 ; 4 ] = encoded_vaa[ cursor..cursor + 4 ]
205- . try_into ( )
206- . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?;
207-
208- let guardian_set_index = u32:: from_be_bytes ( gsi_bytes) ;
209-
205+
206+ // Get guardian set index
207+ let gsi_bytes = encoded_vaa. get ( cursor..cursor + 4 )
208+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
209+ let guardian_set_index = u32:: from_be_bytes (
210+ gsi_bytes. try_into ( )
211+ . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?
212+ ) ;
210213 cursor += 4 ;
211-
212- let len_signatures = encoded_vaa[ cursor] ;
214+
215+ // Get number of signatures
216+ let len_signatures = * encoded_vaa. get ( cursor)
217+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
213218 cursor += 1 ;
214-
215- let mut signatures = Vec :: with_capacity ( len_signatures as usize ) ;
216-
219+
217220 if len_signatures > 19 {
218221 return Err ( WormholeError :: InvalidVAAFormat ) ;
219222 }
220-
223+
224+ let mut signatures = Vec :: with_capacity ( len_signatures as usize ) ;
225+
221226 for _ in 0 ..len_signatures {
222227 if cursor + 66 > encoded_vaa. len ( ) {
223228 return Err ( WormholeError :: InvalidVAAFormat ) ;
224229 }
225-
226- let guardian_index = encoded_vaa[ cursor] ;
230+
231+ let guardian_index = * encoded_vaa. get ( cursor)
232+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
227233 cursor += 1 ;
228-
229- let mut sig_bytes = [ 0u8 ; 65 ] ;
230- sig_bytes. copy_from_slice ( & encoded_vaa[ cursor..cursor + 65 ] ) ;
234+
235+ let sig_bytes = encoded_vaa. get ( cursor..cursor + 65 )
236+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
237+ let mut fixed_sig = [ 0u8 ; 65 ] ;
238+ fixed_sig. copy_from_slice ( sig_bytes) ;
231239 cursor += 65 ;
232-
240+
233241 signatures. push ( GuardianSignature {
234242 guardian_index,
235- signature : FixedBytes :: from ( sig_bytes ) ,
243+ signature : FixedBytes :: from ( fixed_sig ) ,
236244 } ) ;
237245 }
238-
246+
239247 if cursor + 51 > encoded_vaa. len ( ) {
240248 return Err ( WormholeError :: InvalidVAAFormat ) ;
241249 }
242-
243- let ts_bytes: [ u8 ; 4 ] = encoded_vaa[ cursor..cursor + 4 ]
244- . try_into ( )
245- . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?;
246-
247- let timestamp = u32:: from_be_bytes ( ts_bytes) ;
250+
251+ // Get timestamp
252+ let ts_bytes = encoded_vaa. get ( cursor..cursor + 4 )
253+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
254+ let timestamp = u32:: from_be_bytes (
255+ ts_bytes. try_into ( )
256+ . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?
257+ ) ;
248258 cursor += 4 ;
249-
250- let nonce_bytes: [ u8 ; 4 ] = encoded_vaa[ cursor..cursor + 4 ]
251- . try_into ( )
252- . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?;
253-
254- let nonce = u32:: from_be_bytes ( nonce_bytes) ;
259+
260+ // Get nonce
261+ let nonce_bytes = encoded_vaa. get ( cursor..cursor + 4 )
262+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
263+ let nonce = u32:: from_be_bytes (
264+ nonce_bytes. try_into ( )
265+ . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?
266+ ) ;
255267 cursor += 4 ;
256-
268+
269+ // Get emitter chain ID
270+ let emitter_chain_bytes = encoded_vaa. get ( cursor..cursor + 2 )
271+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
257272 let emitter_chain_id = u16:: from_be_bytes ( [
258- encoded_vaa [ cursor ] ,
259- encoded_vaa [ cursor + 1 ] ,
273+ emitter_chain_bytes [ 0 ] ,
274+ emitter_chain_bytes [ 1 ] ,
260275 ] ) ;
261276 cursor += 2 ;
262-
263- let mut emitter_address_bytes = [ 0u8 ; 32 ] ;
264- emitter_address_bytes. copy_from_slice ( & encoded_vaa[ cursor..cursor + 32 ] ) ;
277+
278+ // Get emitter address
279+ let emitter_address_bytes = encoded_vaa. get ( cursor..cursor + 32 )
280+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
281+ let mut fixed_emitter = [ 0u8 ; 32 ] ;
282+ fixed_emitter. copy_from_slice ( emitter_address_bytes) ;
265283 cursor += 32 ;
266-
267- let sequence_bytes: [ u8 ; 8 ] = encoded_vaa[ cursor..cursor + 8 ]
268- . try_into ( )
269- . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?;
270-
271- let sequence = u64:: from_be_bytes ( sequence_bytes) ;
272-
284+
285+ // Get sequence
286+ let sequence_bytes = encoded_vaa. get ( cursor..cursor + 8 )
287+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
288+ let sequence = u64:: from_be_bytes (
289+ sequence_bytes. try_into ( )
290+ . map_err ( |_| WormholeError :: InvalidVAAFormat ) ?
291+ ) ;
273292 cursor += 8 ;
274-
275- let consistency_level = encoded_vaa[ cursor] ;
293+
294+ // Get consistency level
295+ let consistency_level = * encoded_vaa. get ( cursor)
296+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
276297 cursor += 1 ;
277-
278- let payload = encoded_vaa[ cursor..] . to_vec ( ) ;
279-
298+
299+ // Get payload
300+ let payload = encoded_vaa. get ( cursor..)
301+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?
302+ . to_vec ( ) ;
303+
280304 let hash = keccak256 ( & encoded_vaa[ cursor - 51 ..] ) ;
281-
305+
282306 Ok ( VerifiedVM {
283- version,
307+ version : * version ,
284308 guardian_set_index,
285309 signatures,
286310 timestamp,
287311 nonce,
288312 emitter_chain_id,
289- emitter_address : FixedBytes :: from ( emitter_address_bytes ) ,
313+ emitter_address : FixedBytes :: from ( fixed_emitter ) ,
290314 sequence,
291315 consistency_level,
292316 payload,
293317 hash,
294318 } )
295319 }
320+
296321
297322 fn verify_vm ( & self , vaa : & VerifiedVM ) -> Result < ( ) , WormholeError > {
298323
0 commit comments