flash loan test

This commit is contained in:
mingda
2020-11-27 01:42:46 +08:00
parent 68c377807b
commit d4569fe099
6 changed files with 98 additions and 34 deletions

View File

@@ -48,7 +48,7 @@ contract DVMTrader is DVMVault {
returns (uint256 receiveQuoteAmount)
{
uint256 baseInput = getBaseInput();
require(baseInput > 0, 'INSUFFICIENT_BASE_INPUT');
require(baseInput > 0, "INSUFFICIENT_BASE_INPUT");
uint256 mtFee;
(receiveQuoteAmount, mtFee) = querySellBase(tx.origin, baseInput);
_transferQuoteOut(to, receiveQuoteAmount);
@@ -65,7 +65,7 @@ contract DVMTrader is DVMVault {
returns (uint256 receiveBaseAmount)
{
uint256 quoteInput = getQuoteInput();
require(quoteInput > 0, 'INSUFFICIENT_QUOTE_INPUT');
require(quoteInput > 0, "INSUFFICIENT_QUOTE_INPUT");
uint256 mtFee;
(receiveBaseAmount, mtFee) = querySellQuote(tx.origin, quoteInput);
_transferBaseOut(to, receiveBaseAmount);
@@ -88,33 +88,35 @@ contract DVMTrader is DVMVault {
if (data.length > 0)
IDODOCallee(assetTo).DVMFlashLoanCall(msg.sender, baseAmount, quoteAmount, data);
(uint256 baseReserve, uint256 quoteReserve) = getVaultReserve();
(uint256 baseBalance, uint256 quoteBalance) = getVaultBalance();
uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(tx.origin);
uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(tx.origin);
if (baseBalance < baseReserve) {
uint256 validBaseOut = DecimalMath.divCeil(
baseReserve - baseBalance,
DecimalMath.ONE.sub(mtFeeRate).sub(lpFeeRate)
);
baseBalance = baseReserve.sub(validBaseOut);
_transferBaseOut(_MAINTAINER_, DecimalMath.mulFloor(validBaseOut, mtFeeRate));
}
if (quoteBalance < quoteReserve) {
uint256 validQuoteOut = DecimalMath.divCeil(
quoteReserve - quoteBalance,
DecimalMath.ONE.sub(mtFeeRate).sub(lpFeeRate)
);
quoteBalance = quoteReserve.sub(validQuoteOut);
_transferQuoteOut(_MAINTAINER_, DecimalMath.mulFloor(validQuoteOut, mtFeeRate));
}
// no input -> pure loss
require(
calculateBase0(baseBalance, quoteBalance) >= calculateBase0(baseReserve, quoteReserve),
baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_,
"FLASH_LOAN_FAILED"
);
// no output -> pure profit
if (baseBalance >= _BASE_RESERVE_ && quoteBalance >= _QUOTE_RESERVE_) return;
if (baseBalance < _BASE_RESERVE_) {
(uint256 receiveBaseAmount, uint256 mtFee) = querySellQuote(
tx.origin,
quoteBalance.sub(_QUOTE_RESERVE_)
);
require(_BASE_RESERVE_.sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED");
_transferBaseOut(_MAINTAINER_, mtFee);
}
if (quoteBalance < _QUOTE_RESERVE_) {
(uint256 receiveQuoteAmount, uint256 mtFee) = querySellBase(
tx.origin,
baseBalance.sub(_BASE_RESERVE_)
);
require(_QUOTE_RESERVE_.sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED");
_transferQuoteOut(_MAINTAINER_, mtFee);
}
_sync();
}