xrpld
Loading...
Searching...
No Matches
AMMCore.cpp
1#include <xrpl/protocol/AMMCore.h>
2
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/STInteger.h> // IWYU pragma: keep
16#include <xrpl/protocol/STObject.h>
17#include <xrpl/protocol/TER.h>
18#include <xrpl/protocol/UintTypes.h>
19#include <xrpl/protocol/digest.h>
20
21#include <algorithm>
22#include <cstdint>
23#include <optional>
24#include <utility>
25#include <variant>
26
27namespace xrpl {
28
30ammLPTCurrency(Asset const& asset1, Asset const& asset2)
31{
32 // AMM LPToken is 0x03 plus 19 bytes of the hash
33 static constexpr std::int32_t kAmmCurrencyCode = 0x03;
34 auto const& [minA, maxA] = std::minmax(asset1, asset2);
35 uint256 const hash = std::visit(
36 [](auto&& issue1, auto&& issue2) {
37 auto fromIss = []<ValidIssueType T>(T const& issue) {
38 if constexpr (std::is_same_v<T, Issue>)
39 return issue.currency;
40 if constexpr (std::is_same_v<T, MPTIssue>)
41 return issue.getMptID();
42 };
43 return sha512Half(fromIss(issue1), fromIss(issue2));
44 },
45 minA.value(),
46 maxA.value());
47 Currency currency;
48 *currency.begin() = kAmmCurrencyCode;
49 std::copy(hash.begin(), hash.begin() + currency.size() - 1, currency.begin() + 1);
50 return currency;
51}
52
53Issue
54ammLPTIssue(Asset const& asset1, Asset const& asset2, AccountID const& ammAccountID)
55{
56 return Issue(ammLPTCurrency(asset1, asset2), ammAccountID);
57}
58
61{
62 auto const err = asset.visit(
63 [](MPTIssue const& issue) -> std::optional<NotTEC> {
64 if (issue.getIssuer() == beast::kZero)
65 return temBAD_MPT;
66 return std::nullopt;
67 },
68 [](Issue const& issue) -> std::optional<NotTEC> {
69 if (badCurrency() == issue.currency)
70 return temBAD_CURRENCY;
71 if (isXRP(issue) && issue.getIssuer().isNonZero())
72 return temBAD_ISSUER;
73 return std::nullopt;
74 });
75 if (err)
76 return *err;
77 if (pair && asset != pair->first && asset != pair->second)
78 return temBAD_AMM_TOKENS;
79 return tesSUCCESS;
80}
81
84 Asset const& asset1,
85 Asset const& asset2,
87{
88 if (asset1 == asset2)
89 return temBAD_AMM_TOKENS;
90 if (auto const res = invalidAMMAsset(asset1, pair))
91 return res;
92 if (auto const res = invalidAMMAsset(asset2, pair))
93 return res;
94 return tesSUCCESS;
95}
96
99 STAmount const& amount,
101 bool validZero)
102{
103 if (auto const res = invalidAMMAsset(amount.asset(), pair))
104 return res;
105 if (amount < beast::kZero || (!validZero && amount == beast::kZero))
106 return temBAD_AMOUNT;
107 return tesSUCCESS;
108}
109
111ammAuctionTimeSlot(std::uint64_t current, STObject const& auctionSlot)
112{
113 // It should be impossible for expiration to be < TOTAL_TIME_SLOT_SECS,
114 // but check just to be safe
115 auto const expiration = auctionSlot[sfExpiration];
116 XRPL_ASSERT(expiration >= kTotalTimeSlotSecs, "xrpl::ammAuctionTimeSlot : minimum expiration");
117 if (expiration >= kTotalTimeSlotSecs)
118 {
119 if (auto const start = expiration - kTotalTimeSlotSecs; current >= start)
120 {
121 if (auto const diff = current - start; diff < kTotalTimeSlotSecs)
122 return diff / kAuctionSlotIntervalDuration;
123 }
124 }
125 return std::nullopt;
126}
127
128bool
129ammEnabled(Rules const& rules)
130{
131 return rules.enabled(featureAMM);
132}
133
134} // namespace xrpl
constexpr auto visit(Visitors &&... visitors) const -> decltype(auto)
Definition Asset.h:117
bool isNonZero() const
Definition base_uint.h:567
iterator begin()
Definition base_uint.h:128
static constexpr std::size_t size()
Definition base_uint.h:548
A currency issued by an account.
Definition Issue.h:18
AccountID const & getIssuer() const
Definition MPTIssue.cpp:29
Rules controlling protocol behavior.
Definition Rules.h:40
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition Rules.cpp:180
Asset const & asset() const
Definition STAmount.h:496
T copy(T... args)
T is_same_v
T minmax(T... args)
constexpr Zero kZero
Definition Zero.h:30
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
NotTEC invalidAMMAmount(STAmount const &amount, std::optional< std::pair< Asset, Asset > > const &pair=std::nullopt, bool validZero=false)
Validate the amount.
Definition AMMCore.cpp:98
constexpr std::uint32_t kTotalTimeSlotSecs
Definition AMMCore.h:19
bool ammEnabled(Rules const &)
Return true if required AMM amendment is enabled.
Definition AMMCore.cpp:129
bool isXRP(AccountID const &c)
Definition AccountID.h:84
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition digest.h:215
NotTEC invalidAMMAssetPair(Asset const &asset1, Asset const &asset2, std::optional< std::pair< Asset, Asset > > const &pair=std::nullopt)
Definition AMMCore.cpp:83
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Definition UintTypes.h:42
Currency ammLPTCurrency(Asset const &asset1, Asset const &asset2)
Calculate Liquidity Provider Token (LPT) Currency.
Definition AMMCore.cpp:30
TERSubset< CanCvtToNotTEC > NotTEC
Definition TER.h:607
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:34
@ temBAD_ISSUER
Definition TER.h:81
@ temBAD_CURRENCY
Definition TER.h:78
@ temBAD_MPT
Definition TER.h:132
@ temBAD_AMM_TOKENS
Definition TER.h:117
@ temBAD_AMOUNT
Definition TER.h:77
std::optional< std::uint8_t > ammAuctionTimeSlot(std::uint64_t current, STObject const &auctionSlot)
Get time slot of the auction slot.
Definition AMMCore.cpp:111
Issue ammLPTIssue(Asset const &asset1, Asset const &asset2, AccountID const &ammAccountID)
Calculate LPT Issue from AMM asset pair.
Definition AMMCore.cpp:54
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)
Definition AMMCore.cpp:60
BaseUInt< 256 > uint256
Definition base_uint.h:580
@ tesSUCCESS
Definition TER.h:245
constexpr std::uint32_t kAuctionSlotIntervalDuration
Definition AMMCore.h:25
T visit(T... args)