query buy
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user