Skip to content

Commit 689a907

Browse files
committed
fix: correctly provide all of the package in rawMessage
1 parent 5639765 commit 689a907

File tree

4 files changed

+105
-11
lines changed

4 files changed

+105
-11
lines changed

src/apps/layerzero/IncentivizedLayerZeroEscrow.sol

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,17 @@ contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero
187187
asset = address(0);
188188
}
189189

190-
function _verifyPacket(bytes calldata _packetHeader, bytes calldata _packet) internal view override returns(bytes32 sourceIdentifier, bytes memory implementationIdentifier, bytes calldata message_) {
191-
_assertHeader(_packetHeader);
190+
function _verifyPacket(bytes calldata /* _packetHeader */, bytes calldata _packet) view internal override returns(bytes32 sourceIdentifier, bytes memory implementationIdentifier, bytes calldata message_) {
191+
_assertHeader(_packet.header());
192192

193193
// Check that we are the receiver
194-
address receiver = _packetHeader.receiverB20();
194+
address receiver = _packet.receiverB20();
195195
if (receiver != address(this)) revert IncorrectDestination(receiver);
196196

197197
// Get the source chain.
198-
uint32 srcEid = _packetHeader.srcEid();
198+
uint32 srcEid = _packet.srcEid();
199199

200-
bytes32 _headerHash = keccak256(_packetHeader);
200+
bytes32 _headerHash = keccak256(_packet);
201201
bytes32 _payloadHash = _packet.payloadHash();
202202

203203
// The ULN may not be constant since it depends on the srcEid. :(
@@ -213,6 +213,7 @@ contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero
213213
if (!verifyable) {
214214
// LayerZero may have migrated to a new receive library. Check the timeout receive library.
215215
(address timeoutULN, ) = ENDPOINT.defaultReceiveLibraryTimeout(srcEid);
216+
if (timeoutULN == address(0)) revert LZ_ULN_Verifying();
216217
ULN = IReceiveUlnBase(timeoutULN);
217218
verifyable = ULN.verifiable(_config, _headerHash, _payloadHash);
218219
if (!verifyable) revert LZ_ULN_Verifying();
@@ -221,7 +222,7 @@ contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero
221222
// Get the source chain
222223
sourceIdentifier = bytes32(uint256(srcEid));
223224
// Get the sender
224-
implementationIdentifier = abi.encode(_packetHeader.sender());
225+
implementationIdentifier = abi.encode(_packet.sender());
225226
// Get the message
226227
message_ = _packet.message();
227228
}
@@ -258,10 +259,7 @@ contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero
258259
require(allowExternalCall != 1, "Do not send ether to this address");
259260
}
260261

261-
262262
function _assertHeader(bytes calldata _packetHeader) internal view {
263-
// assert packet header is of right size 81
264-
if (_packetHeader.length != 81) revert LZ_ULN_InvalidPacketHeader();
265263
// assert packet header version is the same as ULN
266264
if (_packetHeader.version() != PacketV1Codec.PACKET_VERSION) revert LZ_ULN_InvalidPacketVersion();
267265
// assert the packet is for this endpoint

test/layerzero/LZCommon.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ contract LZCommon is Test {
4949

5050
// Set ULN Config
5151
UlnConfig memory baseConfig = UlnConfig({
52-
confirmations: 0,
52+
confirmations: 1,
5353
requiredDVNCount: 1,
5454
optionalDVNCount: 0,
5555
optionalDVNThreshold: 0,
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.22;
3+
4+
import { LZCommon } from "./LZCommon.t.sol";
5+
6+
import { Packet } from "LayerZero-v2/protocol/contracts/interfaces/ISendLib.sol";
7+
import { PacketV1Codec } from "LayerZero-v2/protocol/contracts/messagelib/libs/PacketV1Codec.sol";
8+
import { GUID } from "LayerZero-v2/protocol/contracts/libs/GUID.sol";
9+
10+
contract TestLZVerifyPacket is LZCommon {
11+
using PacketV1Codec for bytes;
12+
using PacketV1Codec for Packet;
13+
14+
event ExecutorFeePaid(address executor, uint256 fee);
15+
event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);
16+
17+
function _set_init_config() internal {
18+
uint32[] memory remoteEids = new uint32[](2);
19+
remoteEids[0] = remoteEid;
20+
remoteEids[1] = localEid;
21+
22+
address sendLibrary = endpoint.getSendLibrary(address(layerZeroEscrow), remoteEid);
23+
layerZeroEscrow.initConfig(sendLibrary, remoteEids);
24+
}
25+
26+
function setUp() public override {
27+
super.setUp();
28+
_set_init_config();
29+
}
30+
31+
function test_revert_verify_packet_no_proof(bytes calldata message) external {
32+
vm.assume(message.length > 0);
33+
address target = address(layerZeroEscrow);
34+
35+
uint64 nonce = 1;
36+
uint32 dstEid = localEid;
37+
bytes32 receiver = bytes32(uint256(uint160(target)));
38+
address sender = address(layerZeroEscrow);
39+
40+
bytes32 guid = GUID.generate(nonce, localEid, sender, dstEid, receiver);
41+
42+
Packet memory packet = Packet({
43+
nonce: nonce,
44+
srcEid: remoteEid,
45+
sender: sender,
46+
dstEid: dstEid,
47+
receiver: receiver,
48+
guid: guid,
49+
message: message
50+
});
51+
52+
bytes memory _packet = PacketV1Codec.encode(packet);
53+
54+
vm.expectRevert(abi.encodeWithSignature("LZ_ULN_Verifying()"));
55+
layerZeroEscrow.verifyPacket(hex"", _packet);
56+
}
57+
58+
function test_verify_packet(bytes calldata message) external {
59+
vm.assume(message.length > 0);
60+
address target = address(layerZeroEscrow);
61+
62+
uint64 nonce = 1;
63+
uint32 dstEid = localEid;
64+
bytes32 receiver = bytes32(uint256(uint160(target)));
65+
address sender = address(layerZeroEscrow);
66+
67+
bytes32 guid = GUID.generate(nonce, localEid, sender, dstEid, receiver);
68+
69+
Packet memory packet = Packet({
70+
nonce: nonce,
71+
srcEid: remoteEid,
72+
sender: sender,
73+
dstEid: dstEid,
74+
receiver: receiver,
75+
guid: guid,
76+
message: message
77+
});
78+
79+
bytes memory _packet = packet.encode();
80+
81+
bytes32 ph = this.payloadHash(packet.encode());
82+
83+
vm.prank(address(mockDVN));
84+
receiveULN.verify(
85+
packet.encodePacketHeader(),
86+
ph,
87+
10
88+
);
89+
90+
layerZeroEscrow.verifyPacket(hex"", _packet);
91+
}
92+
93+
function payloadHash(bytes calldata pl) pure public returns(bytes32) {
94+
return pl.payloadHash();
95+
}
96+
}

test/layerzero/mock/MockLayerZeroEscrow.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ contract MockLayerZeroEscrow is IncentivizedLayerZeroEscrow {
1010

1111
constructor(address sendLostGasTo, address lzEndpointV2) IncentivizedLayerZeroEscrow(sendLostGasTo, lzEndpointV2) {}
1212

13-
function verifyPacket(bytes calldata _packetHeader, bytes calldata _packet) external view returns(bytes32 sourceIdentifier, bytes memory implementationIdentifier, bytes calldata message_) {
13+
function verifyPacket(bytes calldata _packetHeader, bytes calldata _packet) view external returns(bytes32 sourceIdentifier, bytes memory implementationIdentifier, bytes calldata message_) {
1414
return _verifyPacket(_packetHeader, _packet);
1515
}
1616

0 commit comments

Comments
 (0)