20 #ifndef RIPPLE_APP_MISC_AMMHELPERS_H_INCLUDED
21 #define RIPPLE_APP_MISC_AMMHELPERS_H_INCLUDED
23 #include <ripple/basics/IOUAmount.h>
24 #include <ripple/basics/Number.h>
25 #include <ripple/protocol/AMMCore.h>
26 #include <ripple/protocol/AmountConversions.h>
27 #include <ripple/protocol/Issue.h>
28 #include <ripple/protocol/Quality.h>
29 #include <ripple/protocol/STAccount.h>
30 #include <ripple/protocol/STAmount.h>
43 STAmount
const& asset1,
44 STAmount
const& asset2,
45 Issue
const& lptIssue);
56 STAmount
const& asset1Balance,
57 STAmount
const& asset1Deposit,
58 STAmount
const& lptAMMBalance,
70 STAmount
const& asset1Balance,
71 STAmount
const& lptAMMBalance,
72 STAmount
const& lpTokens,
85 STAmount
const& asset1Balance,
86 STAmount
const& asset1Withdraw,
87 STAmount
const& lptAMMBalance,
99 STAmount
const& assetBalance,
100 STAmount
const& lptAMMBalance,
101 STAmount
const& lpTokens,
112 withinRelativeDistance(
113 Quality
const& calcQuality,
114 Quality
const& reqQuality,
117 if (calcQuality == reqQuality)
123 return ((
min.rate() -
max.rate()) /
min.rate()) < dist;
134 template <
typename Amt>
136 std::is_same_v<Amt, STAmount> || std::is_same_v<Amt, IOUAmount> ||
137 std::is_same_v<Amt, XRPAmount>)
139 withinRelativeDistance(Amt
const& calc, Amt
const& req, Number
const& dist)
144 return ((max - min) / max) < dist;
159 template <
typename TIn,
typename TOut>
161 changeSpotPriceQuality(
162 TAmounts<TIn, TOut>
const& pool,
163 Quality
const& quality,
168 auto const b = pool.in * (1 + f);
169 Number
const c = pool.in * pool.in - pool.in * pool.out *
quality.rate();
170 if (
auto const res = b * b - 4 * a * c; res < 0)
172 else if (
auto const nTakerPaysPropose = (-b +
root2(res)) / (2 * a);
173 nTakerPaysPropose > 0)
175 auto const nTakerPays = [&]() {
180 auto const nTakerPaysConstraint =
181 pool.out *
quality.rate() - pool.in / f;
182 if (nTakerPaysPropose > nTakerPaysConstraint)
183 return nTakerPaysConstraint;
184 return nTakerPaysPropose;
188 auto const takerPays = toAmount<TIn>(
189 getIssue(pool.in), nTakerPays, Number::rounding_mode::upward);
191 if (
auto const amounts =
193 takerPays, swapAssetIn(pool, takerPays, tfee)};
195 !withinRelativeDistance(Quality{amounts},
quality, Number(1, -7)))
196 Throw<std::runtime_error>(
"changeSpotPriceQuality failed");
224 template <
typename TIn,
typename TOut>
227 TAmounts<TIn, TOut>
const& pool,
231 return toAmount<TOut>(
233 pool.out - (pool.in * pool.out) / (pool.in + assetIn *
feeMult(tfee)),
234 Number::rounding_mode::downward);
246 template <
typename TIn,
typename TOut>
249 TAmounts<TIn, TOut>
const& pool,
250 TOut
const& assetOut,
253 return toAmount<TIn>(
255 ((pool.in * pool.out) / (pool.out - assetOut) - pool.in) /
257 Number::rounding_mode::upward);
278 STAmount
const& lptAMMBalance,
279 STAmount
const& lpTokens,
295 STAmount
const& amountBalance,
296 STAmount
const& amount,
298 STAmount
const& lptAMMBalance,
299 STAmount
const& lpTokens,
311 #endif // RIPPLE_APP_MISC_AMMHELPERS_H_INCLUDED
STAmount lpTokensOut(STAmount const &asset1Balance, STAmount const &asset1Withdraw, STAmount const &lptAMMBalance, std::uint16_t tfee)
Number solveQuadraticEq(Number const &a, Number const &b, Number const &c)
STAmount lpTokensIn(STAmount const &asset1Balance, STAmount const &asset1Deposit, STAmount const &lptAMMBalance, std::uint16_t tfee)
Number feeMult(std::uint16_t tfee)
Get fee multiplier (1 - tfee) @tfee trading fee in basis points.
std::tuple< STAmount, std::optional< STAmount >, STAmount > adjustAmountsByLPTokens(STAmount const &amountBalance, STAmount const &amount, std::optional< STAmount > const &amount2, STAmount const &lptAMMBalance, STAmount const &lpTokens, std::uint16_t tfee, bool isDeposit)
Number square(Number const &n)
requires(T::ConsequencesFactory==Transactor::Normal) TxConsequences consequences_helper(PreflightContext const &ctx)
STAmount withdrawByTokens(STAmount const &assetBalance, STAmount const &lptAMMBalance, STAmount const &lpTokens, std::uint16_t tfee)
Issue getIssue(T const &amt)
STAmount ammAssetIn(STAmount const &asset1Balance, STAmount const &lptAMMBalance, STAmount const &lpTokens, std::uint16_t tfee)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
STAmount ammLPTokens(STAmount const &asset1, STAmount const &asset2, Issue const &lptIssue)
Keylet quality(Keylet const &k, std::uint64_t q) noexcept
The initial directory page for a specific quality.
STAmount adjustLPTokens(STAmount const &lptAMMBalance, STAmount const &lpTokens, bool isDeposit)