{"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.3.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/**/*.*"],"excludeFiles":[]},{"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/**/*.*"],"excludeFiles":[]},{"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/**/*.*"],"excludeFiles":[]},{"title":"Resources","description":"Developer resources and contribution guidelines.","includeFiles":["resources/**/*.*"],"excludeFiles":["resources/index.md"]}],"excludeFiles":[]},"description":"xrpld version 3.3.0 is now available. This version introduces the BatchV1_1, ConfidentialTransfer, DynamicMPT, PermissionDelegationV1_1, Sponsor, and fixCleanup3_3_0 amendments, retires several long-active amendments, 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-330","__idx":0},"children":["Introducing XRP Ledger version 3.3.0"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Version 3.3.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 several new amendments alongside bug fixes and build improvements. The new amendments are:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["BatchV1_1"]},": Atomic batch transactions (XLS-56)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["ConfidentialTransfer"]},": Privacy-preserving Multi-Purpose Token transfers (XLS-0096)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DynamicMPT"]},": Multi-Purpose Token properties that issuers can make permanently immutable (XLS-94)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PermissionDelegationV1_1"]},": Granular account permission delegation."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sponsor"]},": Reserve and transaction sponsoring (XLS-68)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fixCleanup3_3_0"]},": A bundle of amendment-gated bug fixes."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It also retires the long-active ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Clawback"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixDisallowIncomingV1"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixInnerObjTemplate"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixNFTokenReserve"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixUniversalNumber"]}," amendments, making them a permanent part of the protocol."]},{"$$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.3.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://repos.ripple.com/repos/rippled-rpm/stable/xrpld-3.3.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":["41fbe458c5f9f5e7efabe57fd679a7992641ca3ccf27166daeda6c972963b477"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://repos.ripple.com/repos/rippled-deb/pool/stable/xrpld_3.3.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":["d4e9a022741aed2eed1d70639310f90545b4592cc24b6c9aa6a37560d5efd2e0"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For other platforms, please ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/blob/release/3.3.x/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 00a178fb92ca49521b937ae1a99d863765ea8a90\nAuthor: Ayaz Salikhov <mathbunnyru@users.noreply.github.com>\nDate:   Thu Aug 6 17:34:39 2026 +0100\n\n    chore: Bump version to 3.3.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":["BatchV1_1"]},": Adds the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Batch"]}," transaction, which lets an account submit up to 8 inner transactions, enabling patterns such as atomic swaps. This amendment fixes and replaces the original ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Batch"]}," amendment disabled in v3.1.1. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6446"},"children":["#6446"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["ConfidentialTransfer"]},": Adds private transfers for Multi-Purpose Tokens, using advanced cryptography (EC-ElGamal and ZKPs). Balances and transfer amounts remain verifiable on-ledger, while shielding the actual amounts from the public. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5860"},"children":["#5860"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["DynamicMPT"]},": Extends Multi-Purpose Tokens by making specific properties mutable by default: the on-chain metadata, the transfer fee, and the ability to enable MPT issuance capability flags. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7439"},"children":["#7439"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PermissionDelegationV1_1"]},": Allows accounts to delegate some permissions to other accounts. This amendment replaces the original ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PermissionDelegation"]}," amendment, fixing a critical bug discovered in the original implementation of the feature. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6613"},"children":["#6613"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sponsor"]},": Enables companies, token issuers, and other entities to subsidize transaction costs and reserve requirements for end users. Sponsors can co-sign transactions or pre-fund sponsorships, covering fees and reserves, while sponsees retain full control of their accounts and keys. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5887"},"children":["#5887"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fixCleanup3_3_0"]},": Bundles these fixes for the 3.3.0 release:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Unifies freeze and deep freeze checks for transfers to and from pseudo-accounts in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultDeposit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["VaultWithdraw"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMDeposit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMWithdraw"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LoanBrokerCoverDeposit"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LoanBrokerCoverWithdraw"]}," transactions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7382"},"children":["#7382"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckCash"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckCancel"]}," to reject an all-zero ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckID"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["temMALFORMED"]}," during preflight instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecNO_ENTRY"]}," during processing. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7685"},"children":["#7685"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixes hybrid offers being removed from the open order book when the account that placed them loses access to the permissioned domain. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6843"},"children":["#6843"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixes Automated Market Maker liquidity being included in quality estimates for permissioned DEX order books. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6853"},"children":["#6853"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMWithdraw"]}," to return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecAMM_FAILED"]}," instead of dividing by zero for the one ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EPrice"]}," value at which the computation's denominator becomes zero. Without this amendment, the division throws and the transaction fails with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tefEXCEPTION"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6989"},"children":["#6989"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adds a precision loss check to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMDeposit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMWithdraw"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMClawback"]}," when the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixAMMv1_3"]}," amendment is also enabled."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ValidAMM"]}," invariant to ensure an AMM can only be deleted by an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMWithdraw"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMClawback"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMDelete"]}," transaction. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7295"},"children":["#7295"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adds the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ObjectHasPseudoAccount"]}," invariant, which checks that deleting a ledger entry backed by a pseudo-account also deletes that pseudo-account. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7445"},"children":["#7445"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adds further precision and rounding fixes for Single Asset Vaults and the Lending Protocol."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes transactions signed by a pseudo-account to fail with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tefBAD_AUTH"]},". This check also takes effect if the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LendingProtocol"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BatchV1_1"]}," amendment is enabled."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CredentialCreate"]}," to reject a pseudo-account in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Subject"]}," field with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecPSEUDO_ACCOUNT"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/d569f7db"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["d569f7d"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DepositPreauth"]}," to reject a pseudo-account in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorize"]}," field with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tecPSEUDO_ACCOUNT"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/a12ab049"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["a12ab04"]}]},")"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The following amendments are retired:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Clawback"]}," (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7353"},"children":["#7353"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixDisallowIncomingV1"]}," (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7364"},"children":["#7364"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixInnerObjTemplate"]}," (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7368"},"children":["#7368"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixNFTokenReserve"]}," (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7367"},"children":["#7367"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fixUniversalNumber"]}," (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5962"},"children":["#5962"]},")"]}]}]}]},{"$$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 a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["delegate"]}," filter parameter to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account_tx"]}," method. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6126"},"children":["#6126"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Packaged ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["validator-keys"]}," inside the server distribution. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/3ad6ce23"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["3ad6ce2"]}]},")"]}]},{"$$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 zero NFT offer ID check for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NFTokenCancelOffer"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7391"},"children":["#7391"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Disabled AMM creation using vault shares as a pool asset. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7666"},"children":["#7666"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejected delegating permissions to pseudo-accounts. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7597"},"children":["#7597"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Blocked delegated transactions from being queued. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7640"},"children":["#7640"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used trust line balance direction to validate IOU ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentMint"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentBurn"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7584"},"children":["#7584"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Strengthened ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Clawback"]}," invariant checks for MPT balances. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7285"},"children":["#7285"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Moved ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AMMInvariant"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["weakInvariantCheck"]}," logic into the transaction. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7032"},"children":["#7032"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added RPC validation checks on the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amm_info"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["amm_account"]}," fields. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7324"},"children":["#7324"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added an amendment sponsor for the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccountRootsDeletedClean"]}," invariant. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7801"},"children":["#7801"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Documented and asserted that ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," is never null in invariants. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7354"},"children":["#7354"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Handled rounding just above ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kMaxRep"]}," more accurately. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7389"},"children":["#7389"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Number"]}," addition and subtraction rounding. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7369"},"children":["#7369"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Number"]}," comparison operator. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7406"},"children":["#7406"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Refactored ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Batch"]}," transaction IDs. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7736"},"children":["#7736"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Capped the number of untrusted validator manifests accepted per message and dropped oversized ones. This is the fix released in version 3.2.1. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7925"},"children":["#7925"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Increased the validator manifest protocol message size cap and corrected manifest relay. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/54cfdda0"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["54cfdda"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bounded the untrusted validator manifest cache and reduced its cap. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/68a765d9"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["68a765d"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/c50edf50"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["c50edf5"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejected oversized validator manifests before decoding them. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/7877ee42"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["7877ee4"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rejected oversized peer protocol ping messages. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/6c793edf"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["6c793ed"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bounded and offloaded per-connection subscription cleanup. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/1dcaf4b5"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1dcaf4b"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Computed the validation suppression key over the canonical serialization. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/7d3611df"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["7d3611d"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set request size limits and differential pricing for get-object-by-hash calls. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/e290005d"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["e290005"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Charged the heavy-burden RPC fee in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["channel_verify"]}," method. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/a5af6b4e"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["a5af6b4"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Corrected the transaction type check performed before reading ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RawTransactions"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/faca302a"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["faca302"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used a weighted median when aggregating close-time offsets. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/981c2569"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["981c256"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Handled malformed ledger replay responses. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/4a9ee54c"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4a9ee54"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved lookup performance when assembling ledger deltas. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/846369cb"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["846369c"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Acquired a lock on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getClosedLedgerHash"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/d60955e2"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["d60955e"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Re-stored nodes missing from both backends during ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["online_delete"]}," rotation. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7763"},"children":["#7763"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Allocated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TaggedCache::getKeys()"]}," memory outside of the lock. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7567"},"children":["#7567"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed peer resource charges to always run on the peer's strand, so a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Drop"]}," disposition now correctly disconnects the peer. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7422"},"children":["#7422"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stopped creating a data directory for in-memory databases. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7323"},"children":["#7323"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Disabled transaction invariants. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7409"},"children":["#7409"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[[maybe_unused]]"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fix320Enabled"]}," for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assert=OFF"]}," builds. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7446"},"children":["#7446"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Adjusted the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," systemd service to allow up to five minutes for graceful shutdown, restart only on failure, and reduced the auto-update randomized delay. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7374"},"children":["#7374"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ensured ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," service directories exist at startup. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7565"},"children":["#7565"]},")"]}]},{"$$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":["STLedgerEntry"]}," type aliases instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::shared_ptr"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7282"},"children":["#7282"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Replaced ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intr_ptr::SharedPtr<SHAMapTreeNode>"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SHAMapTreeNodePtr"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7396"},"children":["#7396"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used const function arguments where possible. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7423"},"children":["#7423"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::move"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::string_view"]}," where possible. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7424"},"children":["#7424"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::ranges"]}," where possible. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7634"},"children":["#7634"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::from_chars"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["std::to_chars"]}," for JSON double parsing and formatting. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7735"},"children":["#7735"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Changed config section and key string literals into constants. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7095"},"children":["#7095"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Introduced ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XRPL_ASSERT_IF"]}," for amendment-gated assertions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7378"},"children":["#7378"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cleaned up ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tec"]}," object deletion logic. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6588"},"children":["#6588"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used dispatch instead of post. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7438"},"children":["#7438"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["const_cast"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TaggedCache::canonicalize_replace_cache"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/5638"},"children":["#5638"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Renamed keylet functions to more closely match the docs. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7059"},"children":["#7059"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Unified the style for all Doxygen comments. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7776"},"children":["#7776"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed redundant enable checks in confidential MPT transactions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7809"},"children":["#7809"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Moved the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["jss.h"]}," include out of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Indexes.h"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7799"},"children":["#7799"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deleted dead code. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7718"},"children":["#7718"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Explicitly trimmed the heap after cache sweeps. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/6022"},"children":["#6022"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cleaned up pong replies. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/5ab95748"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5ab9574"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Dispatched ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hasInvalidAmount()"]}," on type tag instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dynamic_cast"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7402"},"children":["#7402"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"documentation","__idx":8},"children":["Documentation"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Rewrote the build environment docs. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7533"},"children":["#7533"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed some comments to improve readability. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7405"},"children":["#7405"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added more information about pre-commit hooks and how to set them up. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7802"},"children":["#7802"]},")"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"testing","__idx":9},"children":["Testing"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Migrated resource and shamap Beast tests to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7133"},"children":["#7133"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Migrated basics Beast tests to GTest. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7136"},"children":["#7136"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a null-check unit test for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Oracle::aggregatePrice"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7306"},"children":["#7306"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a test for the permissioned domain sequence fix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7591"},"children":["#7591"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added tests for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMProofPathResponse"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TMReplayDeltaResponse"]}," invalid hash and key sizes. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7593"},"children":["#7593"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added unit tests for IP address related functions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7744"},"children":["#7744"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added JSON array size tests. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7592"},"children":["#7592"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added tests for the doxygen style check. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7795"},"children":["#7795"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Published test changes held back from 3.1.3. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7570"},"children":["#7570"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Suppressed invariant-failure logs in Vault and LoanBroker bug-regression tests. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7379"},"children":["#7379"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LCOV_EXCL_END"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LCOV_EXCL_STOP"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7407"},"children":["#7407"]},")"]}]},{"$$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":["Adopted the C++23 standard. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7431"},"children":["#7431"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Created a single test binary, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpl_tests"]},". (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7327"},"children":["#7327"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["verify-headers"]}," target to clean up headers. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7670"},"children":["#7670"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a pragma-once checker. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7580"},"children":["#7580"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Aligned ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," RPM packaging with the DEB package. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7529"},"children":["#7529"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated workflows and conan to use VS2026 and grpc 1.81.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7550"},"children":["#7550"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mpt-crypto"]}," to 1.0.2. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/06a9b1b6"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["06a9b1b"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Uploaded codecov results for the whole XRPLF organization. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/commit/bf65e5fa"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bf65e5f"]}]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Marked secp256k1 and mpt-crypto as transitive headers. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7658"},"children":["#7658"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Switched to a new conan XRPLF remote. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7622"},"children":["#7622"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7638"},"children":["#7638"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stopped reusing binaries between different C++ versions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7681"},"children":["#7681"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed the unity build. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7730"},"children":["#7730"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Disabled assertions on Release builds. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7443"},"children":["#7443"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ran sanitizers on release builds too. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7527"},"children":["#7527"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Silenced UBSan diagnostics in the ubsan build config. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7531"},"children":["#7531"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made sanitizer flags a list in the profile instead of a string. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7449"},"children":["#7449"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Redesigned the matrix configuration based on nix images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7385"},"children":["#7385"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Refactored build-related nix, docker, and workflow files. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7408"},"children":["#7408"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checked binaries separately from building them. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7355"},"children":["#7355"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Patched binaries in nix-based images and tested in every distro. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7376"},"children":["#7376"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Patched nix binaries in CMake. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7539"},"children":["#7539"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Patched the conan recipe for nix so it can be used on macOS. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7532"},"children":["#7532"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removed the conan patch in nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7534"},"children":["#7534"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flake.lock"]}," to allow conan with clang-22 support. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7390"},"children":["#7390"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Installed gcov, nettools, and cacert in nix images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7398"},"children":["#7398"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed clang ASan include dirs in nix images and added curl and gnupg. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7400"},"children":["#7400"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved sanitizer libs and added doxygen, dpkg, and rpm in nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7403"},"children":["#7403"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gh"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["file"]}," to nix packages. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7444"},"children":["#7444"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ClangBuildAnalyzer to nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7538"},"children":["#7538"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added zip to nix images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7551"},"children":["#7551"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added git-lfs to nix images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7561"},"children":["#7561"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added graphviz to nix images. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7566"},"children":["#7566"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added protobuf dependencies to nix. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7706"},"children":["#7706"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added Rust to the nix docker image. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7571"},"children":["#7571"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".envrc"]}," for automatic devshell switching via direnv. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7756"},"children":["#7756"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used the same compiler in the nix devshell as in CI. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7751"},"children":["#7751"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used new packaging images and stopped canceling develop builds. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7417"},"children":["#7417"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used the XRPLF/actions ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["build-multiarch-image"]}," workflow. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7428"},"children":["#7428"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Built and pushed docker images in forks too. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7588"},"children":["#7588"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Launched ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["upload-conan-deps"]}," on profile change. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7442"},"children":["#7442"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made configurations launch on certain event types. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7447"},"children":["#7447"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ran the full matrix only on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Ready to merge"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Full CI build"]}," labeled PRs. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7689"},"children":["#7689"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed workflow launch on matrix-unrelated labels. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7812"},"children":["#7812"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stopped running the conflict checker when a label is applied. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7774"},"children":["#7774"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Checked that more tools are available. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7600"},"children":["#7600"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used macOS 26 Tahoe with apple-clang 21. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7601"},"children":["#7601"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated clang-tidy to nix-based v22. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7412"},"children":["#7412"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used clang-tidy v22 new features. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7427"},"children":["#7427"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Better determined when a full clang-tidy run is needed. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7635"},"children":["#7635"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made clang-tidy workflow adjustments to stay in sync with Clio. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7563"},"children":["#7563"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a script to format clang-tidy output. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7650"},"children":["#7650"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ran ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clang_tidy_check"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pass_filenames: false"]}," from pre-commit. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7800"},"children":["#7800"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Made clang-tidy happy on macOS. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7701"},"children":["#7701"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled groups of clang-tidy checks by default. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7637"},"children":["#7637"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most bugprone clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7643"},"children":["#7643"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most modernize clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7664"},"children":["#7664"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most misc clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7663"},"children":["#7663"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most cppcoreguidelines clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7660"},"children":["#7660"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most performance clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7727"},"children":["#7727"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled most readability clang-tidy checks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7772"},"children":["#7772"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["modernize-unary-static-assert"]}," clang-tidy check. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7705"},"children":["#7705"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["modernize-use-auto"]}," clang-tidy check. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7707"},"children":["#7707"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["modernize-avoid-bind"]}," clang-tidy check. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7711"},"children":["#7711"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enabled the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["modernize-use-constraints"]}," clang-tidy check. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7715"},"children":["#7715"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved pre-commit hooks. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7702"},"children":["#7702"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added a pre-commit hook to check doxygen style. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7794"},"children":["#7794"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated pre-commit hooks and actions. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7686"},"children":["#7686"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Used multiple directories in the dependabot config. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7413"},"children":["#7413"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eps1lon/actions-label-merge-conflict"]}," from 3.0.3 to 3.1.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7375"},"children":["#7375"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["actions/checkout"]}," from 6.0.2 to 6.0.3. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7414"},"children":["#7414"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["actions/checkout"]}," from 6.0.3 to 7.0.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7585"},"children":["#7585"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["actions/setup-python"]}," from 6.2.0 to 6.3.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7657"},"children":["#7657"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Bumped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["codecov/codecov-action"]}," from 6.0.1 to 7.0.0. (",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/XRPLF/rippled/pull/7426"},"children":["#7426"]},")"]}]},{"$$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":["@Kassaking7"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@TimothyBanks"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@dangell7"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@marek-foss-neti"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["@solunolab"]}]},{"$$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/develop/SECURITY.md"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xrpld"]}," Security Policy"]}]}]}]},"headings":[{"value":"Introducing XRP Ledger version 3.3.0","id":"introducing-xrp-ledger-version-330","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":"Documentation","id":"documentation","depth":3},{"value":"Testing","id":"testing","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-08-06","template":"../../@theme/templates/blogpost","seo":{"title":"Introducing XRP Ledger version 3.3.0","description":"xrpld version 3.3.0 is now available. This version introduces the BatchV1_1, ConfidentialTransfer, DynamicMPT, PermissionDelegationV1_1, Sponsor, and fixCleanup3_3_0 amendments, retires several long-active amendments, and includes assorted bug fixes."},"labels":["xrpld Release Notes"],"markdown":{"editPage":{"hide":true}}},"lastModified":"2026-08-06T23:14:09.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/blog/2026/xrpld-3.3.0","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}