Skip to content

Commit

Permalink
Merge pull request #10 from CryptoManiacsZone/master
Browse files Browse the repository at this point in the history
Updates and fixes
  • Loading branch information
krboktv authored Jun 29, 2020
2 parents 7a6df43 + db7a485 commit f2cc181
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 115 deletions.
2 changes: 1 addition & 1 deletion OneSplit.full.bin

Large diffs are not rendered by default.

56 changes: 11 additions & 45 deletions OneSplit.full.sol
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@ contract IOneSplitConsts {
uint256 internal constant FLAG_ENABLE_KYBER_UNISWAP_RESERVE = 0x1000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_OASIS_RESERVE = 0x2000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_BANCOR_RESERVE = 0x4000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_REFERRAL_GAS_SPONSORSHIP = 0x8000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_MULTI_PATH_COMP = 0x10000000000000; // Turned off by default
}


Expand Down Expand Up @@ -1370,6 +1372,7 @@ contract OneSplitRoot is IOneSplitView {
IERC20 constant internal tbtc = IERC20(0x1bBE271d15Bb64dF0bc6CD28Df9Ff322F2eBD847);
IERC20 constant internal hbtc = IERC20(0x0316EB71485b0Ab14103307bf65a021042c6d380);
IERC20 constant internal sbtc = IERC20(0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6);
IERC20 constant internal comp = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888);

IKyberNetworkProxy constant internal kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755);
IUniswapFactory constant internal uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95);
Expand Down Expand Up @@ -3586,24 +3589,26 @@ pragma solidity ^0.5.0;

contract OneSplitMultiPathBase is IOneSplitConsts, OneSplitRoot {
function _getMultiPathToken(uint256 flags) internal pure returns(IERC20 midToken) {
uint256[7] memory allFlags = [
uint256[8] memory allFlags = [
FLAG_ENABLE_MULTI_PATH_ETH,
FLAG_ENABLE_MULTI_PATH_DAI,
FLAG_ENABLE_MULTI_PATH_USDC,
FLAG_ENABLE_MULTI_PATH_USDT,
FLAG_ENABLE_MULTI_PATH_WBTC,
FLAG_ENABLE_MULTI_PATH_TBTC,
FLAG_ENABLE_MULTI_PATH_RENBTC
FLAG_ENABLE_MULTI_PATH_RENBTC,
FLAG_ENABLE_MULTI_PATH_COMP
];

IERC20[7] memory allMidTokens = [
IERC20[8] memory allMidTokens = [
ETH_ADDRESS,
dai,
usdc,
usdt,
wbtc,
tbtc,
renbtc
renbtc,
comp
];

for (uint i = 0; i < allFlags.length; i++) {
Expand All @@ -3613,44 +3618,6 @@ contract OneSplitMultiPathBase is IOneSplitConsts, OneSplitRoot {
}
}
}

function _getFlagsByDistribution(uint256[] memory distribution) internal pure returns(uint256 flags) {
uint256[DEXES_COUNT] memory sourcesFlags = [
FLAG_DISABLE_UNISWAP,
FLAG_DISABLE_KYBER,
FLAG_DISABLE_BANCOR,
FLAG_DISABLE_OASIS,
FLAG_DISABLE_CURVE_COMPOUND,
FLAG_DISABLE_CURVE_USDT,
FLAG_DISABLE_CURVE_Y,
FLAG_DISABLE_CURVE_BINANCE,
FLAG_DISABLE_CURVE_SYNTHETIX,
FLAG_DISABLE_UNISWAP_COMPOUND,
FLAG_DISABLE_UNISWAP_CHAI,
FLAG_DISABLE_UNISWAP_AAVE,
FLAG_DISABLE_MOONISWAP,
FLAG_DISABLE_UNISWAP_V2,
FLAG_DISABLE_UNISWAP_V2_ETH,
FLAG_DISABLE_UNISWAP_V2_DAI,
FLAG_DISABLE_UNISWAP_V2_USDC,
FLAG_DISABLE_CURVE_PAX,
FLAG_DISABLE_CURVE_RENBTC,
FLAG_DISABLE_CURVE_TBTC,
FLAG_DISABLE_DFORCE_SWAP,
FLAG_DISABLE_SHELL,
FLAG_DISABLE_MSTABLE_MUSD,
FLAG_DISABLE_CURVE_SBTC,
0,
0,
0
];

for (uint i = 0; i < distribution.length; i++) {
if (distribution[i] > 0) {
flags |= sourcesFlags[i];
}
}
}
}


Expand Down Expand Up @@ -3714,7 +3681,7 @@ contract OneSplitMultiPathView is OneSplitViewWrapBase, OneSplitMultiPathBase {
destToken,
returnAmount,
parts,
_flags | _getFlagsByDistribution(distribution),
_flags, // Double tap into the same source is not an issue since price wouldn't be worse
destTokenEthPriceTimesGasPrice
);
for (uint i = 0; i < distribution.length; i++) {
Expand Down Expand Up @@ -3757,7 +3724,6 @@ contract OneSplitMultiPath is OneSplitBaseWrap, OneSplitMultiPathBase {
dist,
flags
);
uint256 additionalFlags = _getFlagsByDistribution(distribution);

for (uint i = 0; i < distribution.length; i++) {
dist[i] = (distribution[i] >> 8) & 0xFF;
Expand All @@ -3767,7 +3733,7 @@ contract OneSplitMultiPath is OneSplitBaseWrap, OneSplitMultiPathBase {
destToken,
midToken.universalBalanceOf(address(this)),
dist,
flags | additionalFlags
flags
);
return;
}
Expand Down
2 changes: 1 addition & 1 deletion OneSplitAudit.full.bin

Large diffs are not rendered by default.

42 changes: 29 additions & 13 deletions OneSplitAudit.full.sol
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,6 @@ contract IOneSplitConsts {
// flags = FLAG_DISABLE_UNISWAP + FLAG_DISABLE_KYBER + ...
uint256 internal constant FLAG_DISABLE_UNISWAP = 0x01;
uint256 internal constant FLAG_DISABLE_KYBER = 0x02;
uint256 internal constant FLAG_ENABLE_KYBER_UNISWAP_RESERVE = 0x100000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_OASIS_RESERVE = 0x200000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_BANCOR_RESERVE = 0x400000000; // Turned off by default
uint256 internal constant FLAG_DISABLE_BANCOR = 0x04;
uint256 internal constant FLAG_DISABLE_OASIS = 0x08;
uint256 internal constant FLAG_DISABLE_COMPOUND = 0x10;
Expand Down Expand Up @@ -273,6 +270,15 @@ contract IOneSplitConsts {
uint256 internal constant FLAG_DISABLE_CURVE_ALL = 0x200000000000;
uint256 internal constant FLAG_DISABLE_UNISWAP_V2_ALL = 0x400000000000;
uint256 internal constant FLAG_DISABLE_SPLIT_RECALCULATION = 0x800000000000;
uint256 internal constant FLAG_DISABLE_BALANCER_ALL = 0x1000000000000;
uint256 internal constant FLAG_DISABLE_BALANCER_1 = 0x2000000000000;
uint256 internal constant FLAG_DISABLE_BALANCER_2 = 0x4000000000000;
uint256 internal constant FLAG_DISABLE_BALANCER_3 = 0x8000000000000;
uint256 internal constant FLAG_ENABLE_KYBER_UNISWAP_RESERVE = 0x1000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_OASIS_RESERVE = 0x2000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_BANCOR_RESERVE = 0x4000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_REFERRAL_GAS_SPONSORSHIP = 0x8000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_MULTI_PATH_COMP = 0x10000000000000; // Turned off by default
}


Expand Down Expand Up @@ -755,6 +761,14 @@ interface IFreeFromUpTo {
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}

interface IReferralGasSponsor {
function makeGasDiscount(
uint256 gasSpent,
uint256 returnAmount,
bytes calldata msgSenderCalldata
) external;
}


//
// Security assumptions:
Expand All @@ -775,15 +789,6 @@ contract OneSplitAudit is IOneSplit, Ownable {

event ImplementationUpdated(address indexed newImpl);

modifier makeGasDiscount(uint256 flags) {
uint256 gasStart = gasleft();
_;
if ((flags & FLAG_ENABLE_CHI_BURN) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 5 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
}
}

event Swapped(
IERC20 indexed fromToken,
IERC20 indexed destToken,
Expand Down Expand Up @@ -926,11 +931,13 @@ contract OneSplitAudit is IOneSplit, Ownable {
uint256 flags, // See contants in IOneSplit.sol
address referral,
uint256 feePercent
) public payable makeGasDiscount(flags) returns(uint256 returnAmount) {
) public payable returns(uint256 returnAmount) {
require(_fromToken() != _destToken() && amount > 0, "OneSplit: swap makes no sense");
require((msg.value != 0) == _fromToken().isETH(), "OneSplit: msg.value should be used only for ETH swap");
require(feePercent <= 0.03e18, "OneSplit: feePercent out of range");

uint256 gasStart = gasleft();

Balances memory beforeBalances = Balances({
ofFromToken: uint128(_fromToken().universalBalanceOf(address(this)).sub(msg.value)),
ofDestToken: uint128(_destToken().universalBalanceOf(address(this)))
Expand Down Expand Up @@ -977,6 +984,15 @@ contract OneSplitAudit is IOneSplit, Ownable {
if (afterBalances.ofFromToken > beforeBalances.ofFromToken) {
_fromToken().universalTransfer(msg.sender, uint256(afterBalances.ofFromToken).sub(beforeBalances.ofFromToken));
}

if ((flags & FLAG_ENABLE_CHI_BURN) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
}
else if ((flags & FLAG_ENABLE_REFERRAL_GAS_SPONSORSHIP) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
IReferralGasSponsor(referral).makeGasDiscount(gasSpent, returnAmount, msg.data);
}
}

function claimAsset(IERC20 asset, uint256 amount) public onlyOwner {
Expand Down
2 changes: 2 additions & 0 deletions contracts/IOneSplit.sol
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ contract IOneSplitConsts {
uint256 internal constant FLAG_ENABLE_KYBER_UNISWAP_RESERVE = 0x1000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_OASIS_RESERVE = 0x2000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_KYBER_BANCOR_RESERVE = 0x4000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_REFERRAL_GAS_SPONSORSHIP = 0x8000000000000; // Turned off by default
uint256 internal constant FLAG_ENABLE_MULTI_PATH_COMP = 0x10000000000000; // Turned off by default
}


Expand Down
30 changes: 20 additions & 10 deletions contracts/OneSplitAudit.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ interface IFreeFromUpTo {
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}

interface IReferralGasSponsor {
function makeGasDiscount(
uint256 gasSpent,
uint256 returnAmount,
bytes calldata msgSenderCalldata
) external;
}


//
// Security assumptions:
Expand All @@ -29,15 +37,6 @@ contract OneSplitAudit is IOneSplit, Ownable {

event ImplementationUpdated(address indexed newImpl);

modifier makeGasDiscount(uint256 flags) {
uint256 gasStart = gasleft();
_;
if ((flags & FLAG_ENABLE_CHI_BURN) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 5 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
}
}

event Swapped(
IERC20 indexed fromToken,
IERC20 indexed destToken,
Expand Down Expand Up @@ -180,11 +179,13 @@ contract OneSplitAudit is IOneSplit, Ownable {
uint256 flags, // See contants in IOneSplit.sol
address referral,
uint256 feePercent
) public payable makeGasDiscount(flags) returns(uint256 returnAmount) {
) public payable returns(uint256 returnAmount) {
require(_fromToken() != _destToken() && amount > 0, "OneSplit: swap makes no sense");
require((msg.value != 0) == _fromToken().isETH(), "OneSplit: msg.value should be used only for ETH swap");
require(feePercent <= 0.03e18, "OneSplit: feePercent out of range");

uint256 gasStart = gasleft();

Balances memory beforeBalances = Balances({
ofFromToken: uint128(_fromToken().universalBalanceOf(address(this)).sub(msg.value)),
ofDestToken: uint128(_destToken().universalBalanceOf(address(this)))
Expand Down Expand Up @@ -231,6 +232,15 @@ contract OneSplitAudit is IOneSplit, Ownable {
if (afterBalances.ofFromToken > beforeBalances.ofFromToken) {
_fromToken().universalTransfer(msg.sender, uint256(afterBalances.ofFromToken).sub(beforeBalances.ofFromToken));
}

if ((flags & FLAG_ENABLE_CHI_BURN) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
}
else if ((flags & FLAG_ENABLE_REFERRAL_GAS_SPONSORSHIP) > 0) {
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
IReferralGasSponsor(referral).makeGasDiscount(gasSpent, returnAmount, msg.data);
}
}

function claimAsset(IERC20 asset, uint256 amount) public onlyOwner {
Expand Down
1 change: 1 addition & 0 deletions contracts/OneSplitBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ contract OneSplitRoot is IOneSplitView {
IERC20 constant internal tbtc = IERC20(0x1bBE271d15Bb64dF0bc6CD28Df9Ff322F2eBD847);
IERC20 constant internal hbtc = IERC20(0x0316EB71485b0Ab14103307bf65a021042c6d380);
IERC20 constant internal sbtc = IERC20(0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6);
IERC20 constant internal comp = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888);

IKyberNetworkProxy constant internal kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755);
IUniswapFactory constant internal uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95);
Expand Down
53 changes: 8 additions & 45 deletions contracts/OneSplitMultiPath.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,26 @@ import "./OneSplitBase.sol";

contract OneSplitMultiPathBase is IOneSplitConsts, OneSplitRoot {
function _getMultiPathToken(uint256 flags) internal pure returns(IERC20 midToken) {
uint256[7] memory allFlags = [
uint256[8] memory allFlags = [
FLAG_ENABLE_MULTI_PATH_ETH,
FLAG_ENABLE_MULTI_PATH_DAI,
FLAG_ENABLE_MULTI_PATH_USDC,
FLAG_ENABLE_MULTI_PATH_USDT,
FLAG_ENABLE_MULTI_PATH_WBTC,
FLAG_ENABLE_MULTI_PATH_TBTC,
FLAG_ENABLE_MULTI_PATH_RENBTC
FLAG_ENABLE_MULTI_PATH_RENBTC,
FLAG_ENABLE_MULTI_PATH_COMP
];

IERC20[7] memory allMidTokens = [
IERC20[8] memory allMidTokens = [
ETH_ADDRESS,
dai,
usdc,
usdt,
wbtc,
tbtc,
renbtc
renbtc,
comp
];

for (uint i = 0; i < allFlags.length; i++) {
Expand All @@ -32,44 +34,6 @@ contract OneSplitMultiPathBase is IOneSplitConsts, OneSplitRoot {
}
}
}

function _getFlagsByDistribution(uint256[] memory distribution) internal pure returns(uint256 flags) {
uint256[DEXES_COUNT] memory sourcesFlags = [
FLAG_DISABLE_UNISWAP,
FLAG_DISABLE_KYBER,
FLAG_DISABLE_BANCOR,
FLAG_DISABLE_OASIS,
FLAG_DISABLE_CURVE_COMPOUND,
FLAG_DISABLE_CURVE_USDT,
FLAG_DISABLE_CURVE_Y,
FLAG_DISABLE_CURVE_BINANCE,
FLAG_DISABLE_CURVE_SYNTHETIX,
FLAG_DISABLE_UNISWAP_COMPOUND,
FLAG_DISABLE_UNISWAP_CHAI,
FLAG_DISABLE_UNISWAP_AAVE,
FLAG_DISABLE_MOONISWAP,
FLAG_DISABLE_UNISWAP_V2,
FLAG_DISABLE_UNISWAP_V2_ETH,
FLAG_DISABLE_UNISWAP_V2_DAI,
FLAG_DISABLE_UNISWAP_V2_USDC,
FLAG_DISABLE_CURVE_PAX,
FLAG_DISABLE_CURVE_RENBTC,
FLAG_DISABLE_CURVE_TBTC,
FLAG_DISABLE_DFORCE_SWAP,
FLAG_DISABLE_SHELL,
FLAG_DISABLE_MSTABLE_MUSD,
FLAG_DISABLE_CURVE_SBTC,
0,
0,
0
];

for (uint i = 0; i < distribution.length; i++) {
if (distribution[i] > 0) {
flags |= sourcesFlags[i];
}
}
}
}


Expand Down Expand Up @@ -133,7 +97,7 @@ contract OneSplitMultiPathView is OneSplitViewWrapBase, OneSplitMultiPathBase {
destToken,
returnAmount,
parts,
_flags | _getFlagsByDistribution(distribution),
_flags, // Double tap into the same source is not an issue since price wouldn't be worse
destTokenEthPriceTimesGasPrice
);
for (uint i = 0; i < distribution.length; i++) {
Expand Down Expand Up @@ -176,7 +140,6 @@ contract OneSplitMultiPath is OneSplitBaseWrap, OneSplitMultiPathBase {
dist,
flags
);
uint256 additionalFlags = _getFlagsByDistribution(distribution);

for (uint i = 0; i < distribution.length; i++) {
dist[i] = (distribution[i] >> 8) & 0xFF;
Expand All @@ -186,7 +149,7 @@ contract OneSplitMultiPath is OneSplitBaseWrap, OneSplitMultiPathBase {
destToken,
midToken.universalBalanceOf(address(this)),
dist,
flags | additionalFlags
flags
);
return;
}
Expand Down

0 comments on commit f2cc181

Please sign in to comment.