Merge branch 'feature/V2' of github.com:DODOEX/contractV2 into feature/V2
This commit is contained in:
@@ -257,7 +257,13 @@ contract DPPTrader is DPPVault {
|
||||
}
|
||||
|
||||
function _sync() internal {
|
||||
_BASE_RESERVE_ = _BASE_TOKEN_.balanceOf(address(this));
|
||||
_QUOTE_RESERVE_ = _QUOTE_TOKEN_.balanceOf(address(this));
|
||||
uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this));
|
||||
uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this));
|
||||
if(baseBalance != _BASE_RESERVE_) {
|
||||
_BASE_RESERVE_ = baseBalance;
|
||||
}
|
||||
if(quoteBalance != _QUOTE_RESERVE_) {
|
||||
_QUOTE_RESERVE_ = quoteBalance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +81,9 @@ contract DPPVault is DPPStorage {
|
||||
function _setRState() internal {
|
||||
if (_BASE_RESERVE_ == _BASE_TARGET_ && _QUOTE_RESERVE_ == _QUOTE_TARGET_) {
|
||||
_RState_ = PMMPricing.RState.ONE;
|
||||
} else if (_BASE_RESERVE_ > _BASE_TARGET_) {
|
||||
} else if (_BASE_RESERVE_ > _BASE_TARGET_ && _QUOTE_RESERVE_ < _QUOTE_TARGET_) {
|
||||
_RState_ = PMMPricing.RState.BELOW_ONE;
|
||||
} else if (_QUOTE_RESERVE_ > _QUOTE_TARGET_) {
|
||||
} else if (_BASE_RESERVE_ < _BASE_TARGET_ && _QUOTE_RESERVE_ > _QUOTE_TARGET_) {
|
||||
_RState_ = PMMPricing.RState.ABOVE_ONE;
|
||||
} else {
|
||||
require(false, "R_STATE_WRONG");
|
||||
|
||||
@@ -92,6 +92,8 @@ contract DVMFunding is DVMVault {
|
||||
_burn(msg.sender, shareAmount);
|
||||
_transferBaseOut(to, baseAmount);
|
||||
_transferQuoteOut(to, quoteAmount);
|
||||
_sync();
|
||||
|
||||
if (data.length > 0) {
|
||||
IDODOCallee(to).DVMSellShareCall(
|
||||
msg.sender,
|
||||
@@ -101,7 +103,7 @@ contract DVMFunding is DVMVault {
|
||||
data
|
||||
);
|
||||
}
|
||||
_sync();
|
||||
|
||||
emit SellShares(msg.sender, to, shareAmount, _SHARES_[msg.sender]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,14 +19,14 @@ import {IPermissionManager} from "../lib/PermissionManager.sol";
|
||||
contract DPPFactory is Ownable {
|
||||
// ============ Templates ============
|
||||
|
||||
address public _CLONE_FACTORY_;
|
||||
address public _DPP_TEMPLATE_;
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public immutable _DPP_TEMPLATE_;
|
||||
address public immutable _FEE_RATE_MODEL_TEMPLATE_;
|
||||
address public immutable _PERMISSION_MANAGER_TEMPLATE_;
|
||||
address public immutable _DEFAULT_GAS_PRICE_SOURCE_;
|
||||
address public immutable _VALUE_SOURCE_;
|
||||
address public immutable _DODO_SMART_APPROVE_;
|
||||
address public _DPP_ADMIN_TEMPLATE_;
|
||||
address public _FEE_RATE_MODEL_TEMPLATE_;
|
||||
address public _PERMISSION_MANAGER_TEMPLATE_;
|
||||
address public _DEFAULT_GAS_PRICE_SOURCE_;
|
||||
address public _VALUE_SOURCE_;
|
||||
address public _DODO_SMART_APPROVE_;
|
||||
|
||||
// ============ Registry ============
|
||||
|
||||
|
||||
@@ -18,12 +18,12 @@ import {IPermissionManager} from "../lib/PermissionManager.sol";
|
||||
contract DVMFactory is Ownable {
|
||||
// ============ Templates ============
|
||||
|
||||
address public _CLONE_FACTORY_;
|
||||
address public _DVM_TEMPLATE_;
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public immutable _DVM_TEMPLATE_;
|
||||
address public immutable _FEE_RATE_MODEL_TEMPLATE_;
|
||||
address public immutable _PERMISSION_MANAGER_TEMPLATE_;
|
||||
address public immutable _DEFAULT_GAS_PRICE_SOURCE_;
|
||||
address public _DVM_ADMIN_TEMPLATE_;
|
||||
address public _FEE_RATE_MODEL_TEMPLATE_;
|
||||
address public _PERMISSION_MANAGER_TEMPLATE_;
|
||||
address public _DEFAULT_GAS_PRICE_SOURCE_;
|
||||
|
||||
// ============ Registry ============
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@ import {InitializableMintableERC20} from "../external/ERC20/InitializableMintabl
|
||||
contract ERC20Factory is Ownable {
|
||||
// ============ Templates ============
|
||||
|
||||
address public _CLONE_FACTORY_;
|
||||
address public _ERC20_TEMPLATE_;
|
||||
address public _MINTABLE_ERC20_TEMPLATE_;
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public immutable _ERC20_TEMPLATE_;
|
||||
address public immutable _MINTABLE_ERC20_TEMPLATE_;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
|
||||
@@ -13,20 +13,25 @@ import {SafeMath} from "../lib/SafeMath.sol";
|
||||
import {IDODOV1} from "./intf/IDODOV1.sol";
|
||||
import {IDODOSellHelper} from "./helper/DODOSellHelper.sol";
|
||||
import {IWETH} from "../intf/IWETH.sol";
|
||||
import {IChi} from "./intf/IChi.sol";
|
||||
import {IDODOApprove} from "../intf/IDODOApprove.sol";
|
||||
import {IDODOV1Proxy01} from "./intf/IDODOV1Proxy01.sol";
|
||||
import {ReentrancyGuard} from "../lib/ReentrancyGuard.sol";
|
||||
import {Ownable} from "../lib/Ownable.sol";
|
||||
|
||||
contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard {
|
||||
contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard, Ownable {
|
||||
using SafeMath for uint256;
|
||||
using UniversalERC20 for IERC20;
|
||||
|
||||
// ============ Storage ============
|
||||
|
||||
address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||
address public _DODO_APPROVE_;
|
||||
address public _DODO_SELL_HELPER_;
|
||||
address payable public _WETH_;
|
||||
address public immutable _DODO_APPROVE_;
|
||||
address public immutable _DODO_SELL_HELPER_;
|
||||
address public immutable _WETH_;
|
||||
address public immutable _CHI_TOKEN_;
|
||||
uint8 public _GAS_DODO_MAX_RETURN_ = 0;
|
||||
uint8 public _GAS_EXTERNAL_RETURN_ = 0;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
@@ -48,17 +53,24 @@ contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard {
|
||||
constructor(
|
||||
address dodoApporve,
|
||||
address dodoSellHelper,
|
||||
address payable weth
|
||||
address weth,
|
||||
address chiToken
|
||||
) public {
|
||||
_DODO_APPROVE_ = dodoApporve;
|
||||
_DODO_SELL_HELPER_ = dodoSellHelper;
|
||||
_WETH_ = weth;
|
||||
_CHI_TOKEN_ = chiToken;
|
||||
}
|
||||
|
||||
fallback() external payable {}
|
||||
|
||||
receive() external payable {}
|
||||
|
||||
function updateGasReturn(uint8 newDodoGasReturn, uint8 newExternalGasReturn) public onlyOwner {
|
||||
_GAS_DODO_MAX_RETURN_ = newDodoGasReturn;
|
||||
_GAS_EXTERNAL_RETURN_ = newExternalGasReturn;
|
||||
}
|
||||
|
||||
function dodoSwapV1(
|
||||
address fromToken,
|
||||
address toToken,
|
||||
@@ -67,7 +79,9 @@ contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard {
|
||||
address[] memory dodoPairs,
|
||||
uint8[] memory directions,
|
||||
uint256 deadLine
|
||||
) external virtual override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
|
||||
) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
|
||||
uint256 originGas = gasleft();
|
||||
|
||||
if (fromToken != _ETH_ADDRESS_) {
|
||||
IDODOApprove(_DODO_APPROVE_).claimTokens(
|
||||
fromToken,
|
||||
@@ -108,8 +122,16 @@ contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard {
|
||||
|
||||
require(returnAmount >= minReturnAmount, "DODOV1Proxy01: Return amount is not enough");
|
||||
IERC20(toToken).universalTransfer(msg.sender, returnAmount);
|
||||
|
||||
|
||||
emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount);
|
||||
|
||||
uint8 _gasDodoMaxReturn = _GAS_DODO_MAX_RETURN_;
|
||||
if(_gasDodoMaxReturn > 0) {
|
||||
uint256 calcGasTokenBurn = originGas.sub(gasleft()) / 65000;
|
||||
uint256 gasTokenBurn = calcGasTokenBurn > _gasDodoMaxReturn ? _gasDodoMaxReturn : calcGasTokenBurn;
|
||||
if(gasleft() > 27710 + gasTokenBurn * 6080)
|
||||
IChi(_CHI_TOKEN_).freeUpTo(gasTokenBurn);
|
||||
}
|
||||
}
|
||||
|
||||
function externalSwap(
|
||||
@@ -121,35 +143,44 @@ contract DODOV1Proxy01 is IDODOV1Proxy01, ReentrancyGuard {
|
||||
uint256 minReturnAmount,
|
||||
bytes memory callDataConcat,
|
||||
uint256 deadLine
|
||||
) external virtual override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
|
||||
uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender);
|
||||
) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
|
||||
address _fromToken = fromToken;
|
||||
address _toToken = toToken;
|
||||
|
||||
uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender);
|
||||
|
||||
if (fromToken != _ETH_ADDRESS_) {
|
||||
if (_fromToken != _ETH_ADDRESS_) {
|
||||
IDODOApprove(_DODO_APPROVE_).claimTokens(
|
||||
fromToken,
|
||||
_fromToken,
|
||||
msg.sender,
|
||||
address(this),
|
||||
fromTokenAmount
|
||||
);
|
||||
IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount);
|
||||
IERC20(_fromToken).universalApproveMax(approveTarget, fromTokenAmount);
|
||||
}
|
||||
|
||||
(bool success, ) = to.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat);
|
||||
(bool success, ) = to.call{value: _fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat);
|
||||
|
||||
require(success, "DODOV1Proxy01: Contract Swap execution Failed");
|
||||
|
||||
IERC20(fromToken).universalTransfer(
|
||||
IERC20(_fromToken).universalTransfer(
|
||||
msg.sender,
|
||||
IERC20(fromToken).universalBalanceOf(address(this))
|
||||
IERC20(_fromToken).universalBalanceOf(address(this))
|
||||
);
|
||||
|
||||
IERC20(toToken).universalTransfer(
|
||||
IERC20(_toToken).universalTransfer(
|
||||
msg.sender,
|
||||
IERC20(toToken).universalBalanceOf(address(this))
|
||||
IERC20(_toToken).universalBalanceOf(address(this))
|
||||
);
|
||||
returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance);
|
||||
returnAmount = IERC20(_toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance);
|
||||
require(returnAmount >= minReturnAmount, "DODOV1Proxy01: Return amount is not enough");
|
||||
|
||||
emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount);
|
||||
emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount);
|
||||
|
||||
uint8 _gasExternalReturn = _GAS_EXTERNAL_RETURN_;
|
||||
if(_gasExternalReturn > 0) {
|
||||
if(gasleft() > 27710 + _gasExternalReturn * 6080)
|
||||
IChi(_CHI_TOKEN_).freeUpTo(_gasExternalReturn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,11 +27,11 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
// ============ Storage ============
|
||||
|
||||
address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
||||
address payable public _WETH_;
|
||||
address public _DODO_APPROVE_;
|
||||
address public _DODO_SELL_HELPER_;
|
||||
address public _DVM_FACTORY_;
|
||||
address public _DPP_FACTORY_;
|
||||
address public immutable _WETH_;
|
||||
address public immutable _DODO_APPROVE_;
|
||||
address public immutable _DODO_SELL_HELPER_;
|
||||
address public immutable _DVM_FACTORY_;
|
||||
address public immutable _DPP_FACTORY_;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
@@ -83,7 +83,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
preventReentrant
|
||||
@@ -137,7 +136,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
preventReentrant
|
||||
@@ -172,7 +170,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
address dvmAddress,
|
||||
uint256 baseInAmount,
|
||||
uint256 quoteInAmount
|
||||
) internal virtual view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) {
|
||||
) internal view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) {
|
||||
(uint256 baseReserve, uint256 quoteReserve) = IDODOV2(dvmAddress).getVaultReserve();
|
||||
if (quoteReserve == 0 && baseReserve == 0) {
|
||||
baseAdjustedInAmount = baseInAmount;
|
||||
@@ -209,7 +207,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
preventReentrant
|
||||
@@ -256,7 +253,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 quoteOutAmount,
|
||||
uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
|
||||
uint256 deadLine
|
||||
) external virtual override payable preventReentrant judgeExpired(deadLine) {
|
||||
) external override payable preventReentrant judgeExpired(deadLine) {
|
||||
_deposit(
|
||||
msg.sender,
|
||||
dppAddress,
|
||||
@@ -297,7 +294,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
judgeExpired(deadLine)
|
||||
@@ -345,7 +341,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
judgeExpired(deadLine)
|
||||
returns (uint256 returnAmount)
|
||||
@@ -391,7 +386,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
judgeExpired(deadLine)
|
||||
returns (uint256 returnAmount)
|
||||
@@ -436,7 +430,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
judgeExpired(deadLine)
|
||||
@@ -490,7 +483,6 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 deadLine
|
||||
)
|
||||
external
|
||||
virtual
|
||||
override
|
||||
payable
|
||||
judgeExpired(deadLine)
|
||||
@@ -540,7 +532,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard {
|
||||
uint256 quoteMinShares,
|
||||
uint8 flag, // 0 erc20 In 1 baseInETH 2 quoteIn ETH
|
||||
uint256 deadLine
|
||||
) external virtual override payable judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) {
|
||||
) external override payable judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) {
|
||||
address _baseToken = IDODOV1(pair)._BASE_TOKEN_();
|
||||
address _quoteToken = IDODOV1(pair)._QUOTE_TOKEN_();
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import {ReentrancyGuard} from "../../lib/ReentrancyGuard.sol";
|
||||
|
||||
contract DODOCalleeHelper is ReentrancyGuard {
|
||||
using SafeERC20 for IERC20;
|
||||
address payable public _WETH_;
|
||||
address public immutable _WETH_;
|
||||
|
||||
fallback() external payable {
|
||||
require(msg.sender == _WETH_, "WE_SAVED_YOUR_ETH");
|
||||
@@ -25,7 +25,7 @@ contract DODOCalleeHelper is ReentrancyGuard {
|
||||
require(msg.sender == _WETH_, "WE_SAVED_YOUR_ETH");
|
||||
}
|
||||
|
||||
constructor(address payable weth) public {
|
||||
constructor(address weth) public {
|
||||
_WETH_ = weth;
|
||||
}
|
||||
|
||||
|
||||
13
contracts/SmartRoute/intf/IChi.sol
Normal file
13
contracts/SmartRoute/intf/IChi.sol
Normal file
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
interface IChi {
|
||||
function freeUpTo(uint256 value) external returns (uint256);
|
||||
}
|
||||
471
contracts/external/ERC20/ChiToken.sol
vendored
Normal file
471
contracts/external/ERC20/ChiToken.sol
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user