Compare commits

..

26 Commits

Author SHA1 Message Date
Ed Hennis
0162143985 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-13 18:19:27 -04:00
Ed Hennis
c94ea3f6a3 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-13 15:35:19 -04:00
Ed Hennis
ba1845a251 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-12 14:52:33 -04:00
Ed Hennis
5def664681 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-11 00:55:33 -04:00
Ed Hennis
efb8b1c99f Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-08 17:07:04 -04:00
Ed Hennis
a6a69ad977 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-08 13:05:31 -04:00
Ed Hennis
bd665f6280 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-06 14:02:34 -05:00
Ed Hennis
2245964a47 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-12-22 17:51:21 -05:00
Ed Hennis
d43e7bb852 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-12-18 20:00:08 -05:00
Ed Hennis
017ade8f45 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-12-12 20:39:28 -05:00
Ed Hennis
a48b12fdf7 Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop:
  refactor: Rename `ripple` namespace to `xrpl` (5982)
  refactor: Move JobQueue and related classes into xrpl.core module (6121)
  refactor: Rename `rippled` binary to `xrpld` (5983)
  refactor: rename info() to header() (6138)
  refactor: rename `LedgerInfo` to `LedgerHeader` (6136)
  refactor: clean up `RPCHelpers` (5684)
  chore: Fix docs readme and cmake (6122)
  chore: Clean up .gitignore and .gitattributes (6001)
  chore: Use updated secp256k1 recipe (6118)
2025-12-11 16:13:16 -05:00
Ed Hennis
8f267c3bc9 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-12-05 21:13:25 -05:00
Ed Hennis
bface8d5d6 Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop:
  Implement Lending Protocol (unsupported) (5270)
2025-12-02 19:04:37 -05:00
Ed Hennis
24174f6ea7 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-12-01 14:41:02 -05:00
Ed Hennis
cf3ad16bdf Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-28 15:52:45 -05:00
Ed Hennis
a4046aa135 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-26 00:25:34 -05:00
Ed Hennis
46f6332e60 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-25 14:55:24 -05:00
Ed Hennis
ff3c2bf2f9 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-24 21:49:26 -05:00
Ed Hennis
379e1ed555 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-24 21:30:38 -05:00
Ed Hennis
e9fb99056b Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-21 14:34:49 -05:00
Ed Hennis
e9fa9d7aa6 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-18 22:51:22 -05:00
Ed Hennis
2c3f169dec Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-15 03:08:56 -05:00
Ed Hennis
23565405ee Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-13 12:20:06 -05:00
Ed Hennis
a5d08b0cd5 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2025-11-12 14:17:02 -05:00
Ed Hennis
7bf3f543b3 Experiment: Always delete the root 2025-11-10 19:53:38 -05:00
Ed Hennis
c773288df5 Experiment: Add invariant to enforce directory node population 2025-11-10 19:53:38 -05:00
4 changed files with 66 additions and 4 deletions

View File

@@ -254,6 +254,7 @@ ApplyView::dirRemove(
uint256 const& key,
bool keepRoot)
{
keepRoot = false;
auto node = peek(keylet::page(directory, page));
if (!node)

View File

@@ -427,7 +427,6 @@ class Batch_test : public beast::unit_test::suite
auto const batchFee = batch::calcBatchFee(env, 0, 2);
auto tx1 = batch::inner(pay(alice, bob, XRP(1)), seq + 1);
tx1[jss::Fee] = "1.5";
env.set_parse_failure_expected(true);
try
{
env(batch::outer(alice, seq, batchFee, tfAllOrNothing),
@@ -439,7 +438,6 @@ class Batch_test : public beast::unit_test::suite
{
BEAST_EXPECT(true);
}
env.set_parse_failure_expected(false);
}
// temSEQ_AND_TICKET: Batch: inner txn cannot have both Sequence

View File

@@ -1084,7 +1084,7 @@ ValidNewAccountRoot::finalize(
JLOG(j.fatal()) << "Invariant failed: account root created illegally";
return false;
} // namespace xrpl
}
//------------------------------------------------------------------------------
@@ -3566,4 +3566,42 @@ ValidVault::finalize(
return true;
}
//------------------------------------------------------------------------------
void
NoEmptyDirectory::visitEntry(
bool isDelete,
std::shared_ptr<SLE const> const& before,
std::shared_ptr<SLE const> const& after)
{
if (isDelete)
return;
if (before && before->getType() != ltDIR_NODE)
return;
if (after && after->getType() != ltDIR_NODE)
return;
if (!after->isFieldPresent(sfOwner))
// Not an account dir
return;
bad_ = after->at(sfIndexes).empty();
}
bool
NoEmptyDirectory::finalize(
STTx const& tx,
TER const result,
XRPAmount const,
ReadView const& view,
beast::Journal const& j)
{
if (bad_)
{
JLOG(j.fatal()) << "Invariant failed: empty owner directory.";
return false;
}
return true;
}
} // namespace xrpl

View File

@@ -902,6 +902,30 @@ public:
beast::Journal const&);
};
/**
* @brief Invariants: An account's directory should never be empty
*
*/
class NoEmptyDirectory
{
bool bad_ = false;
public:
void
visitEntry(
bool,
std::shared_ptr<SLE const> const&,
std::shared_ptr<SLE const> const&);
bool
finalize(
STTx const&,
TER const,
XRPAmount const,
ReadView const&,
beast::Journal const&);
};
// additional invariant checks can be declared above and then added to this
// tuple
using InvariantChecks = std::tuple<
@@ -928,7 +952,8 @@ using InvariantChecks = std::tuple<
ValidPseudoAccounts,
ValidLoanBroker,
ValidLoan,
ValidVault>;
ValidVault,
NoEmptyDirectory>;
/**
* @brief get a tuple of all invariant checks