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