From 7793a16346b360ce4dfa66a552a04759e92006c9 Mon Sep 17 00:00:00 2001 From: mingda Date: Thu, 19 Nov 2020 01:02:31 +0800 Subject: [PATCH] finish DVM/DPP flashloan --- contracts/DODOPrivatePool/impl/DPPTrader.sol | 71 ++++++++++++++++++- contracts/DODOPrivatePool/impl/DPPVault.sol | 1 + .../DODOVendorMachine/impl/DVMFunding.sol | 12 ---- .../DODOVendorMachine/intf/IDVMVault.sol | 71 ------------------- contracts/intf/IDODOCallee.sol | 7 ++ 5 files changed, 76 insertions(+), 86 deletions(-) delete mode 100644 contracts/DODOVendorMachine/intf/IDVMVault.sol diff --git a/contracts/DODOPrivatePool/impl/DPPTrader.sol b/contracts/DODOPrivatePool/impl/DPPTrader.sol index a071273..0b64e71 100644 --- a/contracts/DODOPrivatePool/impl/DPPTrader.sol +++ b/contracts/DODOPrivatePool/impl/DPPTrader.sol @@ -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 0) { - // transferBaseOut(to, baseBalance.sub(baseReserve)); - // } - // if (quoteBalance.sub(quoteReserve) > 0) { - // transferQuoteOut(to, quoteBalance.sub(quoteReserve)); - // } - // } } diff --git a/contracts/DODOVendorMachine/intf/IDVMVault.sol b/contracts/DODOVendorMachine/intf/IDVMVault.sol deleted file mode 100644 index a310e47..0000000 --- a/contracts/DODOVendorMachine/intf/IDVMVault.sol +++ /dev/null @@ -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; -} diff --git a/contracts/intf/IDODOCallee.sol b/contracts/intf/IDODOCallee.sol index 2b98585..60ac6d1 100644 --- a/contracts/intf/IDODOCallee.sol +++ b/contracts/intf/IDODOCallee.sol @@ -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,