1#include <xrpl/protocol/TxMeta.h>
3#include <xrpl/basics/Blob.h>
4#include <xrpl/basics/Slice.h>
5#include <xrpl/basics/base_uint.h>
6#include <xrpl/basics/contract.h>
7#include <xrpl/beast/utility/instrumentation.h>
8#include <xrpl/protocol/AccountID.h>
9#include <xrpl/protocol/Indexes.h>
10#include <xrpl/protocol/LedgerFormats.h>
11#include <xrpl/protocol/SField.h>
12#include <xrpl/protocol/STAccount.h>
13#include <xrpl/protocol/STAmount.h>
14#include <xrpl/protocol/STLedgerEntry.h>
15#include <xrpl/protocol/STObject.h>
16#include <xrpl/protocol/Serializer.h>
17#include <xrpl/protocol/TER.h>
18#include <xrpl/protocol/UintTypes.h>
20#include <boost/container/flat_set.hpp>
32 ,
index_(obj.getFieldU32(sfTransactionIndex))
33 ,
result_(obj.getFieldU8(sfTransactionResult))
36 XRPL_ASSERT(affectedNodes,
"xrpl::TxMeta::TxMeta(STObject) : type cast succeeded");
37 return affectedNodes !=
nullptr ? *affectedNodes : obj.
getFieldArray(sfAffectedNodes);
40 setAdditionalFields(obj);
72 if (n.getFieldH256(sfLedgerIndex) == node)
75 n.setFieldU16(sfLedgerEntryType, nodeType);
83 XRPL_ASSERT(obj.
getFName() == type,
"xrpl::TxMeta::setAffectedNode : field type match");
88boost::container::flat_set<AccountID>
91 boost::container::flat_set<AccountID> list;
96 for (
auto const& node :
nodes_)
99 node.getFieldIndex((node.getFName() == sfCreatedNode) ? sfNewFields : sfFinalFields);
103 auto const* inner =
dynamic_cast<STObject const*
>(&node.peekAtIndex(index));
104 XRPL_ASSERT(inner,
"xrpl::getAffectedAccounts : STObject type cast succeeded");
105 if (inner !=
nullptr)
107 for (
auto const& field : *inner)
109 if (
auto sa =
dynamic_cast<STAccount const*
>(&field))
111 XRPL_ASSERT(!sa->isDefault(),
"xrpl::getAffectedAccounts : account is set");
112 if (!sa->isDefault())
113 list.insert(sa->value());
116 (field.getFName() == sfLowLimit) || (field.getFName() == sfHighLimit) ||
117 (field.getFName() == sfTakerPays) || (field.getFName() == sfTakerGets))
119 auto lim =
dynamic_cast<STAmount const*
>(&field);
122 "xrpl::getAffectedAccounts : STAmount type cast "
127 auto issuer = lim->getIssuer();
129 if (issuer.isNonZero())
133 else if (field.getFName() == sfMPTokenIssuanceID)
136 if (mptID !=
nullptr)
140 if (issuer.isNonZero())
155 std::flat_set<MPTID> list;
157 for (
auto const& it :
nodes_)
160 it.getFieldIndex((it.getFName() == sfCreatedNode) ? sfNewFields : sfFinalFields);
164 auto inner =
dynamic_cast<STObject const*
>(&it.peekAtIndex(index));
165 XRPL_ASSERT(inner,
"xrpl::getAffectedMPTs : STObject type cast succeeded");
166 if (inner !=
nullptr)
171 if (it.getFieldU16(sfLedgerEntryType) == ltMPTOKEN_ISSUANCE)
174 makeMptID(inner->getFieldU32(sfSequence), inner->getAccountID(sfIssuer)));
177 for (
auto const& field : *inner)
180 field.
getFName() == sfMPTokenIssuanceID && (mptID !=
nullptr))
182 list.insert(mptID->value());
185 auto amount =
dynamic_cast<STAmount const*
>(&field);
201 UInt256 const index = node->key();
204 if (n.getFieldH256(sfLedgerIndex) == index)
211 obj.
getFName() == type,
"xrpl::TxMeta::getAffectedNode(SLE::Ref) : field type match");
213 obj.
setFieldU16(sfLedgerEntryType, node->getFieldU16(sfLedgerEntryType));
223 if (n.getFieldH256(sfLedgerIndex) == node)
227 UNREACHABLE(
"xrpl::TxMeta::getAffectedNode(UInt256) : node not found");
236 STObject metaData(sfTransactionMetaData);
237 XRPL_ASSERT(
result_ != 255,
"xrpl::TxMeta::getAsObject : result_ is set");
257 "xrpl::TxMeta::addRaw : valid TER input");
constexpr MPTID const & getMptID() const
AccountID const & getIssuer() const
constexpr bool holds() const noexcept
SField const & getFName() const
std::shared_ptr< STLedgerEntry > const & Ref
void setFieldU8(SField const &field, unsigned char)
UInt256 getFieldH256(SField const &field) const
unsigned char getFieldU8(SField const &field) const
std::uint32_t getFieldU32(SField const &field) const
void setFieldU32(SField const &field, std::uint32_t)
std::size_t emplaceBack(Args &&... args)
STArray const & getFieldArray(SField const &field) const
void setFieldAmount(SField const &field, STAmount const &)
void add(Serializer &s) const override
void setFieldU16(SField const &field, std::uint16_t)
STBase const * peekAtPField(SField const &field) const
void setFieldH256(SField const &field, UInt256 const &)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Slice makeSlice(std::array< T, N > const &a)
MPTID makeMptID(std::uint32_t const sequence, AccountID const &account)
constexpr TERUnderlyingType TERtoInt(TELcodes v)
TERSubset< CanCvtToTER > TER
std::vector< unsigned char > Blob
Storage for linear binary data.
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)