@@ -191,108 +191,133 @@ impl WormholeContract {
191
191
if encoded_vaa. len ( ) < 6 {
192
192
return Err ( WormholeError :: InvalidVAAFormat ) ;
193
193
}
194
-
194
+
195
195
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 ) ?;
198
200
cursor += 1 ;
199
-
200
- if version != 1 {
201
+
202
+ if * version != 1 {
201
203
return Err ( WormholeError :: InvalidVAAFormat ) ;
202
204
}
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
+ ) ;
210
213
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 ) ?;
213
218
cursor += 1 ;
214
-
215
- let mut signatures = Vec :: with_capacity ( len_signatures as usize ) ;
216
-
219
+
217
220
if len_signatures > 19 {
218
221
return Err ( WormholeError :: InvalidVAAFormat ) ;
219
222
}
220
-
223
+
224
+ let mut signatures = Vec :: with_capacity ( len_signatures as usize ) ;
225
+
221
226
for _ in 0 ..len_signatures {
222
227
if cursor + 66 > encoded_vaa. len ( ) {
223
228
return Err ( WormholeError :: InvalidVAAFormat ) ;
224
229
}
225
-
226
- let guardian_index = encoded_vaa[ cursor] ;
230
+
231
+ let guardian_index = * encoded_vaa. get ( cursor)
232
+ . ok_or ( WormholeError :: InvalidVAAFormat ) ?;
227
233
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) ;
231
239
cursor += 65 ;
232
-
240
+
233
241
signatures. push ( GuardianSignature {
234
242
guardian_index,
235
- signature : FixedBytes :: from ( sig_bytes ) ,
243
+ signature : FixedBytes :: from ( fixed_sig ) ,
236
244
} ) ;
237
245
}
238
-
246
+
239
247
if cursor + 51 > encoded_vaa. len ( ) {
240
248
return Err ( WormholeError :: InvalidVAAFormat ) ;
241
249
}
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
+ ) ;
248
258
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
+ ) ;
255
267
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 ) ?;
257
272
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 ] ,
260
275
] ) ;
261
276
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) ;
265
283
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
+ ) ;
273
292
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 ) ?;
276
297
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
+
280
304
let hash = keccak256 ( & encoded_vaa[ cursor - 51 ..] ) ;
281
-
305
+
282
306
Ok ( VerifiedVM {
283
- version,
307
+ version : * version ,
284
308
guardian_set_index,
285
309
signatures,
286
310
timestamp,
287
311
nonce,
288
312
emitter_chain_id,
289
- emitter_address : FixedBytes :: from ( emitter_address_bytes ) ,
313
+ emitter_address : FixedBytes :: from ( fixed_emitter ) ,
290
314
sequence,
291
315
consistency_level,
292
316
payload,
293
317
hash,
294
318
} )
295
319
}
320
+
296
321
297
322
fn verify_vm ( & self , vaa : & VerifiedVM ) -> Result < ( ) , WormholeError > {
298
323
0 commit comments