第二遍走查 snapshot2
This commit is contained in:
@@ -28,22 +28,26 @@ contract DPP is DPPTrader {
|
|||||||
address tradePermissionManager
|
address tradePermissionManager
|
||||||
) external {
|
) external {
|
||||||
initOwner(owner);
|
initOwner(owner);
|
||||||
_MAINTAINER_ = maintainer;
|
|
||||||
|
require(baseTokenAddress != quoteTokenAddress, "BASE_QUOTE_CAN_NOT_BE_SAME");
|
||||||
_BASE_TOKEN_ = IERC20(baseTokenAddress);
|
_BASE_TOKEN_ = IERC20(baseTokenAddress);
|
||||||
_QUOTE_TOKEN_ = IERC20(quoteTokenAddress);
|
_QUOTE_TOKEN_ = IERC20(quoteTokenAddress);
|
||||||
|
|
||||||
_LP_FEE_RATE_MODEL_ = IFeeRateModel(lpFeeRateModel);
|
_LP_FEE_RATE_MODEL_ = IFeeRateModel(lpFeeRateModel);
|
||||||
_MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel);
|
_MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel);
|
||||||
_I_ = IExternalValue(iSource);
|
_I_ = IExternalValue(iSource);
|
||||||
_K_ = IExternalValue(kSource);
|
_K_ = IExternalValue(kSource);
|
||||||
_GAS_PRICE_LIMIT_ = IExternalValue(gasPriceSource);
|
_GAS_PRICE_LIMIT_ = IExternalValue(gasPriceSource);
|
||||||
_TRADE_PERMISSION_ = IPermissionManager(tradePermissionManager);
|
_TRADE_PERMISSION_ = IPermissionManager(tradePermissionManager);
|
||||||
|
_MAINTAINER_ = maintainer;
|
||||||
|
|
||||||
_resetTargetAndReserve();
|
_resetTargetAndReserve();
|
||||||
_checkIK();
|
_checkIK();
|
||||||
require(_BASE_TOKEN_ != _QUOTE_TOKEN_, "BASE_QUOTE_CAN_NOT_BE_SAME");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============ Version Control ============
|
// ============ Version Control ============
|
||||||
function version() external pure returns (uint256) {
|
|
||||||
return 100; // 1.0.0
|
function version() external pure returns (string memory) {
|
||||||
|
return "DPP 1.0.0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,16 @@ import {IDODOCallee} from "../../intf/IDODOCallee.sol";
|
|||||||
contract DPPTrader is DPPVault {
|
contract DPPTrader is DPPVault {
|
||||||
using SafeMath for uint256;
|
using SafeMath for uint256;
|
||||||
|
|
||||||
|
// ============ Events ============
|
||||||
|
|
||||||
|
event DODOSwap(
|
||||||
|
address indexed fromToken,
|
||||||
|
address indexed toToken,
|
||||||
|
uint256 fromAmount,
|
||||||
|
uint256 toAmount,
|
||||||
|
address trader
|
||||||
|
);
|
||||||
|
|
||||||
// ============ Modifiers ============
|
// ============ Modifiers ============
|
||||||
|
|
||||||
modifier isBuyAllow(address trader) {
|
modifier isBuyAllow(address trader) {
|
||||||
@@ -43,7 +53,7 @@ contract DPPTrader is DPPVault {
|
|||||||
external
|
external
|
||||||
preventReentrant
|
preventReentrant
|
||||||
limitGasPrice
|
limitGasPrice
|
||||||
isSellAllow(to)
|
isSellAllow(to) // set DVM address in trade permission
|
||||||
returns (uint256 receiveQuoteAmount)
|
returns (uint256 receiveQuoteAmount)
|
||||||
{
|
{
|
||||||
uint256 baseInput = getBaseInput();
|
uint256 baseInput = getBaseInput();
|
||||||
@@ -54,6 +64,7 @@ contract DPPTrader is DPPVault {
|
|||||||
|
|
||||||
_transferQuoteOut(to, receiveQuoteAmount);
|
_transferQuoteOut(to, receiveQuoteAmount);
|
||||||
_transferQuoteOut(_MAINTAINER_, mtFee);
|
_transferQuoteOut(_MAINTAINER_, mtFee);
|
||||||
|
_sync();
|
||||||
|
|
||||||
// update TARGET
|
// update TARGET
|
||||||
if (_RState_ != newRState) {
|
if (_RState_ != newRState) {
|
||||||
@@ -61,9 +72,13 @@ contract DPPTrader is DPPVault {
|
|||||||
_BASE_TARGET_ = newBaseTarget;
|
_BASE_TARGET_ = newBaseTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncReserve();
|
emit DODOSwap(
|
||||||
|
address(_BASE_TOKEN_),
|
||||||
return receiveQuoteAmount;
|
address(_QUOTE_TOKEN_),
|
||||||
|
baseInput,
|
||||||
|
receiveQuoteAmount,
|
||||||
|
tx.origin
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sellQuote(address to)
|
function sellQuote(address to)
|
||||||
@@ -85,6 +100,7 @@ contract DPPTrader is DPPVault {
|
|||||||
|
|
||||||
_transferBaseOut(to, receiveBaseAmount);
|
_transferBaseOut(to, receiveBaseAmount);
|
||||||
_transferBaseOut(_MAINTAINER_, mtFee);
|
_transferBaseOut(_MAINTAINER_, mtFee);
|
||||||
|
_sync();
|
||||||
|
|
||||||
// update TARGET
|
// update TARGET
|
||||||
if (_RState_ != newRState) {
|
if (_RState_ != newRState) {
|
||||||
@@ -92,9 +108,13 @@ contract DPPTrader is DPPVault {
|
|||||||
_QUOTE_TARGET_ = newQuoteTarget;
|
_QUOTE_TARGET_ = newQuoteTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncReserve();
|
emit DODOSwap(
|
||||||
|
address(_QUOTE_TOKEN_),
|
||||||
return receiveBaseAmount;
|
address(_BASE_TOKEN_),
|
||||||
|
quoteInput,
|
||||||
|
receiveBaseAmount,
|
||||||
|
tx.origin
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function flashLoan(
|
function flashLoan(
|
||||||
@@ -105,6 +125,7 @@ contract DPPTrader is DPPVault {
|
|||||||
) external preventReentrant {
|
) external preventReentrant {
|
||||||
_transferBaseOut(assetTo, baseAmount);
|
_transferBaseOut(assetTo, baseAmount);
|
||||||
_transferQuoteOut(assetTo, quoteAmount);
|
_transferQuoteOut(assetTo, quoteAmount);
|
||||||
|
|
||||||
if (data.length > 0)
|
if (data.length > 0)
|
||||||
IDODOCallee(assetTo).DPPFlashLoanCall(msg.sender, baseAmount, quoteAmount, data);
|
IDODOCallee(assetTo).DPPFlashLoanCall(msg.sender, baseAmount, quoteAmount, data);
|
||||||
|
|
||||||
@@ -120,13 +141,13 @@ contract DPPTrader is DPPVault {
|
|||||||
// sell quote case
|
// sell quote case
|
||||||
// quote input + base output
|
// quote input + base output
|
||||||
if (baseBalance < _BASE_RESERVE_) {
|
if (baseBalance < _BASE_RESERVE_) {
|
||||||
|
uint256 quoteInput = quoteBalance.sub(_QUOTE_RESERVE_);
|
||||||
(
|
(
|
||||||
uint256 receiveBaseAmount,
|
uint256 receiveBaseAmount,
|
||||||
uint256 mtFee,
|
uint256 mtFee,
|
||||||
PMMPricing.RState newRState,
|
PMMPricing.RState newRState,
|
||||||
uint256 newQuoteTarget
|
uint256 newQuoteTarget
|
||||||
) = querySellQuote(tx.origin, quoteBalance.sub(_QUOTE_RESERVE_)); // revert if quoteBalance<quoteReserve
|
) = querySellQuote(tx.origin, quoteInput); // revert if quoteBalance<quoteReserve
|
||||||
|
|
||||||
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
|
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
|
||||||
|
|
||||||
_transferBaseOut(_MAINTAINER_, mtFee);
|
_transferBaseOut(_MAINTAINER_, mtFee);
|
||||||
@@ -134,18 +155,25 @@ contract DPPTrader is DPPVault {
|
|||||||
_RState_ = newRState;
|
_RState_ = newRState;
|
||||||
_QUOTE_TARGET_ = newQuoteTarget;
|
_QUOTE_TARGET_ = newQuoteTarget;
|
||||||
}
|
}
|
||||||
|
emit DODOSwap(
|
||||||
|
address(_QUOTE_TOKEN_),
|
||||||
|
address(_BASE_TOKEN_),
|
||||||
|
quoteInput,
|
||||||
|
receiveBaseAmount,
|
||||||
|
tx.origin
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// sell base case
|
// sell base case
|
||||||
// base input + quote output
|
// base input + quote output
|
||||||
if (quoteBalance < _QUOTE_RESERVE_) {
|
if (quoteBalance < _QUOTE_RESERVE_) {
|
||||||
|
uint256 baseInput = baseBalance.sub(_BASE_RESERVE_);
|
||||||
(
|
(
|
||||||
uint256 receiveQuoteAmount,
|
uint256 receiveQuoteAmount,
|
||||||
uint256 mtFee,
|
uint256 mtFee,
|
||||||
PMMPricing.RState newRState,
|
PMMPricing.RState newRState,
|
||||||
uint256 newBaseTarget
|
uint256 newBaseTarget
|
||||||
) = querySellBase(tx.origin, baseBalance.sub(_BASE_RESERVE_)); // revert if baseBalance<baseReserve
|
) = querySellBase(tx.origin, baseInput); // revert if baseBalance<baseReserve
|
||||||
|
|
||||||
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
|
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
|
||||||
|
|
||||||
_transferQuoteOut(_MAINTAINER_, mtFee);
|
_transferQuoteOut(_MAINTAINER_, mtFee);
|
||||||
@@ -153,9 +181,16 @@ contract DPPTrader is DPPVault {
|
|||||||
_RState_ = newRState;
|
_RState_ = newRState;
|
||||||
_BASE_TARGET_ = newBaseTarget;
|
_BASE_TARGET_ = newBaseTarget;
|
||||||
}
|
}
|
||||||
|
emit DODOSwap(
|
||||||
|
address(_BASE_TOKEN_),
|
||||||
|
address(_QUOTE_TOKEN_),
|
||||||
|
baseInput,
|
||||||
|
receiveQuoteAmount,
|
||||||
|
tx.origin
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncReserve();
|
_sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============ Query Functions ============
|
// ============ Query Functions ============
|
||||||
@@ -179,7 +214,7 @@ contract DPPTrader is DPPVault {
|
|||||||
receiveQuoteAmount = receiveQuoteAmount
|
receiveQuoteAmount = receiveQuoteAmount
|
||||||
.sub(DecimalMath.mulFloor(receiveQuoteAmount, lpFeeRate))
|
.sub(DecimalMath.mulFloor(receiveQuoteAmount, lpFeeRate))
|
||||||
.sub(mtFee);
|
.sub(mtFee);
|
||||||
return (receiveQuoteAmount, mtFee, newRState, state.B0);
|
newBaseTarget = state.B0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function querySellQuote(address trader, uint256 payQuoteAmount)
|
function querySellQuote(address trader, uint256 payQuoteAmount)
|
||||||
@@ -201,7 +236,7 @@ contract DPPTrader is DPPVault {
|
|||||||
receiveBaseAmount = receiveBaseAmount
|
receiveBaseAmount = receiveBaseAmount
|
||||||
.sub(DecimalMath.mulFloor(receiveBaseAmount, lpFeeRate))
|
.sub(DecimalMath.mulFloor(receiveBaseAmount, lpFeeRate))
|
||||||
.sub(mtFee);
|
.sub(mtFee);
|
||||||
return (receiveBaseAmount, mtFee, newRState, state.Q0);
|
newQuoteTarget = state.Q0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============ Helper Functions ============
|
// ============ Helper Functions ============
|
||||||
@@ -215,14 +250,13 @@ contract DPPTrader is DPPVault {
|
|||||||
state.Q0 = _QUOTE_TARGET_;
|
state.Q0 = _QUOTE_TARGET_;
|
||||||
state.R = _RState_;
|
state.R = _RState_;
|
||||||
PMMPricing.adjustedTarget(state);
|
PMMPricing.adjustedTarget(state);
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMidPrice() public view returns (uint256 midPrice) {
|
function getMidPrice() public view returns (uint256 midPrice) {
|
||||||
return PMMPricing.getMidPrice(getPMMState());
|
return PMMPricing.getMidPrice(getPMMState());
|
||||||
}
|
}
|
||||||
|
|
||||||
function _syncReserve() internal {
|
function _sync() internal {
|
||||||
_BASE_RESERVE_ = _BASE_TOKEN_.balanceOf(address(this));
|
_BASE_RESERVE_ = _BASE_TOKEN_.balanceOf(address(this));
|
||||||
_QUOTE_RESERVE_ = _QUOTE_TOKEN_.balanceOf(address(this));
|
_QUOTE_RESERVE_ = _QUOTE_TOKEN_.balanceOf(address(this));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ contract DPPVault is DPPStorage {
|
|||||||
using SafeMath for uint256;
|
using SafeMath for uint256;
|
||||||
using SafeERC20 for IERC20;
|
using SafeERC20 for IERC20;
|
||||||
|
|
||||||
|
// ============ Events ============
|
||||||
|
|
||||||
|
event Reset();
|
||||||
|
|
||||||
// ============ Get Input ============
|
// ============ Get Input ============
|
||||||
|
|
||||||
function getBaseInput() public view returns (uint256 input) {
|
function getBaseInput() public view returns (uint256 input) {
|
||||||
@@ -64,6 +68,7 @@ contract DPPVault is DPPStorage {
|
|||||||
_transferQuoteOut(assetTo, quoteOutAmount);
|
_transferQuoteOut(assetTo, quoteOutAmount);
|
||||||
_resetTargetAndReserve();
|
_resetTargetAndReserve();
|
||||||
_checkIK();
|
_checkIK();
|
||||||
|
emit Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _setRState() internal {
|
function _setRState() internal {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ contract DVMTrader is DVMVault {
|
|||||||
|
|
||||||
// ============ Events ============
|
// ============ Events ============
|
||||||
|
|
||||||
event DVMSwap(
|
event DODOSwap(
|
||||||
address indexed fromToken,
|
address indexed fromToken,
|
||||||
address indexed toToken,
|
address indexed toToken,
|
||||||
uint256 fromAmount,
|
uint256 fromAmount,
|
||||||
@@ -60,10 +60,12 @@ contract DVMTrader is DVMVault {
|
|||||||
uint256 baseInput = getBaseInput();
|
uint256 baseInput = getBaseInput();
|
||||||
uint256 mtFee;
|
uint256 mtFee;
|
||||||
(receiveQuoteAmount, mtFee) = querySellBase(tx.origin, baseInput);
|
(receiveQuoteAmount, mtFee) = querySellBase(tx.origin, baseInput);
|
||||||
|
|
||||||
_transferQuoteOut(to, receiveQuoteAmount);
|
_transferQuoteOut(to, receiveQuoteAmount);
|
||||||
_transferQuoteOut(_MAINTAINER_, mtFee);
|
_transferQuoteOut(_MAINTAINER_, mtFee);
|
||||||
_sync();
|
_sync();
|
||||||
emit DVMSwap(
|
|
||||||
|
emit DODOSwap(
|
||||||
address(_BASE_TOKEN_),
|
address(_BASE_TOKEN_),
|
||||||
address(_QUOTE_TOKEN_),
|
address(_QUOTE_TOKEN_),
|
||||||
baseInput,
|
baseInput,
|
||||||
@@ -82,10 +84,12 @@ contract DVMTrader is DVMVault {
|
|||||||
uint256 quoteInput = getQuoteInput();
|
uint256 quoteInput = getQuoteInput();
|
||||||
uint256 mtFee;
|
uint256 mtFee;
|
||||||
(receiveBaseAmount, mtFee) = querySellQuote(tx.origin, quoteInput);
|
(receiveBaseAmount, mtFee) = querySellQuote(tx.origin, quoteInput);
|
||||||
|
|
||||||
_transferBaseOut(to, receiveBaseAmount);
|
_transferBaseOut(to, receiveBaseAmount);
|
||||||
_transferBaseOut(_MAINTAINER_, mtFee);
|
_transferBaseOut(_MAINTAINER_, mtFee);
|
||||||
_sync();
|
_sync();
|
||||||
emit DVMSwap(
|
|
||||||
|
emit DODOSwap(
|
||||||
address(_QUOTE_TOKEN_),
|
address(_QUOTE_TOKEN_),
|
||||||
address(_BASE_TOKEN_),
|
address(_BASE_TOKEN_),
|
||||||
quoteInput,
|
quoteInput,
|
||||||
@@ -120,8 +124,9 @@ contract DVMTrader is DVMVault {
|
|||||||
uint256 quoteInput = quoteBalance.sub(_QUOTE_RESERVE_);
|
uint256 quoteInput = quoteBalance.sub(_QUOTE_RESERVE_);
|
||||||
(uint256 receiveBaseAmount, uint256 mtFee) = querySellQuote(tx.origin, quoteInput);
|
(uint256 receiveBaseAmount, uint256 mtFee) = querySellQuote(tx.origin, quoteInput);
|
||||||
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
|
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
|
||||||
|
|
||||||
_transferBaseOut(_MAINTAINER_, mtFee);
|
_transferBaseOut(_MAINTAINER_, mtFee);
|
||||||
emit DVMSwap(
|
emit DODOSwap(
|
||||||
address(_QUOTE_TOKEN_),
|
address(_QUOTE_TOKEN_),
|
||||||
address(_BASE_TOKEN_),
|
address(_BASE_TOKEN_),
|
||||||
quoteInput,
|
quoteInput,
|
||||||
@@ -135,8 +140,9 @@ contract DVMTrader is DVMVault {
|
|||||||
uint256 baseInput = baseBalance.sub(_BASE_RESERVE_);
|
uint256 baseInput = baseBalance.sub(_BASE_RESERVE_);
|
||||||
(uint256 receiveQuoteAmount, uint256 mtFee) = querySellBase(tx.origin, baseInput);
|
(uint256 receiveQuoteAmount, uint256 mtFee) = querySellBase(tx.origin, baseInput);
|
||||||
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
|
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
|
||||||
|
|
||||||
_transferQuoteOut(_MAINTAINER_, mtFee);
|
_transferQuoteOut(_MAINTAINER_, mtFee);
|
||||||
emit DVMSwap(
|
emit DODOSwap(
|
||||||
address(_BASE_TOKEN_),
|
address(_BASE_TOKEN_),
|
||||||
address(_QUOTE_TOKEN_),
|
address(_QUOTE_TOKEN_),
|
||||||
baseInput,
|
baseInput,
|
||||||
|
|||||||
Reference in New Issue
Block a user