rippled
STXChainBridge.h
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 #ifndef RIPPLE_PROTOCOL_STXCHAINBRIDGE_H_INCLUDED
21 #define RIPPLE_PROTOCOL_STXCHAINBRIDGE_H_INCLUDED
22 
23 #include <ripple/protocol/STAccount.h>
24 #include <ripple/protocol/STBase.h>
25 #include <ripple/protocol/STIssue.h>
26 
27 namespace ripple {
28 
29 class Serializer;
30 class STObject;
31 
32 class STXChainBridge final : public STBase
33 {
38 
39 public:
41 
42  enum class ChainType { locking, issuing };
43 
44  static ChainType
46 
47  static ChainType
48  srcChain(bool wasLockingChainSend);
49 
50  static ChainType
51  dstChain(bool wasLockingChainSend);
52 
54 
55  explicit STXChainBridge(SField const& name);
56 
57  STXChainBridge(STXChainBridge const& rhs) = default;
58 
59  STXChainBridge(STObject const& o);
60 
62  AccountID const& srcChainDoor,
63  Issue const& srcChainIssue,
64  AccountID const& dstChainDoor,
65  Issue const& dstChainIssue);
66 
67  explicit STXChainBridge(Json::Value const& v);
68 
69  explicit STXChainBridge(SField const& name, Json::Value const& v);
70 
71  explicit STXChainBridge(SerialIter& sit, SField const& name);
72 
74  operator=(STXChainBridge const& rhs) = default;
75 
77  getText() const override;
78 
79  STObject
80  toSTObject() const;
81 
82  AccountID const&
83  lockingChainDoor() const;
84 
85  Issue const&
86  lockingChainIssue() const;
87 
88  AccountID const&
89  issuingChainDoor() const;
90 
91  Issue const&
92  issuingChainIssue() const;
93 
94  AccountID const&
95  door(ChainType ct) const;
96 
97  Issue const&
98  issue(ChainType ct) const;
99 
101  getSType() const override;
102 
103  Json::Value getJson(JsonOptions) const override;
104 
105  void
106  add(Serializer& s) const override;
107 
108  bool
109  isEquivalent(const STBase& t) const override;
110 
111  bool
112  isDefault() const override;
113 
114  value_type const&
115  value() const noexcept;
116 
117 private:
118  static std::unique_ptr<STXChainBridge>
119  construct(SerialIter&, SField const& name);
120 
121  STBase*
122  copy(std::size_t n, void* buf) const override;
123  STBase*
124  move(std::size_t n, void* buf) override;
125 
126  friend bool
127  operator==(STXChainBridge const& lhs, STXChainBridge const& rhs);
128 
129  friend bool
130  operator<(STXChainBridge const& lhs, STXChainBridge const& rhs);
131 };
132 
133 inline bool
134 operator==(STXChainBridge const& lhs, STXChainBridge const& rhs)
135 {
136  return std::tie(
137  lhs.lockingChainDoor_,
138  lhs.lockingChainIssue_,
139  lhs.issuingChainDoor_,
140  lhs.issuingChainIssue_) ==
141  std::tie(
142  rhs.lockingChainDoor_,
143  rhs.lockingChainIssue_,
144  rhs.issuingChainDoor_,
145  rhs.issuingChainIssue_);
146 }
147 
148 inline bool
149 operator<(STXChainBridge const& lhs, STXChainBridge const& rhs)
150 {
151  return std::tie(
152  lhs.lockingChainDoor_,
153  lhs.lockingChainIssue_,
154  lhs.issuingChainDoor_,
155  lhs.issuingChainIssue_) <
156  std::tie(
157  rhs.lockingChainDoor_,
158  rhs.lockingChainIssue_,
159  rhs.issuingChainDoor_,
160  rhs.issuingChainIssue_);
161 }
162 
163 inline AccountID const&
165 {
166  return lockingChainDoor_.value();
167 };
168 
169 inline Issue const&
171 {
172  return lockingChainIssue_.value();
173 };
174 
175 inline AccountID const&
177 {
178  return issuingChainDoor_.value();
179 };
180 
181 inline Issue const&
183 {
184  return issuingChainIssue_.value();
185 };
186 
187 inline STXChainBridge::value_type const&
188 STXChainBridge::value() const noexcept
189 {
190  return *this;
191 }
192 
193 inline AccountID const&
195 {
196  if (ct == ChainType::locking)
197  return lockingChainDoor();
198  return issuingChainDoor();
199 }
200 
201 inline Issue const&
203 {
204  if (ct == ChainType::locking)
205  return lockingChainIssue();
206  return issuingChainIssue();
207 }
208 
211 {
212  if (ct == ChainType::locking)
213  return ChainType::issuing;
214  return ChainType::locking;
215 }
216 
218 STXChainBridge::srcChain(bool wasLockingChainSend)
219 {
220  if (wasLockingChainSend)
221  return ChainType::locking;
222  return ChainType::issuing;
223 }
224 
226 STXChainBridge::dstChain(bool wasLockingChainSend)
227 {
228  if (wasLockingChainSend)
229  return ChainType::issuing;
230  return ChainType::locking;
231 }
232 
233 } // namespace ripple
234 
235 #endif
ripple::STXChainBridge::issuingChainIssue_
STIssue issuingChainIssue_
Definition: STXChainBridge.h:37
ripple::STXChainBridge::otherChain
static ChainType otherChain(ChainType ct)
Definition: STXChainBridge.h:210
ripple::Issue
A currency issued by an account.
Definition: Issue.h:35
ripple::STXChainBridge::srcChain
static ChainType srcChain(bool wasLockingChainSend)
Definition: STXChainBridge.h:218
std::string
STL class.
ripple::STXChainBridge::ChainType
ChainType
Definition: STXChainBridge.h:42
ripple::STXChainBridge::issue
Issue const & issue(ChainType ct) const
Definition: STXChainBridge.h:202
ripple::sfLockingChainDoor
const SF_ACCOUNT sfLockingChainDoor
ripple::STXChainBridge::dstChain
static ChainType dstChain(bool wasLockingChainSend)
Definition: STXChainBridge.h:226
ripple::STXChainBridge::getSType
SerializedTypeID getSType() const override
Definition: STXChainBridge.cpp:191
ripple::STXChainBridge::lockingChainIssue
Issue const & lockingChainIssue() const
Definition: STXChainBridge.h:170
ripple::STXChainBridge::ChainType::issuing
@ issuing
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:104
ripple::STXChainBridge::ChainType::locking
@ locking
ripple::STXChainBridge::issuingChainDoor_
STAccount issuingChainDoor_
Definition: STXChainBridge.h:36
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:35
std::tie
T tie(T... args)
ripple::STXChainBridge::construct
static std::unique_ptr< STXChainBridge > construct(SerialIter &, SField const &name)
Definition: STXChainBridge.cpp:211
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:82
ripple::STXChainBridge::operator=
STXChainBridge & operator=(STXChainBridge const &rhs)=default
ripple::STXChainBridge::issuingChainIssue
Issue const & issuingChainIssue() const
Definition: STXChainBridge.h:182
ripple::STXChainBridge::getText
std::string getText() const override
Definition: STXChainBridge.cpp:169
ripple::sfLockingChainIssue
const SF_ISSUE sfLockingChainIssue
ripple::STXChainBridge::value_type
STXChainBridge value_type
Definition: STXChainBridge.h:40
ripple::STXChainBridge::door
AccountID const & door(ChainType ct) const
Definition: STXChainBridge.h:194
ripple::SerialIter
Definition: Serializer.h:311
ripple::STXChainBridge::lockingChainDoor_
STAccount lockingChainDoor_
Definition: STXChainBridge.h:34
ripple::STIssue::value
Issue const & value() const noexcept
Definition: STIssue.h:95
ripple::STIssue
Definition: STIssue.h:31
ripple::STXChainBridge::lockingChainDoor
AccountID const & lockingChainDoor() const
Definition: STXChainBridge.h:164
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::issuingChainDoor
AccountID const & issuingChainDoor() const
Definition: STXChainBridge.h:176
ripple::STXChainBridge
Definition: STXChainBridge.h:32
ripple::STXChainBridge::value
value_type const & value() const noexcept
Definition: STXChainBridge.h:188
ripple::Serializer
Definition: Serializer.h:40
ripple::STAccount
Definition: STAccount.h:29
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::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
std
STL namespace.
ripple::STXChainBridge::isEquivalent
bool isEquivalent(const STBase &t) const override
Definition: STXChainBridge.cpp:197
ripple::STXChainBridge::operator<
friend bool operator<(STXChainBridge const &lhs, STXChainBridge const &rhs)
Definition: STXChainBridge.h:149
ripple::sfIssuingChainDoor
const SF_ACCOUNT sfIssuingChainDoor
ripple::STAccount::value
AccountID const & value() const noexcept
Definition: STAccount.h:90
ripple::sfIssuingChainIssue
const SF_ISSUE sfIssuingChainIssue
ripple::AccountID
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition: AccountID.h:49
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::STXChainBridge::add
void add(Serializer &s) const override
Definition: STXChainBridge.cpp:149
ripple::STXChainBridge::getJson
Json::Value getJson(JsonOptions) const override
Definition: STXChainBridge.cpp:158