Compare commits

...

36 Commits

Author SHA1 Message Date
Ed Hennis
0559db648b Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-02-24 17:43:32 -04:00
Ed Hennis
ec9f1a5443 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-02-20 18:50:59 -04:00
Ed Hennis
8916bddbf1 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-02-20 18:27:54 -04:00
Ed Hennis
b008bf6f6f Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-02-19 16:25:12 -05:00
Ed Hennis
297dfb1ac4 Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop:
  refactor: Modularize app/tx (6228)
  refactor: Decouple app/tx from `Application` and `Config` (6227)
  chore: Update clang-format to 21.1.8 (6352)
  refactor: Modularize `HashRouter`, `Conditions`, and `OrderBookDB` (6226)
  chore: Fix minor issues in comments (6346)
  refactor: Modularize the NetworkOPs interface (6225)
  chore: Fix `gcov` lib coverage build failure on macOS (6350)
  refactor: Modularize RelationalDB (6224)
  refactor: Modularize WalletDB and Manifest (6223)
  fix: Update invariant checks for Permissioned Domains (6134)
  refactor: Change main thread name to `xrpld-main` (6336)
  refactor: Fix spelling issues in tests (6199)
  test: Add file and line location to Env (6276)
  chore: Remove CODEOWNERS (6337)
  perf: Remove unnecessary caches (5439)
  chore: Restore unity builds (6328)
  refactor: Update secp256k1 to 0.7.1 (6331)
  fix: Increment sequence when accepting new manifests (6059)
  fix typo in LendingHelpers unit-test (6215)
2026-02-18 20:11:50 -05:00
Ed Hennis
6c42419086 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-02-04 17:12:02 -04:00
Ed Hennis
b6d54bbd05 Fix formatting 2026-01-28 19:32:14 -05:00
Ed Hennis
e0ccdc91d8 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-28 19:09:31 -04:00
Ed Hennis
ecaf7c0c78 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-15 13:16:29 -04:00
Ed Hennis
f0b519d74d Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-01-15 12:06:19 -04:00
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
3 changed files with 58 additions and 2 deletions

View File

@@ -687,6 +687,22 @@ public:
finalize(STTx const&, TER const, XRPAmount const, ReadView const&, 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<
@@ -713,7 +729,8 @@ using InvariantChecks = std::tuple<
ValidPseudoAccounts,
ValidLoanBroker,
ValidLoan,
ValidVault>;
ValidVault,
NoEmptyDirectory>;
/**
* @brief get a tuple of all invariant checks

View File

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

View File

@@ -1051,7 +1051,7 @@ ValidNewAccountRoot::finalize(
JLOG(j.fatal()) << "Invariant failed: account root created illegally";
return false;
} // namespace xrpl
}
//------------------------------------------------------------------------------
@@ -3480,4 +3480,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