query buy

This commit is contained in:
mingda
2020-11-06 01:20:07 +08:00
parent 81dc1c15a0
commit bdc8e7f6b1
2 changed files with 47 additions and 4 deletions

View File

@@ -102,6 +102,26 @@ contract DVMTrader is DVMStorage {
return (receiveQuoteAmount, mtFee);
}
// 这是一个仅供查询的合约所有交易都是基于先给input再输出output的
// 所以想要买10ETH这个函数可以给你一个大概的成本你用这个成本输入最后能否得到10ETH是要看情况的
function queryBuyBase(address trader, uint256 receiveBaseAmount)
public
view
returns (uint256 payQuoteAmount)
{
uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 validReceiveBaseAmount = DecimalMath.divCeil(
receiveBaseAmount,
DecimalMath.ONE.sub(mtFeeRate).sub(lpFeeRate)
);
(uint256 baseReserve, uint256 quoteReserve) = _VAULT_.getVaultReserve();
uint256 B0 = calculateBase0(baseReserve, quoteReserve);
uint256 B2 = baseReserve.sub(validReceiveBaseAmount);
payQuoteAmount = DODOMath._GeneralIntegrate(B0, baseReserve, B2, _I_, _K_);
return payQuoteAmount;
}
function querySellQuote(address trader, uint256 payQuoteAmount)
public
view
@@ -111,14 +131,13 @@ contract DVMTrader is DVMStorage {
uint256 B0 = calculateBase0(baseReserve, quoteReserve);
uint256 fairAmount = DecimalMath.divFloor(payQuoteAmount, _I_);
uint256 newBaseReserve = DODOMath._SolveQuadraticFunctionForTrade(
uint256 deltaBase = DODOMath._SolveQuadraticFunctionForTrade(
B0,
baseReserve,
fairAmount,
false,
_K_
);
uint256 deltaBase = baseReserve.sub(newBaseReserve);
uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader);
mtFee = DecimalMath.mulCeil(deltaBase, mtFeeRate);
@@ -126,6 +145,30 @@ contract DVMTrader is DVMStorage {
return (receiveBaseAmount, mtFee);
}
function queryBuyQuote(address trader, uint256 receiveQuoteAmount)
public
view
returns (uint256 payBaseAmount)
{
uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 validReceiveQuoteAmount = DecimalMath.divCeil(
receiveQuoteAmount,
DecimalMath.ONE.sub(mtFeeRate).sub(lpFeeRate)
);
(uint256 baseReserve, uint256 quoteReserve) = _VAULT_.getVaultReserve();
uint256 B0 = calculateBase0(baseReserve, quoteReserve);
uint256 fairAmount = DecimalMath.divFloor(validReceiveQuoteAmount, _I_);
payBaseAmount = DODOMath._SolveQuadraticFunctionForTrade(
B0,
baseReserve,
fairAmount,
true,
_K_
);
return payBaseAmount;
}
function getMidPrice() public view returns (uint256 midPrice) {
(uint256 baseReserve, uint256 quoteReserve) = _VAULT_.getVaultReserve();
uint256 B0 = calculateBase0(baseReserve, quoteReserve);

View File

@@ -96,9 +96,9 @@ library DODOMath {
}
if (deltaBSig) {
return DecimalMath.divFloor(numerator, denominator);
return DecimalMath.divFloor(numerator, denominator).sub(Q1);
} else {
return DecimalMath.divCeil(numerator, denominator);
return Q1.sub(DecimalMath.divCeil(numerator, denominator));
}
}