From db7a428bd30733d94c627039f75f56c545857bfc Mon Sep 17 00:00:00 2001 From: Amirahanian <131666681+Amirahanian@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:30:46 +0330 Subject: [PATCH] Delete contracts/features directory --- contracts/features/AggregationFeature.sol | 327 ------------------ .../features/BridgeAggregationFeature.sol | 252 -------------- contracts/features/IAggregationFeature.sol | 36 -- .../features/IBridgeAggregationFeature.sol | 35 -- 4 files changed, 650 deletions(-) delete mode 100644 contracts/features/AggregationFeature.sol delete mode 100644 contracts/features/BridgeAggregationFeature.sol delete mode 100644 contracts/features/IAggregationFeature.sol delete mode 100644 contracts/features/IBridgeAggregationFeature.sol diff --git a/contracts/features/AggregationFeature.sol b/contracts/features/AggregationFeature.sol deleted file mode 100644 index d103d36..0000000 --- a/contracts/features/AggregationFeature.sol +++ /dev/null @@ -1,327 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; - -import "../interfaces/IBKFees.sol"; -import "../interfaces/IBKRegistry.sol"; -import "../utils/TransferHelper.sol"; - -import { - BasicParams, - AggregationParams, - SwapType, - OrderInfo -} from "../interfaces/IBKStructsAndEnums.sol"; - -import { - IBKErrors -} from "../interfaces/IBKErrors.sol"; - -library AggregationFeature { - string public constant FEATURE_NAME = "BitKeep SOR: Aggregation Feature"; - string public constant FEATURE_VERSION = "1.0"; - - address public constant BK_FEES = 0xE4DA6f981a78b8b9edEfE4D7a955C04bA7e67D8D; - address public constant BK_REGISTRY = 0x9aFD2948F573DD8684347924eBcE1847D50621eD; - - bytes4 public constant FUNC_SWAP = bytes4(keccak256(bytes("swap(AggregationFeature.SwapDetail)"))); // 0x6a2b69f0 - - event BKSwapV2( - SwapType indexed swapType, - address indexed receiver, - uint feeAmount, - string featureName, - string featureVersion - ); - - event OrderInfoEvent( - bytes transferId, - uint dstChainId, - address sender, - address bridgeReceiver, - address tokenIn, - address desireToken, - uint amount - ); - - struct SwapDetail { - BasicParams basicParams; - AggregationParams aggregationParams; - OrderInfo orderInfo; - } - - function swap(SwapDetail calldata swapDetail) public { - if(!IBKRegistry(BK_REGISTRY).isCallTarget(FUNC_SWAP, swapDetail.aggregationParams.callTarget)) { - revert IBKErrors.IllegalCallTarget(); - } - - if(!IBKRegistry(BK_REGISTRY).isApproveTarget(FUNC_SWAP, swapDetail.aggregationParams.approveTarget)) { - revert IBKErrors.IllegalApproveTarget(); - } - - (address feeTo, address altcoinFeeTo, uint feeRate) = IBKFees(BK_FEES).getFeeTo(); - - if(swapDetail.basicParams.swapType > SwapType.WHITE_TO_TOKEN) { - revert IBKErrors.SwapTypeNotAvailable(); - } - - if(swapDetail.basicParams.swapType == SwapType.FREE) { - _swapForFree(swapDetail); - } else if(swapDetail.basicParams.swapType == SwapType.ETH_TOKEN) { - if(msg.value < swapDetail.basicParams.amountInForSwap) { - revert IBKErrors.SwapEthBalanceNotEnough(); - } - _swapEth2Token(swapDetail, payable(feeTo), feeRate); - } else { - _swapToken2Others(swapDetail, payable(feeTo), altcoinFeeTo, feeRate); - } - } - - function _swapForFree(SwapDetail calldata swapDetail) internal { - IBKFees(BK_FEES).checkIsSigner( - swapDetail.basicParams.signParams.nonceHash, - swapDetail.basicParams.signParams.signature - ); - - IERC20 fromToken = IERC20(swapDetail.basicParams.fromTokenAddress); - - bool toTokenIsETH = TransferHelper.isETH(swapDetail.basicParams.toTokenAddress); - - if(TransferHelper.isETH(swapDetail.basicParams.fromTokenAddress)) { - if(msg.value < swapDetail.basicParams.amountInForSwap) { - revert IBKErrors.SwapEthBalanceNotEnough(); - } - } else { - uint fromBalanceOfThis = fromToken.balanceOf(address(this)); - - if(fromBalanceOfThis < swapDetail.basicParams.amountInTotal) { - revert IBKErrors.BurnToMuch(); - } - - TransferHelper.approveMax( - fromToken, - swapDetail.aggregationParams.approveTarget, - swapDetail.basicParams.amountInTotal - ); - } - - uint balanceOfThis = - toTokenIsETH ? - address(this).balance : IERC20(swapDetail.basicParams.toTokenAddress).balanceOf(address(this)); - - (bool success, ) = swapDetail.aggregationParams.callTarget.call{value: msg.value}(swapDetail.aggregationParams.data); - _checkCallResult(success); - - uint balanceNow = - toTokenIsETH ? - address(this).balance : IERC20(swapDetail.basicParams.toTokenAddress).balanceOf(address(this)); - - if(toTokenIsETH) { - TransferHelper.safeTransferETH(swapDetail.basicParams.receiver, balanceNow - balanceOfThis); - } else { - TransferHelper.safeTransfer(swapDetail.basicParams.toTokenAddress, swapDetail.basicParams.receiver, balanceNow - balanceOfThis); - } - - emit BKSwapV2( - swapDetail.basicParams.swapType, - swapDetail.basicParams.receiver, - 0, - FEATURE_NAME, - FEATURE_VERSION - ); - - emit OrderInfoEvent( - swapDetail.orderInfo.transferId, - swapDetail.orderInfo.dstChainId, - msg.sender, - swapDetail.orderInfo.bridgeReceiver, - swapDetail.basicParams.fromTokenAddress, - swapDetail.orderInfo.desireToken, - balanceNow - balanceOfThis - ); - } - - function _swapEth2Token(SwapDetail calldata swapDetail, address payable _feeTo, uint _feeRate) internal { - IERC20 toToken = IERC20(swapDetail.basicParams.toTokenAddress); - - uint beforeBalanceOfToken = toToken.balanceOf(address(this)); - - uint feeAmount = swapDetail.basicParams.amountInTotal * _feeRate / 1e4; - TransferHelper.safeTransferETH(_feeTo, feeAmount); - - (bool success, ) = swapDetail.aggregationParams.callTarget.call{value: swapDetail.basicParams.amountInForSwap}(swapDetail.aggregationParams.data); - - _checkCallResult(success); - - uint afterBalanceOfToken = toToken.balanceOf(address(this)); - - TransferHelper.safeTransfer( - swapDetail.basicParams.toTokenAddress, - swapDetail.basicParams.receiver, - afterBalanceOfToken - beforeBalanceOfToken - ); - - emit BKSwapV2( - swapDetail.basicParams.swapType, - swapDetail.basicParams.receiver, - feeAmount, - FEATURE_NAME, - FEATURE_VERSION - ); - - emit OrderInfoEvent( - swapDetail.orderInfo.transferId, - swapDetail.orderInfo.dstChainId, - msg.sender, - swapDetail.orderInfo.bridgeReceiver, - swapDetail.basicParams.fromTokenAddress, - swapDetail.orderInfo.desireToken, - afterBalanceOfToken - beforeBalanceOfToken - ); - } - - function _swapToken2Others(SwapDetail calldata swapDetail, address feeTo, address altcoinFeeTo, uint feeRate) internal { - IERC20 fromToken = IERC20(swapDetail.basicParams.fromTokenAddress); - - uint balanceOfThis = fromToken.balanceOf(address(this)); - - if(balanceOfThis < swapDetail.basicParams.amountInTotal) { - revert IBKErrors.BurnToMuch(); - } - - TransferHelper.approveMax( - fromToken, - swapDetail.aggregationParams.approveTarget, - swapDetail.basicParams.amountInTotal - ); - - if(swapDetail.basicParams.swapType == SwapType.TOKEN_ETH) { - _swapToken2ETH(swapDetail, payable(feeTo), feeRate); - } else if(swapDetail.basicParams.swapType == SwapType.TOKEN_TO_WHITE) { - _swapToken2white(swapDetail, feeTo, feeRate); - } else { - _swapToken2token( - swapDetail, - swapDetail.basicParams.swapType == SwapType.TOKEN_TOKEN ? altcoinFeeTo : feeTo, - feeRate - ); - } - } - - function _swapToken2ETH(SwapDetail calldata swapDetail, address payable _feeTo, uint _feeRate) internal { - uint balanceBefore = address(this).balance; - uint feeAmount; - uint swappedAmount; - - (bool success, ) = swapDetail.aggregationParams.callTarget.call{value: 0}(swapDetail.aggregationParams.data); - _checkCallResult(success); - - swappedAmount = address(this).balance - balanceBefore; - - feeAmount = swappedAmount * _feeRate / 1e4; - TransferHelper.safeTransferETH(_feeTo, feeAmount); - - TransferHelper.safeTransferETH(swapDetail.basicParams.receiver, swappedAmount - feeAmount); - - emit BKSwapV2( - swapDetail.basicParams.swapType, - swapDetail.basicParams.receiver, - feeAmount, - FEATURE_NAME, - FEATURE_VERSION - ); - - emit OrderInfoEvent( - swapDetail.orderInfo.transferId, - swapDetail.orderInfo.dstChainId, - msg.sender, - swapDetail.orderInfo.bridgeReceiver, - swapDetail.basicParams.fromTokenAddress, - swapDetail.orderInfo.desireToken, - swappedAmount - feeAmount - ); - } - - function _swapToken2token(SwapDetail calldata swapDetail, address _feeTo, uint _feeRate) internal { - IERC20 toToken = IERC20(swapDetail.basicParams.toTokenAddress); - uint balanceBefore = toToken.balanceOf(address(this)); - uint feeAmount; - - feeAmount = swapDetail.basicParams.amountInTotal * _feeRate / 1e4; - TransferHelper.safeTransfer(swapDetail.basicParams.fromTokenAddress, _feeTo, feeAmount); - - (bool success, ) = swapDetail.aggregationParams.callTarget.call{value: 0}(swapDetail.aggregationParams.data); - _checkCallResult(success); - - uint balanceAfter = toToken.balanceOf(address(this)); - - TransferHelper.safeTransfer( - swapDetail.basicParams.toTokenAddress, - swapDetail.basicParams.receiver, - balanceAfter- balanceBefore - ); - - emit BKSwapV2( - swapDetail.basicParams.swapType, - swapDetail.basicParams.receiver, - feeAmount, - FEATURE_NAME, - FEATURE_VERSION - ); - - emit OrderInfoEvent( - swapDetail.orderInfo.transferId, - swapDetail.orderInfo.dstChainId, - msg.sender, - swapDetail.orderInfo.bridgeReceiver, - swapDetail.basicParams.fromTokenAddress, - swapDetail.orderInfo.desireToken, - balanceAfter- balanceBefore - ); - } - - function _swapToken2white(SwapDetail calldata swapDetail, address _feeTo, uint _feeRate) internal { - IERC20 toToken = IERC20(swapDetail.basicParams.toTokenAddress); - - uint balanceBefore = toToken.balanceOf(address(this)); - uint swappedAmount; - uint feeAmount; - - (bool success, ) = swapDetail.aggregationParams.callTarget.call{value: 0}(swapDetail.aggregationParams.data); - _checkCallResult(success); - - swappedAmount = toToken.balanceOf(address(this)) - balanceBefore; - - feeAmount = swappedAmount * _feeRate / 1e4; - TransferHelper.safeTransfer(swapDetail.basicParams.toTokenAddress, _feeTo, feeAmount); - - TransferHelper.safeTransfer(swapDetail.basicParams.toTokenAddress, swapDetail.basicParams.receiver, swappedAmount - feeAmount); - - emit BKSwapV2( - swapDetail.basicParams.swapType, - swapDetail.basicParams.receiver, - feeAmount, - FEATURE_NAME, - FEATURE_VERSION - ); - - emit OrderInfoEvent( - swapDetail.orderInfo.transferId, - swapDetail.orderInfo.dstChainId, - msg.sender, - swapDetail.orderInfo.bridgeReceiver, - swapDetail.basicParams.fromTokenAddress, - swapDetail.orderInfo.desireToken, - swappedAmount - feeAmount - ); - } - - function _checkCallResult(bool _success) internal pure { - if (!_success) { - // Copy revert reason from call - assembly { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - } -} \ No newline at end of file diff --git a/contracts/features/BridgeAggregationFeature.sol b/contracts/features/BridgeAggregationFeature.sol deleted file mode 100644 index 3d44770..0000000 --- a/contracts/features/BridgeAggregationFeature.sol +++ /dev/null @@ -1,252 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -import "../interfaces/IBKFees.sol"; -import "../interfaces/IBKRegistry.sol"; -import "../utils/TransferHelper.sol"; - -import {SignParams, AggregationParams} from "../interfaces/IBKStructsAndEnums.sol"; -import {IBKErrors} from "../interfaces/IBKErrors.sol"; - -library BridgeAggregationFeature { - string public constant FEATURE_NAME = - "BitKeep SOR: Bridge Aggregation Feature"; - string public constant FEATURE_VERSION = "1.0"; - - address public constant BK_FEES = - 0xE4DA6f981a78b8b9edEfE4D7a955C04bA7e67D8D; - address public constant BK_REGISTRY = - 0x9aFD2948F573DD8684347924eBcE1847D50621eD; - - bytes4 public constant FUNC_BRIDGE_AGG = - bytes4( - keccak256( - bytes("bridge_agg(BridgeAggregationFeature.BridgeDetail)") - ) - ); // 0xb0dce4dd - - event BridgeAgg( - BridgeType indexed bridgeType, - address fromTokenAddress, - address toTokenAddress, - address fromChainId, - address dstChainId, - uint256 amountInTotal, - uint256 amountInForSwap, - uint256 additionalFee, - address receiver, - uint256 minAmountOut, - uint256 feeAmount, - string featureName, - string featureVersion - ); - - enum BridgeType { - FREE, - ETH_OTHERS, - TOKEN_OTHERS - } - - struct BridgeBasicParams { - SignParams signParams; - BridgeType bridgeType; - bool feeTokenIsWhite; - address fromTokenAddress; - address toTokenAddress; - address fromChainId; - address dstChainId; - uint256 amountInTotal; - uint256 amountInForSwap; - uint256 additionalFee; - address receiver; - uint256 minAmountOut; - } - - struct BridgeDetail { - BridgeBasicParams basicParams; - AggregationParams aggregationParams; - } - - function bridge_agg(BridgeDetail calldata bridgeDetail) external { - if ( - !IBKRegistry(BK_REGISTRY).isCallTarget( - FUNC_BRIDGE_AGG, - bridgeDetail.aggregationParams.callTarget - ) - ) { - revert IBKErrors.IllegalCallTarget(); - } - - if ( - !IBKRegistry(BK_REGISTRY).isApproveTarget( - FUNC_BRIDGE_AGG, - bridgeDetail.aggregationParams.approveTarget - ) - ) { - revert IBKErrors.IllegalApproveTarget(); - } - - if (bridgeDetail.basicParams.bridgeType > BridgeType.TOKEN_OTHERS) { - revert IBKErrors.SwapTypeNotAvailable(); - } - - bool fromTokenIsETH = TransferHelper.isETH( - bridgeDetail.basicParams.fromTokenAddress - ); - - if (fromTokenIsETH) { - if (msg.value < bridgeDetail.basicParams.amountInTotal) { - revert IBKErrors.SwapEthBalanceNotEnough(); - } - } else { - if (msg.value < bridgeDetail.basicParams.additionalFee) { - revert IBKErrors.SwapEthBalanceNotEnough(); - } - } - - IBKFees(BK_FEES).checkIsSigner( - keccak256( - abi.encodePacked( - bridgeDetail.basicParams.signParams.nonceHash, - bridgeDetail.basicParams.amountInTotal, - bridgeDetail.basicParams.amountInForSwap, - bridgeDetail.basicParams.additionalFee - ) - ), - bridgeDetail.basicParams.signParams.signature - ); - - if (bridgeDetail.basicParams.bridgeType == BridgeType.FREE) { - if (fromTokenIsETH) { - _bridgeEth2Others(bridgeDetail, true, payable(address(0)), 0); - } else { - _bridgeToken2Others(bridgeDetail, true, address(0), 0); - } - } else { - (address feeTo, address altcoinFeeTo, uint256 feeRate) = IBKFees( - BK_FEES - ).getFeeTo(); - - if (bridgeDetail.basicParams.bridgeType == BridgeType.ETH_OTHERS) { - _bridgeEth2Others(bridgeDetail, false, payable(feeTo), feeRate); - } else { - if (bridgeDetail.basicParams.feeTokenIsWhite) { - _bridgeToken2Others(bridgeDetail, false, feeTo, feeRate); - } else { - _bridgeToken2Others( - bridgeDetail, - false, - altcoinFeeTo, - feeRate - ); - } - } - } - } - - function _bridgeEth2Others( - BridgeDetail calldata bridgeDetail, - bool _isFree, - address payable _feeTo, - uint256 _feeRate - ) internal { - uint256 feeAmount; - if (!_isFree) { - feeAmount = - ((bridgeDetail.basicParams.amountInTotal - - bridgeDetail.basicParams.additionalFee) * _feeRate) / - 1e4; - TransferHelper.safeTransferETH(_feeTo, feeAmount); - } - - if ( - bridgeDetail.basicParams.amountInForSwap != - bridgeDetail.basicParams.amountInTotal - - bridgeDetail.basicParams.additionalFee - - feeAmount - ) { - revert IBKErrors.SwapEthBalanceNotEnough(); - } - - (bool success, ) = bridgeDetail.aggregationParams.callTarget.call{ - value: bridgeDetail.basicParams.amountInForSwap + - bridgeDetail.basicParams.additionalFee - }(bridgeDetail.aggregationParams.data); - - _checkCallResult(success); - - _emitEvent(bridgeDetail, feeAmount); - } - - function _bridgeToken2Others( - BridgeDetail calldata bridgeDetail, - bool _isFree, - address _feeTo, - uint256 _feeRate - ) internal { - IERC20 fromToken = IERC20(bridgeDetail.basicParams.fromTokenAddress); - - TransferHelper.approveMax( - fromToken, - bridgeDetail.aggregationParams.approveTarget, - bridgeDetail.basicParams.amountInTotal - ); - - uint256 feeAmount; - if (!_isFree) { - feeAmount = - (bridgeDetail.basicParams.amountInTotal * _feeRate) / - 1e4; - TransferHelper.safeTransfer( - bridgeDetail.basicParams.fromTokenAddress, - _feeTo, - feeAmount - ); - } - - if ( - bridgeDetail.basicParams.amountInForSwap != - bridgeDetail.basicParams.amountInTotal - feeAmount - ) { - revert IBKErrors.SwapTokenBalanceNotEnough(); - } - - (bool success, ) = bridgeDetail.aggregationParams.callTarget.call{ - value: bridgeDetail.basicParams.additionalFee - }(bridgeDetail.aggregationParams.data); - - _checkCallResult(success); - - _emitEvent(bridgeDetail, feeAmount); - } - - function _emitEvent( - BridgeDetail calldata bridgeDetail, - uint256 feeAmount - ) internal { - emit BridgeAgg( - bridgeDetail.basicParams.bridgeType, - bridgeDetail.basicParams.fromTokenAddress, - bridgeDetail.basicParams.toTokenAddress, - bridgeDetail.basicParams.fromChainId, - bridgeDetail.basicParams.dstChainId, - bridgeDetail.basicParams.amountInTotal, - bridgeDetail.basicParams.amountInForSwap, - bridgeDetail.basicParams.additionalFee, - bridgeDetail.basicParams.receiver, - bridgeDetail.basicParams.minAmountOut, - feeAmount, - FEATURE_NAME, - FEATURE_VERSION - ); - } - - function _checkCallResult(bool _success) internal pure { - if (!_success) { - assembly { - returndatacopy(0, 0, returndatasize()) - revert(0, returndatasize()) - } - } - } -} diff --git a/contracts/features/IAggregationFeature.sol b/contracts/features/IAggregationFeature.sol deleted file mode 100644 index d9503a9..0000000 --- a/contracts/features/IAggregationFeature.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.17; - -import { - BasicParams, - AggregationParams, - SwapType, - OrderInfo -} from "../interfaces/IBKStructsAndEnums.sol"; - -interface IAggregationFeature { - event Swap( - SwapType indexed swapType, - address indexed receiver, - uint feeAmount, - string featureName - ); - - event OrderInfoEvent( - bytes transferId, - uint dstChainId, - address sender, - address bridgeReceiver, - address tokenIn, - address desireToken, - uint amount - ); - - struct SwapDetail { - BasicParams basicParams; - AggregationParams aggregationParams; - OrderInfo orderInfo; - } - - function swap(SwapDetail calldata swapDetail) external; -} \ No newline at end of file diff --git a/contracts/features/IBridgeAggregationFeature.sol b/contracts/features/IBridgeAggregationFeature.sol deleted file mode 100644 index f562f31..0000000 --- a/contracts/features/IBridgeAggregationFeature.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.18; - -import {SignParams, AggregationParams} from "../interfaces/IBKStructsAndEnums.sol"; - -interface IBridgeAggregationFeature { - - enum BridgeType { - FREE, - ETH_OTHERS, - TOKEN_OTHERS - } - - struct BridgeBasicParams { - SignParams signParams; // 签名信息,bridgeType为free类型需要 - BridgeType bridgeType; // bridge类型 - bool feeTokenIsWhite; // 收取手续费的token是不是白名单币种,服务端传参 - address fromTokenAddress; // 源链fromToken地址 - address toTokenAddress; // 目标链toToken地址 - uint256 fromChainId; // 源链chainId - uint256 dstChainId; // 目标链chainId - uint256 amountInTotal; // amountInTotal = amountInForSwap + additionalFee - uint256 amountInForSwap; // amountIn扣除手续费,服务端计算 - uint256 additionalFee; // 附加费用,作为交易附带的value传递,如果没有,传0 - address receiver; // 目标链兑换接收者 - uint256 minAmountOut; // toToken在目标链接收到的minAmountOut - } - - struct BridgeDetail { - BridgeBasicParams basicParams; - AggregationParams aggregationParams; - } - - function bridge_agg(BridgeDetail calldata bridgeDetail) external; -} \ No newline at end of file