rippled
Loading...
Searching...
No Matches
STXChainBridge.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2022 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/STXChainBridge.h>
21
22#include <xrpl/protocol/Indexes.h>
23#include <xrpl/protocol/Issue.h>
24#include <xrpl/protocol/PublicKey.h>
25#include <xrpl/protocol/SField.h>
26#include <xrpl/protocol/STAccount.h>
27#include <xrpl/protocol/STObject.h>
28#include <xrpl/protocol/STXChainBridge.h>
29#include <xrpl/protocol/Serializer.h>
30#include <xrpl/protocol/UintTypes.h>
31#include <xrpl/protocol/jss.h>
32#include <xrpl/protocol/tokens.h>
33
34#include <boost/format.hpp>
35
36namespace ripple {
37
39{
40}
41
43{
44}
45
47 AccountID const& srcChainDoor,
48 Issue const& srcChainIssue,
49 AccountID const& dstChainDoor,
50 Issue const& dstChainIssue)
51 : STBase{sfXChainBridge}
52 , lockingChainDoor_{sfLockingChainDoor, srcChainDoor}
53 , lockingChainIssue_{sfLockingChainIssue, srcChainIssue}
54 , issuingChainDoor_{sfIssuingChainDoor, dstChainDoor}
55 , issuingChainIssue_{sfIssuingChainIssue, dstChainIssue}
56{
57}
58
60 : STBase{sfXChainBridge}
61 , lockingChainDoor_{sfLockingChainDoor, o[sfLockingChainDoor]}
62 , lockingChainIssue_{sfLockingChainIssue, o[sfLockingChainIssue]}
63 , issuingChainDoor_{sfIssuingChainDoor, o[sfIssuingChainDoor]}
64 , issuingChainIssue_{sfIssuingChainIssue, o[sfIssuingChainIssue]}
65{
66}
67
69 : STXChainBridge{sfXChainBridge, v}
70{
71}
72
74 : STBase{name}
75{
76 if (!v.isObject())
77 {
78 Throw<std::runtime_error>(
79 "STXChainBridge can only be specified with a 'object' Json value");
80 }
81
82 auto checkExtra = [](Json::Value const& v) {
83 static auto const jbridge =
85 for (auto it = v.begin(); it != v.end(); ++it)
86 {
87 std::string const name = it.memberName();
88 if (!jbridge.isMember(name))
89 {
90 Throw<std::runtime_error>(
91 "STXChainBridge extra field detected: " + name);
92 }
93 }
94 return true;
95 };
96 checkExtra(v);
97
98 Json::Value const& lockingChainDoorStr =
99 v[sfLockingChainDoor.getJsonName()];
100 Json::Value const& lockingChainIssue = v[sfLockingChainIssue.getJsonName()];
101 Json::Value const& issuingChainDoorStr =
102 v[sfIssuingChainDoor.getJsonName()];
103 Json::Value const& issuingChainIssue = v[sfIssuingChainIssue.getJsonName()];
104
105 if (!lockingChainDoorStr.isString())
106 {
107 Throw<std::runtime_error>(
108 "STXChainBridge LockingChainDoor must be a string Json value");
109 }
110 if (!issuingChainDoorStr.isString())
111 {
112 Throw<std::runtime_error>(
113 "STXChainBridge IssuingChainDoor must be a string Json value");
114 }
115
116 auto const lockingChainDoor =
117 parseBase58<AccountID>(lockingChainDoorStr.asString());
118 auto const issuingChainDoor =
119 parseBase58<AccountID>(issuingChainDoorStr.asString());
120 if (!lockingChainDoor)
121 {
122 Throw<std::runtime_error>(
123 "STXChainBridge LockingChainDoor must be a valid account");
124 }
125 if (!issuingChainDoor)
126 {
127 Throw<std::runtime_error>(
128 "STXChainBridge IssuingChainDoor must be a valid account");
129 }
130
131 lockingChainDoor_ = STAccount{sfLockingChainDoor, *lockingChainDoor};
133 STIssue{sfLockingChainIssue, issueFromJson(lockingChainIssue)};
134 issuingChainDoor_ = STAccount{sfIssuingChainDoor, *issuingChainDoor};
136 STIssue{sfIssuingChainIssue, issueFromJson(issuingChainIssue)};
137}
138
140 : STBase{name}
141 , lockingChainDoor_{sit, sfLockingChainDoor}
142 , lockingChainIssue_{sit, sfLockingChainIssue}
143 , issuingChainDoor_{sit, sfIssuingChainDoor}
144 , issuingChainIssue_{sit, sfIssuingChainIssue}
145{
146}
147
148void
150{
155}
156
159{
160 Json::Value v;
161 v[sfLockingChainDoor.getJsonName()] = lockingChainDoor_.getJson(jo);
162 v[sfLockingChainIssue.getJsonName()] = lockingChainIssue_.getJson(jo);
163 v[sfIssuingChainDoor.getJsonName()] = issuingChainDoor_.getJson(jo);
164 v[sfIssuingChainIssue.getJsonName()] = issuingChainIssue_.getJson(jo);
165 return v;
166}
167
170{
171 return str(
172 boost::format("{ %s = %s, %s = %s, %s = %s, %s = %s }") %
173 sfLockingChainDoor.getName() % lockingChainDoor_.getText() %
174 sfLockingChainIssue.getName() % lockingChainIssue_.getText() %
175 sfIssuingChainDoor.getName() % issuingChainDoor_.getText() %
176 sfIssuingChainIssue.getName() % issuingChainIssue_.getText());
177}
178
181{
182 STObject o{sfXChainBridge};
183 o[sfLockingChainDoor] = lockingChainDoor_;
184 o[sfLockingChainIssue] = lockingChainIssue_;
185 o[sfIssuingChainDoor] = issuingChainDoor_;
186 o[sfIssuingChainIssue] = issuingChainIssue_;
187 return o;
188}
189
192{
193 return STI_XCHAIN_BRIDGE;
194}
195
196bool
198{
199 const STXChainBridge* v = dynamic_cast<const STXChainBridge*>(&t);
200 return v && (*v == *this);
201}
202
203bool
205{
208}
209
212{
213 return std::make_unique<STXChainBridge>(sit, name);
214}
215
216STBase*
218{
219 return emplace(n, buf, *this);
220}
221
222STBase*
224{
225 return emplace(n, buf, std::move(*this));
226}
227} // namespace ripple
Represents a JSON value.
Definition: json_value.h:147
const_iterator begin() const
const_iterator end() const
bool isString() const
bool isObject() const
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469
A currency issued by an account.
Definition: Issue.h:36
Identifies fields.
Definition: SField.h:144
void add(Serializer &s) const override
Definition: STAccount.cpp:81
bool isDefault() const override
Definition: STAccount.cpp:104
std::string getText() const override
Definition: STAccount.cpp:110
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
virtual Json::Value getJson(JsonOptions) const
Definition: STBase.cpp:99
void add(Serializer &s) const override
Definition: STIssue.cpp:106
Json::Value getJson(JsonOptions) const override
Definition: STIssue.cpp:98
bool isDefault() const override
Definition: STIssue.cpp:134
std::string getText() const override
Definition: STIssue.cpp:92
STObject toSTObject() const
STBase * copy(std::size_t n, void *buf) const override
AccountID const & issuingChainDoor() const
Issue const & issuingChainIssue() const
std::string getText() const override
Json::Value getJson(JsonOptions) const override
void add(Serializer &s) const override
Issue const & lockingChainIssue() const
SerializedTypeID getSType() const override
bool isDefault() const override
STBase * move(std::size_t n, void *buf) override
bool isEquivalent(const STBase &t) const override
static std::unique_ptr< STXChainBridge > construct(SerialIter &, SField const &name)
AccountID const & lockingChainDoor() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
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