{"templateId":"../../@theme/templates/blogpost","sharedDataIds":{"sidebar":"sidebar-blog/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"redocly_category":"Blog","type":"markdown"},"seo":{"title":"Introducing XRP Ledger version 3.4.0","siteUrl":"https://xrpl.org/","llmstxt":{"hide":false,"title":"XRPL Developer Portal & Documentation","description":"Explore XRP Ledger documentation, blogs, and other blockchain developer resources needed to start building and integrating with the ledger.","details":{"content":"XRP Ledger concepts, use cases, tutorials, references, and other blockchain developer resources. Also, stay up to date with release announcements and more through the XRPL Blog."},"sections":[{"title":"Introduction","description":"A high-level introduction to the XRP Ledger.","includeFiles":["docs/introduction/**/*.*","about/faq.md"],"excludeFiles":["docs/introduction/index.md"]},{"title":"Use Cases","description":"Real-world applications and business scenarios for the XRP Ledger.","includeFiles":["docs/use-cases/**/*.*"],"excludeFiles":["docs/use-cases/index.md","docs/use-cases/defi/index.md"]},{"title":"Agentic Transactions","description":"XRPL AI Starter Kit to help autonomous agents discover, set up, and execute agentic transactions on the XRP Ledger.","includeFiles":["docs/agents/**/*.*"]},{"title":"Concepts","description":"Core concepts including accounts, tokens, transactions, consensus, and more.","includeFiles":["docs/concepts/**/*.*"],"excludeFiles":["docs/concepts/index.md","docs/concepts/decentralized-storage/index.md","docs/concepts/payment-types/index.md"]},{"title":"Tutorials","description":"Step-by-step guides for building on the XRP Ledger in JavaScript, Python, Go, and more.","includeFiles":["docs/tutorials/**/*.*"]},{"title":"References","description":"Protocol specification, transaction types, ledger entries, and API methods.","includeFiles":["docs/references/**/*.*"],"excludeFiles":["docs/references/xrp-api.md","docs/references/data-api.md","docs/references/protocol/index.md","docs/references/protocol/ledger-data/ledger-entry-types/index.md","docs/references/protocol/transactions/index.md","docs/references/protocol/transactions/types/index.md","docs/references/http-websocket-apis/api-conventions/index.md","docs/references/http-websocket-apis/public-api-methods/*/index.md","docs/references/http-websocket-apis/admin-api-methods/*/index.md"]},{"title":"Infrastructure","description":"Install, configure, and troubleshoot xrpld and Clio servers.","includeFiles":["docs/infrastructure/**/*.*"],"excludeFiles":["docs/infrastructure/index.md","docs/infrastructure/*/index.md","docs/infrastructure/installation/build-run-xrpld-in-reporting-mode.md","docs/infrastructure/configuration/data-retention/index.md","docs/infrastructure/configuration/server-modes/index.md"]},{"title":"Blog (2023+)","description":"Recent XRPL Blog posts (showing 2023 and newer).","includeFiles":["blog/2023/**/*.*","blog/2024/**/*.*","blog/2025/**/*.*","blog/2026/**/*.*"]},{"title":"Resources","description":"Developer resources and contribution guidelines.","includeFiles":["resources/**/*.*"]}]},"description":"xrpld version 3.4.0 is now available. This version introduces the LendingProtocolV1_1 and fixCleanup3_4_0 amendments, retires the fixAMMOverflowOffer amendment, and includes assorted bug fixes."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"introducing-xrp-ledger-version-340","__idx":0},"children":["Introducing XRP Ledger version 3.4.0"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Version 3.4.0 of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]},", the reference server implementation of the XRP Ledger protocol, is now available."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This release introduces two new amendments, retires an amendment, and adds various bug fixes and build improvements:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["LendingProtocolV1_1"]},": Extends Single Asset Vaults and the Lending Protocol with closed-ended vaults and cash-basis accounting."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fixCleanup3_4_0"]},": Bundles amendment-gated fixes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fixAMMOverflowOffer"]},": This amendment is retired, making it a permanent part of the protocol."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With this release, the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," DEB and RPM packages are now hosted at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["packages.xrplf.org"]}," with an XRPLF signing key. For full installation instructions, see: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/blob/release/3.4.x/docs/install.md"},"children":["Installing xrpld"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"action-required","__idx":1},"children":["Action Required"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you run an XRP Ledger server, upgrade to version 3.4.0 as soon as possible to ensure service continuity."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"install--upgrade","__idx":2},"children":["Install / Upgrade"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On supported platforms, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/infrastructure/installation"},"children":["instructions on installing or updating ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}]},"."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Package"},"children":["Package"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"SHA-256"},"children":["SHA-256"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://packages.xrplf.org/repository/rpm-stable/x86_64/xrpld-3.4.0-1.el9.x86_64.rpm"},"children":["RPM for Red Hat / CentOS (x86-64)"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["b826d5a5ab935aa20c60e9bef9c76909721f1ec3a1d556ced61bafe54f27e8c3"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://packages.xrplf.org/repository/deb-stable/pool/x/xrpld/xrpld_3.4.0-1_amd64.deb"},"children":["DEB for Ubuntu / Debian (x86-64)"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4dc40a21b12b7d21f2760b16545c1d842962a96978dd3199eb8de9aa0aff8339"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For other platforms, please ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/blob/3.4.0/BUILD.md"},"children":["build from source"]},". The most recent commit in the git log should be the change setting the version:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"commit 4a4fded2eba11427c48ce3f24d9c1aea5e7a9d17\nAuthor: Bart <bthomee@users.noreply.github.com>\nDate:   Wed Sep 16 12:10:08 2026 -0400\n\n    chore: Bump version to 3.4.0\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"full-changelog","__idx":3},"children":["Full Changelog"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"amendments","__idx":4},"children":["Amendments"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["LendingProtocolV1_1"]},": Extends the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LendingProtocol"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SingleAssetVault"]}," amendments with a new ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["closed-ended"]}," vault and ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["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 ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["instant interest recognition"]}," model where all scheduled interest was recognized at the time of loan origination. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7817"},"children":["#7817"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7921"},"children":["#7921"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fixCleanup3_4_0"]},": Bundles these fixes for the 3.4.0 release:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Applies the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asfDisallowIncomingTrustline"]}," blocker to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OfferCreate"]},", so an account without a trust line can no longer use an offer to receive tokens from an issuer that set the flag. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6307"},"children":["#6307"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Excludes deleted domain offers from the Permissioned DEX invariant, so replacing an offer in one domain with an offer in another no longer trips ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecINVARIANT_FAILED"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7387"},"children":["#7387"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Prevents ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMClawback"]}," from silently recovering zero when integer MPT rounding floors the amount, instead of burning the holder's LP tokens for nothing. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7704"},"children":["#7704"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Lets ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMClawback"]}," bypass 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. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7796"},"children":["#7796"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejects ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tfMPTUnauthorize"]}," on an individually locked ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MPToken"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecNO_PERMISSION"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8004"},"children":["#8004"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enforces the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ValidMPTBalanceChanges"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ValidMPTTransfer"]}," invariants, which were previously log-only, and extends them to hold even when a transaction fails. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7889"},"children":["#7889"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["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. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7749"},"children":["#7749"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Recycles the escrow owner reserve in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EscrowCancel"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EscrowFinish"]},", so returning IOUs to an owner at the reserve boundary no longer fails with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecNO_LINE_INSUF_RESERVE"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8142"},"children":["#8142"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adds distinct signing hash prefixes for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sfCounterpartySignature"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sfSponsorSignature"]},", so a signature made for one role can no longer be replayed as another. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8162"},"children":["#8162"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adds precision and rounding fixes across ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultDeposit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultWithdraw"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultClawback"]},", so a vault's tracked total assets, available assets, and share supply stay consistent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejects ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentBurn"]}," payments that cross a zero balance. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/c8e767a"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["c8e767a"]}]},")"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixAMMOverflowOffer"]}," amendent is retired. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7537"},"children":["#7537"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"features","__idx":5},"children":["Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nftoken_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nftoken_offer_id"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["delivered_amount"]}," (for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccountDelete"]}," transactions) to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ledger"]}," RPC transaction metadata, matching the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tx"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account_tx"]}," methods. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5706"},"children":["#5706"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enforced MPT ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CanTransfer"]}," on AMM LPToken transfers, so a non-transferable pool MPT blocks LPToken movement between holders. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7418"},"children":["#7418"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Paused online deletion when there are gaps in recent ledger history, so a node stays more up to date. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5531"},"children":["#5531"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"bug-fixes","__idx":6},"children":["Bug Fixes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a null check for account object reads in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account_objects"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7717"},"children":["#7717"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used consistent endianness when serializing the MPT ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["STIssue"]}," sequence. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7429"},"children":["#7429"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deduplicated oracle entries in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get_aggregate_price"]}," method. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6586"},"children":["#6586"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added the missing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value_type"]}," to JSON iterators to fix GCC 13 builds. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7907"},"children":["#7907"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["explicit"]}," from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boost"]}," hash specialization default constructors to fix GCC 15 builds. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8100"},"children":["#8100"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validated the buy/sell flag in NFT RPC input. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7725"},"children":["#7725"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed assorted MPT and DEX issues. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7299"},"children":["#7299"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed issues from the MPT/DEX audit and attackathon reports (phase 1). (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7334"},"children":["#7334"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Allowed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OverrideFreeze"]}," to bypass individual and deep freeze on AMM trust lines. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6959"},"children":["#6959"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Prevented AMM auction slots from being acquired at zero cost when the trading fee is zero. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7430"},"children":["#7430"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMClawback"]}," exact LP token boundary case. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7373"},"children":["#7373"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ValidPermissionedDEX"]}," invariant tracking for a fully consumed offer. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6736"},"children":["#6736"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled reserve checking when ending a sponsorship. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8044"},"children":["#8044"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OfferCreate"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Payment"]}," never deleting expired permissioned DEX credentials. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6827"},"children":["#6827"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validated the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ident"]}," field type in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gateway_balances"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7655"},"children":["#7655"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validated the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account_lines"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["peer"]}," field type. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7728"},"children":["#7728"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a zero-keylet check in credential handling. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7971"},"children":["#7971"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added an assertion for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account_info"]}," flags. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7987"},"children":["#7987"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejected an inner node claimed at leaf depth in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["verifyProofPath"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7940"},"children":["#7940"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Clamped the depth used to index ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["selectBranch"]},"'s key byte. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7941"},"children":["#7941"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used a hardened hash on the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["STPathElement"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/eae0a35"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eae0a35"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Prevented ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["simulate"]}," from updating the order book database. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/ea6226b"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ea6226b"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Trimmed unknown fields when parsing incoming peer protobuf messages. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/0db7b76"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0db7b76"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed an unbounded database seek via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMGetLedger"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/6099940"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["6099940"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Capped the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMTransactions"]}," list size and charged a fee for undeserializable transactions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/9aebb5e"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["9aebb5e"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["calculateBaseFee"]}," exception-safe. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/3e4e56d"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["3e4e56d"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Skipped the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckCash"]}," limit waiver for the issuer. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/8c594c7"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["8c594c7"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejected variable-length prefixes the encoder cannot write. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/00eeb0a"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["00eeb0a"]}]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"refactors","__idx":7},"children":["Refactors"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SeqProxy"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uint32"]}," for all sequence-based keylets. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7890"},"children":["#7890"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Acted on TODOs unblocked by C++23. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7990"},"children":["#7990"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Replaced ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boost::lexical_cast"]}," with existing alternatives. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7991"},"children":["#7991"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operator!="]}," overloads that C++20 synthesizes. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7994"},"children":["#7994"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Replaced Boost ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["trim"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["to_lower"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["libxrpl"]}," helpers. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7995"},"children":["#7995"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::format"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boost::format"]}," where it fits. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7996"},"children":["#7996"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Converted ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boost::beast::string_view"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::string_view"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6306"},"children":["#6306"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Replaced ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boost::filesystem"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::filesystem"]}," across the codebase. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7012"},"children":["#7012"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Collapsed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactions.macro"]}," settings into a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TxSettings"]}," struct. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8001"},"children":["#8001"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rewrote ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Transactor::operator()"]}," to use early returns. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8003"},"children":["#8003"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used unsigned integers for branch-related SHAMap operations. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7938"},"children":["#7938"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SHAMapNodeID::isPrefixOf"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7939"},"children":["#7939"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed support for peer protocol version 2.1. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7432"},"children":["#7432"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Extracted invariant invocation into a free ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["checkInvariants"]}," runner. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7404"},"children":["#7404"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Replaced the node ID with node depth in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMLedgerNode"]},", introducing peer protocol version 2.3. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6353"},"children":["#6353"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optimized MPT freeze checks to reduce redundant state reads. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7411"},"children":["#7411"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Sped up ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Number"]}," addition for drastically different exponents. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7825"},"children":["#7825"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed the pseudo-account field filter from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isPseudoAccount"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8042"},"children":["#8042"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added an assertion that default fields are not explicitly set to their default value when serializing. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6267"},"children":["#6267"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Marked unreachable branches in Confidential Transfer with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UNREACHABLE"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7903"},"children":["#7903"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Renamed CamelCase namespaces to snake_case. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7933"},"children":["#7933"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"testing","__idx":8},"children":["Testing"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a Google Benchmark dependency and migrated the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodestore"]}," timing test to a benchmark. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7317"},"children":["#7317"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added an RAII class to manage the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["env.parseFailureExpected"]}," flag. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7669"},"children":["#7669"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Modularized the PeerFinder component and migrated its tests from Beast to GTest and GMock. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7054"},"children":["#7054"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Migrated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["csf"]}," and consensus Beast non-JTx tests to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7046"},"children":["#7046"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved the server status test to not race and randomly fail. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7304"},"children":["#7304"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Migrated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodestore"]}," tests from Beast to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7292"},"children":["#7292"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolved GTest migration follow-ups (first pass). (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7884"},"children":["#7884"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolved GTest migration follow-ups (second pass). (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7888"},"children":["#7888"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Completed trivial GTest migrations. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7865"},"children":["#7865"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Moved semantic version tests to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7872"},"children":["#7872"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Moved lexical cast tests to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7873"},"children":["#7873"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added confidential MPT bulletproof tests. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7816"},"children":["#7816"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made the Drop50 message drop deterministic in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LedgerReplayer"]}," test. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7964"},"children":["#7964"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::string::starts_with"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ends_with"]}," instead of Boost in tests. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7992"},"children":["#7992"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ProtocolMessage"]}," harness for testing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMPing"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/b190f2b"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["b190f2b"]}]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"documentation","__idx":9},"children":["Documentation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Documented a fix for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["command not found: nix"]}," on macOS. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7951"},"children":["#7951"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rearranged and simplified the build, nix, and environment docs. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7985"},"children":["#7985"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed unreferenced legacy documents. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7989"},"children":["#7989"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rewrote the install guide. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8048"},"children":["#8048"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the yum installation base URL. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8066"},"children":["#8066"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AGENTS.md"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CLAUDE.md"]}," for AI coding agent guidance. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8067"},"children":["#8067"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Backfilled ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API-CHANGELOG.md"]}," for versions 3.1.1 through 3.3.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8159"},"children":["#8159"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"cibuild","__idx":10},"children":["CI/Build"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added Rust to CI. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7808"},"children":["#7808"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added Rust–C++ CMake and CI integration. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7034"},"children":["#7034"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Worked around Boost compiler resolution inside the Nix environment. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7826"},"children":["#7826"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Built a separate pre-commit Docker image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7831"},"children":["#7831"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used an in-house image for pre-commit. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7610"},"children":["#7610"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CODEOWNERS"]}," for CI-related changes. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7832"},"children":["#7832"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved test debuggability in CI. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7619"},"children":["#7619"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added Doxygen to the pre-commit image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7836"},"children":["#7836"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added Cargo to the pre-commit image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7835"},"children":["#7835"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the pre-commit image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7838"},"children":["#7838"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["actions/setup-python"]}," from 6.3.0 to 7.0.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7830"},"children":["#7830"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rust-overlay"]}," to bring Rust into Nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7837"},"children":["#7837"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Created versioned compiler and tooling symlinks in Nix environments. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7844"},"children":["#7844"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cleaned up grammar in the PR template. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7846"},"children":["#7846"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XRPLF/actions"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7849"},"children":["#7849"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the CI image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7850"},"children":["#7850"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8121"},"children":["#8121"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["llvm-tools-preview"]}," to the Rust toolchain. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7853"},"children":["#7853"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used a custom libc in the dev shell by default. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7852"},"children":["#7852"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Patched the binary in the local Linux Nix environment. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7859"},"children":["#7859"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verified tooling versions for Nix-managed environments. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7862"},"children":["#7862"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the Clang version in the dev shell. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7860"},"children":["#7860"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["actions/checkout"]}," from 7.0.0 to 7.0.1. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7871"},"children":["#7871"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the CI image and prepare-runner action. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7874"},"children":["#7874"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Grouped GitHub Actions Dependabot updates. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7876"},"children":["#7876"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changed the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["server_definitions"]}," upload config name. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7878"},"children":["#7878"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made clang-tidy format files using clang-format rules. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7880"},"children":["#7880"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Watched ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nix/*.nix"]}," files for direnv cache invalidation. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7948"},"children":["#7948"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the build on macOS 15 and the Nix environment. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7953"},"children":["#7953"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ran coverage first in CI. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7917"},"children":["#7917"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used a separate benchmark filter. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7919"},"children":["#7919"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Generated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol_autogen"]}," only once in CI. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7918"},"children":["#7918"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed Corrosion from Nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7982"},"children":["#7982"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed protobuf dependencies from Nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7984"},"children":["#7984"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Installed Conan configuration and profiles inside the Nix dev shell. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7997"},"children":["#7997"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reworked linker warnings across build scenarios. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7974"},"children":["#7974"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed GCC 14 compilation. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7981"},"children":["#7981"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Respected the lld linker when it is auto-selected. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8011"},"children":["#8011"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added curl to the packaging images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8024"},"children":["#8024"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed versioned tools for exec wrappers. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8027"},"children":["#8027"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checked versioned tools in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["check-tools"]}," and improved its output. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8030"},"children":["#8030"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ran Nix macOS builds in CI and denied Nix store references. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8023"},"children":["#8023"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used AlmaLinux for the RHEL packaging image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8045"},"children":["#8045"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Signed RPM packages. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8046"},"children":["#8046"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Published Debian and RPM packages from GitHub directly. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8031"},"children":["#8031"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compressed the RPM payload with zstd. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8047"},"children":["#8047"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stopped caching Cargo binaries. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8062"},"children":["#8062"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used the Debian ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["any"]}," distribution and the signed, hosted RPM repo. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8053"},"children":["#8053"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cxx"]}," from 1.0.198 to 1.0.199. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8050"},"children":["#8050"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Suppressed MSVC linker warning LNK4099. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8049"},"children":["#8049"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Saved the Cargo cache only from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["develop"]}," by default. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8063"},"children":["#8063"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Upgraded the Rust toolchain to 1.97.1. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8105"},"children":["#8105"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the packaging images and added Python. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8106"},"children":["#8106"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rust-toolchain.toml"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".envrc"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8107"},"children":["#8107"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reimplemented packaging in Python. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8109"},"children":["#8109"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Renamed release channels (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unstable"]},"→",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rc"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["experimental"]},"→",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["beta"]},"). (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8116"},"children":["#8116"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["packaging_config"]}," part of the strategy-matrix config. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8115"},"children":["#8115"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made packaging reusable. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8126"},"children":["#8126"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["release-info"]}," to produce a better ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pkg_release"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8131"},"children":["#8131"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Corrected and simplified Linux packaging. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8165"},"children":["#8165"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the prepare-runner SHA. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8168"},"children":["#8168"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated the pre-commit SHA. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8169"},"children":["#8169"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verified the glibc version was determined in the Debian package. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8170"},"children":["#8170"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stopped using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["github.workspace"]}," to speed up gcovr. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8173"},"children":["#8173"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used consistent heading levels in the PR template. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/8155"},"children":["#8155"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added assert-enabled builds and packages. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/c0d0fd0"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["c0d0fd0"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed test installation on Debian 11 due to EOL. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/76da5d4"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["76da5d4"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a missing script to the Conan package. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/ebd810b"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ebd810b"]}]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"credits","__idx":11},"children":["Credits"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following RippleX teams and GitHub users contributed to this release:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["RippleX Engineering"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["RippleX Docs"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["RippleX Product"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@BraedonKlock"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@Kassaking7"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@andrzej-neti"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@bryanjiang1"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@dangell7"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@klemenfn"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@luisfernandomendozav"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@marek-foss-neti"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@mvanhorn"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@tyalymov"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"bug-bounties-and-responsible-disclosures","__idx":12},"children":["Bug Bounties and Responsible Disclosures"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We welcome reviews of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," code and urge researchers to responsibly disclose any issues they may find."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://ripple.com/legal/bug-bounty/"},"children":["Ripple's Bug Bounty Program"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/blob/3.4.0/SECURITY.md"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," Security Policy"]}]}]}]},"headings":[{"value":"Introducing XRP Ledger version 3.4.0","id":"introducing-xrp-ledger-version-340","depth":1},{"value":"Action Required","id":"action-required","depth":2},{"value":"Install / Upgrade","id":"install--upgrade","depth":2},{"value":"Full Changelog","id":"full-changelog","depth":2},{"value":"Amendments","id":"amendments","depth":3},{"value":"Features","id":"features","depth":3},{"value":"Bug Fixes","id":"bug-fixes","depth":3},{"value":"Refactors","id":"refactors","depth":3},{"value":"Testing","id":"testing","depth":3},{"value":"Documentation","id":"documentation","depth":3},{"value":"CI/Build","id":"cibuild","depth":3},{"value":"Credits","id":"credits","depth":2},{"value":"Bug Bounties and Responsible Disclosures","id":"bug-bounties-and-responsible-disclosures","depth":2}],"frontmatter":{"category":2026,"date":"2026-09-16","template":"../../@theme/templates/blogpost","seo":{"title":"Introducing XRP Ledger version 3.4.0","description":"xrpld version 3.4.0 is now available. This version introduces the LendingProtocolV1_1 and fixCleanup3_4_0 amendments, retires the fixAMMOverflowOffer amendment, and includes assorted bug fixes."},"labels":["xrpld Release Notes"],"markdown":{"editPage":{"hide":true}}},"lastModified":"2026-09-16T23:55:46.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/blog/2026/xrpld-3.4.0","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}