rippled
Loading...
Searching...
No Matches
AMMCore.cpp
1#include <xrpl/basics/base_uint.h>
2#include <xrpl/beast/utility/Zero.h>
3#include <xrpl/beast/utility/instrumentation.h>
4#include <xrpl/protocol/AMMCore.h>
5#include <xrpl/protocol/AccountID.h>
6#include <xrpl/protocol/Feature.h>
7#include <xrpl/protocol/Issue.h>
8#include <xrpl/protocol/Rules.h>
9#include <xrpl/protocol/SField.h>
10#include <xrpl/protocol/STAmount.h>
11#include <xrpl/protocol/STObject.h>
12#include <xrpl/protocol/TER.h>
13#include <xrpl/protocol/UintTypes.h>
14#include <xrpl/protocol/digest.h>
15
16#include <algorithm>
17#include <cstdint>
18#include <optional>
19#include <utility>
20
21namespace ripple {
22
24ammLPTCurrency(Currency const& cur1, Currency const& cur2)
25{
26 // AMM LPToken is 0x03 plus 19 bytes of the hash
27 std::int32_t constexpr AMMCurrencyCode = 0x03;
28 auto const [minC, maxC] = std::minmax(cur1, cur2);
29 auto const hash = sha512Half(minC, maxC);
30 Currency currency;
31 *currency.begin() = AMMCurrencyCode;
33 hash.begin(), hash.begin() + currency.size() - 1, currency.begin() + 1);
34 return currency;
35}
36
37Issue
39 Currency const& cur1,
40 Currency const& cur2,
41 AccountID const& ammAccountID)
42{
43 return Issue(ammLPTCurrency(cur1, cur2), ammAccountID);
44}
45
48 Issue const& issue,
50{
51 if (badCurrency() == issue.currency)
52 return temBAD_CURRENCY;
53 if (isXRP(issue) && issue.account.isNonZero())
54 return temBAD_ISSUER;
55 if (pair && issue != pair->first && issue != pair->second)
56 return temBAD_AMM_TOKENS;
57 return tesSUCCESS;
58}
59
62 Issue const& issue1,
63 Issue const& issue2,
65{
66 if (issue1 == issue2)
67 return temBAD_AMM_TOKENS;
68 if (auto const res = invalidAMMAsset(issue1, pair))
69 return res;
70 if (auto const res = invalidAMMAsset(issue2, pair))
71 return res;
72 return tesSUCCESS;
73}
74
77 STAmount const& amount,
79 bool validZero)
80{
81 if (auto const res = invalidAMMAsset(amount.issue(), pair))
82 return res;
83 if (amount < beast::zero || (!validZero && amount == beast::zero))
84 return temBAD_AMOUNT;
85 return tesSUCCESS;
86}
87
90{
91 // It should be impossible for expiration to be < TOTAL_TIME_SLOT_SECS,
92 // but check just to be safe
93 auto const expiration = auctionSlot[sfExpiration];
94 XRPL_ASSERT(
95 expiration >= TOTAL_TIME_SLOT_SECS,
96 "ripple::ammAuctionTimeSlot : minimum expiration");
97 if (expiration >= TOTAL_TIME_SLOT_SECS)
98 {
99 if (auto const start = expiration - TOTAL_TIME_SLOT_SECS;
100 current >= start)
101 {
102 if (auto const diff = current - start; diff < TOTAL_TIME_SLOT_SECS)
103 return diff / AUCTION_SLOT_INTERVAL_DURATION;
104 }
105 }
106 return std::nullopt;
107}
108
109bool
110ammEnabled(Rules const& rules)
111{
112 return rules.enabled(featureAMM) && rules.enabled(fixUniversalNumber);
113}
114
115} // namespace ripple
A currency issued by an account.
Definition Issue.h:14
AccountID account
Definition Issue.h:17
Currency currency
Definition Issue.h:16
Rules controlling protocol behavior.
Definition Rules.h:19
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition Rules.cpp:111
Issue const & issue() const
Definition STAmount.h:477
iterator begin()
Definition base_uint.h:117
static constexpr std::size_t size()
Definition base_uint.h:507
bool isNonZero() const
Definition base_uint.h:526
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:6
NotTEC invalidAMMAmount(STAmount const &amount, std::optional< std::pair< Issue, Issue > > const &pair=std::nullopt, bool validZero=false)
Validate the amount.
Definition AMMCore.cpp:76
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
std::uint32_t constexpr TOTAL_TIME_SLOT_SECS
Definition AMMCore.h:15
bool isXRP(AccountID const &c)
Definition AccountID.h:71
std::optional< std::uint8_t > ammAuctionTimeSlot(std::uint64_t current, STObject const &auctionSlot)
Get time slot of the auction slot.
Definition AMMCore.cpp:89
NotTEC invalidAMMAsset(Issue const &issue, std::optional< std::pair< Issue, Issue > > const &pair=std::nullopt)
Definition AMMCore.cpp:47
Currency ammLPTCurrency(Currency const &cur1, Currency const &cur2)
Calculate Liquidity Provider Token (LPT) Currency.
Definition AMMCore.cpp:24
bool ammEnabled(Rules const &)
Return true if required AMM amendments are enabled.
Definition AMMCore.cpp:110
Issue ammLPTIssue(Currency const &cur1, Currency const &cur2, AccountID const &ammAccountID)
Calculate LPT Issue from AMM asset pair.
Definition AMMCore.cpp:38
@ current
This was a new validation and was added.
base_uint< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Definition UintTypes.h:37
@ tesSUCCESS
Definition TER.h:226
NotTEC invalidAMMAssetPair(Issue const &issue1, Issue const &issue2, std::optional< std::pair< Issue, Issue > > const &pair=std::nullopt)
Definition AMMCore.cpp:61
std::uint32_t constexpr AUCTION_SLOT_INTERVAL_DURATION
Definition AMMCore.h:21
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition digest.h:205
TERSubset< CanCvtToNotTEC > NotTEC
Definition TER.h:590
@ temBAD_ISSUER
Definition TER.h:74
@ temBAD_AMOUNT
Definition TER.h:70
@ temBAD_CURRENCY
Definition TER.h:71
@ temBAD_AMM_TOKENS
Definition TER.h:110