@@ -278,6 +278,23 @@ library VaaLib {
278
278
(vm, ) = decodeVmStructMemUnchecked (encodedVaa, 0 , encodedVaa.length );
279
279
}
280
280
281
+ function decodeVaaStructCd (
282
+ bytes calldata encodedVaa
283
+ ) internal pure returns (Vaa memory vaa ) {
284
+ uint envelopeOffset;
285
+ (vaa.header, envelopeOffset) = decodeVaaHeaderStructCdUnchecked (encodedVaa);
286
+
287
+ uint payloadOffset;
288
+ (vaa.envelope, payloadOffset) = decodeVaaEnvelopeStructCdUnchecked (encodedVaa, envelopeOffset);
289
+ vaa.payload = decodeVaaPayloadCd (encodedVaa, payloadOffset);
290
+ }
291
+
292
+ function decodeVaaStructMem (
293
+ bytes memory encodedVaa
294
+ ) internal pure returns (Vaa memory vaa ) {
295
+ (vaa, ) = decodeVaaStructMemUnchecked (encodedVaa, 0 , encodedVaa.length );
296
+ }
297
+
281
298
function decodeVaaEssentialsCd (
282
299
bytes calldata encodedVaa
283
300
) internal pure returns (
@@ -488,9 +505,10 @@ library VaaLib {
488
505
bytes memory encoded ,
489
506
uint envelopeOffset ,
490
507
uint vaaLength
491
- ) internal pure returns (bytes32 ) {
492
- return keccak256SliceUnchecked (encoded, envelopeOffset, vaaLength);
493
- }
508
+ ) internal pure returns (bytes32 ) { unchecked {
509
+ envelopeOffset.checkBound (vaaLength);
510
+ return keccak256SliceUnchecked (encoded, envelopeOffset, vaaLength - envelopeOffset);
511
+ }}
494
512
495
513
//see WARNING box at the top
496
514
function calcSingleHash (Vaa memory vaa ) internal pure returns (bytes32 ) {
@@ -553,6 +571,21 @@ library VaaLib {
553
571
) = decodeVaaBodyMemUnchecked (encoded, envelopeOffset, vaaLength);
554
572
}
555
573
574
+ function decodeVaaStructMemUnchecked (
575
+ bytes memory encoded ,
576
+ uint headerOffset ,
577
+ uint vaaLength
578
+ ) internal pure returns (Vaa memory vaa , uint newOffset ) {
579
+ uint envelopeOffset;
580
+ (vaa.header.guardianSetIndex, vaa.header.signatures, envelopeOffset) =
581
+ decodeVaaHeaderMemUnchecked (encoded, headerOffset);
582
+
583
+ uint payloadOffset;
584
+ (vaa.envelope, payloadOffset) = decodeVaaEnvelopeStructMemUnchecked (encoded, envelopeOffset);
585
+
586
+ (vaa.payload, newOffset) = decodeVaaPayloadMemUnchecked (encoded, payloadOffset, vaaLength);
587
+ }
588
+
556
589
function decodeVaaBodyCd (
557
590
bytes calldata encodedVaa ,
558
591
uint envelopeOffset
@@ -643,7 +676,7 @@ library VaaLib {
643
676
payloadOffset = offset;
644
677
}
645
678
646
- function decodeVaaEnvelopeStructCd (
679
+ function decodeVaaEnvelopeStructCdUnchecked (
647
680
bytes calldata encodedVaa ,
648
681
uint envelopeOffset
649
682
) internal pure returns (VaaEnvelope memory envelope , uint payloadOffset ) {
@@ -679,7 +712,7 @@ library VaaLib {
679
712
payloadOffset = offset;
680
713
}
681
714
682
- function decodeVaaEnvelopeStructMem (
715
+ function decodeVaaEnvelopeStructMemUnchecked (
683
716
bytes memory encoded ,
684
717
uint envelopeOffset
685
718
) internal pure returns (VaaEnvelope memory envelope , uint payloadOffset ) {
@@ -808,19 +841,19 @@ library VaaLib {
808
841
809
842
function decodeVaaPayloadCd (
810
843
bytes calldata encodedVaa ,
811
- uint offset
844
+ uint payloadOffset
812
845
) internal pure returns (bytes calldata payload ) {
813
- payload = _decodeRemainderCd (encodedVaa, offset );
846
+ payload = _decodeRemainderCd (encodedVaa, payloadOffset );
814
847
}
815
848
816
849
function decodeVaaPayloadMemUnchecked (
817
850
bytes memory encoded ,
818
- uint offset ,
851
+ uint payloadOffset ,
819
852
uint vaaLength
820
853
) internal pure returns (bytes memory payload , uint newOffset ) {
821
854
//check to avoid underflow in following subtraction
822
- offset .checkBound (vaaLength);
823
- (payload, newOffset) = encoded.sliceMemUnchecked (offset , vaaLength - offset );
855
+ payloadOffset .checkBound (vaaLength);
856
+ (payload, newOffset) = encoded.sliceMemUnchecked (payloadOffset , vaaLength - payloadOffset );
824
857
}
825
858
826
859
// ------------ Encoding ------------
0 commit comments