Skip to content
Independent XRP reference
Our standards
← All XRP news

XRP Ledger Security

XRPLF Merges VaultDeposit Guard for Deposits That Round to Zero

XRPLF merged a develop-branch fix that rejects VaultDeposit cases where share rounding leaves the depositor's balance unchanged, while fixCleanup3_4_0 and SingleAssetVault remain disabled on public Mainnet servers.

By
A pale-gold tessera jig routes one cobalt glass share tile into an ivory groove while a separate cobalt balance strip remains flush to its origin notch

Direct answer: XRPL fixed a vault deposit no-op edge case, but Mainnet is unchanged

[Confirmed fact] XRPLF merged PR #8014 into the `rippled` `develop` branch on August 21, 2026. The change adds a `fixCleanup3_4_0`-gated check that rejects a `VaultDeposit` when share rounding would leave the depositor's balance unchanged, returning `tecPRECISION_LOSS` before the deposit is booked. Public Mainnet servers still report the gate absent, so this is protocol hardening, not an XRP market event or reported exploit. [1][2][6]

The story is about an accounting boundary inside the XRP Ledger's Single Asset Vault implementation. A depositor asks to add an asset amount, the protocol converts that amount into whole vault shares, then converts the rounded share count back into the asset amount that should move. In a narrow precision case, the recalculated amount can be positive mathematically but too small to change the depositor's stored balance. [3][4]

The final merged commit adds a `roundsToZeroForDepositor` helper in `VaultDeposit.cpp` and invokes it in `doApply` after the share round-trip has produced the actual asset amount. If the debit would leave the stored balance unchanged, the transaction returns `tecPRECISION_LOSS`; the patch does not show a separate final `preclaim` edit. That distinction matters because the pull request description discusses an early check, while the merged diff is the authoritative record of what landed. [1][2]

[Unresolved uncertainty] The primary records do not report a Mainnet exploit, a customer loss, an affected vault count, or a production transaction that reached this path. They document a reproducible test failure and a consensus-affecting correction gated for a future amendment. The evidence supports a careful engineering report, not a breach headline.

Section sources[1][2][6]

How share rounding could create a credit without a representable debit

[Confirmed fact] XLS-65 defines a subsequent vault deposit in two stages. First, the requested asset amount is multiplied by the current share supply and divided by the vault's asset total, with the share result rounded down to a whole integer. Second, that integer share amount is converted back into the asset amount that the vault actually receives. The merged PR targets the gap between the request and that post-truncation amount. [1][4]

The PR's regression setup makes the gap concrete without relying on a market price. A synthetic USD trust-line deposit starts a vault with 1,000 assets and 1,000 shares. A one-year loan at 24% is then paid back, leaving the vault at 1,240 assets while the share supply stays at 1,000. A later 6-asset deposit therefore truncates to 4 shares, and those 4 shares represent 4.96 assets under the test ratio. [1][2]

The test then places the depositor at an IOU precision cusp where one unit in the stored balance is 10 assets. The 4.96-asset debit is below half of that unit, so subtracting it from the stored balance rounds back to the original balance. The vault can still book the 4.96 assets and mint the 4 shares unless a guard stops the operation. This is why the issue is not simply a user entering too many decimal places. It is a mismatch between share discretization and the asset balance's representable scale. [1][2]

Before the new amendment gate, the test expects the transaction to run far enough for the `ValidVault` invariant to reject the mismatch with `tecINVARIANT_FAILED`. With `fixCleanup3_4_0` enabled, the same scenario returns `tecPRECISION_LOSS` before the vault fields are touched. The result changes the failure boundary from a late invariant rejection to an explicit precision-loss outcome, while preserving the old behavior when the feature is not enabled. [1][2]

Section sources[1][2][4]

What PR #8014 changes in rippled, and what it leaves alone

[Confirmed fact] The merged diff adds the balance check to the VaultDeposit application path and adds a targeted regression suite in `VaultBugs_test.cpp`. The helper skips integral assets, reads the depositor's simple stored balance rather than a spendable amount that may include counterparty limits, and compares the balance before and after the computed debit. That comparison asks the ledger's own numeric representation whether it noticed the debit. [2]

The test matrix crosses `fixCleanup3_4_0` on and off with `fixCleanup3_2_0` on and off. It also covers an ordinary positive trust-line balance and a debt case where the stored balance and spendable amount diverge. The final test setup reconstructs the non-power-of-ten vault ratio through actual vault and loan transactions instead of asserting only an isolated arithmetic helper. [1][2]

The code is deliberately narrow. It does not change the vault's share formula, make fractional MPT shares possible, or guarantee that every small deposit will succeed. It rejects a deposit when the amount the protocol would actually move cannot be represented as a change to the depositor's balance. An issuer account is treated separately in the code because its balance representation is not an ordinary depositor trust line. [1][2]

[Bounded inference] The main operational improvement is a clearer failure mode for clients and operators. An application can distinguish precision loss from insufficient funds, authorization, frozen assets, or a generic invariant failure. That should make retries and user explanations more accurate, but the sources do not measure reduced failures in production or establish that any current integration was broken.

Section sources[1][2][3]

Why this matters for the XLS-65 vault model

[Confirmed fact] A Single Asset Vault aggregates one asset from multiple depositors and represents ownership with Multi-Purpose Token shares. The XRPL specification lists XRP, issued tokens, and MPTs as possible vault assets, while the official transaction reference says a successful VaultDeposit moves assets to the vault's pseudo-account, issues the corresponding shares, and updates the vault balance. A no-op depositor debit would therefore break the relationship between three records: the depositor balance, the vault assets, and the share supply. [3][4][5]

The precision boundary is built into the design rather than being an incidental property of one test. XLS-65 says share calculations use integer units and that subsequent deposit shares are rounded down before the actual asset amount is recalculated. The same specification warns that the protocol controls rounding direction and that fractional results can create unexpected outcomes. PR #8014 is a direct implementation response to one of those outcomes, where the rounded result is still too small to register against the depositor's asset scale. [1][4]

XRPL Commons provides independent ecosystem context, not proof about this merge. In a March 6, 2026 explanation of XLS-65, the organization described vaults as a native pooled-asset primitive and said its Devnet suite covered 257 test cases across ten categories. That supports the importance of adversarial share and authorization testing, while its article remains a pre-activation explanation and does not evaluate PR #8014 or establish Mainnet use. [8]

[Bounded inference] The fix is material for future vault operators because a lending or yield protocol can change the asset-to-share ratio through ordinary state updates such as accrued interest. The relevant question is not whether the requested amount looks nonzero in a client interface. It is whether the post-rounding amount that `rippled` computes can change the depositor's actual stored balance at the moment the transaction applies.

Section sources[3][4][5][8]

Mainnet status: the code is in develop, not in the public feature state

[Confirmed fact] The merge record targets XRPLF's `develop` branch, and the latest tagged stable release reviewed for this report is `rippled` 3.3.0, published August 6, 2026. A develop merge can be important for protocol review and future release planning, but it is not by itself a package release, validator vote, amendment activation, or production behavior change. [1][2][10]

I queried Ripple's public `s1.ripple.com:51234` and `s2.ripple.com:51234` endpoints at about 18:07 UTC on August 21, 2026. Both returned `rippled` 3.3.0. Both feature responses returned `SingleAssetVault` as supported but disabled and `LendingProtocol` as supported but disabled. Neither response included a `fixCleanup3_4_0` feature entry. These are two public-server snapshots, not a census of every validator or private deployment. [6][7]

The evidence boundary for the VaultDeposit guard
RecordDated statusWhat it establishesWhat it does not establish
PR #8014 and commit 046d4ddMerged August 21, 2026 into developThe guard and regression tests landed in the development code lineA stable package, validator vote, or Mainnet activation
s1.ripple.com feature responseChecked August 21, 2026 at 18:07 UTCrippled 3.3.0; SingleAssetVault supported but disabled; no fixCleanup3_4_0 entryThe state of every validator or a future release outcome
s2.ripple.com feature responseChecked August 21, 2026 at 18:07 UTCrippled 3.3.0; SingleAssetVault supported but disabled; no fixCleanup3_4_0 entryA Mainnet transaction using the corrected path
XLS-65 specificationUpdated April 27, 2026; reference checked August 21The share conversion and rounding modelThat the proposed guard is enabled on Mainnet
Sources: XRPLF PR #8014 and merged commit, August 21, 2026; public s1 and s2 server_info and feature responses checked August 21, 2026 at 18:07 UTC; XRPLF XLS-0065 specification updated April 27, 2026. [1][2][4][6][7][10]

Section sources[1][2][6][7][10][4]

Implications for developers, vault operators, and XRP readers

For XRPL developers, the immediate requirement is version and feature awareness. A client that prepares VaultDeposit transactions should model the actual post-rounding amount, recognize `tecPRECISION_LOSS`, and test both amendment states against the server version it targets. It should not assume that a develop-branch commit is available merely because a transaction type appears in documentation. The official reference still lists `temDISABLED` when the SingleAssetVault amendment is not enabled. [2][3][6][7]

For vault owners and lending teams, the affected object is the exchange between an asset balance and integer share supply. Any connected protocol that changes `AssetsTotal`, accrues yield, books repayment, or otherwise changes the ratio should run deposit and withdrawal tests at the asset issuer's actual precision. The PR's loan-interest setup is a warning about state composition: a later deposit can encounter a ratio that an empty-vault or one-to-one test never exercised. [1][2][4]

For depositors and liquidity providers, the merge creates no current Mainnet action because the public servers checked for this report do not expose the gate and SingleAssetVault remains disabled. If a future vault becomes live, users should review the asset, share policy, access controls, withdrawal terms, and operator identity before depositing. The official XRPL tutorial itself warns that a public vault can be created by anyone and that a malicious owner can drain assets, so a precision fix is not a complete safety approval. [3][5]

For XRP holders and market readers, the record carries no sourced XRP price, supply, volume, adoption, or demand result. Vault assets may be XRP, an issued token, or an MPT, and the PR's test uses a synthetic IOU. It would be unsupported to convert this implementation fix into a bullish XRP forecast. The defensible significance is narrower: XRPLF is tightening the accounting boundary of a future-gated vault primitive. [1][4][5]

Section sources[3][5][11][1][4]

Confirmed facts, bounded inference, and unresolved uncertainty

[Confirmed fact] PR #8014 was merged into `develop` on August 21, 2026. Its final commit adds a depositor-balance comparison after the actual share-round-trip amount is known, returns `tecPRECISION_LOSS` when the debit rounds away, and adds regression cases for the amendment boundary, the earlier cleanup amendment, and a debt balance. Public s1 and s2 snapshots checked after the merge still report `rippled` 3.3.0 and no `fixCleanup3_4_0` entry. [1][2][6][7]

[Bounded inference] Moving the failure from `tecINVARIANT_FAILED` to `tecPRECISION_LOSS` should make the edge case easier for clients to diagnose and should prevent the vault from reaching a state where shares are credited against no depositor-side movement. That is a code-level interpretation of the merged guard and tests, not a measured production reliability result. [1][2]

[Unresolved uncertainty] The records do not identify a release date for `fixCleanup3_4_0`, a validator-vote schedule, an activation ledger, the number of future vaults that would encounter the case, or any live user loss. Halborn's Single Asset Vault assessment was tied to commit `9d619b9` from a February 17 to March 13, 2025 engagement and recommends a follow-up after material code changes. It therefore cannot certify this August 21 change. [9]

Section sources[1][2][6][7][9]

What to watch next for VaultDeposit and fixCleanup3_4_0

The next meaningful record should change the protocol or network state, not simply repeat the pull request title. A signed `rippled` release that includes PR #8014 would establish package availability. A feature response that names `fixCleanup3_4_0` and reports its support and enabled state would establish server capability. An amendment record and validated ledger after activation would be needed before describing the guard as live Mainnet behavior. [1][2][6][7][10]

If SingleAssetVault later activates, follow-up reporting should look for real `VaultDeposit` metadata, the asset type, the share amount, the post-rounding asset amount, and the transaction result. Those records could show whether the guard is encountered in practice and whether a client reports the new error correctly. They would still be separate from evidence about vault solvency, operator behavior, lending performance, or XRP demand. [3][4][5]

  • A signed stable `rippled` release or changelog entry that carries PR #8014 and documents the `fixCleanup3_4_0` compatibility boundary.
  • A public feature response and Known Amendments record showing whether `fixCleanup3_4_0` is supported, open for voting, or enabled on XRP Ledger Mainnet.
  • A validated ledger containing a live `VaultDeposit` transaction that records the asset amount, minted shares, result code, and affected Vault state.
  • Client-library and explorer updates that recognize `tecPRECISION_LOSS` for deposits and do not report a develop-only guard as active production behavior.
  • An independent follow-up security review after the material code change, with scope and assessed commit stated clearly.

Section sources[1][10][6][12][9]

What to watch next

  • A signed stable rippled release or changelog entry that carries PR #8014 and documents the fixCleanup3_4_0 compatibility boundary.
  • A public feature response and Known Amendments record showing whether fixCleanup3_4_0 is supported, open for voting, or enabled on XRP Ledger Mainnet.
  • A validated ledger containing a live VaultDeposit transaction that records the asset amount, minted shares, result code, and affected Vault state.
  • Client-library and explorer updates that recognize tecPRECISION_LOSS for deposits and do not report a develop-only guard as active production behavior.
  • An independent follow-up security review after the material code change, with scope and assessed commit stated clearly.

Sources and verification

We prioritize primary records and label supporting coverage. Dates reflect each source’s publication record.

  1. [1]XRPLF rippled PR #8014, merged August 21, 2026primary
  2. [2]XRPLF rippled commit 046d4dd, final VaultDeposit precision guard, August 21, 2026primary
  3. [3]XRP Ledger VaultDeposit reference, undated page checked August 21, 2026primaryUndated reference
  4. [4]XRPLF XRPL-Standards XLS-0065 Single Asset Vault, updated April 27, 2026primary
  5. [5]XRP Ledger Single Asset Vaults concept, undated reference checked August 21, 2026primaryUndated reference
  6. [6]Public s1.ripple.com server_info and feature responses, checked August 21, 2026 at 18:07 UTCprimaryUndated reference
  7. [7]Public s2.ripple.com server_info and feature responses, checked August 21, 2026 at 18:07 UTCprimaryUndated reference
  8. [8]XRPL Commons, Why We Voted Yes on XLS-65, published March 6, 2026supporting
  9. [9]Halborn, Ripple Single Asset Vault Smart Contract Assessment, last updated June 27, 2025supporting
  10. [10]XRPLF rippled 3.3.0 release, published August 6, 2026primary
  11. [11]XRP Ledger Deposit into a Vault tutorial, undated reference checked August 21, 2026primaryUndated reference
  12. [12]XRP Ledger Known Amendments, undated reference checked August 21, 2026primaryUndated reference