add cp event && smartroute helper fix

This commit is contained in:
owen05
2021-01-18 22:32:12 +08:00
parent 211b5e0172
commit 059778b27b
13 changed files with 201 additions and 88 deletions

View File

@@ -143,7 +143,8 @@ contract DODOIncentive is InitializableOwnable {
uint256 reward,
uint256 baseRate,
uint256 totalRate,
uint256 curTotalReward
uint256 curTotalReward,
uint256 perBlockReward
)
{
baseRate = defaultRate;
@@ -153,5 +154,6 @@ contract DODOIncentive is InitializableOwnable {
uint256 _totalReward = _getTotalReward();
reward = ((_totalReward - totalDistribution) * totalRate) / 1000;
curTotalReward = _totalReward - totalDistribution;
perBlockReward = dodoPerBlock;
}
}

View File

@@ -355,9 +355,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_dodoGasReturn(originGas);
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(_ETH_ADDRESS_,toToken,msg.sender);
}
_execIncentive(isIncentive, _ETH_ADDRESS_, toToken);
emit OrderHistory(
_ETH_ADDRESS_,
@@ -411,9 +409,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_dodoGasReturn(originGas);
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken,_ETH_ADDRESS_,msg.sender);
}
_execIncentive(isIncentive, fromToken, _ETH_ADDRESS_);
emit OrderHistory(
fromToken,
@@ -467,9 +463,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_dodoGasReturn(originGas);
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken,toToken,msg.sender);
}
_execIncentive(isIncentive, fromToken, toToken);
emit OrderHistory(
fromToken,
@@ -525,9 +519,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_externalGasReturn();
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken,toToken,msg.sender);
}
_execIncentive(isIncentive, fromToken, toToken);
emit OrderHistory(
fromToken,
@@ -596,9 +588,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_dodoGasReturn(originGas);
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(_fromToken,_toToken,msg.sender);
}
_execIncentive(isIncentive, _fromToken, _toToken);
emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount);
}
@@ -611,35 +601,28 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
uint256 minReturnAmount,
address[] memory mixAdapters,
address[] memory mixPairs,
address[] memory assetTo,
uint256 directions,
bool isIncentive,
uint256 deadLine
) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
require(mixPairs.length > 0, "DODOV2Proxy01: PAIRS_EMPTY");
require(mixPairs.length == mixAdapters.length, "DODOV2Proxy01: ADAPTER_PAIR_NOT_MATCH");
require(mixPairs.length == mixAdapters.length, "DODOV2Proxy01: PAIR_ADAPTER_NOT_MATCH");
require(mixPairs.length == assetTo.length - 1, "DODOV2Proxy01: PAIR_ASSETTO_NOT_MATCH");
require(minReturnAmount > 0, "DODOV2Proxy01: RETURN_AMOUNT_ZERO");
uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender);
{
address _fromToken = fromToken;
_deposit(msg.sender, mixPairs[0], _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_);
_deposit(msg.sender, assetTo[0], _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_);
}
address assetTo = toToken == _ETH_ADDRESS_ ? address(this): msg.sender;
for (uint256 i = 0; i < mixPairs.length; i++) {
if (i == mixPairs.length - 1) {
if (directions & 1 == 0) {
IDODOAdapter(mixAdapters[i]).sellBase(assetTo,mixPairs[i]);
} else {
IDODOAdapter(mixAdapters[i]).sellQuote(assetTo,mixPairs[i]);
}
if (directions & 1 == 0) {
IDODOAdapter(mixAdapters[i]).sellBase(assetTo[i + 1],mixPairs[i]);
} else {
if (directions& 1 == 0) {
IDODOAdapter(mixAdapters[i]).sellBase(mixPairs[i + 1],mixPairs[i]);
} else {
IDODOAdapter(mixAdapters[i]).sellQuote(mixPairs[i + 1],mixPairs[i]);
}
IDODOAdapter(mixAdapters[i]).sellQuote(assetTo[i + 1],mixPairs[i]);
}
directions = directions >> 1;
}
@@ -656,9 +639,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
_externalGasReturn();
if(isIncentive) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken,toToken,msg.sender);
}
_execIncentive(isIncentive, fromToken, toToken);
emit OrderHistory(
fromToken,
@@ -794,4 +775,11 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
IChi(_CHI_TOKEN_).freeUpTo(_gasExternalReturn);
}
}
function _execIncentive(bool isIncentive, address fromToken,address toToken) internal {
if(isIncentive && gasleft() > 30000) {
IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken, toToken, msg.sender);
}
}
}

View File

@@ -29,7 +29,7 @@ contract DODOV1Adapter is IDODOAdapter {
uint256 curAmountIn = IERC20(curBase).balanceOf(address(this));
IERC20(curBase).universalApproveMax(pool, curAmountIn);
IDODOV1(pool).sellBaseToken(curAmountIn, 0, "");
if(to == msg.sender) {
if(to != address(this)) {
address curQuote = IDODOV1(pool)._QUOTE_TOKEN_();
IERC20(curQuote).transfer(to,IERC20(curQuote).balanceOf(address(this)));
}
@@ -44,7 +44,7 @@ contract DODOV1Adapter is IDODOAdapter {
curAmountIn
);
IDODOV1(pool).buyBaseToken(canBuyBaseAmount, curAmountIn, "");
if(to == msg.sender) {
if(to != address(this)) {
address curBase = IDODOV1(pool)._BASE_TOKEN_();
IERC20(curBase).transfer(to,IERC20(curBase).balanceOf(address(this)));
}

View File

@@ -0,0 +1,46 @@
/*
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;
import {IDODOV1} from "../intf/IDODOV1.sol";
contract DODOV1PmmHelper {
struct PairDetail {
uint256 i;
uint256 K;
uint256 B;
uint256 Q;
uint256 B0;
uint256 Q0;
uint256 R;
uint256 lpFeeRate;
uint256 mtFeeRate;
address baseToken;
address quoteToken;
address curPair;
uint256 pairVersion;
}
function getPairDetail(address pool) external view returns (PairDetail[] memory res) {
res = new PairDetail[](1);
PairDetail memory curRes = PairDetail(0,0,0,0,0,0,0,0,0,address(0),address(0),pool,1);
curRes.i = IDODOV1(pool).getOraclePrice();
curRes.K = IDODOV1(pool)._K_();
curRes.B = IDODOV1(pool)._BASE_BALANCE_();
curRes.Q = IDODOV1(pool)._QUOTE_BALANCE_();
(curRes.B0,curRes.Q0) = IDODOV1(pool).getExpectedTarget();
curRes.R = IDODOV1(pool)._R_STATUS_();
curRes.lpFeeRate = IDODOV1(pool)._LP_FEE_RATE_();
curRes.mtFeeRate = IDODOV1(pool)._MT_FEE_RATE_();
curRes.baseToken = IDODOV1(pool)._BASE_TOKEN_();
curRes.quoteToken = IDODOV1(pool)._QUOTE_TOKEN_();
res[0] = curRes;
}
}

View File

@@ -27,6 +27,7 @@ contract DODOV2RouteHelper {
address baseToken;
address quoteToken;
address curPair;
uint256 pairVersion;
}
constructor(address dvmFactory,address dppFactory) public {
@@ -40,7 +41,7 @@ contract DODOV2RouteHelper {
uint256 len = baseToken0DVM.length + baseToken1DVM.length + baseToken0DPP.length + baseToken1DPP.length;
res = new PairDetail[](len);
for(uint8 i = 0; i < len; i++) {
PairDetail memory curRes = PairDetail(0,0,0,0,0,0,0,0,0,address(0),address(0),address(0));
PairDetail memory curRes = PairDetail(0,0,0,0,0,0,0,0,0,address(0),address(0),address(0),2);
address cur;
if(i < baseToken0DVM.length) {
cur = baseToken0DVM[i];

View File

@@ -58,9 +58,9 @@ interface IDODOV1 {
function _QUOTE_CAPITAL_TOKEN_() external returns (address);
function _BASE_TOKEN_() external returns (address);
function _BASE_TOKEN_() external view returns (address);
function _QUOTE_TOKEN_() external returns (address);
function _QUOTE_TOKEN_() external view returns (address);
function _R_STATUS_() external view returns (uint8);

View File

@@ -145,6 +145,7 @@ interface IDODOV2Proxy01 {
uint256 minReturnAmount,
address[] memory mixAdapters,
address[] memory mixPairs,
address[] memory assetTo,
uint256 directions,
bool isIncentive,
uint256 deadLine