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:143
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
Asset asset_
Definition: STIssue.h:34
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
uint160 get160()
Definition: Serializer.h:409
std::uint32_t get32()
Definition: Serializer.cpp:377
int addBitString(base_uint< Bits, Tag > const &v)
Definition: Serializer.h:131
pointer data()
Definition: base_uint.h:125
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.
Definition: AccountID.cpp:185
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:107
Issue issueFromJson(Json::Value const &v)
Definition: Issue.cpp:95
Note, should be treated as flags that can be | and &.
Definition: STBase.h:37