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); 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) function querySellQuote(address trader, uint256 payQuoteAmount)
public public
view view
@@ -111,14 +131,13 @@ contract DVMTrader is DVMStorage {
uint256 B0 = calculateBase0(baseReserve, quoteReserve); uint256 B0 = calculateBase0(baseReserve, quoteReserve);
uint256 fairAmount = DecimalMath.divFloor(payQuoteAmount, _I_); uint256 fairAmount = DecimalMath.divFloor(payQuoteAmount, _I_);
uint256 newBaseReserve = DODOMath._SolveQuadraticFunctionForTrade( uint256 deltaBase = DODOMath._SolveQuadraticFunctionForTrade(
B0, B0,
baseReserve, baseReserve,
fairAmount, fairAmount,
false, false,
_K_ _K_
); );
uint256 deltaBase = baseReserve.sub(newBaseReserve);
uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(trader); uint256 lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(trader);
uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader);
mtFee = DecimalMath.mulCeil(deltaBase, mtFeeRate); mtFee = DecimalMath.mulCeil(deltaBase, mtFeeRate);
@@ -126,6 +145,30 @@ contract DVMTrader is DVMStorage {
return (receiveBaseAmount, mtFee); 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) { function getMidPrice() public view returns (uint256 midPrice) {
(uint256 baseReserve, uint256 quoteReserve) = _VAULT_.getVaultReserve(); (uint256 baseReserve, uint256 quoteReserve) = _VAULT_.getVaultReserve();
uint256 B0 = calculateBase0(baseReserve, quoteReserve); uint256 B0 = calculateBase0(baseReserve, quoteReserve);

View File

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