rippled
Loading...
Searching...
No Matches
STIssue.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2023 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <xrpl/basics/contract.h>
21#include <xrpl/json/json_value.h>
22#include <xrpl/protocol/AccountID.h>
23#include <xrpl/protocol/Asset.h>
24#include <xrpl/protocol/Issue.h>
25#include <xrpl/protocol/MPTIssue.h>
26#include <xrpl/protocol/SField.h>
27#include <xrpl/protocol/STBase.h>
28#include <xrpl/protocol/STIssue.h>
29#include <xrpl/protocol/Serializer.h>
30#include <xrpl/protocol/UintTypes.h>
31
32#include <cstddef>
33#include <cstdint>
34#include <cstring>
35#include <stdexcept>
36#include <string>
37#include <utility>
38
39namespace ripple {
40
41STIssue::STIssue(SField const& name) : STBase{name}
42{
43}
44
45STIssue::STIssue(SerialIter& sit, SField const& name) : STBase{name}
46{
47 auto const currencyOrAccount = sit.get160();
48
49 if (isXRP(static_cast<Currency>(currencyOrAccount)))
50 {
51 asset_ = xrpIssue();
52 }
53 // Check if MPT
54 else
55 {
56 // MPT is serialized as:
57 // - 160 bits MPT issuer account
58 // - 160 bits black hole account
59 // - 32 bits sequence
60 AccountID account = static_cast<AccountID>(sit.get160());
61 // MPT
62 if (noAccount() == account)
63 {
64 MPTID mptID;
65 std::uint32_t sequence = sit.get32();
66 static_assert(
67 MPTID::size() == sizeof(sequence) + sizeof(currencyOrAccount));
68 memcpy(mptID.data(), &sequence, sizeof(sequence));
69 memcpy(
70 mptID.data() + sizeof(sequence),
71 currencyOrAccount.data(),
72 sizeof(currencyOrAccount));
73 MPTIssue issue{mptID};
74 asset_ = issue;
75 }
76 else
77 {
78 Issue issue;
79 issue.currency = currencyOrAccount;
80 issue.account = account;
81 if (!isConsistent(issue))
82 Throw<std::runtime_error>(
83 "invalid issue: currency and account native mismatch");
84 asset_ = issue;
85 }
86 }
87}
88
91{
92 return STI_ISSUE;
93}
94
97{
98 return asset_.getText();
99}
100
103{
104 Json::Value jv;
105 asset_.setJson(jv);
106 return jv;
107}
108
109void
111{
112 if (holds<Issue>())
113 {
114 auto const& issue = asset_.get<Issue>();
115 s.addBitString(issue.currency);
116 if (!isXRP(issue.currency))
117 s.addBitString(issue.account);
118 }
119 else
120 {
121 auto const& issue = asset_.get<MPTIssue>();
122 s.addBitString(issue.getIssuer());
124 std::uint32_t sequence;
125 memcpy(&sequence, issue.getMptID().data(), sizeof(sequence));
126 s.add32(sequence);
127 }
128}
129
130bool
132{
133 STIssue const* v = dynamic_cast<STIssue const*>(&t);
134 return v && (*v == *this);
135}
136
137bool
139{
140 return holds<Issue>() && asset_.get<Issue>() == xrpIssue();
141}
142
143STBase*
144STIssue::copy(std::size_t n, void* buf) const
145{
146 return emplace(n, buf, *this);
147}
148
149STBase*
151{
152 return emplace(n, buf, std::move(*this));
153}
154
156issueFromJson(SField const& name, Json::Value const& v)
157{
158 return STIssue{name, assetFromJson(v)};
159}
160
161} // namespace ripple
Represents a JSON value.
Definition json_value.h:149
void setJson(Json::Value &jv) const
Definition Asset.cpp:50
constexpr TIss const & get() const
std::string getText() const
Definition Asset.cpp:44
A currency issued by an account.
Definition Issue.h:33
AccountID account
Definition Issue.h:36
Currency currency
Definition Issue.h:35
Identifies fields.
Definition SField.h:146
A type which can be exported to a well known binary format.
Definition STBase.h:135
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition STBase.h:233
void add(Serializer &s) const override
Definition STIssue.cpp:110
STIssue()=default
STBase * copy(std::size_t n, void *buf) const override
Definition STIssue.cpp:144
Json::Value getJson(JsonOptions) const override
Definition STIssue.cpp:102
bool isEquivalent(STBase const &t) const override
Definition STIssue.cpp:131
bool isDefault() const override
Definition STIssue.cpp:138
STBase * move(std::size_t n, void *buf) override
Definition STIssue.cpp:150
SerializedTypeID getSType() const override
Definition STIssue.cpp:90
std::string getText() const override
Definition STIssue.cpp:96
std::uint32_t get32()
int addBitString(base_uint< Bits, Tag > const &v)
Definition Serializer.h:131
static constexpr std::size_t size()
Definition base_uint.h:526
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition Issue.h:115
AccountID const & noAccount()
A placeholder for empty accounts.
bool isConsistent(Book const &book)
Definition Book.cpp:29
bool isXRP(AccountID const &c)
Definition AccountID.h:90
Asset assetFromJson(Json::Value const &jv)
Definition Asset.cpp:77
SerializedTypeID
Definition SField.h:110
Issue issueFromJson(Json::Value const &v)
Definition Issue.cpp:95
Note, should be treated as flags that can be | and &.
Definition STBase.h:37