1#include <xrpld/app/paths/AMMLiquidity.h> 
    2#include <xrpld/app/paths/AMMOffer.h> 
    4#include <xrpl/protocol/QualityFunction.h> 
    8template <
typename TIn, 
typename TOut>
 
   11    TAmounts<TIn, TOut> 
const& amounts,
 
   12    TAmounts<TIn, TOut> 
const& balances,
 
   13    Quality 
const& quality)
 
   14    : ammLiquidity_(ammLiquidity)
 
 
   22template <
typename TIn, 
typename TOut>
 
   26    return ammLiquidity_.issueIn();
 
 
   29template <
typename TIn, 
typename TOut>
 
   33    return ammLiquidity_.ammAccount();
 
 
   36template <
typename TIn, 
typename TOut>
 
   37TAmounts<TIn, TOut> 
const&
 
   43template <
typename TIn, 
typename TOut>
 
   47    TAmounts<TIn, TOut> 
const& consumed)
 
   50    if (consumed.in > amounts_.in || consumed.out > amounts_.out)
 
   51        Throw<std::logic_error>(
"Invalid consumed AMM offer.");
 
   58    ammLiquidity_.context().setAMMUsed();
 
 
   61template <
typename TIn, 
typename TOut>
 
   64    TAmounts<TIn, TOut> 
const& offrAmt,
 
   74    if (ammLiquidity_.multiPath())
 
   78        return quality().ceil_out_strict(offrAmt, limit, roundUp);
 
   83    return {
swapAssetOut(balances_, limit, ammLiquidity_.tradingFee()), limit};
 
 
   86template <
typename TIn, 
typename TOut>
 
   89    TAmounts<TIn, TOut> 
const& offrAmt,
 
   94    if (ammLiquidity_.multiPath())
 
   97            rules && rules->enabled(fixReducedOffersV2))
 
   98            return quality().ceil_in_strict(offrAmt, limit, roundUp);
 
  100        return quality().ceil_in(offrAmt, limit);
 
  102    return {limit, 
swapAssetIn(balances_, limit, ammLiquidity_.tradingFee())};
 
 
  105template <
typename TIn, 
typename TOut>
 
  109    if (ammLiquidity_.multiPath())
 
 
  115template <
typename TIn, 
typename TOut>
 
  118    TAmounts<TIn, TOut> 
const& consumed,
 
  121    if (consumed.in > amounts_.in || consumed.out > amounts_.out)
 
  123        JLOG(j.
error()) << 
"AMMOffer::checkInvariant failed: consumed " 
  125                        << 
to_string(consumed.out) << 
" amounts " 
  132    Number const product = balances_.in * balances_.out;
 
  133    auto const newBalances = TAmounts<TIn, TOut>{
 
  134        balances_.in + consumed.in, balances_.out - consumed.out};
 
  135    Number const newProduct = newBalances.in * newBalances.out;
 
  137    if (newProduct >= product ||
 
  141    JLOG(j.
error()) << 
"AMMOffer::checkInvariant failed: balances " 
  143                    << 
to_string(balances_.out) << 
" new balances " 
  145                    << 
to_string(newBalances.out) << 
" product/newProduct " 
  146                    << product << 
" " << newProduct << 
" diff " 
  148                            ? 
to_string((product - newProduct) / product)
 
 
A generic endpoint for log messages.
 
AMMLiquidity class provides AMM offers to BookStep class.
 
Represents synthetic AMM offer in BookStep.
 
AMMOffer(AMMLiquidity< TIn, TOut > const &ammLiquidity, TAmounts< TIn, TOut > const &amounts, TAmounts< TIn, TOut > const &balances, Quality const &quality)
 
AccountID const & owner() const
 
TAmounts< TIn, TOut > limitOut(TAmounts< TIn, TOut > const &offrAmt, TOut const &limit, bool roundUp) const
Limit out of the provided offer.
 
bool checkInvariant(TAmounts< TIn, TOut > const &consumed, beast::Journal j) const
Check the new pool product is greater or equal to the old pool product or if decreases then within so...
 
void consume(ApplyView &view, TAmounts< TIn, TOut > const &consumed)
 
TAmounts< TIn, TOut > limitIn(TAmounts< TIn, TOut > const &offrAmt, TIn const &limit, bool roundUp) const
Limit in of the provided offer.
 
Issue const & issueIn() const
 
TAmounts< TIn, TOut > const & amount() const
 
QualityFunction getQualityFunc() const
 
Writeable view to a ledger, for applying a transaction.
 
A currency issued by an account.
 
Average quality of a path as a function of out: q(out) = m * out + b, where m = -1 / poolGets,...
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
TOut swapAssetIn(TAmounts< TIn, TOut > const &pool, TIn const &assetIn, std::uint16_t tfee)
AMM pool invariant - the product (A * B) after swap in/out has to remain at least the same: (A + in) ...
 
std::string to_string(base_uint< Bits, Tag > const &a)
 
std::optional< Rules > const & getCurrentTransactionRules()
 
bool withinRelativeDistance(Quality const &calcQuality, Quality const &reqQuality, Number const &dist)
Check if the relative distance between the qualities is within the requested distance.
 
TIn swapAssetOut(TAmounts< TIn, TOut > const &pool, TOut const &assetOut, std::uint16_t tfee)
Swap assetOut out of the pool and swap in a proportional amount of the other asset.