xrpld
Loading...
Searching...
No Matches
STIssue.cpp
1#include <xrpl/protocol/STIssue.h>
2
3#include <xrpl/basics/contract.h>
4#include <xrpl/json/json_value.h>
5#include <xrpl/protocol/AccountID.h>
6#include <xrpl/protocol/Asset.h>
7#include <xrpl/protocol/Issue.h>
8#include <xrpl/protocol/MPTIssue.h>
9#include <xrpl/protocol/SField.h>
10#include <xrpl/protocol/STBase.h>
11#include <xrpl/protocol/Serializer.h>
12#include <xrpl/protocol/UintTypes.h>
13
14#include <cstddef>
15#include <cstdint>
16#include <cstring>
17#include <stdexcept>
18#include <string>
19#include <utility>
20
21namespace xrpl {
22
23STIssue::STIssue(SField const& name) : STBase{name}
24{
25}
26
27STIssue::STIssue(SerialIter& sit, SField const& name) : STBase{name}
28{
29 auto const currencyOrAccount = sit.get160();
30
31 if (isXRP(Currency::fromRaw(currencyOrAccount)))
32 {
33 asset_ = xrpIssue();
34 }
35 // Check if MPT
36 else
37 {
38 // MPT is serialized as:
39 // - 160 bits MPT issuer account
40 // - 160 bits black hole account
41 // - 32 bits sequence
42 AccountID const account = AccountID::fromRaw(sit.get160());
43 // MPT
44 if (noAccount() == account)
45 {
46 MPTID mptID;
47 std::uint32_t sequence = sit.get32();
48 static_assert(MPTID::size() == sizeof(sequence) + sizeof(currencyOrAccount));
49 memcpy(mptID.data(), &sequence, sizeof(sequence));
50 memcpy(
51 mptID.data() + sizeof(sequence),
52 currencyOrAccount.data(),
53 sizeof(currencyOrAccount));
54 MPTIssue const issue{mptID};
55 asset_ = issue;
56 }
57 else
58 {
59 Issue issue;
60 issue.currency = currencyOrAccount;
61 issue.account = account;
62 if (!isConsistent(issue))
63 Throw<std::runtime_error>("invalid issue: currency and account native mismatch");
64 asset_ = issue;
65 }
66 }
67}
68
71{
72 return STI_ISSUE;
73}
74
77{
78 return asset_.getText();
79}
80
83{
84 json::Value jv;
85 asset_.setJson(jv);
86 return jv;
87}
88
89void
91{
92 asset_.visit(
93 [&](Issue const& issue) {
94 s.addBitString(issue.currency);
95 if (!isXRP(issue.currency))
96 s.addBitString(issue.account);
97 },
98 [&](MPTIssue const& issue) {
99 s.addBitString(issue.getIssuer());
101 std::uint32_t sequence = 0;
102 memcpy(&sequence, issue.getMptID().data(), sizeof(sequence));
103 s.add32(sequence);
104 });
105}
106
107bool
109{
110 STIssue const* v = dynamic_cast<STIssue const*>(&t);
111 return (v != nullptr) && (*v == *this);
112}
113
114bool
116{
117 return asset_.visit(
118 [](Issue const& issue) { return issue == xrpIssue(); },
119 [](MPTIssue const&) { return false; });
120}
121
122STBase*
123STIssue::copy(std::size_t n, void* buf) const
124{
125 return emplace(n, buf, *this);
126}
127
128STBase*
130{
131 return emplace(n, buf, std::move(*this));
132}
133
135issueFromJson(SField const& name, json::Value const& v)
136{
137 return STIssue{name, assetFromJson(v)};
138}
139
140} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
static BaseUInt fromRaw(Container const &c)
Definition base_uint.h:294
pointer data()
Definition base_uint.h:106
static constexpr std::size_t size()
Definition base_uint.h:530
A currency issued by an account.
Definition Issue.h:13
Currency currency
Definition Issue.h:15
AccountID account
Definition Issue.h:16
AccountID const & getIssuer() const
Definition Issue.h:25
Identifies fields.
Definition SField.h:130
A type which can be exported to a well known binary format.
Definition STBase.h:117
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition STBase.h:215
void add(Serializer &s) const override
Definition STIssue.cpp:90
bool isDefault() const override
Definition STIssue.cpp:115
STIssue()=default
Asset asset_
Definition STIssue.h:14
SerializedTypeID getSType() const override
Definition STIssue.cpp:70
STBase * copy(std::size_t n, void *buf) const override
Definition STIssue.cpp:123
json::Value getJson(JsonOptions) const override
Definition STIssue.cpp:82
std::string getText() const override
Definition STIssue.cpp:76
STBase * move(std::size_t n, void *buf) override
Definition STIssue.cpp:129
bool isEquivalent(STBase const &t) const override
Definition STIssue.cpp:108
uint160 get160()
Definition Serializer.h:382
std::uint32_t get32()
int addBitString(BaseUInt< Bits, Tag > const &v)
Definition Serializer.h:105
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition Issue.h:97
Issue issueFromJson(json::Value const &v)
Definition Issue.cpp:89
bool isXRP(AccountID const &c)
Definition AccountID.h:70
SerializedTypeID
Definition SField.h:93
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
AccountID const & noAccount()
A placeholder for empty accounts.
bool isConsistent(Asset const &asset)
Definition Asset.h:312
Asset assetFromJson(json::Value const &jv)
Definition Asset.cpp:59
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
Note, should be treated as flags that can be | and &.
Definition STBase.h:17