From 60e902491e259e426d83f3ce3a9c394dec6a6668 Mon Sep 17 00:00:00 2001 From: Daniel <77058885+0xDEnYO@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:48:18 +0700 Subject: [PATCH 1/3] Update CalldataVerificationFacet [CalldataVerificationFacet v1.3.0] (#1003) * merge changes from standardizedCall deprecation * add changes from stargateV1 and Amarok deprecation * remove import duplicate * gas optimization (audit issue #1 and #2) * audit report added * fix path --- audit/auditLog.json | 10 +- ...2.20_CalldataVerificationFacet(v1.3.0).pdf | Bin 0 -> 67674 bytes src/Facets/CalldataVerificationFacet.sol | 138 +----- .../Facets/CalldataVerificationFacet.t.sol | 457 ------------------ 4 files changed, 22 insertions(+), 583 deletions(-) create mode 100644 audit/reports/2025.02.20_CalldataVerificationFacet(v1.3.0).pdf diff --git a/audit/auditLog.json b/audit/auditLog.json index 2405449a3..27131b81a 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -160,6 +160,13 @@ "auditorGitHandle": "sujithsomraaj", "auditReportPath": "./audit/reports/2025.01.17_LiFiDexAggregator(v1.4.0).pdf", "auditCommitHash": "n/a (one deployed contract instance was audited)" + }, + "audit20250220": { + "auditCompletedOn": "20.02.2025", + "auditedBy": "Sujith Somraaj (individual security researcher)", + "auditorGitHandle": "sujithsomraaj", + "auditReportPath": "./audit/reports/2025.02.20_CalldataVerificationFacet(v1.3.0).pdf", + "auditCommitHash": "48427d21160585f276d206f0e103ce6bd42c4c03" } }, "auditedContracts": { @@ -172,7 +179,8 @@ "1.2.0": ["audit20241206"] }, "CalldataVerificationFacet": { - "1.2.0": ["audit20240902"] + "1.2.0": ["audit20240902"], + "1.3.0": ["audit20250220"] }, "DeBridgeDlnFacet": { "1.0.0": ["audit20241205"] diff --git a/audit/reports/2025.02.20_CalldataVerificationFacet(v1.3.0).pdf b/audit/reports/2025.02.20_CalldataVerificationFacet(v1.3.0).pdf new file mode 100644 index 0000000000000000000000000000000000000000..e6cf688a1a158aa7d83fa6796a4cae1f7ee3c49e GIT binary patch literal 67674 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 literal 0 HcmV?d00001 diff --git a/src/Facets/CalldataVerificationFacet.sol b/src/Facets/CalldataVerificationFacet.sol index b664ed231..f54c1bd79 100644 --- a/src/Facets/CalldataVerificationFacet.sol +++ b/src/Facets/CalldataVerificationFacet.sol @@ -3,13 +3,9 @@ pragma solidity ^0.8.17; import { ILiFi } from "../Interfaces/ILiFi.sol"; import { LibSwap } from "../Libraries/LibSwap.sol"; -import { AmarokFacet } from "./AmarokFacet.sol"; import { AcrossFacetV3 } from "./AcrossFacetV3.sol"; import { StargateFacetV2 } from "./StargateFacetV2.sol"; -import { StargateFacet } from "./StargateFacet.sol"; -import { AcrossFacetV3 } from "./AcrossFacetV3.sol"; import { CelerIMFacetBase, CelerIM } from "lifi/Helpers/CelerIMFacetBase.sol"; -import { StandardizedCallFacet } from "lifi/Facets/StandardizedCallFacet.sol"; import { LibBytes } from "../Libraries/LibBytes.sol"; import { GenericSwapFacetV3 } from "lifi/Facets/GenericSwapFacetV3.sol"; import { InvalidCallData } from "../Errors/GenericErrors.sol"; @@ -17,7 +13,7 @@ import { InvalidCallData } from "../Errors/GenericErrors.sol"; /// @title CalldataVerificationFacet /// @author LI.FI (https://li.fi) /// @notice Provides functionality for verifying calldata -/// @custom:version 1.2.0 +/// @custom:version 1.3.0 contract CalldataVerificationFacet { using LibBytes for bytes; @@ -111,16 +107,7 @@ contract CalldataVerificationFacet { function extractNonEVMAddress( bytes calldata data ) external pure returns (bytes32 nonEVMAddress) { - bytes memory callData; - - if ( - bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector - ) { - // standardizedCall - callData = abi.decode(data[4:], (bytes)); - } else { - callData = data; - } + bytes memory callData = data; // Non-EVM address is always the first parameter of bridge specific data if (_extractBridgeData(data).hasSourceSwaps) { @@ -169,22 +156,8 @@ contract CalldataVerificationFacet { } 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 - ) { - // extract nested function selector and calldata - // will always start at position 68 - functionSelector = bytes4(data[68:72]); - callData = data[68:]; - // callData = abi.decode(data[4:], (bytes)); // this one is also valid, even though the calldata differs slightly (add. padding) - } else { - callData = data; - } - if ( functionSelector == GenericSwapFacetV3.swapTokensSingleV3ERC20ToERC20.selector || @@ -198,13 +171,13 @@ contract CalldataVerificationFacet { // extract parameters from calldata (, , , receiver, receivingAmount, swapData[0]) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (bytes32, string, string, address, uint256, LibSwap.SwapData) ); } else { // multi swap or GenericSwap V1 call (, , , receiver, receivingAmount, swapData) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (bytes32, string, string, address, uint256, LibSwap.SwapData[]) ); } @@ -273,68 +246,7 @@ contract CalldataVerificationFacet { bytes calldata callTo, bytes calldata dstCalldata ) external pure returns (bool isValid) { - bytes memory callData = data; - - // Handle standardizedCall - if ( - bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector - ) { - callData = abi.decode(data[4:], (bytes)); - } - - bytes4 selector = abi.decode(callData, (bytes4)); - - // --------------------------------------- - // Case: Amarok - if (selector == AmarokFacet.startBridgeTokensViaAmarok.selector) { - (, AmarokFacet.AmarokData memory amarokData) = abi.decode( - callData.slice(4, callData.length - 4), - (ILiFi.BridgeData, AmarokFacet.AmarokData) - ); - - return - keccak256(dstCalldata) == keccak256(amarokData.callData) && - abi.decode(callTo, (address)) == amarokData.callTo; - } - if ( - selector == AmarokFacet.swapAndStartBridgeTokensViaAmarok.selector - ) { - (, , AmarokFacet.AmarokData memory amarokData) = abi.decode( - callData.slice(4, callData.length - 4), - (ILiFi.BridgeData, LibSwap.SwapData[], AmarokFacet.AmarokData) - ); - return - keccak256(dstCalldata) == keccak256(amarokData.callData) && - abi.decode(callTo, (address)) == amarokData.callTo; - } - - // --------------------------------------- - // Case: Stargate - if (selector == StargateFacet.startBridgeTokensViaStargate.selector) { - (, StargateFacet.StargateData memory stargateData) = abi.decode( - callData.slice(4, callData.length - 4), - (ILiFi.BridgeData, StargateFacet.StargateData) - ); - return - keccak256(dstCalldata) == keccak256(stargateData.callData) && - keccak256(callTo) == keccak256(stargateData.callTo); - } - if ( - selector == - StargateFacet.swapAndStartBridgeTokensViaStargate.selector - ) { - (, , StargateFacet.StargateData memory stargateData) = abi.decode( - callData.slice(4, callData.length - 4), - ( - ILiFi.BridgeData, - LibSwap.SwapData[], - StargateFacet.StargateData - ) - ); - return - keccak256(dstCalldata) == keccak256(stargateData.callData) && - keccak256(callTo) == keccak256(stargateData.callTo); - } + bytes4 selector = bytes4(data[:4]); // --------------------------------------- // Case: StargateV2 @@ -344,7 +256,7 @@ contract CalldataVerificationFacet { ) { (, StargateFacetV2.StargateData memory stargateDataV2) = abi .decode( - callData.slice(4, callData.length - 4), + data[4:], (ILiFi.BridgeData, StargateFacetV2.StargateData) ); @@ -362,7 +274,7 @@ contract CalldataVerificationFacet { ) { (, , StargateFacetV2.StargateData memory stargateDataV2) = abi .decode( - callData.slice(4, callData.length - 4), + data[4:], ( ILiFi.BridgeData, LibSwap.SwapData[], @@ -385,7 +297,7 @@ contract CalldataVerificationFacet { selector == CelerIMFacetBase.startBridgeTokensViaCelerIM.selector ) { (, CelerIM.CelerIMData memory celerIMData) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (ILiFi.BridgeData, CelerIM.CelerIMData) ); return @@ -397,7 +309,7 @@ contract CalldataVerificationFacet { CelerIMFacetBase.swapAndStartBridgeTokensViaCelerIM.selector ) { (, , CelerIM.CelerIMData memory celerIMData) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (ILiFi.BridgeData, LibSwap.SwapData[], CelerIM.CelerIMData) ); return @@ -407,7 +319,7 @@ contract CalldataVerificationFacet { // Case: AcrossV3 if (selector == AcrossFacetV3.startBridgeTokensViaAcrossV3.selector) { (, AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (ILiFi.BridgeData, AcrossFacetV3.AcrossV3Data) ); @@ -421,7 +333,7 @@ contract CalldataVerificationFacet { AcrossFacetV3.swapAndStartBridgeTokensViaAcrossV3.selector ) { (, , AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], ( ILiFi.BridgeData, LibSwap.SwapData[], @@ -438,7 +350,7 @@ contract CalldataVerificationFacet { // Case: AcrossV3 if (selector == AcrossFacetV3.startBridgeTokensViaAcrossV3.selector) { (, AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], (ILiFi.BridgeData, AcrossFacetV3.AcrossV3Data) ); @@ -452,7 +364,7 @@ contract CalldataVerificationFacet { AcrossFacetV3.swapAndStartBridgeTokensViaAcrossV3.selector ) { (, , AcrossFacetV3.AcrossV3Data memory acrossV3Data) = abi.decode( - callData.slice(4, callData.length - 4), + data[4:], ( ILiFi.BridgeData, LibSwap.SwapData[], @@ -477,18 +389,6 @@ contract CalldataVerificationFacet { function _extractBridgeData( bytes calldata data ) internal pure returns (ILiFi.BridgeData memory bridgeData) { - if ( - bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector - ) { - // StandardizedCall - bytes memory unwrappedData = abi.decode(data[4:], (bytes)); - bridgeData = abi.decode( - unwrappedData.slice(4, unwrappedData.length - 4), - (ILiFi.BridgeData) - ); - return bridgeData; - } - // normal call bridgeData = abi.decode(data[4:], (ILiFi.BridgeData)); } @@ -498,18 +398,6 @@ contract CalldataVerificationFacet { function _extractSwapData( bytes calldata data ) internal pure returns (LibSwap.SwapData[] memory swapData) { - if ( - bytes4(data[:4]) == StandardizedCallFacet.standardizedCall.selector - ) { - // standardizedCall - bytes memory unwrappedData = abi.decode(data[4:], (bytes)); - (, swapData) = abi.decode( - unwrappedData.slice(4, unwrappedData.length - 4), - (ILiFi.BridgeData, LibSwap.SwapData[]) - ); - return swapData; - } - // normal call (, swapData) = abi.decode( data[4:], (ILiFi.BridgeData, LibSwap.SwapData[]) diff --git a/test/solidity/Facets/CalldataVerificationFacet.t.sol b/test/solidity/Facets/CalldataVerificationFacet.t.sol index 1637190ac..717e9ce46 100644 --- a/test/solidity/Facets/CalldataVerificationFacet.t.sol +++ b/test/solidity/Facets/CalldataVerificationFacet.t.sol @@ -2,13 +2,10 @@ pragma solidity ^0.8.17; import { CalldataVerificationFacet } from "lifi/Facets/CalldataVerificationFacet.sol"; -import { AmarokFacet } from "lifi/Facets/AmarokFacet.sol"; import { MayanFacet } from "lifi/Facets/MayanFacet.sol"; import { AcrossFacetV3 } from "lifi/Facets/AcrossFacetV3.sol"; -import { StargateFacet } from "lifi/Facets/StargateFacet.sol"; import { StargateFacetV2 } from "lifi/Facets/StargateFacetV2.sol"; import { IStargate } from "lifi/Interfaces/IStargate.sol"; -import { StandardizedCallFacet } from "lifi/Facets/StandardizedCallFacet.sol"; import { CelerIM, CelerIMFacetBase } from "lifi/Helpers/CelerIMFacetBase.sol"; import { GenericSwapFacet } from "lifi/Facets/GenericSwapFacet.sol"; import { GenericSwapFacetV3 } from "lifi/Facets/GenericSwapFacetV3.sol"; @@ -75,22 +72,11 @@ contract CalldataVerificationFacetTest is TestBase { swapData ); - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - bytes memory fullCalldata = bytes.concat(callData, "extra stuff"); calldataVerificationFacet.extractBridgeData(fullCalldata); calldataVerificationFacet.extractSwapData(fullCalldata); calldataVerificationFacet.extractData(fullCalldata); calldataVerificationFacet.extractMainParameters(fullCalldata); - - fullCalldata = bytes.concat(standardizedCallData, "extra stuff"); - calldataVerificationFacet.extractBridgeData(fullCalldata); - calldataVerificationFacet.extractSwapData(fullCalldata); - calldataVerificationFacet.extractData(fullCalldata); - calldataVerificationFacet.extractMainParameters(fullCalldata); } function test_CanExtractBridgeData() public { @@ -116,18 +102,6 @@ contract CalldataVerificationFacetTest is TestBase { .extractSwapData(callData); checkSwapData(returnedData); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - - returnedData = calldataVerificationFacet.extractSwapData( - standardizedCallData - ); - - checkSwapData(returnedData); } function test_CanExtractBridgeAndSwapData() public { @@ -145,17 +119,6 @@ contract CalldataVerificationFacetTest is TestBase { checkBridgeData(returnedBridgeData); checkSwapData(returnedSwapData); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - (returnedBridgeData, returnedSwapData) = calldataVerificationFacet - .extractData(standardizedCallData); - - checkBridgeData(returnedBridgeData); - checkSwapData(returnedSwapData); } function test_CanExtractBridgeAndSwapDataNoSwaps() public { @@ -171,17 +134,6 @@ contract CalldataVerificationFacetTest is TestBase { checkBridgeData(returnedBridgeData); assertEq(returnedSwapData.length, 0); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - (returnedBridgeData, returnedSwapData) = calldataVerificationFacet - .extractData(standardizedCallData); - - checkBridgeData(returnedBridgeData); - assertEq(returnedSwapData.length, 0); } function test_CanExtractNonEVMAddress() public { @@ -202,17 +154,6 @@ contract CalldataVerificationFacetTest is TestBase { .extractNonEVMAddress(callData); assertEq(returnedNonEVMAddress, bytes32("Just some address")); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - returnedNonEVMAddress = calldataVerificationFacet.extractNonEVMAddress( - standardizedCallData - ); - - assertEq(returnedNonEVMAddress, bytes32("Just some address")); } function test_CanExtractNonEVMAddressWithSwaps() public { @@ -236,17 +177,6 @@ contract CalldataVerificationFacetTest is TestBase { .extractNonEVMAddress(callData); assertEq(returnedNonEVMAddress, bytes32("Just some address")); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - returnedNonEVMAddress = calldataVerificationFacet.extractNonEVMAddress( - standardizedCallData - ); - - assertEq(returnedNonEVMAddress, bytes32("Just some address")); } function test_CanExtractMainParameters() public { @@ -272,32 +202,6 @@ contract CalldataVerificationFacetTest is TestBase { assertEq(destinationChainId, bridgeData.destinationChainId); assertEq(hasSourceSwaps, bridgeData.hasSourceSwaps); assertEq(hasDestinationCall, bridgeData.hasDestinationCall); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - - ( - bridge, - sendingAssetId, - receiver, - minAmount, - destinationChainId, - hasSourceSwaps, - hasDestinationCall - ) = calldataVerificationFacet.extractMainParameters( - standardizedCallData - ); - - assertEq(bridge, bridgeData.bridge); - assertEq(receiver, bridgeData.receiver); - assertEq(sendingAssetId, bridgeData.sendingAssetId); - assertEq(minAmount, bridgeData.minAmount); - assertEq(destinationChainId, bridgeData.destinationChainId); - assertEq(hasSourceSwaps, bridgeData.hasSourceSwaps); - assertEq(hasDestinationCall, bridgeData.hasDestinationCall); } function test_RevertsOnInvalidGenericSwapCallData() public { @@ -394,30 +298,6 @@ contract CalldataVerificationFacetTest is TestBase { 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 { @@ -447,30 +327,6 @@ contract CalldataVerificationFacetTest is TestBase { 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_CanExtractMainParametersWithSwap() public { @@ -498,31 +354,6 @@ contract CalldataVerificationFacetTest is TestBase { assertEq(destinationChainId, bridgeData.destinationChainId); assertEq(hasSourceSwaps, bridgeData.hasSourceSwaps); assertEq(hasDestinationCall, bridgeData.hasDestinationCall); - - // standardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - ( - bridge, - sendingAssetId, - receiver, - minAmount, - destinationChainId, - hasSourceSwaps, - hasDestinationCall - ) = calldataVerificationFacet.extractMainParameters( - standardizedCallData - ); - - assertEq(bridge, bridgeData.bridge); - assertEq(receiver, bridgeData.receiver); - assertEq(sendingAssetId, swapData[0].sendingAssetId); - assertEq(minAmount, swapData[0].fromAmount); - assertEq(destinationChainId, bridgeData.destinationChainId); - assertEq(hasSourceSwaps, bridgeData.hasSourceSwaps); - assertEq(hasDestinationCall, bridgeData.hasDestinationCall); } function test_CanValidateCalldata() public { @@ -553,195 +384,6 @@ contract CalldataVerificationFacetTest is TestBase { ); assertTrue(validCall); assertFalse(invalidCall); - - // StandardizedCall - bytes memory standardizedCallData = abi.encodeWithSelector( - StandardizedCallFacet.standardizedCall.selector, - callData - ); - - validCall = calldataVerificationFacet.validateCalldata( - standardizedCallData, - bridgeData.bridge, - bridgeData.sendingAssetId, - bridgeData.receiver, - bridgeData.minAmount, - bridgeData.destinationChainId, - bridgeData.hasSourceSwaps, - bridgeData.hasDestinationCall - ); - invalidCall = calldataVerificationFacet.validateCalldata( - standardizedCallData, - bridgeData.bridge, - bridgeData.sendingAssetId, - address(0xb33f), - bridgeData.minAmount, - bridgeData.destinationChainId, - bridgeData.hasSourceSwaps, - bridgeData.hasDestinationCall - ); - assertTrue(validCall); - assertFalse(invalidCall); - } - - function test_CanValidateAmarokDestinationCalldata() public { - AmarokFacet.AmarokData memory amarokData = AmarokFacet.AmarokData({ - callData: bytes("foobarbytes"), - callTo: USER_RECEIVER, - relayerFee: 0, - slippageTol: 0, - delegate: USER_RECEIVER, - destChainDomainId: 1234, - payFeeWithSendingAsset: false - }); - - bytes memory callData = abi.encodeWithSelector( - AmarokFacet.startBridgeTokensViaAmarok.selector, - bridgeData, - amarokData - ); - - bytes memory callDataWithSwap = abi.encodeWithSelector( - AmarokFacet.swapAndStartBridgeTokensViaAmarok.selector, - bridgeData, - swapData, - amarokData - ); - - 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_CanValidateStargateDestinationCalldata() public { - StargateFacet.StargateData memory sgData = StargateFacet.StargateData({ - srcPoolId: 1, - dstPoolId: 2, - minAmountLD: 3, - dstGasForCall: 4, - lzFee: 5, - refundAddress: payable(address(0x1234)), - callTo: abi.encode(USER_RECEIVER), - callData: bytes("foobarbytes") - }); - - bytes memory callData = abi.encodeWithSelector( - StargateFacet.startBridgeTokensViaStargate.selector, - bridgeData, - sgData - ); - - bytes memory callDataWithSwap = abi.encodeWithSelector( - StargateFacet.swapAndStartBridgeTokensViaStargate.selector, - bridgeData, - swapData, - sgData - ); - - 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_CanValidateStargateV2DestinationCalldata() public { @@ -803,39 +445,6 @@ contract CalldataVerificationFacetTest is TestBase { 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 { @@ -882,39 +491,6 @@ contract CalldataVerificationFacetTest is TestBase { 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_CanValidateAcrossV3DestinationCalldata() public { @@ -966,39 +542,6 @@ contract CalldataVerificationFacetTest is TestBase { 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 { From 9b0a805f9c6aa92d42af473759b264068705903a Mon Sep 17 00:00:00 2001 From: Daniel <77058885+0xDEnYO@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:06:13 +0700 Subject: [PATCH 2/3] deprecate LiFuelFacet and standardizedCallFacet (#999) * deprecated LiFuelFacet and standardizedCallFacet * bump version of CalldataVerificationFacet * replace testFail_ with testRevert_ pattern due to deprecation * added tests for DexManagerFacet * added test for AcrossFacetV3 * add tests for ownershipfacet * minor code improvements * fixed test --------- Co-authored-by: Ed Zynda --- {docs => archive/docs}/LIFuelFacet.md | 0 {docs => archive/docs}/StandardizedCallFacet.md | 0 .../facets => archive/scripts/Deploy}/DeployLIFuelFacet.s.sol | 0 .../scripts/Deploy}/DeployStandardizedCallFacet.s.sol | 0 .../facets => archive/scripts/Deploy}/UpdateLIFuelFacet.s.sol | 0 .../scripts/Deploy}/UpdateStandardizedCallFacet.s.sol | 0 .../scripts/zkSync}/DeployStandardizedCallFacet.zksync.s.sol | 0 {src => archive/src}/Facets/LIFuelFacet.sol | 0 {src => archive/src}/Facets/StandardizedCallFacet.sol | 0 {test/solidity/Facets => archive/test}/LIFuelFacet.t.sol | 0 .../solidity/Facets => archive/test}/StandardizedCallFacet.t.sol | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename {docs => archive/docs}/LIFuelFacet.md (100%) rename {docs => archive/docs}/StandardizedCallFacet.md (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployLIFuelFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployStandardizedCallFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/UpdateLIFuelFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/UpdateStandardizedCallFacet.s.sol (100%) rename {script/deploy/zksync => archive/scripts/zkSync}/DeployStandardizedCallFacet.zksync.s.sol (100%) rename {src => archive/src}/Facets/LIFuelFacet.sol (100%) rename {src => archive/src}/Facets/StandardizedCallFacet.sol (100%) rename {test/solidity/Facets => archive/test}/LIFuelFacet.t.sol (100%) rename {test/solidity/Facets => archive/test}/StandardizedCallFacet.t.sol (100%) diff --git a/docs/LIFuelFacet.md b/archive/docs/LIFuelFacet.md similarity index 100% rename from docs/LIFuelFacet.md rename to archive/docs/LIFuelFacet.md diff --git a/docs/StandardizedCallFacet.md b/archive/docs/StandardizedCallFacet.md similarity index 100% rename from docs/StandardizedCallFacet.md rename to archive/docs/StandardizedCallFacet.md diff --git a/script/deploy/facets/DeployLIFuelFacet.s.sol b/archive/scripts/Deploy/DeployLIFuelFacet.s.sol similarity index 100% rename from script/deploy/facets/DeployLIFuelFacet.s.sol rename to archive/scripts/Deploy/DeployLIFuelFacet.s.sol diff --git a/script/deploy/facets/DeployStandardizedCallFacet.s.sol b/archive/scripts/Deploy/DeployStandardizedCallFacet.s.sol similarity index 100% rename from script/deploy/facets/DeployStandardizedCallFacet.s.sol rename to archive/scripts/Deploy/DeployStandardizedCallFacet.s.sol diff --git a/script/deploy/facets/UpdateLIFuelFacet.s.sol b/archive/scripts/Deploy/UpdateLIFuelFacet.s.sol similarity index 100% rename from script/deploy/facets/UpdateLIFuelFacet.s.sol rename to archive/scripts/Deploy/UpdateLIFuelFacet.s.sol diff --git a/script/deploy/facets/UpdateStandardizedCallFacet.s.sol b/archive/scripts/Deploy/UpdateStandardizedCallFacet.s.sol similarity index 100% rename from script/deploy/facets/UpdateStandardizedCallFacet.s.sol rename to archive/scripts/Deploy/UpdateStandardizedCallFacet.s.sol diff --git a/script/deploy/zksync/DeployStandardizedCallFacet.zksync.s.sol b/archive/scripts/zkSync/DeployStandardizedCallFacet.zksync.s.sol similarity index 100% rename from script/deploy/zksync/DeployStandardizedCallFacet.zksync.s.sol rename to archive/scripts/zkSync/DeployStandardizedCallFacet.zksync.s.sol diff --git a/src/Facets/LIFuelFacet.sol b/archive/src/Facets/LIFuelFacet.sol similarity index 100% rename from src/Facets/LIFuelFacet.sol rename to archive/src/Facets/LIFuelFacet.sol diff --git a/src/Facets/StandardizedCallFacet.sol b/archive/src/Facets/StandardizedCallFacet.sol similarity index 100% rename from src/Facets/StandardizedCallFacet.sol rename to archive/src/Facets/StandardizedCallFacet.sol diff --git a/test/solidity/Facets/LIFuelFacet.t.sol b/archive/test/LIFuelFacet.t.sol similarity index 100% rename from test/solidity/Facets/LIFuelFacet.t.sol rename to archive/test/LIFuelFacet.t.sol diff --git a/test/solidity/Facets/StandardizedCallFacet.t.sol b/archive/test/StandardizedCallFacet.t.sol similarity index 100% rename from test/solidity/Facets/StandardizedCallFacet.t.sol rename to archive/test/StandardizedCallFacet.t.sol From 46e2315d1d4ef35f31d403f018a62a06eeda3ef2 Mon Sep 17 00:00:00 2001 From: Daniel <77058885+0xDEnYO@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:11:22 +0700 Subject: [PATCH 3/3] Deprecate stargate v1 and amarok (#1002) * moved StargateV1, Amarok, Receiver to archive * moved other, already earlier deprecated files to archive * remove stargatev2 config from stargatev1.json * revert tsConfig changes --- {config => archive/config}/amarok.json | 0 {config => archive/config}/circle.json | 0 {config => archive/config}/hyphen.json | 0 {config => archive/config}/maker.json | 0 {config => archive/config}/multichain.json | 0 archive/config/stargateV1.json | 230 ++++++++++++++++++ {config => archive/config}/synapse.json | 0 {config => archive/config}/wormhole.json | 0 {docs => archive/docs}/AmarokFacet.md | 0 {docs => archive/docs}/Receiver.md | 0 {docs => archive/docs}/StargateFacet.md | 0 .../scripts/Deploy}/DeployAmarokFacet.s.sol | 0 .../Deploy}/DeployAmarokFacetPacked.s.sol | 0 .../scripts/Deploy}/DeployReceiver.s.sol | 0 .../scripts/Deploy}/DeployStargateFacet.s.sol | 0 .../scripts/Deploy}/UpdateAmarokFacet.s.sol | 0 .../Deploy}/UpdateAmarokFacetPacked.s.sol | 0 .../scripts/Deploy}/UpdateStargateFacet.s.sol | 0 .../AddChainIdsForStargateToDiamond.s.sol | 0 ...AddTokenApprovalsToAmarokFacetPacked.s.sol | 0 .../scripts}/demoScripts/demoAmarokBridge.ts | 0 .../scripts}/demoScripts/demoDeBridge.ts | 2 +- .../scripts}/demoScripts/demoMultichainTx.ts | 0 .../scripts}/demoScripts/demoSynapseBridge.ts | 2 +- .../zkSync}/DeployReceiver.zksync.s.sol | 0 .../src}/Facets/AmarokFacetPacked.sol | 0 {src => archive/src}/Facets/StargateFacet.sol | 0 {src => archive/src}/Periphery/Receiver.sol | 0 .../Facets => archive/test}/AmarokFacet.t.sol | 0 .../test}/AmarokFacetPacked.t.sol | 0 .../Periphery => archive/test}/Receiver.t.sol | 0 .../test}/StargateFacet.t.sol | 0 config/stargate.json | 163 +------------ 33 files changed, 233 insertions(+), 164 deletions(-) rename {config => archive/config}/amarok.json (100%) rename {config => archive/config}/circle.json (100%) rename {config => archive/config}/hyphen.json (100%) rename {config => archive/config}/maker.json (100%) rename {config => archive/config}/multichain.json (100%) create mode 100644 archive/config/stargateV1.json rename {config => archive/config}/synapse.json (100%) rename {config => archive/config}/wormhole.json (100%) rename {docs => archive/docs}/AmarokFacet.md (100%) rename {docs => archive/docs}/Receiver.md (100%) rename {docs => archive/docs}/StargateFacet.md (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployAmarokFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployAmarokFacetPacked.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployReceiver.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/DeployStargateFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/UpdateAmarokFacet.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/UpdateAmarokFacetPacked.s.sol (100%) rename {script/deploy/facets => archive/scripts/Deploy}/UpdateStargateFacet.s.sol (100%) rename {script/tasks/solidity => archive/scripts/Tasks}/AddChainIdsForStargateToDiamond.s.sol (100%) rename {script/tasks/solidity => archive/scripts/Tasks}/AddTokenApprovalsToAmarokFacetPacked.s.sol (100%) rename {script => archive/scripts}/demoScripts/demoAmarokBridge.ts (100%) rename {script => archive/scripts}/demoScripts/demoDeBridge.ts (98%) rename {script => archive/scripts}/demoScripts/demoMultichainTx.ts (100%) rename {script => archive/scripts}/demoScripts/demoSynapseBridge.ts (99%) rename {script/deploy/zksync => archive/scripts/zkSync}/DeployReceiver.zksync.s.sol (100%) rename {src => archive/src}/Facets/AmarokFacetPacked.sol (100%) rename {src => archive/src}/Facets/StargateFacet.sol (100%) rename {src => archive/src}/Periphery/Receiver.sol (100%) rename {test/solidity/Facets => archive/test}/AmarokFacet.t.sol (100%) rename {test/solidity/Facets => archive/test}/AmarokFacetPacked.t.sol (100%) rename {test/solidity/Periphery => archive/test}/Receiver.t.sol (100%) rename {test/solidity/Facets => archive/test}/StargateFacet.t.sol (100%) diff --git a/config/amarok.json b/archive/config/amarok.json similarity index 100% rename from config/amarok.json rename to archive/config/amarok.json diff --git a/config/circle.json b/archive/config/circle.json similarity index 100% rename from config/circle.json rename to archive/config/circle.json diff --git a/config/hyphen.json b/archive/config/hyphen.json similarity index 100% rename from config/hyphen.json rename to archive/config/hyphen.json diff --git a/config/maker.json b/archive/config/maker.json similarity index 100% rename from config/maker.json rename to archive/config/maker.json diff --git a/config/multichain.json b/archive/config/multichain.json similarity index 100% rename from config/multichain.json rename to archive/config/multichain.json diff --git a/archive/config/stargateV1.json b/archive/config/stargateV1.json new file mode 100644 index 000000000..74386525b --- /dev/null +++ b/archive/config/stargateV1.json @@ -0,0 +1,230 @@ +{ + "endpointIds": [ + { + "chainId": 1, + "endpointId": 30101 + }, + { + "chainId": 137, + "endpointId": 30109 + }, + { + "chainId": 56, + "endpointId": 30102 + }, + { + "chainId": 43114, + "endpointId": 30106 + }, + { + "chainId": 42161, + "endpointId": 30110 + }, + { + "chainId": 250, + "endpointId": 30112 + }, + { + "chainId": 10, + "endpointId": 30111 + }, + { + "chainId": 1088, + "endpointId": 30151 + }, + { + "chainId": 8453, + "endpointId": 30184 + }, + { + "chainId": 59144, + "endpointId": 30183 + }, + { + "chainId": 324, + "endpointId": 30165 + }, + { + "chainId": 1101, + "endpointId": 30158 + }, + { + "chainId": 534352, + "endpointId": 30214 + }, + { + "chainId": 1329, + "endpointId": 30280 + }, + { + "chainId": 167000, + "endpointId": 30290 + }, + { + "chainId": 30, + "endpointId": 30333 + }, + { + "chainId": 122, + "endpointId": 30138 + } + ], + "chains": [ + { + "chainId": 1, + "lzChainId": 101 + }, + { + "chainId": 137, + "lzChainId": 109 + }, + { + "chainId": 56, + "lzChainId": 102 + }, + { + "chainId": 43114, + "lzChainId": 106 + }, + { + "chainId": 42161, + "lzChainId": 110 + }, + { + "chainId": 250, + "lzChainId": 112 + }, + { + "chainId": 10, + "lzChainId": 111 + }, + { + "chainId": 1088, + "lzChainId": 151 + }, + { + "chainId": 8453, + "lzChainId": 184 + }, + { + "chainId": 59144, + "lzChainId": 183 + }, + { + "chainId": 324, + "lzChainId": 165 + }, + { + "chainId": 1101, + "lzChainId": 158 + }, + { + "chainId": 534352, + "lzChainId": 214 + }, + { + "chainId": 5000, + "lzChainId": 181 + }, + { + "chainId": 1329, + "lzChainId": 30280 + } + ], + "composers": { + "mainnet": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "abstract": "0x0000000000000000000000000000000000000000", + "arbitrum": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "apechain": "0x0000000000000000000000000000000000000000", + "aurora": "0x0000000000000000000000000000000000000000", + "avalanche": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "base": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "berachain": "0x0000000000000000000000000000000000000000", + "boba": "0x0000000000000000000000000000000000000000", + "blast": "0x0000000000000000000000000000000000000000", + "bsc": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "celo": "0x0000000000000000000000000000000000000000", + "cronos": "0x0000000000000000000000000000000000000000", + "evmos": "0x0000000000000000000000000000000000000000", + "fantom": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "fuse": "0x0000000000000000000000000000000000000000", + "harmony": "0x0000000000000000000000000000000000000000", + "heco": "0x0000000000000000000000000000000000000000", + "gnosis": "0x0000000000000000000000000000000000000000", + "gravity": "0x0000000000000000000000000000000000000000", + "immutablezkevm": "0x0000000000000000000000000000000000000000", + "moonbeam": "0x0000000000000000000000000000000000000000", + "moonriver": "0x0000000000000000000000000000000000000000", + "nova": "0x0000000000000000000000000000000000000000", + "okx": "0x0000000000000000000000000000000000000000", + "opbnb": "0x0000000000000000000000000000000000000000", + "optimism": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "polygon": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "polygonzkevm": "0x0000000000000000000000000000000000000000", + "rootstock": "0x0000000000000000000000000000000000000000", + "velas": "0x0000000000000000000000000000000000000000", + "kaia": "0x0000000000000000000000000000000000000000", + "goerli": "0x0000000000000000000000000000000000000000", + "bsc-testnet": "0x0000000000000000000000000000000000000000", + "lineatest": "0x0000000000000000000000000000000000000000", + "linea": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "lisk": "0x0000000000000000000000000000000000000000", + "metis": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", + "mode": "0x0000000000000000000000000000000000000000", + "mantle": "0x296F55F8Fb28E498B858d0BcDA06D955B2Cb3f97", + "scroll": "0x0000000000000000000000000000000000000000", + "sonic": "0x0000000000000000000000000000000000000000", + "soneium": "0x0000000000000000000000000000000000000000", + "xlayer": "0x0000000000000000000000000000000000000000", + "taiko": "0x0000000000000000000000000000000000000000", + "unichain": "0x0000000000000000000000000000000000000000", + "worldchain": "0x0000000000000000000000000000000000000000", + "localanvil": "0x0000000000000000000000000000000000000000", + "mumbai": "0x0000000000000000000000000000000000000000", + "sepolia": "0x0000000000000000000000000000000000000000" + }, + "routers": { + "mainnet": "0x8731d54E9D02c286767d56ac03e8037C07e01e98", + "arbitrum": "0x53Bf833A5d6c4ddA888F69c22C88C9f356a41614", + "aurora": "0x0000000000000000000000000000000000000000", + "avalanche": "0x45A01E4e04F14f7A4a6702c74187c5F6222033cd", + "base": "0x45f1A95A4D3f3836523F5c83673c797f4d4d263B", + "berachain": "0x0000000000000000000000000000000000000000", + "blast": "0x0000000000000000000000000000000000000000", + "boba": "0x0000000000000000000000000000000000000000", + "bsc": "0x4a364f8c717cAAD9A442737Eb7b8A55cc6cf18D8", + "celo": "0x0000000000000000000000000000000000000000", + "cronos": "0x0000000000000000000000000000000000000000", + "evmos": "0x0000000000000000000000000000000000000000", + "fantom": "0xAf5191B0De278C7286d6C7CC6ab6BB8A73bA2Cd6", + "fuse": "0x0000000000000000000000000000000000000000", + "harmony": "0x0000000000000000000000000000000000000000", + "heco": "0x0000000000000000000000000000000000000000", + "gnosis": "0x0000000000000000000000000000000000000000", + "moonbeam": "0x0000000000000000000000000000000000000000", + "moonriver": "0x0000000000000000000000000000000000000000", + "nova": "0x0000000000000000000000000000000000000000", + "okx": "0x0000000000000000000000000000000000000000", + "opbnb": "0x0000000000000000000000000000000000000000", + "optimism": "0xB0D502E938ed5f4df2E681fE6E419ff29631d62b", + "polygon": "0x45A01E4e04F14f7A4a6702c74187c5F6222033cd", + "polygonzkevm": "0x0000000000000000000000000000000000000000", + "rootstock": "0x0000000000000000000000000000000000000000", + "velas": "0x0000000000000000000000000000000000000000", + "goerli": "0x7612aE2a34E5A363E137De748801FB4c86499152", + "bsc-testnet": "0x0000000000000000000000000000000000000000", + "lineatest": "0x0000000000000000000000000000000000000000", + "linea": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", + "lisk": "0x0000000000000000000000000000000000000000", + "mantle": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", + "metis": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", + "scroll": "0x36d4686e19c052787D7f24E6913cEbC025714895", + "soneium": "0x0000000000000000000000000000000000000000", + "taiko": "0x0000000000000000000000000000000000000000", + "unichain": "0x0000000000000000000000000000000000000000", + "xlayer": "0x0000000000000000000000000000000000000000", + "localanvil": "0x0000000000000000000000000000000000000000", + "mumbai": "0x817436a076060D158204d955E5403b6Ed0A5fac0", + "sepolia": "0x0000000000000000000000000000000000000000" + } +} diff --git a/config/synapse.json b/archive/config/synapse.json similarity index 100% rename from config/synapse.json rename to archive/config/synapse.json diff --git a/config/wormhole.json b/archive/config/wormhole.json similarity index 100% rename from config/wormhole.json rename to archive/config/wormhole.json diff --git a/docs/AmarokFacet.md b/archive/docs/AmarokFacet.md similarity index 100% rename from docs/AmarokFacet.md rename to archive/docs/AmarokFacet.md diff --git a/docs/Receiver.md b/archive/docs/Receiver.md similarity index 100% rename from docs/Receiver.md rename to archive/docs/Receiver.md diff --git a/docs/StargateFacet.md b/archive/docs/StargateFacet.md similarity index 100% rename from docs/StargateFacet.md rename to archive/docs/StargateFacet.md diff --git a/script/deploy/facets/DeployAmarokFacet.s.sol b/archive/scripts/Deploy/DeployAmarokFacet.s.sol similarity index 100% rename from script/deploy/facets/DeployAmarokFacet.s.sol rename to archive/scripts/Deploy/DeployAmarokFacet.s.sol diff --git a/script/deploy/facets/DeployAmarokFacetPacked.s.sol b/archive/scripts/Deploy/DeployAmarokFacetPacked.s.sol similarity index 100% rename from script/deploy/facets/DeployAmarokFacetPacked.s.sol rename to archive/scripts/Deploy/DeployAmarokFacetPacked.s.sol diff --git a/script/deploy/facets/DeployReceiver.s.sol b/archive/scripts/Deploy/DeployReceiver.s.sol similarity index 100% rename from script/deploy/facets/DeployReceiver.s.sol rename to archive/scripts/Deploy/DeployReceiver.s.sol diff --git a/script/deploy/facets/DeployStargateFacet.s.sol b/archive/scripts/Deploy/DeployStargateFacet.s.sol similarity index 100% rename from script/deploy/facets/DeployStargateFacet.s.sol rename to archive/scripts/Deploy/DeployStargateFacet.s.sol diff --git a/script/deploy/facets/UpdateAmarokFacet.s.sol b/archive/scripts/Deploy/UpdateAmarokFacet.s.sol similarity index 100% rename from script/deploy/facets/UpdateAmarokFacet.s.sol rename to archive/scripts/Deploy/UpdateAmarokFacet.s.sol diff --git a/script/deploy/facets/UpdateAmarokFacetPacked.s.sol b/archive/scripts/Deploy/UpdateAmarokFacetPacked.s.sol similarity index 100% rename from script/deploy/facets/UpdateAmarokFacetPacked.s.sol rename to archive/scripts/Deploy/UpdateAmarokFacetPacked.s.sol diff --git a/script/deploy/facets/UpdateStargateFacet.s.sol b/archive/scripts/Deploy/UpdateStargateFacet.s.sol similarity index 100% rename from script/deploy/facets/UpdateStargateFacet.s.sol rename to archive/scripts/Deploy/UpdateStargateFacet.s.sol diff --git a/script/tasks/solidity/AddChainIdsForStargateToDiamond.s.sol b/archive/scripts/Tasks/AddChainIdsForStargateToDiamond.s.sol similarity index 100% rename from script/tasks/solidity/AddChainIdsForStargateToDiamond.s.sol rename to archive/scripts/Tasks/AddChainIdsForStargateToDiamond.s.sol diff --git a/script/tasks/solidity/AddTokenApprovalsToAmarokFacetPacked.s.sol b/archive/scripts/Tasks/AddTokenApprovalsToAmarokFacetPacked.s.sol similarity index 100% rename from script/tasks/solidity/AddTokenApprovalsToAmarokFacetPacked.s.sol rename to archive/scripts/Tasks/AddTokenApprovalsToAmarokFacetPacked.s.sol diff --git a/script/demoScripts/demoAmarokBridge.ts b/archive/scripts/demoScripts/demoAmarokBridge.ts similarity index 100% rename from script/demoScripts/demoAmarokBridge.ts rename to archive/scripts/demoScripts/demoAmarokBridge.ts diff --git a/script/demoScripts/demoDeBridge.ts b/archive/scripts/demoScripts/demoDeBridge.ts similarity index 98% rename from script/demoScripts/demoDeBridge.ts rename to archive/scripts/demoScripts/demoDeBridge.ts index 4dcacaf34..84ae0e4d9 100644 --- a/script/demoScripts/demoDeBridge.ts +++ b/archive/scripts/demoScripts/demoDeBridge.ts @@ -6,7 +6,7 @@ import { } from '../typechain' import { node_url } from '../../utils/network' import chalk from 'chalk' -import { config } from '../../config/debridge.json' +import { config } from '../../../config/debridge.json' const msg = (msg: string) => { console.log(chalk.green(msg)) diff --git a/script/demoScripts/demoMultichainTx.ts b/archive/scripts/demoScripts/demoMultichainTx.ts similarity index 100% rename from script/demoScripts/demoMultichainTx.ts rename to archive/scripts/demoScripts/demoMultichainTx.ts diff --git a/script/demoScripts/demoSynapseBridge.ts b/archive/scripts/demoScripts/demoSynapseBridge.ts similarity index 99% rename from script/demoScripts/demoSynapseBridge.ts rename to archive/scripts/demoScripts/demoSynapseBridge.ts index 9dc81072f..fbd98446d 100644 --- a/script/demoScripts/demoSynapseBridge.ts +++ b/archive/scripts/demoScripts/demoSynapseBridge.ts @@ -13,7 +13,7 @@ import { } from '../typechain' import { node_url } from '../../utils/network' import config from '../../config/synapse.json' -import deployments from '../../deployments/polygon.staging.json' +import deployments from '../../../deployments/polygon.staging.json' import chalk from 'chalk' const msg = (msg: string) => { diff --git a/script/deploy/zksync/DeployReceiver.zksync.s.sol b/archive/scripts/zkSync/DeployReceiver.zksync.s.sol similarity index 100% rename from script/deploy/zksync/DeployReceiver.zksync.s.sol rename to archive/scripts/zkSync/DeployReceiver.zksync.s.sol diff --git a/src/Facets/AmarokFacetPacked.sol b/archive/src/Facets/AmarokFacetPacked.sol similarity index 100% rename from src/Facets/AmarokFacetPacked.sol rename to archive/src/Facets/AmarokFacetPacked.sol diff --git a/src/Facets/StargateFacet.sol b/archive/src/Facets/StargateFacet.sol similarity index 100% rename from src/Facets/StargateFacet.sol rename to archive/src/Facets/StargateFacet.sol diff --git a/src/Periphery/Receiver.sol b/archive/src/Periphery/Receiver.sol similarity index 100% rename from src/Periphery/Receiver.sol rename to archive/src/Periphery/Receiver.sol diff --git a/test/solidity/Facets/AmarokFacet.t.sol b/archive/test/AmarokFacet.t.sol similarity index 100% rename from test/solidity/Facets/AmarokFacet.t.sol rename to archive/test/AmarokFacet.t.sol diff --git a/test/solidity/Facets/AmarokFacetPacked.t.sol b/archive/test/AmarokFacetPacked.t.sol similarity index 100% rename from test/solidity/Facets/AmarokFacetPacked.t.sol rename to archive/test/AmarokFacetPacked.t.sol diff --git a/test/solidity/Periphery/Receiver.t.sol b/archive/test/Receiver.t.sol similarity index 100% rename from test/solidity/Periphery/Receiver.t.sol rename to archive/test/Receiver.t.sol diff --git a/test/solidity/Facets/StargateFacet.t.sol b/archive/test/StargateFacet.t.sol similarity index 100% rename from test/solidity/Facets/StargateFacet.t.sol rename to archive/test/StargateFacet.t.sol diff --git a/config/stargate.json b/config/stargate.json index b9aca9028..4aad7e59b 100644 --- a/config/stargate.json +++ b/config/stargate.json @@ -146,166 +146,5 @@ "chainId": 122, "endpointId": 30138 } - ], - "----------- anything from here is LEGACY (for StargateFacet.sol (v1)) ----------------------------------------------------------------": {}, - "chains": [ - { - "chainId": 1, - "lzChainId": 101 - }, - { - "chainId": 137, - "lzChainId": 109 - }, - { - "chainId": 56, - "lzChainId": 102 - }, - { - "chainId": 43114, - "lzChainId": 106 - }, - { - "chainId": 42161, - "lzChainId": 110 - }, - { - "chainId": 250, - "lzChainId": 112 - }, - { - "chainId": 10, - "lzChainId": 111 - }, - { - "chainId": 1088, - "lzChainId": 151 - }, - { - "chainId": 8453, - "lzChainId": 184 - }, - { - "chainId": 59144, - "lzChainId": 183 - }, - { - "chainId": 324, - "lzChainId": 165 - }, - { - "chainId": 1101, - "lzChainId": 158 - }, - { - "chainId": 534352, - "lzChainId": 214 - }, - { - "chainId": 5000, - "lzChainId": 181 - }, - { - "chainId": 1329, - "lzChainId": 30280 - } - ], - "composers": { - "mainnet": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "abstract": "0x0000000000000000000000000000000000000000", - "arbitrum": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "apechain": "0x0000000000000000000000000000000000000000", - "aurora": "0x0000000000000000000000000000000000000000", - "avalanche": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "base": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "berachain": "0x0000000000000000000000000000000000000000", - "boba": "0x0000000000000000000000000000000000000000", - "blast": "0x0000000000000000000000000000000000000000", - "bsc": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "celo": "0x0000000000000000000000000000000000000000", - "cronos": "0x0000000000000000000000000000000000000000", - "evmos": "0x0000000000000000000000000000000000000000", - "fantom": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "fuse": "0x0000000000000000000000000000000000000000", - "harmony": "0x0000000000000000000000000000000000000000", - "heco": "0x0000000000000000000000000000000000000000", - "gnosis": "0x0000000000000000000000000000000000000000", - "gravity": "0x0000000000000000000000000000000000000000", - "immutablezkevm": "0x0000000000000000000000000000000000000000", - "ink": "0x0000000000000000000000000000000000000000", - "moonbeam": "0x0000000000000000000000000000000000000000", - "moonriver": "0x0000000000000000000000000000000000000000", - "nova": "0x0000000000000000000000000000000000000000", - "okx": "0x0000000000000000000000000000000000000000", - "opbnb": "0x0000000000000000000000000000000000000000", - "optimism": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "polygon": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "polygonzkevm": "0x0000000000000000000000000000000000000000", - "rootstock": "0x0000000000000000000000000000000000000000", - "velas": "0x0000000000000000000000000000000000000000", - "kaia": "0x0000000000000000000000000000000000000000", - "goerli": "0x0000000000000000000000000000000000000000", - "bsc-testnet": "0x0000000000000000000000000000000000000000", - "lineatest": "0x0000000000000000000000000000000000000000", - "linea": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "lisk": "0x0000000000000000000000000000000000000000", - "metis": "0xeCc19E177d24551aA7ed6Bc6FE566eCa726CC8a9", - "mode": "0x0000000000000000000000000000000000000000", - "mantle": "0x296F55F8Fb28E498B858d0BcDA06D955B2Cb3f97", - "scroll": "0x0000000000000000000000000000000000000000", - "sonic": "0x0000000000000000000000000000000000000000", - "soneium": "0x0000000000000000000000000000000000000000", - "xlayer": "0x0000000000000000000000000000000000000000", - "taiko": "0x0000000000000000000000000000000000000000", - "unichain": "0x0000000000000000000000000000000000000000", - "worldchain": "0x0000000000000000000000000000000000000000", - "localanvil": "0x0000000000000000000000000000000000000000", - "mumbai": "0x0000000000000000000000000000000000000000", - "sepolia": "0x0000000000000000000000000000000000000000" - }, - "routers": { - "mainnet": "0x8731d54E9D02c286767d56ac03e8037C07e01e98", - "arbitrum": "0x53Bf833A5d6c4ddA888F69c22C88C9f356a41614", - "aurora": "0x0000000000000000000000000000000000000000", - "avalanche": "0x45A01E4e04F14f7A4a6702c74187c5F6222033cd", - "base": "0x45f1A95A4D3f3836523F5c83673c797f4d4d263B", - "berachain": "0x0000000000000000000000000000000000000000", - "blast": "0x0000000000000000000000000000000000000000", - "boba": "0x0000000000000000000000000000000000000000", - "bsc": "0x4a364f8c717cAAD9A442737Eb7b8A55cc6cf18D8", - "celo": "0x0000000000000000000000000000000000000000", - "cronos": "0x0000000000000000000000000000000000000000", - "evmos": "0x0000000000000000000000000000000000000000", - "fantom": "0xAf5191B0De278C7286d6C7CC6ab6BB8A73bA2Cd6", - "fuse": "0x0000000000000000000000000000000000000000", - "harmony": "0x0000000000000000000000000000000000000000", - "heco": "0x0000000000000000000000000000000000000000", - "gnosis": "0x0000000000000000000000000000000000000000", - "ink": "0x0000000000000000000000000000000000000000", - "moonbeam": "0x0000000000000000000000000000000000000000", - "moonriver": "0x0000000000000000000000000000000000000000", - "nova": "0x0000000000000000000000000000000000000000", - "okx": "0x0000000000000000000000000000000000000000", - "opbnb": "0x0000000000000000000000000000000000000000", - "optimism": "0xB0D502E938ed5f4df2E681fE6E419ff29631d62b", - "polygon": "0x45A01E4e04F14f7A4a6702c74187c5F6222033cd", - "polygonzkevm": "0x0000000000000000000000000000000000000000", - "rootstock": "0x0000000000000000000000000000000000000000", - "velas": "0x0000000000000000000000000000000000000000", - "goerli": "0x7612aE2a34E5A363E137De748801FB4c86499152", - "bsc-testnet": "0x0000000000000000000000000000000000000000", - "lineatest": "0x0000000000000000000000000000000000000000", - "linea": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", - "lisk": "0x0000000000000000000000000000000000000000", - "mantle": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", - "metis": "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", - "scroll": "0x36d4686e19c052787D7f24E6913cEbC025714895", - "soneium": "0x0000000000000000000000000000000000000000", - "taiko": "0x0000000000000000000000000000000000000000", - "unichain": "0x0000000000000000000000000000000000000000", - "xlayer": "0x0000000000000000000000000000000000000000", - "localanvil": "0x0000000000000000000000000000000000000000", - "mumbai": "0x817436a076060D158204d955E5403b6Ed0A5fac0", - "sepolia": "0x0000000000000000000000000000000000000000" - } + ] }