rippled
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 <ripple/protocol/STXChainBridge.h>
21 
22 #include <ripple/protocol/Indexes.h>
23 #include <ripple/protocol/Issue.h>
24 #include <ripple/protocol/PublicKey.h>
25 #include <ripple/protocol/SField.h>
26 #include <ripple/protocol/STAccount.h>
27 #include <ripple/protocol/STObject.h>
28 #include <ripple/protocol/STXChainBridge.h>
29 #include <ripple/protocol/Serializer.h>
30 #include <ripple/protocol/UintTypes.h>
31 #include <ripple/protocol/jss.h>
32 #include <ripple/protocol/tokens.h>
33 
34 #include <boost/format.hpp>
35 
36 namespace ripple {
37 
39 {
40 }
41 
43 {
44 }
45 
47  AccountID const& srcChainDoor,
48  Issue const& srcChainIssue,
49  AccountID const& dstChainDoor,
50  Issue const& dstChainIssue)
52  , lockingChainDoor_{sfLockingChainDoor, srcChainDoor}
53  , lockingChainIssue_{sfLockingChainIssue, srcChainIssue}
54  , issuingChainDoor_{sfIssuingChainDoor, dstChainDoor}
55  , issuingChainIssue_{sfIssuingChainIssue, dstChainIssue}
56 {
57 }
58 
61  , lockingChainDoor_{sfLockingChainDoor, o[sfLockingChainDoor]}
62  , lockingChainIssue_{sfLockingChainIssue, o[sfLockingChainIssue]}
63  , issuingChainDoor_{sfIssuingChainDoor, o[sfIssuingChainDoor]}
64  , issuingChainIssue_{sfIssuingChainIssue, o[sfIssuingChainIssue]}
65 {
66 }
67 
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 =
100  Json::Value const& lockingChainIssue = v[sfLockingChainIssue.getJsonName()];
101  Json::Value const& issuingChainDoorStr =
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};
132  lockingChainIssue_ =
133  STIssue{sfLockingChainIssue, issueFromJson(lockingChainIssue)};
134  issuingChainDoor_ = STAccount{sfIssuingChainDoor, *issuingChainDoor};
135  issuingChainIssue_ =
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 
148 void
150 {
155 }
156 
159 {
160  Json::Value v;
165  return v;
166 }
167 
170 {
171  return str(
172  boost::format("{ %s = %s, %s = %s, %s = %s, %s = %s }") %
177 }
178 
179 STObject
181 {
187  return o;
188 }
189 
192 {
193  return STI_XCHAIN_BRIDGE;
194 }
195 
196 bool
198 {
199  const STXChainBridge* v = dynamic_cast<const STXChainBridge*>(&t);
200  return v && (*v == *this);
201 }
202 
203 bool
205 {
208 }
209 
212 {
213  return std::make_unique<STXChainBridge>(sit, name);
214 }
215 
216 STBase*
218 {
219  return emplace(n, buf, *this);
220 }
221 
222 STBase*
224 {
225  return emplace(n, buf, std::move(*this));
226 }
227 } // namespace ripple
ripple::STIssue::add
void add(Serializer &s) const override
Definition: STIssue.cpp:80
ripple::STXChainBridge::issuingChainIssue_
STIssue issuingChainIssue_
Definition: STXChainBridge.h:38
ripple::Issue
A currency issued by an account.
Definition: Issue.h:35
std::string
STL class.
Json::Value::isString
bool isString() const
Definition: json_value.cpp:1009
ripple::sfLockingChainDoor
const SF_ACCOUNT sfLockingChainDoor
ripple::STXChainBridge::getSType
SerializedTypeID getSType() const override
Definition: STXChainBridge.cpp:191
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:104
ripple::STXChainBridge::issuingChainDoor_
STAccount issuingChainDoor_
Definition: STXChainBridge.h:37
ripple::SField::getJsonName
Json::StaticString const & getJsonName() const
Definition: SField.h:214
ripple::STAccount::isDefault
bool isDefault() const override
Definition: STAccount.cpp:101
ripple::STXChainBridge::toSTObject
STObject toSTObject() const
Definition: STXChainBridge.cpp:180
ripple::STXChainBridge::move
STBase * move(std::size_t n, void *buf) override
Definition: STXChainBridge.cpp:223
ripple::STXChainBridge::lockingChainIssue_
STIssue lockingChainIssue_
Definition: STXChainBridge.h:36
ripple::STXChainBridge::construct
static std::unique_ptr< STXChainBridge > construct(SerialIter &, SField const &name)
Definition: STXChainBridge.cpp:211
ripple::STIssue::getJson
Json::Value getJson(JsonOptions) const override
Definition: STIssue.cpp:74
ripple::base_uint< 160, detail::AccountIDTag >
ripple::STBase::emplace
static STBase * emplace(std::size_t n, void *buf, T &&val)
Definition: STBase.h:220
ripple::STXChainBridge::getText
std::string getText() const override
Definition: STXChainBridge.cpp:169
ripple::sfLockingChainIssue
const SF_ISSUE sfLockingChainIssue
ripple::SerialIter
Definition: Serializer.h:311
ripple::issueFromJson
Issue issueFromJson(Json::Value const &v)
Definition: Issue.cpp:78
ripple::STXChainBridge::lockingChainDoor_
STAccount lockingChainDoor_
Definition: STXChainBridge.h:35
ripple::STAccount::add
void add(Serializer &s) const override
Definition: STAccount.cpp:81
ripple::STXChainBridge::isDefault
bool isDefault() const override
Definition: STXChainBridge.cpp:204
ripple::STXChainBridge::copy
STBase * copy(std::size_t n, void *buf) const override
Definition: STXChainBridge.cpp:217
ripple::STXChainBridge
Definition: STXChainBridge.h:33
ripple::Serializer
Definition: Serializer.h:40
ripple::STXChainBridge::STXChainBridge
STXChainBridge()
Definition: STXChainBridge.cpp:38
ripple::STObject
Definition: STObject.h:53
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::JsonOptions
Note, should be treated as flags that can be | and &.
Definition: STBase.h:35
ripple::JsonOptions::none
@ none
Definition: STBase.h:42
ripple::STAccount::getText
std::string getText() const override
Definition: STAccount.cpp:107
ripple::SField
Identifies fields.
Definition: SField.h:139
ripple::STBase
A type which can be exported to a well known binary format.
Definition: STBase.h:121
ripple::SField::getName
std::string const & getName() const
Definition: SField.h:202
ripple::STXChainBridge::isEquivalent
bool isEquivalent(const STBase &t) const override
Definition: STXChainBridge.cpp:197
std::size_t
ripple::sfIssuingChainDoor
const SF_ACCOUNT sfIssuingChainDoor
ripple::STIssue::getText
std::string getText() const override
Definition: STIssue.cpp:69
ripple::sfIssuingChainIssue
const SF_ISSUE sfIssuingChainIssue
ripple::STIssue::isDefault
bool isDefault() const override
Definition: STIssue.cpp:95
std::unique_ptr
STL class.
ripple::sfXChainBridge
const SF_XCHAIN_BRIDGE sfXChainBridge
ripple::STBase::getJson
virtual Json::Value getJson(JsonOptions) const
Definition: STBase.cpp:99
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::STXChainBridge::add
void add(Serializer &s) const override
Definition: STXChainBridge.cpp:149
Json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469
ripple::STXChainBridge::getJson
Json::Value getJson(JsonOptions) const override
Definition: STXChainBridge.cpp:158