Compare commits

...

33 Commits

Author SHA1 Message Date
Ed Hennis
8442d018d4 Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop: (21 commits)
  fix: Re-store nodes missing from both backends during online_delete rotation (7763)
  fix: Add amendment sponsor for AccountRootsDeletedClean (7801)
  fix: Update base_uint and test changes released in 3.1.3 (7570)
  fix: Handle rounding just above kMaxRep more accurately (7389)
  fix: Document and assert "after" is never null in invariants (7354)
  ci: Run full matrix only on `Ready to merge` or `Full CI build` labeled PRs (7689)
  fix: Strengthen Clawback invariant checks for MPT balances (7285)
  test: Add unit tests for IP address related functions (7744)
  ci: Add Rust to Nix docker image (7571)
  docs: Add more information about pre-commit hooks and how to set them up (7802)
  test: Add JSON array size tests (7592)
  chore: Enable most readability checks (7772)
  ci: Do not run conflict checker when label is applied (7774)
  chore: Run clang_tidy_check with `pass_filenames: false` from pre-commit (7800)
  feat: Add delegate filter param for account_tx RPC (6126)
  refactor: Move `jss.h` `include` out of `Indexes.h` (7799)
  test: Add tests for check doxygen style (7795)
  style: Add pre-commit hook to check doxygen style (7794)
  style: Unify style for all Doxygen comments (7776)
  fix: Improve Number addition/subtraction rounding (7369)
  ...
2026-07-14 21:20:51 -04:00
Ed Hennis
275f458e1e Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-07-09 19:49:56 -04:00
Ed Hennis
cf5f75d41a Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop: (137 commits)
  refactor: Retire InnerObjTemplate fix (7368)
  fix: Disable AMM creation with Vault shares (7666)
  test: Add tests for TMProofPathResponse and TMReplayDeltaResponse invalid hash/key sizes (7593)
  ci: [DEPENDABOT] bump actions/setup-python from 6.2.0 to 6.3.0 (7657)
  build: Don't reuse binaries between different C++ versions (7681)
  chore: Update pre-commit hooks && actions (7686)
  feat: Add an invariant to ensure object deletion also deletes its pseudo-account (7445)
  feat: Add Batch (XLS-56) V1_1 (6446)
  feat: Introduce lending 1.1 amendment and add `MemoData` field to `VaultDelete` transaction (6324)
  chore: Use std::ranges where possible (7634)
  ci: Use macOS 26 Tahoe with apple-clang 21 (7601)
  build: Mark sec256k1 and mpt-crypto as transitive headers (7658)
  chore: Add a script to nicely format clang-tidy output (7650)
  chore: Enable most bugprone checks (7643)
  feat: Confidential Transfer for MPT (5860)
  fix: Use trustline balance direction to validate IOU PaymentMint/PaymentBurn (7584)
  fix: Unify freeze checks for pseudo-account deposit/withdraw (7382)
  fix: Block delegate tx from being queued (7640)
  chore: Enable groups of clang-tidy checks by default (7637)
  ci: Better determine when we need to run full clang-tidy (7635)
  ...
2026-07-01 16:41:16 -04:00
Ed Hennis
6270c9c850 Merge remote-tracking branch 'XRPLF/develop' into ximinez/emptydirectoryinvariant
* XRPLF/develop: (30 commits)
  chore: Pin Python packages for codegen using uv (7329)
  style: Use shfmt instead of bashate (7326)
  fix: Fix edge-case where vault-depositor may get stuck (7139)
  fix: Fix `VaultInvariant` and `VaultDeposit` precision bugs at IOU scale boundaries (7272)
  ci: Add clang to nix images (7308)
  fix: Include management-fee delta in doOverpayment assertion (7039)
  fix: Fix clang-tidy pre-commit hook to locate compile_commands.json from repo root (7325)
  fix: Use consistent scale for `debtTotal` (7093)
  fix: Skip deleted book directories and non-root modifications in `ValidBookDirectory` invariant (7312)
  fix: Address review feedback on FD/handle guarding (5823 follow-up) (7310)
  fix: Fix non-canonical MPT amount (7117)
  release: Bump version to 3.2.0-b7 (7316)
  fix: Check if the MPT first loss cover can be sent to the broker before deleting the broker (7125)
  fix: Fix RPM prerelease ordering and start xrpld on DEB install (7313)
  ci: Re-enable full nproc for Linux (7315)
  fix: Add assorted MPT/DEX fixes (7040)
  refactor: Remove dead `fetchBatch` code (7309)
  release: Bump version to 3.2.0-b6 (7311)
  chore: Revert graceful peer disconnection and follow-up fix (7296)
  fix: Fix IOU precision issues in LoanBrokerCover transactions (7274)
  ...
2026-05-26 16:55:33 -04:00
Ed Hennis
90ea49b9f9 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-19 16:54:04 -04:00
Ed Hennis
ba35a9fb20 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-19 10:15:45 -04:00
Ed Hennis
0ef677f007 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-19 09:50:43 -04:00
Ed Hennis
a8f75ce155 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-14 20:39:33 -04:00
Ed Hennis
1cb6fd15b1 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-14 10:48:49 -04:00
Ed Hennis
ef59b14fb7 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-13 12:04:09 -04:00
Ed Hennis
4d2dc5fa54 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-12 20:11:38 -04:00
Ed Hennis
5b81a40bf1 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-07 18:10:30 -04:00
Ed Hennis
713dcaacb0 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-07 14:19:38 -04:00
Ed Hennis
b6b367e290 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-07 13:28:59 -04:00
Ed Hennis
50501c89d1 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-06 22:34:50 -04:00
Ed Hennis
dacc664f90 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-06 14:18:29 -04:00
Ed Hennis
410322362d Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-05 19:08:36 -04:00
Ed Hennis
588aa5c420 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-05-01 14:01:09 -04:00
Ed Hennis
f4a37fb3a4 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-28 16:31:44 -04:00
Ed Hennis
5faacf6006 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-25 14:46:10 -04:00
Ed Hennis
cabee3faac Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-23 15:56:30 -04:00
Ed Hennis
7ed2258782 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-22 23:52:49 -04:00
Ed Hennis
f97b4d01fb Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-22 14:49:30 -04:00
Ed Hennis
e657df5fe1 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-22 13:11:01 -04:00
Ed Hennis
ca190b5aaa Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-21 19:35:04 -04:00
Ed Hennis
503014f03f Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-20 17:50:03 -04:00
Ed Hennis
29f5829680 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-20 15:45:21 -04:00
Ed Hennis
2b1f7f9d55 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-20 11:39:26 -04:00
Ed Hennis
c776515cee Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-17 18:21:03 -04:00
Ed Hennis
5d9b00dba4 Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-16 13:44:53 -04:00
Ed Hennis
a81d37465e Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-15 19:09:37 -04:00
Ed Hennis
e341af4aee Merge branch 'develop' into ximinez/emptydirectoryinvariant 2026-04-15 14:29:12 -04:00
Ed Hennis
8122ed62b6 Experiment: Add invariant to enforce directory node population
- Experiment: Always delete the root
2026-04-13 19:58:50 -04:00
3 changed files with 60 additions and 1 deletions

View File

@@ -394,6 +394,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&);
};
/**
* Verify that MPT/XRP STAmounts are canonical in any ledger entries left after the
* transaction applies.
@@ -463,7 +479,9 @@ using InvariantChecks = std::tuple<
ValidMPTTransfer,
ObjectHasPseudoAccount,
SponsorshipOwnerCountsMatch,
SponsorshipAccountCountMatchesField>;
SponsorshipAccountCountMatchesField,
ObjectHasPseudoAccount,
NoEmptyDirectory>;
/**
* @brief get a tuple of all invariant checks

View File

@@ -255,6 +255,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

@@ -1206,6 +1206,46 @@ NoModifiedUnmodifiableFields::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;
}
//------------------------------------------------------------------------------
void
ValidAmounts::visitEntry(
bool isDelete,