DODO Math support k=1
This commit is contained in:
@@ -55,25 +55,31 @@ library DODOMath {
|
|||||||
if deltaBSig=true, then Q2>Q1, user sell Q and receive B
|
if deltaBSig=true, then Q2>Q1, user sell Q and receive B
|
||||||
if deltaBSig=false, then Q2<Q1, user sell B and receive Q
|
if deltaBSig=false, then Q2<Q1, user sell B and receive Q
|
||||||
return |Q1-Q2|
|
return |Q1-Q2|
|
||||||
|
|
||||||
|
if k==1
|
||||||
|
Q2 = -c/b
|
||||||
|
|
||||||
|
if k==0
|
||||||
*/
|
*/
|
||||||
function _SolveQuadraticFunctionForTrade(
|
function _SolveQuadraticFunctionForTrade(
|
||||||
uint256 Q0,
|
uint256 Q0,
|
||||||
uint256 Q1,
|
uint256 Q1,
|
||||||
uint256 ideltaB,
|
uint256 ideltaB,
|
||||||
bool deltaBSig,
|
// bool deltaBSig, deltaBSig is always false
|
||||||
uint256 k
|
uint256 k
|
||||||
) internal pure returns (uint256) {
|
) internal pure returns (uint256) {
|
||||||
require(Q0 > 0, "TARGET_IS_ZERO");
|
require(Q0 > 0, "TARGET_IS_ZERO");
|
||||||
|
if (k == DecimalMath.ONE) {
|
||||||
|
// Q2=Q1/(1-ideltaBQ1/Q0/Q0)
|
||||||
|
uint256 temp = ideltaB.mul(Q1).mul(DecimalMath.ONE).div(Q0.mul(Q0));
|
||||||
|
return Q1.sub(DecimalMath.divFloor(DecimalMath.ONE, DecimalMath.ONE.add(temp)));
|
||||||
|
}
|
||||||
// calculate -b value and sig
|
// calculate -b value and sig
|
||||||
// -b = (1-k)Q1-kQ0^2/Q1+i*deltaB
|
// -b = (1-k)Q1-kQ0^2/Q1+i*deltaB
|
||||||
uint256 kQ02Q1 = DecimalMath.mul(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1
|
uint256 kQ02Q1 = DecimalMath.mul(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1
|
||||||
uint256 b = DecimalMath.mul(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1
|
uint256 b = DecimalMath.mul(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1
|
||||||
bool minusbSig = true;
|
bool minusbSig = true;
|
||||||
if (deltaBSig) {
|
kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1
|
||||||
b = b.add(ideltaB); // (1-k)Q1+i*deltaB
|
|
||||||
} else {
|
|
||||||
kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1
|
|
||||||
}
|
|
||||||
if (b >= kQ02Q1) {
|
if (b >= kQ02Q1) {
|
||||||
b = b.sub(kQ02Q1);
|
b = b.sub(kQ02Q1);
|
||||||
minusbSig = true;
|
minusbSig = true;
|
||||||
@@ -98,11 +104,7 @@ library DODOMath {
|
|||||||
numerator = squareRoot.sub(b);
|
numerator = squareRoot.sub(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deltaBSig) {
|
return Q1.sub(DecimalMath.divCeil(numerator, denominator));
|
||||||
return DecimalMath.divFloor(numerator, denominator).sub(Q1);
|
|
||||||
} else {
|
|
||||||
return Q1.sub(DecimalMath.divCeil(numerator, denominator));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -127,7 +127,6 @@ library PMMPricing {
|
|||||||
state.Q0,
|
state.Q0,
|
||||||
state.Q0,
|
state.Q0,
|
||||||
DecimalMath.mulFloor(state.i, payBaseAmount),
|
DecimalMath.mulFloor(state.i, payBaseAmount),
|
||||||
false,
|
|
||||||
state.K
|
state.K
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -142,7 +141,6 @@ library PMMPricing {
|
|||||||
state.B0,
|
state.B0,
|
||||||
state.B0,
|
state.B0,
|
||||||
DecimalMath.divFloor(payQuoteAmount, state.i),
|
DecimalMath.divFloor(payQuoteAmount, state.i),
|
||||||
false,
|
|
||||||
state.K
|
state.K
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -174,7 +172,6 @@ library PMMPricing {
|
|||||||
state.Q0,
|
state.Q0,
|
||||||
state.Q,
|
state.Q,
|
||||||
DecimalMath.mul(state.i, payBaseAmount),
|
DecimalMath.mul(state.i, payBaseAmount),
|
||||||
false,
|
|
||||||
state.K
|
state.K
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -206,7 +203,6 @@ library PMMPricing {
|
|||||||
state.B0,
|
state.B0,
|
||||||
state.B,
|
state.B,
|
||||||
DecimalMath.divFloor(payQuoteAmount, state.i),
|
DecimalMath.divFloor(payQuoteAmount, state.i),
|
||||||
false,
|
|
||||||
state.K
|
state.K
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user