1#include <xrpl/protocol/AMMCore.h>
3#include <xrpl/basics/base_uint.h>
4#include <xrpl/beast/utility/Zero.h>
5#include <xrpl/beast/utility/instrumentation.h>
6#include <xrpl/protocol/AccountID.h>
7#include <xrpl/protocol/Asset.h>
8#include <xrpl/protocol/Concepts.h>
9#include <xrpl/protocol/Feature.h>
10#include <xrpl/protocol/Issue.h>
11#include <xrpl/protocol/MPTIssue.h>
12#include <xrpl/protocol/Rules.h>
13#include <xrpl/protocol/SField.h>
14#include <xrpl/protocol/STAmount.h>
15#include <xrpl/protocol/STObject.h>
16#include <xrpl/protocol/TER.h>
17#include <xrpl/protocol/UintTypes.h>
18#include <xrpl/protocol/digest.h>
33 auto const& [minA, maxA] =
std::minmax(asset1, asset2);
35 [](
auto&& issue1,
auto&& issue2) {
38 return issue.currency;
40 return issue.getMptID();
42 return sha512Half(fromIss(issue1), fromIss(issue2));
47 *currency.
begin() = kAmmCurrencyCode;
61 auto const err = asset.
visit(
76 if (pair && asset != pair->first && asset != pair->second)
104 if (amount < beast::kZero || (!validZero && amount == beast::kZero))
114 auto const expiration = auctionSlot[sfExpiration];
115 XRPL_ASSERT(expiration >=
kTotalTimeSlotSecs,
"xrpl::ammAuctionTimeSlot : minimum expiration");
130 return rules.
enabled(featureAMM);
constexpr auto visit(Visitors &&... visitors) const -> decltype(auto)
static constexpr std::size_t size()
A currency issued by an account.
AccountID const & getIssuer() const
Rules controlling protocol behavior.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Asset const & asset() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
NotTEC invalidAMMAmount(STAmount const &amount, std::optional< std::pair< Asset, Asset > > const &pair=std::nullopt, bool validZero=false)
Validate the amount.
constexpr std::uint32_t kTotalTimeSlotSecs
bool ammEnabled(Rules const &)
Return true if required AMM amendment is enabled.
bool isXRP(AccountID const &c)
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
NotTEC invalidAMMAssetPair(Asset const &asset1, Asset const &asset2, std::optional< std::pair< Asset, Asset > > const &pair=std::nullopt)
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Currency ammLPTCurrency(Asset const &asset1, Asset const &asset2)
Calculate Liquidity Provider Token (LPT) Currency.
TERSubset< CanCvtToNotTEC > NotTEC
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
std::optional< std::uint8_t > ammAuctionTimeSlot(std::uint64_t current, STObject const &auctionSlot)
Get time slot of the auction slot.
Issue ammLPTIssue(Asset const &asset1, Asset const &asset2, AccountID const &ammAccountID)
Calculate LPT Issue from AMM asset pair.
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
NotTEC invalidAMMAsset(Asset const &asset, std::optional< std::pair< Asset, Asset > > const &pair=std::nullopt)
constexpr std::uint32_t kAuctionSlotIntervalDuration