finish DVM/DPP flashloan

This commit is contained in:
mingda
2020-11-19 01:02:31 +08:00
parent d1ff214727
commit 7793a16346
5 changed files with 76 additions and 86 deletions

View File

@@ -12,6 +12,7 @@ import {DPPVault} from "./DPPVault.sol";
import {SafeMath} from "../../lib/SafeMath.sol";
import {DecimalMath} from "../../lib/DecimalMath.sol";
import {RState, PMMState, PMMPricing} from "../../lib/PMMPricing.sol";
import {IDODOCallee} from "../../intf/IDODOCallee.sol";
contract DPPTrader is DPPVault {
using SafeMath for uint256;
@@ -38,8 +39,6 @@ contract DPPTrader is DPPVault {
// ============ Trade Functions ============
// todo 看看怎么能加上flash loan
function sellBase(address to)
external
preventReentrant
@@ -78,7 +77,7 @@ contract DPPTrader is DPPVault {
uint256 mtFee;
uint256 newQuoteTarget;
RState newRState;
(receiveBaseAmount, mtFee, newRState, newQuoteTarget) = querySellBase(
(receiveBaseAmount, mtFee, newRState, newQuoteTarget) = querySellQuote(
tx.origin,
quoteInput
);
@@ -97,6 +96,72 @@ contract DPPTrader is DPPVault {
return receiveBaseAmount;
}
function flashLoan(
uint256 baseAmount,
uint256 quoteAmount,
address assetTo,
bytes calldata data
) external preventReentrant {
_transferBaseOut(assetTo, baseAmount);
_transferQuoteOut(assetTo, quoteAmount);
if (data.length > 0)
IDODOCallee(assetTo).DPPFlashLoanCall(msg.sender, baseAmount, quoteAmount, data);
uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this));
uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this));
// no output -> pure profit
if (baseBalance >= _BASE_RESERVE_ && quoteBalance >= _QUOTE_RESERVE_) return;
// no input -> pure loss
require(
baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_,
"FLASH_LOAN_FAILED"
);
// sell quote case
// quote input + base output
if (baseBalance < _BASE_RESERVE_) {
(
uint256 receiveBaseAmount,
uint256 mtFee,
RState newRState,
uint256 newQuoteTarget
) = querySellQuote(tx.origin, quoteBalance.sub(_QUOTE_RESERVE_)); // revert if quoteBalance<quoteReserve
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
_transferBaseOut(_MAINTAINER_, mtFee);
if (_RState_ != newRState) {
_RState_ = newRState;
_QUOTE_TARGET_ = newQuoteTarget;
}
_syncReserve();
}
// sell base case
// base input + quote output
if (quoteBalance < _QUOTE_RESERVE_) {
(
uint256 receiveQuoteAmount,
uint256 mtFee,
RState newRState,
uint256 newBaseTarget
) = querySellBase(tx.origin, baseBalance.sub(_BASE_RESERVE_)); // revert if baseBalance<baseReserve
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
_transferQuoteOut(_MAINTAINER_, mtFee);
if (_RState_ != newRState) {
_RState_ = newRState;
_BASE_TARGET_ = newBaseTarget;
}
_syncReserve();
}
}
// ============ Query Functions ============
function querySellBase(address trader, uint256 payBaseAmount)

View File

@@ -95,6 +95,7 @@ contract DPPVault is DPPStorage {
}
// todo 高级功能,需要讨论
// 如果单独执行这个功能会导致状态失衡
function retrieve(
address payable to,
address token,

View File

@@ -70,16 +70,4 @@ contract DVMFunding is DVMVault {
data
);
}
// 高级功能,需要讨论加不加
// function retrieve(address to) external preventReentrant {
// (uint256 baseBalance, uint256 quoteBalance) = getVaultBalance();
// (uint256 baseReserve, uint256 quoteReserve) = getVaultReserve();
// if (baseBalance.sub(baseReserve) > 0) {
// transferBaseOut(to, baseBalance.sub(baseReserve));
// }
// if (quoteBalance.sub(quoteReserve) > 0) {
// transferQuoteOut(to, quoteBalance.sub(quoteReserve));
// }
// }
}

View File

@@ -1,71 +0,0 @@
/*
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;
interface IDVMVault {
function init(
address owner,
address _baseToken,
address _quoteToken
) external;
function _BASE_TOKEN_() external returns (address);
function _QUOTE_TOKEN_() external returns (address);
function _BASE_RESERVE_() external returns (uint256);
function _QUOTE_RESERVE_() external returns (uint256);
function symbol() external returns (string memory);
function decimals() external returns (uint256);
function name() external returns (string memory);
function totalSupply() external returns (uint256);
function getVaultBalance() external view returns (uint256 baseBalance, uint256 quoteBalance);
function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve);
function getBaseBalance() external view returns (uint256 baseBalance);
function getQuoteBalance() external view returns (uint256 quoteBalance);
function getBaseInput() external view returns (uint256 input);
function getQuoteInput() external view returns (uint256 input);
function sync() external;
function transferBaseOut(address to, uint256 amount) external;
function transferQuoteOut(address to, uint256 amount) external;
function transfer(address to, uint256 amount) external returns (bool);
function balanceOf(address owner) external view returns (uint256 balance);
function shareRatioOf(address owner) external view returns (uint256 shareRatio);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function mint(address user, uint256 value) external;
function burn(address user, uint256 value) external;
}

View File

@@ -24,6 +24,13 @@ interface IDODOCallee {
bytes calldata data
) external;
function DPPFlashLoanCall(
address sender,
uint256 baseAmount,
uint256 quoteAmount,
bytes calldata data
) external;
function DPPWithdrawCall(
address sender,
uint256 baseAmount,