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