Summary
Version 3.4.0 of xrpld, the reference server implementation of the XRP Ledger protocol, is now available.
This release introduces two new amendments, retires an amendment, and adds various bug fixes and build improvements:
- LendingProtocolV1_1: Extends Single Asset Vaults and the Lending Protocol with closed-ended vaults and cash-basis accounting.
- fixCleanup3_4_0: Bundles amendment-gated fixes.
- fixAMMOverflowOffer: This amendment is retired, making it a permanent part of the protocol.
With this release, the xrpld DEB and RPM packages are now hosted at packages.xrplf.org with an XRPLF signing key. For full installation instructions, see: Installing xrpld.
Action Required
If you run an XRP Ledger server, upgrade to version 3.4.0 as soon as possible to ensure service continuity.
Install / Upgrade
On supported platforms, see the instructions on installing or updating xrpld.
| Package | SHA-256 |
|---|---|
| RPM for Red Hat / CentOS (x86-64) | b826d5a5ab935aa20c60e9bef9c76909721f1ec3a1d556ced61bafe54f27e8c3
|
| DEB for Ubuntu / Debian (x86-64) | 4dc40a21b12b7d21f2760b16545c1d842962a96978dd3199eb8de9aa0aff8339
|
For other platforms, please build from source. The most recent commit in the git log should be the change setting the version:
commit 4a4fded2eba11427c48ce3f24d9c1aea5e7a9d17
Author: Bart <bthomee@users.noreply.github.com>
Date: Wed Sep 16 12:10:08 2026 -0400
chore: Bump version to 3.4.0
What's Changed
Amendments
- LendingProtocolV1_1: Extends the
LendingProtocolandSingleAssetVaultamendments with a new closed-ended vault and cash-basis accounting. Closed-ended vaults have a defined lifecycle split into three phases: subscription, investment, and redemption; these phases determine when assets can be deposited into vaults, loans can be originated, and when assets can be redeemed. After the amendment is enabled, new loan brokers can only be created against closed-ended vaults. Cash-basis accounting changes vault accounting to only realize interest as income when payments are actually made, shifting from an instant interest recognition model where all scheduled interest was recognized at the time of loan origination. (#7817, #7921) - fixCleanup3_4_0: Bundles these fixes for the 3.4.0 release:
- Applies the
asfDisallowIncomingTrustlineblocker toOfferCreate, so an account without a trust line can no longer use an offer to receive tokens from an issuer that set the flag. (#6307) - Excludes deleted domain offers from the Permissioned DEX invariant, so replacing an offer in one domain with an offer in another no longer trips
tecINVARIANT_FAILED. (#7387) - Prevents
AMMClawbackfrom silently recovering zero when integer MPT rounding floors the amount, instead of burning the holder's LP tokens for nothing. (#7704) - Lets
AMMClawbackbypass the owner-reserve check when it must auto-create the paired asset holding, so a compliance clawback is not blocked or vetoed by reserve requirements. (#7796) - Rejects
tfMPTUnauthorizeon an individually lockedMPTokenwithtecNO_PERMISSION. (#8004) - Enforces the
ValidMPTBalanceChangesandValidMPTTransferinvariants, which were previously log-only, and extends them to hold even when a transaction fails. (#7889) - Rejects fake-XRP NFT offer amounts, exempts an IOU issuer from their own global freeze when creating an NFToken offer denominated in their own currency, and tightens permissioned DEX domain checks. (#7749)
- Recycles the escrow owner reserve in
EscrowCancelandEscrowFinish, so returning IOUs to an owner at the reserve boundary no longer fails withtecNO_LINE_INSUF_RESERVE. (#8142) - Adds distinct signing hash prefixes for
sfCounterpartySignatureandsfSponsorSignature, so a signature made for one role can no longer be replayed as another. (#8162) - Adds precision and rounding fixes across
VaultDeposit,VaultWithdraw, andVaultClawback, so a vault's tracked total assets, available assets, and share supply stay consistent. - Refines freeze, authorization, credential, and destination handling for Single Asset Vaults and the Lending Protocol; for example, exempting loan defaults from asset freeze, refusing pseudo-accounts where they cannot participate, and validating permissioned-domain withdrawal destinations.
- Rejects
PaymentBurnpayments that cross a zero balance. (c8e767a)
- Applies the
- The
fixAMMOverflowOfferamendent is retired. (#7537)
Features
- Added
nftoken_id,nftoken_offer_id, anddelivered_amount(forAccountDeletetransactions) toledgerRPC transaction metadata, matching thetxandaccount_txmethods. (#5706) - Enforced MPT
CanTransferon AMM LPToken transfers, so a non-transferable pool MPT blocks LPToken movement between holders. (#7418) - Paused online deletion when there are gaps in recent ledger history, so a node stays more up to date. (#5531)
Bug Fixes
- Added a null check for account object reads in
account_objects. (#7717) - Used consistent endianness when serializing the MPT
STIssuesequence. (#7429) - Deduplicated oracle entries in the
get_aggregate_pricemethod. (#6586) - Added the missing
value_typeto JSON iterators to fix GCC 13 builds. (#7907) - Removed
explicitfromstd/boosthash specialization default constructors to fix GCC 15 builds. (#8100) - Validated the buy/sell flag in NFT RPC input. (#7725)
- Fixed assorted MPT and DEX issues. (#7299)
- Fixed issues from the MPT/DEX audit and attackathon reports (phase 1). (#7334)
- Allowed
OverrideFreezeto bypass individual and deep freeze on AMM trust lines. (#6959) - Prevented AMM auction slots from being acquired at zero cost when the trading fee is zero. (#7430)
- Fixed the
AMMClawbackexact LP token boundary case. (#7373) - Added
ValidPermissionedDEXinvariant tracking for a fully consumed offer. (#6736) - Enabled reserve checking when ending a sponsorship. (#8044)
- Fixed
OfferCreateandPaymentnever deleting expired permissioned DEX credentials. (#6827) - Validated the
account/identfield type ingateway_balances. (#7655) - Validated the
account_linespeerfield type. (#7728) - Added a zero-keylet check in credential handling. (#7971)
- Added an assertion for
account_infoflags. (#7987) - Rejected an inner node claimed at leaf depth in
verifyProofPath. (#7940) - Clamped the depth used to index
selectBranch's key byte. (#7941) - Used a hardened hash on the
STPathElement. (eae0a35) - Prevented
simulatefrom updating the order book database. (ea6226b) - Trimmed unknown fields when parsing incoming peer protobuf messages. (
0db7b76) - Fixed an unbounded database seek via
TMGetLedger. (6099940) - Capped the
TMTransactionslist size and charged a fee for undeserializable transactions. (9aebb5e) - Made
calculateBaseFeeexception-safe. (3e4e56d) - Skipped the
CheckCashlimit waiver for the issuer. (8c594c7) - Rejected variable-length prefixes the encoder cannot write. (
00eeb0a)
Refactors
- Used
SeqProxyinstead ofuint32for all sequence-based keylets. (#7890) - Acted on TODOs unblocked by C++23. (#7990)
- Replaced
boost::lexical_castwith existing alternatives. (#7991) - Removed
operator!=overloads that C++20 synthesizes. (#7994) - Replaced Boost
trimandto_lowerwithlibxrplhelpers. (#7995) - Used
std::formatinstead ofboost::formatwhere it fits. (#7996) - Converted
boost::beast::string_viewtostd::string_view. (#6306) - Replaced
boost::filesystemwithstd::filesystemacross the codebase. (#7012) - Collapsed
transactions.macrosettings into aTxSettingsstruct. (#8001) - Rewrote
Transactor::operator()to use early returns. (#8003) - Used unsigned integers for branch-related SHAMap operations. (#7938)
- Added
SHAMapNodeID::isPrefixOf. (#7939) - Removed support for peer protocol version 2.1. (#7432)
- Extracted invariant invocation into a free
checkInvariantsrunner. (#7404) - Replaced the node ID with node depth in
TMLedgerNode, introducing peer protocol version 2.3. (#6353) - Optimized MPT freeze checks to reduce redundant state reads. (#7411)
- Sped up
Numberaddition for drastically different exponents. (#7825) - Removed the pseudo-account field filter from
isPseudoAccount. (#8042) - Added an assertion that default fields are not explicitly set to their default value when serializing. (#6267)
- Marked unreachable branches in Confidential Transfer with
UNREACHABLE. (#7903) - Renamed CamelCase namespaces to snake_case. (#7933)
Testing
- Added a Google Benchmark dependency and migrated the
nodestoretiming test to a benchmark. (#7317) - Added an RAII class to manage the
env.parseFailureExpectedflag. (#7669) - Modularized the PeerFinder component and migrated its tests from Beast to GTest and GMock. (#7054)
- Migrated
csfand consensus Beast non-JTx tests to GTest. (#7046) - Improved the server status test to not race and randomly fail. (#7304)
- Migrated
nodestoretests from Beast to GTest. (#7292) - Resolved GTest migration follow-ups (first pass). (#7884)
- Resolved GTest migration follow-ups (second pass). (#7888)
- Completed trivial GTest migrations. (#7865)
- Moved semantic version tests to GTest. (#7872)
- Moved lexical cast tests to GTest. (#7873)
- Added confidential MPT bulletproof tests. (#7816)
- Made the Drop50 message drop deterministic in the
LedgerReplayertest. (#7964) - Used
std::string::starts_with/ends_withinstead of Boost in tests. (#7992) - Added a
ProtocolMessageharness for testingTMPing. (b190f2b)
Documentation
- Documented a fix for
command not found: nixon macOS. (#7951) - Rearranged and simplified the build, nix, and environment docs. (#7985)
- Removed unreferenced legacy documents. (#7989)
- Rewrote the install guide. (#8048)
- Fixed the yum installation base URL. (#8066)
- Added
AGENTS.md/CLAUDE.mdfor AI coding agent guidance. (#8067) - Backfilled
API-CHANGELOG.mdfor versions 3.1.1 through 3.3.0. (#8159)
CI/Build
- Added Rust to CI. (#7808)
- Added Rust–C++ CMake and CI integration. (#7034)
- Worked around Boost compiler resolution inside the Nix environment. (#7826)
- Built a separate pre-commit Docker image. (#7831)
- Used an in-house image for pre-commit. (#7610)
- Added
CODEOWNERSfor CI-related changes. (#7832) - Improved test debuggability in CI. (#7619)
- Added Doxygen to the pre-commit image. (#7836)
- Added Cargo to the pre-commit image. (#7835)
- Updated the pre-commit image. (#7838)
- Bumped
actions/setup-pythonfrom 6.3.0 to 7.0.0. (#7830) - Used
rust-overlayto bring Rust into Nix. (#7837) - Created versioned compiler and tooling symlinks in Nix environments. (#7844)
- Cleaned up grammar in the PR template. (#7846)
- Updated
XRPLF/actions. (#7849) - Updated the CI image. (#7850, #8121)
- Added
llvm-tools-previewto the Rust toolchain. (#7853) - Used a custom libc in the dev shell by default. (#7852)
- Patched the binary in the local Linux Nix environment. (#7859)
- Verified tooling versions for Nix-managed environments. (#7862)
- Fixed the Clang version in the dev shell. (#7860)
- Bumped
actions/checkoutfrom 7.0.0 to 7.0.1. (#7871) - Updated the CI image and prepare-runner action. (#7874)
- Grouped GitHub Actions Dependabot updates. (#7876)
- Changed the
server_definitionsupload config name. (#7878) - Made clang-tidy format files using clang-format rules. (#7880)
- Watched
nix/*.nixfiles for direnv cache invalidation. (#7948) - Fixed the build on macOS 15 and the Nix environment. (#7953)
- Ran coverage first in CI. (#7917)
- Used a separate benchmark filter. (#7919)
- Generated
protocol_autogenonly once in CI. (#7918) - Removed Corrosion from Nix. (#7982)
- Removed protobuf dependencies from Nix. (#7984)
- Installed Conan configuration and profiles inside the Nix dev shell. (#7997)
- Reworked linker warnings across build scenarios. (#7974)
- Fixed GCC 14 compilation. (#7981)
- Respected the lld linker when it is auto-selected. (#8011)
- Added curl to the packaging images. (#8024)
- Fixed versioned tools for exec wrappers. (#8027)
- Checked versioned tools in
check-toolsand improved its output. (#8030) - Ran Nix macOS builds in CI and denied Nix store references. (#8023)
- Used AlmaLinux for the RHEL packaging image. (#8045)
- Signed RPM packages. (#8046)
- Published Debian and RPM packages from GitHub directly. (#8031)
- Compressed the RPM payload with zstd. (#8047)
- Stopped caching Cargo binaries. (#8062)
- Used the Debian
anydistribution and the signed, hosted RPM repo. (#8053) - Bumped
cxxfrom 1.0.198 to 1.0.199. (#8050) - Suppressed MSVC linker warning LNK4099. (#8049)
- Saved the Cargo cache only from
developby default. (#8063) - Upgraded the Rust toolchain to 1.97.1. (#8105)
- Updated the packaging images and added Python. (#8106)
- Added
rust-toolchain.tomlto.envrc. (#8107) - Reimplemented packaging in Python. (#8109)
- Renamed release channels (
unstable→rc,experimental→beta). (#8116) - Made
packaging_configpart of the strategy-matrix config. (#8115) - Made packaging reusable. (#8126)
- Updated
release-infoto produce a betterpkg_release. (#8131) - Corrected and simplified Linux packaging. (#8165)
- Updated the prepare-runner SHA. (#8168)
- Updated the pre-commit SHA. (#8169)
- Verified the glibc version was determined in the Debian package. (#8170)
- Stopped using
github.workspaceto speed up gcovr. (#8173) - Used consistent heading levels in the PR template. (#8155)
- Added assert-enabled builds and packages. (
c0d0fd0) - Fixed test installation on Debian 11 due to EOL. (
76da5d4) - Added a missing script to the Conan package. (
ebd810b)
Credits
The following RippleX teams and GitHub users contributed to this release:
- RippleX Engineering
- RippleX Docs
- RippleX Product
- @BraedonKlock
- @Kassaking7
- @andrzej-neti
- @bryanjiang1
- @dangell7
- @klemenfn
- @luisfernandomendozav
- @marek-foss-neti
- @mvanhorn
- @tyalymov
New Contributors
- @BraedonKlock made their first contribution in #7717
- @mvanhorn made their first contribution in #6586
- @bryanjiang1 made their first contribution in #7704
- @luisfernandomendozav made their first contribution in #7655
- @klemenfn made their first contribution in #7981
Bug Bounties and Responsible Disclosures
We welcome reviews of the xrpld code and urge researchers to responsibly disclose any issues they may find.
For more information, see:
Full Changelog: 3.3.0...3.4.0