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 xrpl {
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(MPTID::size() == sizeof(sequence) + sizeof(currencyOrAccount));
48 memcpy(mptID.data(), &sequence, sizeof(sequence));
49 memcpy(mptID.data() + sizeof(sequence), currencyOrAccount.data(), sizeof(currencyOrAccount));
50 MPTIssue issue{mptID};
51 asset_ = issue;
52 }
53 else
54 {
55 Issue issue;
56 issue.currency = currencyOrAccount;
57 issue.account = account;
58 if (!isConsistent(issue))
59 Throw<std::runtime_error>("invalid issue: currency and account native mismatch");
60 asset_ = issue;
61 }
62 }
63}
64
67{
68 return STI_ISSUE;
69}
70
73{
74 return asset_.getText();
75}
76
79{
80 Json::Value jv;
81 asset_.setJson(jv);
82 return jv;
83}
84
85void
87{
88 if (holds<Issue>())
89 {
90 auto const& issue = asset_.get<Issue>();
91 s.addBitString(issue.currency);
92 if (!isXRP(issue.currency))
93 s.addBitString(issue.account);
94 }
95 else
96 {
97 auto const& issue = asset_.get<MPTIssue>();
98 s.addBitString(issue.getIssuer());
100 std::uint32_t sequence;
101 memcpy(&sequence, issue.getMptID().data(), sizeof(sequence));
102 s.add32(sequence);
103 }
104}
105
106bool
108{
109 STIssue const* v = dynamic_cast<STIssue const*>(&t);
110 return v && (*v == *this);
111}
112
113bool
115{
116 return holds<Issue>() && asset_.get<Issue>() == xrpIssue();
117}
118
119STBase*
120STIssue::copy(std::size_t n, void* buf) const
121{
122 return emplace(n, buf, *this);
123}
124
125STBase*
127{
128 return emplace(n, buf, std::move(*this));
129}
130
132issueFromJson(SField const& name, Json::Value const& v)
133{
134 return STIssue{name, assetFromJson(v)};
135}
136
137} // namespace xrpl
Represents a JSON value.
Definition json_value.h:131
constexpr TIss const & get() const
std::string getText() const
Definition Asset.cpp:23
void setJson(Json::Value &jv) const
Definition Asset.cpp:29
A currency issued by an account.
Definition Issue.h:14
Currency currency
Definition Issue.h:16
AccountID account
Definition Issue.h:17
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:86
bool isDefault() const override
Definition STIssue.cpp:114
STIssue()=default
Asset asset_
Definition STIssue.h:15
SerializedTypeID getSType() const override
Definition STIssue.cpp:66
Json::Value getJson(JsonOptions) const override
Definition STIssue.cpp:78
STBase * copy(std::size_t n, void *buf) const override
Definition STIssue.cpp:120
std::string getText() const override
Definition STIssue.cpp:72
STBase * move(std::size_t n, void *buf) override
Definition STIssue.cpp:126
bool isEquivalent(STBase const &t) const override
Definition STIssue.cpp:107
uint160 get160()
Definition Serializer.h:383
std::uint32_t get32()
int addBitString(base_uint< Bits, Tag > const &v)
Definition Serializer.h:106
pointer data()
Definition base_uint.h:102
static constexpr std::size_t size()
Definition base_uint.h:495
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
bool isConsistent(Book const &book)
Definition Book.cpp:10
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition Issue.h:98
bool isXRP(AccountID const &c)
Definition AccountID.h:71
Issue issueFromJson(Json::Value const &v)
Definition Issue.cpp:82
Asset assetFromJson(Json::Value const &jv)
Definition Asset.cpp:55
SerializedTypeID
Definition SField.h:91
AccountID const & noAccount()
A placeholder for empty accounts.
Note, should be treated as flags that can be | and &.
Definition STBase.h:18