xrpld
Loading...
Searching...
No Matches
STXChainBridge.cpp
1#include <xrpl/protocol/STXChainBridge.h>
2
3#include <xrpl/basics/contract.h>
4#include <xrpl/json/json_value.h>
5#include <xrpl/protocol/AccountID.h>
6#include <xrpl/protocol/Issue.h>
7#include <xrpl/protocol/SField.h>
8#include <xrpl/protocol/STAccount.h>
9#include <xrpl/protocol/STBase.h>
10#include <xrpl/protocol/STObject.h>
11#include <xrpl/protocol/Serializer.h>
12#include <xrpl/protocol/jss.h>
13
14#include <boost/format/free_funcs.hpp>
15
16#include <cstddef>
17#include <memory>
18#include <stdexcept>
19#include <string>
20#include <utility>
21
22namespace xrpl {
23
25{
26}
27
29{
30}
31
33 AccountID const& srcChainDoor,
34 Issue const& srcChainIssue,
35 AccountID const& dstChainDoor,
36 Issue const& dstChainIssue)
37 : STBase{sfXChainBridge}
38 , lockingChainDoor_{sfLockingChainDoor, srcChainDoor}
39 , lockingChainIssue_{sfLockingChainIssue, srcChainIssue}
40 , issuingChainDoor_{sfIssuingChainDoor, dstChainDoor}
41 , issuingChainIssue_{sfIssuingChainIssue, dstChainIssue}
42{
43}
44
46 : STBase{sfXChainBridge}
47 , lockingChainDoor_{sfLockingChainDoor, o[sfLockingChainDoor]}
48 , lockingChainIssue_{sfLockingChainIssue, o[sfLockingChainIssue]}
49 , issuingChainDoor_{sfIssuingChainDoor, o[sfIssuingChainDoor]}
50 , issuingChainIssue_{sfIssuingChainIssue, o[sfIssuingChainIssue]}
51{
52}
53
55{
56}
57
59{
60 if (!v.isObject())
61 {
63 "STXChainBridge can only be specified with a 'object' Json value");
64 }
65
66 auto checkExtra = [](json::Value const& v) {
67 static auto const kBridgeJson =
69 for (auto it = v.begin(); it != v.end(); ++it)
70 {
71 std::string const name = it.memberName();
72 if (!kBridgeJson.isMember(name))
73 {
74 Throw<std::runtime_error>("STXChainBridge extra field detected: " + name);
75 }
76 }
77 return true;
78 };
79 checkExtra(v);
80
81 json::Value const& lockingChainDoorStr = v[jss::LockingChainDoor];
82 json::Value const& lockingChainIssue = v[jss::LockingChainIssue];
83 json::Value const& issuingChainDoorStr = v[jss::IssuingChainDoor];
84 json::Value const& issuingChainIssue = v[jss::IssuingChainIssue];
85
86 if (!lockingChainDoorStr.isString())
87 {
88 Throw<std::runtime_error>("STXChainBridge LockingChainDoor must be a string Json value");
89 }
90 if (!issuingChainDoorStr.isString())
91 {
92 Throw<std::runtime_error>("STXChainBridge IssuingChainDoor must be a string Json value");
93 }
94
95 auto const lockingChainDoor = parseBase58<AccountID>(lockingChainDoorStr.asString());
96 auto const issuingChainDoor = parseBase58<AccountID>(issuingChainDoorStr.asString());
98 {
99 Throw<std::runtime_error>("STXChainBridge LockingChainDoor must be a valid account");
100 }
101 if (!issuingChainDoor)
102 {
103 Throw<std::runtime_error>("STXChainBridge IssuingChainDoor must be a valid account");
104 }
105
106 lockingChainDoor_ = STAccount{sfLockingChainDoor, *lockingChainDoor};
108 issuingChainDoor_ = STAccount{sfIssuingChainDoor, *issuingChainDoor};
110}
111
113 : STBase{name}
114 , lockingChainDoor_{sit, sfLockingChainDoor}
115 , lockingChainIssue_{sit, sfLockingChainIssue}
116 , issuingChainDoor_{sit, sfIssuingChainDoor}
117 , issuingChainIssue_{sit, sfIssuingChainIssue}
118{
119}
120
121void
123{
124 lockingChainDoor_.add(s);
125 lockingChainIssue_.add(s);
126 issuingChainDoor_.add(s);
127 issuingChainIssue_.add(s);
128}
129
132{
133 json::Value v;
134 v[jss::LockingChainDoor] = lockingChainDoor_.getJson(jo);
135 v[jss::LockingChainIssue] = lockingChainIssue_.getJson(jo);
136 v[jss::IssuingChainDoor] = issuingChainDoor_.getJson(jo);
137 v[jss::IssuingChainIssue] = issuingChainIssue_.getJson(jo);
138 return v;
139}
140
143{
144 return str(
145 boost::format("{ %s = %s, %s = %s, %s = %s, %s = %s }") % sfLockingChainDoor.getName() %
146 lockingChainDoor_.getText() % sfLockingChainIssue.getName() % lockingChainIssue_.getText() %
147 sfIssuingChainDoor.getName() % issuingChainDoor_.getText() % sfIssuingChainIssue.getName() %
148 issuingChainIssue_.getText());
149}
150
153{
154 STObject o{sfXChainBridge};
155 o[sfLockingChainDoor] = lockingChainDoor_;
156 o[sfLockingChainIssue] = lockingChainIssue_;
157 o[sfIssuingChainDoor] = issuingChainDoor_;
158 o[sfIssuingChainIssue] = issuingChainIssue_;
159 return o;
160}
161
164{
165 return STI_XCHAIN_BRIDGE;
166}
167
168bool
170{
171 STXChainBridge const* v = dynamic_cast<STXChainBridge const*>(&t);
172 return (v != nullptr) && (*v == *this);
173}
174
175bool
177{
178 return lockingChainDoor_.isDefault() && lockingChainIssue_.isDefault() &&
179 issuingChainDoor_.isDefault() && issuingChainIssue_.isDefault();
180}
181
184{
185 return std::make_unique<STXChainBridge>(sit, name);
186}
187
188STBase*
190{
191 return emplace(n, buf, *this);
192}
193
194STBase*
196{
197 return emplace(n, buf, std::move(*this));
198}
199} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
const_iterator begin() const
bool isObject() const
bool isString() const
const_iterator end() const
std::string asString() const
Returns the unquoted string value.
A currency issued by an account.
Definition Issue.h:13
Identifies fields.
Definition SField.h:130
A type which can be exported to a well known binary format.
Definition STBase.h:117
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition STBase.h:215
static std::unique_ptr< STXChainBridge > construct(SerialIter &, SField const &name)
std::string getText() const override
AccountID const & issuingChainDoor() const
STBase * move(std::size_t n, void *buf) override
json::Value getJson(JsonOptions) const override
void add(Serializer &s) const override
AccountID const & lockingChainDoor() const
bool isDefault() const override
STBase * copy(std::size_t n, void *buf) const override
bool isEquivalent(STBase const &t) const override
SerializedTypeID getSType() const override
Issue const & issuingChainIssue() const
STObject toSTObject() const
Issue const & lockingChainIssue() const
T make_unique(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
Issue issueFromJson(json::Value const &v)
Definition Issue.cpp:89
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
SerializedTypeID
Definition SField.h:93
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:28
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
Note, should be treated as flags that can be | and &.
Definition STBase.h:17