Skip to content

Commit

Permalink
Code deduplication
Browse files Browse the repository at this point in the history
  • Loading branch information
k06a committed Aug 31, 2020
1 parent 2386c7e commit 4537cff
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 87 deletions.
88 changes: 75 additions & 13 deletions contracts/OneRouterAudit.sol
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ contract OneRouterAudit is IOneRouterView, IOneRouterSwap, OneRouterConstants, O
}

constructor(IOneRouterView _oneRouterView, IOneRouterSwap _oneRouterSwap) public {
oneRouterView = _oneRouterView;
oneRouterSwap = _oneRouterSwap;
setOneRouter(_oneRouterView, _oneRouterSwap);
}

function setOneRouter(IOneRouterView _oneRouterView, IOneRouterSwap _oneRouterSwap) public onlyOwner {
Expand Down Expand Up @@ -128,9 +127,10 @@ contract OneRouterAudit is IOneRouterView, IOneRouterSwap, OneRouterConstants, O
{
uint256 gasStart = gasleft();
_claimInput(input);
input.fromToken.uniApprove(address(oneRouterSwap), input.amount);
oneRouterSwap.makeSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, swap, swapDistribution);
return _processOutput(gasStart, input, swap.flags);

swap.flags = _disableFeeAndGasHandlingInImpl(swap.flags);
_makeSwap(input, swap, swapDistribution);
return _processOutput(input, swap.flags, gasStart);
}

function makePathSwap(
Expand All @@ -144,11 +144,15 @@ contract OneRouterAudit is IOneRouterView, IOneRouterSwap, OneRouterConstants, O
validateInput(input)
returns(uint256 returnAmount)
{
require(path.swaps.length == pathDistribution.swapDistributions.length, "Wrong arrays length");

uint256 gasStart = gasleft();
_claimInput(input);
input.fromToken.uniApprove(address(oneRouterSwap), input.amount);
oneRouterSwap.makePathSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, path, pathDistribution);
return _processOutput(gasStart, input, path.swaps[0].flags);

path.swaps[0].flags = _disableFeeAndGasHandlingInImpl(path.swaps[0].flags);
_makePathSwap(input, path, pathDistribution);
return _processOutput(input, path.swaps[0].flags, gasStart);
}

function makeMultiPathSwap(
Expand All @@ -163,27 +167,85 @@ contract OneRouterAudit is IOneRouterView, IOneRouterSwap, OneRouterConstants, O
validateInput(input)
returns(uint256 returnAmount)
{
require(paths.length == pathDistributions.length, "Wrong arrays length");
require(paths.length == interPathsDistribution.weights.length, "Wrong arrays length");

uint256 gasStart = gasleft();
_claimInput(input);
input.fromToken.uniApprove(address(oneRouterSwap), input.amount);
oneRouterSwap.makeMultiPathSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, paths, pathDistributions, interPathsDistribution);
return _processOutput(gasStart, input, paths[0].swaps[0].flags);

paths[0].swaps[0].flags = _disableFeeAndGasHandlingInImpl(paths[0].swaps[0].flags);
_makeMultiPathSwap(input, paths, pathDistributions, interPathsDistribution);
return _processOutput(input, paths[0].swaps[0].flags, gasStart);
}

// Internal methods

function _claimInput(SwapInput memory input) internal {
function _approveInput(SwapInput memory input) internal virtual {
input.fromToken.uniApprove(address(oneRouterSwap), input.amount);
}

function _fee(SwapInput memory input, uint256 /*flags*/) internal pure virtual returns(uint256) {
return input.referral.fee;
}

function _makeSwap(
SwapInput memory input,
Swap memory swap,
SwapDistribution memory swapDistribution
)
internal
virtual
{
oneRouterSwap.makeSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, swap, swapDistribution);
}

function _makePathSwap(
SwapInput memory input,
Path memory path,
PathDistribution memory pathDistribution
)
internal
virtual
{
oneRouterSwap.makePathSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, path, pathDistribution);
}

function _makeMultiPathSwap(
SwapInput memory input,
Path[] memory paths,
PathDistribution[] memory pathDistributions,
SwapDistribution memory interPathsDistribution
)
internal
virtual
{
oneRouterSwap.makeMultiPathSwap{ value: input.fromToken.isETH() ? input.amount : 0 }(input, paths, pathDistributions, interPathsDistribution);
}

// Private methods

function _disableFeeAndGasHandlingInImpl(uint256 flags) private pure returns(uint256) {
return flags
| _FLAG_DISABLE_REFERRAL_FEE
& (~_FLAG_ENABLE_CHI_BURN)
& (~_FLAG_ENABLE_CHI_BURN_ORIGIN)
& (~_FLAG_ENABLE_REFERRAL_GAS_DISCOUNT);
}

function _claimInput(SwapInput memory input) private {
input.fromToken.uniTransferFromSender(address(this), input.amount);
input.amount = input.fromToken.uniBalanceOf(address(this));
_approveInput(input);
}

function _processOutput(uint256 gasStart, SwapInput memory input, uint256 flags) private returns(uint256 returnAmount) {
function _processOutput(SwapInput memory input, uint256 flags, uint256 gasStart) private returns(uint256 returnAmount) {
uint256 remaining = input.fromToken.uniBalanceOf(address(this));
returnAmount = input.destToken.uniBalanceOf(address(this));
require(returnAmount >= input.minReturn, "OneRouter: less than minReturn");
input.fromToken.uniTransfer(msg.sender, remaining);
input.destToken.uniTransfer(input.referral.ref, returnAmount.mul(input.referral.fee).div(1e18));
input.destToken.uniTransfer(msg.sender, returnAmount.sub(returnAmount.mul(input.referral.fee).div(1e18)));
input.destToken.uniTransfer(input.referral.ref, returnAmount.mul(_fee(input, flags)).div(1e18));
input.destToken.uniTransfer(msg.sender, returnAmount.sub(returnAmount.mul(_fee(input, flags)).div(1e18)));

if ((flags & (_FLAG_ENABLE_CHI_BURN | _FLAG_ENABLE_CHI_BURN_ORIGIN)) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
Expand Down
1 change: 1 addition & 0 deletions contracts/OneRouterConstants.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ contract OneRouterConstants {
uint256 constant internal _FLAG_ENABLE_CHI_BURN = 0x400000000000000000000000000000000;
uint256 constant internal _FLAG_ENABLE_CHI_BURN_ORIGIN = 0x800000000000000000000000000000000;
uint256 constant internal _FLAG_ENABLE_REFERRAL_GAS_DISCOUNT = 0x1000000000000000000000000000000000;
uint256 constant internal _FLAG_DISABLE_REFERRAL_FEE = 0x2000000000000000000000000000000000;

uint256 constant internal _FLAG_DISABLE_UNISWAP_V1 = 0x1;
uint256 constant internal _FLAG_DISABLE_UNISWAP_V2 = 0x2;
Expand Down
88 changes: 15 additions & 73 deletions contracts/OneRouterSwap.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@ import "./sources/CurveSource.sol";
// import "./sources/BalancerSource.sol";

import "./IOneRouterSwap.sol";
import "./OneRouterAudit.sol";
import "./HotSwapSources.sol";


contract OneRouterSwap is
OneRouterConstants,
IOneRouterSwap,
OneRouterAudit,
HotSwapSources,
UniswapV1SourceSwap,
UniswapV2SourceSwap,
Expand All @@ -32,77 +33,21 @@ contract OneRouterSwap is
using Address2 for address;
using FlagsChecker for uint256;

modifier validateInput(SwapInput memory input) {
require(input.fromToken != input.destToken, "OneRouter: invalid input");
require(msg.value == (input.fromToken.isETH() ? input.amount : 0), "OneRouter: Wrong msg.value");
_;
}

receive() external payable {
// solhint-disable-next-line avoid-tx-origin
require(msg.sender != tx.origin, "ETH deposit rejected");
}

function makeSwap(
SwapInput memory input,
IOneRouterView.Swap memory swap,
SwapDistribution memory swapDistribution
)
public
payable
override
validateInput(input)
returns(uint256 returnAmount)
{
_claimInput(input);
_makeSwap(input, swap, swapDistribution);
return _processOutput(input);
}

function makePathSwap(
SwapInput memory input,
IOneRouterView.Path memory path,
PathDistribution memory pathDistribution
)
constructor(IOneRouterView _oneRouterView)
public
payable
override
validateInput(input)
returns(uint256 returnAmount)
OneRouterAudit(_oneRouterView, IOneRouterSwap(0))
{
require(path.swaps.length == pathDistribution.swapDistributions.length, "Wrong arrays length");

_claimInput(input);
_makePathSwap(input, path, pathDistribution);
return _processOutput(input);
}

function makeMultiPathSwap(
SwapInput memory input,
IOneRouterView.Path[] memory paths,
PathDistribution[] memory pathDistributions,
SwapDistribution memory interPathsDistribution
)
public
payable
override
validateInput(input)
returns(uint256 returnAmount)
{
require(paths.length == pathDistributions.length, "Wrong arrays length");
require(paths.length == interPathsDistribution.weights.length, "Wrong arrays length");

_claimInput(input);
_makeMultiPathSwap(input, paths, pathDistributions, interPathsDistribution);
return _processOutput(input);
}
// Internal methods

function _makeSwap(
SwapInput memory input,
IOneRouterView.Swap memory swap,
SwapDistribution memory swapDistribution
)
private
internal
override
{
function(IERC20,IERC20,uint256,uint256)[15] memory reserves = [
_swapOnUniswapV1,
Expand Down Expand Up @@ -163,7 +108,8 @@ contract OneRouterSwap is
IOneRouterView.Path memory path,
PathDistribution memory pathDistribution
)
private
internal
override
{
for (uint s = 0; s < pathDistribution.swapDistributions.length; s++) {
IERC20 fromToken = (s == 0) ? input.fromToken : path.swaps[s - 1].destToken;
Expand All @@ -184,7 +130,8 @@ contract OneRouterSwap is
PathDistribution[] memory pathDistributions,
SwapDistribution memory interPathsDistribution
)
private
internal
override
{
uint256 interTotalWeight = 0;
for (uint i = 0; i < interPathsDistribution.weights.length; i++) {
Expand All @@ -205,16 +152,11 @@ contract OneRouterSwap is
}
}

function _claimInput(SwapInput memory input) private {
input.fromToken.uniTransferFromSender(address(this), input.amount);
input.amount = input.fromToken.uniBalanceOf(address(this));
function _approveInput(SwapInput memory input) internal override {
// No need to approve + transferFrom
}

function _processOutput(SwapInput memory input) private returns(uint256 returnAmount) {
uint256 remaining = input.fromToken.uniBalanceOf(address(this));
returnAmount = input.destToken.uniBalanceOf(address(this));
require(returnAmount >= input.minReturn, "OneRouter: less than minReturn");
input.fromToken.uniTransfer(msg.sender, remaining);
input.destToken.uniTransfer(msg.sender, returnAmount);
function _fee(SwapInput memory input, uint256 flags) internal pure override returns(uint256) {
return (flags & _FLAG_DISABLE_REFERRAL_FEE != 0) ? 0 : input.referral.fee;
}
}
2 changes: 1 addition & 1 deletion test/OneRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ contract('OneRouter', function ([_, wallet1, wallet2]) {
tokens.USDC = await IERC20.at('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48');

this.routerView = await OneRouterView.new();
this.routerSwap = await OneRouterSwap.new();
this.routerSwap = await OneRouterSwap.new(this.routerView.address);
this.router = await OneRouter.new(this.routerView.address, this.routerSwap.address);
});

Expand Down

0 comments on commit 4537cff

Please sign in to comment.