11// SPDX-License-Identifier: MIT
22pragma solidity ^ 0.8.15 ;
33
4+ import {LibBit} from "solady/utils/LibBit.sol " ;
5+
46import {Bridge} from "../Bridge.sol " ;
57import {CrossChainMessenger} from "../CrossChainMessenger.sol " ;
68import {ISolanaMessagePasser} from "../interfaces/ISolanaMessagePasser.sol " ;
79
810library Encoder {
11+ using LibBit for uint256 ;
12+
913 function encodeBridgePayload (Bridge.BridgePayload memory payload ) internal pure returns (bytes memory ) {
1014 return abi.encodePacked (
1115 payload.localToken,
1216 payload.remoteToken,
1317 payload.from,
1418 payload.to,
1519 payload.amount,
16- uint32 (payload.extraData.length ),
20+ _getLeLength (payload.extraData.length ),
1721 payload.extraData
1822 );
1923 }
@@ -23,13 +27,13 @@ library Encoder {
2327 pure
2428 returns (bytes memory )
2529 {
26- bytes memory serializedIxs = abi.encodePacked (uint32 (payload.ixs.length ));
30+ bytes memory serializedIxs = abi.encodePacked (_getLeLength (payload.ixs.length ));
2731
2832 for (uint256 i; i < payload.ixs.length ; i++ ) {
2933 serializedIxs = abi.encodePacked (serializedIxs, serializeIx (payload.ixs[i]));
3034 }
3135
32- return abi.encodePacked (payload.nonce, payload.sender, uint32 (serializedIxs.length ), serializedIxs);
36+ return abi.encodePacked (payload.nonce, payload.sender, _getLeLength (serializedIxs.length ), serializedIxs);
3337 }
3438
3539 function encodeMessage (uint256 nonce , address sender , ISolanaMessagePasser.Instruction[] memory ixs )
@@ -48,14 +52,14 @@ library Encoder {
4852
4953 function serializeIx (ISolanaMessagePasser.Instruction memory ix ) internal pure returns (bytes memory ) {
5054 bytes memory data = abi.encodePacked (ix.programId);
51- data = abi.encodePacked (data, uint32 (ix.accounts.length ));
55+ data = abi.encodePacked (data, _getLeLength (ix.accounts.length ));
5256
5357 for (uint256 i; i < ix.accounts.length ; i++ ) {
5458 ISolanaMessagePasser.AccountMeta memory account = ix.accounts[i];
5559 data = abi.encodePacked (data, account.pubKey, account.isWritable, account.isSigner);
5660 }
5761
58- data = abi.encodePacked (data, uint32 (ix.data.length ), ix.data);
62+ data = abi.encodePacked (data, _getLeLength (ix.data.length ), ix.data);
5963
6064 return data;
6165 }
@@ -70,4 +74,8 @@ library Encoder {
7074
7175 return abi.encodePacked (data, ix.data);
7276 }
77+
78+ function _getLeLength (uint256 inp ) private pure returns (uint32 ) {
79+ return uint32 (inp.reverseBytes () >> 224 );
80+ }
7381}
0 commit comments