From c9a27e7d09a932421c7eeb629d53738c816608f2 Mon Sep 17 00:00:00 2001 From: owen05 Date: Fri, 9 Apr 2021 09:46:03 +0800 Subject: [PATCH] ing --- .../SmartRoute/proxies/DODORouteProxy.sol | 85 +++++++++++++------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/contracts/SmartRoute/proxies/DODORouteProxy.sol b/contracts/SmartRoute/proxies/DODORouteProxy.sol index 51c3c56..e02263b 100644 --- a/contracts/SmartRoute/proxies/DODORouteProxy.sol +++ b/contracts/SmartRoute/proxies/DODORouteProxy.sol @@ -1,13 +1,9 @@ -/* - - Copyright 2020 DODO ZOO. - SPDX-License-Identifier: Apache-2.0 - -*/ - pragma solidity 0.6.9; pragma experimental ABIEncoderV2; +import {IDODOV2Proxy01} from "../intf/IDODOV2Proxy01.sol"; +import {IDODOV2} from "../intf/IDODOV2.sol"; +import {IDODOV1} from "../intf/IDODOV1.sol"; import {IDODOApproveProxy} from "../DODOApproveProxy.sol"; import {IERC20} from "../../intf/IERC20.sol"; import {IWETH} from "../../intf/IWETH.sol"; @@ -63,40 +59,40 @@ contract DODORouteProxy { } function dodoMutliSwap( - uint256 fromTokenAmount, + address _fromToken, + address _toToken, + uint256 _fromTokenAmount, uint256 minReturnAmount, uint256[] memory totalWeight, - uint256[] memory splitNumber, address[] memory midToken, + uint256[] calldata splitNumber, + bytes[] calldata sequence, address[] memory assetFrom, - bytes[] memory sequence, uint256 deadLine ) external payable judgeExpired(deadLine) returns (uint256 returnAmount) { - require(assetFrom.length == splitNumber.length, 'DODORouteProxy: PAIR_ASSETTO_NOT_MATCH'); - require(minReturnAmount > 0, "DODORouteProxy: RETURN_AMOUNT_ZERO"); - - uint256 _fromTokenAmount = fromTokenAmount; - address fromToken = midToken[0]; - address toToken = midToken[midToken.length - 1]; + require(midToken[0] == _fromToken && midToken[midToken.length - 1] == _toToken, 'RABMixSwap: INVALID_PATH'); + require(assetFrom.length == splitNumber.length+1, 'RABMixSwap: PAIR_ASSETTO_NOT_MATCH'); + require(minReturnAmount > 0, "RABMixSwap: RETURN_AMOUNT_ZERO"); - uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); - _deposit(msg.sender, assetFrom[0], fromToken, _fromTokenAmount, fromToken == _ETH_ADDRESS_); - - _multiSwap(totalWeight, midToken, splitNumber, sequence, assetFrom); + uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender); + _deposit(msg.sender, assetFrom[0], _fromToken, _fromTokenAmount, _fromToken == _ETH_ADDRESS_); + _RABHelper(totalWeight, midToken, splitNumber, sequence, assetFrom); - if(toToken == _ETH_ADDRESS_) { + + if(_toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); msg.sender.transfer(returnAmount); }else { - returnAmount = IERC20(toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance); + returnAmount = IERC20(_toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance); } - require(returnAmount >= minReturnAmount, "DODORouteProxy: Return amount is not enough"); + require(returnAmount >= minReturnAmount, "RABMixSwap: Return amount is not enough"); + emit OrderHistory( - fromToken, - toToken, + _fromToken, + _toToken, msg.sender, _fromTokenAmount, returnAmount @@ -106,10 +102,10 @@ contract DODORouteProxy { //====================== internal ======================= - function _multiSwap( + function _RABHelper( uint256[] memory totalWeight, address[] memory midToken, - uint256[] memory splitNumber, + uint256[] memory splitNumberHelp, bytes[] memory swapSequence, address[] memory assetFrom ) internal { @@ -124,7 +120,12 @@ contract DODORouteProxy { uint256 weight = (0xffff & mixPara) >> 9; uint256 poolEdition = (0xff & mixPara); - if(assetFrom[i-1] == address(this)) { + //uint256 poolWeight = swapSequence[j][i].weight; + //address pool = swapSequence[j][i].pool; + + //require(poolWeight < curTotalWeight, 'RABMixSwap: INVALID_SUBWEIGHT'); + + if(assetFrom[j] == address(this)) { uint256 curAmount = curTotalAmount.div(curTotalWeight).mul(weight); if(poolEdition == 1) { @@ -143,8 +144,18 @@ contract DODORouteProxy { } } } + } + /* + function _decodeSwap(bytes calldata originData) internal returns (address _pool, address _adapter, uint256 _direction, uint256 _weight) { + for(uint256 i = 0; i < originData.length; ++i) { + bytes memory tmpData = originData[i]; + (address _pool, address _adapter, uint256 _direction, uint256 _weight) = abi.decode(tmpData, (address, address, uint256, uint256)); + } + } + */ + function _deposit( address from, address to, @@ -161,4 +172,22 @@ contract DODORouteProxy { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount); } } + + function _withdraw( + address payable to, + address token, + uint256 amount, + bool isETH + ) internal { + if (isETH) { + if (amount > 0) { + IWETH(_WETH_).withdraw(amount); + to.transfer(amount); + } + } else { + if (amount > 0) { + SafeERC20.safeTransfer(IERC20(token), to, amount); + } + } + } } \ No newline at end of file