From 705c680b127dc04dad14e9d0a3d6806eee70b253 Mon Sep 17 00:00:00 2001 From: Max Klenk Date: Thu, 10 Oct 2024 11:38:21 +0200 Subject: [PATCH 01/18] feat: add callback in LiFiDEXAggregator (v1.1.0) --- src/Periphery/LiFiDEXAggregator.sol | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index a61f38245..30a56b69b 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -22,7 +22,7 @@ uint160 constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970 /// @title LiFi DEX Aggregator /// @author Ilya Lyalin (contract copied from: https://github.com/sushiswap/sushiswap/blob/c8c80dec821003eb72eb77c7e0446ddde8ca9e1e/protocols/route-processor/contracts/RouteProcessor4.sol) /// @notice Processes calldata to swap using various DEXs -/// @custom:version 1.0.0 +/// @custom:version 1.1.0 contract LiFiDEXAggregator is Ownable { using SafeERC20 for IERC20; using Approve for IERC20; @@ -575,6 +575,21 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via RaExchangeV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the RaExchangeV3#swap call + function ramsesV2SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From 5b4b8b2d1d4d888055bcae98199f3eb2712f2447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 11 Oct 2024 15:50:08 +0700 Subject: [PATCH 02/18] deployed v1.1.0 to Fraxtal --- deployments/_deployments_log_file.json | 10 ++++++++++ deployments/fraxtal.diamond.json | 2 +- deployments/fraxtal.json | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 146c7dd2e..8aa77dabf 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -23084,6 +23084,16 @@ "SALT": "", "VERIFIED": "true" } + ], + "1.1.0": [ + { + "ADDRESS": "0xE38621607316cB43367c134C65dca3f41B61250f", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-10-11 15:46:23", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d38743b48d26743c0ec6898d699394fbc94657ee", + "SALT": "", + "VERIFIED": "true" + } ] } }, diff --git a/deployments/fraxtal.diamond.json b/deployments/fraxtal.diamond.json index 463fe8b35..c2bd927c4 100644 --- a/deployments/fraxtal.diamond.json +++ b/deployments/fraxtal.diamond.json @@ -68,7 +68,7 @@ "RelayerCelerIM": "", "ServiceFeeCollector": "0x45d69A8a07F79DE2364F0B80F78af86e99015162", "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "0xE38621607316cB43367c134C65dca3f41B61250f", "ReceiverStargateV2": "" } } diff --git a/deployments/fraxtal.json b/deployments/fraxtal.json index 6dc421ac6..d1a57c09d 100644 --- a/deployments/fraxtal.json +++ b/deployments/fraxtal.json @@ -21,5 +21,5 @@ "ServiceFeeCollector": "0x45d69A8a07F79DE2364F0B80F78af86e99015162", "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5", "SymbiosisFacet": "0x095857146B116802fBf4f75D96CC1b35c5F3ad1a", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc" + "LiFiDEXAggregator": "0xE38621607316cB43367c134C65dca3f41B61250f" } \ No newline at end of file From bb8bcdb314416956e80eff5c9585c13c1f55b3fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 16 Oct 2024 16:41:40 +0700 Subject: [PATCH 03/18] new LiFiDEXAggregator address whitelisted @fraxtal --- config/dexs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/dexs.json b/config/dexs.json index 8e2780afe..ca6187bf3 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -404,8 +404,8 @@ "fraxtal": [ "0x7956280Ec4B4d651C4083Ca737a1fa808b5319D8", "0x9870F0C91D722B3393383722968269496d919bD8", - "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5" + "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5", + "0xE38621607316cB43367c134C65dca3f41B61250f" ], "harmony": [ "0xdFC2983401614118E1F2D5A5FD93C17Fecf8BdC6", From c98221d64fe58484084cc5aa2c4f1e23444e2d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 17 Oct 2024 07:14:29 +0700 Subject: [PATCH 04/18] add more DEX-specific callback functions --- src/Periphery/LiFiDEXAggregator.sol | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index 30a56b69b..894edaa25 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -22,7 +22,7 @@ uint160 constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970 /// @title LiFi DEX Aggregator /// @author Ilya Lyalin (contract copied from: https://github.com/sushiswap/sushiswap/blob/c8c80dec821003eb72eb77c7e0446ddde8ca9e1e/protocols/route-processor/contracts/RouteProcessor4.sol) /// @notice Processes calldata to swap using various DEXs -/// @custom:version 1.1.0 +/// @custom:version 1.2.0 contract LiFiDEXAggregator is Ownable { using SafeERC20 for IERC20; using Approve for IERC20; @@ -590,6 +590,36 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via XeiV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the XeiV3#swap call + function xeiV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + + /// @notice Called to `msg.sender` after executing a swap via DragonSwapV2#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the DragonSwapV2#swap call + function dragonswapV2SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From 5948ad0f8bbddf567c687e766e5359159381bea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Thu, 17 Oct 2024 07:24:38 +0700 Subject: [PATCH 05/18] redeploy to sei and whitelist as DEX --- config/dexs.json | 2 +- deployments/_deployments_log_file.json | 10 ++++++++++ deployments/sei.diamond.json | 2 +- deployments/sei.json | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/config/dexs.json b/config/dexs.json index ca6187bf3..380ecf4cd 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -690,7 +690,7 @@ "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "0x7956280Ec4B4d651C4083Ca737a1fa808b5319D8", "0x9870F0C91D722B3393383722968269496d919bD8", - "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0xfdE9CE4e17B650efdcA13d524F132876700d806f", "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5" ], "scroll": [ diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 8aa77dabf..a4a4fa45a 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -23014,6 +23014,16 @@ "SALT": "", "VERIFIED": "false" } + ], + "1.2.0": [ + { + "ADDRESS": "0xfdE9CE4e17B650efdcA13d524F132876700d806f", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-10-17 07:16:41", + "CONSTRUCTOR_ARGS": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003b6211981d47fb6375e0125a6a401830616f7906", + "SALT": "20241016", + "VERIFIED": "true" + } ] } }, diff --git a/deployments/sei.diamond.json b/deployments/sei.diamond.json index 1093fedba..c09dd8b2c 100644 --- a/deployments/sei.diamond.json +++ b/deployments/sei.diamond.json @@ -72,4 +72,4 @@ "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5" } } -} +} \ No newline at end of file diff --git a/deployments/sei.json b/deployments/sei.json index 0e8c05dc5..e97b3749f 100644 --- a/deployments/sei.json +++ b/deployments/sei.json @@ -22,5 +22,5 @@ "GenericSwapFacetV3": "0x31a9b1835864706Af10103b31Ea2b79bdb995F5F", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "StargateFacetV2": "0x6e378C84e657C57b2a8d183CFf30ee5CC8989b61", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc" -} + "LiFiDEXAggregator": "0xfdE9CE4e17B650efdcA13d524F132876700d806f" +} \ No newline at end of file From 0d463a24de8f8c6c1ee0eb82ad9ff0433adbb19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 8 Nov 2024 10:25:56 +0700 Subject: [PATCH 06/18] add callback functions to LiFiDEXAggregator --- src/Periphery/LiFiDEXAggregator.sol | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index 894edaa25..3b1225aef 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -22,7 +22,7 @@ uint160 constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970 /// @title LiFi DEX Aggregator /// @author Ilya Lyalin (contract copied from: https://github.com/sushiswap/sushiswap/blob/c8c80dec821003eb72eb77c7e0446ddde8ca9e1e/protocols/route-processor/contracts/RouteProcessor4.sol) /// @notice Processes calldata to swap using various DEXs -/// @custom:version 1.2.0 +/// @custom:version 1.3.0 contract LiFiDEXAggregator is Ownable { using SafeERC20 for IERC20; using Approve for IERC20; @@ -620,6 +620,36 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via AgniV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the AgniV3#swap call + function agniSwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + + /// @notice Called to `msg.sender` after executing a swap via FusionXV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the FusionXV3#swap call + function fusionXV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From b812ce07f25f30fd49336765f3ac8675bfb7610f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Fri, 8 Nov 2024 10:38:40 +0700 Subject: [PATCH 07/18] deploy and whitelist new version of LiFiDEXAggregator on mantle (1.3.0) --- config/dexs.json | 12 ++++-------- deployments/_deployments_log_file.json | 10 ++++++++++ deployments/mantle.diamond.json | 4 ++-- deployments/mantle.json | 4 ++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/config/dexs.json b/config/dexs.json index 90741d99c..d854e892d 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -481,7 +481,7 @@ "0xf3552b98BB4234B47674700A99a0308D74B40F51", "0xF2ee649caB7a0edEdED7a27821B0aCDF77778aeD", "0x0263180888007D45340F86eC0b610d250BbDcB23", - "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "0xEcf953290D36fA96236356e171044DC802EeC598", "0x6131b5fae19ea4f9d964eac0408e4408b66337b5" ], "metis": [ @@ -617,9 +617,7 @@ "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], - "opbnb": [ - "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc" - ], + "opbnb": ["0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc"], "polygon": [ "0x5215E9fd223BC909083fbdB2860213873046e45d", "0xdFC2983401614118E1F2D5A5FD93C17Fecf8BdC6", @@ -775,9 +773,7 @@ "0xf91bb752490473b8342a3e964e855b9f9a2a668e" ], "avalancheFujiTestnet": [], - "bscTestnet": [ - "0x1b02da8cb0d097eb8d57a175b88c7d8b47997506" - ], + "bscTestnet": ["0x1b02da8cb0d097eb8d57a175b88c7d8b47997506"], "localanvil": [], "mumbai": [ "0x5215E9fd223BC909083fbdB2860213873046e45d", @@ -786,4 +782,4 @@ "0xf471d32cb40837bf24529fcf17418fc1a4807626", "0x427bFc2E0aa683ec43fbF7861d5F4A74147938d8" ] -} \ No newline at end of file +} diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 424aff42b..1e9b459c3 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -23138,6 +23138,16 @@ "SALT": "", "VERIFIED": "true" } + ], + "1.3.0": [ + { + "ADDRESS": "0xEcf953290D36fA96236356e171044DC802EeC598", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-08 06:54:16", + "CONSTRUCTOR_ARGS": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed7", + "SALT": "", + "VERIFIED": "true" + } ] } }, diff --git a/deployments/mantle.diamond.json b/deployments/mantle.diamond.json index ef7fe724e..7c1d36d2a 100644 --- a/deployments/mantle.diamond.json +++ b/deployments/mantle.diamond.json @@ -70,7 +70,7 @@ "ERC20Proxy": "0xA950Ac46b0b844c0564d18A54A9685e614B9086C", "Executor": "0x7078d1DE45C7D3e87f71D5DA663db2a8Ee1dfEbe", "FeeCollector": "0xF048e5816B0C7951AC179f656C5B86e5a79Bd7b5", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "0xEcf953290D36fA96236356e171044DC802EeC598", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Receiver": "0x2fA14922ABc117c4737260032C8fD6D9Ab35395A", "ReceiverAcrossV3": "", @@ -79,4 +79,4 @@ "TokenWrapper": "0x0263180888007D45340F86eC0b610d250BbDcB23" } } -} \ No newline at end of file +} diff --git a/deployments/mantle.json b/deployments/mantle.json index a386b2bd4..2ce73f194 100644 --- a/deployments/mantle.json +++ b/deployments/mantle.json @@ -24,6 +24,6 @@ "SquidFacet": "0xc23ae3A8d74C0a428FA59E4AD3EB6aa4b2330530", "StargateFacetV2": "0x6e378C84e657C57b2a8d183CFf30ee5CC8989b61", "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "0xEcf953290D36fA96236356e171044DC802EeC598", "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61" -} \ No newline at end of file +} From 5bc48954866314cb43953a589d8b78743758174a Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Thu, 14 Nov 2024 11:56:22 +0300 Subject: [PATCH 08/18] deploy custom callback to cronos --- config/dexs.json | 13 +++++++++---- deployments/_deployments_log_file.json | 10 ++++++++++ deployments/cronos.diamond.json | 4 ++-- deployments/cronos.json | 2 +- src/Periphery/LiFiDEXAggregator.sol | 17 ++++++++++++++++- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/config/dexs.json b/config/dexs.json index 7546f25ea..7fee040c2 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -298,7 +298,8 @@ "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "0x70D6cFE9146D6B6ebEb88BcB22fa220E78058D6F", "0x11d40Dc8Ff0CE92F54A315aD8e674a55a866cBEe", - "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55" + "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", + "0xf88F6948C8AFf60c0B011f3175CDF459c66Ed035" ], "evmos": [ "0xdFC2983401614118E1F2D5A5FD93C17Fecf8BdC6", @@ -618,7 +619,9 @@ "0xf2614A233c7C3e7f08b1F887Ba133a13f1eb2c55", "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" ], - "opbnb": ["0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc"], + "opbnb": [ + "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc" + ], "polygon": [ "0x5215E9fd223BC909083fbdB2860213873046e45d", "0xdFC2983401614118E1F2D5A5FD93C17Fecf8BdC6", @@ -774,7 +777,9 @@ "0xf91bb752490473b8342a3e964e855b9f9a2a668e" ], "avalancheFujiTestnet": [], - "bscTestnet": ["0x1b02da8cb0d097eb8d57a175b88c7d8b47997506"], + "bscTestnet": [ + "0x1b02da8cb0d097eb8d57a175b88c7d8b47997506" + ], "localanvil": [], "mumbai": [ "0x5215E9fd223BC909083fbdB2860213873046e45d", @@ -783,4 +788,4 @@ "0xf471d32cb40837bf24529fcf17418fc1a4807626", "0x427bFc2E0aa683ec43fbF7861d5F4A74147938d8" ] -} +} \ No newline at end of file diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index 1e9b459c3..ae44d2fbb 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -23480,6 +23480,16 @@ "SALT": "", "VERIFIED": "true" } + ], + "1.4.0": [ + { + "ADDRESS": "0xf88F6948C8AFf60c0B011f3175CDF459c66Ed035", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-14 11:54:19", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d38743b48d26743c0ec6898d699394fbc94657ee", + "SALT": "", + "VERIFIED": "true" + } ] } } diff --git a/deployments/cronos.diamond.json b/deployments/cronos.diamond.json index ebc2b9096..2043fb655 100644 --- a/deployments/cronos.diamond.json +++ b/deployments/cronos.diamond.json @@ -62,8 +62,8 @@ "ERC20Proxy": "0x9B112948F3c71eBFb59961657b37c21328cFb01e", "Executor": "0xd00DaEC49Cd4F33Fe8542050294759cD971c7116", "FeeCollector": "0x11d40Dc8Ff0CE92F54A315aD8e674a55a866cBEe", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "LiFuelFeeCollector": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "", + "LiFuelFeeCollector": "0x70D6cFE9146D6B6ebEb88BcB22fa220E78058D6F", "ReceiverAcrossV3": "", "Receiver": "0x4891e076b18FccEBE62962A26e74df85BB04168b", "ReceiverStargateV2": "", diff --git a/deployments/cronos.json b/deployments/cronos.json index 2f542bf21..b98dde7ec 100644 --- a/deployments/cronos.json +++ b/deployments/cronos.json @@ -24,5 +24,5 @@ "SymbiosisFacet": "0x70a51Bbc58D6180709D99a759bd91A3feD212fD3", "EmergencyPauseFacet": "0x3CDDc79Da7c829643F5b2378110158Ea6ff349F9", "TokenWrapper": "0x693c18A628866BdD04956d9544Ce769C0e468149", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc" + "LiFiDEXAggregator": "0xf88F6948C8AFf60c0B011f3175CDF459c66Ed035" } \ No newline at end of file diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index 3b1225aef..1f213cc11 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -22,7 +22,7 @@ uint160 constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970 /// @title LiFi DEX Aggregator /// @author Ilya Lyalin (contract copied from: https://github.com/sushiswap/sushiswap/blob/c8c80dec821003eb72eb77c7e0446ddde8ca9e1e/protocols/route-processor/contracts/RouteProcessor4.sol) /// @notice Processes calldata to swap using various DEXs -/// @custom:version 1.3.0 +/// @custom:version 1.4.0 contract LiFiDEXAggregator is Ownable { using SafeERC20 for IERC20; using Approve for IERC20; @@ -650,6 +650,21 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via VVS FinanceV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the VVS Finance V3#swap call + function vvsV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From a0495880a84f2da2375ad760cb7b5afe9293b187 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Fri, 22 Nov 2024 12:25:48 +0300 Subject: [PATCH 09/18] add sushiswap callback for mode --- src/Periphery/LiFiDEXAggregator.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index 1f213cc11..ebd679d36 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -665,6 +665,21 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via SupSwapV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the SupSwapV3#swap call + function supV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From 4ede0ff349f855712265d7cdc5d963f6cacfcfca Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Fri, 22 Nov 2024 12:27:55 +0300 Subject: [PATCH 10/18] add zebraswap callback for scroll --- src/Periphery/LiFiDEXAggregator.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index ebd679d36..a4fd78217 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -680,6 +680,21 @@ contract LiFiDEXAggregator is Ownable { uniswapV3SwapCallback(amount0Delta, amount1Delta, data); } + /// @notice Called to `msg.sender` after executing a swap via ZebraV3#swap. + /// @dev In the implementation you must pay the pool tokens owed for the swap. + /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. + /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by + /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. + /// @param data Any data passed through by the caller via the ZebraV3#swap call + function zebraV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata data + ) external { + uniswapV3SwapCallback(amount0Delta, amount1Delta, data); + } + /// @notice Curve pool swap. Legacy pools that don't return amountOut and have native coins are not supported /// @param stream [pool, poolType, fromIndex, toIndex, recipient, output token] /// @param from Where to take liquidity for swap From e0a085982d44f91b42e6e516120d70763cb1de45 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Fri, 22 Nov 2024 12:42:14 +0300 Subject: [PATCH 11/18] bump version --- src/Periphery/LiFiDEXAggregator.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Periphery/LiFiDEXAggregator.sol b/src/Periphery/LiFiDEXAggregator.sol index a4fd78217..da3dd3541 100644 --- a/src/Periphery/LiFiDEXAggregator.sol +++ b/src/Periphery/LiFiDEXAggregator.sol @@ -22,7 +22,7 @@ uint160 constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970 /// @title LiFi DEX Aggregator /// @author Ilya Lyalin (contract copied from: https://github.com/sushiswap/sushiswap/blob/c8c80dec821003eb72eb77c7e0446ddde8ca9e1e/protocols/route-processor/contracts/RouteProcessor4.sol) /// @notice Processes calldata to swap using various DEXs -/// @custom:version 1.4.0 +/// @custom:version 1.5.0 contract LiFiDEXAggregator is Ownable { using SafeERC20 for IERC20; using Approve for IERC20; From 8a34562c912b5b19c919bb95338655c944428af5 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Fri, 22 Nov 2024 13:00:50 +0300 Subject: [PATCH 12/18] deploy to mode and scroll --- config/dexs.json | 6 ++++-- deployments/_deployments_log_file.json | 20 ++++++++++++++++++++ deployments/mode.json | 4 ++-- deployments/scroll.json | 4 ++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/config/dexs.json b/config/dexs.json index 7fee040c2..61df91fa6 100644 --- a/config/dexs.json +++ b/config/dexs.json @@ -502,7 +502,8 @@ "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "0x6352a56caadC4F1E25CD6c75970Fa768A3304e64", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9" ], "moonbeam": [ "0x5215E9fd223BC909083fbdB2860213873046e45d", @@ -720,7 +721,8 @@ "0xbfe03c9e20a9fc0b37de01a172f207004935e0b1", "0x0000000000005e88410ccdfade4a5efae4b49562", "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", - "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F" + "0xbbbbbBB520d69a9775E85b458C58c648259FAD5F", + "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9" ], "taiko": [ "0xDd8A081efC90DFFD79940948a1528C51793C4B03", diff --git a/deployments/_deployments_log_file.json b/deployments/_deployments_log_file.json index ae44d2fbb..9dcc87246 100644 --- a/deployments/_deployments_log_file.json +++ b/deployments/_deployments_log_file.json @@ -23340,6 +23340,16 @@ "SALT": "", "VERIFIED": "true" } + ], + "1.5.0": [ + { + "ADDRESS": "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-22 12:43:30", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d38743b48d26743c0ec6898d699394fbc94657ee", + "SALT": "", + "VERIFIED": "true" + } ] } }, @@ -23396,6 +23406,16 @@ "SALT": "", "VERIFIED": "true" } + ], + "1.5.0": [ + { + "ADDRESS": "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9", + "OPTIMIZER_RUNS": "1000000", + "TIMESTAMP": "2024-11-22 12:57:37", + "CONSTRUCTOR_ARGS": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d38743b48d26743c0ec6898d699394fbc94657ee", + "SALT": "", + "VERIFIED": "true" + } ] } }, diff --git a/deployments/mode.json b/deployments/mode.json index 5c2cb696c..85751d4ff 100644 --- a/deployments/mode.json +++ b/deployments/mode.json @@ -24,9 +24,9 @@ "AcrossFacet": "0x4D67951397bc8162111BC45F973Ae7576Fd814F0", "AcrossFacetPacked": "0x54910b7b4723a775708aFd88f31b6572e168aF66", "GenericSwapFacetV3": "0x31a9b1835864706Af10103b31Ea2b79bdb995F5F", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9", "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" -} +} \ No newline at end of file diff --git a/deployments/scroll.json b/deployments/scroll.json index d4053ff43..d8093f6e9 100644 --- a/deployments/scroll.json +++ b/deployments/scroll.json @@ -28,9 +28,9 @@ "ReceiverStargateV2": "0x1493e7B8d4DfADe0a178dAD9335470337A3a219A", "AcrossFacet": "0x9535A1AFd986FA9a2D324657116F02C364edebFf", "AcrossFacetPacked": "0xFd796bf7Ff74d414b99CacF6F216eAC24bF3aC8E", - "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", + "LiFiDEXAggregator": "0x78bF01555bCF05e6B1d4dad017dBD0A105652DC9", "EmergencyPauseFacet": "0x6F2baA7cd5F156CA1B132F7FF11E0fa2aD775F61", "AcrossFacetV3": "0x6e00e0a7685Ca22c288d56D9E7924746B5043Ee7", "ReceiverAcrossV3": "0xB9CEc304899037E661F49DdFa7f64943b5920072", "AcrossFacetPackedV3": "0x20F3FFf5A89e988c4109A6e496a839480B1B558f" -} +} \ No newline at end of file From 3ca0f9ba74f365fdeeafe3f380d9a1e3eee0574c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 08:52:07 +0700 Subject: [PATCH 13/18] audit report added --- audit/auditLog.json | 10 ++++++++++ audit/reports/2024.12.03_LiFiDexAggregator.pdf | Bin 0 -> 32420 bytes 2 files changed, 10 insertions(+) create mode 100644 audit/reports/2024.12.03_LiFiDexAggregator.pdf diff --git a/audit/auditLog.json b/audit/auditLog.json index 7e73b0108..ec98d4a00 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -41,6 +41,13 @@ "auditorGitHandle": "sujithsomraaj", "auditReportPath": "./audit/reports/2024.11.22_Permit2Proxy.pdf", "auditCommitHash": "0e3debb78abcdf9a9f934115338b611e16b039a0" + }, + "audit20241203": { + "auditCompletedOn": "12.03.2024", + "auditedBy": "Sujith Somraaj (individual security researcher)", + "auditorGitHandle": "sujithsomraaj", + "auditReportPath": "./audit/reports/2024.12.03_LiFiDexAggregator.pdf", + "auditCommitHash": "8a34562c912b5b19c919bb95338655c944428af5" } }, "auditedContracts": { @@ -54,6 +61,9 @@ "1.0.0": ["audit20240913"], "1.0.1": ["audit20241105"] }, + "LiFiDEXAggregator": { + "1.5.0": ["audit20241203"] + }, "Permit2Proxy": { "1.0.0": ["audit20241122"] }, diff --git a/audit/reports/2024.12.03_LiFiDexAggregator.pdf b/audit/reports/2024.12.03_LiFiDexAggregator.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eea33b846d8909bbb0ce741eae5c8d4b4aec72d2 GIT binary patch literal 32420 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 z

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 literal 0 HcmV?d00001 From f0360602e708a7bf2f0a023964719e97c690475d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 09:05:51 +0700 Subject: [PATCH 14/18] date fixed --- audit/auditLog.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audit/auditLog.json b/audit/auditLog.json index ec98d4a00..7223e2f0b 100644 --- a/audit/auditLog.json +++ b/audit/auditLog.json @@ -43,7 +43,7 @@ "auditCommitHash": "0e3debb78abcdf9a9f934115338b611e16b039a0" }, "audit20241203": { - "auditCompletedOn": "12.03.2024", + "auditCompletedOn": "03.12.2024", "auditedBy": "Sujith Somraaj (individual security researcher)", "auditorGitHandle": "sujithsomraaj", "auditReportPath": "./audit/reports/2024.12.03_LiFiDexAggregator.pdf", From a190c1a5277b1fd4da0a79961954533f4383fcf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 09:06:05 +0700 Subject: [PATCH 15/18] diamond logs updated --- deployments/cronos.diamond.json | 2 +- deployments/fraxtal.diamond.json | 3 +-- deployments/mantle.diamond.json | 8 ++++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/deployments/cronos.diamond.json b/deployments/cronos.diamond.json index 1ce127f4c..f9657b085 100644 --- a/deployments/cronos.diamond.json +++ b/deployments/cronos.diamond.json @@ -72,4 +72,4 @@ "TokenWrapper": "0x693c18A628866BdD04956d9544Ce769C0e468149" } } -} +} \ No newline at end of file diff --git a/deployments/fraxtal.diamond.json b/deployments/fraxtal.diamond.json index 0811043f1..52231e61b 100644 --- a/deployments/fraxtal.diamond.json +++ b/deployments/fraxtal.diamond.json @@ -73,8 +73,7 @@ "ReceiverAcrossV3": "", "ReceiverStargateV2": "", "RelayerCelerIM": "", - "ServiceFeeCollector": "0x45d69A8a07F79DE2364F0B80F78af86e99015162", "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5" } } -} +} \ No newline at end of file diff --git a/deployments/mantle.diamond.json b/deployments/mantle.diamond.json index 01533d906..aa453780b 100644 --- a/deployments/mantle.diamond.json +++ b/deployments/mantle.diamond.json @@ -70,15 +70,15 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "GasZipFacet", - "Version": "2.0.0" + "Name": "", + "Version": "" } }, "Periphery": { "ERC20Proxy": "0xA950Ac46b0b844c0564d18A54A9685e614B9086C", "Executor": "0x7078d1DE45C7D3e87f71D5DA663db2a8Ee1dfEbe", "FeeCollector": "0xF048e5816B0C7951AC179f656C5B86e5a79Bd7b5", - "LiFiDEXAggregator": "0xEcf953290D36fA96236356e171044DC802EeC598", + "LiFiDEXAggregator": "0x6140b987d6B51Fd75b66C3B07733Beb5167c42fc", "LiFuelFeeCollector": "0xc02FFcdD914DbA646704439c6090BAbaD521d04C", "Permit2Proxy": "", "Receiver": "0x2fA14922ABc117c4737260032C8fD6D9Ab35395A", @@ -88,4 +88,4 @@ "TokenWrapper": "0x0263180888007D45340F86eC0b610d250BbDcB23" } } -} +} \ No newline at end of file From ab28a9ad7481d609e1d827f681c4577ad41728d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 09:08:02 +0700 Subject: [PATCH 16/18] re-add gasZip in mantle diamondlog --- deployments/mantle.diamond.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deployments/mantle.diamond.json b/deployments/mantle.diamond.json index aa453780b..91628504c 100644 --- a/deployments/mantle.diamond.json +++ b/deployments/mantle.diamond.json @@ -70,8 +70,8 @@ "Version": "1.0.0" }, "0xF5c923a087fb3c554579e2DD10AB6E37E0f6F849": { - "Name": "", - "Version": "" + "Name": "GasZipFacet", + "Version": "2.0.0" } }, "Periphery": { @@ -88,4 +88,4 @@ "TokenWrapper": "0x0263180888007D45340F86eC0b610d250BbDcB23" } } -} \ No newline at end of file +} From 09ea35ca0064073c4e8148f0bde1f876fa355745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 09:13:04 +0700 Subject: [PATCH 17/18] pushing a formatting commit since github shows outdated state --- deployments/fraxtal.diamond.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployments/fraxtal.diamond.json b/deployments/fraxtal.diamond.json index 52231e61b..70ffc62f3 100644 --- a/deployments/fraxtal.diamond.json +++ b/deployments/fraxtal.diamond.json @@ -70,10 +70,10 @@ "LiFuelFeeCollector": "0x9870F0C91D722B3393383722968269496d919bD8", "Permit2Proxy": "", "Receiver": "0xf22c55c50fF14d9AB1fa4D9DCA832085D143E854", - "ReceiverAcrossV3": "", + "ReceiverAcrossV3": " ", "ReceiverStargateV2": "", "RelayerCelerIM": "", "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5" } } -} \ No newline at end of file +} From 20299c800b22edb81a824170702361b7d98e8dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bl=C3=A4cker?= Date: Wed, 4 Dec 2024 09:16:43 +0700 Subject: [PATCH 18/18] remove formatting change - github shows correct state now --- deployments/fraxtal.diamond.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployments/fraxtal.diamond.json b/deployments/fraxtal.diamond.json index 70ffc62f3..3db5dd05b 100644 --- a/deployments/fraxtal.diamond.json +++ b/deployments/fraxtal.diamond.json @@ -70,7 +70,7 @@ "LiFuelFeeCollector": "0x9870F0C91D722B3393383722968269496d919bD8", "Permit2Proxy": "", "Receiver": "0xf22c55c50fF14d9AB1fa4D9DCA832085D143E854", - "ReceiverAcrossV3": " ", + "ReceiverAcrossV3": "", "ReceiverStargateV2": "", "RelayerCelerIM": "", "TokenWrapper": "0xC82fd49be3F3D851b9E10589C50784cEAC7114a5"