From ed3e38fd2bb9de45ac740bcd3e5941c6161fc803 Mon Sep 17 00:00:00 2001 From: Daniel <77058885+0xDEnYO@users.noreply.github.com> Date: Sat, 11 Jan 2025 21:25:33 +0700 Subject: [PATCH] (fix): adds calldata extraction handling for GenericSwapV3 single swap calls (CallDataVerificationFacet v1.2.0) [CalldataVerificationFacet v1.2.0,IAcrossSpokePool v1.0.0] (#767) * adds extraction handling for GenericSwapV3 single calldata * push test coverage to 100% * remove lcov-filtered.info * minor update * remove console import * gas optimization (audit issue #7) * adds handling for StargateV2 destination calls (audit issue #8) * gas optimization in extractGenericSwapParameters (audit issue #6) * update min callData length check (audit issue #4) * gas optimization in extractNonEVMAddress (audit issue #3) * update comments, fix typo (audit issue#2) * adds handling for AcrossV3 destination calls (audit issue #9) * typo fixed in comment * gas optimization * updates audit log and adds audit report * update log --------- Co-authored-by: Ed Zynda Co-authored-by: Ed Zynda --- audit/auditLog.json | 17 ++ .../2024.09.02_CalldataVerificationFacet.pdf | Bin 0 -> 111703 bytes src/Facets/CalldataVerificationFacet.sol | 209 ++++++++++--- src/Interfaces/IAcrossSpokePool.sol | 2 +- .../Facets/CalldataVerificationFacet.t.sol | 279 +++++++++++++++++- 5 files changed, 463 insertions(+), 44 deletions(-) create mode 100644 audit/reports/2024.09.02_CalldataVerificationFacet.pdf diff --git a/audit/auditLog.json b/audit/auditLog.json index c14ba974f..50e1354a0 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -7,6 +7,13 @@ "auditReportPath": "./audit/reports/2024.08.14_StargateFacetV2_ReAudit.pdf", "auditCommitHash": "d622002440317580b5d0fb90ef22b839d84957e2" }, + "audit20240902": { + "auditCompletedOn": "02.09.2024", + "auditedBy": "Sujith Somraaj (individual security researcher)", + "auditorGitHandle": "sujithsomraaj", + "auditReportPath": "./audit/reports/2024.09.02_CalldataVerificationFacet.pdf", + "auditCommitHash": "374d066a2d4ffd98eb6042cac7a2dd4aa0bf2ff8" + }, "audit20240913": { "auditCompletedOn": "13.09.2024", "auditedBy": "Sujith Somraaj (individual security researcher)", @@ -137,6 +144,11 @@ "audit20241206" ] }, + "CalldataVerificationFacet": { + "1.2.0": [ + "audit20240902" + ] + }, "DeBridgeDlnFacet": { "1.0.0": [ "audit20241205" @@ -181,6 +193,11 @@ "audit20250110_1" ] }, + "IAcrossSpokePool": { + "1.0.0": [ + "audit20250106" + ] + }, "IGasZip": { "1.0.0": [ "audit20241107" diff --git a/audit/reports/2024.09.02_CalldataVerificationFacet.pdf b/audit/reports/2024.09.02_CalldataVerificationFacet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45384452429ebda193b1bc7343b1845a1a257982 GIT binary patch literal 111703 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 literal 0 HcmV?d00001 diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index fd87f9554..b664ed231 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -4,16 +4,20 @@ pragma solidity ^0.8.17; import { ILiFi } from "../Interfaces/ILiFi.sol"; import { LibSwap } from "../Libraries/LibSwap.sol"; import { AmarokFacet } from "./AmarokFacet.sol"; +import { AcrossFacetV3 } from "./AcrossFacetV3.sol"; +import { StargateFacetV2 } from "./StargateFacetV2.sol"; import { StargateFacet } from "./StargateFacet.sol"; import { AcrossFacetV3 } from "./AcrossFacetV3.sol"; import { CelerIMFacetBase, CelerIM } from "lifi/Helpers/CelerIMFacetBase.sol"; import { StandardizedCallFacet } from "lifi/Facets/StandardizedCallFacet.sol"; import { LibBytes } from "../Libraries/LibBytes.sol"; +import { GenericSwapFacetV3 } from "lifi/Facets/GenericSwapFacetV3.sol"; +import { InvalidCallData } from "../Errors/GenericErrors.sol"; /// @title CalldataVerificationFacet /// @author LI.FI (https://li.fi) /// @notice Provides functionality for verifying calldata -/// @custom:version 1.1.2 +/// @custom:version 1.2.0 contract CalldataVerificationFacet { using LibBytes for bytes; @@ -67,7 +71,7 @@ contract CalldataVerificationFacet { function extractMainParameters( bytes calldata data ) - public + external pure returns ( string memory bridge, @@ -101,24 +105,25 @@ contract CalldataVerificationFacet { ); } - // @notice Extracts the non-EVM address from the calldata - // @param data The calldata to extract the non-EVM address from - // @return nonEVMAddress The non-EVM address extracted from the calldata + /// @notice Extracts the non-EVM address from the calldata + /// @param data The calldata to extract the non-EVM address from + /// @return nonEVMAddress The non-EVM address extracted from the calldata function extractNonEVMAddress( bytes calldata data ) external pure returns (bytes32 nonEVMAddress) { - bytes memory callData = data; - ILiFi.BridgeData memory bridgeData = _extractBridgeData(data); + bytes memory callData; if ( bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector ) { // standardizedCall callData = abi.decode(data[4:], (bytes)); + } else { + callData = data; } // Non-EVM address is always the first parameter of bridge specific data - if (bridgeData.hasSourceSwaps) { + if (_extractBridgeData(data).hasSourceSwaps) { assembly { let offset := mload(add(callData, 0x64)) // Get the offset of the bridge specific data nonEVMAddress := mload(add(callData, add(offset, 0x24))) // Get the non-EVM address @@ -151,30 +156,63 @@ contract CalldataVerificationFacet { uint256 receivingAmount ) { + // valid callData for a genericSwap call should have at least 484 bytes: + // Function selector: 4 bytes + // _transactionId: 32 bytes + // _integrator: 64 bytes + // _referrer: 64 bytes + // _receiver: 32 bytes + // _minAmountOut: 32 bytes + // _swapData: 256 bytes + if (data.length <= 484) { + revert InvalidCallData(); + } + LibSwap.SwapData[] memory swapData; - bytes memory callData = data; + bytes memory callData; + bytes4 functionSelector = bytes4(data[:4]); + // check if this is a call via StandardizedCallFacet if ( - bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector + functionSelector == StandardizedCallFacet.standardizedCall.selector ) { - // standardizedCall - callData = abi.decode(data[4:], (bytes)); + // extract nested function selector and calldata + // will always start at position 68 + functionSelector = bytes4(data[68:72]); + callData = data[68:]; + // callData = abi.decode(data[4:], (bytes)); // this one is also valid, even though the calldata differs slightly (add. padding) + } else { + callData = data; + } + + if ( + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector + ) { + // single swap + swapData = new LibSwap.SwapData[](1); + + // extract parameters from calldata + (, , , receiver, receivingAmount, swapData[0]) = abi.decode( + callData.slice(4, callData.length - 4), + (bytes32, string, string, address, uint256, LibSwap.SwapData) + ); + } else { + // multi swap or GenericSwap V1 call + (, , , receiver, receivingAmount, swapData) = abi.decode( + callData.slice(4, callData.length - 4), + (bytes32, string, string, address, uint256, LibSwap.SwapData[]) + ); } - (, , , receiver, receivingAmount, swapData) = abi.decode( - callData.slice(4, callData.length - 4), - (bytes32, string, string, address, uint256, LibSwap.SwapData[]) - ); + // extract missing return parameters from swapData sendingAssetId = swapData[0].sendingAssetId; amount = swapData[0].fromAmount; receivingAssetId = swapData[swapData.length - 1].receivingAssetId; - return ( - sendingAssetId, - amount, - receiver, - receivingAssetId, - receivingAmount - ); } /// @notice Validates the calldata @@ -189,7 +227,7 @@ contract CalldataVerificationFacet { /// or type(uint256).max to ignore /// @param hasSourceSwaps Whether the calldata has source swaps /// @param hasDestinationCall Whether the calldata has a destination call - /// @return isValid Whether the calldata is validate + /// @return isValid Returns true if the calldata is valid function validateCalldata( bytes calldata data, string calldata bridge, @@ -200,22 +238,14 @@ contract CalldataVerificationFacet { bool hasSourceSwaps, bool hasDestinationCall ) external pure returns (bool isValid) { - ILiFi.BridgeData memory bridgeData; - ( - bridgeData.bridge, - bridgeData.sendingAssetId, - bridgeData.receiver, - bridgeData.minAmount, - bridgeData.destinationChainId, - bridgeData.hasSourceSwaps, - bridgeData.hasDestinationCall - ) = extractMainParameters(data); + ILiFi.BridgeData memory bridgeData = _extractBridgeData(data); + + bytes32 bridgeNameHash = keccak256(abi.encodePacked(bridge)); return // Check bridge - (keccak256(abi.encodePacked(bridge)) == - keccak256(abi.encodePacked("")) || + (bridgeNameHash == keccak256(abi.encodePacked("")) || keccak256(abi.encodePacked(bridgeData.bridge)) == - keccak256(abi.encodePacked(bridge))) && + bridgeNameHash) && // Check sendingAssetId (sendingAssetId == 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF || bridgeData.sendingAssetId == sendingAssetId) && @@ -235,9 +265,9 @@ contract CalldataVerificationFacet { /// @notice Validates the destination calldata /// @param data The calldata to validate - /// @param callTo The call to address to validate + /// @param callTo The callTo address to validate /// @param dstCalldata The destination calldata to validate - /// @return isValid Returns true if the calldata matches with the provided parameters + /// @return isValid Returns true if the calldata is valid function validateDestinationCalldata( bytes calldata data, bytes calldata callTo, @@ -254,6 +284,7 @@ contract CalldataVerificationFacet { bytes4 selector = abi.decode(callData, (bytes4)); + // --------------------------------------- // Case: Amarok if (selector == AmarokFacet.startBridgeTokensViaAmarok.selector) { (, AmarokFacet.AmarokData memory amarokData) = abi.decode( @@ -277,6 +308,7 @@ contract CalldataVerificationFacet { abi.decode(callTo, (address)) == amarokData.callTo; } + // --------------------------------------- // Case: Stargate if (selector == StargateFacet.startBridgeTokensViaStargate.selector) { (, StargateFacet.StargateData memory stargateData) = abi.decode( @@ -303,6 +335,51 @@ contract CalldataVerificationFacet { keccak256(dstCalldata) == keccak256(stargateData.callData) && keccak256(callTo) == keccak256(stargateData.callTo); } + + // --------------------------------------- + // Case: StargateV2 + + if ( + selector == StargateFacetV2.startBridgeTokensViaStargate.selector + ) { + (, StargateFacetV2.StargateData memory stargateDataV2) = abi + .decode( + callData.slice(4, callData.length - 4), + (ILiFi.BridgeData, StargateFacetV2.StargateData) + ); + + return + keccak256(dstCalldata) == + keccak256(stargateDataV2.sendParams.composeMsg) && + _compareBytesToBytes32CallTo( + callTo, + stargateDataV2.sendParams.to + ); + } + if ( + selector == + StargateFacetV2.swapAndStartBridgeTokensViaStargate.selector + ) { + (, , StargateFacetV2.StargateData memory stargateDataV2) = abi + .decode( + callData.slice(4, callData.length - 4), + ( + ILiFi.BridgeData, + LibSwap.SwapData[], + StargateFacetV2.StargateData + ) + ); + + return + keccak256(dstCalldata) == + keccak256(stargateDataV2.sendParams.composeMsg) && + _compareBytesToBytes32CallTo( + callTo, + stargateDataV2.sendParams.to + ); + } + + // --------------------------------------- // Case: Celer if ( selector == CelerIMFacetBase.startBridgeTokensViaCelerIM.selector @@ -357,6 +434,37 @@ contract CalldataVerificationFacet { keccak256(abi.encode(acrossV3Data.receiverAddress)); } + // --------------------------------------- + // Case: AcrossV3 + if (selector == AcrossFacetV3.startBridgeTokensViaAcrossV3.selector) { + (, AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( + callData.slice(4, callData.length - 4), + (ILiFi.BridgeData, AcrossFacetV3.AcrossV3Data) + ); + + return + keccak256(dstCalldata) == keccak256(acrossV3Data.message) && + keccak256(callTo) == + keccak256(abi.encode(acrossV3Data.receiverAddress)); + } + if ( + selector == + AcrossFacetV3.swapAndStartBridgeTokensViaAcrossV3.selector + ) { + (, , AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( + callData.slice(4, callData.length - 4), + ( + ILiFi.BridgeData, + LibSwap.SwapData[], + AcrossFacetV3.AcrossV3Data + ) + ); + return + keccak256(dstCalldata) == keccak256(acrossV3Data.message) && + keccak256(callTo) == + keccak256(abi.encode(acrossV3Data.receiverAddress)); + } + // All other cases return false; } @@ -407,4 +515,27 @@ contract CalldataVerificationFacet { (ILiFi.BridgeData, LibSwap.SwapData[]) ); } + + function _compareBytesToBytes32CallTo( + bytes memory callTo, + bytes32 callToBytes32 + ) private pure returns (bool) { + require( + callTo.length >= 20, + "Invalid callTo length; expected at least 20 bytes" + ); + + // Convert bytes to address type from callTo + address callToAddress; + assembly { + callToAddress := mload(add(callTo, 32)) + } + + // Convert callToBytes32 to address type and compare them + address callToAddressFromBytes32 = address( + uint160(uint256(callToBytes32)) + ); + + return callToAddress == callToAddressFromBytes32; + } } diff --git a/src/Interfaces/IAcrossSpokePool.sol b/src/Interfaces/IAcrossSpokePool.sol index aef0cfc3f..1f793d64c 100644 --- a/src/Interfaces/IAcrossSpokePool.sol +++ b/src/Interfaces/IAcrossSpokePool.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -/// @custom:version 1.0.0 pragma solidity ^0.8.17; +/// @custom:version 1.0.0 interface IAcrossSpokePool { function deposit( address recipient, // Recipient address diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 27bc2d6ae..1637190ac 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -4,21 +4,33 @@ pragma solidity ^0.8.17; import { CalldataVerificationFacet } from "lifi/Facets/CalldataVerificationFacet.sol"; import { AmarokFacet } from "lifi/Facets/AmarokFacet.sol"; import { MayanFacet } from "lifi/Facets/MayanFacet.sol"; -import { StargateFacet } from "lifi/Facets/StargateFacet.sol"; import { AcrossFacetV3 } from "lifi/Facets/AcrossFacetV3.sol"; +import { StargateFacet } from "lifi/Facets/StargateFacet.sol"; +import { StargateFacetV2 } from "lifi/Facets/StargateFacetV2.sol"; +import { IStargate } from "lifi/Interfaces/IStargate.sol"; import { StandardizedCallFacet } from "lifi/Facets/StandardizedCallFacet.sol"; import { CelerIM, CelerIMFacetBase } from "lifi/Helpers/CelerIMFacetBase.sol"; import { GenericSwapFacet } from "lifi/Facets/GenericSwapFacet.sol"; +import { GenericSwapFacetV3 } from "lifi/Facets/GenericSwapFacetV3.sol"; import { ILiFi } from "lifi/Interfaces/ILiFi.sol"; import { LibSwap } from "lifi/Libraries/LibSwap.sol"; import { TestBase } from "../utils/TestBase.sol"; +import { LibBytes } from "lifi/Libraries/LibBytes.sol"; + import { MsgDataTypes } from "celer-network/contracts/message/libraries/MessageSenderLib.sol"; -import "forge-std/console.sol"; +import { console } from "forge-std/console.sol"; +import { InvalidCallData } from "lifi/Errors/GenericErrors.sol"; +import { OFTComposeMsgCodec } from "lifi/Periphery/ReceiverStargateV2.sol"; contract CalldataVerificationFacetTest is TestBase { + using LibBytes for bytes; + using OFTComposeMsgCodec for address; + CalldataVerificationFacet internal calldataVerificationFacet; function setUp() public { + customBlockNumberForForking = 19979843; + initTestBase(); calldataVerificationFacet = new CalldataVerificationFacet(); bridgeData = ILiFi.BridgeData({ transactionId: keccak256("id"), @@ -44,6 +56,16 @@ contract CalldataVerificationFacetTest is TestBase { requiresDeposit: true }) ); + + // set facet address in TestBase + setFacetAddressInTestBase( + address(calldataVerificationFacet), + "CalldataVerificationFacet" + ); + } + + function test_DeploysWithoutErrors() public { + calldataVerificationFacet = new CalldataVerificationFacet(); } function test_IgnoresExtraBytes() public view { @@ -278,9 +300,129 @@ contract CalldataVerificationFacetTest is TestBase { assertEq(hasDestinationCall, bridgeData.hasDestinationCall); } - function test_CanExtractGenericSwapParameters() public { + function test_RevertsOnInvalidGenericSwapCallData() public { + // prepare minimum callData + swapData[0] = LibSwap.SwapData({ + callTo: address(uniswap), + approveTo: address(uniswap), + sendingAssetId: address(123), + receivingAssetId: address(456), + fromAmount: 1, + callData: "", + requiresDeposit: false + }); + bytes memory callData = abi.encodeWithSelector( + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector, + keccak256(""), + "", + "", + payable(address(1234)), + 1, + swapData[0] + ); + + // reduce calldata to 483 bytes to not meet min calldata length threshold + callData = callData.slice(0, 483); + + vm.expectRevert(InvalidCallData.selector); + + calldataVerificationFacet.extractGenericSwapParameters(callData); + } + + function test_CanExtractGenericSwapMinCallData() public { + swapData[0] = LibSwap.SwapData({ + callTo: address(uniswap), + approveTo: address(uniswap), + sendingAssetId: address(123), + receivingAssetId: address(456), + fromAmount: 1, + callData: "", + requiresDeposit: false + }); + bytes memory callData = abi.encodeWithSelector( + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector, + keccak256(""), + "", + "", + payable(address(1234)), + 1, + swapData[0] + ); + + ( + address sendingAssetId, + uint256 amount, + address receiver, + address receivingAssetId, + uint256 receivingAmount + ) = calldataVerificationFacet.extractGenericSwapParameters(callData); + + assertEq(sendingAssetId, swapData[0].sendingAssetId); + assertEq(amount, swapData[0].fromAmount); + assertEq(receiver, address(1234)); + assertEq( + receivingAssetId, + swapData[swapData.length - 1].receivingAssetId + ); + assertEq(receivingAmount, 1); + } + + function test_CanExtractGenericSwapV3SingleParameters() public { + bytes memory callData = abi.encodeWithSelector( + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector, + keccak256("id"), + "acme", + "acme", + payable(address(1234)), + 1 ether, + swapData[0] + ); + + ( + address sendingAssetId, + uint256 amount, + address receiver, + address receivingAssetId, + uint256 receivingAmount + ) = calldataVerificationFacet.extractGenericSwapParameters(callData); + + assertEq(sendingAssetId, swapData[0].sendingAssetId); + assertEq(amount, swapData[0].fromAmount); + assertEq(receiver, address(1234)); + assertEq( + receivingAssetId, + swapData[swapData.length - 1].receivingAssetId + ); + assertEq(receivingAmount, 1 ether); + + // StandardizedCall + bytes memory standardizedCallData = abi.encodeWithSelector( + StandardizedCallFacet.standardizedCall.selector, + callData + ); + ( + sendingAssetId, + amount, + receiver, + receivingAssetId, + receivingAmount + ) = calldataVerificationFacet.extractGenericSwapParameters( + standardizedCallData + ); + + assertEq(sendingAssetId, swapData[0].sendingAssetId); + assertEq(amount, swapData[0].fromAmount); + assertEq(receiver, address(1234)); + assertEq( + receivingAssetId, + swapData[swapData.length - 1].receivingAssetId + ); + assertEq(receivingAmount, 1 ether); + } + + function test_CanExtractGenericSwapV3MultipleParameters() public { bytes memory callData = abi.encodeWithSelector( - GenericSwapFacet.swapTokensGeneric.selector, + GenericSwapFacetV3.swapTokensMultipleV3ERC20ToERC20.selector, keccak256("id"), "acme", "acme", @@ -602,6 +744,100 @@ contract CalldataVerificationFacetTest is TestBase { assertFalse(badCall); } + function test_CanValidateStargateV2DestinationCalldata() public { + uint16 ASSET_ID_USDC = 1; + address STARGATE_POOL_USDC = 0xc026395860Db2d07ee33e05fE50ed7bD583189C7; + + StargateFacetV2.StargateData memory stargateData = StargateFacetV2 + .StargateData({ + assetId: ASSET_ID_USDC, + sendParams: IStargate.SendParam({ + dstEid: 30150, + to: USER_RECEIVER.addressToBytes32(), + amountLD: defaultUSDCAmount, + minAmountLD: (defaultUSDCAmount * 9e4) / 1e5, + extraOptions: "", + composeMsg: bytes("foobarbytes"), + oftCmd: OftCmdHelper.bus() + }), + fee: IStargate.MessagingFee({ nativeFee: 0, lzTokenFee: 0 }), + refundAddress: payable(USER_REFUND) + }); + + // get quote and update fee information in stargateData + IStargate.MessagingFee memory fees = IStargate(STARGATE_POOL_USDC) + .quoteSend(stargateData.sendParams, false); + stargateData.fee = fees; + + bytes memory callData = abi.encodeWithSelector( + StargateFacetV2.startBridgeTokensViaStargate.selector, + bridgeData, + stargateData + ); + + bytes memory callDataWithSwap = abi.encodeWithSelector( + StargateFacetV2.swapAndStartBridgeTokensViaStargate.selector, + bridgeData, + swapData, + stargateData + ); + + bool validCall = calldataVerificationFacet.validateDestinationCalldata( + callData, + abi.encode(USER_RECEIVER), + bytes("foobarbytes") + ); + bool validCallWithSwap = calldataVerificationFacet + .validateDestinationCalldata( + callDataWithSwap, + abi.encode(USER_RECEIVER), + bytes("foobarbytes") + ); + + bool badCall = calldataVerificationFacet.validateDestinationCalldata( + callData, + abi.encode(USER_RECEIVER), + bytes("badbytes") + ); + + assertTrue(validCall); + assertTrue(validCallWithSwap); + assertFalse(badCall); + + // StandardizedCall + bytes memory standardizedCallData = abi.encodeWithSelector( + StandardizedCallFacet.standardizedCall.selector, + callData + ); + + bytes memory standardizedCallDataWithSwap = abi.encodeWithSelector( + StandardizedCallFacet.standardizedCall.selector, + callDataWithSwap + ); + + validCall = calldataVerificationFacet.validateDestinationCalldata( + standardizedCallData, + abi.encode(USER_RECEIVER), + bytes("foobarbytes") + ); + validCallWithSwap = calldataVerificationFacet + .validateDestinationCalldata( + standardizedCallDataWithSwap, + abi.encode(USER_RECEIVER), + bytes("foobarbytes") + ); + + badCall = calldataVerificationFacet.validateDestinationCalldata( + standardizedCallData, + abi.encode(USER_RECEIVER), + bytes("badbytes") + ); + + assertTrue(validCall); + assertTrue(validCallWithSwap); + assertFalse(badCall); + } + function test_CanValidateCelerIMDestinationCalldata() public { CelerIM.CelerIMData memory cimData = CelerIM.CelerIMData({ maxSlippage: 1, @@ -765,6 +1001,31 @@ contract CalldataVerificationFacetTest is TestBase { assertFalse(badCall); } + function test_RevertsOnDestinationCalldataWithInvalidSelector() public { + CelerIM.CelerIMData memory cimData = CelerIM.CelerIMData({ + maxSlippage: 1, + nonce: 2, + callTo: abi.encode(USER_RECEIVER), + callData: bytes("foobarbytes"), + messageBusFee: 3, + bridgeType: MsgDataTypes.BridgeSendType.Liquidity + }); + + bytes memory callData = abi.encodeWithSelector( + GenericSwapFacet.swapTokensGeneric.selector, // wrong selector, does not support destination calls + bridgeData, + cimData + ); + + bool validCall = calldataVerificationFacet.validateDestinationCalldata( + callData, + abi.encode(USER_RECEIVER), + bytes("foobarbytes") + ); + + assertFalse(validCall); + } + function checkBridgeData(ILiFi.BridgeData memory data) internal { assertTrue(data.transactionId == bridgeData.transactionId); assertEq(data.bridge, bridgeData.bridge); @@ -778,3 +1039,13 @@ contract CalldataVerificationFacetTest is TestBase { assertTrue(data[0].receivingAssetId == swapData[0].receivingAssetId); } } + +library OftCmdHelper { + function taxi() internal pure returns (bytes memory) { + return ""; + } + + function bus() internal pure returns (bytes memory) { + return new bytes(1); + } +}