xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
libxrpl
protocol
libxrpl/protocol/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 <
cstddef
>
15
#include <format>
16
#include <
memory
>
17
#include <
stdexcept
>
18
#include <
string
>
19
#include <
utility
>
20
21
namespace
xrpl
{
22
23
STXChainBridge::STXChainBridge
() :
STBase
{sfXChainBridge}
24
{
25
}
26
27
STXChainBridge::STXChainBridge
(
SField
const
& name) :
STBase
{name}
28
{
29
}
30
31
STXChainBridge::STXChainBridge
(
32
AccountID
const
& srcChainDoor,
33
Issue
const
& srcChainIssue,
34
AccountID
const
& dstChainDoor,
35
Issue
const
& dstChainIssue)
36
:
STBase
{sfXChainBridge}
37
,
lockingChainDoor_
{sfLockingChainDoor, srcChainDoor}
38
,
lockingChainIssue_
{sfLockingChainIssue, srcChainIssue}
39
,
issuingChainDoor_
{sfIssuingChainDoor, dstChainDoor}
40
,
issuingChainIssue_
{sfIssuingChainIssue, dstChainIssue}
41
{
42
}
43
44
STXChainBridge::STXChainBridge
(
STObject
const
& o)
45
:
STBase
{sfXChainBridge}
46
,
lockingChainDoor_
{sfLockingChainDoor, o[sfLockingChainDoor]}
47
,
lockingChainIssue_
{sfLockingChainIssue, o[sfLockingChainIssue]}
48
,
issuingChainDoor_
{sfIssuingChainDoor, o[sfIssuingChainDoor]}
49
,
issuingChainIssue_
{sfIssuingChainIssue, o[sfIssuingChainIssue]}
50
{
51
}
52
53
STXChainBridge::STXChainBridge
(
json::Value
const
& v) :
STXChainBridge
{sfXChainBridge, v}
54
{
55
}
56
57
STXChainBridge::STXChainBridge
(
SField
const
& name,
json::Value
const
& v) :
STBase
{name}
58
{
59
if
(!v.
isObject
())
60
{
61
Throw<std::runtime_error>
(
62
"STXChainBridge can only be specified with a 'object' Json value"
);
63
}
64
65
auto
checkExtra = [](
json::Value
const
& v) {
66
static
auto
const
kBridgeJson =
67
xrpl::STXChainBridge
().
getJson
(
xrpl::JsonOptions::Values::None
);
68
for
(
auto
it = v.
begin
(); it != v.
end
(); ++it)
69
{
70
std::string
const
name = it.memberName();
71
if
(!kBridgeJson.isMember(name))
72
{
73
Throw<std::runtime_error>
(
74
std::format
(
"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
());
97
if
(!
lockingChainDoor
)
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
};
107
lockingChainIssue_
=
STIssue
{sfLockingChainIssue,
issueFromJson
(
lockingChainIssue
)};
108
issuingChainDoor_
=
STAccount
{sfIssuingChainDoor, *
issuingChainDoor
};
109
issuingChainIssue_
=
STIssue
{sfIssuingChainIssue,
issueFromJson
(
issuingChainIssue
)};
110
}
111
112
STXChainBridge::STXChainBridge
(
SerialIter
& sit,
SField
const
& name)
113
:
STBase
{name}
114
,
lockingChainDoor_
{sit, sfLockingChainDoor}
115
,
lockingChainIssue_
{sit, sfLockingChainIssue}
116
,
issuingChainDoor_
{sit, sfIssuingChainDoor}
117
,
issuingChainIssue_
{sit, sfIssuingChainIssue}
118
{
119
}
120
121
void
122
STXChainBridge::add
(
Serializer
& s)
const
123
{
124
lockingChainDoor_
.add(s);
125
lockingChainIssue_
.add(s);
126
issuingChainDoor_
.add(s);
127
issuingChainIssue_
.add(s);
128
}
129
130
json::Value
131
STXChainBridge::getJson
(
JsonOptions
jo)
const
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
141
std::string
142
STXChainBridge::getText
()
const
143
{
144
return
std::format
(
145
"{{ {} = {}, {} = {}, {} = {}, {} = {} }}"
,
146
sfLockingChainDoor.getName(),
147
lockingChainDoor_
.getText(),
148
sfLockingChainIssue.getName(),
149
lockingChainIssue_
.getText(),
150
sfIssuingChainDoor.getName(),
151
issuingChainDoor_
.getText(),
152
sfIssuingChainIssue.getName(),
153
issuingChainIssue_
.getText());
154
}
155
156
STObject
157
STXChainBridge::toSTObject
()
const
158
{
159
STObject
o{sfXChainBridge};
160
o[sfLockingChainDoor] =
lockingChainDoor_
;
161
o[sfLockingChainIssue] =
lockingChainIssue_
;
162
o[sfIssuingChainDoor] =
issuingChainDoor_
;
163
o[sfIssuingChainIssue] =
issuingChainIssue_
;
164
return
o;
165
}
166
167
SerializedTypeID
168
STXChainBridge::getSType
()
const
169
{
170
return
STI_XCHAIN_BRIDGE;
171
}
172
173
bool
174
STXChainBridge::isEquivalent
(
STBase
const
& t)
const
175
{
176
auto
const
* v =
dynamic_cast<
STXChainBridge
const*
>
(&t);
177
return
(v !=
nullptr
) && (*v == *
this
);
178
}
179
180
bool
181
STXChainBridge::isDefault
()
const
182
{
183
return
lockingChainDoor_
.isDefault() &&
lockingChainIssue_
.isDefault() &&
184
issuingChainDoor_
.isDefault() &&
issuingChainIssue_
.isDefault();
185
}
186
187
std::unique_ptr<STXChainBridge>
188
STXChainBridge::construct
(
SerialIter
& sit,
SField
const
& name)
189
{
190
return
std::make_unique<STXChainBridge>
(sit, name);
191
}
192
193
STBase
*
194
STXChainBridge::copy
(
std::size_t
n,
void
* buf)
const
195
{
196
return
emplace
(n, buf, *
this
);
197
}
198
199
STBase
*
200
STXChainBridge::move
(
std::size_t
n,
void
* buf)
201
{
202
return
emplace
(n, buf, std::move(*
this
));
203
}
204
}
// namespace xrpl
std::string
json::Value
Represents a JSON value.
Definition
json_value.h:117
json::Value::begin
const_iterator begin() const
Definition
json_value.cpp:1171
json::Value::isObject
bool isObject() const
Definition
json_value.cpp:1152
json::Value::isString
bool isString() const
Definition
json_value.cpp:1134
json::Value::end
const_iterator end() const
Definition
json_value.cpp:1189
json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition
json_value.cpp:494
xrpl::Issue
A currency issued by an account.
Definition
Issue.h:18
xrpl::SField
Identifies fields.
Definition
SField.h:132
xrpl::STAccount
Definition
STAccount.h:16
xrpl::STBase
A type which can be exported to a well known binary format.
Definition
STBase.h:129
xrpl::STBase::emplace
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition
STBase.h:226
xrpl::STBase::STBase
STBase()
Definition
STBase.cpp:15
xrpl::STIssue
Definition
STIssue.h:21
xrpl::STObject
Definition
STObject.h:49
xrpl::STXChainBridge
Definition
STXChainBridge.h:24
xrpl::STXChainBridge::construct
static std::unique_ptr< STXChainBridge > construct(SerialIter &, SField const &name)
Definition
libxrpl/protocol/STXChainBridge.cpp:188
xrpl::STXChainBridge::issuingChainIssue_
STIssue issuingChainIssue_
Definition
STXChainBridge.h:28
xrpl::STXChainBridge::getText
std::string getText() const override
Definition
libxrpl/protocol/STXChainBridge.cpp:142
xrpl::STXChainBridge::issuingChainDoor_
STAccount issuingChainDoor_
Definition
STXChainBridge.h:27
xrpl::STXChainBridge::STXChainBridge
STXChainBridge()
Definition
libxrpl/protocol/STXChainBridge.cpp:23
xrpl::STXChainBridge::issuingChainDoor
AccountID const & issuingChainDoor() const
Definition
STXChainBridge.h:167
xrpl::STXChainBridge::move
STBase * move(std::size_t n, void *buf) override
Definition
libxrpl/protocol/STXChainBridge.cpp:200
xrpl::STXChainBridge::lockingChainDoor_
STAccount lockingChainDoor_
Definition
STXChainBridge.h:25
xrpl::STXChainBridge::getJson
json::Value getJson(JsonOptions) const override
Definition
libxrpl/protocol/STXChainBridge.cpp:131
xrpl::STXChainBridge::add
void add(Serializer &s) const override
Definition
libxrpl/protocol/STXChainBridge.cpp:122
xrpl::STXChainBridge::lockingChainDoor
AccountID const & lockingChainDoor() const
Definition
STXChainBridge.h:155
xrpl::STXChainBridge::lockingChainIssue_
STIssue lockingChainIssue_
Definition
STXChainBridge.h:26
xrpl::STXChainBridge::isDefault
bool isDefault() const override
Definition
libxrpl/protocol/STXChainBridge.cpp:181
xrpl::STXChainBridge::copy
STBase * copy(std::size_t n, void *buf) const override
Definition
libxrpl/protocol/STXChainBridge.cpp:194
xrpl::STXChainBridge::isEquivalent
bool isEquivalent(STBase const &t) const override
Definition
libxrpl/protocol/STXChainBridge.cpp:174
xrpl::STXChainBridge::getSType
SerializedTypeID getSType() const override
Definition
libxrpl/protocol/STXChainBridge.cpp:168
xrpl::STXChainBridge::issuingChainIssue
Issue const & issuingChainIssue() const
Definition
STXChainBridge.h:173
xrpl::STXChainBridge::toSTObject
STObject toSTObject() const
Definition
libxrpl/protocol/STXChainBridge.cpp:157
xrpl::STXChainBridge::lockingChainIssue
Issue const & lockingChainIssue() const
Definition
STXChainBridge.h:161
xrpl::SerialIter
Definition
Serializer.h:478
xrpl::Serializer
Definition
Serializer.h:23
cstddef
std::format
T format(T... args)
std::make_unique
T make_unique(T... args)
memory
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::issueFromJson
Issue issueFromJson(json::Value const &v)
Definition
Issue.cpp:89
xrpl::parseBase58
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
Definition
AccountID.cpp:105
xrpl::SerializedTypeID
SerializedTypeID
Definition
SField.h:94
xrpl::AccountID
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition
AccountID.h:34
xrpl::Throw
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition
contract.h:52
std::size_t
stdexcept
string
xrpl::JsonOptions
Note, should be treated as flags that can be | and &.
Definition
STBase.h:22
xrpl::JsonOptions::Values::None
@ None
Definition
STBase.h:27
std::unique_ptr
utility
Generated by
1.17.0