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