20#include <xrpl/basics/Log.h>
21#include <xrpl/basics/contract.h>
22#include <xrpl/json/to_string.h>
23#include <xrpl/protocol/STAccount.h>
24#include <xrpl/protocol/TxMeta.h>
35 : mTransactionID(txid), mLedger(ledger), mNodes(sfAffectedNodes, 32)
49 : mTransactionID(txid)
51 , mNodes(obj.getFieldArray(sfAffectedNodes))
60 "ripple::TxMeta::TxMeta(STObject) : type cast succeeded");
84 , mIndex(static_cast<
std::uint32_t>(-1))
86 , mNodes(sfAffectedNodes)
100 if (n.getFieldH256(sfLedgerIndex) == node)
103 n.setFieldU16(sfLedgerEntryType, nodeType);
113 "ripple::TxMeta::setAffectedNode : field type match");
118boost::container::flat_set<AccountID>
121 boost::container::flat_set<AccountID> list;
126 for (
auto const& it :
mNodes)
128 int index = it.getFieldIndex(
129 (it.getFName() == sfCreatedNode) ? sfNewFields : sfFinalFields);
133 auto inner =
dynamic_cast<STObject const*
>(&it.peekAtIndex(index));
136 "ripple::getAffectedAccounts : STObject type cast succeeded");
139 for (
auto const& field : *inner)
141 if (
auto sa =
dynamic_cast<STAccount const*
>(&field))
145 "ripple::getAffectedAccounts : account is set");
146 if (!sa->isDefault())
147 list.insert(sa->value());
150 (field.getFName() == sfLowLimit) ||
151 (field.getFName() == sfHighLimit) ||
152 (field.getFName() == sfTakerPays) ||
153 (field.getFName() == sfTakerGets))
155 auto lim =
dynamic_cast<STAmount const*
>(&field);
158 "ripple::getAffectedAccounts : STAmount type cast "
163 auto issuer = lim->getIssuer();
165 if (issuer.isNonZero())
183 if (n.getFieldH256(sfLedgerIndex) == index)
191 "ripple::TxMeta::getAffectedNode(SLE::ref) : field type match");
193 obj.
setFieldU16(sfLedgerEntryType, node->getFieldU16(sfLedgerEntryType));
203 if (n.getFieldH256(sfLedgerIndex) == node)
206 UNREACHABLE(
"ripple::TxMeta::getAffectedNode(uint256) : node not found");
207 Throw<std::runtime_error>(
"Affected node not found");
214 STObject metaData(sfTransactionMetaData);
215 XRPL_ASSERT(
mResult != 255,
"ripple::TxMeta::getAsObject : result is set");
231 "ripple::TxMeta::addRaw : valid TER input");
void sort(bool(*compare)(const STObject &o1, const STObject &o2))
void reserve(std::size_t n)
void push_back(STObject const &object)
SField const & getFName() const
unsigned char getFieldU8(SField const &field) const
const STBase * peekAtPField(SField const &field) const
void setFieldH256(SField const &field, uint256 const &)
std::uint32_t getFieldU32(SField const &field) const
void setFieldU16(SField const &field, std::uint16_t)
void setFieldU8(SField const &field, unsigned char)
void add(Serializer &s) const override
void setFieldAmount(SField const &field, STAmount const &)
STBase & getField(SField const &field)
STAmount const & getFieldAmount(SField const &field) const
bool isFieldPresent(SField const &field) const
void setFieldU32(SField const &field, std::uint32_t)
std::size_t emplace_back(Args &&... args)
uint256 getFieldH256(SField const &field) const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
constexpr TERUnderlyingType TERtoInt(TELcodes v)
@ transactionID
transaction plus signature to give transaction ID