diff --git a/config/networks.json b/config/networks.json index a82b3bb8b..1ee457a57 100644 --- a/config/networks.json +++ b/config/networks.json @@ -401,10 +401,10 @@ "rpcUrl": "https://opbnb.drpc.org", "verificationType": "etherscan", "explorerUrl": "https://opbnb.bscscan.com/", - "explorerApiUrl": "", + "explorerApiUrl": "https://api-opbnb.bscscan.com/api", "multicallAddress": "0xcA11bde05977b3631167028862bE2a173976CA11", - "safeApiUrl": "", - "safeAddress": "", + "safeApiUrl": "https://safe-transaction-opbnb-mainnet.bnbchain.org/api", + "safeAddress": "0xaAD94196680Edb94B421bb5B1E1A0B27db686C72", "gasZipChainId": 58 }, "polygon": { diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 146c7dd2e..4419d084b 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -20591,12 +20591,12 @@ "staging": { "1.0.0": [ { - "ADDRESS": "0xE500dED7b9C9f1020870B7a6Db076Dbd892C0fea", + "ADDRESS": "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD", "OPTIMIZER_RUNS": "1000000", - "TIMESTAMP": "2024-02-22 14:29:31", + "TIMESTAMP": "2024-10-08 14:03:01", "CONSTRUCTOR_ARGS": "0x000000000000000000000000ef4fb24ad0916217251f553c0596f8edc630eb66", "SALT": "", - "VERIFIED": "true" + "VERIFIED": "false" } ] } @@ -20605,9 +20605,9 @@ "staging": { "1.0.0": [ { - "ADDRESS": "0xE500dED7b9C9f1020870B7a6Db076Dbd892C0fea", + "ADDRESS": "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD", "OPTIMIZER_RUNS": "1000000", - "TIMESTAMP": "2024-02-22 15:43:42", + "TIMESTAMP": "2024-10-08 13:59:43", "CONSTRUCTOR_ARGS": "0x000000000000000000000000ef4fb24ad0916217251f553c0596f8edc630eb66", "SALT": "", "VERIFIED": "true" diff --git a/deployments/arbitrum.diamond.staging.json b/deployments/arbitrum.diamond.staging.json index 000ab479d..aea726c34 100644 --- a/deployments/arbitrum.diamond.staging.json +++ b/deployments/arbitrum.diamond.staging.json @@ -138,8 +138,8 @@ "Version": "" }, "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD": { - "Name": "", - "Version": "" + "Name": "DeBridgeDlnFacet", + "Version": "1.0.0" } }, "Periphery": { @@ -156,4 +156,4 @@ "TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70" } } -} \ No newline at end of file +} diff --git a/deployments/arbitrum.staging.json b/deployments/arbitrum.staging.json index 3b0f1933c..af1a4ec9e 100644 --- a/deployments/arbitrum.staging.json +++ b/deployments/arbitrum.staging.json @@ -32,7 +32,7 @@ "ServiceFeeCollector": "0x9cc3164f01ED3796Fdf7Da538484D634608D2203", "WormholeFacet": "0x7260Fd3F8D0bEb06fF5935C6eadE9f406107c270", "SymbiosisFacet": "0x21571D628B0bCBeb954D5933A604eCac35bAF2c7", - "DeBridgeDlnFacet": "0xE500dED7b9C9f1020870B7a6Db076Dbd892C0fea", + "DeBridgeDlnFacet": "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD", "MayanFacet": "0xd596C903d78870786c5DB0E448ce7F87A65A0daD", "StandardizedCallFacet": "0xA7ffe57ee70Ac4998e9E9fC6f17341173E081A8f", "GenericSwapFacetV3": "0xFf6Fa203573Baaaa4AE375EB7ac2819d539e16FF", diff --git a/deployments/polygon.diamond.staging.json b/deployments/polygon.diamond.staging.json index 1325faed2..821bc3a8f 100644 --- a/deployments/polygon.diamond.staging.json +++ b/deployments/polygon.diamond.staging.json @@ -114,6 +114,7 @@ "Version": "1.0.0" }, "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD": { + "Name": "DeBridgeDlnFacet", "Name": "", "Version": "" }, @@ -123,9 +124,9 @@ } }, "Periphery": { - "ERC20Proxy": "0xF6d5cf7a12d89BC0fD34E27d2237875b564A6ADf", + "ERC20Proxy": "", "Executor": "0x23f882bA2fa54A358d8599465EB471f58Cc26751", - "FeeCollector": "0x7F8E9bEBd1Dea263A36a6916B99bd84405B9654a", + "FeeCollector": "", "GasRebateDistributor": "", "LiFiDEXAggregator": "", "LiFuelFeeCollector": "0x94EA56D8049e93E0308B9c7d1418Baf6A7C68280", @@ -136,4 +137,3 @@ "TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70" } } -} \ No newline at end of file diff --git a/deployments/polygon.staging.json b/deployments/polygon.staging.json index a948eb0bf..649c79b20 100644 --- a/deployments/polygon.staging.json +++ b/deployments/polygon.staging.json @@ -34,7 +34,7 @@ "ServiceFeeCollector": "0x9cc3164f01ED3796Fdf7Da538484D634608D2203", "LiFuelFeeCollector": "0x94EA56D8049e93E0308B9c7d1418Baf6A7C68280", "AcrossFacetPacked": "0x7A3770a9504924d99D38BBba4F0116B756393Eb3", - "DeBridgeDlnFacet": "0xE500dED7b9C9f1020870B7a6Db076Dbd892C0fea", + "DeBridgeDlnFacet": "0xaF5001e4cd39B3515B244B18A88DD5b2fE65c5cD", "AmarokFacetPacked": "0x0aB252E7b5167Be2aC7841Bdaf1689E1a475ceE7", "TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70", "GasRebateDistributor": "0x3116B8F099D7eFA6e24f39F80146Aac423365EB9", diff --git a/archive/docs/DeBridgeDlnFacet.md b/docs/DeBridgeDlnFacet.md similarity index 100% rename from archive/docs/DeBridgeDlnFacet.md rename to docs/DeBridgeDlnFacet.md diff --git a/docs/README.md b/docs/README.md index e13a483ff..c39a97123 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,7 @@ - [CBridge Facet](./CBridgeFacet.md) - [Celer Circle Bridge Facet](./CelerCircleBridgeFacet.md) - [Circle Bridge Facet](./CircleBridgeFacet.md) -- [DeBridge Facet](./DeBridgeFacet.md) +- [DeBridge DLN Facet](/docs/DeBridgeDlnFacet.md) - [DEX Manager Facet](./DexManagerFacet.md) - [DiamondCut Facet](./DiamondCutFacet.md) - [DiamondLoupe Facet](./DiamondLoupeFacet.md) @@ -21,19 +21,15 @@ - [Hop Facet Packed](./HopFacetPacked.md) - [Hyphen Facet](./HyphenFacet.md) - [LIFuel Facet](./LIFuelFacet.md) -- [MakerTeleport Facet](./MakerTeleportFacet.md) - [Mayan Facet](./MayanFacet.md) -- [Multichain Facet](./MultichainFacet.md) - [OmniBridge Facet](./OmniBridgeFacet.md) - [Optimism Bridge Facet](./OptimismBridgeFacet.md) - [Periphery Registry Facet](./PeripheryRegistryFacet.md) - [Polygon Bridge Facet](./PolygonBridgeFacet.md) -- [Ronin Bridge Facet](./RoninBridgeFacet.md) - [Squid Facet](./SquidFacet.md) - [Standardized Call Facet](./StandardizedCallFacet.md) - [Stargate Facet](./StargateFacet.md) - [Stargate FacetV2](./StargateFacetV2.md) -- [Synapse Bridge Facet](./SynapseBridgeFacet.md) - [ThorSwap Facet](./ThorSwapFacet.md) - [Withdraw Facet](./WithdrawFacet.md) diff --git a/script/demoScripts/demoDLN.ts b/script/demoScripts/demoDLN.ts index 9c725c7bf..2f692ee2d 100644 --- a/script/demoScripts/demoDLN.ts +++ b/script/demoScripts/demoDLN.ts @@ -1,4 +1,4 @@ -import deployments from '../../deployments/mainnet.staging.json' +import deployments from '../../deployments/arbitrum.staging.json' import { DeBridgeDlnFacet__factory, ILiFi, diff --git a/archive/scripts/DeployDeBridgeDlnFacet.s.sol b/script/deploy/facets/DeployDeBridgeDlnFacet.s.sol similarity index 100% rename from archive/scripts/DeployDeBridgeDlnFacet.s.sol rename to script/deploy/facets/DeployDeBridgeDlnFacet.s.sol diff --git a/archive/scripts/UpdateDeBridgeDlnFacet.s.sol b/script/deploy/facets/UpdateDeBridgeDlnFacet.s.sol similarity index 100% rename from archive/scripts/UpdateDeBridgeDlnFacet.s.sol rename to script/deploy/facets/UpdateDeBridgeDlnFacet.s.sol diff --git a/archive/src/DeBridgeDlnFacet.sol b/src/Facets/DeBridgeDlnFacet.sol similarity index 86% rename from archive/src/DeBridgeDlnFacet.sol rename to src/Facets/DeBridgeDlnFacet.sol index 3545d5cdc..d24998a14 100644 --- a/archive/src/DeBridgeDlnFacet.sol +++ b/src/Facets/DeBridgeDlnFacet.sol @@ -54,10 +54,10 @@ contract DeBridgeDlnFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { /// @notice Bridges tokens via DeBridgeDLN /// @param _bridgeData The core information needed for bridging - /// @param _deBridgeDlnData Data specific to DeBridgeDLN + /// @param _deBridgeData Data specific to DeBridgeDLN function startBridgeTokensViaDeBridgeDln( ILiFi.BridgeData memory _bridgeData, - DeBridgeDlnData calldata _deBridgeDlnData + DeBridgeDlnData calldata _deBridgeData ) external payable @@ -73,7 +73,7 @@ contract DeBridgeDlnFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { ); _startBridge( _bridgeData, - _deBridgeDlnData, + _deBridgeData, dlnSource.globalFixedNativeFee() ); } @@ -81,11 +81,11 @@ contract DeBridgeDlnFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { /// @notice Performs a swap before bridging via DeBridgeDLN /// @param _bridgeData The core information needed for bridging /// @param _swapData An array of swap related data for performing swaps before bridging - /// @param _deBridgeDlnData Data specific to DeBridgeDLN + /// @param _deBridgeData Data specific to DeBridgeDLN function swapAndStartBridgeTokensViaDeBridgeDln( ILiFi.BridgeData memory _bridgeData, LibSwap.SwapData[] calldata _swapData, - DeBridgeDlnData calldata _deBridgeDlnData + DeBridgeDlnData calldata _deBridgeData ) external payable @@ -104,29 +104,29 @@ contract DeBridgeDlnFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { payable(msg.sender), LibAsset.isNativeAsset(assetId) ? 0 : fee ); - _startBridge(_bridgeData, _deBridgeDlnData, fee); + _startBridge(_bridgeData, _deBridgeData, fee); } /// Internal Methods /// /// @dev Contains the business logic for the bridge via DeBridgeDLN /// @param _bridgeData The core information needed for bridging - /// @param _deBridgeDlnData Data specific to DeBridgeDLN + /// @param _deBridgeData Data specific to DeBridgeDLN function _startBridge( ILiFi.BridgeData memory _bridgeData, - DeBridgeDlnData calldata _deBridgeDlnData, + DeBridgeDlnData calldata _deBridgeData, uint256 _fee ) internal { IDlnSource.OrderCreation memory orderCreation = IDlnSource .OrderCreation({ giveTokenAddress: _bridgeData.sendingAssetId, giveAmount: _bridgeData.minAmount, - takeTokenAddress: _deBridgeDlnData.receivingAssetId, - takeAmount: _deBridgeDlnData.minAmountOut, + takeTokenAddress: _deBridgeData.receivingAssetId, + takeAmount: _deBridgeData.minAmountOut, takeChainId: _bridgeData.destinationChainId, - receiverDst: _deBridgeDlnData.receiver, - givePatchAuthoritySrc: _bridgeData.receiver, - orderAuthorityAddressDst: _deBridgeDlnData.receiver, + receiverDst: _deBridgeData.receiver, + givePatchAuthoritySrc: msg.sender, + orderAuthorityAddressDst: _deBridgeData.receiver, allowedTakerDst: "", externalCall: "", allowedCancelBeneficiarySrc: "" @@ -163,7 +163,7 @@ contract DeBridgeDlnFacet is ILiFi, ReentrancyGuard, SwapperV2, Validatable { emit BridgeToNonEVMChain( _bridgeData.transactionId, _bridgeData.destinationChainId, - _deBridgeDlnData.receiver + _deBridgeData.receiver ); } diff --git a/archive/test/DeBridgeDlnFacet.t.sol b/test/solidity/Facets/DeBridgeDlnFacet.t.sol similarity index 67% rename from archive/test/DeBridgeDlnFacet.t.sol rename to test/solidity/Facets/DeBridgeDlnFacet.t.sol index f47e058f7..f62042f12 100644 --- a/archive/test/DeBridgeDlnFacet.t.sol +++ b/test/solidity/Facets/DeBridgeDlnFacet.t.sol @@ -176,4 +176,89 @@ contract DeBridgeDlnFacetTest is TestBaseFacet { initialETHBalance - swapData[0].fromAmount - FIXED_FEE ); } + + function test_CanBridgeToNonEVMAddress() + public + assertBalanceChange(ADDRESS_DAI, USER_RECEIVER, 0) + assertBalanceChange(ADDRESS_USDC, USER_RECEIVER, 0) + { + vm.startPrank(USER_SENDER); + // store initial balances + uint256 initialETHBalance = USER_SENDER.balance; + + // prepare bridgeData + bridgeData.hasSourceSwaps = true; + bridgeData.sendingAssetId = ADDRESS_USDC; + + // prepare swap data + address[] memory path = new address[](2); + + path[0] = ADDRESS_WRAPPED_NATIVE; + path[1] = ADDRESS_USDC; + + uint256 amountOut = defaultUSDCAmount; + + // Calculate USDC input amount + uint256[] memory amounts = uniswap.getAmountsIn(amountOut, path); + uint256 amountIn = amounts[0]; + + bridgeData.minAmount = amountOut; + + delete swapData; + swapData.push( + LibSwap.SwapData({ + callTo: address(uniswap), + approveTo: address(uniswap), + sendingAssetId: address(0), + receivingAssetId: ADDRESS_USDC, + fromAmount: amountIn, + callData: abi.encodeWithSelector( + uniswap.swapETHForExactTokens.selector, + amountOut, + path, + _facetTestContractAddress, + block.timestamp + 20 minutes + ), + requiresDeposit: true + }) + ); + + //prepare check for events + vm.expectEmit(true, true, true, true, _facetTestContractAddress); + emit AssetSwapped( + bridgeData.transactionId, + ADDRESS_UNISWAP, + address(0), + ADDRESS_USDC, + swapData[0].fromAmount, + bridgeData.minAmount, + block.timestamp + ); + + // This is just a random Solana Address for testing + validDeBridgeDlnData + .receiver = hex"e275bc4764effea023f35f3c60b2260c93248b74ec8d63ee215d40317e98b014"; // [pre-commit-checker: not a secret] + // SOL Token + validDeBridgeDlnData + .receivingAssetId = hex"0000000000000000000000000000000000000000000000000000000000000000"; // [pre-commit-checker: not a secret] + + // Setup to bridge to Solana + bridgeData.destinationChainId = 7565164; + bridgeData.receiver = 0x11f111f111f111F111f111f111F111f111f111F1; + + //@dev the bridged amount will be higher than bridgeData.minAmount since the code will + // deposit all remaining ETH to the bridge. We cannot access that value (minAmount + remaining gas) + // therefore the test is designed to only check if an event was emitted but not match the parameters + vm.expectEmit(false, false, false, false, _facetTestContractAddress); + emit LiFiTransferStarted(bridgeData); + + // execute call in child contract + initiateSwapAndBridgeTxWithFacet(true); + + // check balances after call + assertEq( + USER_SENDER.balance, + initialETHBalance - swapData[0].fromAmount - FIXED_FEE + ); + } }