1#include <xrpl/ledger/entries/SLEBase.h>
3#include <xrpl/beast/utility/Journal.h>
4#include <xrpl/ledger/ApplyView.h>
5#include <xrpl/ledger/ApplyViewImpl.h>
6#include <xrpl/ledger/OpenView.h>
7#include <xrpl/ledger/ReadView.h>
8#include <xrpl/ledger/entries/AMMEntry.h>
9#include <xrpl/ledger/entries/AccountRootEntry.h>
10#include <xrpl/ledger/entries/AmendmentsEntry.h>
11#include <xrpl/ledger/entries/BridgeEntry.h>
12#include <xrpl/ledger/entries/CheckEntry.h>
13#include <xrpl/ledger/entries/CredentialEntry.h>
14#include <xrpl/ledger/entries/DIDEntry.h>
15#include <xrpl/ledger/entries/DelegateEntry.h>
16#include <xrpl/ledger/entries/DepositPreauthEntry.h>
17#include <xrpl/ledger/entries/DirectoryNodeEntry.h>
18#include <xrpl/ledger/entries/EscrowEntry.h>
19#include <xrpl/ledger/entries/FeeSettingsEntry.h>
20#include <xrpl/ledger/entries/LedgerHashesEntry.h>
21#include <xrpl/ledger/entries/LoanBrokerEntry.h>
22#include <xrpl/ledger/entries/LoanEntry.h>
23#include <xrpl/ledger/entries/MPTokenEntry.h>
24#include <xrpl/ledger/entries/MPTokenIssuanceEntry.h>
25#include <xrpl/ledger/entries/NFTokenOfferEntry.h>
26#include <xrpl/ledger/entries/NFTokenPageEntry.h>
27#include <xrpl/ledger/entries/NegativeUNLEntry.h>
28#include <xrpl/ledger/entries/OfferEntry.h>
29#include <xrpl/ledger/entries/OracleEntry.h>
30#include <xrpl/ledger/entries/PayChannelEntry.h>
31#include <xrpl/ledger/entries/PermissionedDomainEntry.h>
32#include <xrpl/ledger/entries/RippleStateEntry.h>
33#include <xrpl/ledger/entries/SignerListEntry.h>
34#include <xrpl/ledger/entries/SponsorshipEntry.h>
35#include <xrpl/ledger/entries/TicketEntry.h>
36#include <xrpl/ledger/entries/TransactionProposalEntry.h>
37#include <xrpl/ledger/entries/VaultEntry.h>
38#include <xrpl/ledger/entries/XChainOwnedClaimIDEntry.h>
39#include <xrpl/ledger/entries/XChainOwnedCreateAccountClaimIDEntry.h>
40#include <xrpl/protocol/Indexes.h>
41#include <xrpl/protocol/Keylet.h>
42#include <xrpl/protocol/LedgerFormats.h>
43#include <xrpl/protocol/SField.h>
44#include <xrpl/protocol/STLedgerEntry.h>
45#include <xrpl/protocol/SeqProxy.h>
46#include <xrpl/protocol/XRPAmount.h>
47#include <xrpl/protocol_autogen/transactions/AccountSet.h>
49#include <gtest/gtest.h>
50#include <helpers/Account.h>
51#include <helpers/TxTest.h>
77#pragma push_macro("LEDGER_ENTRY")
88#define LEDGER_ENTRY(tag, value, name, ...) \
90 name##Entry<ReadView>::kEntryType == tag && name##Entry<ApplyView>::kEntryType == tag, \
91 #name "Entry must be bound to " #tag); \
93 std::is_constructible_v<name##Entry<ReadView>, Keylet const&, ReadView const&> && \
94 std::is_constructible_v<name##Entry<ApplyView>, Keylet const&, ApplyView&>, \
95 #name "Entry must be constructible from a Keylet and a view");
97#include <xrpl/protocol/detail/ledger_entries.macro>
100#pragma pop_macro("LEDGER_ENTRY")
112 "cross-entry-type conversion must not compile");
115 "cross-entry-type construction must not compile, even explicitly");
118 "read-only cross-entry-type conversion must not compile");
123 "generic -> typed conversion must not compile");
129 "same-type writable -> read-only conversion must keep working");
132 "typed -> generic widening must keep working");
167 EXPECT_FALSE(absent.
exists());
168 EXPECT_FALSE(
static_cast<bool>(absent));
170 EXPECT_EQ(absent.
type(), ltACCOUNT_ROOT);
173 EXPECT_TRUE(present.
exists());
174 EXPECT_TRUE(
static_cast<bool>(present));
176 EXPECT_EQ(present.
type(), ltACCOUNT_ROOT);
177 EXPECT_EQ(present.
keylet().
type, ltACCOUNT_ROOT);
178 EXPECT_EQ(present->
getType(), ltACCOUNT_ROOT);
179 EXPECT_EQ((*present).getType(), ltACCOUNT_ROOT);
180 EXPECT_EQ(&present.
readView(), &env_.getClosedLedger());
185 auto const sle = env_.getClosedLedger().read(
keylet::account(alice_.id()));
186 ASSERT_NE(sle,
nullptr);
189 EXPECT_TRUE(adopted.
exists());
190 EXPECT_EQ(adopted.
rawSle(), sle);
192 EXPECT_EQ(adopted.
type(), ltACCOUNT_ROOT);
196 EXPECT_EQ(adopted.
keylet().
type, ltACCOUNT_ROOT);
201 EXPECT_FALSE(empty.exists());
202 EXPECT_EQ(empty.type(), ltACCOUNT_ROOT);
205 ReadOnlySLE const generic(sle, env_.getClosedLedger());
206 EXPECT_TRUE(generic.exists());
207 EXPECT_EQ(generic.type(), ltACCOUNT_ROOT);
208 EXPECT_EQ(generic.keylet().type, ltACCOUNT_ROOT);
213 "writable entries must not be constructible from a bare SLE");
222 EXPECT_TRUE(account.exists());
223 EXPECT_EQ(account.mutableRawSle(), account.rawSle());
224 EXPECT_EQ(&account.applyView(), &av);
225 EXPECT_EQ(&account.readView(),
static_cast<ReadView const*
>(&av));
226 EXPECT_EQ(&account.journal().sink(), &j.
sink());
229 EXPECT_EQ(account.operator->(), account.rawSle().get());
230 EXPECT_EQ(&*account, account.rawSle().get());
238 "mutableRawSle() must not be callable on a const writable entry");
241 "applyView() must not be callable on a const writable entry");
246 "mutableRawSle() must not exist on a read-only entry");
257 builder.
setSequence(env_.getAccountRoot(alice_.id()).getSequence());
259 auto const tx = builder.
build(alice_.pk(), alice_.sk()).getSTTx();
260 ASSERT_NE(tx,
nullptr);
267 EXPECT_TRUE(fromCtx.
exists());
283 EXPECT_FALSE(
ticket.exists());
285 EXPECT_EQ(
ticket.type(), ltTICKET);
286 EXPECT_EQ(
ticket.keylet().type, ltTICKET);
289 EXPECT_TRUE(
ticket.exists());
295 EXPECT_FALSE(
ticket.exists());
306 EXPECT_TRUE(account.exists());
307 EXPECT_EQ(fresh.
size(), 0);
309 account->setFieldU32(sfSequence, account->getFieldU32(sfSequence) + 1);
310 EXPECT_EQ(fresh.
size(), 0);
313 EXPECT_EQ(fresh.
size(), 1);
317 EXPECT_EQ(fresh.
size(), 1);
326 EXPECT_TRUE(account.exists());
329 EXPECT_FALSE(account.exists());
338 EXPECT_TRUE(writable.
exists());
341 EXPECT_TRUE(readOnly.
exists());
345 EXPECT_TRUE(generic.exists());
346 EXPECT_EQ(generic.rawSle(), writable.
rawSle());
348 EXPECT_EQ(generic.type(), ltACCOUNT_ROOT);
356 OpenView const& ledger = env_.getOpenLedger();
358 EXPECT_TRUE(overLedger.
exists());
365 EXPECT_TRUE(readOnly.
exists());
368 EXPECT_TRUE(writable.
exists());
378 auto const bumped = writable->
getFieldU32(sfSequence) + 1;
380 EXPECT_EQ(readOnly->
getFieldU32(sfSequence), bumped);
388 EXPECT_FALSE(absent.
exists());
394 EXPECT_FALSE(missing.
exists());
414 EXPECT_FALSE(missing.
exists());
429 EXPECT_TRUE(missing.
exists());
435 EXPECT_FALSE(missing.
exists());
A generic endpoint for log messages.
Sink & sink() const
Returns the Sink associated with this Journal.
static Sink & getNullSink()
Returns a Sink which does nothing.
Editable, discardable view that can build metadata for one tx.
std::size_t size()
Get the number of modified entries.
Writable ledger view that accumulates state and tx changes.
View-parameterized base class for all ledger entries.
LedgerEntryType type() const
ReadView const & readView() const
SLE::const_pointer rawSle() const
LedgerEntryType getType() const
std::shared_ptr< STLedgerEntry const > const_pointer
std::uint32_t getFieldU32(SField const &field) const
void setFieldU32(SField const &field, std::uint32_t)
static constexpr SeqProxy rawTicket(std::uint32_t v)
Factory function to return a ticket-based SeqProxy.
Scaffolding shared by the test cases below: a funded alice, an unfunded bob (for the entries that nee...
A lightweight transaction testing harness.
Immutable cryptographic account descriptor.
Builder for AccountSet transactions.
AccountSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AccountSet wrapper.
Derived & setFee(STAmount const &value)
Set the transaction fee.
Derived & setSequence(std::uint32_t const &value)
Set the sequence number.
Keylet ticket(AccountID const &id, SeqProxy const &ticketSeq)
A ticket belonging to an account.
Keylet account(AccountID const &id) noexcept
AccountID root.
XrpT const XRP
Converts to XRP Issue or STAmount.
constexpr XRPAmount
Convert XRP to drops (integral types).
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
AccountRootEntry< ReadView > AccountRootEntryR
TEST_F(HardenedHashTest, user_types)
TicketEntry< ApplyView > TicketEntryW
AccountRootEntry< ApplyView > AccountRootEntryW
SLEBase< ReadView > ReadOnlySLE
Generic (any-entry-type) SLE entries.
Bundles the mutable ledger view and the transaction being applied.