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/protocol/STIssue.h>
21
22#include <xrpl/basics/Log.h>
23#include <xrpl/basics/contract.h>
24#include <xrpl/protocol/SystemParameters.h>
25#include <xrpl/protocol/jss.h>
26
27#include <boost/algorithm/string.hpp>
28#include <boost/multiprecision/cpp_int.hpp>
29#include <boost/regex.hpp>
30
31#include <iostream>
32#include <iterator>
33#include <memory>
34
35namespace ripple {
36
37STIssue::STIssue(SField const& name) : STBase{name}
38{
39}
40
41STIssue::STIssue(SerialIter& sit, SField const& name) : STBase{name}
42{
43 auto const currencyOrAccount = sit.get160();
44
45 if (isXRP(static_cast<Currency>(currencyOrAccount)))
46 {
47 asset_ = xrpIssue();
48 }
49 // Check if MPT
50 else
51 {
52 // MPT is serialized as:
53 // - 160 bits MPT issuer account
54 // - 160 bits black hole account
55 // - 32 bits sequence
56 AccountID account = static_cast<AccountID>(sit.get160());
57 // MPT
58 if (noAccount() == account)
59 {
60 MPTID mptID;
61 std::uint32_t sequence = sit.get32();
62 static_assert(
63 MPTID::size() == sizeof(sequence) + sizeof(currencyOrAccount));
64 memcpy(mptID.data(), &sequence, sizeof(sequence));
65 memcpy(
66 mptID.data() + sizeof(sequence),
67 currencyOrAccount.data(),
68 sizeof(currencyOrAccount));
69 MPTIssue issue{mptID};
70 asset_ = issue;
71 }
72 else
73 {
74 Issue issue;
75 issue.currency = currencyOrAccount;
76 issue.account = account;
77 if (!isConsistent(issue))
78 Throw<std::runtime_error>(
79 "invalid issue: currency and account native mismatch");
80 asset_ = issue;
81 }
82 }
83}
84
87{
88 return STI_ISSUE;
89}
90
93{
94 return asset_.getText();
95}
96
99{
100 Json::Value jv;
101 asset_.setJson(jv);
102 return jv;
103}
104
105void
107{
108 if (holds<Issue>())
109 {
110 auto const& issue = asset_.get<Issue>();
111 s.addBitString(issue.currency);
112 if (!isXRP(issue.currency))
113 s.addBitString(issue.account);
114 }
115 else
116 {
117 auto const& issue = asset_.get<MPTIssue>();
118 s.addBitString(issue.getIssuer());
120 std::uint32_t sequence;
121 memcpy(&sequence, issue.getMptID().data(), sizeof(sequence));
122 s.add32(sequence);
123 }
124}
125
126bool
128{
129 const STIssue* v = dynamic_cast<const STIssue*>(&t);
130 return v && (*v == *this);
131}
132
133bool
135{
136 return holds<Issue>() && asset_.get<Issue>() == xrpIssue();
137}
138
139STBase*
140STIssue::copy(std::size_t n, void* buf) const
141{
142 return emplace(n, buf, *this);
143}
144
145STBase*
147{
148 return emplace(n, buf, std::move(*this));
149}
150
152issueFromJson(SField const& name, Json::Value const& v)
153{
154 return STIssue{name, assetFromJson(v)};
155}
156
157} // namespace ripple
Represents a JSON value.
Definition: json_value.h:147
void setJson(Json::Value &jv) const
Definition: Asset.cpp:41
constexpr TIss const & get() const
std::string getText() const
Definition: Asset.cpp:35
A currency issued by an account.
Definition: Issue.h:36
AccountID account
Definition: Issue.h:39
Currency currency
Definition: Issue.h:38
Identifies fields.
Definition: SField.h:144
A type which can be exported to a well known binary format.
Definition: STBase.h:124
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition: STBase.h:222
Asset asset_
Definition: STIssue.h:34
void add(Serializer &s) const override
Definition: STIssue.cpp:106
STIssue()=default
STBase * copy(std::size_t n, void *buf) const override
Definition: STIssue.cpp:140
Json::Value getJson(JsonOptions) const override
Definition: STIssue.cpp:98
bool isDefault() const override
Definition: STIssue.cpp:134
bool isEquivalent(const STBase &t) const override
Definition: STIssue.cpp:127
STBase * move(std::size_t n, void *buf) override
Definition: STIssue.cpp:146
SerializedTypeID getSType() const override
Definition: STIssue.cpp:86
std::string getText() const override
Definition: STIssue.cpp:92
uint160 get160()
Definition: Serializer.h:409
std::uint32_t get32()
Definition: Serializer.cpp:364
int addBitString(base_uint< Bits, Tag > const &v)
Definition: Serializer.h:131
pointer data()
Definition: base_uint.h:124
static constexpr std::size_t size()
Definition: base_uint.h:525
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition: Issue.h:118
AccountID const & noAccount()
A placeholder for empty accounts.
Definition: AccountID.cpp:177
bool isConsistent(Book const &book)
Definition: Book.cpp:25
bool isXRP(AccountID const &c)
Definition: AccountID.h:91
Asset assetFromJson(Json::Value const &jv)
Definition: Asset.cpp:62
SerializedTypeID
Definition: SField.h:108
Issue issueFromJson(Json::Value const &v)
Definition: Issue.cpp:90
Note, should be treated as flags that can be | and &.
Definition: STBase.h:36