Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
DBHelpers.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "util/Assert.hpp"
5
6#include <boost/container/flat_set.hpp>
7#include <xrpl/basics/Blob.h>
8#include <xrpl/basics/Log.h>
9#include <xrpl/basics/StringUtilities.h>
10#include <xrpl/basics/base_uint.h>
11#include <xrpl/protocol/AccountID.h>
12#include <xrpl/protocol/SField.h>
13#include <xrpl/protocol/STAccount.h>
14#include <xrpl/protocol/STLedgerEntry.h>
15#include <xrpl/protocol/Serializer.h>
16#include <xrpl/protocol/TxMeta.h>
17
18#include <cstddef>
19#include <cstdint>
20#include <optional>
21#include <string>
22
27 boost::container::flat_set<ripple::AccountID> accounts;
28 std::uint32_t ledgerSequence{};
29 std::uint32_t transactionIndex{};
30 ripple::uint256 txHash;
31
38 AccountTransactionsData(ripple::TxMeta const& meta, ripple::uint256 const& txHash)
39 : accounts(meta.getAffectedAccounts())
40 , ledgerSequence(meta.getLgrSeq())
41 , transactionIndex(meta.getIndex())
42 , txHash(txHash)
43 {
44 }
45
46 AccountTransactionsData() = default;
47};
48
55 ripple::uint256 tokenID;
56 std::uint32_t ledgerSequence;
57 std::uint32_t transactionIndex;
58 ripple::uint256 txHash;
59
68 ripple::uint256 const& tokenID,
69 ripple::TxMeta const& meta,
70 ripple::uint256 const& txHash
71 )
72 : tokenID(tokenID)
73 , ledgerSequence(meta.getLgrSeq())
74 , transactionIndex(meta.getIndex())
75 , txHash(txHash)
76 {
77 }
78};
79
93struct NFTsData {
94 ripple::uint256 tokenID;
95 std::uint32_t ledgerSequence;
96 std::optional<std::uint32_t> transactionIndex;
97 ripple::AccountID owner;
98 std::optional<ripple::Blob> uri;
99 bool isBurned = false;
100 bool onlyUriChanged = false; // Whether only the URI was changed
101
116 ripple::uint256 const& tokenID,
117 ripple::AccountID const& owner,
118 ripple::Blob const& uri,
119 ripple::TxMeta const& meta
120 )
121 : tokenID(tokenID)
122 , ledgerSequence(meta.getLgrSeq())
123 , transactionIndex(meta.getIndex())
124 , owner(owner)
125 , uri(uri)
126 {
127 }
128
140 ripple::uint256 const& tokenID,
141 ripple::AccountID const& owner,
142 ripple::TxMeta const& meta,
143 bool isBurned
144 )
145 : tokenID(tokenID)
146 , ledgerSequence(meta.getLgrSeq())
147 , transactionIndex(meta.getIndex())
148 , owner(owner)
149 , isBurned(isBurned)
150 {
151 }
152
167 ripple::uint256 const& tokenID,
168 std::uint32_t const ledgerSequence,
169 ripple::AccountID const& owner,
170 ripple::Blob const& uri
171 )
172 : tokenID(tokenID), ledgerSequence(ledgerSequence), owner(owner), uri(uri)
173 {
174 }
175
184 NFTsData(ripple::uint256 const& tokenID, ripple::TxMeta const& meta, ripple::Blob const& uri)
185 : tokenID(tokenID)
186 , ledgerSequence(meta.getLgrSeq())
187 , transactionIndex(meta.getIndex())
188 , uri(uri)
189 , onlyUriChanged(true)
190 {
191 }
192};
193
198 ripple::uint192 mptID;
199 ripple::AccountID holder;
200};
201
208template <typename T>
209inline bool
210isDirNode(T const& object)
211{
212 static constexpr auto kMIN_SIZE_REQUIRED = 3;
213 if (std::size(object) < kMIN_SIZE_REQUIRED)
214 return false;
215
216 static constexpr short kDIR_NODE_SPACE_KEY = 0x0064;
217 short const spaceKey = (object.data()[1] << 8) | object.data()[2];
218 return spaceKey == kDIR_NODE_SPACE_KEY;
219}
220
228template <typename T, typename R>
229inline bool
230isBookDir(T const& key, R const& object)
231{
232 if (!isDirNode(object))
233 return false;
234
235 ripple::STLedgerEntry const sle{ripple::SerialIter{object.data(), object.size()}, key};
236 return !sle[~ripple::sfOwner].has_value();
237}
238
245template <typename T>
246inline ripple::uint256
247getBookBase(T const& key)
248{
249 static constexpr size_t kEY_SIZE = 24;
250
251 ASSERT(key.size() == ripple::uint256::size(), "Invalid key size {}", key.size());
252
253 ripple::uint256 ret;
254 for (size_t i = 0; i < kEY_SIZE; ++i)
255 ret.data()[i] = key.data()[i];
256
257 return ret;
258}
259
266inline std::string
267uint256ToString(ripple::uint256 const& input)
268{
269 return {reinterpret_cast<char const*>(input.data()), ripple::uint256::size()};
270}
271
273static constexpr std::uint32_t kRIPPLE_EPOCH_START = 946684800;
ripple::uint256 getBookBase(T const &key)
Get the book base.
Definition DBHelpers.hpp:247
bool isDirNode(T const &object)
Check whether the supplied object is a dir node.
Definition DBHelpers.hpp:210
std::string uint256ToString(ripple::uint256 const &input)
Stringify a ripple::uint256.
Definition DBHelpers.hpp:267
bool isBookDir(T const &key, R const &object)
Check whether the supplied object is a book dir.
Definition DBHelpers.hpp:230
static constexpr std::uint32_t kRIPPLE_EPOCH_START
The ripple epoch start timestamp. Midnight on 1st January 2000.
Definition DBHelpers.hpp:273
AccountTransactionsData(ripple::TxMeta const &meta, ripple::uint256 const &txHash)
Construct a new AccountTransactionsData object.
Definition DBHelpers.hpp:38
Represents an MPT and holder pair.
Definition DBHelpers.hpp:197
NFTTransactionsData(ripple::uint256 const &tokenID, ripple::TxMeta const &meta, ripple::uint256 const &txHash)
Construct a new NFTTransactionsData object.
Definition DBHelpers.hpp:67
NFTsData(ripple::uint256 const &tokenID, std::uint32_t const ledgerSequence, ripple::AccountID const &owner, ripple::Blob const &uri)
Construct a new NFTsData object.
Definition DBHelpers.hpp:166
NFTsData(ripple::uint256 const &tokenID, ripple::AccountID const &owner, ripple::TxMeta const &meta, bool isBurned)
Construct a new NFTsData object.
Definition DBHelpers.hpp:139
NFTsData(ripple::uint256 const &tokenID, ripple::AccountID const &owner, ripple::Blob const &uri, ripple::TxMeta const &meta)
Construct a new NFTsData object.
Definition DBHelpers.hpp:115
NFTsData(ripple::uint256 const &tokenID, ripple::TxMeta const &meta, ripple::Blob const &uri)
Construct a new NFTsData object with only the URI changed.
Definition DBHelpers.hpp:184