From 511f3d1940e273ab7cf473f1020e4b938c596ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 16 Aug 2024 17:43:02 +0700 Subject: [PATCH 01/16] adds extraction handling for GenericSwapV3 single calldata --- src/Facets/CalldataVerificationFacet.sol | 73 +++++- .../Facets/CalldataVerificationFacet.t.sol | 211 +++++++++++++++++- 2 files changed, 273 insertions(+), 11 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 031288c79..ffd629f5a 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -8,11 +8,13 @@ import { StargateFacet } from "./StargateFacet.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 Calldata Verification Facet /// @author LI.FI (https://li.fi) /// @notice Provides functionality for verifying calldata -/// @custom:version 1.1.1 +/// @custom:version 1.2.0 contract CalldataVerificationFacet { using LibBytes for bytes; @@ -151,19 +153,49 @@ contract CalldataVerificationFacet { ) { LibSwap.SwapData[] memory swapData; + bytes4 functionSelector = bytes4(data[:4]); bytes memory callData = data; + // 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 (callData.length < 484) { + revert InvalidCallData(); + } + + // 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 + (functionSelector, callData) = getNestedData(data); } - (, , , receiver, receivingAmount, swapData) = abi.decode( - callData.slice(4, callData.length - 4), - (bytes32, string, string, address, uint256, LibSwap.SwapData[]) - ); + if (_isGenericV3SingleSwap(functionSelector)) { + // single swap + swapData = new LibSwap.SwapData[](1); + + // extract parameters from calldata + LibSwap.SwapData memory swapDataSingle; + (, , , receiver, receivingAmount, swapDataSingle) = abi.decode( + callData.slice(4, callData.length - 4), + (bytes32, string, string, address, uint256, LibSwap.SwapData) + ); + swapData[0] = swapDataSingle; + } 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[]) + ); + } + + // extract missing return parameters from swapData sendingAssetId = swapData[0].sendingAssetId; amount = swapData[0].fromAmount; receivingAssetId = swapData[swapData.length - 1].receivingAssetId; @@ -377,4 +409,29 @@ contract CalldataVerificationFacet { (ILiFi.BridgeData, LibSwap.SwapData[]) ); } + + function _isGenericV3SingleSwap( + bytes4 functionSelector + ) private pure returns (bool) { + return + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector; + } + + function getNestedData( + bytes calldata standardizedCallData + ) public pure returns (bytes4 functionSelector, bytes memory callData) { + functionSelector = bytes4(standardizedCallData[68:72]); + callData = standardizedCallData[68:]; + } + + function _getStandardizedCallNestedCallData( + bytes calldata standardizedCallData + ) public pure returns (bytes memory) { + return standardizedCallData[68:]; + } } diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 4681e877b..712356a1c 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -9,16 +9,22 @@ import { StargateFacet } from "lifi/Facets/StargateFacet.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"; contract CalldataVerificationFacetTest is TestBase { + using LibBytes for bytes; CalldataVerificationFacet internal calldataVerificationFacet; function setUp() public { + initTestBase(); calldataVerificationFacet = new CalldataVerificationFacet(); bridgeData = ILiFi.BridgeData({ transactionId: keccak256("id"), @@ -278,9 +284,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", @@ -681,6 +807,85 @@ 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( + CelerIMFacetBase.startBridgeTokensViaCelerIM.selector, + bridgeData, + cimData + ); + + bytes memory callDataWithSwap = abi.encodeWithSelector( + CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM.selector, + bridgeData, + swapData, + cimData + ); + + 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, + callData + ); + + 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 checkBridgeData(ILiFi.BridgeData memory data) internal { assertTrue(data.transactionId == bridgeData.transactionId); assertEq(data.bridge, bridgeData.bridge); From 9912f6476173c00114d8905aac6cdc36d822f6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 16 Aug 2024 17:57:49 +0700 Subject: [PATCH 02/16] push test coverage to 100% --- lcov-filtered.info | 4080 +++++++++++++++++ src/Facets/CalldataVerificationFacet.sol | 17 +- .../Facets/CalldataVerificationFacet.t.sol | 62 +- 3 files changed, 4089 insertions(+), 70 deletions(-) create mode 100644 lcov-filtered.info diff --git a/lcov-filtered.info b/lcov-filtered.info new file mode 100644 index 000000000..bc5576adb --- /dev/null +++ b/lcov-filtered.info @@ -0,0 +1,4080 @@ +TN: +SF:src/Facets/AccessManagerFacet.sol +FN:24,AccessManagerFacet.setCanExecute +FNDA:3,AccessManagerFacet.setCanExecute +DA:29,3 +BRDA:29,0,0,- +DA:30,0 +DA:32,3 +DA:33,3 +DA:36,2 +BRDA:36,1,0,2 +BRDA:36,1,1,1 +DA:37,2 +DA:39,1 +FN:46,AccessManagerFacet.addressCanExecuteMethod +FNDA:0,AccessManagerFacet.addressCanExecuteMethod +DA:50,0 +FNF:2 +FNH:1 +LF:8 +LH:6 +BRF:3 +BRH:2 +end_of_record +TN: +SF:src/Facets/AcrossFacet.sol +FN:44,AcrossFacet. +FNDA:0,AcrossFacet. +DA:45,0 +DA:46,0 +FN:54,AcrossFacet.startBridgeTokensViaAcross +FNDA:265,AcrossFacet.startBridgeTokensViaAcross +DA:66,260 +DA:70,258 +FN:77,AcrossFacet.swapAndStartBridgeTokensViaAcross +FNDA:6,AcrossFacet.swapAndStartBridgeTokensViaAcross +DA:90,3 +DA:96,2 +FN:104,AcrossFacet._startBridge +FNDA:260,AcrossFacet._startBridge +DA:108,260 +BRDA:108,0,0,2 +BRDA:108,0,1,258 +DA:109,2 +DA:120,258 +DA:125,258 +DA:137,260 +FNF:4 +FNH:3 +LF:11 +LH:9 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/AcrossFacetPacked.sol +FN:47,AcrossFacetPacked. +FNDA:0,AcrossFacetPacked. +DA:52,0 +DA:53,0 +FN:61,AcrossFacetPacked.setApprovalForBridge +FNDA:19,AcrossFacetPacked.setApprovalForBridge +DA:64,19 +DA:66,38 +FN:76,AcrossFacetPacked.startBridgeTokensViaAcrossNativePacked +FNDA:2,AcrossFacetPacked.startBridgeTokensViaAcrossNativePacked +DA:78,2 +DA:81,2 +DA:92,2 +FN:103,AcrossFacetPacked.startBridgeTokensViaAcrossNativeMin +FNDA:2,AcrossFacetPacked.startBridgeTokensViaAcrossNativeMin +DA:113,2 +DA:124,2 +FN:129,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Packed +FNDA:4,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Packed +DA:130,4 +DA:131,4 +DA:134,4 +DA:141,4 +DA:144,4 +DA:155,4 +FN:168,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Min +FNDA:4,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Min +DA:180,4 +DA:187,4 +DA:198,4 +FN:209,AcrossFacetPacked.encode_startBridgeTokensViaAcrossNativePacked +FNDA:20,AcrossFacetPacked.encode_startBridgeTokensViaAcrossNativePacked +DA:220,20 +BRDA:220,0,0,1 +BRDA:220,0,1,19 +DA:225,19 +DA:226,19 +FN:250,AcrossFacetPacked.encode_startBridgeTokensViaAcrossERC20Packed +FNDA:40,AcrossFacetPacked.encode_startBridgeTokensViaAcrossERC20Packed +DA:263,40 +BRDA:263,1,0,1 +BRDA:263,1,1,39 +DA:268,39 +BRDA:268,2,0,1 +BRDA:268,2,1,38 +DA:273,38 +DA:274,38 +FN:292,AcrossFacetPacked.decode_startBridgeTokensViaAcrossNativePacked +FNDA:1,AcrossFacetPacked.decode_startBridgeTokensViaAcrossNativePacked +DA:302,1 +BRDA:302,3,0,- +BRDA:302,3,1,1 +DA:308,1 +DA:311,1 +DA:312,1 +DA:313,1 +DA:316,1 +DA:317,1 +DA:318,1 +DA:319,1 +DA:321,1 +FN:326,AcrossFacetPacked.decode_startBridgeTokensViaAcrossERC20Packed +FNDA:1,AcrossFacetPacked.decode_startBridgeTokensViaAcrossERC20Packed +DA:336,1 +BRDA:336,4,0,- +BRDA:336,4,1,1 +DA:342,1 +DA:344,1 +DA:345,1 +DA:346,1 +DA:347,1 +DA:348,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:354,1 +DA:356,1 +FN:365,AcrossFacetPacked.executeCallAndWithdraw +FNDA:2,AcrossFacetPacked.executeCallAndWithdraw +DA:374,1 +DA:377,1 +BRDA:377,5,0,1 +BRDA:377,5,1,- +DA:379,1 +DA:380,1 +DA:383,0 +FNF:11 +FNH:10 +LF:52 +LH:49 +BRF:12 +BRH:9 +end_of_record +TN: +SF:src/Facets/AllBridgeFacet.sol +FN:40,AllBridgeFacet. +FNDA:0,AllBridgeFacet. +DA:41,0 +FN:46,AllBridgeFacet.startBridgeTokensViaAllBridge +FNDA:8,AllBridgeFacet.startBridgeTokensViaAllBridge +DA:58,3 +DA:62,2 +FN:69,AllBridgeFacet.swapAndStartBridgeTokensViaAllBridge +FNDA:6,AllBridgeFacet.swapAndStartBridgeTokensViaAllBridge +DA:82,3 +DA:88,2 +FN:94,AllBridgeFacet._startBridge +FNDA:4,AllBridgeFacet._startBridge +DA:98,4 +DA:104,2 +BRDA:104,0,0,2 +BRDA:104,0,1,2 +DA:105,2 +DA:116,2 +DA:128,4 +FNF:4 +FNH:3 +LF:10 +LH:9 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/AmarokFacet.sol +FN:43,AmarokFacet. +FNDA:0,AmarokFacet. +DA:44,0 +FN:52,AmarokFacet.startBridgeTokensViaAmarok +FNDA:265,AmarokFacet.startBridgeTokensViaAmarok +DA:64,261 +DA:66,260 +DA:71,259 +FN:78,AmarokFacet.swapAndStartBridgeTokensViaAmarok +FNDA:6,AmarokFacet.swapAndStartBridgeTokensViaAmarok +DA:91,3 +DA:93,3 +DA:101,2 +FN:109,AmarokFacet._startBridge +FNDA:261,AmarokFacet._startBridge +DA:115,261 +DA:117,1 +BRDA:117,0,0,1 +DA:120,260 +DA:127,2 +BRDA:127,1,0,2 +BRDA:127,1,1,258 +DA:128,2 +DA:139,258 +DA:150,260 +FN:153,AmarokFacet.validateDestinationCallFlag +FNDA:264,AmarokFacet.validateDestinationCallFlag +DA:158,264 +DA:159,1 +BRDA:159,2,0,1 +DA:160,1 +FNF:5 +FNH:4 +LF:17 +LH:16 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src/Facets/AmarokFacetPacked.sol +FN:33,AmarokFacetPacked. +FNDA:0,AmarokFacetPacked. +DA:37,0 +FN:45,AmarokFacetPacked.setApprovalForBridge +FNDA:13,AmarokFacetPacked.setApprovalForBridge +DA:48,13 +DA:50,13 +DA:52,26 +FN:62,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +DA:64,2 +DA:65,2 +DA:66,2 +DA:67,2 +DA:70,2 +DA:77,2 +DA:88,2 +FN:91,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +DA:96,2 +DA:97,2 +DA:98,2 +DA:101,2 +DA:108,2 +DA:118,2 +FN:129,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithAsset +FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithAsset +DA:139,2 +DA:146,2 +DA:157,2 +FN:167,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithNative +FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithNative +DA:176,2 +DA:183,2 +DA:193,2 +FN:204,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +FNDA:16,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +DA:213,16 +BRDA:213,0,0,1 +BRDA:213,0,1,15 +DA:217,15 +BRDA:217,1,0,1 +BRDA:217,1,1,14 +DA:221,14 +BRDA:221,2,0,1 +BRDA:221,2,1,13 +DA:226,13 +DA:227,13 +FN:248,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +FNDA:15,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +DA:256,15 +BRDA:256,3,0,1 +BRDA:256,3,1,14 +DA:260,14 +BRDA:260,4,0,1 +BRDA:260,4,1,13 +DA:265,13 +DA:266,13 +FN:281,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +FNDA:1,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset +DA:288,1 +BRDA:288,5,0,- +BRDA:288,5,1,1 +DA:293,1 +DA:294,1 +DA:296,1 +DA:298,1 +DA:299,1 +DA:300,1 +DA:301,1 +DA:302,1 +DA:304,1 +DA:305,1 +DA:306,1 +DA:307,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:312,1 +FN:317,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +FNDA:1,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative +DA:324,1 +BRDA:324,6,0,- +BRDA:324,6,1,1 +DA:329,1 +DA:330,1 +DA:332,1 +DA:334,1 +DA:335,1 +DA:336,1 +DA:337,1 +DA:338,1 +DA:340,1 +DA:341,1 +DA:342,1 +DA:343,1 +DA:346,1 +DA:347,1 +DA:349,1 +FN:352,AmarokFacetPacked.getChainIdForDomain +FNDA:0,AmarokFacetPacked.getChainIdForDomain +DA:355,2 +BRDA:355,7,0,- +BRDA:355,7,1,- +DA:357,2 +BRDA:357,8,0,- +BRDA:357,8,1,- +DA:359,2 +BRDA:359,9,0,2 +BRDA:359,9,1,- +DA:361,0 +BRDA:361,10,0,- +BRDA:361,10,1,- +DA:363,0 +BRDA:363,11,0,- +BRDA:363,11,1,- +DA:365,0 +BRDA:365,12,0,- +BRDA:365,12,1,- +DA:367,0 +FNF:11 +FNH:9 +LF:72 +LH:67 +BRF:26 +BRH:13 +end_of_record +TN: +SF:src/Facets/ArbitrumBridgeFacet.sol +FN:46,ArbitrumBridgeFacet. +FNDA:0,ArbitrumBridgeFacet. +DA:47,0 +DA:48,0 +FN:56,ArbitrumBridgeFacet.startBridgeTokensViaArbitrumBridge +FNDA:264,ArbitrumBridgeFacet.startBridgeTokensViaArbitrumBridge +DA:68,259 +DA:69,259 +DA:72,259 +DA:77,258 +FN:84,ArbitrumBridgeFacet.swapAndStartBridgeTokensViaArbitrumBridge +FNDA:6,ArbitrumBridgeFacet.swapAndStartBridgeTokensViaArbitrumBridge +DA:97,3 +DA:98,3 +DA:101,3 +DA:109,2 +FN:118,ArbitrumBridgeFacet._startBridge +FNDA:260,ArbitrumBridgeFacet._startBridge +DA:123,260 +BRDA:123,0,0,2 +BRDA:123,0,1,258 +DA:124,2 +DA:137,258 +DA:142,258 +DA:152,260 +FNF:4 +FNH:3 +LF:15 +LH:13 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/CBridgeFacet.sol +FN:47,CBridgeFacet. +FNDA:0,CBridgeFacet. +DA:48,0 +FN:56,CBridgeFacet.startBridgeTokensViaCBridge +FNDA:267,CBridgeFacet.startBridgeTokensViaCBridge +DA:68,262 +DA:72,260 +FN:79,CBridgeFacet.swapAndStartBridgeTokensViaCBridge +FNDA:14,CBridgeFacet.swapAndStartBridgeTokensViaCBridge +DA:92,10 +DA:98,9 +FN:107,CBridgeFacet.triggerRefund +FNDA:0,CBridgeFacet.triggerRefund +DA:114,0 +BRDA:114,0,0,- +DA:115,0 +DA:119,0 +BRDA:119,1,0,- +DA:120,0 +DA:124,0 +DA:125,0 +DA:126,0 +BRDA:126,2,0,- +DA:127,0 +DA:131,0 +DA:132,0 +DA:133,0 +FN:141,CBridgeFacet._startBridge +FNDA:269,CBridgeFacet._startBridge +DA:145,269 +BRDA:145,3,0,4 +BRDA:145,3,1,265 +DA:146,4 +DA:155,265 +DA:161,265 +DA:171,269 +FNF:5 +FNH:3 +LF:21 +LH:9 +BRF:5 +BRH:2 +end_of_record +TN: +SF:src/Facets/CBridgeFacetPacked.sol +FN:40,CBridgeFacetPacked. +FNDA:0,CBridgeFacetPacked. +DA:44,0 +FN:52,CBridgeFacetPacked.setApprovalForBridge +FNDA:28,CBridgeFacetPacked.setApprovalForBridge +DA:55,28 +DA:57,42 +FN:74,CBridgeFacetPacked.triggerRefund +FNDA:1,CBridgeFacetPacked.triggerRefund +DA:82,1 +BRDA:82,0,0,- +DA:83,0 +DA:87,1 +DA:88,1 +DA:89,1 +BRDA:89,1,0,- +DA:90,0 +DA:94,1 +DA:95,1 +DA:96,1 +FN:101,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativePacked +FNDA:6,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativePacked +DA:102,6 +DA:110,6 +FN:119,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativeMin +FNDA:3,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativeMin +DA:126,3 +DA:134,3 +FN:139,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Packed +FNDA:8,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Packed +DA:140,8 +DA:141,8 +DA:144,8 +DA:152,8 +DA:161,8 +FN:172,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Min +FNDA:4,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Min +DA:182,4 +DA:190,4 +DA:199,4 +FN:210,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeNativePacked +FNDA:33,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeNativePacked +DA:217,33 +BRDA:217,2,0,1 +BRDA:217,2,1,32 +DA:221,32 +BRDA:221,3,0,1 +BRDA:221,3,1,31 +DA:226,31 +DA:227,31 +FN:241,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeNativePacked +FNDA:1,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeNativePacked +DA:248,1 +BRDA:248,4,0,- +BRDA:248,4,1,1 +DA:253,1 +DA:254,1 +DA:256,1 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,1 +DA:262,1 +FN:273,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeERC20Packed +FNDA:49,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeERC20Packed +DA:282,49 +BRDA:282,5,0,1 +BRDA:282,5,1,48 +DA:286,48 +BRDA:286,6,0,1 +BRDA:286,6,1,47 +DA:290,47 +BRDA:290,7,0,1 +BRDA:290,7,1,46 +DA:295,46 +DA:296,46 +FN:310,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeERC20Packed +FNDA:1,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeERC20Packed +DA:317,1 +BRDA:317,8,0,- +BRDA:317,8,1,1 +DA:319,1 +DA:320,1 +DA:322,1 +DA:323,1 +DA:324,1 +DA:325,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:330,1 +FNF:11 +FNH:10 +LF:53 +LH:50 +BRF:16 +BRH:12 +end_of_record +TN: +SF:src/Facets/CalldataVerificationFacet.sol +FN:24,CalldataVerificationFacet.extractBridgeData +FNDA:3,CalldataVerificationFacet.extractBridgeData +DA:27,3 +FN:33,CalldataVerificationFacet.extractSwapData +FNDA:4,CalldataVerificationFacet.extractSwapData +DA:36,4 +FN:43,CalldataVerificationFacet.extractData +FNDA:6,CalldataVerificationFacet.extractData +DA:53,6 +DA:54,2 +BRDA:54,0,0,2 +DA:55,2 +FN:68,CalldataVerificationFacet.extractMainParameters +FNDA:6,CalldataVerificationFacet.extractMainParameters +DA:83,10 +DA:85,2 +BRDA:85,1,0,2 +BRDA:85,1,1,2 +DA:86,2 +DA:87,2 +DA:88,2 +DA:90,8 +DA:91,8 +DA:94,10 +FN:108,CalldataVerificationFacet.extractNonEVMAddress +FNDA:4,CalldataVerificationFacet.extractNonEVMAddress +DA:111,4 +DA:112,4 +DA:115,4 +DA:116,2 +BRDA:116,2,0,2 +DA:118,2 +DA:122,2 +BRDA:122,3,0,2 +BRDA:122,3,1,2 +DA:124,2 +DA:125,2 +DA:129,2 +DA:130,2 +FN:142,CalldataVerificationFacet.extractGenericSwapParameters +FNDA:6,CalldataVerificationFacet.extractGenericSwapParameters +DA:155,6 +DA:156,6 +DA:157,6 +DA:167,6 +BRDA:167,4,0,1 +DA:168,1 +DA:173,5 +DA:174,2 +BRDA:174,5,0,2 +DA:177,2 +DA:178,2 +DA:181,5 +BRDA:181,6,0,3 +BRDA:181,6,1,3 +DA:183,3 +DA:186,3 +DA:187,3 +DA:191,3 +DA:194,2 +DA:201,5 +DA:202,5 +DA:203,5 +DA:204,5 +FN:226,CalldataVerificationFacet.validateCalldata +FNDA:4,CalldataVerificationFacet.validateCalldata +DA:236,4 +DA:237,4 +DA:246,4 +DA:248,4 +DA:264,2 +DA:266,2 +FN:274,CalldataVerificationFacet.validateDestinationCalldata +FNDA:19,CalldataVerificationFacet.validateDestinationCalldata +DA:279,19 +DA:283,19 +DA:284,9 +BRDA:284,7,0,9 +DA:285,9 +DA:288,19 +DA:291,19 +BRDA:291,8,0,4 +DA:292,4 +DA:297,4 +DA:298,4 +DA:299,2 +DA:302,15 +DA:303,2 +BRDA:303,9,0,2 +DA:304,2 +DA:308,2 +DA:309,2 +DA:310,2 +DA:314,13 +BRDA:314,10,0,4 +DA:315,4 +DA:319,4 +DA:320,4 +DA:321,2 +DA:324,9 +DA:326,2 +BRDA:326,11,0,2 +DA:327,2 +DA:335,2 +DA:336,2 +DA:337,2 +DA:341,7 +DA:342,5 +BRDA:342,12,0,5 +DA:343,5 +DA:347,5 +DA:348,5 +DA:349,3 +DA:352,2 +DA:354,1 +BRDA:354,13,0,1 +DA:355,1 +DA:359,1 +DA:360,1 +DA:361,1 +DA:365,1 +FN:373,CalldataVerificationFacet._extractBridgeData +FNDA:23,CalldataVerificationFacet._extractBridgeData +DA:377,23 +DA:378,11 +BRDA:378,14,0,11 +DA:380,11 +DA:381,11 +DA:385,11 +DA:388,12 +FN:394,CalldataVerificationFacet._extractSwapData +FNDA:8,CalldataVerificationFacet._extractSwapData +DA:398,8 +DA:399,4 +BRDA:399,15,0,4 +DA:401,4 +DA:402,4 +DA:406,4 +DA:409,4 +FN:415,CalldataVerificationFacet._isGenericV3SingleSwap +FNDA:5,CalldataVerificationFacet._isGenericV3SingleSwap +DA:418,5 +DA:419,5 +DA:421,2 +DA:423,2 +FNF:11 +FNH:11 +LF:104 +LH:104 +BRF:19 +BRH:19 +end_of_record +TN: +SF:src/Facets/CelerCircleBridgeFacet.sol +FN:34,CelerCircleBridgeFacet. +FNDA:0,CelerCircleBridgeFacet. +DA:35,0 +DA:36,0 +FN:43,CelerCircleBridgeFacet.startBridgeTokensViaCelerCircleBridge +FNDA:264,CelerCircleBridgeFacet.startBridgeTokensViaCelerCircleBridge +DA:53,259 +DA:54,258 +FN:60,CelerCircleBridgeFacet.swapAndStartBridgeTokensViaCelerCircleBridge +FNDA:5,CelerCircleBridgeFacet.swapAndStartBridgeTokensViaCelerCircleBridge +DA:73,2 +DA:79,1 +FN:86,CelerCircleBridgeFacet._startBridge +FNDA:259,CelerCircleBridgeFacet._startBridge +DA:87,259 +BRDA:87,0,0,1 +BRDA:87,0,1,258 +DA:93,258 +DA:100,258 +DA:107,258 +FNF:4 +FNH:3 +LF:10 +LH:8 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/CelerIMFacetImmutable.sol +FN:19,CelerIMFacetImmutable. +FNDA:0,CelerIMFacetImmutable. +FNF:1 +FNH:0 +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/CelerIMFacetMutable.sol +FN:19,CelerIMFacetMutable. +FNDA:0,CelerIMFacetMutable. +FNF:1 +FNH:0 +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/CircleBridgeFacet.sol +FN:34,CircleBridgeFacet. +FNDA:0,CircleBridgeFacet. +DA:35,0 +DA:36,0 +FN:44,CircleBridgeFacet.startBridgeTokensViaCircleBridge +FNDA:263,CircleBridgeFacet.startBridgeTokensViaCircleBridge +DA:55,258 +DA:56,257 +FN:63,CircleBridgeFacet.swapAndStartBridgeTokensViaCircleBridge +FNDA:5,CircleBridgeFacet.swapAndStartBridgeTokensViaCircleBridge +DA:77,2 +DA:83,1 +FN:91,CircleBridgeFacet._startBridge +FNDA:258,CircleBridgeFacet._startBridge +DA:96,258 +DA:103,258 +DA:110,258 +FNF:4 +FNH:3 +LF:9 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/DexManagerFacet.sol +FN:27,DexManagerFacet.addDex +FNDA:4,DexManagerFacet.addDex +DA:28,4 +BRDA:28,0,0,- +DA:29,0 +DA:32,4 +DA:34,2 +FN:39,DexManagerFacet.batchAddDex +FNDA:4,DexManagerFacet.batchAddDex +DA:40,4 +BRDA:40,1,0,- +DA:41,0 +DA:43,4 +DA:45,4 +DA:46,12 +DA:47,12 +BRDA:47,2,0,- +DA:48,0 +DA:50,12 +DA:51,12 +DA:52,10 +DA:54,10 +FN:61,DexManagerFacet.removeDex +FNDA:1,DexManagerFacet.removeDex +DA:62,1 +BRDA:62,4,0,- +DA:63,0 +DA:65,1 +DA:66,1 +FN:71,DexManagerFacet.batchRemoveDex +FNDA:1,DexManagerFacet.batchRemoveDex +DA:72,1 +BRDA:72,5,0,- +DA:73,0 +DA:75,1 +DA:76,1 +DA:77,2 +DA:78,2 +DA:80,2 +FN:88,DexManagerFacet.setFunctionApprovalBySignature +FNDA:1,DexManagerFacet.setFunctionApprovalBySignature +DA:92,1 +BRDA:92,6,0,- +DA:93,0 +DA:96,1 +BRDA:96,7,0,1 +BRDA:96,7,1,- +DA:97,1 +DA:99,0 +DA:102,1 +FN:108,DexManagerFacet.batchSetFunctionApprovalBySignature +FNDA:1,DexManagerFacet.batchSetFunctionApprovalBySignature +DA:112,1 +BRDA:112,8,0,- +DA:113,0 +DA:115,1 +DA:116,1 +DA:117,5 +DA:118,5 +BRDA:118,9,0,5 +BRDA:118,9,1,- +DA:119,5 +DA:121,0 +DA:123,5 +DA:125,5 +FN:133,DexManagerFacet.isFunctionApproved +FNDA:6,DexManagerFacet.isFunctionApproved +DA:136,6 +FN:141,DexManagerFacet.approvedDexs +FNDA:4,DexManagerFacet.approvedDexs +DA:146,4 +FNF:8 +FNH:8 +LF:44 +LH:35 +BRF:11 +BRH:2 +end_of_record +TN: +SF:src/Facets/DiamondCutFacet.sol +FN:18,DiamondCutFacet.diamondCut +FNDA:1437,DiamondCutFacet.diamondCut +DA:23,1437 +DA:24,1437 +FNF:1 +FNH:1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/DiamondLoupeFacet.sol +FN:24,DiamondLoupeFacet.facets +FNDA:0,DiamondLoupeFacet.facets +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:35,0 +FN:43,DiamondLoupeFacet.facetFunctionSelectors +FNDA:0,DiamondLoupeFacet.facetFunctionSelectors +DA:51,0 +DA:52,0 +FN:59,DiamondLoupeFacet.facetAddresses +FNDA:0,DiamondLoupeFacet.facetAddresses +DA:65,0 +DA:66,0 +FN:73,DiamondLoupeFacet.facetAddress +FNDA:0,DiamondLoupeFacet.facetAddress +DA:76,0 +DA:77,0 +FN:83,DiamondLoupeFacet.supportsInterface +FNDA:0,DiamondLoupeFacet.supportsInterface +DA:86,0 +DA:87,0 +FNF:5 +FNH:0 +LF:16 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/GenericSwapFacet.sol +FN:27,GenericSwapFacet.swapTokensGeneric +FNDA:19,GenericSwapFacet.swapTokensGeneric +DA:35,19 +BRDA:35,0,0,- +DA:36,0 +DA:39,19 +DA:45,19 +DA:47,19 +DA:49,19 +FNF:1 +FNH:1 +LF:6 +LH:5 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/Facets/GenericSwapFacetV3.sol +FN:25,GenericSwapFacetV3. +FNDA:0,GenericSwapFacetV3. +DA:26,0 +FN:40,GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20 +FNDA:7,GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20 +DA:48,7 +DA:50,6 +DA:51,6 +DA:54,6 +DA:59,6 +DA:60,1 +BRDA:60,0,0,1 +DA:63,5 +DA:66,5 +DA:67,5 +DA:77,5 +FN:96,GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative +FNDA:6,GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative +DA:104,6 +DA:107,4 +DA:110,4 +DA:111,1 +BRDA:111,1,0,1 +DA:115,3 +DA:116,3 +BRDA:116,2,0,1 +DA:119,2 +DA:120,2 +DA:121,2 +DA:131,2 +FN:150,GenericSwapFacetV3.swapTokensSingleV3NativeToERC20 +FNDA:7,GenericSwapFacetV3.swapTokensSingleV3NativeToERC20 +DA:158,7 +DA:161,7 +DA:163,1 +BRDA:163,3,0,1 +DA:167,6 +DA:170,6 +BRDA:170,4,0,1 +DA:171,1 +DA:174,5 +DA:177,4 +DA:178,4 +DA:183,4 +DA:184,1 +BRDA:184,5,0,1 +DA:187,3 +DA:190,3 +DA:191,3 +DA:201,3 +FN:222,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToNative +FNDA:5,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToNative +DA:230,5 +DA:231,5 +DA:232,5 +FN:249,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToERC20 +FNDA:10,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToERC20 +DA:257,10 +DA:258,10 +DA:259,6 +FN:276,GenericSwapFacetV3.swapTokensMultipleV3NativeToERC20 +FNDA:5,GenericSwapFacetV3.swapTokensMultipleV3NativeToERC20 +DA:284,5 +DA:285,4 +FN:296,GenericSwapFacetV3._depositMultipleERC20Tokens +FNDA:15,GenericSwapFacetV3._depositMultipleERC20Tokens +DA:300,15 +DA:301,15 +DA:304,15 +DA:305,30 +DA:306,15 +BRDA:306,6,0,15 +DA:309,15 +DA:316,30 +FN:321,GenericSwapFacetV3._depositAndSwapERC20Single +FNDA:13,GenericSwapFacetV3._depositAndSwapERC20Single +DA:325,13 +DA:326,13 +DA:328,13 +DA:331,13 +DA:332,13 +DA:333,13 +DA:335,13 +DA:337,1 +BRDA:337,7,0,1 +DA:340,12 +DA:341,1 +BRDA:341,8,0,1 +DA:344,11 +DA:350,11 +BRDA:350,9,0,8 +DA:352,8 +BRDA:352,10,0,1 +DA:354,8 +DA:359,11 +DA:360,11 +BRDA:360,11,0,1 +DA:361,1 +DA:364,10 +FN:371,GenericSwapFacetV3._executeSwaps +FNDA:20,GenericSwapFacetV3._executeSwaps +DA:377,20 +DA:378,20 +DA:379,20 +DA:380,20 +DA:381,20 +DA:382,20 +DA:383,20 +DA:384,20 +DA:387,20 +DA:388,37 +DA:389,37 +DA:390,37 +DA:391,37 +DA:395,37 +DA:396,35 +DA:399,2 +BRDA:399,12,0,2 +DA:400,2 +DA:405,35 +DA:406,1 +DA:407,1 +BRDA:407,13,0,1 +DA:408,1 +DA:411,34 +BRDA:411,14,0,7 +BRDA:411,14,1,26 +DA:414,7 +DA:417,7 +BRDA:417,15,0,1 +DA:418,1 +DA:423,6 +DA:424,4 +BRDA:424,16,0,4 +DA:428,27 +DA:432,27 +BRDA:432,17,0,25 +DA:433,25 +DA:434,25 +DA:441,27 +DA:444,27 +BRDA:444,18,0,1 +DA:445,1 +DA:450,26 +DA:451,19 +BRDA:451,19,0,19 +DA:458,32 +DA:471,32 +FN:476,GenericSwapFacetV3._transferERC20TokensAndEmitEvent +FNDA:10,GenericSwapFacetV3._transferERC20TokensAndEmitEvent +DA:485,10 +DA:487,10 +DA:490,10 +DA:491,1 +BRDA:491,20,0,1 +DA:494,9 +DA:497,9 +FN:509,GenericSwapFacetV3._transferNativeTokensAndEmitEvent +FNDA:5,GenericSwapFacetV3._transferNativeTokensAndEmitEvent +DA:517,5 +DA:520,5 +DA:521,1 +BRDA:521,21,0,1 +DA:525,4 +DA:526,4 +BRDA:526,22,0,1 +DA:527,1 +DA:531,3 +FN:544,GenericSwapFacetV3._returnPositiveSlippageERC20 +FNDA:29,GenericSwapFacetV3._returnPositiveSlippageERC20 +DA:549,29 +BRDA:549,23,0,29 +DA:550,29 +DA:554,29 +BRDA:554,24,0,5 +DA:555,5 +FN:561,GenericSwapFacetV3._returnPositiveSlippageNative +FNDA:9,GenericSwapFacetV3._returnPositiveSlippageNative +DA:563,9 +DA:565,9 +BRDA:565,25,0,2 +DA:567,2 +DA:568,2 +BRDA:568,26,0,1 +FNF:14 +FNH:13 +LF:128 +LH:127 +BRF:28 +BRH:28 +end_of_record +TN: +SF:src/Facets/GnosisBridgeFacet.sol +FN:32,GnosisBridgeFacet. +FNDA:0,GnosisBridgeFacet. +DA:33,0 +FN:40,GnosisBridgeFacet.startBridgeTokensViaXDaiBridge +FNDA:264,GnosisBridgeFacet.startBridgeTokensViaXDaiBridge +DA:51,259 +DA:52,258 +FN:58,GnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge +FNDA:5,GnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge +DA:72,2 +DA:79,1 +FN:86,GnosisBridgeFacet._startBridge +FNDA:259,GnosisBridgeFacet._startBridge +DA:87,259 +DA:92,259 +DA:93,258 +FNF:4 +FNH:3 +LF:8 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/GnosisBridgeL2Facet.sol +FN:37,GnosisBridgeL2Facet. +FNDA:0,GnosisBridgeL2Facet. +DA:38,0 +FN:45,GnosisBridgeL2Facet.startBridgeTokensViaXDaiBridge +FNDA:6,GnosisBridgeL2Facet.startBridgeTokensViaXDaiBridge +DA:58,1 +FN:64,GnosisBridgeL2Facet.swapAndStartBridgeTokensViaXDaiBridge +FNDA:5,GnosisBridgeL2Facet.swapAndStartBridgeTokensViaXDaiBridge +DA:78,2 +DA:85,1 +FN:92,GnosisBridgeL2Facet._startBridge +FNDA:2,GnosisBridgeL2Facet._startBridge +DA:93,2 +DA:96,2 +FNF:4 +FNH:3 +LF:6 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/HopFacet.sol +FN:54,HopFacet.initHop +FNDA:27,HopFacet.initHop +DA:55,27 +DA:57,27 +DA:59,27 +DA:60,75 +BRDA:60,0,0,- +DA:61,0 +DA:63,75 +DA:66,27 +FN:74,HopFacet.registerBridge +FNDA:3,HopFacet.registerBridge +DA:75,3 +DA:77,2 +DA:79,2 +BRDA:79,1,0,1 +DA:80,1 +DA:83,1 +DA:85,1 +FN:91,HopFacet.startBridgeTokensViaHop +FNDA:269,HopFacet.startBridgeTokensViaHop +DA:103,263 +DA:107,261 +FN:114,HopFacet.swapAndStartBridgeTokensViaHop +FNDA:8,HopFacet.swapAndStartBridgeTokensViaHop +DA:127,4 +DA:134,3 +FN:142,HopFacet._startBridge +FNDA:264,HopFacet._startBridge +DA:146,264 +DA:147,264 +DA:148,264 +DA:151,264 +DA:157,264 +DA:161,264 +BRDA:161,2,0,263 +BRDA:161,2,1,1 +DA:163,263 +DA:175,1 +DA:186,264 +FN:190,HopFacet.getStorage +FNDA:293,HopFacet.getStorage +DA:191,293 +DA:194,293 +FNF:6 +FNH:6 +LF:28 +LH:27 +BRF:4 +BRH:3 +end_of_record +TN: +SF:src/Facets/HopFacetOptimized.sol +FN:34,HopFacetOptimized.setApprovalForBridges +FNDA:72,HopFacetOptimized.setApprovalForBridges +DA:38,72 +DA:39,72 +DA:41,232 +FN:52,HopFacetOptimized.startBridgeTokensViaHopL1ERC20 +FNDA:260,HopFacetOptimized.startBridgeTokensViaHopL1ERC20 +DA:57,260 +DA:64,259 +DA:73,257 +FN:79,HopFacetOptimized.startBridgeTokensViaHopL1Native +FNDA:1,HopFacetOptimized.startBridgeTokensViaHopL1Native +DA:84,1 +DA:95,1 +FN:102,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1ERC20 +FNDA:4,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1ERC20 +DA:108,4 +DA:117,3 +DA:126,2 +FN:133,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1Native +FNDA:1,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1Native +DA:139,1 +DA:148,1 +DA:160,1 +FN:166,HopFacetOptimized.startBridgeTokensViaHopL2ERC20 +FNDA:260,HopFacetOptimized.startBridgeTokensViaHopL2ERC20 +DA:171,260 +DA:178,259 +DA:188,257 +FN:194,HopFacetOptimized.startBridgeTokensViaHopL2Native +FNDA:1,HopFacetOptimized.startBridgeTokensViaHopL2Native +DA:199,1 +DA:209,1 +FN:216,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2ERC20 +FNDA:5,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2ERC20 +DA:222,5 +DA:229,4 +DA:239,2 +FN:246,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2Native +FNDA:1,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2Native +DA:252,1 +DA:259,1 +DA:269,1 +FNF:9 +FNH:9 +LF:25 +LH:25 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/HopFacetPacked.sol +FN:39,HopFacetPacked. +FNDA:0,HopFacetPacked. +DA:43,0 +DA:45,0 +BRDA:45,0,0,- +DA:46,0 +DA:49,0 +DA:52,0 +DA:55,0 +DA:58,0 +FN:69,HopFacetPacked.setApprovalForHopBridges +FNDA:32,HopFacetPacked.setApprovalForHopBridges +DA:73,32 +DA:75,32 +DA:77,160 +FN:87,HopFacetPacked.startBridgeTokensViaHopL2NativePacked +FNDA:3,HopFacetPacked.startBridgeTokensViaHopL2NativePacked +DA:96,3 +DA:97,3 +DA:98,3 +DA:101,3 +DA:104,3 +DA:114,3 +DA:123,3 +FN:137,HopFacetPacked.startBridgeTokensViaHopL2NativeMin +FNDA:2,HopFacetPacked.startBridgeTokensViaHopL2NativeMin +DA:148,2 +DA:159,2 +FN:168,HopFacetPacked.encode_startBridgeTokensViaHopL2NativePacked +FNDA:16,HopFacetPacked.encode_startBridgeTokensViaHopL2NativePacked +DA:175,16 +BRDA:175,1,0,- +BRDA:175,1,1,16 +DA:179,16 +BRDA:179,2,0,- +BRDA:179,2,1,16 +DA:183,16 +BRDA:183,3,0,- +BRDA:183,3,1,16 +DA:188,16 +DA:189,16 +FN:201,HopFacetPacked.decode_startBridgeTokensViaHopL2NativePacked +FNDA:1,HopFacetPacked.decode_startBridgeTokensViaHopL2NativePacked +DA:208,1 +BRDA:208,4,0,- +BRDA:208,4,1,1 +DA:213,1 +DA:214,1 +DA:216,1 +DA:217,1 +DA:218,1 +DA:219,1 +DA:220,1 +DA:222,1 +FN:227,HopFacetPacked.startBridgeTokensViaHopL2ERC20Packed +FNDA:4,HopFacetPacked.startBridgeTokensViaHopL2ERC20Packed +DA:241,4 +DA:242,4 +DA:243,4 +DA:244,4 +DA:246,4 +DA:251,4 +DA:258,4 +DA:268,4 +DA:277,4 +FN:291,HopFacetPacked.startBridgeTokensViaHopL2ERC20Min +FNDA:4,HopFacetPacked.startBridgeTokensViaHopL2ERC20Min +DA:304,4 +DA:311,4 +DA:322,4 +FN:336,HopFacetPacked.encode_startBridgeTokensViaHopL2ERC20Packed +FNDA:32,HopFacetPacked.encode_startBridgeTokensViaHopL2ERC20Packed +DA:348,32 +BRDA:348,5,0,- +BRDA:348,5,1,32 +DA:352,32 +BRDA:352,6,0,- +BRDA:352,6,1,32 +DA:356,32 +BRDA:356,7,0,- +BRDA:356,7,1,32 +DA:360,32 +BRDA:360,8,0,- +BRDA:360,8,1,32 +DA:364,32 +BRDA:364,9,0,- +BRDA:364,9,1,32 +DA:368,32 +BRDA:368,10,0,- +BRDA:368,10,1,32 +DA:373,32 +DA:374,32 +FN:391,HopFacetPacked.decode_startBridgeTokensViaHopL2ERC20Packed +FNDA:2,HopFacetPacked.decode_startBridgeTokensViaHopL2ERC20Packed +DA:398,2 +BRDA:398,11,0,- +BRDA:398,11,1,2 +DA:403,2 +DA:404,2 +DA:406,2 +DA:407,2 +DA:408,2 +DA:409,2 +DA:410,2 +DA:411,2 +DA:412,2 +DA:413,2 +DA:416,2 +DA:417,2 +DA:419,2 +FN:424,HopFacetPacked.startBridgeTokensViaHopL1NativePacked +FNDA:3,HopFacetPacked.startBridgeTokensViaHopL1NativePacked +DA:436,3 +DA:448,3 +FN:459,HopFacetPacked.startBridgeTokensViaHopL1NativeMin +FNDA:2,HopFacetPacked.startBridgeTokensViaHopL1NativeMin +DA:469,2 +DA:479,2 +FN:490,HopFacetPacked.encode_startBridgeTokensViaHopL1NativePacked +FNDA:16,HopFacetPacked.encode_startBridgeTokensViaHopL1NativePacked +DA:499,16 +BRDA:499,12,0,- +BRDA:499,12,1,16 +DA:503,16 +BRDA:503,13,0,- +BRDA:503,13,1,16 +DA:507,16 +BRDA:507,14,0,- +BRDA:507,14,1,16 +DA:512,16 +DA:513,16 +FN:527,HopFacetPacked.decode_startBridgeTokensViaHopL1NativePacked +FNDA:1,HopFacetPacked.decode_startBridgeTokensViaHopL1NativePacked +DA:534,1 +BRDA:534,15,0,- +BRDA:534,15,1,1 +DA:539,1 +DA:540,1 +DA:542,1 +DA:543,1 +DA:544,1 +DA:545,1 +DA:550,1 +DA:552,1 +FN:557,HopFacetPacked.startBridgeTokensViaHopL1ERC20Packed +FNDA:4,HopFacetPacked.startBridgeTokensViaHopL1ERC20Packed +DA:570,4 +DA:573,4 +DA:580,4 +DA:590,4 +FN:603,HopFacetPacked.startBridgeTokensViaHopL1ERC20Min +FNDA:4,HopFacetPacked.startBridgeTokensViaHopL1ERC20Min +DA:615,4 +DA:622,4 +DA:632,4 +FN:645,HopFacetPacked.encode_startBridgeTokensViaHopL1ERC20Packed +FNDA:32,HopFacetPacked.encode_startBridgeTokensViaHopL1ERC20Packed +DA:656,32 +BRDA:656,16,0,- +BRDA:656,16,1,32 +DA:660,32 +BRDA:660,17,0,- +BRDA:660,17,1,32 +DA:664,32 +BRDA:664,18,0,- +BRDA:664,18,1,32 +DA:668,32 +BRDA:668,19,0,- +BRDA:668,19,1,32 +DA:673,32 +DA:674,32 +FN:690,HopFacetPacked.decode_startBridgeTokensViaHopL1ERC20Packed +FNDA:2,HopFacetPacked.decode_startBridgeTokensViaHopL1ERC20Packed +DA:697,2 +BRDA:697,20,0,- +BRDA:697,20,1,2 +DA:702,2 +DA:703,2 +DA:705,2 +DA:706,2 +DA:707,2 +DA:708,2 +DA:709,2 +DA:710,2 +DA:715,2 +DA:717,2 +FNF:18 +FNH:17 +LF:109 +LH:102 +BRF:41 +BRH:20 +end_of_record +TN: +SF:src/Facets/HyphenFacet.sol +FN:25,HyphenFacet. +FNDA:0,HyphenFacet. +DA:26,0 +FN:33,HyphenFacet.startBridgeTokensViaHyphen +FNDA:264,HyphenFacet.startBridgeTokensViaHyphen +DA:44,259 +DA:48,258 +FN:54,HyphenFacet.swapAndStartBridgeTokensViaHyphen +FNDA:6,HyphenFacet.swapAndStartBridgeTokensViaHyphen +DA:66,3 +DA:72,2 +FN:79,HyphenFacet._startBridge +FNDA:260,HyphenFacet._startBridge +DA:80,260 +BRDA:80,0,0,258 +BRDA:80,0,1,2 +DA:82,258 +DA:88,258 +DA:96,2 +DA:103,260 +FNF:4 +FNH:3 +LF:10 +LH:9 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/LIFuelFacet.sol +FN:32,LIFuelFacet.startBridgeTokensViaLIFuel +FNDA:263,LIFuelFacet.startBridgeTokensViaLIFuel +DA:43,259 +DA:47,258 +FN:53,LIFuelFacet.swapAndStartBridgeTokensViaLIFuel +FNDA:6,LIFuelFacet.swapAndStartBridgeTokensViaLIFuel +DA:65,3 +DA:72,2 +FN:79,LIFuelFacet._startBridge +FNDA:260,LIFuelFacet._startBridge +DA:80,260 +DA:84,260 +BRDA:84,0,0,2 +BRDA:84,0,1,258 +DA:85,2 +DA:93,258 +DA:99,258 +DA:107,260 +FN:111,LIFuelFacet.getStorage +FNDA:260,LIFuelFacet.getStorage +DA:112,260 +DA:115,260 +FNF:4 +FNH:4 +LF:12 +LH:12 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/MayanFacet.sol +FN:53,MayanFacet. +FNDA:0,MayanFacet. +DA:54,0 +FN:62,MayanFacet.startBridgeTokensViaMayan +FNDA:265,MayanFacet.startBridgeTokensViaMayan +DA:74,260 +DA:79,259 +BRDA:79,0,0,1 +DA:81,1 +DA:87,259 +FN:94,MayanFacet.swapAndStartBridgeTokensViaMayan +FNDA:9,MayanFacet.swapAndStartBridgeTokensViaMayan +DA:107,6 +DA:114,5 +DA:115,5 +DA:116,5 +DA:121,5 +DA:127,5 +BRDA:127,1,0,3 +DA:129,3 +DA:135,5 +FN:143,MayanFacet._startBridge +FNDA:264,MayanFacet._startBridge +DA:148,264 +BRDA:148,2,0,1 +BRDA:148,2,1,263 +DA:149,1 +BRDA:149,3,0,- +DA:150,0 +DA:155,1 +DA:156,1 +BRDA:156,4,0,1 +DA:157,1 +DA:163,263 +DA:166,263 +BRDA:166,5,0,- +DA:167,0 +DA:171,263 +DA:173,263 +BRDA:173,6,0,260 +BRDA:173,6,1,3 +DA:174,260 +DA:180,260 +DA:188,3 +DA:194,263 +BRDA:194,7,0,- +DA:195,0 +DA:202,263 +FN:208,MayanFacet._parseReceiver +FNDA:264,MayanFacet._parseReceiver +DA:211,264 +DA:214,264 +DA:216,264 +DA:219,264 +DA:221,0 +DA:223,264 +DA:225,0 +DA:227,264 +DA:229,259 +DA:231,5 +DA:233,2 +DA:235,3 +DA:237,3 +DA:239,0 +DA:241,0 +DA:243,0 +DA:245,0 +DA:247,0 +DA:248,0 +FN:256,MayanFacet._normalizeAmount +FNDA:6,MayanFacet._normalizeAmount +DA:260,6 +BRDA:260,8,0,4 +DA:261,4 +DA:262,4 +DA:264,6 +FN:271,MayanFacet._replaceInputAmount +FNDA:3,MayanFacet._replaceInputAmount +DA:275,3 +BRDA:275,9,0,- +BRDA:275,9,1,3 +DA:276,3 +DA:277,3 +DA:282,3 +DA:284,3 +DA:285,3 +BRDA:285,10,0,1 +BRDA:285,10,1,2 +DA:286,1 +DA:288,2 +DA:292,3 +DA:293,524 +DA:297,3 +DA:298,3 +DA:299,96 +DA:303,3 +DA:304,992 +DA:307,3 +FNF:7 +FNH:6 +LF:69 +LH:57 +BRF:15 +BRH:11 +end_of_record +TN: +SF:src/Facets/NonStandardSelectorsRegistryFacet.sol +FN:23,NonStandardSelectorsRegistryFacet.setNonStandardSelector +FNDA:2,NonStandardSelectorsRegistryFacet.setNonStandardSelector +DA:27,2 +DA:28,1 +DA:29,1 +FN:35,NonStandardSelectorsRegistryFacet.batchSetNonStandardSelectors +FNDA:2,NonStandardSelectorsRegistryFacet.batchSetNonStandardSelectors +DA:39,2 +DA:40,1 +DA:41,1 +BRDA:41,0,0,- +BRDA:41,0,1,1 +DA:45,1 +DA:46,2 +FN:53,NonStandardSelectorsRegistryFacet.isNonStandardSelector +FNDA:3,NonStandardSelectorsRegistryFacet.isNonStandardSelector +DA:56,3 +FN:62,NonStandardSelectorsRegistryFacet.getStorage +FNDA:5,NonStandardSelectorsRegistryFacet.getStorage +DA:63,5 +DA:65,5 +FNF:4 +FNH:4 +LF:11 +LH:11 +BRF:2 +BRH:1 +end_of_record +TN: +SF:src/Facets/OmniBridgeFacet.sol +FN:29,OmniBridgeFacet. +FNDA:0,OmniBridgeFacet. +DA:30,0 +DA:31,0 +FN:38,OmniBridgeFacet.startBridgeTokensViaOmniBridge +FNDA:527,OmniBridgeFacet.startBridgeTokensViaOmniBridge +DA:49,517 +DA:53,515 +FN:59,OmniBridgeFacet.swapAndStartBridgeTokensViaOmniBridge +FNDA:11,OmniBridgeFacet.swapAndStartBridgeTokensViaOmniBridge +DA:71,5 +DA:77,3 +FN:84,OmniBridgeFacet._startBridge +FNDA:518,OmniBridgeFacet._startBridge +DA:85,518 +BRDA:85,0,0,2 +BRDA:85,0,1,516 +DA:86,2 +DA:90,516 +DA:95,516 +DA:102,518 +FNF:4 +FNH:3 +LF:11 +LH:9 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/OptimismBridgeFacet.sol +FN:57,OptimismBridgeFacet.initOptimism +FNDA:7,OptimismBridgeFacet.initOptimism +DA:61,7 +DA:63,7 +DA:65,0 +BRDA:65,0,0,- +DA:66,0 +DA:69,7 +DA:70,7 +BRDA:70,1,0,- +DA:71,0 +DA:73,7 +DA:78,7 +DA:79,7 +DA:81,7 +FN:89,OptimismBridgeFacet.registerOptimismBridge +FNDA:0,OptimismBridgeFacet.registerOptimismBridge +DA:90,0 +DA:92,0 +DA:94,0 +BRDA:94,2,0,- +DA:96,0 +BRDA:96,3,0,- +DA:97,0 +DA:100,0 +DA:102,0 +FN:108,OptimismBridgeFacet.startBridgeTokensViaOptimismBridge +FNDA:6,OptimismBridgeFacet.startBridgeTokensViaOptimismBridge +DA:120,3 +DA:124,1 +FN:131,OptimismBridgeFacet.swapAndStartBridgeTokensViaOptimismBridge +FNDA:1,OptimismBridgeFacet.swapAndStartBridgeTokensViaOptimismBridge +DA:144,1 +DA:150,1 +FN:158,OptimismBridgeFacet._startBridge +FNDA:2,OptimismBridgeFacet._startBridge +DA:162,2 +DA:163,2 +DA:166,2 +DA:172,2 +BRDA:172,4,0,- +BRDA:172,4,1,2 +DA:173,0 +DA:179,2 +DA:185,0 +BRDA:185,5,0,- +BRDA:185,5,1,2 +DA:186,0 +DA:188,2 +DA:199,2 +FN:203,OptimismBridgeFacet.getStorage +FNDA:9,OptimismBridgeFacet.getStorage +DA:204,9 +DA:207,9 +FNF:6 +FNH:5 +LF:34 +LH:21 +BRF:8 +BRH:2 +end_of_record +TN: +SF:src/Facets/OwnershipFacet.sol +FN:43,OwnershipFacet.transferOwnership +FNDA:5,OwnershipFacet.transferOwnership +DA:44,5 +DA:45,4 +DA:47,4 +BRDA:47,0,0,1 +DA:49,3 +DA:50,1 +BRDA:50,1,0,1 +DA:52,2 +DA:53,2 +FN:57,OwnershipFacet.cancelOwnershipTransfer +FNDA:0,OwnershipFacet.cancelOwnershipTransfer +DA:58,0 +DA:59,0 +DA:61,0 +DA:62,0 +BRDA:62,2,0,- +DA:63,0 +FN:67,OwnershipFacet.confirmOwnershipTransfer +FNDA:2,OwnershipFacet.confirmOwnershipTransfer +DA:68,2 +DA:69,2 +DA:70,2 +BRDA:70,3,0,1 +DA:71,1 +DA:72,1 +DA:73,1 +FN:78,OwnershipFacet.owner +FNDA:3,OwnershipFacet.owner +DA:79,3 +FN:85,OwnershipFacet.getStorage +FNDA:6,OwnershipFacet.getStorage +DA:86,6 +DA:89,6 +FNF:5 +FNH:4 +LF:21 +LH:16 +BRF:4 +BRH:3 +end_of_record +TN: +SF:src/Facets/PeripheryRegistryFacet.sol +FN:31,PeripheryRegistryFacet.registerPeripheryContract +FNDA:22,PeripheryRegistryFacet.registerPeripheryContract +DA:35,22 +DA:36,22 +DA:37,22 +DA:38,22 +FN:43,PeripheryRegistryFacet.getPeripheryContract +FNDA:2,PeripheryRegistryFacet.getPeripheryContract +DA:46,2 +FN:50,PeripheryRegistryFacet.getStorage +FNDA:24,PeripheryRegistryFacet.getStorage +DA:51,24 +DA:54,24 +FNF:3 +FNH:3 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Facets/PolygonBridgeFacet.sol +FN:29,PolygonBridgeFacet. +FNDA:0,PolygonBridgeFacet. +DA:30,0 +DA:31,0 +FN:38,PolygonBridgeFacet.startBridgeTokensViaPolygonBridge +FNDA:264,PolygonBridgeFacet.startBridgeTokensViaPolygonBridge +DA:49,259 +DA:53,258 +FN:59,PolygonBridgeFacet.swapAndStartBridgeTokensViaPolygonBridge +FNDA:6,PolygonBridgeFacet.swapAndStartBridgeTokensViaPolygonBridge +DA:71,3 +DA:77,2 +FN:84,PolygonBridgeFacet._startBridge +FNDA:260,PolygonBridgeFacet._startBridge +DA:85,260 +DA:87,260 +BRDA:87,0,0,2 +BRDA:87,0,1,258 +DA:88,2 +DA:92,258 +DA:96,258 +DA:102,258 +DA:103,258 +DA:110,260 +FNF:4 +FNH:3 +LF:14 +LH:12 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/SquidFacet.sol +FN:67,SquidFacet. +FNDA:0,SquidFacet. +DA:68,0 +FN:76,SquidFacet.startBridgeTokensViaSquid +FNDA:7,SquidFacet.startBridgeTokensViaSquid +DA:87,3 +DA:92,3 +FN:99,SquidFacet.swapAndStartBridgeTokensViaSquid +FNDA:5,SquidFacet.swapAndStartBridgeTokensViaSquid +DA:112,2 +DA:120,1 +FN:128,SquidFacet._startBridge +FNDA:4,SquidFacet._startBridge +DA:132,4 +DA:139,4 +BRDA:139,0,0,2 +DA:140,2 +DA:148,4 +BRDA:148,1,0,1 +BRDA:148,1,1,- +DA:149,1 +DA:150,3 +BRDA:150,2,0,- +BRDA:150,2,1,- +DA:151,0 +DA:152,3 +BRDA:152,3,0,3 +BRDA:152,3,1,- +DA:153,3 +DA:155,0 +DA:158,4 +FN:161,SquidFacet._bridgeCall +FNDA:1,SquidFacet._bridgeCall +DA:162,1 +FN:173,SquidFacet._callBridge +FNDA:0,SquidFacet._callBridge +DA:174,0 +FN:186,SquidFacet._callBridgeCall +FNDA:3,SquidFacet._callBridgeCall +DA:187,3 +FN:202,SquidFacet._calculateMsgValue +FNDA:4,SquidFacet._calculateMsgValue +DA:206,4 +DA:207,4 +BRDA:207,4,0,2 +DA:208,2 +DA:210,4 +FNF:8 +FNH:6 +LF:23 +LH:19 +BRF:8 +BRH:4 +end_of_record +TN: +SF:src/Facets/StandardizedCallFacet.sol +FN:15,StandardizedCallFacet.standardizedCall +FNDA:2,StandardizedCallFacet.standardizedCall +DA:16,2 +FN:21,StandardizedCallFacet.standardizedSwapCall +FNDA:2,StandardizedCallFacet.standardizedSwapCall +DA:22,2 +FN:27,StandardizedCallFacet.standardizedBridgeCall +FNDA:2,StandardizedCallFacet.standardizedBridgeCall +DA:28,2 +FN:33,StandardizedCallFacet.standardizedSwapAndBridgeCall +FNDA:2,StandardizedCallFacet.standardizedSwapAndBridgeCall +DA:36,2 +FN:39,StandardizedCallFacet.execute +FNDA:8,StandardizedCallFacet.execute +DA:42,8 +DA:43,8 +DA:47,8 +BRDA:47,0,0,4 +DA:48,4 +DA:55,4 +DA:64,4 +DA:67,4 +DA:68,0 +DA:70,4 +DA:71,4 +FNF:5 +FNH:5 +LF:14 +LH:13 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/Facets/StargateFacet.sol +FN:80,StargateFacet. +FNDA:0,StargateFacet. +DA:81,0 +FN:88,StargateFacet.initStargate +FNDA:23,StargateFacet.initStargate +DA:89,23 +DA:91,22 +DA:93,22 +DA:94,66 +DA:98,22 +DA:100,22 +FN:108,StargateFacet.startBridgeTokensViaStargate +FNDA:268,StargateFacet.startBridgeTokensViaStargate +DA:119,264 +DA:120,263 +DA:124,262 +FN:131,StargateFacet.swapAndStartBridgeTokensViaStargate +FNDA:6,StargateFacet.swapAndStartBridgeTokensViaStargate +DA:143,3 +DA:144,3 +DA:152,2 +FN:155,StargateFacet.quoteLayerZeroFee +FNDA:46,StargateFacet.quoteLayerZeroFee +DA:159,46 +DA:160,46 +FN:178,StargateFacet._startBridge +FNDA:264,StargateFacet._startBridge +DA:182,264 +BRDA:182,0,0,3 +BRDA:182,0,1,259 +DA:183,3 +DA:201,261 +DA:207,261 +DA:224,262 +DA:226,262 +FN:229,StargateFacet.validateDestinationCallFlag +FNDA:267,StargateFacet.validateDestinationCallFlag +DA:234,267 +DA:236,1 +BRDA:236,1,0,1 +DA:237,1 +FN:247,StargateFacet.setLayerZeroChainId +FNDA:2,StargateFacet.setLayerZeroChainId +DA:251,2 +DA:252,1 +DA:254,1 +BRDA:254,2,0,- +DA:255,0 +DA:258,1 +DA:259,1 +FN:265,StargateFacet.getLayerZeroChainId +FNDA:310,StargateFacet.getLayerZeroChainId +DA:268,310 +DA:269,310 +DA:270,310 +BRDA:270,3,0,- +DA:271,310 +FN:274,StargateFacet.toBytes +FNDA:310,StargateFacet.toBytes +DA:275,310 +FN:279,StargateFacet.getStorage +FNDA:333,StargateFacet.getStorage +DA:280,333 +DA:283,333 +FNF:11 +FNH:10 +LF:37 +LH:35 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/Facets/StargateFacetV2.sol +FN:40,StargateFacetV2. +FNDA:4,StargateFacetV2. +DA:41,4 +FN:49,StargateFacetV2.startBridgeTokensViaStargate +FNDA:23,StargateFacetV2.startBridgeTokensViaStargate +DA:60,19 +DA:64,18 +FN:71,StargateFacetV2.swapAndStartBridgeTokensViaStargate +FNDA:10,StargateFacetV2.swapAndStartBridgeTokensViaStargate +DA:83,7 +DA:91,6 +FN:99,StargateFacetV2._startBridge +FNDA:24,StargateFacetV2._startBridge +DA:105,24 +DA:109,6 +BRDA:109,0,0,6 +DA:113,18 +DA:116,1 +BRDA:116,1,0,1 +DA:119,17 +DA:122,17 +DA:123,1 +BRDA:123,2,0,1 +DA:126,16 +DA:127,16 +BRDA:127,3,0,5 +BRDA:127,3,1,10 +DA:130,5 +DA:134,11 +DA:135,11 +DA:140,11 +BRDA:140,4,0,10 +DA:142,10 +BRDA:142,5,0,2 +DA:143,2 +DA:146,10 +DA:151,16 +DA:154,16 +DA:160,14 +FNF:4 +FNH:4 +LF:24 +LH:24 +BRF:7 +BRH:7 +end_of_record +TN: +SF:src/Facets/SymbiosisFacet.sol +FN:49,SymbiosisFacet. +FNDA:0,SymbiosisFacet. +DA:53,0 +DA:54,0 +FN:62,SymbiosisFacet.startBridgeTokensViaSymbiosis +FNDA:264,SymbiosisFacet.startBridgeTokensViaSymbiosis +DA:74,259 +DA:79,258 +FN:88,SymbiosisFacet.swapAndStartBridgeTokensViaSymbiosis +FNDA:6,SymbiosisFacet.swapAndStartBridgeTokensViaSymbiosis +DA:100,3 +DA:107,2 +FN:113,SymbiosisFacet._startBridge +FNDA:260,SymbiosisFacet._startBridge +DA:117,260 +DA:118,260 +DA:120,2 +BRDA:120,0,0,2 +BRDA:120,0,1,258 +DA:121,2 +DA:123,258 +DA:130,260 +DA:144,260 +FNF:4 +FNH:3 +LF:13 +LH:11 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/Facets/ThorSwapFacet.sol +FN:31,ThorSwapFacet. +FNDA:0,ThorSwapFacet. +DA:32,0 +FN:38,ThorSwapFacet.startBridgeTokensViaThorSwap +FNDA:264,ThorSwapFacet.startBridgeTokensViaThorSwap +DA:50,259 +DA:54,258 +FN:61,ThorSwapFacet.swapAndStartBridgeTokensViaThorSwap +FNDA:6,ThorSwapFacet.swapAndStartBridgeTokensViaThorSwap +DA:74,3 +DA:80,2 +FN:86,ThorSwapFacet._startBridge +FNDA:260,ThorSwapFacet._startBridge +DA:90,260 +DA:91,260 +DA:93,260 +BRDA:93,0,0,258 +DA:94,258 +DA:100,260 +DA:110,260 +FNF:4 +FNH:3 +LF:11 +LH:10 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/Facets/WithdrawFacet.sol +FN:35,WithdrawFacet.executeCallAndWithdraw +FNDA:5,WithdrawFacet.executeCallAndWithdraw +DA:42,5 +BRDA:42,0,0,2 +DA:43,2 +DA:47,3 +DA:48,3 +DA:49,3 +BRDA:49,1,0,- +DA:52,3 +DA:54,2 +BRDA:54,2,0,2 +BRDA:54,2,1,1 +DA:55,2 +DA:57,1 +FN:65,WithdrawFacet.withdraw +FNDA:0,WithdrawFacet.withdraw +DA:70,0 +BRDA:70,3,0,- +DA:71,0 +DA:73,0 +FN:82,WithdrawFacet._withdrawAsset +FNDA:2,WithdrawFacet._withdrawAsset +DA:87,2 +DA:88,2 +DA:89,2 +FNF:3 +FNH:2 +LF:15 +LH:12 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/Helpers/CelerIMFacetBase.sol +FN:70,CelerIMFacetBase. +FNDA:0,CelerIMFacetBase. +DA:77,0 +DA:84,0 +DA:85,0 +FN:93,CelerIMFacetBase.startBridgeTokensViaCelerIM +FNDA:271,CelerIMFacetBase.startBridgeTokensViaCelerIM +DA:104,267 +DA:105,266 +BRDA:105,0,0,262 +DA:107,262 +DA:110,262 +DA:111,262 +DA:119,261 +DA:121,0 +BRDA:121,1,0,- +DA:122,0 +DA:126,265 +FN:133,CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM +FNDA:9,CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM +DA:145,5 +DA:147,5 +DA:155,4 +BRDA:155,2,0,2 +DA:157,2 +DA:160,2 +DA:161,2 +DA:168,2 +DA:170,0 +BRDA:170,3,0,- +DA:171,0 +DA:175,4 +FN:183,CelerIMFacetBase._startBridge +FNDA:269,CelerIMFacetBase._startBridge +DA:189,269 +DA:194,269 +BRDA:194,4,0,267 +BRDA:194,4,1,2 +DA:196,267 +DA:204,2 +DA:207,2 +DA:210,2 +DA:217,2 +DA:228,2 +DA:232,268 +FN:238,CelerIMFacetBase._getRightAsset +FNDA:264,CelerIMFacetBase._getRightAsset +DA:241,264 +BRDA:241,5,0,- +BRDA:241,5,1,- +DA:243,0 +DA:246,264 +FN:250,CelerIMFacetBase.validateDestinationCallFlag +FNDA:272,CelerIMFacetBase.validateDestinationCallFlag +DA:255,272 +DA:257,1 +BRDA:257,6,0,1 +DA:258,1 +FNF:6 +FNH:5 +LF:37 +LH:29 +BRF:9 +BRH:5 +end_of_record +TN: +SF:src/Helpers/ExcessivelySafeCall.sol +FN:29,ExcessivelySafeCall.excessivelySafeCall +FNDA:0,ExcessivelySafeCall.excessivelySafeCall +DA:37,0 +DA:38,0 +DA:39,0 +DA:45,0 +DA:55,0 +DA:56,0 +BRDA:56,0,0,- +DA:57,0 +DA:60,0 +DA:62,0 +DA:64,0 +FN:82,ExcessivelySafeCall.excessivelySafeStaticCall +FNDA:0,ExcessivelySafeCall.excessivelySafeStaticCall +DA:89,0 +DA:90,0 +DA:91,0 +DA:97,0 +DA:106,0 +DA:107,0 +BRDA:107,1,0,- +DA:108,0 +DA:111,0 +DA:113,0 +DA:115,0 +FN:127,ExcessivelySafeCall.swapSelector +FNDA:0,ExcessivelySafeCall.swapSelector +DA:131,0 +BRDA:131,2,0,- +DA:132,0 +DA:134,0 +DA:137,0 +DA:140,0 +DA:141,0 +DA:142,0 +FNF:3 +FNH:0 +LF:27 +LH:0 +BRF:3 +BRH:0 +end_of_record +TN: +SF:src/Helpers/ReentrancyGuard.sol +FN:30,ReentrancyGuard.nonReentrant +FNDA:2783,ReentrancyGuard.nonReentrant +DA:31,2783 +DA:32,2783 +BRDA:32,0,0,2 +DA:33,2781 +DA:35,2652 +FN:41,ReentrancyGuard.reentrancyStorage +FNDA:5004,ReentrancyGuard.reentrancyStorage +DA:46,5004 +DA:49,5004 +FNF:2 +FNH:2 +LF:6 +LH:6 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/Helpers/SwapperV2.sol +FN:31,SwapperV2.noLeftovers +FNDA:63,SwapperV2.noLeftovers +DA:36,63 +DA:37,63 +BRDA:37,0,0,18 +BRDA:37,0,1,15 +DA:38,18 +DA:39,18 +DA:43,18 +DA:44,18 +DA:46,18 +BRDA:46,1,0,15 +DA:47,15 +DA:50,15 +BRDA:50,2,0,4 +DA:51,4 +DA:59,18 +FN:72,SwapperV2.noLeftoversReserve +FNDA:24,SwapperV2.noLeftoversReserve +DA:78,24 +DA:79,24 +BRDA:79,3,0,- +BRDA:79,3,1,- +DA:80,0 +DA:81,0 +DA:85,0 +DA:86,0 +DA:88,0 +BRDA:88,4,0,- +DA:89,0 +DA:92,0 +DA:95,0 +BRDA:95,5,0,- +DA:96,0 +DA:104,0 +FN:115,SwapperV2.refundExcessNative +FNDA:2253,SwapperV2.refundExcessNative +DA:116,2253 +DA:118,2134 +DA:120,2134 +BRDA:120,6,0,5 +DA:121,5 +FN:137,SwapperV2._depositAndSwap +FNDA:79,SwapperV2._depositAndSwap +DA:143,79 +DA:145,79 +BRDA:145,7,0,16 +DA:146,16 +DA:149,63 +DA:150,63 +DA:152,63 +BRDA:152,8,0,18 +DA:153,18 +DA:156,63 +DA:158,63 +DA:159,63 +DA:166,63 +DA:169,63 +BRDA:169,9,0,- +DA:170,0 +DA:173,63 +FN:182,SwapperV2._depositAndSwap +FNDA:32,SwapperV2._depositAndSwap +DA:189,32 +DA:191,32 +BRDA:191,10,0,8 +DA:192,8 +DA:195,24 +DA:196,24 +DA:198,24 +BRDA:198,11,0,10 +DA:199,10 +DA:202,24 +DA:204,24 +DA:205,24 +DA:210,24 +DA:212,24 +DA:215,24 +BRDA:215,12,0,10 +DA:216,10 +DA:219,24 +BRDA:219,13,0,- +DA:220,0 +DA:223,24 +FN:233,SwapperV2._executeSwaps +FNDA:63,SwapperV2._executeSwaps +DA:239,18 +DA:240,18 +DA:241,36 +DA:244,36 +DA:250,0 +BRDA:250,14,0,- +DA:252,36 +DA:255,36 +FN:263,SwapperV2._executeSwaps +FNDA:24,SwapperV2._executeSwaps +DA:276,0 +DA:277,0 +DA:278,0 +DA:281,0 +DA:287,0 +BRDA:287,15,0,- +DA:289,0 +DA:292,0 +FN:300,SwapperV2._fetchBalances +FNDA:87,SwapperV2._fetchBalances +DA:303,87 +DA:304,87 +DA:305,87 +DA:306,87 +DA:307,105 +DA:308,105 +DA:310,105 +BRDA:310,16,0,31 +DA:311,31 +DA:315,105 +DA:319,87 +FNF:8 +FNH:8 +LF:82 +LH:62 +BRF:19 +BRH:11 +end_of_record +TN: +SF:src/Helpers/TransferrableOwnership.sol +FN:25,TransferrableOwnership. +FNDA:87,TransferrableOwnership. +DA:26,87 +FN:29,TransferrableOwnership.onlyOwner +FNDA:8,TransferrableOwnership.onlyOwner +DA:30,8 +BRDA:30,0,0,3 +FN:36,TransferrableOwnership.transferOwnership +FNDA:20,TransferrableOwnership.transferOwnership +DA:37,16 +BRDA:37,1,0,4 +DA:38,12 +BRDA:38,2,0,4 +DA:39,8 +DA:40,8 +FN:44,TransferrableOwnership.cancelOwnershipTransfer +FNDA:0,TransferrableOwnership.cancelOwnershipTransfer +DA:45,0 +DA:46,0 +BRDA:46,3,0,- +DA:47,0 +FN:51,TransferrableOwnership.confirmOwnershipTransfer +FNDA:8,TransferrableOwnership.confirmOwnershipTransfer +DA:52,8 +DA:53,8 +BRDA:53,4,0,4 +DA:54,4 +DA:55,4 +DA:56,4 +FNF:5 +FNH:4 +LF:14 +LH:11 +BRF:5 +BRH:4 +end_of_record +TN: +SF:src/Helpers/Validatable.sol +FN:12,Validatable.validateBridgeData +FNDA:2733,Validatable.validateBridgeData +DA:13,2733 +BRDA:13,0,0,22 +DA:14,22 +DA:16,2711 +BRDA:16,1,0,22 +DA:17,22 +DA:19,2689 +BRDA:19,2,0,22 +DA:20,22 +FN:25,Validatable.noNativeAsset +FNDA:3,Validatable.noNativeAsset +DA:26,3 +BRDA:26,3,0,- +DA:27,0 +FN:32,Validatable.onlyAllowSourceToken +FNDA:520,Validatable.onlyAllowSourceToken +DA:36,520 +BRDA:36,4,0,- +DA:37,0 +FN:42,Validatable.onlyAllowDestinationChain +FNDA:260,Validatable.onlyAllowDestinationChain +DA:46,260 +BRDA:46,5,0,- +DA:47,0 +FN:52,Validatable.containsSourceSwaps +FNDA:144,Validatable.containsSourceSwaps +DA:53,144 +BRDA:53,6,0,- +DA:54,0 +FN:59,Validatable.doesNotContainSourceSwaps +FNDA:4805,Validatable.doesNotContainSourceSwaps +DA:60,23 +BRDA:60,7,0,23 +DA:61,23 +FN:66,Validatable.doesNotContainDestinationCalls +FNDA:2415,Validatable.doesNotContainDestinationCalls +DA:69,10 +BRDA:69,8,0,10 +DA:70,10 +FNF:7 +FNH:7 +LF:18 +LH:14 +BRF:9 +BRH:5 +end_of_record +TN: +SF:src/LiFiDiamond.sol +FN:13,LiFiDiamond. +FNDA:0,LiFiDiamond. +DA:14,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:25,0 +FN:31,LiFiDiamond. +FNDA:10566,LiFiDiamond. +DA:32,10566 +DA:33,10566 +DA:38,10566 +DA:42,10566 +DA:44,10566 +BRDA:44,0,0,- +DA:45,0 +DA:52,10566 +DA:54,10566 +DA:56,10566 +DA:59,10566 +DA:60,310 +DA:62,10256 +DA:63,10256 +FNF:2 +FNH:1 +LF:19 +LH:12 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/LiFiDiamondImmutable.sol +FN:13,LiFiDiamondImmutable. +FNDA:0,LiFiDiamondImmutable. +DA:14,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:25,0 +FN:31,LiFiDiamondImmutable. +FNDA:0,LiFiDiamondImmutable. +DA:32,0 +DA:33,0 +DA:38,0 +DA:42,0 +DA:44,0 +BRDA:44,0,0,- +DA:45,0 +DA:52,0 +DA:54,0 +DA:56,0 +DA:59,0 +DA:60,0 +DA:62,0 +DA:63,0 +FNF:2 +FNH:0 +LF:19 +LH:0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/Libraries/LibAccess.sol +FN:25,LibAccess.accessStorage +FNDA:8,LibAccess.accessStorage +DA:30,8 +DA:33,8 +FN:40,LibAccess.addAccess +FNDA:2,LibAccess.addAccess +DA:41,2 +BRDA:41,0,0,- +DA:42,0 +DA:44,2 +DA:45,2 +DA:46,2 +FN:52,LibAccess.removeAccess +FNDA:1,LibAccess.removeAccess +DA:53,1 +DA:54,1 +DA:55,1 +FN:60,LibAccess.enforceAccessControl +FNDA:5,LibAccess.enforceAccessControl +DA:61,5 +DA:62,5 +DA:63,4 +BRDA:63,1,0,4 +FNF:4 +FNH:4 +LF:13 +LH:12 +BRF:2 +BRH:1 +end_of_record +TN: +SF:src/Libraries/LibAllowList.sol +FN:23,LibAllowList.addAllowedContract +FNDA:764,LibAllowList.addAllowedContract +DA:24,764 +DA:26,760 +DA:30,646 +DA:31,646 +FN:36,LibAllowList.contractIsAllowed +FNDA:262,LibAllowList.contractIsAllowed +DA:39,262 +FN:44,LibAllowList.removeAllowedContract +FNDA:6,LibAllowList.removeAllowedContract +DA:45,6 +DA:47,6 +BRDA:47,1,0,- +DA:48,0 +DA:51,6 +DA:53,6 +DA:55,6 +DA:56,7 +BRDA:56,2,0,6 +DA:58,6 +DA:60,6 +DA:61,6 +FN:67,LibAllowList.getAllowedContracts +FNDA:4,LibAllowList.getAllowedContracts +DA:68,4 +FN:73,LibAllowList.addAllowedSelector +FNDA:2251,LibAllowList.addAllowedSelector +DA:74,2251 +FN:79,LibAllowList.removeAllowedSelector +FNDA:0,LibAllowList.removeAllowedSelector +DA:80,0 +FN:85,LibAllowList.selectorIsAllowed +FNDA:164,LibAllowList.selectorIsAllowed +DA:86,164 +FN:90,LibAllowList._getStorage +FNDA:3447,LibAllowList._getStorage +DA:95,3447 +DA:98,3447 +FN:104,LibAllowList._checkAddress +FNDA:764,LibAllowList._checkAddress +DA:105,764 +BRDA:105,3,0,2 +DA:107,762 +BRDA:107,4,0,2 +FNF:9 +FNH:8 +LF:23 +LH:21 +BRF:4 +BRH:3 +end_of_record +TN: +SF:src/Libraries/LibAsset.sol +FN:26,LibAsset.getOwnBalance +FNDA:766,LibAsset.getOwnBalance +DA:27,766 +DA:28,766 +FN:37,LibAsset.transferNativeAsset +FNDA:22,LibAsset.transferNativeAsset +DA:41,22 +BRDA:41,0,0,- +DA:42,22 +DA:43,0 +BRDA:43,1,0,- +DA:45,22 +DA:46,22 +BRDA:46,2,0,4 +FN:54,LibAsset.maxApproveERC20 +FNDA:5319,LibAsset.maxApproveERC20 +DA:59,5319 +BRDA:59,3,0,5319 +DA:60,5319 +DA:62,5316 +BRDA:62,4,0,- +DA:63,0 +DA:66,5316 +BRDA:66,5,0,5311 +DA:67,5311 +DA:68,5311 +FN:77,LibAsset.transferERC20 +FNDA:47,LibAsset.transferERC20 +DA:82,47 +BRDA:82,6,0,- +DA:83,0 +DA:85,47 +BRDA:85,7,0,- +DA:86,0 +DA:89,47 +DA:90,47 +BRDA:90,8,0,- +DA:91,0 +DA:93,47 +FN:101,LibAsset.transferFromERC20 +FNDA:5279,LibAsset.transferFromERC20 +DA:107,5279 +BRDA:107,9,0,- +DA:108,0 +DA:110,5279 +BRDA:110,10,0,- +DA:111,0 +DA:114,5279 +DA:115,5279 +DA:116,5279 +DA:117,5277 +BRDA:117,11,0,- +DA:118,0 +FN:122,LibAsset.depositAsset +FNDA:4817,LibAsset.depositAsset +DA:123,4817 +BRDA:123,12,0,- +DA:124,4817 +BRDA:124,13,0,39 +BRDA:124,13,1,4757 +DA:125,39 +BRDA:125,14,0,3 +DA:127,4778 +DA:128,4778 +BRDA:128,15,0,21 +DA:129,4757 +FN:133,LibAsset.depositAssets +FNDA:87,LibAsset.depositAssets +DA:134,87 +DA:135,105 +DA:136,88 +BRDA:136,16,0,88 +DA:137,88 +DA:140,105 +FN:148,LibAsset.isNativeAsset +FNDA:21641,LibAsset.isNativeAsset +DA:149,21641 +FN:159,LibAsset.transferAsset +FNDA:69,LibAsset.transferAsset +DA:164,69 +FN:170,LibAsset.isContract +FNDA:136,LibAsset.isContract +DA:171,136 +DA:174,136 +DA:176,136 +FNF:10 +FNH:10 +LF:47 +LH:39 +BRF:18 +BRH:8 +end_of_record +TN: +SF:src/Libraries/LibBytes.sol +FN:17,LibBytes.slice +FNDA:39,LibBytes.slice +DA:22,39 +BRDA:22,0,0,- +DA:23,39 +BRDA:23,1,0,- +DA:25,39 +DA:29,39 +DA:32,39 +DA:42,39 +DA:48,39 +DA:52,39 +DA:64,1044 +DA:65,1005 +DA:66,1005 +DA:67,1005 +DA:68,1005 +DA:71,39 +DA:75,39 +DA:78,0 +DA:79,0 +DA:82,0 +DA:84,0 +DA:88,39 +FN:91,LibBytes.toAddress +FNDA:0,LibBytes.toAddress +DA:95,0 +BRDA:95,2,0,- +DA:96,0 +DA:98,0 +DA:101,0 +DA:107,0 +FN:112,LibBytes.toHexString +FNDA:12,LibBytes.toHexString +DA:116,12 +DA:117,12 +DA:118,12 +DA:119,12 +DA:120,480 +DA:121,480 +DA:123,12 +BRDA:123,3,0,- +BRDA:123,3,1,12 +DA:124,12 +FNF:3 +FNH:2 +LF:33 +LH:24 +BRF:5 +BRH:1 +end_of_record +TN: +SF:src/Libraries/LibDiamond.sol +FN:54,LibDiamond.diamondStorage +FNDA:4473,LibDiamond.diamondStorage +DA:59,4473 +DA:62,4473 +FN:71,LibDiamond.setContractOwner +FNDA:1,LibDiamond.setContractOwner +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +FN:78,LibDiamond.contractOwner +FNDA:24,LibDiamond.contractOwner +DA:79,24 +FN:82,LibDiamond.enforceIsContractOwner +FNDA:1605,LibDiamond.enforceIsContractOwner +DA:83,1605 +DA:84,6 +BRDA:84,0,0,6 +FN:94,LibDiamond.diamondCut +FNDA:1437,LibDiamond.diamondCut +DA:99,1437 +DA:100,2835 +DA:101,2835 +BRDA:101,1,0,2835 +BRDA:101,1,1,- +DA:102,2835 +DA:106,0 +BRDA:106,2,0,- +BRDA:106,2,1,- +DA:107,0 +DA:111,0 +BRDA:111,3,0,- +BRDA:111,3,1,- +DA:112,0 +DA:117,0 +DA:120,2835 +DA:123,1437 +DA:124,1437 +FN:127,LibDiamond.addFunctions +FNDA:2835,LibDiamond.addFunctions +DA:131,2835 +BRDA:131,4,0,- +DA:132,0 +DA:134,2835 +DA:135,2835 +BRDA:135,5,0,- +DA:136,0 +DA:138,2835 +DA:142,2835 +BRDA:142,6,0,2835 +DA:143,2835 +DA:146,2835 +DA:147,14221 +DA:150,11386 +DA:151,11386 +DA:154,11386 +BRDA:154,7,0,- +DA:155,0 +DA:157,11386 +DA:159,11386 +DA:160,11386 +FN:165,LibDiamond.replaceFunctions +FNDA:0,LibDiamond.replaceFunctions +DA:169,0 +BRDA:169,8,0,- +DA:170,0 +DA:172,0 +DA:173,0 +BRDA:173,9,0,- +DA:174,0 +DA:176,0 +DA:180,0 +BRDA:180,10,0,- +DA:181,0 +DA:184,0 +DA:185,0 +DA:188,0 +DA:189,0 +DA:192,0 +BRDA:192,11,0,- +DA:193,0 +DA:195,0 +DA:196,0 +DA:198,0 +DA:199,0 +FN:204,LibDiamond.removeFunctions +FNDA:0,LibDiamond.removeFunctions +DA:208,0 +BRDA:208,12,0,- +DA:209,0 +DA:211,0 +DA:213,0 +BRDA:213,13,0,- +DA:214,0 +DA:217,0 +DA:218,0 +DA:221,0 +DA:222,0 +DA:225,0 +DA:227,0 +FN:232,LibDiamond.addFacet +FNDA:2835,LibDiamond.addFacet +DA:236,2835 +DA:237,2835 +DA:240,2835 +FN:243,LibDiamond.addFunction +FNDA:11386,LibDiamond.addFunction +DA:249,11386 +DA:252,11386 +DA:255,11386 +FN:258,LibDiamond.removeFunction +FNDA:0,LibDiamond.removeFunction +DA:263,0 +BRDA:263,14,0,- +DA:264,0 +DA:267,0 +BRDA:267,15,0,- +DA:268,0 +DA:271,0 +DA:274,0 +DA:279,0 +BRDA:279,16,0,- +DA:280,0 +DA:283,0 +DA:286,0 +DA:291,0 +DA:292,0 +DA:295,0 +BRDA:295,17,0,- +DA:297,0 +DA:298,0 +DA:301,0 +BRDA:301,18,0,- +DA:302,0 +DA:305,0 +DA:306,0 +DA:310,0 +DA:311,0 +FN:317,LibDiamond.initializeDiamondCut +FNDA:1437,LibDiamond.initializeDiamondCut +DA:321,1437 +BRDA:321,19,0,1429 +BRDA:321,19,1,- +DA:322,1429 +BRDA:322,20,0,- +DA:323,0 +DA:326,8 +BRDA:326,21,0,- +DA:327,0 +DA:329,8 +BRDA:329,22,0,8 +DA:330,8 +DA:333,8 +DA:334,8 +BRDA:334,23,0,- +DA:335,0 +BRDA:335,24,0,- +BRDA:335,24,1,- +DA:337,0 +DA:339,0 +FN:345,LibDiamond.enforceHasContractCode +FNDA:2843,LibDiamond.enforceHasContractCode +DA:346,2843 +DA:349,2843 +DA:351,2843 +BRDA:351,25,0,- +DA:352,0 +FNF:13 +FNH:10 +LF:110 +LH:46 +BRF:31 +BRH:5 +end_of_record +TN: +SF:src/Libraries/LibSwap.sol +FN:31,LibSwap.swap +FNDA:133,LibSwap.swap +DA:32,133 +BRDA:32,0,0,- +DA:33,133 +DA:34,133 +BRDA:34,1,0,- +DA:35,133 +DA:38,133 +DA:41,133 +DA:45,133 +BRDA:45,2,0,111 +DA:46,111 +DA:53,133 +BRDA:53,3,0,3 +DA:54,3 +DA:61,130 +DA:64,130 +BRDA:64,4,0,1 +DA:65,1 +DA:68,129 +DA:70,129 +FNF:1 +FNH:1 +LF:15 +LH:15 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/Libraries/LibUtil.sol +FN:10,LibUtil.getRevertMsg +FNDA:0,LibUtil.getRevertMsg +DA:14,0 +DA:15,0 +DA:16,0 +FN:22,LibUtil.isZeroAddress +FNDA:20622,LibUtil.isZeroAddress +DA:23,20622 +FN:26,LibUtil.revertWith +FNDA:9,LibUtil.revertWith +DA:28,9 +DA:29,9 +DA:30,9 +FNF:3 +FNH:2 +LF:7 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Libraries/OFTComposeMsgCodec.sol +FN:22,OFTComposeMsgCodec.encode +FNDA:3,OFTComposeMsgCodec.encode +DA:28,3 +FN:36,OFTComposeMsgCodec.nonce +FNDA:0,OFTComposeMsgCodec.nonce +DA:37,0 +FN:45,OFTComposeMsgCodec.srcEid +FNDA:0,OFTComposeMsgCodec.srcEid +DA:46,0 +FN:54,OFTComposeMsgCodec.amountLD +FNDA:2,OFTComposeMsgCodec.amountLD +DA:55,2 +FN:63,OFTComposeMsgCodec.composeFrom +FNDA:0,OFTComposeMsgCodec.composeFrom +DA:64,0 +FN:72,OFTComposeMsgCodec.composeMsg +FNDA:2,OFTComposeMsgCodec.composeMsg +DA:75,2 +FN:83,OFTComposeMsgCodec.addressToBytes32 +FNDA:35,OFTComposeMsgCodec.addressToBytes32 +DA:84,35 +FN:92,OFTComposeMsgCodec.bytes32ToAddress +FNDA:0,OFTComposeMsgCodec.bytes32ToAddress +DA:93,0 +FNF:8 +FNH:4 +LF:8 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Periphery/ERC20Proxy.sol +FN:22,ERC20Proxy. +FNDA:0,ERC20Proxy. +DA:23,0 +FN:29,ERC20Proxy.setAuthorizedCaller +FNDA:6,ERC20Proxy.setAuthorizedCaller +DA:33,6 +DA:34,6 +FN:42,ERC20Proxy.transferFrom +FNDA:2,ERC20Proxy.transferFrom +DA:48,2 +BRDA:48,0,0,- +DA:50,2 +FNF:3 +FNH:2 +LF:5 +LH:4 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/Periphery/Executor.sol +FN:30,Executor.noLeftovers +FNDA:13,Executor.noLeftovers +DA:34,13 +DA:35,13 +BRDA:35,0,0,3 +BRDA:35,0,1,9 +DA:36,3 +DA:37,3 +DA:38,3 +DA:42,3 +DA:43,15 +DA:45,15 +BRDA:45,1,0,9 +DA:46,9 +DA:47,9 +BRDA:47,2,0,9 +DA:48,9 +DA:56,15 +FN:67,Executor. +FNDA:0,Executor. +DA:68,0 +DA:69,0 +FN:79,Executor.swapAndCompleteBridgeTokens +FNDA:11,Executor.swapAndCompleteBridgeTokens +DA:85,11 +FN:101,Executor.swapAndExecute +FNDA:2,Executor.swapAndExecute +DA:108,2 +FN:127,Executor._processSwaps +FNDA:13,Executor._processSwaps +DA:135,13 +DA:136,13 +DA:137,13 +DA:139,13 +BRDA:139,3,0,10 +BRDA:139,3,1,3 +DA:140,10 +DA:142,3 +DA:147,13 +BRDA:147,4,0,11 +BRDA:147,4,1,2 +DA:148,11 +DA:149,9 +BRDA:149,5,0,9 +BRDA:149,5,1,2 +DA:150,9 +DA:154,9 +DA:156,2 +DA:164,2 +DA:169,13 +DA:171,9 +DA:172,9 +BRDA:172,6,0,4 +DA:173,4 +DA:180,9 +DA:184,9 +BRDA:184,7,0,5 +DA:185,5 +DA:192,9 +FN:205,Executor._executeSwaps +FNDA:13,Executor._executeSwaps +DA:210,3 +DA:211,3 +DA:212,18 +BRDA:212,8,0,- +DA:213,0 +DA:216,18 +DA:217,18 +DA:219,18 +FN:227,Executor._fetchBalances +FNDA:3,Executor._fetchBalances +DA:230,3 +DA:231,3 +DA:232,3 +DA:233,3 +DA:234,18 +DA:235,18 +DA:237,18 +BRDA:237,9,0,9 +DA:238,9 +DA:242,18 +DA:246,3 +FNF:7 +FNH:6 +LF:54 +LH:51 +BRF:14 +BRH:13 +end_of_record +TN: +SF:src/Periphery/FeeCollector.sol +FN:44,FeeCollector. +FNDA:26,FeeCollector. +FN:53,FeeCollector.collectTokenFees +FNDA:11,FeeCollector.collectTokenFees +DA:59,11 +DA:60,11 +DA:61,11 +DA:62,11 +FN:74,FeeCollector.collectNativeFees +FNDA:6,FeeCollector.collectNativeFees +DA:79,6 +DA:80,0 +BRDA:80,0,0,- +DA:81,6 +DA:82,6 +DA:83,6 +DA:85,6 +BRDA:85,1,0,1 +DA:87,1 +DA:90,1 +BRDA:90,2,0,- +DA:91,0 +DA:94,6 +FN:104,FeeCollector.withdrawIntegratorFees +FNDA:2,FeeCollector.withdrawIntegratorFees +DA:105,2 +DA:106,2 +BRDA:106,3,0,1 +DA:107,1 +DA:109,1 +DA:110,1 +DA:111,1 +FN:116,FeeCollector.batchWithdrawIntegratorFees +FNDA:1,FeeCollector.batchWithdrawIntegratorFees +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,2 +DA:123,2 +BRDA:123,4,0,2 +DA:124,2 +DA:125,2 +DA:130,2 +DA:133,2 +FN:140,FeeCollector.withdrawLifiFees +FNDA:2,FeeCollector.withdrawLifiFees +DA:141,1 +DA:142,1 +BRDA:142,5,0,- +DA:143,0 +DA:145,1 +DA:146,1 +DA:147,1 +FN:152,FeeCollector.batchWithdrawLifiFees +FNDA:2,FeeCollector.batchWithdrawLifiFees +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,2 +DA:159,2 +DA:160,2 +DA:165,2 +DA:167,2 +FN:175,FeeCollector.getTokenBalance +FNDA:8,FeeCollector.getTokenBalance +DA:179,8 +FN:184,FeeCollector.getLifiTokenBalance +FNDA:8,FeeCollector.getLifiTokenBalance +DA:187,8 +FNF:9 +FNH:9 +LF:45 +LH:42 +BRF:6 +BRH:3 +end_of_record +TN: +SF:src/Periphery/GasRebateDistributor.sol +FN:39,GasRebateDistributor. +FNDA:13,GasRebateDistributor. +DA:45,13 +DA:46,13 +DA:47,13 +DA:48,13 +FN:56,GasRebateDistributor.claim +FNDA:10,GasRebateDistributor.claim +DA:61,9 +DA:62,1 +BRDA:62,0,0,1 +DA:65,8 +BRDA:65,1,0,1 +DA:68,7 +DA:69,7 +DA:70,3 +BRDA:70,2,0,3 +DA:73,4 +DA:76,4 +DA:78,4 +FN:85,GasRebateDistributor.withdrawUnclaimed +FNDA:3,GasRebateDistributor.withdrawUnclaimed +DA:89,1 +DA:91,1 +DA:96,1 +DA:100,1 +FN:109,GasRebateDistributor.updateMerkleRoot +FNDA:3,GasRebateDistributor.updateMerkleRoot +DA:115,2 +DA:118,2 +DA:121,2 +DA:124,2 +FN:128,GasRebateDistributor.pauseContract +FNDA:3,GasRebateDistributor.pauseContract +DA:129,3 +FN:133,GasRebateDistributor.unpauseContract +FNDA:1,GasRebateDistributor.unpauseContract +DA:134,1 +FNF:6 +FNH:6 +LF:23 +LH:23 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/Periphery/LiFiDEXAggregator.sol +FN:50,LiFiDEXAggregator.lock +FNDA:0,LiFiDEXAggregator.lock +DA:51,0 +BRDA:51,0,0,- +BRDA:51,0,1,- +DA:52,0 +BRDA:52,1,0,- +BRDA:52,1,1,- +DA:53,0 +DA:55,0 +FN:58,LiFiDEXAggregator.onlyOwnerOrPriviledgedUser +FNDA:0,LiFiDEXAggregator.onlyOwnerOrPriviledgedUser +DA:59,0 +BRDA:59,2,0,- +BRDA:59,2,1,- +FN:66,LiFiDEXAggregator. +FNDA:0,LiFiDEXAggregator. +DA:67,0 +DA:68,0 +DA:70,0 +DA:71,0 +FN:75,LiFiDEXAggregator.setPriviledge +FNDA:0,LiFiDEXAggregator.setPriviledge +DA:76,0 +FN:79,LiFiDEXAggregator.pause +FNDA:0,LiFiDEXAggregator.pause +DA:80,0 +FN:83,LiFiDEXAggregator.resume +FNDA:0,LiFiDEXAggregator.resume +DA:84,0 +FN:96,LiFiDEXAggregator.processRoute +FNDA:0,LiFiDEXAggregator.processRoute +DA:104,0 +DA:105,0 +FN:123,LiFiDEXAggregator.transferValueAndprocessRoute +FNDA:0,LiFiDEXAggregator.transferValueAndprocessRoute +DA:133,0 +DA:136,0 +BRDA:136,3,0,- +DA:138,0 +DA:141,0 +DA:142,0 +FN:158,LiFiDEXAggregator.processRouteInternal +FNDA:0,LiFiDEXAggregator.processRouteInternal +DA:166,0 +DA:169,0 +DA:173,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +BRDA:179,4,0,- +BRDA:179,4,1,- +DA:180,0 +DA:181,0 +BRDA:181,5,0,- +DA:182,0 +DA:183,0 +BRDA:183,6,0,- +BRDA:182,6,1,- +DA:184,0 +BRDA:184,7,0,- +BRDA:184,7,1,- +DA:185,0 +DA:186,0 +BRDA:186,8,0,- +DA:187,0 +BRDA:187,9,0,- +BRDA:187,9,1,- +DA:188,0 +BRDA:188,10,0,- +BRDA:188,10,1,- +DA:189,0 +BRDA:189,11,0,- +BRDA:189,11,1,- +DA:190,0 +DA:191,0 +DA:195,0 +DA:198,0 +BRDA:198,12,0,- +BRDA:198,12,1,- +DA:203,0 +DA:206,0 +DA:207,0 +BRDA:207,13,0,- +DA:211,0 +DA:213,0 +FN:227,LiFiDEXAggregator.applyPermit +FNDA:0,LiFiDEXAggregator.applyPermit +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +FN:246,LiFiDEXAggregator.processNative +FNDA:0,LiFiDEXAggregator.processNative +DA:249,0 +DA:250,0 +FN:256,LiFiDEXAggregator.processMyERC20 +FNDA:0,LiFiDEXAggregator.processMyERC20 +DA:259,0 +DA:260,0 +DA:262,0 +BRDA:262,14,0,- +DA:264,0 +FN:271,LiFiDEXAggregator.processUserERC20 +FNDA:0,LiFiDEXAggregator.processUserERC20 +DA:272,0 +DA:273,0 +FN:280,LiFiDEXAggregator.processOnePool +FNDA:0,LiFiDEXAggregator.processOnePool +DA:281,0 +DA:282,0 +FN:288,LiFiDEXAggregator.processInsideBento +FNDA:0,LiFiDEXAggregator.processInsideBento +DA:289,0 +DA:290,0 +DA:292,0 +BRDA:292,15,0,- +DA:294,0 +FN:302,LiFiDEXAggregator.distributeAndSwap +FNDA:0,LiFiDEXAggregator.distributeAndSwap +DA:308,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:314,0 +DA:315,0 +FN:325,LiFiDEXAggregator.swap +FNDA:0,LiFiDEXAggregator.swap +DA:331,0 +DA:332,0 +BRDA:332,16,0,- +BRDA:332,16,1,- +DA:333,0 +BRDA:333,17,0,- +BRDA:333,17,1,- +DA:334,0 +BRDA:334,18,0,- +BRDA:334,18,1,- +DA:335,0 +BRDA:335,19,0,- +BRDA:335,19,1,- +DA:336,0 +BRDA:336,20,0,- +BRDA:336,20,1,- +DA:337,0 +BRDA:337,21,0,- +BRDA:337,21,1,- +DA:338,0 +FN:346,LiFiDEXAggregator.wrapNative +FNDA:0,LiFiDEXAggregator.wrapNative +DA:352,0 +DA:353,0 +DA:355,0 +BRDA:355,22,0,- +BRDA:355,22,1,- +DA:357,0 +DA:358,0 +DA:359,0 +BRDA:359,23,0,- +DA:360,0 +DA:361,0 +BRDA:361,24,0,- +DA:364,0 +BRDA:364,25,0,- +DA:365,0 +DA:366,0 +BRDA:366,26,0,- +DA:371,0 +DA:373,0 +DA:374,0 +BRDA:374,27,0,- +BRDA:374,27,1,- +FN:386,LiFiDEXAggregator.bentoBridge +FNDA:0,LiFiDEXAggregator.bentoBridge +DA:392,0 +DA:393,0 +DA:395,0 +BRDA:395,28,0,- +BRDA:395,28,1,- +DA:398,0 +DA:399,0 +BRDA:399,29,0,- +BRDA:398,29,1,- +DA:400,0 +DA:401,0 +BRDA:401,30,0,- +BRDA:400,30,1,- +DA:408,0 +DA:413,0 +DA:416,0 +BRDA:416,31,0,- +BRDA:416,31,1,- +DA:417,0 +DA:418,0 +DA:419,0 +FN:428,LiFiDEXAggregator.swapUniV2 +FNDA:0,LiFiDEXAggregator.swapUniV2 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:439,0 +DA:440,0 +BRDA:440,32,0,- +BRDA:439,32,1,- +DA:441,0 +DA:442,0 +BRDA:442,33,0,- +DA:444,0 +DA:445,0 +BRDA:445,34,0,- +BRDA:445,34,1,- +DA:446,0 +DA:449,0 +DA:451,0 +DA:452,0 +DA:454,0 +DA:457,0 +FN:465,LiFiDEXAggregator.swapTrident +FNDA:0,LiFiDEXAggregator.swapTrident +DA:471,0 +DA:472,0 +DA:474,0 +BRDA:474,35,0,- +DA:475,0 +DA:478,0 +FN:486,LiFiDEXAggregator.swapUniV3 +FNDA:0,LiFiDEXAggregator.swapUniV3 +DA:492,0 +DA:493,0 +DA:494,0 +DA:496,0 +DA:497,0 +BRDA:497,36,0,- +DA:503,0 +DA:504,0 +DA:511,0 +BRDA:511,37,0,- +BRDA:511,37,1,- +FN:526,LiFiDEXAggregator.uniswapV3SwapCallback +FNDA:0,LiFiDEXAggregator.uniswapV3SwapCallback +DA:531,0 +BRDA:531,38,0,- +BRDA:531,38,1,- +DA:535,0 +DA:536,0 +BRDA:536,39,0,- +BRDA:536,39,1,- +DA:541,0 +DA:542,0 +DA:543,0 +FN:555,LiFiDEXAggregator.algebraSwapCallback +FNDA:0,LiFiDEXAggregator.algebraSwapCallback +DA:560,0 +FN:570,LiFiDEXAggregator.pancakeV3SwapCallback +FNDA:0,LiFiDEXAggregator.pancakeV3SwapCallback +DA:575,0 +FN:583,LiFiDEXAggregator.swapCurve +FNDA:0,LiFiDEXAggregator.swapCurve +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:596,0 +DA:597,0 +BRDA:597,40,0,- +BRDA:597,40,1,- +DA:598,0 +DA:605,0 +DA:606,0 +BRDA:606,41,0,- +DA:611,0 +DA:612,0 +DA:613,0 +BRDA:613,42,0,- +BRDA:612,42,1,- +DA:620,0 +DA:623,0 +DA:624,0 +DA:627,0 +DA:631,0 +BRDA:631,43,0,- +DA:632,0 +BRDA:632,44,0,- +BRDA:632,44,1,- +DA:633,0 +DA:634,0 +BRDA:634,45,0,- +BRDA:634,45,1,- +DA:639,0 +FN:982,InputStream.createStream +FNDA:0,InputStream.createStream +DA:986,0 +DA:987,0 +DA:988,0 +DA:989,0 +DA:990,0 +FN:997,InputStream.isNotEmpty +FNDA:0,InputStream.isNotEmpty +DA:998,0 +DA:999,0 +DA:1001,0 +DA:1002,0 +DA:1004,0 +FN:1010,InputStream.readUint8 +FNDA:0,InputStream.readUint8 +DA:1012,0 +DA:1013,0 +DA:1014,0 +DA:1015,0 +FN:1022,InputStream.readUint16 +FNDA:0,InputStream.readUint16 +DA:1024,0 +DA:1025,0 +DA:1026,0 +DA:1027,0 +FN:1034,InputStream.readUint24 +FNDA:0,InputStream.readUint24 +DA:1036,0 +DA:1037,0 +DA:1038,0 +DA:1039,0 +FN:1046,InputStream.readUint32 +FNDA:0,InputStream.readUint32 +DA:1048,0 +DA:1049,0 +DA:1050,0 +DA:1051,0 +FN:1058,InputStream.readUint +FNDA:0,InputStream.readUint +DA:1060,0 +DA:1061,0 +DA:1062,0 +DA:1063,0 +FN:1070,InputStream.readBytes32 +FNDA:0,InputStream.readBytes32 +DA:1072,0 +DA:1073,0 +DA:1074,0 +DA:1075,0 +FN:1082,InputStream.readAddress +FNDA:0,InputStream.readAddress +DA:1084,0 +DA:1085,0 +DA:1086,0 +DA:1087,0 +FN:1094,InputStream.readBytes +FNDA:0,InputStream.readBytes +DA:1098,0 +DA:1099,0 +DA:1100,0 +DA:1101,0 +FN:1113,Approve.approveStable +FNDA:0,Approve.approveStable +DA:1118,0 +DA:1121,0 +FN:1132,Approve.approveSafe +FNDA:0,Approve.approveSafe +DA:1137,0 +DA:1138,0 +FN:1158,RebaseLibrary.toBase +FNDA:0,RebaseLibrary.toBase +DA:1162,0 +BRDA:1162,0,0,- +BRDA:1162,0,1,- +DA:1163,0 +DA:1165,0 +FN:1170,RebaseLibrary.toElastic +FNDA:0,RebaseLibrary.toElastic +DA:1174,0 +BRDA:1174,1,0,- +BRDA:1174,1,1,- +DA:1175,0 +DA:1177,0 +FNF:40 +FNH:0 +LF:219 +LH:0 +BRF:81 +BRH:0 +end_of_record +TN: +SF:src/Periphery/LiFuelFeeCollector.sol +FN:33,LiFuelFeeCollector. +FNDA:20,LiFuelFeeCollector. +FN:42,LiFuelFeeCollector.collectTokenGasFees +FNDA:262,LiFuelFeeCollector.collectTokenGasFees +DA:48,262 +DA:49,262 +FN:55,LiFuelFeeCollector.collectNativeGasFees +FNDA:4,LiFuelFeeCollector.collectNativeGasFees +DA:60,4 +DA:66,4 +DA:67,4 +BRDA:67,0,0,- +DA:68,0 +DA:69,0 +BRDA:69,1,0,- +DA:70,0 +FN:77,LiFuelFeeCollector.withdrawFees +FNDA:2,LiFuelFeeCollector.withdrawFees +DA:78,1 +DA:79,1 +DA:80,1 +FN:85,LiFuelFeeCollector.batchWithdrawFees +FNDA:1,LiFuelFeeCollector.batchWithdrawFees +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,2 +DA:92,2 +DA:97,2 +DA:99,2 +FNF:5 +FNH:5 +LF:18 +LH:15 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/Periphery/Receiver.sol +FN:33,Receiver.onlySGRouter +FNDA:2,Receiver.onlySGRouter +DA:34,2 +BRDA:34,0,0,- +DA:35,0 +FN:39,Receiver.onlyAmarokRouter +FNDA:2,Receiver.onlyAmarokRouter +DA:40,2 +BRDA:40,1,0,- +DA:41,0 +FN:47,Receiver. +FNDA:0,Receiver. +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +FN:74,Receiver.xReceive +FNDA:2,Receiver.xReceive +DA:82,2 +DA:87,2 +FN:105,Receiver.sgReceive +FNDA:2,Receiver.sgReceive +DA:113,2 +DA:118,2 +DA:123,2 +FN:138,Receiver.swapAndCompleteBridgeTokens +FNDA:0,Receiver.swapAndCompleteBridgeTokens +DA:144,0 +BRDA:144,2,0,- +BRDA:144,2,1,- +DA:145,0 +DA:154,0 +DA:158,0 +DA:159,0 +FN:174,Receiver.pullToken +FNDA:2,Receiver.pullToken +DA:179,1 +BRDA:179,3,0,- +BRDA:179,3,1,- +DA:181,0 +DA:182,0 +BRDA:182,4,0,- +DA:184,1 +FN:197,Receiver._swapAndCompleteBridgeTokens +FNDA:4,Receiver._swapAndCompleteBridgeTokens +DA:205,4 +DA:207,4 +BRDA:207,5,0,- +BRDA:207,5,1,2 +DA:209,0 +DA:210,0 +BRDA:210,6,0,- +DA:213,0 +DA:214,0 +BRDA:214,7,0,- +DA:216,0 +DA:223,0 +DA:229,0 +DA:233,0 +DA:235,0 +DA:236,0 +BRDA:236,8,0,- +DA:238,0 +DA:248,4 +DA:249,4 +DA:250,4 +DA:252,4 +BRDA:252,9,0,1 +DA:254,1 +DA:256,1 +DA:263,1 +DA:267,3 +DA:269,3 +DA:272,0 +DA:273,1 +DA:274,1 +DA:283,3 +FNF:8 +FNH:6 +LF:52 +LH:23 +BRF:13 +BRH:2 +end_of_record +TN: +SF:src/Periphery/ReceiverStargateV2.sol +FN:52,ReceiverStargateV2.onlyEndpointV2 +FNDA:5,ReceiverStargateV2.onlyEndpointV2 +DA:53,5 +BRDA:53,0,0,3 +DA:54,3 +FN:60,ReceiverStargateV2. +FNDA:8,ReceiverStargateV2. +DA:67,5 +DA:68,3 +DA:69,3 +DA:70,2 +DA:71,4 +FN:83,ReceiverStargateV2.lzCompose +FNDA:5,ReceiverStargateV2.lzCompose +DA:92,2 +BRDA:92,1,0,- +DA:95,2 +DA:98,2 +DA:102,2 +DA:108,2 +FN:121,ReceiverStargateV2.pullToken +FNDA:4,ReceiverStargateV2.pullToken +DA:126,3 +BRDA:126,2,0,2 +BRDA:126,2,1,1 +DA:128,2 +DA:129,2 +BRDA:129,3,0,1 +DA:131,1 +FN:143,ReceiverStargateV2._swapAndCompleteBridgeTokens +FNDA:2,ReceiverStargateV2._swapAndCompleteBridgeTokens +DA:150,2 +DA:152,2 +BRDA:152,4,0,1 +BRDA:152,4,1,1 +DA:154,1 +BRDA:154,5,0,- +DA:157,0 +DA:158,0 +BRDA:158,6,0,- +DA:160,0 +DA:167,0 +DA:173,1 +DA:177,0 +DA:179,1 +DA:180,1 +BRDA:180,7,0,- +DA:182,1 +DA:192,1 +DA:193,1 +DA:195,1 +BRDA:195,8,0,- +DA:197,0 +DA:199,0 +DA:206,0 +DA:210,1 +DA:212,1 +DA:215,0 +DA:216,0 +DA:217,0 +DA:226,1 +FNF:5 +FNH:5 +LF:40 +LH:29 +BRF:11 +BRH:6 +end_of_record +TN: +SF:src/Periphery/RelayerCelerIM.sol +FN:40,RelayerCelerIM.onlyCBridgeMessageBus +FNDA:2,RelayerCelerIM.onlyCBridgeMessageBus +DA:41,2 +BRDA:41,0,0,1 +FN:44,RelayerCelerIM.onlyDiamond +FNDA:268,RelayerCelerIM.onlyDiamond +DA:45,268 +BRDA:45,1,0,- +FN:51,RelayerCelerIM. +FNDA:0,RelayerCelerIM. +DA:56,0 +DA:57,0 +DA:58,0 +FN:73,RelayerCelerIM.executeMessageWithTransfer +FNDA:3,RelayerCelerIM.executeMessageWithTransfer +DA:87,2 +DA:92,2 +DA:97,2 +DA:106,2 +FN:117,RelayerCelerIM.executeMessageWithTransferRefund +FNDA:2,RelayerCelerIM.executeMessageWithTransferRefund +DA:128,1 +DA:134,1 +DA:136,1 +DA:144,1 +FN:153,RelayerCelerIM.sendTokenTransfer +FNDA:268,RelayerCelerIM.sendTokenTransfer +DA:164,268 +BRDA:164,2,0,263 +BRDA:164,2,1,- +DA:165,263 +DA:166,263 +BRDA:166,3,0,4 +BRDA:166,3,1,259 +DA:168,4 +DA:179,259 +DA:185,259 +DA:194,263 +DA:202,5 +DA:203,1 +BRDA:203,4,0,1 +BRDA:201,4,1,- +DA:204,1 +DA:205,1 +DA:210,1 +DA:217,1 +DA:225,4 +DA:226,1 +BRDA:226,5,0,1 +BRDA:224,5,1,- +DA:227,1 +DA:228,1 +DA:233,1 +DA:239,1 +DA:246,3 +DA:247,2 +BRDA:247,6,0,2 +BRDA:245,6,1,- +DA:248,2 +DA:249,2 +BRDA:249,7,0,1 +BRDA:249,7,1,1 +DA:251,1 +DA:260,1 +DA:265,1 +DA:274,1 +DA:275,1 +BRDA:275,8,0,1 +BRDA:273,8,1,- +DA:276,1 +DA:277,1 +DA:282,1 +DA:290,0 +DA:292,0 +BRDA:292,9,0,- +BRDA:289,9,1,- +DA:293,0 +DA:294,0 +DA:299,0 +DA:307,0 +FN:320,RelayerCelerIM.forwardSendMessageWithTransfer +FNDA:2,RelayerCelerIM.forwardSendMessageWithTransfer +DA:327,2 +FN:346,RelayerCelerIM._swapAndCompleteBridgeTokens +FNDA:2,RelayerCelerIM._swapAndCompleteBridgeTokens +DA:354,2 +DA:355,2 +DA:360,2 +BRDA:360,10,0,- +BRDA:360,10,1,1 +DA:362,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:372,0 +DA:373,0 +BRDA:373,11,0,- +DA:374,0 +DA:378,2 +DA:379,2 +DA:380,2 +DA:383,2 +DA:389,1 +DA:390,1 +DA:391,1 +DA:392,1 +DA:394,2 +DA:397,2 +BRDA:397,12,0,1 +DA:398,1 +FN:412,RelayerCelerIM.withdraw +FNDA:0,RelayerCelerIM.withdraw +DA:417,0 +BRDA:417,13,0,- +BRDA:417,13,1,- +DA:419,0 +DA:420,0 +BRDA:420,14,0,- +DA:421,0 +DA:424,0 +DA:426,0 +FN:435,RelayerCelerIM.triggerRefund +FNDA:1,RelayerCelerIM.triggerRefund +DA:442,1 +DA:446,1 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +BRDA:451,15,0,- +DA:452,0 +DA:457,1 +DA:460,1 +BRDA:460,16,0,1 +BRDA:460,16,1,- +DA:461,1 +DA:462,1 +DA:463,1 +DA:465,0 +FNF:10 +FNH:8 +LF:92 +LH:63 +BRF:28 +BRH:13 +end_of_record +TN: +SF:src/Periphery/ServiceFeeCollector.sol +FN:39,ServiceFeeCollector. +FNDA:20,ServiceFeeCollector. +FN:47,ServiceFeeCollector.collectTokenInsuranceFees +FNDA:4,ServiceFeeCollector.collectTokenInsuranceFees +DA:52,4 +DA:53,4 +FN:58,ServiceFeeCollector.collectNativeInsuranceFees +FNDA:2,ServiceFeeCollector.collectNativeInsuranceFees +DA:59,2 +FN:68,ServiceFeeCollector.withdrawFees +FNDA:2,ServiceFeeCollector.withdrawFees +DA:69,1 +DA:70,1 +DA:71,1 +FN:76,ServiceFeeCollector.batchWithdrawFees +FNDA:1,ServiceFeeCollector.batchWithdrawFees +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,2 +DA:83,2 +DA:88,2 +DA:90,2 +FNF:5 +FNH:5 +LF:13 +LH:13 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/Periphery/TokenWrapper.sol +FN:27,TokenWrapper. +FNDA:0,TokenWrapper. +DA:28,0 +DA:29,0 +FN:35,TokenWrapper.deposit +FNDA:1,TokenWrapper.deposit +DA:36,1 +DA:37,1 +FN:41,TokenWrapper.withdraw +FNDA:1,TokenWrapper.withdraw +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +BRDA:50,0,0,- +DA:51,0 +FNF:3 +FNH:2 +LF:10 +LH:7 +BRF:1 +BRH:0 +end_of_record +TN: diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index ffd629f5a..cfa0569fb 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -173,7 +173,9 @@ contract CalldataVerificationFacet { functionSelector == StandardizedCallFacet.standardizedCall.selector ) { // extract nested function selector and calldata - (functionSelector, callData) = getNestedData(data); + // will always start at position 68 + functionSelector = bytes4(data[68:72]); + callData = data[68:]; } if (_isGenericV3SingleSwap(functionSelector)) { @@ -421,17 +423,4 @@ contract CalldataVerificationFacet { functionSelector == GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector; } - - function getNestedData( - bytes calldata standardizedCallData - ) public pure returns (bytes4 functionSelector, bytes memory callData) { - functionSelector = bytes4(standardizedCallData[68:72]); - callData = standardizedCallData[68:]; - } - - function _getStandardizedCallNestedCallData( - bytes calldata standardizedCallData - ) public pure returns (bytes memory) { - return standardizedCallData[68:]; - } } diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 712356a1c..242cef4aa 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -52,6 +52,10 @@ contract CalldataVerificationFacetTest is TestBase { ); } + function test_DeploysWithoutErrors() public { + calldataVerificationFacet = new CalldataVerificationFacet(); + } + function test_IgnoresExtraBytes() public view { bytes memory callData = abi.encodeWithSelector( HyphenFacet.swapAndStartBridgeTokensViaHyphen.selector, @@ -818,72 +822,18 @@ contract CalldataVerificationFacetTest is TestBase { }); bytes memory callData = abi.encodeWithSelector( - CelerIMFacetBase.startBridgeTokensViaCelerIM.selector, + GenericSwapFacet.swapTokensGeneric.selector, // wrong selector, does not support destination calls bridgeData, cimData ); - bytes memory callDataWithSwap = abi.encodeWithSelector( - CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM.selector, - bridgeData, - swapData, - cimData - ); - 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, - callData - ); - - 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); + assertFalse(validCall); } function checkBridgeData(ILiFi.BridgeData memory data) internal { From 96fa80da91e7696fe799f9a440559e6b2594985b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 16 Aug 2024 18:00:50 +0700 Subject: [PATCH 03/16] remove lcov-filtered.info --- .gitignore | 1 + lcov-filtered.info | 4080 -------------------------------------------- 2 files changed, 1 insertion(+), 4080 deletions(-) delete mode 100644 lcov-filtered.info diff --git a/.gitignore b/.gitignore index b4121c5bc..78985120a 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ yarn-error.log .DS_Store* lcov.info +lcov-filtered.info test/logs diff --git a/lcov-filtered.info b/lcov-filtered.info deleted file mode 100644 index bc5576adb..000000000 --- a/lcov-filtered.info +++ /dev/null @@ -1,4080 +0,0 @@ -TN: -SF:src/Facets/AccessManagerFacet.sol -FN:24,AccessManagerFacet.setCanExecute -FNDA:3,AccessManagerFacet.setCanExecute -DA:29,3 -BRDA:29,0,0,- -DA:30,0 -DA:32,3 -DA:33,3 -DA:36,2 -BRDA:36,1,0,2 -BRDA:36,1,1,1 -DA:37,2 -DA:39,1 -FN:46,AccessManagerFacet.addressCanExecuteMethod -FNDA:0,AccessManagerFacet.addressCanExecuteMethod -DA:50,0 -FNF:2 -FNH:1 -LF:8 -LH:6 -BRF:3 -BRH:2 -end_of_record -TN: -SF:src/Facets/AcrossFacet.sol -FN:44,AcrossFacet. -FNDA:0,AcrossFacet. -DA:45,0 -DA:46,0 -FN:54,AcrossFacet.startBridgeTokensViaAcross -FNDA:265,AcrossFacet.startBridgeTokensViaAcross -DA:66,260 -DA:70,258 -FN:77,AcrossFacet.swapAndStartBridgeTokensViaAcross -FNDA:6,AcrossFacet.swapAndStartBridgeTokensViaAcross -DA:90,3 -DA:96,2 -FN:104,AcrossFacet._startBridge -FNDA:260,AcrossFacet._startBridge -DA:108,260 -BRDA:108,0,0,2 -BRDA:108,0,1,258 -DA:109,2 -DA:120,258 -DA:125,258 -DA:137,260 -FNF:4 -FNH:3 -LF:11 -LH:9 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/AcrossFacetPacked.sol -FN:47,AcrossFacetPacked. -FNDA:0,AcrossFacetPacked. -DA:52,0 -DA:53,0 -FN:61,AcrossFacetPacked.setApprovalForBridge -FNDA:19,AcrossFacetPacked.setApprovalForBridge -DA:64,19 -DA:66,38 -FN:76,AcrossFacetPacked.startBridgeTokensViaAcrossNativePacked -FNDA:2,AcrossFacetPacked.startBridgeTokensViaAcrossNativePacked -DA:78,2 -DA:81,2 -DA:92,2 -FN:103,AcrossFacetPacked.startBridgeTokensViaAcrossNativeMin -FNDA:2,AcrossFacetPacked.startBridgeTokensViaAcrossNativeMin -DA:113,2 -DA:124,2 -FN:129,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Packed -FNDA:4,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Packed -DA:130,4 -DA:131,4 -DA:134,4 -DA:141,4 -DA:144,4 -DA:155,4 -FN:168,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Min -FNDA:4,AcrossFacetPacked.startBridgeTokensViaAcrossERC20Min -DA:180,4 -DA:187,4 -DA:198,4 -FN:209,AcrossFacetPacked.encode_startBridgeTokensViaAcrossNativePacked -FNDA:20,AcrossFacetPacked.encode_startBridgeTokensViaAcrossNativePacked -DA:220,20 -BRDA:220,0,0,1 -BRDA:220,0,1,19 -DA:225,19 -DA:226,19 -FN:250,AcrossFacetPacked.encode_startBridgeTokensViaAcrossERC20Packed -FNDA:40,AcrossFacetPacked.encode_startBridgeTokensViaAcrossERC20Packed -DA:263,40 -BRDA:263,1,0,1 -BRDA:263,1,1,39 -DA:268,39 -BRDA:268,2,0,1 -BRDA:268,2,1,38 -DA:273,38 -DA:274,38 -FN:292,AcrossFacetPacked.decode_startBridgeTokensViaAcrossNativePacked -FNDA:1,AcrossFacetPacked.decode_startBridgeTokensViaAcrossNativePacked -DA:302,1 -BRDA:302,3,0,- -BRDA:302,3,1,1 -DA:308,1 -DA:311,1 -DA:312,1 -DA:313,1 -DA:316,1 -DA:317,1 -DA:318,1 -DA:319,1 -DA:321,1 -FN:326,AcrossFacetPacked.decode_startBridgeTokensViaAcrossERC20Packed -FNDA:1,AcrossFacetPacked.decode_startBridgeTokensViaAcrossERC20Packed -DA:336,1 -BRDA:336,4,0,- -BRDA:336,4,1,1 -DA:342,1 -DA:344,1 -DA:345,1 -DA:346,1 -DA:347,1 -DA:348,1 -DA:351,1 -DA:352,1 -DA:353,1 -DA:354,1 -DA:356,1 -FN:365,AcrossFacetPacked.executeCallAndWithdraw -FNDA:2,AcrossFacetPacked.executeCallAndWithdraw -DA:374,1 -DA:377,1 -BRDA:377,5,0,1 -BRDA:377,5,1,- -DA:379,1 -DA:380,1 -DA:383,0 -FNF:11 -FNH:10 -LF:52 -LH:49 -BRF:12 -BRH:9 -end_of_record -TN: -SF:src/Facets/AllBridgeFacet.sol -FN:40,AllBridgeFacet. -FNDA:0,AllBridgeFacet. -DA:41,0 -FN:46,AllBridgeFacet.startBridgeTokensViaAllBridge -FNDA:8,AllBridgeFacet.startBridgeTokensViaAllBridge -DA:58,3 -DA:62,2 -FN:69,AllBridgeFacet.swapAndStartBridgeTokensViaAllBridge -FNDA:6,AllBridgeFacet.swapAndStartBridgeTokensViaAllBridge -DA:82,3 -DA:88,2 -FN:94,AllBridgeFacet._startBridge -FNDA:4,AllBridgeFacet._startBridge -DA:98,4 -DA:104,2 -BRDA:104,0,0,2 -BRDA:104,0,1,2 -DA:105,2 -DA:116,2 -DA:128,4 -FNF:4 -FNH:3 -LF:10 -LH:9 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/AmarokFacet.sol -FN:43,AmarokFacet. -FNDA:0,AmarokFacet. -DA:44,0 -FN:52,AmarokFacet.startBridgeTokensViaAmarok -FNDA:265,AmarokFacet.startBridgeTokensViaAmarok -DA:64,261 -DA:66,260 -DA:71,259 -FN:78,AmarokFacet.swapAndStartBridgeTokensViaAmarok -FNDA:6,AmarokFacet.swapAndStartBridgeTokensViaAmarok -DA:91,3 -DA:93,3 -DA:101,2 -FN:109,AmarokFacet._startBridge -FNDA:261,AmarokFacet._startBridge -DA:115,261 -DA:117,1 -BRDA:117,0,0,1 -DA:120,260 -DA:127,2 -BRDA:127,1,0,2 -BRDA:127,1,1,258 -DA:128,2 -DA:139,258 -DA:150,260 -FN:153,AmarokFacet.validateDestinationCallFlag -FNDA:264,AmarokFacet.validateDestinationCallFlag -DA:158,264 -DA:159,1 -BRDA:159,2,0,1 -DA:160,1 -FNF:5 -FNH:4 -LF:17 -LH:16 -BRF:4 -BRH:4 -end_of_record -TN: -SF:src/Facets/AmarokFacetPacked.sol -FN:33,AmarokFacetPacked. -FNDA:0,AmarokFacetPacked. -DA:37,0 -FN:45,AmarokFacetPacked.setApprovalForBridge -FNDA:13,AmarokFacetPacked.setApprovalForBridge -DA:48,13 -DA:50,13 -DA:52,26 -FN:62,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -DA:64,2 -DA:65,2 -DA:66,2 -DA:67,2 -DA:70,2 -DA:77,2 -DA:88,2 -FN:91,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -DA:96,2 -DA:97,2 -DA:98,2 -DA:101,2 -DA:108,2 -DA:118,2 -FN:129,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithAsset -FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithAsset -DA:139,2 -DA:146,2 -DA:157,2 -FN:167,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithNative -FNDA:2,AmarokFacetPacked.startBridgeTokensViaAmarokERC20MinPayFeeWithNative -DA:176,2 -DA:183,2 -DA:193,2 -FN:204,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -FNDA:16,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -DA:213,16 -BRDA:213,0,0,1 -BRDA:213,0,1,15 -DA:217,15 -BRDA:217,1,0,1 -BRDA:217,1,1,14 -DA:221,14 -BRDA:221,2,0,1 -BRDA:221,2,1,13 -DA:226,13 -DA:227,13 -FN:248,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -FNDA:15,AmarokFacetPacked.encode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -DA:256,15 -BRDA:256,3,0,1 -BRDA:256,3,1,14 -DA:260,14 -BRDA:260,4,0,1 -BRDA:260,4,1,13 -DA:265,13 -DA:266,13 -FN:281,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -FNDA:1,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithAsset -DA:288,1 -BRDA:288,5,0,- -BRDA:288,5,1,1 -DA:293,1 -DA:294,1 -DA:296,1 -DA:298,1 -DA:299,1 -DA:300,1 -DA:301,1 -DA:302,1 -DA:304,1 -DA:305,1 -DA:306,1 -DA:307,1 -DA:308,1 -DA:309,1 -DA:310,1 -DA:312,1 -FN:317,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -FNDA:1,AmarokFacetPacked.decode_startBridgeTokensViaAmarokERC20PackedPayFeeWithNative -DA:324,1 -BRDA:324,6,0,- -BRDA:324,6,1,1 -DA:329,1 -DA:330,1 -DA:332,1 -DA:334,1 -DA:335,1 -DA:336,1 -DA:337,1 -DA:338,1 -DA:340,1 -DA:341,1 -DA:342,1 -DA:343,1 -DA:346,1 -DA:347,1 -DA:349,1 -FN:352,AmarokFacetPacked.getChainIdForDomain -FNDA:0,AmarokFacetPacked.getChainIdForDomain -DA:355,2 -BRDA:355,7,0,- -BRDA:355,7,1,- -DA:357,2 -BRDA:357,8,0,- -BRDA:357,8,1,- -DA:359,2 -BRDA:359,9,0,2 -BRDA:359,9,1,- -DA:361,0 -BRDA:361,10,0,- -BRDA:361,10,1,- -DA:363,0 -BRDA:363,11,0,- -BRDA:363,11,1,- -DA:365,0 -BRDA:365,12,0,- -BRDA:365,12,1,- -DA:367,0 -FNF:11 -FNH:9 -LF:72 -LH:67 -BRF:26 -BRH:13 -end_of_record -TN: -SF:src/Facets/ArbitrumBridgeFacet.sol -FN:46,ArbitrumBridgeFacet. -FNDA:0,ArbitrumBridgeFacet. -DA:47,0 -DA:48,0 -FN:56,ArbitrumBridgeFacet.startBridgeTokensViaArbitrumBridge -FNDA:264,ArbitrumBridgeFacet.startBridgeTokensViaArbitrumBridge -DA:68,259 -DA:69,259 -DA:72,259 -DA:77,258 -FN:84,ArbitrumBridgeFacet.swapAndStartBridgeTokensViaArbitrumBridge -FNDA:6,ArbitrumBridgeFacet.swapAndStartBridgeTokensViaArbitrumBridge -DA:97,3 -DA:98,3 -DA:101,3 -DA:109,2 -FN:118,ArbitrumBridgeFacet._startBridge -FNDA:260,ArbitrumBridgeFacet._startBridge -DA:123,260 -BRDA:123,0,0,2 -BRDA:123,0,1,258 -DA:124,2 -DA:137,258 -DA:142,258 -DA:152,260 -FNF:4 -FNH:3 -LF:15 -LH:13 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/CBridgeFacet.sol -FN:47,CBridgeFacet. -FNDA:0,CBridgeFacet. -DA:48,0 -FN:56,CBridgeFacet.startBridgeTokensViaCBridge -FNDA:267,CBridgeFacet.startBridgeTokensViaCBridge -DA:68,262 -DA:72,260 -FN:79,CBridgeFacet.swapAndStartBridgeTokensViaCBridge -FNDA:14,CBridgeFacet.swapAndStartBridgeTokensViaCBridge -DA:92,10 -DA:98,9 -FN:107,CBridgeFacet.triggerRefund -FNDA:0,CBridgeFacet.triggerRefund -DA:114,0 -BRDA:114,0,0,- -DA:115,0 -DA:119,0 -BRDA:119,1,0,- -DA:120,0 -DA:124,0 -DA:125,0 -DA:126,0 -BRDA:126,2,0,- -DA:127,0 -DA:131,0 -DA:132,0 -DA:133,0 -FN:141,CBridgeFacet._startBridge -FNDA:269,CBridgeFacet._startBridge -DA:145,269 -BRDA:145,3,0,4 -BRDA:145,3,1,265 -DA:146,4 -DA:155,265 -DA:161,265 -DA:171,269 -FNF:5 -FNH:3 -LF:21 -LH:9 -BRF:5 -BRH:2 -end_of_record -TN: -SF:src/Facets/CBridgeFacetPacked.sol -FN:40,CBridgeFacetPacked. -FNDA:0,CBridgeFacetPacked. -DA:44,0 -FN:52,CBridgeFacetPacked.setApprovalForBridge -FNDA:28,CBridgeFacetPacked.setApprovalForBridge -DA:55,28 -DA:57,42 -FN:74,CBridgeFacetPacked.triggerRefund -FNDA:1,CBridgeFacetPacked.triggerRefund -DA:82,1 -BRDA:82,0,0,- -DA:83,0 -DA:87,1 -DA:88,1 -DA:89,1 -BRDA:89,1,0,- -DA:90,0 -DA:94,1 -DA:95,1 -DA:96,1 -FN:101,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativePacked -FNDA:6,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativePacked -DA:102,6 -DA:110,6 -FN:119,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativeMin -FNDA:3,CBridgeFacetPacked.startBridgeTokensViaCBridgeNativeMin -DA:126,3 -DA:134,3 -FN:139,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Packed -FNDA:8,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Packed -DA:140,8 -DA:141,8 -DA:144,8 -DA:152,8 -DA:161,8 -FN:172,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Min -FNDA:4,CBridgeFacetPacked.startBridgeTokensViaCBridgeERC20Min -DA:182,4 -DA:190,4 -DA:199,4 -FN:210,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeNativePacked -FNDA:33,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeNativePacked -DA:217,33 -BRDA:217,2,0,1 -BRDA:217,2,1,32 -DA:221,32 -BRDA:221,3,0,1 -BRDA:221,3,1,31 -DA:226,31 -DA:227,31 -FN:241,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeNativePacked -FNDA:1,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeNativePacked -DA:248,1 -BRDA:248,4,0,- -BRDA:248,4,1,1 -DA:253,1 -DA:254,1 -DA:256,1 -DA:257,1 -DA:258,1 -DA:259,1 -DA:260,1 -DA:262,1 -FN:273,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeERC20Packed -FNDA:49,CBridgeFacetPacked.encode_startBridgeTokensViaCBridgeERC20Packed -DA:282,49 -BRDA:282,5,0,1 -BRDA:282,5,1,48 -DA:286,48 -BRDA:286,6,0,1 -BRDA:286,6,1,47 -DA:290,47 -BRDA:290,7,0,1 -BRDA:290,7,1,46 -DA:295,46 -DA:296,46 -FN:310,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeERC20Packed -FNDA:1,CBridgeFacetPacked.decode_startBridgeTokensViaCBridgeERC20Packed -DA:317,1 -BRDA:317,8,0,- -BRDA:317,8,1,1 -DA:319,1 -DA:320,1 -DA:322,1 -DA:323,1 -DA:324,1 -DA:325,1 -DA:326,1 -DA:327,1 -DA:328,1 -DA:330,1 -FNF:11 -FNH:10 -LF:53 -LH:50 -BRF:16 -BRH:12 -end_of_record -TN: -SF:src/Facets/CalldataVerificationFacet.sol -FN:24,CalldataVerificationFacet.extractBridgeData -FNDA:3,CalldataVerificationFacet.extractBridgeData -DA:27,3 -FN:33,CalldataVerificationFacet.extractSwapData -FNDA:4,CalldataVerificationFacet.extractSwapData -DA:36,4 -FN:43,CalldataVerificationFacet.extractData -FNDA:6,CalldataVerificationFacet.extractData -DA:53,6 -DA:54,2 -BRDA:54,0,0,2 -DA:55,2 -FN:68,CalldataVerificationFacet.extractMainParameters -FNDA:6,CalldataVerificationFacet.extractMainParameters -DA:83,10 -DA:85,2 -BRDA:85,1,0,2 -BRDA:85,1,1,2 -DA:86,2 -DA:87,2 -DA:88,2 -DA:90,8 -DA:91,8 -DA:94,10 -FN:108,CalldataVerificationFacet.extractNonEVMAddress -FNDA:4,CalldataVerificationFacet.extractNonEVMAddress -DA:111,4 -DA:112,4 -DA:115,4 -DA:116,2 -BRDA:116,2,0,2 -DA:118,2 -DA:122,2 -BRDA:122,3,0,2 -BRDA:122,3,1,2 -DA:124,2 -DA:125,2 -DA:129,2 -DA:130,2 -FN:142,CalldataVerificationFacet.extractGenericSwapParameters -FNDA:6,CalldataVerificationFacet.extractGenericSwapParameters -DA:155,6 -DA:156,6 -DA:157,6 -DA:167,6 -BRDA:167,4,0,1 -DA:168,1 -DA:173,5 -DA:174,2 -BRDA:174,5,0,2 -DA:177,2 -DA:178,2 -DA:181,5 -BRDA:181,6,0,3 -BRDA:181,6,1,3 -DA:183,3 -DA:186,3 -DA:187,3 -DA:191,3 -DA:194,2 -DA:201,5 -DA:202,5 -DA:203,5 -DA:204,5 -FN:226,CalldataVerificationFacet.validateCalldata -FNDA:4,CalldataVerificationFacet.validateCalldata -DA:236,4 -DA:237,4 -DA:246,4 -DA:248,4 -DA:264,2 -DA:266,2 -FN:274,CalldataVerificationFacet.validateDestinationCalldata -FNDA:19,CalldataVerificationFacet.validateDestinationCalldata -DA:279,19 -DA:283,19 -DA:284,9 -BRDA:284,7,0,9 -DA:285,9 -DA:288,19 -DA:291,19 -BRDA:291,8,0,4 -DA:292,4 -DA:297,4 -DA:298,4 -DA:299,2 -DA:302,15 -DA:303,2 -BRDA:303,9,0,2 -DA:304,2 -DA:308,2 -DA:309,2 -DA:310,2 -DA:314,13 -BRDA:314,10,0,4 -DA:315,4 -DA:319,4 -DA:320,4 -DA:321,2 -DA:324,9 -DA:326,2 -BRDA:326,11,0,2 -DA:327,2 -DA:335,2 -DA:336,2 -DA:337,2 -DA:341,7 -DA:342,5 -BRDA:342,12,0,5 -DA:343,5 -DA:347,5 -DA:348,5 -DA:349,3 -DA:352,2 -DA:354,1 -BRDA:354,13,0,1 -DA:355,1 -DA:359,1 -DA:360,1 -DA:361,1 -DA:365,1 -FN:373,CalldataVerificationFacet._extractBridgeData -FNDA:23,CalldataVerificationFacet._extractBridgeData -DA:377,23 -DA:378,11 -BRDA:378,14,0,11 -DA:380,11 -DA:381,11 -DA:385,11 -DA:388,12 -FN:394,CalldataVerificationFacet._extractSwapData -FNDA:8,CalldataVerificationFacet._extractSwapData -DA:398,8 -DA:399,4 -BRDA:399,15,0,4 -DA:401,4 -DA:402,4 -DA:406,4 -DA:409,4 -FN:415,CalldataVerificationFacet._isGenericV3SingleSwap -FNDA:5,CalldataVerificationFacet._isGenericV3SingleSwap -DA:418,5 -DA:419,5 -DA:421,2 -DA:423,2 -FNF:11 -FNH:11 -LF:104 -LH:104 -BRF:19 -BRH:19 -end_of_record -TN: -SF:src/Facets/CelerCircleBridgeFacet.sol -FN:34,CelerCircleBridgeFacet. -FNDA:0,CelerCircleBridgeFacet. -DA:35,0 -DA:36,0 -FN:43,CelerCircleBridgeFacet.startBridgeTokensViaCelerCircleBridge -FNDA:264,CelerCircleBridgeFacet.startBridgeTokensViaCelerCircleBridge -DA:53,259 -DA:54,258 -FN:60,CelerCircleBridgeFacet.swapAndStartBridgeTokensViaCelerCircleBridge -FNDA:5,CelerCircleBridgeFacet.swapAndStartBridgeTokensViaCelerCircleBridge -DA:73,2 -DA:79,1 -FN:86,CelerCircleBridgeFacet._startBridge -FNDA:259,CelerCircleBridgeFacet._startBridge -DA:87,259 -BRDA:87,0,0,1 -BRDA:87,0,1,258 -DA:93,258 -DA:100,258 -DA:107,258 -FNF:4 -FNH:3 -LF:10 -LH:8 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/CelerIMFacetImmutable.sol -FN:19,CelerIMFacetImmutable. -FNDA:0,CelerIMFacetImmutable. -FNF:1 -FNH:0 -LF:0 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/CelerIMFacetMutable.sol -FN:19,CelerIMFacetMutable. -FNDA:0,CelerIMFacetMutable. -FNF:1 -FNH:0 -LF:0 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/CircleBridgeFacet.sol -FN:34,CircleBridgeFacet. -FNDA:0,CircleBridgeFacet. -DA:35,0 -DA:36,0 -FN:44,CircleBridgeFacet.startBridgeTokensViaCircleBridge -FNDA:263,CircleBridgeFacet.startBridgeTokensViaCircleBridge -DA:55,258 -DA:56,257 -FN:63,CircleBridgeFacet.swapAndStartBridgeTokensViaCircleBridge -FNDA:5,CircleBridgeFacet.swapAndStartBridgeTokensViaCircleBridge -DA:77,2 -DA:83,1 -FN:91,CircleBridgeFacet._startBridge -FNDA:258,CircleBridgeFacet._startBridge -DA:96,258 -DA:103,258 -DA:110,258 -FNF:4 -FNH:3 -LF:9 -LH:7 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/DexManagerFacet.sol -FN:27,DexManagerFacet.addDex -FNDA:4,DexManagerFacet.addDex -DA:28,4 -BRDA:28,0,0,- -DA:29,0 -DA:32,4 -DA:34,2 -FN:39,DexManagerFacet.batchAddDex -FNDA:4,DexManagerFacet.batchAddDex -DA:40,4 -BRDA:40,1,0,- -DA:41,0 -DA:43,4 -DA:45,4 -DA:46,12 -DA:47,12 -BRDA:47,2,0,- -DA:48,0 -DA:50,12 -DA:51,12 -DA:52,10 -DA:54,10 -FN:61,DexManagerFacet.removeDex -FNDA:1,DexManagerFacet.removeDex -DA:62,1 -BRDA:62,4,0,- -DA:63,0 -DA:65,1 -DA:66,1 -FN:71,DexManagerFacet.batchRemoveDex -FNDA:1,DexManagerFacet.batchRemoveDex -DA:72,1 -BRDA:72,5,0,- -DA:73,0 -DA:75,1 -DA:76,1 -DA:77,2 -DA:78,2 -DA:80,2 -FN:88,DexManagerFacet.setFunctionApprovalBySignature -FNDA:1,DexManagerFacet.setFunctionApprovalBySignature -DA:92,1 -BRDA:92,6,0,- -DA:93,0 -DA:96,1 -BRDA:96,7,0,1 -BRDA:96,7,1,- -DA:97,1 -DA:99,0 -DA:102,1 -FN:108,DexManagerFacet.batchSetFunctionApprovalBySignature -FNDA:1,DexManagerFacet.batchSetFunctionApprovalBySignature -DA:112,1 -BRDA:112,8,0,- -DA:113,0 -DA:115,1 -DA:116,1 -DA:117,5 -DA:118,5 -BRDA:118,9,0,5 -BRDA:118,9,1,- -DA:119,5 -DA:121,0 -DA:123,5 -DA:125,5 -FN:133,DexManagerFacet.isFunctionApproved -FNDA:6,DexManagerFacet.isFunctionApproved -DA:136,6 -FN:141,DexManagerFacet.approvedDexs -FNDA:4,DexManagerFacet.approvedDexs -DA:146,4 -FNF:8 -FNH:8 -LF:44 -LH:35 -BRF:11 -BRH:2 -end_of_record -TN: -SF:src/Facets/DiamondCutFacet.sol -FN:18,DiamondCutFacet.diamondCut -FNDA:1437,DiamondCutFacet.diamondCut -DA:23,1437 -DA:24,1437 -FNF:1 -FNH:1 -LF:2 -LH:2 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/DiamondLoupeFacet.sol -FN:24,DiamondLoupeFacet.facets -FNDA:0,DiamondLoupeFacet.facets -DA:25,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:35,0 -FN:43,DiamondLoupeFacet.facetFunctionSelectors -FNDA:0,DiamondLoupeFacet.facetFunctionSelectors -DA:51,0 -DA:52,0 -FN:59,DiamondLoupeFacet.facetAddresses -FNDA:0,DiamondLoupeFacet.facetAddresses -DA:65,0 -DA:66,0 -FN:73,DiamondLoupeFacet.facetAddress -FNDA:0,DiamondLoupeFacet.facetAddress -DA:76,0 -DA:77,0 -FN:83,DiamondLoupeFacet.supportsInterface -FNDA:0,DiamondLoupeFacet.supportsInterface -DA:86,0 -DA:87,0 -FNF:5 -FNH:0 -LF:16 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/GenericSwapFacet.sol -FN:27,GenericSwapFacet.swapTokensGeneric -FNDA:19,GenericSwapFacet.swapTokensGeneric -DA:35,19 -BRDA:35,0,0,- -DA:36,0 -DA:39,19 -DA:45,19 -DA:47,19 -DA:49,19 -FNF:1 -FNH:1 -LF:6 -LH:5 -BRF:1 -BRH:0 -end_of_record -TN: -SF:src/Facets/GenericSwapFacetV3.sol -FN:25,GenericSwapFacetV3. -FNDA:0,GenericSwapFacetV3. -DA:26,0 -FN:40,GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20 -FNDA:7,GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20 -DA:48,7 -DA:50,6 -DA:51,6 -DA:54,6 -DA:59,6 -DA:60,1 -BRDA:60,0,0,1 -DA:63,5 -DA:66,5 -DA:67,5 -DA:77,5 -FN:96,GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative -FNDA:6,GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative -DA:104,6 -DA:107,4 -DA:110,4 -DA:111,1 -BRDA:111,1,0,1 -DA:115,3 -DA:116,3 -BRDA:116,2,0,1 -DA:119,2 -DA:120,2 -DA:121,2 -DA:131,2 -FN:150,GenericSwapFacetV3.swapTokensSingleV3NativeToERC20 -FNDA:7,GenericSwapFacetV3.swapTokensSingleV3NativeToERC20 -DA:158,7 -DA:161,7 -DA:163,1 -BRDA:163,3,0,1 -DA:167,6 -DA:170,6 -BRDA:170,4,0,1 -DA:171,1 -DA:174,5 -DA:177,4 -DA:178,4 -DA:183,4 -DA:184,1 -BRDA:184,5,0,1 -DA:187,3 -DA:190,3 -DA:191,3 -DA:201,3 -FN:222,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToNative -FNDA:5,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToNative -DA:230,5 -DA:231,5 -DA:232,5 -FN:249,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToERC20 -FNDA:10,GenericSwapFacetV3.swapTokensMultipleV3ERC20ToERC20 -DA:257,10 -DA:258,10 -DA:259,6 -FN:276,GenericSwapFacetV3.swapTokensMultipleV3NativeToERC20 -FNDA:5,GenericSwapFacetV3.swapTokensMultipleV3NativeToERC20 -DA:284,5 -DA:285,4 -FN:296,GenericSwapFacetV3._depositMultipleERC20Tokens -FNDA:15,GenericSwapFacetV3._depositMultipleERC20Tokens -DA:300,15 -DA:301,15 -DA:304,15 -DA:305,30 -DA:306,15 -BRDA:306,6,0,15 -DA:309,15 -DA:316,30 -FN:321,GenericSwapFacetV3._depositAndSwapERC20Single -FNDA:13,GenericSwapFacetV3._depositAndSwapERC20Single -DA:325,13 -DA:326,13 -DA:328,13 -DA:331,13 -DA:332,13 -DA:333,13 -DA:335,13 -DA:337,1 -BRDA:337,7,0,1 -DA:340,12 -DA:341,1 -BRDA:341,8,0,1 -DA:344,11 -DA:350,11 -BRDA:350,9,0,8 -DA:352,8 -BRDA:352,10,0,1 -DA:354,8 -DA:359,11 -DA:360,11 -BRDA:360,11,0,1 -DA:361,1 -DA:364,10 -FN:371,GenericSwapFacetV3._executeSwaps -FNDA:20,GenericSwapFacetV3._executeSwaps -DA:377,20 -DA:378,20 -DA:379,20 -DA:380,20 -DA:381,20 -DA:382,20 -DA:383,20 -DA:384,20 -DA:387,20 -DA:388,37 -DA:389,37 -DA:390,37 -DA:391,37 -DA:395,37 -DA:396,35 -DA:399,2 -BRDA:399,12,0,2 -DA:400,2 -DA:405,35 -DA:406,1 -DA:407,1 -BRDA:407,13,0,1 -DA:408,1 -DA:411,34 -BRDA:411,14,0,7 -BRDA:411,14,1,26 -DA:414,7 -DA:417,7 -BRDA:417,15,0,1 -DA:418,1 -DA:423,6 -DA:424,4 -BRDA:424,16,0,4 -DA:428,27 -DA:432,27 -BRDA:432,17,0,25 -DA:433,25 -DA:434,25 -DA:441,27 -DA:444,27 -BRDA:444,18,0,1 -DA:445,1 -DA:450,26 -DA:451,19 -BRDA:451,19,0,19 -DA:458,32 -DA:471,32 -FN:476,GenericSwapFacetV3._transferERC20TokensAndEmitEvent -FNDA:10,GenericSwapFacetV3._transferERC20TokensAndEmitEvent -DA:485,10 -DA:487,10 -DA:490,10 -DA:491,1 -BRDA:491,20,0,1 -DA:494,9 -DA:497,9 -FN:509,GenericSwapFacetV3._transferNativeTokensAndEmitEvent -FNDA:5,GenericSwapFacetV3._transferNativeTokensAndEmitEvent -DA:517,5 -DA:520,5 -DA:521,1 -BRDA:521,21,0,1 -DA:525,4 -DA:526,4 -BRDA:526,22,0,1 -DA:527,1 -DA:531,3 -FN:544,GenericSwapFacetV3._returnPositiveSlippageERC20 -FNDA:29,GenericSwapFacetV3._returnPositiveSlippageERC20 -DA:549,29 -BRDA:549,23,0,29 -DA:550,29 -DA:554,29 -BRDA:554,24,0,5 -DA:555,5 -FN:561,GenericSwapFacetV3._returnPositiveSlippageNative -FNDA:9,GenericSwapFacetV3._returnPositiveSlippageNative -DA:563,9 -DA:565,9 -BRDA:565,25,0,2 -DA:567,2 -DA:568,2 -BRDA:568,26,0,1 -FNF:14 -FNH:13 -LF:128 -LH:127 -BRF:28 -BRH:28 -end_of_record -TN: -SF:src/Facets/GnosisBridgeFacet.sol -FN:32,GnosisBridgeFacet. -FNDA:0,GnosisBridgeFacet. -DA:33,0 -FN:40,GnosisBridgeFacet.startBridgeTokensViaXDaiBridge -FNDA:264,GnosisBridgeFacet.startBridgeTokensViaXDaiBridge -DA:51,259 -DA:52,258 -FN:58,GnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge -FNDA:5,GnosisBridgeFacet.swapAndStartBridgeTokensViaXDaiBridge -DA:72,2 -DA:79,1 -FN:86,GnosisBridgeFacet._startBridge -FNDA:259,GnosisBridgeFacet._startBridge -DA:87,259 -DA:92,259 -DA:93,258 -FNF:4 -FNH:3 -LF:8 -LH:7 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/GnosisBridgeL2Facet.sol -FN:37,GnosisBridgeL2Facet. -FNDA:0,GnosisBridgeL2Facet. -DA:38,0 -FN:45,GnosisBridgeL2Facet.startBridgeTokensViaXDaiBridge -FNDA:6,GnosisBridgeL2Facet.startBridgeTokensViaXDaiBridge -DA:58,1 -FN:64,GnosisBridgeL2Facet.swapAndStartBridgeTokensViaXDaiBridge -FNDA:5,GnosisBridgeL2Facet.swapAndStartBridgeTokensViaXDaiBridge -DA:78,2 -DA:85,1 -FN:92,GnosisBridgeL2Facet._startBridge -FNDA:2,GnosisBridgeL2Facet._startBridge -DA:93,2 -DA:96,2 -FNF:4 -FNH:3 -LF:6 -LH:5 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/HopFacet.sol -FN:54,HopFacet.initHop -FNDA:27,HopFacet.initHop -DA:55,27 -DA:57,27 -DA:59,27 -DA:60,75 -BRDA:60,0,0,- -DA:61,0 -DA:63,75 -DA:66,27 -FN:74,HopFacet.registerBridge -FNDA:3,HopFacet.registerBridge -DA:75,3 -DA:77,2 -DA:79,2 -BRDA:79,1,0,1 -DA:80,1 -DA:83,1 -DA:85,1 -FN:91,HopFacet.startBridgeTokensViaHop -FNDA:269,HopFacet.startBridgeTokensViaHop -DA:103,263 -DA:107,261 -FN:114,HopFacet.swapAndStartBridgeTokensViaHop -FNDA:8,HopFacet.swapAndStartBridgeTokensViaHop -DA:127,4 -DA:134,3 -FN:142,HopFacet._startBridge -FNDA:264,HopFacet._startBridge -DA:146,264 -DA:147,264 -DA:148,264 -DA:151,264 -DA:157,264 -DA:161,264 -BRDA:161,2,0,263 -BRDA:161,2,1,1 -DA:163,263 -DA:175,1 -DA:186,264 -FN:190,HopFacet.getStorage -FNDA:293,HopFacet.getStorage -DA:191,293 -DA:194,293 -FNF:6 -FNH:6 -LF:28 -LH:27 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src/Facets/HopFacetOptimized.sol -FN:34,HopFacetOptimized.setApprovalForBridges -FNDA:72,HopFacetOptimized.setApprovalForBridges -DA:38,72 -DA:39,72 -DA:41,232 -FN:52,HopFacetOptimized.startBridgeTokensViaHopL1ERC20 -FNDA:260,HopFacetOptimized.startBridgeTokensViaHopL1ERC20 -DA:57,260 -DA:64,259 -DA:73,257 -FN:79,HopFacetOptimized.startBridgeTokensViaHopL1Native -FNDA:1,HopFacetOptimized.startBridgeTokensViaHopL1Native -DA:84,1 -DA:95,1 -FN:102,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1ERC20 -FNDA:4,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1ERC20 -DA:108,4 -DA:117,3 -DA:126,2 -FN:133,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1Native -FNDA:1,HopFacetOptimized.swapAndStartBridgeTokensViaHopL1Native -DA:139,1 -DA:148,1 -DA:160,1 -FN:166,HopFacetOptimized.startBridgeTokensViaHopL2ERC20 -FNDA:260,HopFacetOptimized.startBridgeTokensViaHopL2ERC20 -DA:171,260 -DA:178,259 -DA:188,257 -FN:194,HopFacetOptimized.startBridgeTokensViaHopL2Native -FNDA:1,HopFacetOptimized.startBridgeTokensViaHopL2Native -DA:199,1 -DA:209,1 -FN:216,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2ERC20 -FNDA:5,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2ERC20 -DA:222,5 -DA:229,4 -DA:239,2 -FN:246,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2Native -FNDA:1,HopFacetOptimized.swapAndStartBridgeTokensViaHopL2Native -DA:252,1 -DA:259,1 -DA:269,1 -FNF:9 -FNH:9 -LF:25 -LH:25 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/HopFacetPacked.sol -FN:39,HopFacetPacked. -FNDA:0,HopFacetPacked. -DA:43,0 -DA:45,0 -BRDA:45,0,0,- -DA:46,0 -DA:49,0 -DA:52,0 -DA:55,0 -DA:58,0 -FN:69,HopFacetPacked.setApprovalForHopBridges -FNDA:32,HopFacetPacked.setApprovalForHopBridges -DA:73,32 -DA:75,32 -DA:77,160 -FN:87,HopFacetPacked.startBridgeTokensViaHopL2NativePacked -FNDA:3,HopFacetPacked.startBridgeTokensViaHopL2NativePacked -DA:96,3 -DA:97,3 -DA:98,3 -DA:101,3 -DA:104,3 -DA:114,3 -DA:123,3 -FN:137,HopFacetPacked.startBridgeTokensViaHopL2NativeMin -FNDA:2,HopFacetPacked.startBridgeTokensViaHopL2NativeMin -DA:148,2 -DA:159,2 -FN:168,HopFacetPacked.encode_startBridgeTokensViaHopL2NativePacked -FNDA:16,HopFacetPacked.encode_startBridgeTokensViaHopL2NativePacked -DA:175,16 -BRDA:175,1,0,- -BRDA:175,1,1,16 -DA:179,16 -BRDA:179,2,0,- -BRDA:179,2,1,16 -DA:183,16 -BRDA:183,3,0,- -BRDA:183,3,1,16 -DA:188,16 -DA:189,16 -FN:201,HopFacetPacked.decode_startBridgeTokensViaHopL2NativePacked -FNDA:1,HopFacetPacked.decode_startBridgeTokensViaHopL2NativePacked -DA:208,1 -BRDA:208,4,0,- -BRDA:208,4,1,1 -DA:213,1 -DA:214,1 -DA:216,1 -DA:217,1 -DA:218,1 -DA:219,1 -DA:220,1 -DA:222,1 -FN:227,HopFacetPacked.startBridgeTokensViaHopL2ERC20Packed -FNDA:4,HopFacetPacked.startBridgeTokensViaHopL2ERC20Packed -DA:241,4 -DA:242,4 -DA:243,4 -DA:244,4 -DA:246,4 -DA:251,4 -DA:258,4 -DA:268,4 -DA:277,4 -FN:291,HopFacetPacked.startBridgeTokensViaHopL2ERC20Min -FNDA:4,HopFacetPacked.startBridgeTokensViaHopL2ERC20Min -DA:304,4 -DA:311,4 -DA:322,4 -FN:336,HopFacetPacked.encode_startBridgeTokensViaHopL2ERC20Packed -FNDA:32,HopFacetPacked.encode_startBridgeTokensViaHopL2ERC20Packed -DA:348,32 -BRDA:348,5,0,- -BRDA:348,5,1,32 -DA:352,32 -BRDA:352,6,0,- -BRDA:352,6,1,32 -DA:356,32 -BRDA:356,7,0,- -BRDA:356,7,1,32 -DA:360,32 -BRDA:360,8,0,- -BRDA:360,8,1,32 -DA:364,32 -BRDA:364,9,0,- -BRDA:364,9,1,32 -DA:368,32 -BRDA:368,10,0,- -BRDA:368,10,1,32 -DA:373,32 -DA:374,32 -FN:391,HopFacetPacked.decode_startBridgeTokensViaHopL2ERC20Packed -FNDA:2,HopFacetPacked.decode_startBridgeTokensViaHopL2ERC20Packed -DA:398,2 -BRDA:398,11,0,- -BRDA:398,11,1,2 -DA:403,2 -DA:404,2 -DA:406,2 -DA:407,2 -DA:408,2 -DA:409,2 -DA:410,2 -DA:411,2 -DA:412,2 -DA:413,2 -DA:416,2 -DA:417,2 -DA:419,2 -FN:424,HopFacetPacked.startBridgeTokensViaHopL1NativePacked -FNDA:3,HopFacetPacked.startBridgeTokensViaHopL1NativePacked -DA:436,3 -DA:448,3 -FN:459,HopFacetPacked.startBridgeTokensViaHopL1NativeMin -FNDA:2,HopFacetPacked.startBridgeTokensViaHopL1NativeMin -DA:469,2 -DA:479,2 -FN:490,HopFacetPacked.encode_startBridgeTokensViaHopL1NativePacked -FNDA:16,HopFacetPacked.encode_startBridgeTokensViaHopL1NativePacked -DA:499,16 -BRDA:499,12,0,- -BRDA:499,12,1,16 -DA:503,16 -BRDA:503,13,0,- -BRDA:503,13,1,16 -DA:507,16 -BRDA:507,14,0,- -BRDA:507,14,1,16 -DA:512,16 -DA:513,16 -FN:527,HopFacetPacked.decode_startBridgeTokensViaHopL1NativePacked -FNDA:1,HopFacetPacked.decode_startBridgeTokensViaHopL1NativePacked -DA:534,1 -BRDA:534,15,0,- -BRDA:534,15,1,1 -DA:539,1 -DA:540,1 -DA:542,1 -DA:543,1 -DA:544,1 -DA:545,1 -DA:550,1 -DA:552,1 -FN:557,HopFacetPacked.startBridgeTokensViaHopL1ERC20Packed -FNDA:4,HopFacetPacked.startBridgeTokensViaHopL1ERC20Packed -DA:570,4 -DA:573,4 -DA:580,4 -DA:590,4 -FN:603,HopFacetPacked.startBridgeTokensViaHopL1ERC20Min -FNDA:4,HopFacetPacked.startBridgeTokensViaHopL1ERC20Min -DA:615,4 -DA:622,4 -DA:632,4 -FN:645,HopFacetPacked.encode_startBridgeTokensViaHopL1ERC20Packed -FNDA:32,HopFacetPacked.encode_startBridgeTokensViaHopL1ERC20Packed -DA:656,32 -BRDA:656,16,0,- -BRDA:656,16,1,32 -DA:660,32 -BRDA:660,17,0,- -BRDA:660,17,1,32 -DA:664,32 -BRDA:664,18,0,- -BRDA:664,18,1,32 -DA:668,32 -BRDA:668,19,0,- -BRDA:668,19,1,32 -DA:673,32 -DA:674,32 -FN:690,HopFacetPacked.decode_startBridgeTokensViaHopL1ERC20Packed -FNDA:2,HopFacetPacked.decode_startBridgeTokensViaHopL1ERC20Packed -DA:697,2 -BRDA:697,20,0,- -BRDA:697,20,1,2 -DA:702,2 -DA:703,2 -DA:705,2 -DA:706,2 -DA:707,2 -DA:708,2 -DA:709,2 -DA:710,2 -DA:715,2 -DA:717,2 -FNF:18 -FNH:17 -LF:109 -LH:102 -BRF:41 -BRH:20 -end_of_record -TN: -SF:src/Facets/HyphenFacet.sol -FN:25,HyphenFacet. -FNDA:0,HyphenFacet. -DA:26,0 -FN:33,HyphenFacet.startBridgeTokensViaHyphen -FNDA:264,HyphenFacet.startBridgeTokensViaHyphen -DA:44,259 -DA:48,258 -FN:54,HyphenFacet.swapAndStartBridgeTokensViaHyphen -FNDA:6,HyphenFacet.swapAndStartBridgeTokensViaHyphen -DA:66,3 -DA:72,2 -FN:79,HyphenFacet._startBridge -FNDA:260,HyphenFacet._startBridge -DA:80,260 -BRDA:80,0,0,258 -BRDA:80,0,1,2 -DA:82,258 -DA:88,258 -DA:96,2 -DA:103,260 -FNF:4 -FNH:3 -LF:10 -LH:9 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/LIFuelFacet.sol -FN:32,LIFuelFacet.startBridgeTokensViaLIFuel -FNDA:263,LIFuelFacet.startBridgeTokensViaLIFuel -DA:43,259 -DA:47,258 -FN:53,LIFuelFacet.swapAndStartBridgeTokensViaLIFuel -FNDA:6,LIFuelFacet.swapAndStartBridgeTokensViaLIFuel -DA:65,3 -DA:72,2 -FN:79,LIFuelFacet._startBridge -FNDA:260,LIFuelFacet._startBridge -DA:80,260 -DA:84,260 -BRDA:84,0,0,2 -BRDA:84,0,1,258 -DA:85,2 -DA:93,258 -DA:99,258 -DA:107,260 -FN:111,LIFuelFacet.getStorage -FNDA:260,LIFuelFacet.getStorage -DA:112,260 -DA:115,260 -FNF:4 -FNH:4 -LF:12 -LH:12 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/MayanFacet.sol -FN:53,MayanFacet. -FNDA:0,MayanFacet. -DA:54,0 -FN:62,MayanFacet.startBridgeTokensViaMayan -FNDA:265,MayanFacet.startBridgeTokensViaMayan -DA:74,260 -DA:79,259 -BRDA:79,0,0,1 -DA:81,1 -DA:87,259 -FN:94,MayanFacet.swapAndStartBridgeTokensViaMayan -FNDA:9,MayanFacet.swapAndStartBridgeTokensViaMayan -DA:107,6 -DA:114,5 -DA:115,5 -DA:116,5 -DA:121,5 -DA:127,5 -BRDA:127,1,0,3 -DA:129,3 -DA:135,5 -FN:143,MayanFacet._startBridge -FNDA:264,MayanFacet._startBridge -DA:148,264 -BRDA:148,2,0,1 -BRDA:148,2,1,263 -DA:149,1 -BRDA:149,3,0,- -DA:150,0 -DA:155,1 -DA:156,1 -BRDA:156,4,0,1 -DA:157,1 -DA:163,263 -DA:166,263 -BRDA:166,5,0,- -DA:167,0 -DA:171,263 -DA:173,263 -BRDA:173,6,0,260 -BRDA:173,6,1,3 -DA:174,260 -DA:180,260 -DA:188,3 -DA:194,263 -BRDA:194,7,0,- -DA:195,0 -DA:202,263 -FN:208,MayanFacet._parseReceiver -FNDA:264,MayanFacet._parseReceiver -DA:211,264 -DA:214,264 -DA:216,264 -DA:219,264 -DA:221,0 -DA:223,264 -DA:225,0 -DA:227,264 -DA:229,259 -DA:231,5 -DA:233,2 -DA:235,3 -DA:237,3 -DA:239,0 -DA:241,0 -DA:243,0 -DA:245,0 -DA:247,0 -DA:248,0 -FN:256,MayanFacet._normalizeAmount -FNDA:6,MayanFacet._normalizeAmount -DA:260,6 -BRDA:260,8,0,4 -DA:261,4 -DA:262,4 -DA:264,6 -FN:271,MayanFacet._replaceInputAmount -FNDA:3,MayanFacet._replaceInputAmount -DA:275,3 -BRDA:275,9,0,- -BRDA:275,9,1,3 -DA:276,3 -DA:277,3 -DA:282,3 -DA:284,3 -DA:285,3 -BRDA:285,10,0,1 -BRDA:285,10,1,2 -DA:286,1 -DA:288,2 -DA:292,3 -DA:293,524 -DA:297,3 -DA:298,3 -DA:299,96 -DA:303,3 -DA:304,992 -DA:307,3 -FNF:7 -FNH:6 -LF:69 -LH:57 -BRF:15 -BRH:11 -end_of_record -TN: -SF:src/Facets/NonStandardSelectorsRegistryFacet.sol -FN:23,NonStandardSelectorsRegistryFacet.setNonStandardSelector -FNDA:2,NonStandardSelectorsRegistryFacet.setNonStandardSelector -DA:27,2 -DA:28,1 -DA:29,1 -FN:35,NonStandardSelectorsRegistryFacet.batchSetNonStandardSelectors -FNDA:2,NonStandardSelectorsRegistryFacet.batchSetNonStandardSelectors -DA:39,2 -DA:40,1 -DA:41,1 -BRDA:41,0,0,- -BRDA:41,0,1,1 -DA:45,1 -DA:46,2 -FN:53,NonStandardSelectorsRegistryFacet.isNonStandardSelector -FNDA:3,NonStandardSelectorsRegistryFacet.isNonStandardSelector -DA:56,3 -FN:62,NonStandardSelectorsRegistryFacet.getStorage -FNDA:5,NonStandardSelectorsRegistryFacet.getStorage -DA:63,5 -DA:65,5 -FNF:4 -FNH:4 -LF:11 -LH:11 -BRF:2 -BRH:1 -end_of_record -TN: -SF:src/Facets/OmniBridgeFacet.sol -FN:29,OmniBridgeFacet. -FNDA:0,OmniBridgeFacet. -DA:30,0 -DA:31,0 -FN:38,OmniBridgeFacet.startBridgeTokensViaOmniBridge -FNDA:527,OmniBridgeFacet.startBridgeTokensViaOmniBridge -DA:49,517 -DA:53,515 -FN:59,OmniBridgeFacet.swapAndStartBridgeTokensViaOmniBridge -FNDA:11,OmniBridgeFacet.swapAndStartBridgeTokensViaOmniBridge -DA:71,5 -DA:77,3 -FN:84,OmniBridgeFacet._startBridge -FNDA:518,OmniBridgeFacet._startBridge -DA:85,518 -BRDA:85,0,0,2 -BRDA:85,0,1,516 -DA:86,2 -DA:90,516 -DA:95,516 -DA:102,518 -FNF:4 -FNH:3 -LF:11 -LH:9 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/OptimismBridgeFacet.sol -FN:57,OptimismBridgeFacet.initOptimism -FNDA:7,OptimismBridgeFacet.initOptimism -DA:61,7 -DA:63,7 -DA:65,0 -BRDA:65,0,0,- -DA:66,0 -DA:69,7 -DA:70,7 -BRDA:70,1,0,- -DA:71,0 -DA:73,7 -DA:78,7 -DA:79,7 -DA:81,7 -FN:89,OptimismBridgeFacet.registerOptimismBridge -FNDA:0,OptimismBridgeFacet.registerOptimismBridge -DA:90,0 -DA:92,0 -DA:94,0 -BRDA:94,2,0,- -DA:96,0 -BRDA:96,3,0,- -DA:97,0 -DA:100,0 -DA:102,0 -FN:108,OptimismBridgeFacet.startBridgeTokensViaOptimismBridge -FNDA:6,OptimismBridgeFacet.startBridgeTokensViaOptimismBridge -DA:120,3 -DA:124,1 -FN:131,OptimismBridgeFacet.swapAndStartBridgeTokensViaOptimismBridge -FNDA:1,OptimismBridgeFacet.swapAndStartBridgeTokensViaOptimismBridge -DA:144,1 -DA:150,1 -FN:158,OptimismBridgeFacet._startBridge -FNDA:2,OptimismBridgeFacet._startBridge -DA:162,2 -DA:163,2 -DA:166,2 -DA:172,2 -BRDA:172,4,0,- -BRDA:172,4,1,2 -DA:173,0 -DA:179,2 -DA:185,0 -BRDA:185,5,0,- -BRDA:185,5,1,2 -DA:186,0 -DA:188,2 -DA:199,2 -FN:203,OptimismBridgeFacet.getStorage -FNDA:9,OptimismBridgeFacet.getStorage -DA:204,9 -DA:207,9 -FNF:6 -FNH:5 -LF:34 -LH:21 -BRF:8 -BRH:2 -end_of_record -TN: -SF:src/Facets/OwnershipFacet.sol -FN:43,OwnershipFacet.transferOwnership -FNDA:5,OwnershipFacet.transferOwnership -DA:44,5 -DA:45,4 -DA:47,4 -BRDA:47,0,0,1 -DA:49,3 -DA:50,1 -BRDA:50,1,0,1 -DA:52,2 -DA:53,2 -FN:57,OwnershipFacet.cancelOwnershipTransfer -FNDA:0,OwnershipFacet.cancelOwnershipTransfer -DA:58,0 -DA:59,0 -DA:61,0 -DA:62,0 -BRDA:62,2,0,- -DA:63,0 -FN:67,OwnershipFacet.confirmOwnershipTransfer -FNDA:2,OwnershipFacet.confirmOwnershipTransfer -DA:68,2 -DA:69,2 -DA:70,2 -BRDA:70,3,0,1 -DA:71,1 -DA:72,1 -DA:73,1 -FN:78,OwnershipFacet.owner -FNDA:3,OwnershipFacet.owner -DA:79,3 -FN:85,OwnershipFacet.getStorage -FNDA:6,OwnershipFacet.getStorage -DA:86,6 -DA:89,6 -FNF:5 -FNH:4 -LF:21 -LH:16 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src/Facets/PeripheryRegistryFacet.sol -FN:31,PeripheryRegistryFacet.registerPeripheryContract -FNDA:22,PeripheryRegistryFacet.registerPeripheryContract -DA:35,22 -DA:36,22 -DA:37,22 -DA:38,22 -FN:43,PeripheryRegistryFacet.getPeripheryContract -FNDA:2,PeripheryRegistryFacet.getPeripheryContract -DA:46,2 -FN:50,PeripheryRegistryFacet.getStorage -FNDA:24,PeripheryRegistryFacet.getStorage -DA:51,24 -DA:54,24 -FNF:3 -FNH:3 -LF:7 -LH:7 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Facets/PolygonBridgeFacet.sol -FN:29,PolygonBridgeFacet. -FNDA:0,PolygonBridgeFacet. -DA:30,0 -DA:31,0 -FN:38,PolygonBridgeFacet.startBridgeTokensViaPolygonBridge -FNDA:264,PolygonBridgeFacet.startBridgeTokensViaPolygonBridge -DA:49,259 -DA:53,258 -FN:59,PolygonBridgeFacet.swapAndStartBridgeTokensViaPolygonBridge -FNDA:6,PolygonBridgeFacet.swapAndStartBridgeTokensViaPolygonBridge -DA:71,3 -DA:77,2 -FN:84,PolygonBridgeFacet._startBridge -FNDA:260,PolygonBridgeFacet._startBridge -DA:85,260 -DA:87,260 -BRDA:87,0,0,2 -BRDA:87,0,1,258 -DA:88,2 -DA:92,258 -DA:96,258 -DA:102,258 -DA:103,258 -DA:110,260 -FNF:4 -FNH:3 -LF:14 -LH:12 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/SquidFacet.sol -FN:67,SquidFacet. -FNDA:0,SquidFacet. -DA:68,0 -FN:76,SquidFacet.startBridgeTokensViaSquid -FNDA:7,SquidFacet.startBridgeTokensViaSquid -DA:87,3 -DA:92,3 -FN:99,SquidFacet.swapAndStartBridgeTokensViaSquid -FNDA:5,SquidFacet.swapAndStartBridgeTokensViaSquid -DA:112,2 -DA:120,1 -FN:128,SquidFacet._startBridge -FNDA:4,SquidFacet._startBridge -DA:132,4 -DA:139,4 -BRDA:139,0,0,2 -DA:140,2 -DA:148,4 -BRDA:148,1,0,1 -BRDA:148,1,1,- -DA:149,1 -DA:150,3 -BRDA:150,2,0,- -BRDA:150,2,1,- -DA:151,0 -DA:152,3 -BRDA:152,3,0,3 -BRDA:152,3,1,- -DA:153,3 -DA:155,0 -DA:158,4 -FN:161,SquidFacet._bridgeCall -FNDA:1,SquidFacet._bridgeCall -DA:162,1 -FN:173,SquidFacet._callBridge -FNDA:0,SquidFacet._callBridge -DA:174,0 -FN:186,SquidFacet._callBridgeCall -FNDA:3,SquidFacet._callBridgeCall -DA:187,3 -FN:202,SquidFacet._calculateMsgValue -FNDA:4,SquidFacet._calculateMsgValue -DA:206,4 -DA:207,4 -BRDA:207,4,0,2 -DA:208,2 -DA:210,4 -FNF:8 -FNH:6 -LF:23 -LH:19 -BRF:8 -BRH:4 -end_of_record -TN: -SF:src/Facets/StandardizedCallFacet.sol -FN:15,StandardizedCallFacet.standardizedCall -FNDA:2,StandardizedCallFacet.standardizedCall -DA:16,2 -FN:21,StandardizedCallFacet.standardizedSwapCall -FNDA:2,StandardizedCallFacet.standardizedSwapCall -DA:22,2 -FN:27,StandardizedCallFacet.standardizedBridgeCall -FNDA:2,StandardizedCallFacet.standardizedBridgeCall -DA:28,2 -FN:33,StandardizedCallFacet.standardizedSwapAndBridgeCall -FNDA:2,StandardizedCallFacet.standardizedSwapAndBridgeCall -DA:36,2 -FN:39,StandardizedCallFacet.execute -FNDA:8,StandardizedCallFacet.execute -DA:42,8 -DA:43,8 -DA:47,8 -BRDA:47,0,0,4 -DA:48,4 -DA:55,4 -DA:64,4 -DA:67,4 -DA:68,0 -DA:70,4 -DA:71,4 -FNF:5 -FNH:5 -LF:14 -LH:13 -BRF:1 -BRH:1 -end_of_record -TN: -SF:src/Facets/StargateFacet.sol -FN:80,StargateFacet. -FNDA:0,StargateFacet. -DA:81,0 -FN:88,StargateFacet.initStargate -FNDA:23,StargateFacet.initStargate -DA:89,23 -DA:91,22 -DA:93,22 -DA:94,66 -DA:98,22 -DA:100,22 -FN:108,StargateFacet.startBridgeTokensViaStargate -FNDA:268,StargateFacet.startBridgeTokensViaStargate -DA:119,264 -DA:120,263 -DA:124,262 -FN:131,StargateFacet.swapAndStartBridgeTokensViaStargate -FNDA:6,StargateFacet.swapAndStartBridgeTokensViaStargate -DA:143,3 -DA:144,3 -DA:152,2 -FN:155,StargateFacet.quoteLayerZeroFee -FNDA:46,StargateFacet.quoteLayerZeroFee -DA:159,46 -DA:160,46 -FN:178,StargateFacet._startBridge -FNDA:264,StargateFacet._startBridge -DA:182,264 -BRDA:182,0,0,3 -BRDA:182,0,1,259 -DA:183,3 -DA:201,261 -DA:207,261 -DA:224,262 -DA:226,262 -FN:229,StargateFacet.validateDestinationCallFlag -FNDA:267,StargateFacet.validateDestinationCallFlag -DA:234,267 -DA:236,1 -BRDA:236,1,0,1 -DA:237,1 -FN:247,StargateFacet.setLayerZeroChainId -FNDA:2,StargateFacet.setLayerZeroChainId -DA:251,2 -DA:252,1 -DA:254,1 -BRDA:254,2,0,- -DA:255,0 -DA:258,1 -DA:259,1 -FN:265,StargateFacet.getLayerZeroChainId -FNDA:310,StargateFacet.getLayerZeroChainId -DA:268,310 -DA:269,310 -DA:270,310 -BRDA:270,3,0,- -DA:271,310 -FN:274,StargateFacet.toBytes -FNDA:310,StargateFacet.toBytes -DA:275,310 -FN:279,StargateFacet.getStorage -FNDA:333,StargateFacet.getStorage -DA:280,333 -DA:283,333 -FNF:11 -FNH:10 -LF:37 -LH:35 -BRF:5 -BRH:3 -end_of_record -TN: -SF:src/Facets/StargateFacetV2.sol -FN:40,StargateFacetV2. -FNDA:4,StargateFacetV2. -DA:41,4 -FN:49,StargateFacetV2.startBridgeTokensViaStargate -FNDA:23,StargateFacetV2.startBridgeTokensViaStargate -DA:60,19 -DA:64,18 -FN:71,StargateFacetV2.swapAndStartBridgeTokensViaStargate -FNDA:10,StargateFacetV2.swapAndStartBridgeTokensViaStargate -DA:83,7 -DA:91,6 -FN:99,StargateFacetV2._startBridge -FNDA:24,StargateFacetV2._startBridge -DA:105,24 -DA:109,6 -BRDA:109,0,0,6 -DA:113,18 -DA:116,1 -BRDA:116,1,0,1 -DA:119,17 -DA:122,17 -DA:123,1 -BRDA:123,2,0,1 -DA:126,16 -DA:127,16 -BRDA:127,3,0,5 -BRDA:127,3,1,10 -DA:130,5 -DA:134,11 -DA:135,11 -DA:140,11 -BRDA:140,4,0,10 -DA:142,10 -BRDA:142,5,0,2 -DA:143,2 -DA:146,10 -DA:151,16 -DA:154,16 -DA:160,14 -FNF:4 -FNH:4 -LF:24 -LH:24 -BRF:7 -BRH:7 -end_of_record -TN: -SF:src/Facets/SymbiosisFacet.sol -FN:49,SymbiosisFacet. -FNDA:0,SymbiosisFacet. -DA:53,0 -DA:54,0 -FN:62,SymbiosisFacet.startBridgeTokensViaSymbiosis -FNDA:264,SymbiosisFacet.startBridgeTokensViaSymbiosis -DA:74,259 -DA:79,258 -FN:88,SymbiosisFacet.swapAndStartBridgeTokensViaSymbiosis -FNDA:6,SymbiosisFacet.swapAndStartBridgeTokensViaSymbiosis -DA:100,3 -DA:107,2 -FN:113,SymbiosisFacet._startBridge -FNDA:260,SymbiosisFacet._startBridge -DA:117,260 -DA:118,260 -DA:120,2 -BRDA:120,0,0,2 -BRDA:120,0,1,258 -DA:121,2 -DA:123,258 -DA:130,260 -DA:144,260 -FNF:4 -FNH:3 -LF:13 -LH:11 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src/Facets/ThorSwapFacet.sol -FN:31,ThorSwapFacet. -FNDA:0,ThorSwapFacet. -DA:32,0 -FN:38,ThorSwapFacet.startBridgeTokensViaThorSwap -FNDA:264,ThorSwapFacet.startBridgeTokensViaThorSwap -DA:50,259 -DA:54,258 -FN:61,ThorSwapFacet.swapAndStartBridgeTokensViaThorSwap -FNDA:6,ThorSwapFacet.swapAndStartBridgeTokensViaThorSwap -DA:74,3 -DA:80,2 -FN:86,ThorSwapFacet._startBridge -FNDA:260,ThorSwapFacet._startBridge -DA:90,260 -DA:91,260 -DA:93,260 -BRDA:93,0,0,258 -DA:94,258 -DA:100,260 -DA:110,260 -FNF:4 -FNH:3 -LF:11 -LH:10 -BRF:1 -BRH:1 -end_of_record -TN: -SF:src/Facets/WithdrawFacet.sol -FN:35,WithdrawFacet.executeCallAndWithdraw -FNDA:5,WithdrawFacet.executeCallAndWithdraw -DA:42,5 -BRDA:42,0,0,2 -DA:43,2 -DA:47,3 -DA:48,3 -DA:49,3 -BRDA:49,1,0,- -DA:52,3 -DA:54,2 -BRDA:54,2,0,2 -BRDA:54,2,1,1 -DA:55,2 -DA:57,1 -FN:65,WithdrawFacet.withdraw -FNDA:0,WithdrawFacet.withdraw -DA:70,0 -BRDA:70,3,0,- -DA:71,0 -DA:73,0 -FN:82,WithdrawFacet._withdrawAsset -FNDA:2,WithdrawFacet._withdrawAsset -DA:87,2 -DA:88,2 -DA:89,2 -FNF:3 -FNH:2 -LF:15 -LH:12 -BRF:5 -BRH:3 -end_of_record -TN: -SF:src/Helpers/CelerIMFacetBase.sol -FN:70,CelerIMFacetBase. -FNDA:0,CelerIMFacetBase. -DA:77,0 -DA:84,0 -DA:85,0 -FN:93,CelerIMFacetBase.startBridgeTokensViaCelerIM -FNDA:271,CelerIMFacetBase.startBridgeTokensViaCelerIM -DA:104,267 -DA:105,266 -BRDA:105,0,0,262 -DA:107,262 -DA:110,262 -DA:111,262 -DA:119,261 -DA:121,0 -BRDA:121,1,0,- -DA:122,0 -DA:126,265 -FN:133,CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM -FNDA:9,CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM -DA:145,5 -DA:147,5 -DA:155,4 -BRDA:155,2,0,2 -DA:157,2 -DA:160,2 -DA:161,2 -DA:168,2 -DA:170,0 -BRDA:170,3,0,- -DA:171,0 -DA:175,4 -FN:183,CelerIMFacetBase._startBridge -FNDA:269,CelerIMFacetBase._startBridge -DA:189,269 -DA:194,269 -BRDA:194,4,0,267 -BRDA:194,4,1,2 -DA:196,267 -DA:204,2 -DA:207,2 -DA:210,2 -DA:217,2 -DA:228,2 -DA:232,268 -FN:238,CelerIMFacetBase._getRightAsset -FNDA:264,CelerIMFacetBase._getRightAsset -DA:241,264 -BRDA:241,5,0,- -BRDA:241,5,1,- -DA:243,0 -DA:246,264 -FN:250,CelerIMFacetBase.validateDestinationCallFlag -FNDA:272,CelerIMFacetBase.validateDestinationCallFlag -DA:255,272 -DA:257,1 -BRDA:257,6,0,1 -DA:258,1 -FNF:6 -FNH:5 -LF:37 -LH:29 -BRF:9 -BRH:5 -end_of_record -TN: -SF:src/Helpers/ExcessivelySafeCall.sol -FN:29,ExcessivelySafeCall.excessivelySafeCall -FNDA:0,ExcessivelySafeCall.excessivelySafeCall -DA:37,0 -DA:38,0 -DA:39,0 -DA:45,0 -DA:55,0 -DA:56,0 -BRDA:56,0,0,- -DA:57,0 -DA:60,0 -DA:62,0 -DA:64,0 -FN:82,ExcessivelySafeCall.excessivelySafeStaticCall -FNDA:0,ExcessivelySafeCall.excessivelySafeStaticCall -DA:89,0 -DA:90,0 -DA:91,0 -DA:97,0 -DA:106,0 -DA:107,0 -BRDA:107,1,0,- -DA:108,0 -DA:111,0 -DA:113,0 -DA:115,0 -FN:127,ExcessivelySafeCall.swapSelector -FNDA:0,ExcessivelySafeCall.swapSelector -DA:131,0 -BRDA:131,2,0,- -DA:132,0 -DA:134,0 -DA:137,0 -DA:140,0 -DA:141,0 -DA:142,0 -FNF:3 -FNH:0 -LF:27 -LH:0 -BRF:3 -BRH:0 -end_of_record -TN: -SF:src/Helpers/ReentrancyGuard.sol -FN:30,ReentrancyGuard.nonReentrant -FNDA:2783,ReentrancyGuard.nonReentrant -DA:31,2783 -DA:32,2783 -BRDA:32,0,0,2 -DA:33,2781 -DA:35,2652 -FN:41,ReentrancyGuard.reentrancyStorage -FNDA:5004,ReentrancyGuard.reentrancyStorage -DA:46,5004 -DA:49,5004 -FNF:2 -FNH:2 -LF:6 -LH:6 -BRF:1 -BRH:1 -end_of_record -TN: -SF:src/Helpers/SwapperV2.sol -FN:31,SwapperV2.noLeftovers -FNDA:63,SwapperV2.noLeftovers -DA:36,63 -DA:37,63 -BRDA:37,0,0,18 -BRDA:37,0,1,15 -DA:38,18 -DA:39,18 -DA:43,18 -DA:44,18 -DA:46,18 -BRDA:46,1,0,15 -DA:47,15 -DA:50,15 -BRDA:50,2,0,4 -DA:51,4 -DA:59,18 -FN:72,SwapperV2.noLeftoversReserve -FNDA:24,SwapperV2.noLeftoversReserve -DA:78,24 -DA:79,24 -BRDA:79,3,0,- -BRDA:79,3,1,- -DA:80,0 -DA:81,0 -DA:85,0 -DA:86,0 -DA:88,0 -BRDA:88,4,0,- -DA:89,0 -DA:92,0 -DA:95,0 -BRDA:95,5,0,- -DA:96,0 -DA:104,0 -FN:115,SwapperV2.refundExcessNative -FNDA:2253,SwapperV2.refundExcessNative -DA:116,2253 -DA:118,2134 -DA:120,2134 -BRDA:120,6,0,5 -DA:121,5 -FN:137,SwapperV2._depositAndSwap -FNDA:79,SwapperV2._depositAndSwap -DA:143,79 -DA:145,79 -BRDA:145,7,0,16 -DA:146,16 -DA:149,63 -DA:150,63 -DA:152,63 -BRDA:152,8,0,18 -DA:153,18 -DA:156,63 -DA:158,63 -DA:159,63 -DA:166,63 -DA:169,63 -BRDA:169,9,0,- -DA:170,0 -DA:173,63 -FN:182,SwapperV2._depositAndSwap -FNDA:32,SwapperV2._depositAndSwap -DA:189,32 -DA:191,32 -BRDA:191,10,0,8 -DA:192,8 -DA:195,24 -DA:196,24 -DA:198,24 -BRDA:198,11,0,10 -DA:199,10 -DA:202,24 -DA:204,24 -DA:205,24 -DA:210,24 -DA:212,24 -DA:215,24 -BRDA:215,12,0,10 -DA:216,10 -DA:219,24 -BRDA:219,13,0,- -DA:220,0 -DA:223,24 -FN:233,SwapperV2._executeSwaps -FNDA:63,SwapperV2._executeSwaps -DA:239,18 -DA:240,18 -DA:241,36 -DA:244,36 -DA:250,0 -BRDA:250,14,0,- -DA:252,36 -DA:255,36 -FN:263,SwapperV2._executeSwaps -FNDA:24,SwapperV2._executeSwaps -DA:276,0 -DA:277,0 -DA:278,0 -DA:281,0 -DA:287,0 -BRDA:287,15,0,- -DA:289,0 -DA:292,0 -FN:300,SwapperV2._fetchBalances -FNDA:87,SwapperV2._fetchBalances -DA:303,87 -DA:304,87 -DA:305,87 -DA:306,87 -DA:307,105 -DA:308,105 -DA:310,105 -BRDA:310,16,0,31 -DA:311,31 -DA:315,105 -DA:319,87 -FNF:8 -FNH:8 -LF:82 -LH:62 -BRF:19 -BRH:11 -end_of_record -TN: -SF:src/Helpers/TransferrableOwnership.sol -FN:25,TransferrableOwnership. -FNDA:87,TransferrableOwnership. -DA:26,87 -FN:29,TransferrableOwnership.onlyOwner -FNDA:8,TransferrableOwnership.onlyOwner -DA:30,8 -BRDA:30,0,0,3 -FN:36,TransferrableOwnership.transferOwnership -FNDA:20,TransferrableOwnership.transferOwnership -DA:37,16 -BRDA:37,1,0,4 -DA:38,12 -BRDA:38,2,0,4 -DA:39,8 -DA:40,8 -FN:44,TransferrableOwnership.cancelOwnershipTransfer -FNDA:0,TransferrableOwnership.cancelOwnershipTransfer -DA:45,0 -DA:46,0 -BRDA:46,3,0,- -DA:47,0 -FN:51,TransferrableOwnership.confirmOwnershipTransfer -FNDA:8,TransferrableOwnership.confirmOwnershipTransfer -DA:52,8 -DA:53,8 -BRDA:53,4,0,4 -DA:54,4 -DA:55,4 -DA:56,4 -FNF:5 -FNH:4 -LF:14 -LH:11 -BRF:5 -BRH:4 -end_of_record -TN: -SF:src/Helpers/Validatable.sol -FN:12,Validatable.validateBridgeData -FNDA:2733,Validatable.validateBridgeData -DA:13,2733 -BRDA:13,0,0,22 -DA:14,22 -DA:16,2711 -BRDA:16,1,0,22 -DA:17,22 -DA:19,2689 -BRDA:19,2,0,22 -DA:20,22 -FN:25,Validatable.noNativeAsset -FNDA:3,Validatable.noNativeAsset -DA:26,3 -BRDA:26,3,0,- -DA:27,0 -FN:32,Validatable.onlyAllowSourceToken -FNDA:520,Validatable.onlyAllowSourceToken -DA:36,520 -BRDA:36,4,0,- -DA:37,0 -FN:42,Validatable.onlyAllowDestinationChain -FNDA:260,Validatable.onlyAllowDestinationChain -DA:46,260 -BRDA:46,5,0,- -DA:47,0 -FN:52,Validatable.containsSourceSwaps -FNDA:144,Validatable.containsSourceSwaps -DA:53,144 -BRDA:53,6,0,- -DA:54,0 -FN:59,Validatable.doesNotContainSourceSwaps -FNDA:4805,Validatable.doesNotContainSourceSwaps -DA:60,23 -BRDA:60,7,0,23 -DA:61,23 -FN:66,Validatable.doesNotContainDestinationCalls -FNDA:2415,Validatable.doesNotContainDestinationCalls -DA:69,10 -BRDA:69,8,0,10 -DA:70,10 -FNF:7 -FNH:7 -LF:18 -LH:14 -BRF:9 -BRH:5 -end_of_record -TN: -SF:src/LiFiDiamond.sol -FN:13,LiFiDiamond. -FNDA:0,LiFiDiamond. -DA:14,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:25,0 -FN:31,LiFiDiamond. -FNDA:10566,LiFiDiamond. -DA:32,10566 -DA:33,10566 -DA:38,10566 -DA:42,10566 -DA:44,10566 -BRDA:44,0,0,- -DA:45,0 -DA:52,10566 -DA:54,10566 -DA:56,10566 -DA:59,10566 -DA:60,310 -DA:62,10256 -DA:63,10256 -FNF:2 -FNH:1 -LF:19 -LH:12 -BRF:1 -BRH:0 -end_of_record -TN: -SF:src/LiFiDiamondImmutable.sol -FN:13,LiFiDiamondImmutable. -FNDA:0,LiFiDiamondImmutable. -DA:14,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:25,0 -FN:31,LiFiDiamondImmutable. -FNDA:0,LiFiDiamondImmutable. -DA:32,0 -DA:33,0 -DA:38,0 -DA:42,0 -DA:44,0 -BRDA:44,0,0,- -DA:45,0 -DA:52,0 -DA:54,0 -DA:56,0 -DA:59,0 -DA:60,0 -DA:62,0 -DA:63,0 -FNF:2 -FNH:0 -LF:19 -LH:0 -BRF:1 -BRH:0 -end_of_record -TN: -SF:src/Libraries/LibAccess.sol -FN:25,LibAccess.accessStorage -FNDA:8,LibAccess.accessStorage -DA:30,8 -DA:33,8 -FN:40,LibAccess.addAccess -FNDA:2,LibAccess.addAccess -DA:41,2 -BRDA:41,0,0,- -DA:42,0 -DA:44,2 -DA:45,2 -DA:46,2 -FN:52,LibAccess.removeAccess -FNDA:1,LibAccess.removeAccess -DA:53,1 -DA:54,1 -DA:55,1 -FN:60,LibAccess.enforceAccessControl -FNDA:5,LibAccess.enforceAccessControl -DA:61,5 -DA:62,5 -DA:63,4 -BRDA:63,1,0,4 -FNF:4 -FNH:4 -LF:13 -LH:12 -BRF:2 -BRH:1 -end_of_record -TN: -SF:src/Libraries/LibAllowList.sol -FN:23,LibAllowList.addAllowedContract -FNDA:764,LibAllowList.addAllowedContract -DA:24,764 -DA:26,760 -DA:30,646 -DA:31,646 -FN:36,LibAllowList.contractIsAllowed -FNDA:262,LibAllowList.contractIsAllowed -DA:39,262 -FN:44,LibAllowList.removeAllowedContract -FNDA:6,LibAllowList.removeAllowedContract -DA:45,6 -DA:47,6 -BRDA:47,1,0,- -DA:48,0 -DA:51,6 -DA:53,6 -DA:55,6 -DA:56,7 -BRDA:56,2,0,6 -DA:58,6 -DA:60,6 -DA:61,6 -FN:67,LibAllowList.getAllowedContracts -FNDA:4,LibAllowList.getAllowedContracts -DA:68,4 -FN:73,LibAllowList.addAllowedSelector -FNDA:2251,LibAllowList.addAllowedSelector -DA:74,2251 -FN:79,LibAllowList.removeAllowedSelector -FNDA:0,LibAllowList.removeAllowedSelector -DA:80,0 -FN:85,LibAllowList.selectorIsAllowed -FNDA:164,LibAllowList.selectorIsAllowed -DA:86,164 -FN:90,LibAllowList._getStorage -FNDA:3447,LibAllowList._getStorage -DA:95,3447 -DA:98,3447 -FN:104,LibAllowList._checkAddress -FNDA:764,LibAllowList._checkAddress -DA:105,764 -BRDA:105,3,0,2 -DA:107,762 -BRDA:107,4,0,2 -FNF:9 -FNH:8 -LF:23 -LH:21 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src/Libraries/LibAsset.sol -FN:26,LibAsset.getOwnBalance -FNDA:766,LibAsset.getOwnBalance -DA:27,766 -DA:28,766 -FN:37,LibAsset.transferNativeAsset -FNDA:22,LibAsset.transferNativeAsset -DA:41,22 -BRDA:41,0,0,- -DA:42,22 -DA:43,0 -BRDA:43,1,0,- -DA:45,22 -DA:46,22 -BRDA:46,2,0,4 -FN:54,LibAsset.maxApproveERC20 -FNDA:5319,LibAsset.maxApproveERC20 -DA:59,5319 -BRDA:59,3,0,5319 -DA:60,5319 -DA:62,5316 -BRDA:62,4,0,- -DA:63,0 -DA:66,5316 -BRDA:66,5,0,5311 -DA:67,5311 -DA:68,5311 -FN:77,LibAsset.transferERC20 -FNDA:47,LibAsset.transferERC20 -DA:82,47 -BRDA:82,6,0,- -DA:83,0 -DA:85,47 -BRDA:85,7,0,- -DA:86,0 -DA:89,47 -DA:90,47 -BRDA:90,8,0,- -DA:91,0 -DA:93,47 -FN:101,LibAsset.transferFromERC20 -FNDA:5279,LibAsset.transferFromERC20 -DA:107,5279 -BRDA:107,9,0,- -DA:108,0 -DA:110,5279 -BRDA:110,10,0,- -DA:111,0 -DA:114,5279 -DA:115,5279 -DA:116,5279 -DA:117,5277 -BRDA:117,11,0,- -DA:118,0 -FN:122,LibAsset.depositAsset -FNDA:4817,LibAsset.depositAsset -DA:123,4817 -BRDA:123,12,0,- -DA:124,4817 -BRDA:124,13,0,39 -BRDA:124,13,1,4757 -DA:125,39 -BRDA:125,14,0,3 -DA:127,4778 -DA:128,4778 -BRDA:128,15,0,21 -DA:129,4757 -FN:133,LibAsset.depositAssets -FNDA:87,LibAsset.depositAssets -DA:134,87 -DA:135,105 -DA:136,88 -BRDA:136,16,0,88 -DA:137,88 -DA:140,105 -FN:148,LibAsset.isNativeAsset -FNDA:21641,LibAsset.isNativeAsset -DA:149,21641 -FN:159,LibAsset.transferAsset -FNDA:69,LibAsset.transferAsset -DA:164,69 -FN:170,LibAsset.isContract -FNDA:136,LibAsset.isContract -DA:171,136 -DA:174,136 -DA:176,136 -FNF:10 -FNH:10 -LF:47 -LH:39 -BRF:18 -BRH:8 -end_of_record -TN: -SF:src/Libraries/LibBytes.sol -FN:17,LibBytes.slice -FNDA:39,LibBytes.slice -DA:22,39 -BRDA:22,0,0,- -DA:23,39 -BRDA:23,1,0,- -DA:25,39 -DA:29,39 -DA:32,39 -DA:42,39 -DA:48,39 -DA:52,39 -DA:64,1044 -DA:65,1005 -DA:66,1005 -DA:67,1005 -DA:68,1005 -DA:71,39 -DA:75,39 -DA:78,0 -DA:79,0 -DA:82,0 -DA:84,0 -DA:88,39 -FN:91,LibBytes.toAddress -FNDA:0,LibBytes.toAddress -DA:95,0 -BRDA:95,2,0,- -DA:96,0 -DA:98,0 -DA:101,0 -DA:107,0 -FN:112,LibBytes.toHexString -FNDA:12,LibBytes.toHexString -DA:116,12 -DA:117,12 -DA:118,12 -DA:119,12 -DA:120,480 -DA:121,480 -DA:123,12 -BRDA:123,3,0,- -BRDA:123,3,1,12 -DA:124,12 -FNF:3 -FNH:2 -LF:33 -LH:24 -BRF:5 -BRH:1 -end_of_record -TN: -SF:src/Libraries/LibDiamond.sol -FN:54,LibDiamond.diamondStorage -FNDA:4473,LibDiamond.diamondStorage -DA:59,4473 -DA:62,4473 -FN:71,LibDiamond.setContractOwner -FNDA:1,LibDiamond.setContractOwner -DA:72,1 -DA:73,1 -DA:74,1 -DA:75,1 -FN:78,LibDiamond.contractOwner -FNDA:24,LibDiamond.contractOwner -DA:79,24 -FN:82,LibDiamond.enforceIsContractOwner -FNDA:1605,LibDiamond.enforceIsContractOwner -DA:83,1605 -DA:84,6 -BRDA:84,0,0,6 -FN:94,LibDiamond.diamondCut -FNDA:1437,LibDiamond.diamondCut -DA:99,1437 -DA:100,2835 -DA:101,2835 -BRDA:101,1,0,2835 -BRDA:101,1,1,- -DA:102,2835 -DA:106,0 -BRDA:106,2,0,- -BRDA:106,2,1,- -DA:107,0 -DA:111,0 -BRDA:111,3,0,- -BRDA:111,3,1,- -DA:112,0 -DA:117,0 -DA:120,2835 -DA:123,1437 -DA:124,1437 -FN:127,LibDiamond.addFunctions -FNDA:2835,LibDiamond.addFunctions -DA:131,2835 -BRDA:131,4,0,- -DA:132,0 -DA:134,2835 -DA:135,2835 -BRDA:135,5,0,- -DA:136,0 -DA:138,2835 -DA:142,2835 -BRDA:142,6,0,2835 -DA:143,2835 -DA:146,2835 -DA:147,14221 -DA:150,11386 -DA:151,11386 -DA:154,11386 -BRDA:154,7,0,- -DA:155,0 -DA:157,11386 -DA:159,11386 -DA:160,11386 -FN:165,LibDiamond.replaceFunctions -FNDA:0,LibDiamond.replaceFunctions -DA:169,0 -BRDA:169,8,0,- -DA:170,0 -DA:172,0 -DA:173,0 -BRDA:173,9,0,- -DA:174,0 -DA:176,0 -DA:180,0 -BRDA:180,10,0,- -DA:181,0 -DA:184,0 -DA:185,0 -DA:188,0 -DA:189,0 -DA:192,0 -BRDA:192,11,0,- -DA:193,0 -DA:195,0 -DA:196,0 -DA:198,0 -DA:199,0 -FN:204,LibDiamond.removeFunctions -FNDA:0,LibDiamond.removeFunctions -DA:208,0 -BRDA:208,12,0,- -DA:209,0 -DA:211,0 -DA:213,0 -BRDA:213,13,0,- -DA:214,0 -DA:217,0 -DA:218,0 -DA:221,0 -DA:222,0 -DA:225,0 -DA:227,0 -FN:232,LibDiamond.addFacet -FNDA:2835,LibDiamond.addFacet -DA:236,2835 -DA:237,2835 -DA:240,2835 -FN:243,LibDiamond.addFunction -FNDA:11386,LibDiamond.addFunction -DA:249,11386 -DA:252,11386 -DA:255,11386 -FN:258,LibDiamond.removeFunction -FNDA:0,LibDiamond.removeFunction -DA:263,0 -BRDA:263,14,0,- -DA:264,0 -DA:267,0 -BRDA:267,15,0,- -DA:268,0 -DA:271,0 -DA:274,0 -DA:279,0 -BRDA:279,16,0,- -DA:280,0 -DA:283,0 -DA:286,0 -DA:291,0 -DA:292,0 -DA:295,0 -BRDA:295,17,0,- -DA:297,0 -DA:298,0 -DA:301,0 -BRDA:301,18,0,- -DA:302,0 -DA:305,0 -DA:306,0 -DA:310,0 -DA:311,0 -FN:317,LibDiamond.initializeDiamondCut -FNDA:1437,LibDiamond.initializeDiamondCut -DA:321,1437 -BRDA:321,19,0,1429 -BRDA:321,19,1,- -DA:322,1429 -BRDA:322,20,0,- -DA:323,0 -DA:326,8 -BRDA:326,21,0,- -DA:327,0 -DA:329,8 -BRDA:329,22,0,8 -DA:330,8 -DA:333,8 -DA:334,8 -BRDA:334,23,0,- -DA:335,0 -BRDA:335,24,0,- -BRDA:335,24,1,- -DA:337,0 -DA:339,0 -FN:345,LibDiamond.enforceHasContractCode -FNDA:2843,LibDiamond.enforceHasContractCode -DA:346,2843 -DA:349,2843 -DA:351,2843 -BRDA:351,25,0,- -DA:352,0 -FNF:13 -FNH:10 -LF:110 -LH:46 -BRF:31 -BRH:5 -end_of_record -TN: -SF:src/Libraries/LibSwap.sol -FN:31,LibSwap.swap -FNDA:133,LibSwap.swap -DA:32,133 -BRDA:32,0,0,- -DA:33,133 -DA:34,133 -BRDA:34,1,0,- -DA:35,133 -DA:38,133 -DA:41,133 -DA:45,133 -BRDA:45,2,0,111 -DA:46,111 -DA:53,133 -BRDA:53,3,0,3 -DA:54,3 -DA:61,130 -DA:64,130 -BRDA:64,4,0,1 -DA:65,1 -DA:68,129 -DA:70,129 -FNF:1 -FNH:1 -LF:15 -LH:15 -BRF:5 -BRH:3 -end_of_record -TN: -SF:src/Libraries/LibUtil.sol -FN:10,LibUtil.getRevertMsg -FNDA:0,LibUtil.getRevertMsg -DA:14,0 -DA:15,0 -DA:16,0 -FN:22,LibUtil.isZeroAddress -FNDA:20622,LibUtil.isZeroAddress -DA:23,20622 -FN:26,LibUtil.revertWith -FNDA:9,LibUtil.revertWith -DA:28,9 -DA:29,9 -DA:30,9 -FNF:3 -FNH:2 -LF:7 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Libraries/OFTComposeMsgCodec.sol -FN:22,OFTComposeMsgCodec.encode -FNDA:3,OFTComposeMsgCodec.encode -DA:28,3 -FN:36,OFTComposeMsgCodec.nonce -FNDA:0,OFTComposeMsgCodec.nonce -DA:37,0 -FN:45,OFTComposeMsgCodec.srcEid -FNDA:0,OFTComposeMsgCodec.srcEid -DA:46,0 -FN:54,OFTComposeMsgCodec.amountLD -FNDA:2,OFTComposeMsgCodec.amountLD -DA:55,2 -FN:63,OFTComposeMsgCodec.composeFrom -FNDA:0,OFTComposeMsgCodec.composeFrom -DA:64,0 -FN:72,OFTComposeMsgCodec.composeMsg -FNDA:2,OFTComposeMsgCodec.composeMsg -DA:75,2 -FN:83,OFTComposeMsgCodec.addressToBytes32 -FNDA:35,OFTComposeMsgCodec.addressToBytes32 -DA:84,35 -FN:92,OFTComposeMsgCodec.bytes32ToAddress -FNDA:0,OFTComposeMsgCodec.bytes32ToAddress -DA:93,0 -FNF:8 -FNH:4 -LF:8 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Periphery/ERC20Proxy.sol -FN:22,ERC20Proxy. -FNDA:0,ERC20Proxy. -DA:23,0 -FN:29,ERC20Proxy.setAuthorizedCaller -FNDA:6,ERC20Proxy.setAuthorizedCaller -DA:33,6 -DA:34,6 -FN:42,ERC20Proxy.transferFrom -FNDA:2,ERC20Proxy.transferFrom -DA:48,2 -BRDA:48,0,0,- -DA:50,2 -FNF:3 -FNH:2 -LF:5 -LH:4 -BRF:1 -BRH:0 -end_of_record -TN: -SF:src/Periphery/Executor.sol -FN:30,Executor.noLeftovers -FNDA:13,Executor.noLeftovers -DA:34,13 -DA:35,13 -BRDA:35,0,0,3 -BRDA:35,0,1,9 -DA:36,3 -DA:37,3 -DA:38,3 -DA:42,3 -DA:43,15 -DA:45,15 -BRDA:45,1,0,9 -DA:46,9 -DA:47,9 -BRDA:47,2,0,9 -DA:48,9 -DA:56,15 -FN:67,Executor. -FNDA:0,Executor. -DA:68,0 -DA:69,0 -FN:79,Executor.swapAndCompleteBridgeTokens -FNDA:11,Executor.swapAndCompleteBridgeTokens -DA:85,11 -FN:101,Executor.swapAndExecute -FNDA:2,Executor.swapAndExecute -DA:108,2 -FN:127,Executor._processSwaps -FNDA:13,Executor._processSwaps -DA:135,13 -DA:136,13 -DA:137,13 -DA:139,13 -BRDA:139,3,0,10 -BRDA:139,3,1,3 -DA:140,10 -DA:142,3 -DA:147,13 -BRDA:147,4,0,11 -BRDA:147,4,1,2 -DA:148,11 -DA:149,9 -BRDA:149,5,0,9 -BRDA:149,5,1,2 -DA:150,9 -DA:154,9 -DA:156,2 -DA:164,2 -DA:169,13 -DA:171,9 -DA:172,9 -BRDA:172,6,0,4 -DA:173,4 -DA:180,9 -DA:184,9 -BRDA:184,7,0,5 -DA:185,5 -DA:192,9 -FN:205,Executor._executeSwaps -FNDA:13,Executor._executeSwaps -DA:210,3 -DA:211,3 -DA:212,18 -BRDA:212,8,0,- -DA:213,0 -DA:216,18 -DA:217,18 -DA:219,18 -FN:227,Executor._fetchBalances -FNDA:3,Executor._fetchBalances -DA:230,3 -DA:231,3 -DA:232,3 -DA:233,3 -DA:234,18 -DA:235,18 -DA:237,18 -BRDA:237,9,0,9 -DA:238,9 -DA:242,18 -DA:246,3 -FNF:7 -FNH:6 -LF:54 -LH:51 -BRF:14 -BRH:13 -end_of_record -TN: -SF:src/Periphery/FeeCollector.sol -FN:44,FeeCollector. -FNDA:26,FeeCollector. -FN:53,FeeCollector.collectTokenFees -FNDA:11,FeeCollector.collectTokenFees -DA:59,11 -DA:60,11 -DA:61,11 -DA:62,11 -FN:74,FeeCollector.collectNativeFees -FNDA:6,FeeCollector.collectNativeFees -DA:79,6 -DA:80,0 -BRDA:80,0,0,- -DA:81,6 -DA:82,6 -DA:83,6 -DA:85,6 -BRDA:85,1,0,1 -DA:87,1 -DA:90,1 -BRDA:90,2,0,- -DA:91,0 -DA:94,6 -FN:104,FeeCollector.withdrawIntegratorFees -FNDA:2,FeeCollector.withdrawIntegratorFees -DA:105,2 -DA:106,2 -BRDA:106,3,0,1 -DA:107,1 -DA:109,1 -DA:110,1 -DA:111,1 -FN:116,FeeCollector.batchWithdrawIntegratorFees -FNDA:1,FeeCollector.batchWithdrawIntegratorFees -DA:119,1 -DA:120,1 -DA:121,1 -DA:122,2 -DA:123,2 -BRDA:123,4,0,2 -DA:124,2 -DA:125,2 -DA:130,2 -DA:133,2 -FN:140,FeeCollector.withdrawLifiFees -FNDA:2,FeeCollector.withdrawLifiFees -DA:141,1 -DA:142,1 -BRDA:142,5,0,- -DA:143,0 -DA:145,1 -DA:146,1 -DA:147,1 -FN:152,FeeCollector.batchWithdrawLifiFees -FNDA:2,FeeCollector.batchWithdrawLifiFees -DA:155,1 -DA:156,1 -DA:157,1 -DA:158,2 -DA:159,2 -DA:160,2 -DA:165,2 -DA:167,2 -FN:175,FeeCollector.getTokenBalance -FNDA:8,FeeCollector.getTokenBalance -DA:179,8 -FN:184,FeeCollector.getLifiTokenBalance -FNDA:8,FeeCollector.getLifiTokenBalance -DA:187,8 -FNF:9 -FNH:9 -LF:45 -LH:42 -BRF:6 -BRH:3 -end_of_record -TN: -SF:src/Periphery/GasRebateDistributor.sol -FN:39,GasRebateDistributor. -FNDA:13,GasRebateDistributor. -DA:45,13 -DA:46,13 -DA:47,13 -DA:48,13 -FN:56,GasRebateDistributor.claim -FNDA:10,GasRebateDistributor.claim -DA:61,9 -DA:62,1 -BRDA:62,0,0,1 -DA:65,8 -BRDA:65,1,0,1 -DA:68,7 -DA:69,7 -DA:70,3 -BRDA:70,2,0,3 -DA:73,4 -DA:76,4 -DA:78,4 -FN:85,GasRebateDistributor.withdrawUnclaimed -FNDA:3,GasRebateDistributor.withdrawUnclaimed -DA:89,1 -DA:91,1 -DA:96,1 -DA:100,1 -FN:109,GasRebateDistributor.updateMerkleRoot -FNDA:3,GasRebateDistributor.updateMerkleRoot -DA:115,2 -DA:118,2 -DA:121,2 -DA:124,2 -FN:128,GasRebateDistributor.pauseContract -FNDA:3,GasRebateDistributor.pauseContract -DA:129,3 -FN:133,GasRebateDistributor.unpauseContract -FNDA:1,GasRebateDistributor.unpauseContract -DA:134,1 -FNF:6 -FNH:6 -LF:23 -LH:23 -BRF:3 -BRH:3 -end_of_record -TN: -SF:src/Periphery/LiFiDEXAggregator.sol -FN:50,LiFiDEXAggregator.lock -FNDA:0,LiFiDEXAggregator.lock -DA:51,0 -BRDA:51,0,0,- -BRDA:51,0,1,- -DA:52,0 -BRDA:52,1,0,- -BRDA:52,1,1,- -DA:53,0 -DA:55,0 -FN:58,LiFiDEXAggregator.onlyOwnerOrPriviledgedUser -FNDA:0,LiFiDEXAggregator.onlyOwnerOrPriviledgedUser -DA:59,0 -BRDA:59,2,0,- -BRDA:59,2,1,- -FN:66,LiFiDEXAggregator. -FNDA:0,LiFiDEXAggregator. -DA:67,0 -DA:68,0 -DA:70,0 -DA:71,0 -FN:75,LiFiDEXAggregator.setPriviledge -FNDA:0,LiFiDEXAggregator.setPriviledge -DA:76,0 -FN:79,LiFiDEXAggregator.pause -FNDA:0,LiFiDEXAggregator.pause -DA:80,0 -FN:83,LiFiDEXAggregator.resume -FNDA:0,LiFiDEXAggregator.resume -DA:84,0 -FN:96,LiFiDEXAggregator.processRoute -FNDA:0,LiFiDEXAggregator.processRoute -DA:104,0 -DA:105,0 -FN:123,LiFiDEXAggregator.transferValueAndprocessRoute -FNDA:0,LiFiDEXAggregator.transferValueAndprocessRoute -DA:133,0 -DA:136,0 -BRDA:136,3,0,- -DA:138,0 -DA:141,0 -DA:142,0 -FN:158,LiFiDEXAggregator.processRouteInternal -FNDA:0,LiFiDEXAggregator.processRouteInternal -DA:166,0 -DA:169,0 -DA:173,0 -DA:175,0 -DA:176,0 -DA:177,0 -DA:178,0 -DA:179,0 -BRDA:179,4,0,- -BRDA:179,4,1,- -DA:180,0 -DA:181,0 -BRDA:181,5,0,- -DA:182,0 -DA:183,0 -BRDA:183,6,0,- -BRDA:182,6,1,- -DA:184,0 -BRDA:184,7,0,- -BRDA:184,7,1,- -DA:185,0 -DA:186,0 -BRDA:186,8,0,- -DA:187,0 -BRDA:187,9,0,- -BRDA:187,9,1,- -DA:188,0 -BRDA:188,10,0,- -BRDA:188,10,1,- -DA:189,0 -BRDA:189,11,0,- -BRDA:189,11,1,- -DA:190,0 -DA:191,0 -DA:195,0 -DA:198,0 -BRDA:198,12,0,- -BRDA:198,12,1,- -DA:203,0 -DA:206,0 -DA:207,0 -BRDA:207,13,0,- -DA:211,0 -DA:213,0 -FN:227,LiFiDEXAggregator.applyPermit -FNDA:0,LiFiDEXAggregator.applyPermit -DA:228,0 -DA:229,0 -DA:230,0 -DA:231,0 -DA:232,0 -DA:233,0 -FN:246,LiFiDEXAggregator.processNative -FNDA:0,LiFiDEXAggregator.processNative -DA:249,0 -DA:250,0 -FN:256,LiFiDEXAggregator.processMyERC20 -FNDA:0,LiFiDEXAggregator.processMyERC20 -DA:259,0 -DA:260,0 -DA:262,0 -BRDA:262,14,0,- -DA:264,0 -FN:271,LiFiDEXAggregator.processUserERC20 -FNDA:0,LiFiDEXAggregator.processUserERC20 -DA:272,0 -DA:273,0 -FN:280,LiFiDEXAggregator.processOnePool -FNDA:0,LiFiDEXAggregator.processOnePool -DA:281,0 -DA:282,0 -FN:288,LiFiDEXAggregator.processInsideBento -FNDA:0,LiFiDEXAggregator.processInsideBento -DA:289,0 -DA:290,0 -DA:292,0 -BRDA:292,15,0,- -DA:294,0 -FN:302,LiFiDEXAggregator.distributeAndSwap -FNDA:0,LiFiDEXAggregator.distributeAndSwap -DA:308,0 -DA:310,0 -DA:311,0 -DA:312,0 -DA:314,0 -DA:315,0 -FN:325,LiFiDEXAggregator.swap -FNDA:0,LiFiDEXAggregator.swap -DA:331,0 -DA:332,0 -BRDA:332,16,0,- -BRDA:332,16,1,- -DA:333,0 -BRDA:333,17,0,- -BRDA:333,17,1,- -DA:334,0 -BRDA:334,18,0,- -BRDA:334,18,1,- -DA:335,0 -BRDA:335,19,0,- -BRDA:335,19,1,- -DA:336,0 -BRDA:336,20,0,- -BRDA:336,20,1,- -DA:337,0 -BRDA:337,21,0,- -BRDA:337,21,1,- -DA:338,0 -FN:346,LiFiDEXAggregator.wrapNative -FNDA:0,LiFiDEXAggregator.wrapNative -DA:352,0 -DA:353,0 -DA:355,0 -BRDA:355,22,0,- -BRDA:355,22,1,- -DA:357,0 -DA:358,0 -DA:359,0 -BRDA:359,23,0,- -DA:360,0 -DA:361,0 -BRDA:361,24,0,- -DA:364,0 -BRDA:364,25,0,- -DA:365,0 -DA:366,0 -BRDA:366,26,0,- -DA:371,0 -DA:373,0 -DA:374,0 -BRDA:374,27,0,- -BRDA:374,27,1,- -FN:386,LiFiDEXAggregator.bentoBridge -FNDA:0,LiFiDEXAggregator.bentoBridge -DA:392,0 -DA:393,0 -DA:395,0 -BRDA:395,28,0,- -BRDA:395,28,1,- -DA:398,0 -DA:399,0 -BRDA:399,29,0,- -BRDA:398,29,1,- -DA:400,0 -DA:401,0 -BRDA:401,30,0,- -BRDA:400,30,1,- -DA:408,0 -DA:413,0 -DA:416,0 -BRDA:416,31,0,- -BRDA:416,31,1,- -DA:417,0 -DA:418,0 -DA:419,0 -FN:428,LiFiDEXAggregator.swapUniV2 -FNDA:0,LiFiDEXAggregator.swapUniV2 -DA:434,0 -DA:435,0 -DA:436,0 -DA:437,0 -DA:439,0 -DA:440,0 -BRDA:440,32,0,- -BRDA:439,32,1,- -DA:441,0 -DA:442,0 -BRDA:442,33,0,- -DA:444,0 -DA:445,0 -BRDA:445,34,0,- -BRDA:445,34,1,- -DA:446,0 -DA:449,0 -DA:451,0 -DA:452,0 -DA:454,0 -DA:457,0 -FN:465,LiFiDEXAggregator.swapTrident -FNDA:0,LiFiDEXAggregator.swapTrident -DA:471,0 -DA:472,0 -DA:474,0 -BRDA:474,35,0,- -DA:475,0 -DA:478,0 -FN:486,LiFiDEXAggregator.swapUniV3 -FNDA:0,LiFiDEXAggregator.swapUniV3 -DA:492,0 -DA:493,0 -DA:494,0 -DA:496,0 -DA:497,0 -BRDA:497,36,0,- -DA:503,0 -DA:504,0 -DA:511,0 -BRDA:511,37,0,- -BRDA:511,37,1,- -FN:526,LiFiDEXAggregator.uniswapV3SwapCallback -FNDA:0,LiFiDEXAggregator.uniswapV3SwapCallback -DA:531,0 -BRDA:531,38,0,- -BRDA:531,38,1,- -DA:535,0 -DA:536,0 -BRDA:536,39,0,- -BRDA:536,39,1,- -DA:541,0 -DA:542,0 -DA:543,0 -FN:555,LiFiDEXAggregator.algebraSwapCallback -FNDA:0,LiFiDEXAggregator.algebraSwapCallback -DA:560,0 -FN:570,LiFiDEXAggregator.pancakeV3SwapCallback -FNDA:0,LiFiDEXAggregator.pancakeV3SwapCallback -DA:575,0 -FN:583,LiFiDEXAggregator.swapCurve -FNDA:0,LiFiDEXAggregator.swapCurve -DA:589,0 -DA:590,0 -DA:591,0 -DA:592,0 -DA:593,0 -DA:594,0 -DA:596,0 -DA:597,0 -BRDA:597,40,0,- -BRDA:597,40,1,- -DA:598,0 -DA:605,0 -DA:606,0 -BRDA:606,41,0,- -DA:611,0 -DA:612,0 -DA:613,0 -BRDA:613,42,0,- -BRDA:612,42,1,- -DA:620,0 -DA:623,0 -DA:624,0 -DA:627,0 -DA:631,0 -BRDA:631,43,0,- -DA:632,0 -BRDA:632,44,0,- -BRDA:632,44,1,- -DA:633,0 -DA:634,0 -BRDA:634,45,0,- -BRDA:634,45,1,- -DA:639,0 -FN:982,InputStream.createStream -FNDA:0,InputStream.createStream -DA:986,0 -DA:987,0 -DA:988,0 -DA:989,0 -DA:990,0 -FN:997,InputStream.isNotEmpty -FNDA:0,InputStream.isNotEmpty -DA:998,0 -DA:999,0 -DA:1001,0 -DA:1002,0 -DA:1004,0 -FN:1010,InputStream.readUint8 -FNDA:0,InputStream.readUint8 -DA:1012,0 -DA:1013,0 -DA:1014,0 -DA:1015,0 -FN:1022,InputStream.readUint16 -FNDA:0,InputStream.readUint16 -DA:1024,0 -DA:1025,0 -DA:1026,0 -DA:1027,0 -FN:1034,InputStream.readUint24 -FNDA:0,InputStream.readUint24 -DA:1036,0 -DA:1037,0 -DA:1038,0 -DA:1039,0 -FN:1046,InputStream.readUint32 -FNDA:0,InputStream.readUint32 -DA:1048,0 -DA:1049,0 -DA:1050,0 -DA:1051,0 -FN:1058,InputStream.readUint -FNDA:0,InputStream.readUint -DA:1060,0 -DA:1061,0 -DA:1062,0 -DA:1063,0 -FN:1070,InputStream.readBytes32 -FNDA:0,InputStream.readBytes32 -DA:1072,0 -DA:1073,0 -DA:1074,0 -DA:1075,0 -FN:1082,InputStream.readAddress -FNDA:0,InputStream.readAddress -DA:1084,0 -DA:1085,0 -DA:1086,0 -DA:1087,0 -FN:1094,InputStream.readBytes -FNDA:0,InputStream.readBytes -DA:1098,0 -DA:1099,0 -DA:1100,0 -DA:1101,0 -FN:1113,Approve.approveStable -FNDA:0,Approve.approveStable -DA:1118,0 -DA:1121,0 -FN:1132,Approve.approveSafe -FNDA:0,Approve.approveSafe -DA:1137,0 -DA:1138,0 -FN:1158,RebaseLibrary.toBase -FNDA:0,RebaseLibrary.toBase -DA:1162,0 -BRDA:1162,0,0,- -BRDA:1162,0,1,- -DA:1163,0 -DA:1165,0 -FN:1170,RebaseLibrary.toElastic -FNDA:0,RebaseLibrary.toElastic -DA:1174,0 -BRDA:1174,1,0,- -BRDA:1174,1,1,- -DA:1175,0 -DA:1177,0 -FNF:40 -FNH:0 -LF:219 -LH:0 -BRF:81 -BRH:0 -end_of_record -TN: -SF:src/Periphery/LiFuelFeeCollector.sol -FN:33,LiFuelFeeCollector. -FNDA:20,LiFuelFeeCollector. -FN:42,LiFuelFeeCollector.collectTokenGasFees -FNDA:262,LiFuelFeeCollector.collectTokenGasFees -DA:48,262 -DA:49,262 -FN:55,LiFuelFeeCollector.collectNativeGasFees -FNDA:4,LiFuelFeeCollector.collectNativeGasFees -DA:60,4 -DA:66,4 -DA:67,4 -BRDA:67,0,0,- -DA:68,0 -DA:69,0 -BRDA:69,1,0,- -DA:70,0 -FN:77,LiFuelFeeCollector.withdrawFees -FNDA:2,LiFuelFeeCollector.withdrawFees -DA:78,1 -DA:79,1 -DA:80,1 -FN:85,LiFuelFeeCollector.batchWithdrawFees -FNDA:1,LiFuelFeeCollector.batchWithdrawFees -DA:88,1 -DA:89,1 -DA:90,1 -DA:91,2 -DA:92,2 -DA:97,2 -DA:99,2 -FNF:5 -FNH:5 -LF:18 -LH:15 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src/Periphery/Receiver.sol -FN:33,Receiver.onlySGRouter -FNDA:2,Receiver.onlySGRouter -DA:34,2 -BRDA:34,0,0,- -DA:35,0 -FN:39,Receiver.onlyAmarokRouter -FNDA:2,Receiver.onlyAmarokRouter -DA:40,2 -BRDA:40,1,0,- -DA:41,0 -FN:47,Receiver. -FNDA:0,Receiver. -DA:54,0 -DA:55,0 -DA:56,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:60,0 -DA:61,0 -FN:74,Receiver.xReceive -FNDA:2,Receiver.xReceive -DA:82,2 -DA:87,2 -FN:105,Receiver.sgReceive -FNDA:2,Receiver.sgReceive -DA:113,2 -DA:118,2 -DA:123,2 -FN:138,Receiver.swapAndCompleteBridgeTokens -FNDA:0,Receiver.swapAndCompleteBridgeTokens -DA:144,0 -BRDA:144,2,0,- -BRDA:144,2,1,- -DA:145,0 -DA:154,0 -DA:158,0 -DA:159,0 -FN:174,Receiver.pullToken -FNDA:2,Receiver.pullToken -DA:179,1 -BRDA:179,3,0,- -BRDA:179,3,1,- -DA:181,0 -DA:182,0 -BRDA:182,4,0,- -DA:184,1 -FN:197,Receiver._swapAndCompleteBridgeTokens -FNDA:4,Receiver._swapAndCompleteBridgeTokens -DA:205,4 -DA:207,4 -BRDA:207,5,0,- -BRDA:207,5,1,2 -DA:209,0 -DA:210,0 -BRDA:210,6,0,- -DA:213,0 -DA:214,0 -BRDA:214,7,0,- -DA:216,0 -DA:223,0 -DA:229,0 -DA:233,0 -DA:235,0 -DA:236,0 -BRDA:236,8,0,- -DA:238,0 -DA:248,4 -DA:249,4 -DA:250,4 -DA:252,4 -BRDA:252,9,0,1 -DA:254,1 -DA:256,1 -DA:263,1 -DA:267,3 -DA:269,3 -DA:272,0 -DA:273,1 -DA:274,1 -DA:283,3 -FNF:8 -FNH:6 -LF:52 -LH:23 -BRF:13 -BRH:2 -end_of_record -TN: -SF:src/Periphery/ReceiverStargateV2.sol -FN:52,ReceiverStargateV2.onlyEndpointV2 -FNDA:5,ReceiverStargateV2.onlyEndpointV2 -DA:53,5 -BRDA:53,0,0,3 -DA:54,3 -FN:60,ReceiverStargateV2. -FNDA:8,ReceiverStargateV2. -DA:67,5 -DA:68,3 -DA:69,3 -DA:70,2 -DA:71,4 -FN:83,ReceiverStargateV2.lzCompose -FNDA:5,ReceiverStargateV2.lzCompose -DA:92,2 -BRDA:92,1,0,- -DA:95,2 -DA:98,2 -DA:102,2 -DA:108,2 -FN:121,ReceiverStargateV2.pullToken -FNDA:4,ReceiverStargateV2.pullToken -DA:126,3 -BRDA:126,2,0,2 -BRDA:126,2,1,1 -DA:128,2 -DA:129,2 -BRDA:129,3,0,1 -DA:131,1 -FN:143,ReceiverStargateV2._swapAndCompleteBridgeTokens -FNDA:2,ReceiverStargateV2._swapAndCompleteBridgeTokens -DA:150,2 -DA:152,2 -BRDA:152,4,0,1 -BRDA:152,4,1,1 -DA:154,1 -BRDA:154,5,0,- -DA:157,0 -DA:158,0 -BRDA:158,6,0,- -DA:160,0 -DA:167,0 -DA:173,1 -DA:177,0 -DA:179,1 -DA:180,1 -BRDA:180,7,0,- -DA:182,1 -DA:192,1 -DA:193,1 -DA:195,1 -BRDA:195,8,0,- -DA:197,0 -DA:199,0 -DA:206,0 -DA:210,1 -DA:212,1 -DA:215,0 -DA:216,0 -DA:217,0 -DA:226,1 -FNF:5 -FNH:5 -LF:40 -LH:29 -BRF:11 -BRH:6 -end_of_record -TN: -SF:src/Periphery/RelayerCelerIM.sol -FN:40,RelayerCelerIM.onlyCBridgeMessageBus -FNDA:2,RelayerCelerIM.onlyCBridgeMessageBus -DA:41,2 -BRDA:41,0,0,1 -FN:44,RelayerCelerIM.onlyDiamond -FNDA:268,RelayerCelerIM.onlyDiamond -DA:45,268 -BRDA:45,1,0,- -FN:51,RelayerCelerIM. -FNDA:0,RelayerCelerIM. -DA:56,0 -DA:57,0 -DA:58,0 -FN:73,RelayerCelerIM.executeMessageWithTransfer -FNDA:3,RelayerCelerIM.executeMessageWithTransfer -DA:87,2 -DA:92,2 -DA:97,2 -DA:106,2 -FN:117,RelayerCelerIM.executeMessageWithTransferRefund -FNDA:2,RelayerCelerIM.executeMessageWithTransferRefund -DA:128,1 -DA:134,1 -DA:136,1 -DA:144,1 -FN:153,RelayerCelerIM.sendTokenTransfer -FNDA:268,RelayerCelerIM.sendTokenTransfer -DA:164,268 -BRDA:164,2,0,263 -BRDA:164,2,1,- -DA:165,263 -DA:166,263 -BRDA:166,3,0,4 -BRDA:166,3,1,259 -DA:168,4 -DA:179,259 -DA:185,259 -DA:194,263 -DA:202,5 -DA:203,1 -BRDA:203,4,0,1 -BRDA:201,4,1,- -DA:204,1 -DA:205,1 -DA:210,1 -DA:217,1 -DA:225,4 -DA:226,1 -BRDA:226,5,0,1 -BRDA:224,5,1,- -DA:227,1 -DA:228,1 -DA:233,1 -DA:239,1 -DA:246,3 -DA:247,2 -BRDA:247,6,0,2 -BRDA:245,6,1,- -DA:248,2 -DA:249,2 -BRDA:249,7,0,1 -BRDA:249,7,1,1 -DA:251,1 -DA:260,1 -DA:265,1 -DA:274,1 -DA:275,1 -BRDA:275,8,0,1 -BRDA:273,8,1,- -DA:276,1 -DA:277,1 -DA:282,1 -DA:290,0 -DA:292,0 -BRDA:292,9,0,- -BRDA:289,9,1,- -DA:293,0 -DA:294,0 -DA:299,0 -DA:307,0 -FN:320,RelayerCelerIM.forwardSendMessageWithTransfer -FNDA:2,RelayerCelerIM.forwardSendMessageWithTransfer -DA:327,2 -FN:346,RelayerCelerIM._swapAndCompleteBridgeTokens -FNDA:2,RelayerCelerIM._swapAndCompleteBridgeTokens -DA:354,2 -DA:355,2 -DA:360,2 -BRDA:360,10,0,- -BRDA:360,10,1,1 -DA:362,0 -DA:368,0 -DA:369,0 -DA:370,0 -DA:372,0 -DA:373,0 -BRDA:373,11,0,- -DA:374,0 -DA:378,2 -DA:379,2 -DA:380,2 -DA:383,2 -DA:389,1 -DA:390,1 -DA:391,1 -DA:392,1 -DA:394,2 -DA:397,2 -BRDA:397,12,0,1 -DA:398,1 -FN:412,RelayerCelerIM.withdraw -FNDA:0,RelayerCelerIM.withdraw -DA:417,0 -BRDA:417,13,0,- -BRDA:417,13,1,- -DA:419,0 -DA:420,0 -BRDA:420,14,0,- -DA:421,0 -DA:424,0 -DA:426,0 -FN:435,RelayerCelerIM.triggerRefund -FNDA:1,RelayerCelerIM.triggerRefund -DA:442,1 -DA:446,1 -DA:447,0 -DA:448,0 -DA:449,0 -DA:450,0 -DA:451,0 -BRDA:451,15,0,- -DA:452,0 -DA:457,1 -DA:460,1 -BRDA:460,16,0,1 -BRDA:460,16,1,- -DA:461,1 -DA:462,1 -DA:463,1 -DA:465,0 -FNF:10 -FNH:8 -LF:92 -LH:63 -BRF:28 -BRH:13 -end_of_record -TN: -SF:src/Periphery/ServiceFeeCollector.sol -FN:39,ServiceFeeCollector. -FNDA:20,ServiceFeeCollector. -FN:47,ServiceFeeCollector.collectTokenInsuranceFees -FNDA:4,ServiceFeeCollector.collectTokenInsuranceFees -DA:52,4 -DA:53,4 -FN:58,ServiceFeeCollector.collectNativeInsuranceFees -FNDA:2,ServiceFeeCollector.collectNativeInsuranceFees -DA:59,2 -FN:68,ServiceFeeCollector.withdrawFees -FNDA:2,ServiceFeeCollector.withdrawFees -DA:69,1 -DA:70,1 -DA:71,1 -FN:76,ServiceFeeCollector.batchWithdrawFees -FNDA:1,ServiceFeeCollector.batchWithdrawFees -DA:79,1 -DA:80,1 -DA:81,1 -DA:82,2 -DA:83,2 -DA:88,2 -DA:90,2 -FNF:5 -FNH:5 -LF:13 -LH:13 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src/Periphery/TokenWrapper.sol -FN:27,TokenWrapper. -FNDA:0,TokenWrapper. -DA:28,0 -DA:29,0 -FN:35,TokenWrapper.deposit -FNDA:1,TokenWrapper.deposit -DA:36,1 -DA:37,1 -FN:41,TokenWrapper.withdraw -FNDA:1,TokenWrapper.withdraw -DA:46,1 -DA:47,1 -DA:48,1 -DA:49,1 -DA:50,1 -BRDA:50,0,0,- -DA:51,0 -FNF:3 -FNH:2 -LF:10 -LH:7 -BRF:1 -BRH:0 -end_of_record -TN: From 3ee3d935125c06db3838550bda5661227dafbe8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 16 Aug 2024 18:15:21 +0700 Subject: [PATCH 04/16] minor update --- src/Facets/CalldataVerificationFacet.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index cfa0569fb..9232c91a7 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -10,6 +10,7 @@ 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"; +import { console2 } from "forge-std/console2.sol"; /// @title Calldata Verification Facet /// @author LI.FI (https://li.fi) @@ -176,6 +177,7 @@ contract CalldataVerificationFacet { // 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) } if (_isGenericV3SingleSwap(functionSelector)) { From 7af5e5be644b7bccb11266e36c8a114e8521a5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 16 Aug 2024 18:23:47 +0700 Subject: [PATCH 05/16] remove console import --- src/Facets/CalldataVerificationFacet.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 9232c91a7..fb64e4828 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -10,7 +10,6 @@ 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"; -import { console2 } from "forge-std/console2.sol"; /// @title Calldata Verification Facet /// @author LI.FI (https://li.fi) From 51b585a2667308bdb89010bb5f8e4c92c09bb802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 11:04:06 +0700 Subject: [PATCH 06/16] gas optimization (audit issue #7) --- src/Facets/CalldataVerificationFacet.sol | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index fb64e4828..b83ce5a5f 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -68,7 +68,7 @@ contract CalldataVerificationFacet { function extractMainParameters( bytes calldata data ) - public + external pure returns ( string memory bridge, @@ -234,22 +234,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) && From afa7daba446baae397ead5d6c14f77b7d3eb3865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 21:45:00 +0700 Subject: [PATCH 07/16] adds handling for StargateV2 destination calls (audit issue #8) --- src/Facets/CalldataVerificationFacet.sol | 68 +++++++++- .../Facets/CalldataVerificationFacet.t.sol | 117 ++++++++++++++++++ 2 files changed, 184 insertions(+), 1 deletion(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index b83ce5a5f..5dfc1355f 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.17; import { ILiFi } from "../Interfaces/ILiFi.sol"; import { LibSwap } from "../Libraries/LibSwap.sol"; import { AmarokFacet } from "./AmarokFacet.sol"; +import { StargateFacetV2 } from "./StargateFacetV2.sol"; import { StargateFacet } from "./StargateFacet.sol"; import { CelerIMFacetBase, CelerIM } from "lifi/Helpers/CelerIMFacetBase.sol"; import { StandardizedCallFacet } from "lifi/Facets/StandardizedCallFacet.sol"; @@ -261,7 +262,7 @@ 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 Whether the destination calldata is validate function validateDestinationCalldata( @@ -280,6 +281,7 @@ contract CalldataVerificationFacet { bytes4 selector = abi.decode(callData, (bytes4)); + // --------------------------------------- // Case: Amarok if (selector == AmarokFacet.startBridgeTokensViaAmarok.selector) { (, AmarokFacet.AmarokData memory amarokData) = abi.decode( @@ -303,6 +305,7 @@ contract CalldataVerificationFacet { abi.decode(callTo, (address)) == amarokData.callTo; } + // --------------------------------------- // Case: Stargate if (selector == StargateFacet.startBridgeTokensViaStargate.selector) { (, StargateFacet.StargateData memory stargateData) = abi.decode( @@ -329,6 +332,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 @@ -416,4 +464,22 @@ contract CalldataVerificationFacet { functionSelector == GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector; } + + function _compareBytesToBytes32CallTo( + bytes calldata callTo, + bytes32 callToBytes32 + ) private pure returns (bool) { + // convert both values to address type and compare them + return + address(uint160(uint256(callToBytes32))) == + _bytesToAddress(callTo); + } + + function _bytesToAddress( + bytes memory bys + ) private pure returns (address addr) { + assembly { + addr := mload(add(bys, 32)) + } + } } diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 242cef4aa..993b2f6d7 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -6,6 +6,9 @@ import { HyphenFacet } from "lifi/Facets/HyphenFacet.sol"; import { AmarokFacet } from "lifi/Facets/AmarokFacet.sol"; import { MayanFacet } from "lifi/Facets/MayanFacet.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"; @@ -18,12 +21,16 @@ import { LibBytes } from "lifi/Libraries/LibBytes.sol"; import { MsgDataTypes } from "celer-network/contracts/message/libraries/MessageSenderLib.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({ @@ -50,6 +57,12 @@ contract CalldataVerificationFacetTest is TestBase { requiresDeposit: true }) ); + + // set facet address in TestBase + setFacetAddressInTestBase( + address(calldataVerificationFacet), + "CalldataVerificationFacet" + ); } function test_DeploysWithoutErrors() public { @@ -732,6 +745,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, @@ -849,3 +956,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); + } +} From 65aeb11253170fc480e72b6c9b3ad7abee9d6f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 21:50:50 +0700 Subject: [PATCH 08/16] gas optimization in extractGenericSwapParameters (audit issue #6) --- src/Facets/CalldataVerificationFacet.sol | 44 +++++++++--------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 5dfc1355f..a1846c741 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -153,10 +153,6 @@ contract CalldataVerificationFacet { uint256 receivingAmount ) { - LibSwap.SwapData[] memory swapData; - bytes4 functionSelector = bytes4(data[:4]); - bytes memory callData = data; - // valid callData for a genericSwap call should have at least 484 bytes: // Function selector: 4 bytes // _transactionId: 32 bytes @@ -165,10 +161,14 @@ contract CalldataVerificationFacet { // _receiver: 32 bytes // _minAmountOut: 32 bytes // _swapData: 256 bytes - if (callData.length < 484) { + if (data.length < 484) { revert InvalidCallData(); } + LibSwap.SwapData[] memory swapData; + bytes memory callData; + bytes4 functionSelector = bytes4(data[:4]); + // check if this is a call via StandardizedCallFacet if ( functionSelector == StandardizedCallFacet.standardizedCall.selector @@ -178,19 +178,26 @@ contract CalldataVerificationFacet { 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 (_isGenericV3SingleSwap(functionSelector)) { + if ( + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative.selector || + functionSelector == + GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector + ) { // single swap swapData = new LibSwap.SwapData[](1); // extract parameters from calldata - LibSwap.SwapData memory swapDataSingle; - (, , , receiver, receivingAmount, swapDataSingle) = abi.decode( + (, , , receiver, receivingAmount, swapData[0]) = abi.decode( callData.slice(4, callData.length - 4), (bytes32, string, string, address, uint256, LibSwap.SwapData) ); - swapData[0] = swapDataSingle; } else { // multi swap or GenericSwap V1 call (, , , receiver, receivingAmount, swapData) = abi.decode( @@ -203,13 +210,6 @@ contract CalldataVerificationFacet { sendingAssetId = swapData[0].sendingAssetId; amount = swapData[0].fromAmount; receivingAssetId = swapData[swapData.length - 1].receivingAssetId; - return ( - sendingAssetId, - amount, - receiver, - receivingAssetId, - receivingAmount - ); } /// @notice Validates the calldata @@ -453,18 +453,6 @@ contract CalldataVerificationFacet { ); } - function _isGenericV3SingleSwap( - bytes4 functionSelector - ) private pure returns (bool) { - return - functionSelector == - GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector || - functionSelector == - GenericSwapFacetV3.swapTokensSingleV3ERC20ToNative.selector || - functionSelector == - GenericSwapFacetV3.swapTokensSingleV3NativeToERC20.selector; - } - function _compareBytesToBytes32CallTo( bytes calldata callTo, bytes32 callToBytes32 From a4c2574f2f143dd732de02eeecb79db6c4864806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 21:57:34 +0700 Subject: [PATCH 09/16] update min callData length check (audit issue #4) --- src/Facets/CalldataVerificationFacet.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index a1846c741..23695a60b 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -161,7 +161,7 @@ contract CalldataVerificationFacet { // _receiver: 32 bytes // _minAmountOut: 32 bytes // _swapData: 256 bytes - if (data.length < 484) { + if (data.length <= 484) { revert InvalidCallData(); } From 2475ff1af105667cc2b866240bdbe735bd038cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 22:03:03 +0700 Subject: [PATCH 10/16] gas optimization in extractNonEVMAddress (audit issue #3) --- src/Facets/CalldataVerificationFacet.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 23695a60b..96eb87cb7 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -109,18 +109,19 @@ contract CalldataVerificationFacet { 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 From ecb03c81074c59ed3bfa7d401627a1ae3fefad88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 22:05:46 +0700 Subject: [PATCH 11/16] update comments, fix typo (audit issue#2) --- src/Facets/CalldataVerificationFacet.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 96eb87cb7..958e5b48d 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -103,9 +103,9 @@ 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) { @@ -225,7 +225,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 Whether the calldata is valid function validateCalldata( bytes calldata data, string calldata bridge, From 6a7b6b1acb8cb9463d9d2790a9469ffea3d54c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 29 Aug 2024 22:16:50 +0700 Subject: [PATCH 12/16] adds handling for AcrossV3 destination calls (audit issue #9) --- src/Facets/AcrossFacetV3.sol | 165 ++++++++++++++++++ src/Facets/CalldataVerificationFacet.sol | 32 ++++ src/Interfaces/IAcrossSpokePool.sol | 18 +- .../Facets/CalldataVerificationFacet.t.sol | 82 +++++++++ 4 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 src/Facets/AcrossFacetV3.sol diff --git a/src/Facets/AcrossFacetV3.sol b/src/Facets/AcrossFacetV3.sol new file mode 100644 index 000000000..445ce7ee3 --- /dev/null +++ b/src/Facets/AcrossFacetV3.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ILiFi } from "../Interfaces/ILiFi.sol"; +import { IAcrossSpokePool } from "../Interfaces/IAcrossSpokePool.sol"; +import { LibAsset } from "../Libraries/LibAsset.sol"; +import { LibSwap } from "../Libraries/LibSwap.sol"; +import { ReentrancyGuard } from "../Helpers/ReentrancyGuard.sol"; +import { SwapperV2 } from "../Helpers/SwapperV2.sol"; +import { Validatable } from "../Helpers/Validatable.sol"; +import { InformationMismatch } from "../Errors/GenericErrors.sol"; + +/// @title AcrossFacetV3 +/// @author LI.FI (https://li.fi) +/// @notice Provides functionality for bridging through Across Protocol +/// @custom:version 1.0.0 +contract AcrossFacetV3 is ILiFi, ReentrancyGuard, SwapperV2, Validatable { + /// Storage /// + + /// @notice The contract address of the spoke pool on the source chain. + IAcrossSpokePool public immutable spokePool; + + /// @notice The WETH address on the current chain. + address public immutable wrappedNative; + + /// Types /// + + /// @param receiverAddress The address that will receive the token on dst chain (our Receiver contract or the user-defined receiver address) + /// @param refundAddress The address that will be used for potential bridge refunds + /// @param receivingAssetId The address of the token to be received at destination chain + /// @param outputAmount The amount to be received at destination chain (after fees) + /// @param quoteTimestamp The timestamp of the Across quote that was used for this transaction + /// @param fillDeadline The destination chain timestamp until which the order can be filled + /// @param message Arbitrary data that can be used to pass additional information to the recipient along with the tokens + struct AcrossV3Data { + address receiverAddress; + address refundAddress; + address receivingAssetId; + uint256 outputAmount; + uint32 quoteTimestamp; + uint32 fillDeadline; + bytes message; + } + + /// Constructor /// + + /// @notice Initialize the contract. + /// @param _spokePool The contract address of the spoke pool on the source chain. + /// @param _wrappedNative The address of the wrapped native token on the source chain. + constructor(IAcrossSpokePool _spokePool, address _wrappedNative) { + spokePool = _spokePool; + wrappedNative = _wrappedNative; + } + + /// External Methods /// + + /// @notice Bridges tokens via Across + /// @param _bridgeData the core information needed for bridging + /// @param _acrossData data specific to Across + function startBridgeTokensViaAcrossV3( + ILiFi.BridgeData memory _bridgeData, + AcrossV3Data calldata _acrossData + ) + external + payable + nonReentrant + refundExcessNative(payable(msg.sender)) + validateBridgeData(_bridgeData) + doesNotContainSourceSwaps(_bridgeData) + { + LibAsset.depositAsset( + _bridgeData.sendingAssetId, + _bridgeData.minAmount + ); + _startBridge(_bridgeData, _acrossData); + } + + /// @notice Performs a swap before bridging via Across + /// @param _bridgeData the core information needed for bridging + /// @param _swapData an array of swap related data for performing swaps before bridging + /// @param _acrossData data specific to Across + function swapAndStartBridgeTokensViaAcrossV3( + ILiFi.BridgeData memory _bridgeData, + LibSwap.SwapData[] calldata _swapData, + AcrossV3Data calldata _acrossData + ) + external + payable + nonReentrant + refundExcessNative(payable(msg.sender)) + containsSourceSwaps(_bridgeData) + validateBridgeData(_bridgeData) + { + _bridgeData.minAmount = _depositAndSwap( + _bridgeData.transactionId, + _bridgeData.minAmount, + _swapData, + payable(msg.sender) + ); + _startBridge(_bridgeData, _acrossData); + } + + /// Internal Methods /// + + /// @dev Contains the business logic for the bridge via Across + /// @param _bridgeData the core information needed for bridging + /// @param _acrossData data specific to Across + function _startBridge( + ILiFi.BridgeData memory _bridgeData, + AcrossV3Data calldata _acrossData + ) internal { + // validate destination call flag + if (_acrossData.message.length > 0 != _bridgeData.hasDestinationCall) + revert InformationMismatch(); + + // ensure that receiver addresses match in case of no destination call + if ( + !_bridgeData.hasDestinationCall && + (_bridgeData.receiver != _acrossData.receiverAddress) + ) revert InformationMismatch(); + + // check if sendingAsset is native or ERC20 + if (LibAsset.isNativeAsset(_bridgeData.sendingAssetId)) { + // NATIVE + spokePool.depositV3{ value: _bridgeData.minAmount }( + _acrossData.refundAddress, // depositor (also acts as refund address in case release tx cannot be executed) + _acrossData.receiverAddress, // recipient (on dst) + wrappedNative, // inputToken + _acrossData.receivingAssetId, // outputToken + _bridgeData.minAmount, // inputAmount + _acrossData.outputAmount, // outputAmount + _bridgeData.destinationChainId, + address(0), // exclusiveRelayer (not used by us) + _acrossData.quoteTimestamp, + _acrossData.fillDeadline, + 0, // exclusivityDeadline (not used by us) + _acrossData.message + ); + } else { + // ERC20 + LibAsset.maxApproveERC20( + IERC20(_bridgeData.sendingAssetId), + address(spokePool), + _bridgeData.minAmount + ); + spokePool.depositV3( + _acrossData.refundAddress, // depositor (also acts as refund address in case release tx cannot be executed) + _acrossData.receiverAddress, // recipient (on dst) + _bridgeData.sendingAssetId, // inputToken + _acrossData.receivingAssetId, // outputToken + _bridgeData.minAmount, // inputAmount + _acrossData.outputAmount, // outputAmount + _bridgeData.destinationChainId, + address(0), // exclusiveRelayer (not used by us) + _acrossData.quoteTimestamp, + _acrossData.fillDeadline, + 0, // exclusivityDeadline (not used by us) + _acrossData.message + ); + } + + emit LiFiTransferStarted(_bridgeData); + } +} diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 958e5b48d..214479cc3 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -4,6 +4,7 @@ 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 { CelerIMFacetBase, CelerIM } from "lifi/Helpers/CelerIMFacetBase.sol"; @@ -403,6 +404,37 @@ contract CalldataVerificationFacet { keccak256(callTo) == keccak256(celerIMData.callTo); } + // --------------------------------------- + // 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; } diff --git a/src/Interfaces/IAcrossSpokePool.sol b/src/Interfaces/IAcrossSpokePool.sol index fe5e97b6c..382339079 100644 --- a/src/Interfaces/IAcrossSpokePool.sol +++ b/src/Interfaces/IAcrossSpokePool.sol @@ -1,6 +1,5 @@ // SPDX-License-Identifier: MIT -/// @custom:version 1.0.0 -pragma solidity 0.8.17; +pragma solidity ^0.8.17; interface IAcrossSpokePool { function deposit( @@ -13,4 +12,19 @@ interface IAcrossSpokePool { bytes memory message, // Arbitrary data that can be used to pass additional information to the recipient along with the tokens. uint256 maxCount // Used to protect the depositor from frontrunning to guarantee their quote remains valid. ) external payable; + + function depositV3( + address depositor, + address recipient, + address inputToken, + address outputToken, + uint256 inputAmount, + uint256 outputAmount, // <-- replaces fees + uint256 destinationChainId, + address exclusiveRelayer, + uint32 quoteTimestamp, + uint32 fillDeadline, + uint32 exclusivityDeadline, + bytes calldata message + ) external payable; } diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 993b2f6d7..462bcf471 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -5,6 +5,7 @@ import { CalldataVerificationFacet } from "lifi/Facets/CalldataVerificationFacet import { HyphenFacet } from "lifi/Facets/HyphenFacet.sol"; import { AmarokFacet } from "lifi/Facets/AmarokFacet.sol"; import { MayanFacet } from "lifi/Facets/MayanFacet.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"; @@ -918,6 +919,87 @@ contract CalldataVerificationFacetTest is TestBase { assertFalse(badCall); } + function test_CanValidateAcrossV3DestinationCalldata() public { + AcrossFacetV3.AcrossV3Data memory acrossData = AcrossFacetV3 + .AcrossV3Data({ + receiverAddress: USER_RECEIVER, + refundAddress: USER_REFUND, + receivingAssetId: ADDRESS_USDC, + outputAmount: (defaultUSDCAmount * 9) / 10, + quoteTimestamp: uint32(block.timestamp), + fillDeadline: uint32(uint32(block.timestamp) + 1000), + message: bytes("foobarbytes") + }); + + bytes memory callData = abi.encodeWithSelector( + AcrossFacetV3.startBridgeTokensViaAcrossV3.selector, + bridgeData, + acrossData + ); + + bytes memory callDataWithSwap = abi.encodeWithSelector( + AcrossFacetV3.swapAndStartBridgeTokensViaAcrossV3.selector, + bridgeData, + swapData, + acrossData + ); + + 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, + callData + ); + + 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_RevertsOnDestinationCalldataWithInvalidSelector() public { CelerIM.CelerIMData memory cimData = CelerIM.CelerIMData({ maxSlippage: 1, From 71ae339953bba9dbeb4db96687da2d600d00e12a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Mon, 2 Sep 2024 16:27:20 +0700 Subject: [PATCH 13/16] typo fixed in comment --- src/Facets/CalldataVerificationFacet.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 214479cc3..73842386e 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -226,7 +226,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 valid + /// @return isValid Returns true if the calldata is valid function validateCalldata( bytes calldata data, string calldata bridge, @@ -266,7 +266,7 @@ contract CalldataVerificationFacet { /// @param data The calldata to validate /// @param callTo The callTo address to validate /// @param dstCalldata The destination calldata to validate - /// @return isValid Whether the destination calldata is validate + /// @return isValid Returns true if the calldata is valid function validateDestinationCalldata( bytes calldata data, bytes calldata callTo, From 028bcc2b7f0d92ff0d195ba78dffe7f0c7c7a105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Mon, 2 Sep 2024 17:04:51 +0700 Subject: [PATCH 14/16] gas optimization --- src/Facets/CalldataVerificationFacet.sol | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index 73842386e..482d3e73a 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -487,20 +487,25 @@ contract CalldataVerificationFacet { } function _compareBytesToBytes32CallTo( - bytes calldata callTo, + bytes memory callTo, bytes32 callToBytes32 ) private pure returns (bool) { - // convert both values to address type and compare them - return - address(uint160(uint256(callToBytes32))) == - _bytesToAddress(callTo); - } + require( + callTo.length >= 20, + "Invalid callTo length; expected at least 20 bytes" + ); - function _bytesToAddress( - bytes memory bys - ) private pure returns (address addr) { + // Convert bytes to address type from callTo + address callToAddress; assembly { - addr := mload(add(bys, 32)) + callToAddress := mload(add(callTo, 32)) } + + // Convert callToBytes32 to address type and compare them + address callToAddressFromBytes32 = address( + uint160(uint256(callToBytes32)) + ); + + return callToAddress == callToAddressFromBytes32; } } From 9a93c457822e7734a9ce528a1959e9b02ec216d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Tue, 3 Sep 2024 08:32:40 +0700 Subject: [PATCH 15/16] updates audit log and adds audit report --- audit/auditLog.json | 10 ++++++++++ .../2024.09.02_CalldataVerificationFacet.pdf | Bin 0 -> 111703 bytes 2 files changed, 10 insertions(+) create mode 100644 audit/reports/2024.09.02_CalldataVerificationFacet.pdf diff --git a/audit/auditLog.json b/audit/auditLog.json index af918a2bb..376d72f1a 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -6,9 +6,19 @@ "auditorGitHandle": "sujithsomraaj", "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" } }, "auditedContracts": { + "CalldataVerificationFacet": { + "1.2.0": ["audit20240902"] + }, "StargateFacetV2": { "1.0.1": ["audit20240814"] } 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 From de8c0e16574288d712e8c62530a260035cc72c4e Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Sat, 11 Jan 2025 16:50:14 +0300 Subject: [PATCH 16/16] update log --- audit/auditLog.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/audit/auditLog.json b/audit/auditLog.json index aebfa39c6..50e1354a0 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -145,7 +145,9 @@ ] }, "CalldataVerificationFacet": { - "1.2.0": ["audit20240902"] + "1.2.0": [ + "audit20240902" + ] }, "DeBridgeDlnFacet": { "1.0.0": [ @@ -191,6 +193,11 @@ "audit20250110_1" ] }, + "IAcrossSpokePool": { + "1.0.0": [ + "audit20250106" + ] + }, "IGasZip": { "1.0.0": [ "audit20241107"