xrpld
Loading...
Searching...
No Matches
Asset.h
1#pragma once
2
3#include <xrpl/basics/Number.h>
4#include <xrpl/basics/base_uint.h>
5#include <xrpl/protocol/Concepts.h>
6#include <xrpl/protocol/Issue.h>
7#include <xrpl/protocol/MPTIssue.h>
8#include <xrpl/protocol/Rules.h>
9
10namespace xrpl {
11
12class STAmount;
13
14template <typename T>
15 requires(
19{
20 using amount_type = T;
21};
22
23/* Used to check for an asset with either badCurrency()
24 * or MPT with 0 account.
25 */
27{
28};
29
30inline BadAsset const&
32{
33 static BadAsset const kA;
34 return kA;
35}
36
37/* Asset is an abstraction of three different issue types: XRP, IOU, MPT.
38 * For historical reasons, two issue types XRP and IOU are wrapped in Issue
39 * type. Many functions and classes there were first written for Issue
40 * have been rewritten for Asset.
41 */
42class Asset
43{
44public:
47 using AmtType =
49
50private:
52
53public:
54 Asset() = default;
55
59 Asset(Issue const& issue) : issue_(issue)
60 {
61 }
62
63 Asset(MPTIssue const& mptIssue) : issue_(mptIssue)
64 {
65 }
66
67 Asset(MPTID const& issuanceID) : issue_(MPTIssue{issuanceID})
68 {
69 }
70
71 [[nodiscard]] AccountID const&
72 getIssuer() const;
73
74 template <ValidIssueType TIss>
75 constexpr TIss const&
76 get() const;
77
78 template <ValidIssueType TIss>
79 TIss&
80 get();
81
82 template <ValidIssueType TIss>
83 [[nodiscard]] constexpr bool
84 holds() const;
85
86 [[nodiscard]] std::string
87 getText() const;
88
89 [[nodiscard]] constexpr value_type const&
90 value() const;
91
92 [[nodiscard]] constexpr token_type
93 token() const;
94
95 void
96 setJson(json::Value& jv) const;
97
99 operator()(Number const&) const;
100
101 [[nodiscard]] constexpr AmtType
102 getAmountType() const;
103
104 // Custom, generic visit implementation
105 template <typename... Visitors>
106 constexpr auto
107 visit(Visitors&&... visitors) const -> decltype(auto)
108 {
109 // Simple delegation to the reusable utility, passing the internal
110 // variant data.
111 return detail::visit(issue_, std::forward<Visitors>(visitors)...);
112 }
113
114 [[nodiscard]] constexpr bool
115 native() const
116 {
117 return visit(
118 [&](Issue const& issue) { return issue.native(); },
119 [&](MPTIssue const&) { return false; });
120 }
121
122 [[nodiscard]] bool
123 integral() const
124 {
125 return visit(
126 [&](Issue const& issue) { return issue.native(); },
127 [&](MPTIssue const&) { return true; });
128 }
129
130 friend constexpr bool
131 operator==(Asset const& lhs, Asset const& rhs);
132
133 friend constexpr std::weak_ordering
134 operator<=>(Asset const& lhs, Asset const& rhs);
135
136 friend constexpr bool
137 operator==(Currency const& lhs, Asset const& rhs);
138
139 // rhs is either badCurrency() or MPT issuer is 0
140 friend constexpr bool
141 operator==(BadAsset const& lhs, Asset const& rhs);
142
146 friend constexpr bool
147 equalTokens(Asset const& lhs, Asset const& rhs);
148};
149
150template <ValidIssueType TIss>
152
153template <ValidIssueType TIss>
155
156inline json::Value
157toJson(Asset const& asset)
158{
159 json::Value jv;
160 asset.setJson(jv);
161 return jv;
162}
163
164template <ValidIssueType TIss>
165constexpr bool
167{
169}
170
171template <ValidIssueType TIss>
172[[nodiscard]] constexpr TIss const&
174{
176 Throw<std::logic_error>("Asset is not a requested issue");
177 return std::get<TIss>(issue_);
178}
179
180template <ValidIssueType TIss>
181TIss&
183{
185 Throw<std::logic_error>("Asset is not a requested issue");
186 return std::get<TIss>(issue_);
187}
188
189constexpr Asset::value_type const&
191{
192 return issue_;
193}
194
195constexpr Asset::token_type
197{
198 return visit(
199 [&](Issue const& issue) -> Asset::token_type { return issue.currency; },
200 [&](MPTIssue const& issue) -> Asset::token_type { return issue.getMptID(); });
201}
202
203constexpr Asset::AmtType
205{
206 return visit(
207 [&](Issue const& issue) -> Asset::AmtType {
208 constexpr AmountType<XRPAmount> kXRP;
209 constexpr AmountType<IOUAmount> kIOU;
210 return native() ? AmtType(kXRP) : AmtType(kIOU);
211 },
212 [&](MPTIssue const& issue) -> Asset::AmtType {
213 constexpr AmountType<MPTAmount> kMPT;
214 return AmtType(kMPT);
215 });
216}
217
218constexpr bool
219operator==(Asset const& lhs, Asset const& rhs)
220{
221 return std::visit(
222 [&]<typename TLhs, typename TRhs>(TLhs const& issLhs, TRhs const& issRhs) {
223 if constexpr (std::is_same_v<TLhs, TRhs>)
224 {
225 return issLhs == issRhs;
226 }
227 else
228 {
229 return false;
230 }
231 },
232 lhs.issue_,
233 rhs.issue_);
234}
235
237operator<=>(Asset const& lhs, Asset const& rhs)
238{
239 return std::visit(
240 []<ValidIssueType TLhs, ValidIssueType TRhs>(TLhs const& lhs, TRhs const& rhs) {
241 if constexpr (std::is_same_v<TLhs, TRhs>)
242 {
243 return std::weak_ordering(lhs <=> rhs);
244 }
245 else if constexpr (kIsIssueV<TLhs> && kIsMptissueV<TRhs>)
246 {
247 return std::weak_ordering::greater;
248 }
249 else
250 {
251 return std::weak_ordering::less;
252 }
253 },
254 lhs.issue_,
255 rhs.issue_);
256}
257
258constexpr bool
259operator==(Currency const& lhs, Asset const& rhs)
260{
261 return rhs.visit(
262 [&](Issue const& issue) { return issue.currency == lhs; },
263 [](MPTIssue const& issue) { return false; });
264}
265
266constexpr bool
267operator==(BadAsset const&, Asset const& rhs)
268{
269 return rhs.visit(
270 [](Issue const& issue) -> bool { return badCurrency() == issue.currency; },
271 [](MPTIssue const& issue) -> bool { return issue.getIssuer() == xrpAccount(); });
272}
273
274constexpr bool
275equalTokens(Asset const& lhs, Asset const& rhs)
276{
277 return std::visit(
278 [&]<typename TLhs, typename TRhs>(TLhs const& issLhs, TRhs const& issRhs) {
280 {
281 return issLhs.currency == issRhs.currency;
282 }
284 {
285 return issLhs.getMptID() == issRhs.getMptID();
286 }
287 else
288 {
289 return false;
290 }
291 },
292 lhs.issue_,
293 rhs.issue_);
294}
295
296inline bool
297isXRP(Asset const& asset)
298{
299 return asset.native();
300}
301
303to_string(Asset const& asset);
304
305bool
306validJSONAsset(json::Value const& jv);
307
308Asset
309assetFromJson(json::Value const& jv);
310
311inline bool
312isConsistent(Asset const& asset)
313{
314 return asset.visit(
315 [](Issue const& issue) { return isConsistent(issue); },
316 [](MPTIssue const&) { return true; });
317}
318
319inline bool
320validAsset(Asset const& asset)
321{
322 return asset.visit(
323 [](Issue const& issue) { return isConsistent(issue) && issue.currency != badCurrency(); },
324 [](MPTIssue const& issue) { return issue.getIssuer() != xrpAccount(); });
325}
326
327template <class Hasher>
328void
329hash_append(Hasher& h, Asset const& r)
330{
331 using beast::hash_append;
332 r.visit(
333 [&](Issue const& issue) { hash_append(h, issue); },
334 [&](MPTIssue const& issue) { hash_append(h, issue); });
335}
336
338operator<<(std::ostream& os, Asset const& x);
339
340} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
void setJson(json::Value &jv) const
Definition Asset.cpp:33
constexpr auto visit(Visitors &&... visitors) const -> decltype(auto)
Definition Asset.h:107
std::variant< Currency, MPTID > token_type
Definition Asset.h:46
constexpr token_type token() const
Definition Asset.h:196
std::variant< AmountType< XRPAmount >, AmountType< IOUAmount >, AmountType< MPTAmount > > AmtType
Definition Asset.h:47
constexpr TIss const & get() const
constexpr bool native() const
Definition Asset.h:115
STAmount operator()(Number const &) const
Definition Asset.cpp:39
std::string getText() const
Definition Asset.cpp:27
constexpr AmtType getAmountType() const
Definition Asset.h:204
Asset(Issue const &issue)
Conversions to Asset are implicit and conversions to specific issue type are explicit.
Definition Asset.h:59
value_type issue_
Definition Asset.h:51
AccountID const & getIssuer() const
Definition Asset.cpp:21
friend constexpr std::weak_ordering operator<=>(Asset const &lhs, Asset const &rhs)
Definition Asset.h:237
bool integral() const
Definition Asset.h:123
friend constexpr bool equalTokens(Asset const &lhs, Asset const &rhs)
Return true if both assets refer to the same currency (regardless of issuer) or MPT issuance.
Definition Asset.h:275
Asset(MPTID const &issuanceID)
Definition Asset.h:67
std::variant< Issue, MPTIssue > value_type
Definition Asset.h:45
constexpr bool holds() const
Definition Asset.h:166
Asset()=default
Asset(MPTIssue const &mptIssue)
Definition Asset.h:63
friend constexpr bool operator==(Asset const &lhs, Asset const &rhs)
Definition Asset.h:219
constexpr value_type const & value() const
Definition Asset.h:190
A currency issued by an account.
Definition Issue.h:13
Currency currency
Definition Issue.h:15
bool native() const
Definition Issue.cpp:54
AccountID const & getIssuer() const
Definition Issue.h:25
Number is a floating point type that can represent a wide range of values.
Definition Number.h:306
T forward(T... args)
T holds_alternative(T... args)
T is_same_v
std::enable_if_t< IsContiguouslyHashable< T, Hasher >::value > hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
constexpr auto visit(Variant &&v, Visitors &&... visitors) -> decltype(auto)
Definition Concepts.h:74
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
constexpr bool operator==(BaseUInt< Bits, Tag > const &lhs, BaseUInt< Bits, Tag > const &rhs)
Definition base_uint.h:588
bool isXRP(AccountID const &c)
Definition AccountID.h:70
bool validJSONAsset(json::Value const &jv)
Definition Asset.cpp:51
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Definition UintTypes.h:36
std::ostream & operator<<(std::ostream &out, BaseUInt< Bits, Tag > const &u)
Definition base_uint.h:648
bool validAsset(Asset const &asset)
Definition Asset.h:320
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:633
json::Value toJson(Asset const &asset)
Definition Asset.h:157
constexpr std::strong_ordering operator<=>(BaseUInt< Bits, Tag > const &lhs, BaseUInt< Bits, Tag > const &rhs)
Definition base_uint.h:567
BaseUInt< 192 > MPTID
MPTID is a 192-bit value representing MPT Issuance ID, which is a concatenation of a 32-bit sequence ...
Definition UintTypes.h:44
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:28
void hash_append(Hasher &h, Slice const &v)
Definition Slice.h:175
constexpr bool kIsIssueV
Definition Asset.h:151
bool isConsistent(Asset const &asset)
Definition Asset.h:312
constexpr bool kIsMptissueV
Definition Asset.h:154
AccountID const & xrpAccount()
Compute AccountID from public key.
BadAsset const & badAsset()
Definition Asset.h:31
Asset assetFromJson(json::Value const &jv)
Definition Asset.cpp:59
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
constexpr bool equalTokens(Asset const &lhs, Asset const &rhs)
Definition Asset.h:275
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
T visit(T... args)