<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RippleX Developers</title>
    <description>The latest articles on DEV Community by RippleX Developers (ripplexdev).</description>
    <link>https://dev.to/ripplexdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4275%2Fc928fdb3-3be0-427c-971c-2224f6c6224a.jpeg</url>
      <title>DEV Community: RippleX Developers</title>
      <link>https://dev.to/ripplexdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ripplexdev"/>
    <language>en</language>
    <item>
      <title>LendingProtocolV1_1: Closed-Ended Vaults and Cash-Basis Accounting</title>
      <dc:creator>Shota Natenadze</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:39:48 +0000</pubDate>
      <link>https://dev.to/ripplexdev/lendingprotocolv11-closed-ended-vaults-and-cash-basis-accounting-2me8</link>
      <guid>https://dev.to/ripplexdev/lendingprotocolv11-closed-ended-vaults-and-cash-basis-accounting-2me8</guid>
      <description>&lt;p&gt;The Single Asset Vault has two modes: open-ended and closed-ended. Both use the same Vault ledger object and the same transaction types (&lt;code&gt;VaultCreate, VaultDeposit, VaultWithdraw, VaultSet&lt;/code&gt;). The difference is when capital can move in and out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-ended vaults&lt;/strong&gt; accept deposits and process withdrawals at any time. When a depositor sends assets, they receive shares (&lt;code&gt;MPTs&lt;/code&gt;) at the current price per share (&lt;code&gt;PPS = AssetsTotal / SharesTotal&lt;/code&gt;). When they withdraw, shares are burned and assets returned at whatever PPS is at that moment. Capital flows are continuous. Open-ended vaults are fully usable for non-lending purposes (e.g., pooled custody, shared treasury), but loan brokers cannot be attached to them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closed-ended vaults&lt;/strong&gt; (up for validator voting under the &lt;a href="https://livenet.xrpl.org/amendment/A360E2BFD775A5B0DCE1C36C16DF31B72735A57584FD163655D2F9564F8E7AC8" rel="noopener noreferrer"&gt;LendingProtocolV1_1&lt;/a&gt; amendment) have a fixed lifecycle with three phases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Subscription.&lt;/strong&gt; The vault is open for deposits. Shares are minted. The vault owner sets the subscription window via &lt;code&gt;SubscriptionDate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Investment.&lt;/strong&gt; The vault closes to new deposits (the protocol enforces this automatically). The vault owner deploys capital into loans. Interest is returned to the vault via &lt;code&gt;VaultDeposit&lt;/code&gt; with the &lt;code&gt;tfVaultDonation&lt;/code&gt; flag, which increases &lt;code&gt;AssetsTotal&lt;/code&gt; without minting new shares, raising PPS for all existing holders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Redemption.&lt;/strong&gt; After &lt;code&gt;RedemptionDate&lt;/code&gt;, the vault reopens for withdrawals. Depositors redeem shares at the final PPS (principal plus earned yield).&lt;/p&gt;

&lt;p&gt;Closed-ended vaults are created by setting &lt;code&gt;VaultKind = 1&lt;/code&gt; on &lt;code&gt;VaultCreate&lt;/code&gt;along with &lt;code&gt;SubscriptionDate&lt;/code&gt; and &lt;code&gt;RedemptionDate&lt;/code&gt;. This field is immutable after creation.&lt;/p&gt;

&lt;p&gt;Under LendingProtocolV1_1, LoanBrokerSet requires the vault to be closed-ended and returns &lt;code&gt;tecNO_PERMISSION&lt;/code&gt; on an open-ended vault. Nothing else about open-ended vaults changes: they still exist and still accept deposits and withdrawals at any time. The only thing blocked is setting up a loan broker on them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What LendingProtocolV1_1 introduces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://xrpl.org/resources/known-amendments#lendingprotocolv1_1" rel="noopener noreferrer"&gt;LendingProtocolV1_1 amendment&lt;/a&gt; extends the &lt;code&gt;LendingProtocol&lt;/code&gt; and &lt;code&gt;SingleAssetVault&lt;/code&gt; amendments with two changes:&lt;/p&gt;

&lt;p&gt;First, it introduces the closed-ended vault as a new vault type that users can create. Users can still create both open-ended and closed-ended vaults, but after this amendment is enabled, new loan brokers can only be created against closed-ended vaults. &lt;/p&gt;

&lt;p&gt;Second, it introduces cash-basis accounting. Under the original LendingProtocol amendment, all scheduled interest on a loan was recognized at the time of loan origination: the moment the loan was created, the full expected interest was recorded as income in the vault's accounting. &lt;code&gt;LendingProtocolV1_1&lt;/code&gt; changes this so that interest is only recognized as income when payments are actually made. This is a more conservative and accurate accounting model, and it means the vault's &lt;code&gt;AssetsTotal&lt;/code&gt; only reflects interest that has actually been received, not interest that is expected in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why the Closed and Open-Ended Vaults ship together&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lending is restricted to closed-ended vaults because of how share pricing works. In an open-ended vault, anyone can enter or exit at any time, so a depositor could time their entry and exit around a change in price per share and capture yield they did not earn. Closed-ended vaults avoid this by design: once the subscription window closes, no new shares can be minted, so there is no way to enter mid-term.&lt;/p&gt;

&lt;p&gt;Enabling lending on open-ended vaults would require a mechanism that prevents this kind of timing capture under continuous entry and exit. That is open design work, to be scheduled for an upcoming release.&lt;/p&gt;

&lt;p&gt;The decision was to ship the closed-ended vault first and require it to activate together with the original Lending Protocol and the Single Asset Vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means for the amendment vote&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three amendments need to activate for lending to go live on mainnet:&lt;br&gt;
&lt;a href="https://livenet.xrpl.org/amendment/A360E2BFD775A5B0DCE1C36C16DF31B72735A57584FD163655D2F9564F8E7AC8" rel="noopener noreferrer"&gt;LendingProtocolV1_1&lt;/a&gt; goes together with the &lt;a href="https://livenet.xrpl.org/amendment/565B90CA1AB2B9D42208ED10884188C64F9E19083DECB9634AAF06EB03299509" rel="noopener noreferrer"&gt;LendingProtocol&lt;/a&gt; and &lt;a href="https://livenet.xrpl.org/amendment/81BD2619B6B3C8625AC5D0BC01DE17F06C3F0AB95C7C87C93715B87A4FD240D8" rel="noopener noreferrer"&gt;SingleAssetVault&lt;/a&gt;. &lt;code&gt;LendingProtocol&lt;/code&gt; is the base lending engine: loan brokers, loan origination, repayment, default handling, and first-loss capital. &lt;code&gt;SingleAssetVault&lt;/code&gt; is the base vault primitive that both open-ended and closed-ended vaults build on. &lt;/p&gt;

</description>
      <category>architecture</category>
      <category>blockchain</category>
      <category>xls66</category>
      <category>xls65</category>
    </item>
    <item>
      <title>Confidential Transfer - QA Test Report</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Tue, 22 Sep 2026 21:19:23 +0000</pubDate>
      <link>https://dev.to/ripplexdev/confidential-transfer-qa-test-report-1l18</link>
      <guid>https://dev.to/ripplexdev/confidential-transfer-qa-test-report-1l18</guid>
      <description>&lt;p&gt;&lt;strong&gt;Test Report Date&lt;/strong&gt;: 9/22/2026&lt;br&gt;
&lt;strong&gt;Prepared By&lt;/strong&gt;: &lt;a href="https://github.com/sgramkumar" rel="noopener noreferrer"&gt;sgramkumar&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: GitLab CI Runner (nix-debian)&lt;br&gt;
&lt;strong&gt;Network&lt;/strong&gt;: xrpld devnet + private CI network&lt;/p&gt;
&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This report presents the results of QA testing performed on Confidential Transfer (XLS-0096) across xrpld servers. Coverage targets the Confidential MPT feature, which layers ElGamal-encrypted balances and zero-knowledge proofs on top of Multi-Purpose Tokens so that token amounts can be held and transferred confidentially while remaining verifiable on-ledger.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Feature
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Feature Name&lt;/strong&gt;: Confidential Transfer (Confidential MPT)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Standard Multi-Purpose Tokens expose every balance and transfer amount in clear on the ledger, which is unacceptable for many payment and settlement use cases. Confidential MPT introduces a confidential balance model in which amounts are stored as ElGamal ciphertexts and every state transition is accompanied by a zero-knowledge proof that the transition is valid without revealing the underlying value. The feature adds five transactors — &lt;code&gt;ConfidentialMPTConvert&lt;/code&gt; (move a public MPT balance into the confidential spending balance), &lt;code&gt;ConfidentialMPTSend&lt;/code&gt; (transfer a confidential amount into a destination's inbox), &lt;code&gt;ConfidentialMPTMergeInbox&lt;/code&gt; (fold received inbox ciphertexts into the spending balance), &lt;code&gt;ConfidentialMPTConvertBack&lt;/code&gt; (move a confidential balance back to public), and &lt;code&gt;ConfidentialMPTClawback&lt;/code&gt; (issuer clawback of confidential balances). An optional Auditor may be configured on the issuance so a designated party can decrypt amounts for compliance, and the confidential surface composes with the existing issuance-control flags (lock, freeze, require-auth, clawback).&lt;/p&gt;

&lt;p&gt;Specification Reference: &lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0096-confidential-mpt" rel="noopener noreferrer"&gt;https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0096-confidential-mpt&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Test Scope
&lt;/h2&gt;

&lt;p&gt;This report covers the full Confidential Transfer surface as it stands under the Confidential MPT amendment. Testing focused on ensuring that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All five transactors (Convert, Send, MergeInbox, ConvertBack, Clawback) behave per the XLS-0096 specification, including correct balance conservation and commit/rollback semantics&lt;/li&gt;
&lt;li&gt;ElGamal ciphertext handling, zero-knowledge proof verification, per-send re-randomization, and the caller-specified discrete-log decrypt range behave correctly and reject malformed or stale material&lt;/li&gt;
&lt;li&gt;Issuance lifecycle and control flags (privacy flag, can-lock/lock, global lock, require-auth, clawback, auditor configuration) are enforced across every transactor&lt;/li&gt;
&lt;li&gt;The auditor mirror is maintained and re-randomized correctly so that a configured auditor can always decrypt while confidentiality is preserved against everyone else&lt;/li&gt;
&lt;li&gt;Balance and supply invariants hold — encrypted balance deltas match public balance deltas, inbox and spending balances reconcile, and no value is created or destroyed&lt;/li&gt;
&lt;li&gt;Security-critical properties hold under adversarial input, including bad proofs, mismatched ciphertexts, stale-proof replay, crafted randomness, and structural/serialization attacks&lt;/li&gt;
&lt;li&gt;Confidential MPT composes correctly with Batch, Permission Delegation, Sponsored Fees &amp;amp; Reserves, Deposit Authorization / Preauth, and Permissioned Domains&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Types of Testing Conducted
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;Verifying each transactor, issuance lifecycle step, control flag, and RPC/metadata surface against the XLS-0096 specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cryptographic&lt;/td&gt;
&lt;td&gt;ElGamal ciphertext validation, zero-knowledge proof verification, per-send re-randomization, auditor-mirror correctness, and the discrete-log decrypt-range API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression&lt;/td&gt;
&lt;td&gt;Running the full xrpld test suite to confirm Confidential MPT changes did not break existing functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial / Security&lt;/td&gt;
&lt;td&gt;Attack-matrix scenarios probing bad proofs, mismatched/stale ciphertexts, crafted randomness, key rotation, and structural/serialization smuggling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature&lt;/td&gt;
&lt;td&gt;Interactions between Confidential MPT and Batch (XLS-56), Permission Delegation (XLS-75), Sponsored Fees &amp;amp; Reserves, Deposit Authorization / Preauth, and Permissioned Domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End-to-End&lt;/td&gt;
&lt;td&gt;Full flows spanning convert, confidential send, inbox merge, convert-back, and clawback, with downstream balance and metadata validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  4. Test Results Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Total Tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Confidential Transfer — Core Functional (five transactors, issuance lifecycle, crypto, invariants)&lt;/td&gt;
&lt;td&gt;358&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidential Transfer — Adversarial / Security (adversarial, hardening, bug hunt)&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidential Transfer — Cross-Feature (Batch/Composition, Delegation, Sponsor, Deposit Preauth, Permissioned Domain)&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidential Transfer — Total&lt;/td&gt;
&lt;td&gt;561&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression — xrpld (full suite)&lt;/td&gt;
&lt;td&gt;5,088&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Testcases: &lt;a href="https://dev.to/ripplexdev/confidential-transfer-testcases-1pee"&gt;https://dev.to/ripplexdev/confidential-transfer-testcases-1pee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature commit history&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Introduced as the ConfidentialTransfer amendment in PR #5860 (768d7603b1, merged 2026-06-27) 
&lt;span class="p"&gt;-&lt;/span&gt; Specification standardized as XLS-0096 (XRPL-Standards discussion #372, spec created 2026-01-15) and tracked through spec rc2 (#303)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Related xrpld changes covered in this round:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/7279" rel="noopener noreferrer"&gt;#7279&lt;/a&gt; — Add Batch + Delegation + Confidential tests&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/7535" rel="noopener noreferrer"&gt;#7535&lt;/a&gt; — per-send re-randomization of zero-knowledge proof scalars (independent re-randomization scalar per send)&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/7612" rel="noopener noreferrer"&gt;#7612&lt;/a&gt; — auditor-mirror re-randomization and the MergeInbox defense against crafted-randomness attacks&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/6988" rel="noopener noreferrer"&gt;#6988&lt;/a&gt; — DestinationTag handling on confidential sends&lt;/li&gt;
&lt;li&gt;mpt-crypto PR &lt;a href="https://github.com/XRPLF/mpt-crypto/pull/127" rel="noopener noreferrer"&gt;#127&lt;/a&gt; — caller-specified discrete-log decrypt range and the shared-secret zero-exclusion guard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Bugs Reported
&lt;/h2&gt;

&lt;p&gt;All internal bugs are fixed and there are no Critical Open bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Conclusion
&lt;/h2&gt;

&lt;p&gt;Confidential Transfer (XLS-0096) has now been exercised across 561 dedicated tests spanning core functional coverage (the five transactors, issuance lifecycle, cryptographic verification, and ledger invariants), adversarial / security scenarios, and cross-feature interactions with Batch, Permission Delegation, Sponsored Fees &amp;amp; Reserves, Deposit Authorization / Preauth, and Permissioned Domains. In addition, the full xrpld regression suite has been executed to confirm no downstream breakage.&lt;/p&gt;

&lt;p&gt;All security-critical properties documented in XLS-0096 have been validated, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct balance conservation across every transactor — encrypted balance deltas match the corresponding public balance deltas, and inbox/spending balances reconcile with no value created or destroyed&lt;/li&gt;
&lt;li&gt;Rejection of malformed, mismatched, and stale ciphertexts and zero-knowledge proofs, and of crafted-randomness attacks against the auditor mirror and MergeInbox (PR &lt;a href="https://github.com/XRPLF/rippled/pull/7612" rel="noopener noreferrer"&gt;#7612&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correct per-send re-randomization of proof scalars so that confidentiality holds across repeated and chained sends (PR &lt;a href="https://github.com/XRPLF/rippled/pull/7535" rel="noopener noreferrer"&gt;#7535&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correct enforcement of issuance control flags (privacy, lock/global-lock, require-auth, clawback) and auditor configuration across all five transactors&lt;/li&gt;
&lt;li&gt;Correct interaction with delegated authority, sponsorship, tickets, deposit authorization, permissioned domains, and Batch composition, including atomic rollback of stale-proof inner transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feature is considered ready for production use at the tested commit level. Future updates to this report will follow any material additions to the Confidential Transfer surface.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>Confidential Transfer - Testcases</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Tue, 22 Sep 2026 21:17:39 +0000</pubDate>
      <link>https://dev.to/ripplexdev/confidential-transfer-testcases-1pee</link>
      <guid>https://dev.to/ripplexdev/confidential-transfer-testcases-1pee</guid>
      <description>&lt;p&gt;Automated test coverage for the Confidential Transfer feature (&lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0096-confidential-mpt" rel="noopener noreferrer"&gt;XLS-0096&lt;/a&gt;), grouped by the transactor, invariant, or cross-feature interaction each test exercises with 561 tests.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Test Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transactor — Convert&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactor — Send&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactor — MergeInbox&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactor — ConvertBack&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactor — Clawback&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issuance Lifecycle&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crypto&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardening&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial / Security&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invariants&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch / Composition&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delegation&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug Hunt&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;561&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Transactor — Convert
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Confidential MPT convert basic&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert without tfMPTCanPrivacy flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert partial amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert multiple times with available balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert multiple times without ignoring holder elgamal public key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert multiple times with insufficient balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert account is individual account locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert account is globally locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor enabled and auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor same as issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor enabled separately after issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with different issuer elgamal public key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert holder and issuer encrypted amounts different&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor enabled but no auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor not enabled but with auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor enabled and using issuer for auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor enabled and using holder for auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with no issuer elgamal public key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert set privacy flag and issuer elgamal public key separately after MPT Issuance create&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert set privacy flag and issuer elgamal public key in same transaction after MPT Issuance create&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert existing account set privacy flag when oa greater than zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert new account after set privacy flag when oa greater than zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert set privacy flag when oa equals zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert set privacy flag by holder when oa greater than zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert set privacy flag by holder when oa equals zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with cannot mutate privacy flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with cannot mutate privacy flag and set privacy flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with cannot mutate privacy flag and set privacy flag again&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert holder without elgamal public key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert non existent account&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert account with no MPT balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert account with no MPT object&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with MPT lock flag set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with can lock flag but not locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert without tfMPTCanTransfer flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with clawback flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert from issuer account&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert from account who is another issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert zero amount account as issuer with balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert zero amount account as issuer with no balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert account as third party without MPT object&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert MPT amount more than holder balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert MPT amount in fraction&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert MPT amount zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert MPT amount negative&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert negative MPT amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert no holder encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert no issuer encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert no auditor encrypted amount when auditor set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with auditor encrypted amount but auditor not set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with receiver field&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with destination field&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with invalid MPT Issuance id&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert MPT amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert maximum amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert auditor key mismatch&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert invalid ciphertext format&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert invalid zkp&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert multiple accounts&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert change auditor&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert and delete holder&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with multisign with disabling master key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert with multisign without disabling master key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert minimum amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert invalid elgamal key format&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert elgamal key wrong length&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert auditor encrypted amount encrypts wrong value&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert issuer key rotation impact when coa is non zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert issuer key rotation impact when coa is zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert identity point elgamal key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert blinding factor wrong length&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert zero amount on existing confidential balance&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Transactor — Send
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Confidential MPT send to destination account basic&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send partial amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send multiple times&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send source destination swap&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with one drop in inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without source account merging inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without bob having mptoken&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with bob having zero mpt&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with bob having nonzero MPT but no coa&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to destination account having zero confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send zero amount to bob&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send source confidential balance is zero after convert&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to self&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send source does not exist&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send source does not have mptoken&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send source is locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send destination is nonexistent account&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send destination is locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with globally locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send more than available coa&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send invalid MPT Issuance id&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send issuer sends to holder&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send holder sends to issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send sender encrypted amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send sender encrypted amount invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send destination encrypted amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send destination encrypted amount invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send issuer encrypted amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with auditor basic success&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with auditor missing auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with auditor invalid auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without auditor but with auditor encrypted amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without auditor unexpected auditor amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with auditor verify decryption&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with auditor multiple sends&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send from multiple accounts&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with zkproof missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with invalid zkproof value&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with amount commitment missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with invalid amount commitment value&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with balance commitment missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with invalid balance commitment value&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send multiple times in sequence&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send version increment&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send incorrect version&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send stale proof rejection&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send mismatched ciphertexts&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send and MPT Issuance destroy source account having zero confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send and delete mptoken on destination account before merging inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send second account as sender&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to different accounts with same version&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send first merge after convert merge convert&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with multisign without disabling master key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with multisign with disabling master key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with multisign insufficient signatures&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with regular key master enabled&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with regular key disabled master&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send fractional amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send negative amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send and public payment to same destination&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send and public payment to different destinations&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without merge&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with require auth and destination unauthorized&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to destination with deposit auth&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to destination with deposit auth and preauth&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send to destination requiring credential without providing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with nonexistent credential&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send with expired credential&lt;/li&gt;
&lt;li&gt;Test Confidential MPT send without tfMPTCanTransfer flag&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Transactor — MergeInbox
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Confidential MPT merge inbox basic&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox after partial convert&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox account does not exist&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox account does not have mptoken&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with no confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with various token balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox account is issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox convert twice then merge&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox account is individual account locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox account is globally locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox invalid MPT Issuance id&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox missing MPT Issuance id&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox by third party&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox empty&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox conver and merge multiple times&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox enczero determinism&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox enczero validation&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox and destroy mptoken without merge inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox and destroy mptoken after merge inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with maximum value&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox rapid state changes&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with mixed public confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox at minimum xrp reserve&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with require auth flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox idempotency empty inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox determinism across accounts&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox balance conservation&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox decrypt verification&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox with multisign with disabled master key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox version increments by one&lt;/li&gt;
&lt;li&gt;Test Confidential MPT merge inbox cb in amount field mismatch adversarial&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Transactor — ConvertBack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Confidential MPT convert back entire confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back partial confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back without merging inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back with balance in inbox and spending&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back with balance only in inbox&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back with no balance in both inbox and spending&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back account does not exist&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back account does not have mptoken&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back account is issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back invalid mptokenissuanceid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back mptamount greater than spending balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back mptamount invalid values&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back zero amount&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back mptamount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back holder encrypted amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back holder encrypted amount invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back issuer encrypted amount missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back issuer encrypted amount invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back blinding factor missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back blinding factor invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back zkproof missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back zkproof invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back balance commitment missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back balance commitment invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back with auditor encrypted amount no auditor set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back no auditor encrypted amount with auditor set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back with auditor encrypted amount and auditor set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back account locked&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back and destroy mptoken and delete accounts&lt;/li&gt;
&lt;li&gt;Test Confidential MPT convert back encrypted balance delta equals public balance delta&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Transactor — Clawback
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Confidential MPT clawback with tfMPTCanClawback set&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback after partial convert&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback public mpt&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback without tfMPTCanClawback flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback non issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback holder missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback holder nonexistent&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback third party holder&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback MPT amount zero&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback from holder with zero confidential balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback MPT amount exceeds balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback MPT amount less than balance&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback zkproof missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback zkproof invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback MPT Issuance id missing&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback MPT Issuance id invalid&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback without privacy flag&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback without issuer encryption key&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback multiple holders&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback holder equals issuer&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback with inbox and spending&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback from source after send&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback from destination after send&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback public balance with regular clawback while confidential setup exists&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback dual public and confidential workflow&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback and delete account&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback with auditor&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback holder account individually locked before clawback&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback tokens globally locked before clawback&lt;/li&gt;
&lt;li&gt;Test Confidential MPT clawback invariant coa decreases&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Issuance Lifecycle
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Issuance set set confidential when coa gt zero is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set clear confidential bit is unrecognized returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Issuance set set confidential when cannot mutate is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set replace issuer key is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set replace auditor key surfaces as temMALFORMED&lt;/li&gt;
&lt;li&gt;Test Issuance set keys when confidential not enabled is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set keys with enable in same tx succeeds&lt;/li&gt;
&lt;li&gt;Test Issuance set keys with unrecognized clear bit is temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Issuance set re register issuer key after coa gt zero is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set set confidential via mutable flag sets lsf flag&lt;/li&gt;
&lt;li&gt;Test Issuance set confidential mutate with holder field is temMALFORMED&lt;/li&gt;
&lt;li&gt;Test Issuance set keys with holder field is temMALFORMED&lt;/li&gt;
&lt;li&gt;Test Issuance set confidential with nonzero transfer fee is tecNO PERMISSION&lt;/li&gt;
&lt;li&gt;Test Issuance set enable privacy and nonzero transfer fee same tx temBAD TRANSFER FEE&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create privacy flag without issuer key&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create issuer key without privacy flag&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create auditor key without privacy flag&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create invalid issuer elgamal key&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create invalid auditor elgamal key&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create coa initialized to zero&lt;/li&gt;
&lt;li&gt;Test MPT Issuance set remove auditor key with active supply&lt;/li&gt;
&lt;li&gt;Test MPT Issuance set non issuer privacy settings&lt;/li&gt;
&lt;li&gt;Test MPT Issuance create privacy flag with nonzero transfer fee&lt;/li&gt;
&lt;li&gt;Test MPT Issuance set auditor key without issuer key&lt;/li&gt;
&lt;li&gt;Test MPT Issuance destroy with nonzero confidential outstanding amount&lt;/li&gt;
&lt;li&gt;Test Privacy enabled at creation cannot be disabled by any clear bit&lt;/li&gt;
&lt;li&gt;Test Privacy enabled via mutable flag post creation then clear attempt returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Privacy frozen off via tfMPTCannotMutatePrivacy blocks all later enables&lt;/li&gt;
&lt;li&gt;Test Re enable privacy on already enabled Issuance is idempotent&lt;/li&gt;
&lt;li&gt;Test All six capability flags one way under confidential issuance&lt;/li&gt;
&lt;li&gt;Test Enabling privacy post creation via mutableflags enables all confidential transactors&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle failed unauthorize does not decrement coa&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle unauthorize after full round trip succeeds&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle unauthorize when other holder has cb succeeds&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle reauthorize after unauthorize yields fresh mptoken&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle issuer unauthorize blocks subsequent sends&lt;/li&gt;
&lt;li&gt;Test Authorize lifecycle authorize destroyed Issuance returns object not found&lt;/li&gt;
&lt;li&gt;Test Issuer can create confidential MPT with canclawback without account flag&lt;/li&gt;
&lt;li&gt;Test Issuer can confidential clawback without account flag&lt;/li&gt;
&lt;li&gt;Test Setting asfAllowTrustLineClawback after MPT Issuance returns tecOWNERS&lt;/li&gt;
&lt;li&gt;Test Issuance without tfMPTCanClawback rejects confidential clawback even with account flag&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Crypto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Crypto wrapper generate keypair returns correctly sized hex&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper generate keypair is non deterministic&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper generate blinding factor is correctly sized and nondeterministic&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper encrypt decrypt round trip&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper decrypt with wrong privkey does not silently succeed&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper decrypt amount outside range returns rc minus 1&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper decrypt at exact range bounds inclusive&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper elgamal round trip is homomorphic consistent&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper same plaintext distinct blinding yields distinct ciphertexts&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper encrypt with explicit blinding factor is deterministic&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper pedersen commitment is deterministic in inputs&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper pedersen commitment differs on different amount&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper encrypt with wrong sized pubkey raises valueerror&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper decrypt with wrong sized privkey raises valueerror&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper encrypt with wrong sized blinding factor raises valueerror&lt;/li&gt;
&lt;li&gt;Test Crypto wrapper pedersen commitment with wrong sized bf raises valueerror&lt;/li&gt;
&lt;li&gt;Test Default range decrypts small amount&lt;/li&gt;
&lt;li&gt;Test Narrow range decrypts value within range&lt;/li&gt;
&lt;li&gt;Test Below range returns failure&lt;/li&gt;
&lt;li&gt;Test Above range returns failure&lt;/li&gt;
&lt;li&gt;Test Boundary low and high both decrypt&lt;/li&gt;
&lt;li&gt;Test Inverted range returns failure&lt;/li&gt;
&lt;li&gt;Test Zero excluded when range low gt zero&lt;/li&gt;
&lt;li&gt;Test Auditor decrypts real ciphertext with explicit range end to end&lt;/li&gt;
&lt;li&gt;Test Auditor decrypts initial convert balance to actual amount&lt;/li&gt;
&lt;li&gt;Test Auditor view decreases correctly after sender sends&lt;/li&gt;
&lt;li&gt;Test Auditor view increases correctly after receiver merges&lt;/li&gt;
&lt;li&gt;Test Auditor aggregate view equals Issuance confidential outstanding&lt;/li&gt;
&lt;li&gt;Test Auditor view unchanged across repeated rerandomization sends&lt;/li&gt;
&lt;li&gt;Test Auditor view zeros after full convert back&lt;/li&gt;
&lt;li&gt;Test Rerand destination inbox differs from tx ciphertext&lt;/li&gt;
&lt;li&gt;Test Rerand destination issuer mirror differs from tx ciphertext&lt;/li&gt;
&lt;li&gt;Test Rerand destination auditor mirror behavior&lt;/li&gt;
&lt;li&gt;Test Rerand sender spending balance is not rerandomized&lt;/li&gt;
&lt;li&gt;Test Rerand sender issuer mirror is not rerandomized&lt;/li&gt;
&lt;li&gt;Test Rerand multiple sends end to end decryption&lt;/li&gt;
&lt;li&gt;Test Rerand two consecutive sends produce different inbox deltas&lt;/li&gt;
&lt;li&gt;Test Rerand destination inbox changes under zero value send&lt;/li&gt;
&lt;li&gt;Test Rerand version counter increments once per send&lt;/li&gt;
&lt;li&gt;Test Rerand destination inbox and issuer mirror stay in lockstep per send&lt;/li&gt;
&lt;li&gt;Test Rerand send to self is rejected at preflight and does not mutate state&lt;/li&gt;
&lt;li&gt;Test Rerand two different senders to same destination compose correctly&lt;/li&gt;
&lt;li&gt;Test Rerand does not break issuer clawback path after send&lt;/li&gt;
&lt;li&gt;Test Rerand auditor mirror differs between two identical sends&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Hardening
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Send to destination requiring dest tag fails&lt;/li&gt;
&lt;li&gt;Test Send to destination requiring dest tag with tag succeeds&lt;/li&gt;
&lt;li&gt;Test Send with dest tag and auditor succeeds&lt;/li&gt;
&lt;li&gt;Test Send when destination authorized but never converted fails&lt;/li&gt;
&lt;li&gt;Test Send when sender authorized but never converted fails&lt;/li&gt;
&lt;li&gt;Test Send receiver confidential version unchanged&lt;/li&gt;
&lt;li&gt;Test Convert zero amount from individually frozen account fails&lt;/li&gt;
&lt;li&gt;Test Convert zero amount from globally frozen Issuance fails&lt;/li&gt;
&lt;li&gt;Test Convert zero amount from unauthorized account fails&lt;/li&gt;
&lt;li&gt;Test Holder unauthorize with nonzero confidential balance fails&lt;/li&gt;
&lt;li&gt;Test Issuance set rotate existing issuer encryption key fails&lt;/li&gt;
&lt;li&gt;Test Issuance set add auditor after holders have confidential balance fails&lt;/li&gt;
&lt;li&gt;Test Create with privacy locked off then enable attempt fails&lt;/li&gt;
&lt;li&gt;Test Create with invalid mutable flag bit fails&lt;/li&gt;
&lt;li&gt;Test Midflight auditor cannot be retrofitted after issuer key already set&lt;/li&gt;
&lt;li&gt;Test Midflight set require auth after holders have cb freezes unallowlisted&lt;/li&gt;
&lt;li&gt;Test Midflight change domain id strands holder not in new domain&lt;/li&gt;
&lt;li&gt;Test Midflight per holder lock blocks holder unauthorize&lt;/li&gt;
&lt;li&gt;Test Crash send all zero zkproof&lt;/li&gt;
&lt;li&gt;Test Crash send all ones zkproof&lt;/li&gt;
&lt;li&gt;Test Crash send random garbage zkproof&lt;/li&gt;
&lt;li&gt;Test Crash send bit flipped zkproof&lt;/li&gt;
&lt;li&gt;Test Crash send zero amount commitment&lt;/li&gt;
&lt;li&gt;Test Crash send zero balance commitment&lt;/li&gt;
&lt;li&gt;Test Crash send zero sender encrypted amount&lt;/li&gt;
&lt;li&gt;Test Crash send swapped sender dest ciphertexts&lt;/li&gt;
&lt;li&gt;Test Crash convert all zero zkproof&lt;/li&gt;
&lt;li&gt;Test Crash convert back all zero zkproof&lt;/li&gt;
&lt;li&gt;Test Crash clawback all zero zkproof&lt;/li&gt;
&lt;li&gt;Test Crash send rapid fire garbage proofs no corruption&lt;/li&gt;
&lt;li&gt;Test Acctdel holder with active cb s blocks account delete&lt;/li&gt;
&lt;li&gt;Test Acctdel holder with unmerged inbox blocks account delete&lt;/li&gt;
&lt;li&gt;Test Acctdel issuer with active confidential outstanding blocks&lt;/li&gt;
&lt;li&gt;Test Acctdel orphan mptoken after Issuance destroy full cleanup chain&lt;/li&gt;
&lt;li&gt;Test Acctdel issuer after destroy with outstanding orphan holders succeeds&lt;/li&gt;
&lt;li&gt;Test Acctdel stuck holder after issuer unauthorize with cb present&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Adversarial / Security
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Adversarial duplicate send txn&lt;/li&gt;
&lt;li&gt;Test Adversarial stale send proof after merge&lt;/li&gt;
&lt;li&gt;Test Adversarial reuse convert proof after state change&lt;/li&gt;
&lt;li&gt;Test Adversarial reuse convert back proof after state change&lt;/li&gt;
&lt;li&gt;Test Adversarial two sends exceed balance same ledger&lt;/li&gt;
&lt;li&gt;Test Adversarial send and convert back same balance same ledger&lt;/li&gt;
&lt;li&gt;Test Adversarial send vs clawback race same ledger&lt;/li&gt;
&lt;li&gt;Test Adversarial valid ec point wrong value&lt;/li&gt;
&lt;li&gt;Test Adversarial send amount commitment aliased to balance commitment&lt;/li&gt;
&lt;li&gt;Test Adversarial swap holder and issuer encrypted amounts&lt;/li&gt;
&lt;li&gt;Test Adversarial zero byte zkproof&lt;/li&gt;
&lt;li&gt;Test Adversarial proof for different statement&lt;/li&gt;
&lt;li&gt;Test Adversarial point on wrong curve&lt;/li&gt;
&lt;li&gt;Test Adversarial identity element as ciphertext&lt;/li&gt;
&lt;li&gt;Test Adversarial all zero blinding factor&lt;/li&gt;
&lt;li&gt;Test Adversarial range proof negative modular&lt;/li&gt;
&lt;li&gt;Test Adversarial nonce reuse across sends&lt;/li&gt;
&lt;li&gt;Test Adversarial wrong holder key in send&lt;/li&gt;
&lt;li&gt;Test Adversarial holder amount encrypted under issuer key&lt;/li&gt;
&lt;li&gt;Test Adversarial issuer amount encrypted under holder key&lt;/li&gt;
&lt;li&gt;Test Adversarial valid proof wrong account signature&lt;/li&gt;
&lt;li&gt;Test Adversarial key hijacking first convert&lt;/li&gt;
&lt;li&gt;Test Adversarial auditor amount wrong key&lt;/li&gt;
&lt;li&gt;Test Adversarial auditor amount different value&lt;/li&gt;
&lt;li&gt;Test Adversarial stale auditor key after rotation&lt;/li&gt;
&lt;li&gt;Test Adversarial range proof near uint64 overflow&lt;/li&gt;
&lt;li&gt;Test Adversarial cb in amount tampered&lt;/li&gt;
&lt;li&gt;Test Adversarial convert back tampered amount exceeds proof&lt;/li&gt;
&lt;li&gt;Test Adversarial send from inbox without merge&lt;/li&gt;
&lt;li&gt;Test Adversarial convert then immediate convert back same ledger&lt;/li&gt;
&lt;li&gt;Test Adversarial clawback from destroyed mptoken&lt;/li&gt;
&lt;li&gt;Test Adversarial clawback after holder converts back to zero&lt;/li&gt;
&lt;li&gt;Test Adversarial send with extra unknown fields&lt;/li&gt;
&lt;li&gt;Test Adversarial send all required fields missing&lt;/li&gt;
&lt;li&gt;Test Adversarial holder encrypted amount wrong byte length&lt;/li&gt;
&lt;li&gt;Test Adversarial issuer encrypted amount truncated&lt;/li&gt;
&lt;li&gt;Test Adversarial zkproof truncated&lt;/li&gt;
&lt;li&gt;Test Adversarial zkproof padded with extra bytes&lt;/li&gt;
&lt;li&gt;Test Adversarial confidential state persists across operations&lt;/li&gt;
&lt;li&gt;Test Adversarial two sends canonical order&lt;/li&gt;
&lt;li&gt;Test Adversarial replay with new sequence&lt;/li&gt;
&lt;li&gt;Test Adversarial cross type zkp replay&lt;/li&gt;
&lt;li&gt;Test Adversarial non issuer clawback valid zkp&lt;/li&gt;
&lt;li&gt;Test Adversarial third party merge inbox valid zkp&lt;/li&gt;
&lt;li&gt;Test Adversarial enable privacy on existing transfer fee Issuance reverse mutex&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Invariants
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Inv send increments version when spending changes&lt;/li&gt;
&lt;li&gt;Test Inv convert creates consistent encrypted fields&lt;/li&gt;
&lt;li&gt;Test Inv send preserves encrypted field coexistence&lt;/li&gt;
&lt;li&gt;Test Inv convert token conservation holder and issuer side&lt;/li&gt;
&lt;li&gt;Test Inv send does not modify public mptamount at either end&lt;/li&gt;
&lt;li&gt;Test Inv send does not modify Issuance outstandingamount&lt;/li&gt;
&lt;li&gt;Test Inv clawback decreases coa and oa by identical amount&lt;/li&gt;
&lt;li&gt;Test Clawback under global lock no invariant&lt;/li&gt;
&lt;li&gt;Test Convert back under global lock returns teclocked&lt;/li&gt;
&lt;li&gt;Test Inv coa never exceeds oa through chain&lt;/li&gt;
&lt;li&gt;Test Inv send with tampered amount commitment rejected leaves coa unchanged&lt;/li&gt;
&lt;li&gt;Test Inv full clawback zeros holder cb and removes their coa contribution&lt;/li&gt;
&lt;li&gt;Test Inv full convert back chain leaves no orphan confidential state&lt;/li&gt;
&lt;li&gt;Test Convert with zero amount asymmetric behavior probe&lt;/li&gt;
&lt;li&gt;Test Convert back with zero amount returns temBAD AMOUNT&lt;/li&gt;
&lt;li&gt;Test Clawback with zero amount returns temBAD AMOUNT&lt;/li&gt;
&lt;li&gt;Test Send to self returns temMALFORMED&lt;/li&gt;
&lt;li&gt;Test Convert with amount exceeding public balance returns tecINSUFFICIENT FUNDS&lt;/li&gt;
&lt;li&gt;Test Two issuances independent version counters&lt;/li&gt;
&lt;li&gt;Test Two issuances independent coa accounting&lt;/li&gt;
&lt;li&gt;Test Two issuances independent auditor decryption&lt;/li&gt;
&lt;li&gt;Test Account delete blocked when alice has cb on one of two issuances&lt;/li&gt;
&lt;li&gt;Test Convert back on Issuance a does not affect balance on b&lt;/li&gt;
&lt;li&gt;Test Clawback on Issuance a does not affect balance on b&lt;/li&gt;
&lt;li&gt;Test scenario A send with auditor all zero zkproof rejected&lt;/li&gt;
&lt;li&gt;Test scenario A send with auditor random garbage zkproof rejected&lt;/li&gt;
&lt;li&gt;Test scenario A send with auditor bit flipped zkproof rejected&lt;/li&gt;
&lt;li&gt;Test scenario A send with auditor truncated zkproof rejected&lt;/li&gt;
&lt;li&gt;Test scenario B convert MPT amount as string above 2 pow 32 succeeds&lt;/li&gt;
&lt;li&gt;Test scenario B convert MPT amount as int above 2 pow 32 is rejected&lt;/li&gt;
&lt;li&gt;Test scenario B convert two holders summing above 2 pow 32 keeps coa correct&lt;/li&gt;
&lt;li&gt;Test scenario B Issuance create with maximum amount at 2 pow 63 minus 1&lt;/li&gt;
&lt;li&gt;Test scenario B Issuance create with maximum amount above 2 pow 63 is rejected&lt;/li&gt;
&lt;li&gt;Test scenario C convert back from inbox only no spending is rejected&lt;/li&gt;
&lt;li&gt;Test scenario C send from inbox only no spending is rejected&lt;/li&gt;
&lt;li&gt;Test scenario C merge inbox after inbox only state promotes value to spending&lt;/li&gt;
&lt;li&gt;Test scenario D send after issuer unauthorizes sender fails&lt;/li&gt;
&lt;li&gt;Test scenario E clawback after issuer unauthorizes holder succeeds&lt;/li&gt;
&lt;li&gt;Test scenario F three holder full chain conserves total value&lt;/li&gt;
&lt;li&gt;Test scenario F two Issuance concurrent chains remain isolated&lt;/li&gt;
&lt;li&gt;Test scenario H zero amount convert registers holder key and enables inbound send&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Batch / Composition
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch confidential MPT two sends with stale proof allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT independent send with one failing&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT convert then merge inbox allornothing&lt;/li&gt;
&lt;li&gt;Test Batch delegated send missing permission allornothing&lt;/li&gt;
&lt;li&gt;Test Batch delegated send with delegate as outer needs no batch signer&lt;/li&gt;
&lt;li&gt;Test Batch delegated send with delegate as outer with batch signer&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT two chained sends same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT send then convert back same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT three chained sends same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential MPT chained send wrong predicted ciphertext fails&lt;/li&gt;
&lt;li&gt;Test Batch only one with two valid chained sends executes first only&lt;/li&gt;
&lt;li&gt;Test Batch only one first send to unconverted fails falls through to second&lt;/li&gt;
&lt;li&gt;Test Batch until failure first send commits then stale second fails&lt;/li&gt;
&lt;li&gt;Test Batch allornothing issuer lock then alice send rolls back both&lt;/li&gt;
&lt;li&gt;Test Batch independent three holders converts coa aggregate correct&lt;/li&gt;
&lt;li&gt;Test Batch allornothing inner revokes delegate then later inner uses it rolls back&lt;/li&gt;
&lt;li&gt;Test Batch two chained delegated sends from same delegator both commit&lt;/li&gt;
&lt;li&gt;Test Delegated send after delegator loses domain membership fails&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Delegation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Delegate confidential MPT send basic&lt;/li&gt;
&lt;li&gt;Test Delegate confidential MPT send missing permission&lt;/li&gt;
&lt;li&gt;Test Delegate confidential MPT convert&lt;/li&gt;
&lt;li&gt;Test Delegate confidential MPT merge inbox&lt;/li&gt;
&lt;li&gt;Test Delegate confidential MPT convert back&lt;/li&gt;
&lt;li&gt;Test Delegate confidential MPT clawback by issuer&lt;/li&gt;
&lt;li&gt;Test Delegate neg send perm only cannot convert back&lt;/li&gt;
&lt;li&gt;Test Delegate neg convert back perm only cannot send&lt;/li&gt;
&lt;li&gt;Test Delegate neg clawback with non issuer account rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Delegate neg revoked permission blocks subsequent use&lt;/li&gt;
&lt;li&gt;Test Delegate neg self delegation rejected&lt;/li&gt;
&lt;li&gt;Test Delegate neg send with proof over delegate keys rejected&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cross-Feature
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Ticket based first convert succeeds when proof binds to ticket seq&lt;/li&gt;
&lt;li&gt;Test Ticket based send succeeds when proof binds to ticket seq&lt;/li&gt;
&lt;li&gt;Test Ticket based send with wrong seq in proof returns tecBAD PROOF&lt;/li&gt;
&lt;li&gt;Test Ticket based convert back succeeds when proof binds to ticket seq&lt;/li&gt;
&lt;li&gt;Test Ticket based send with nonzero sequence returns temSEQ AND TICKET&lt;/li&gt;
&lt;li&gt;Test Ticket based send with nonexistent ticket is rejected&lt;/li&gt;
&lt;li&gt;Test Ticket based send consumes ticket even on tecBAD PROOF&lt;/li&gt;
&lt;li&gt;Test Ticket based send with matching credential succeeds&lt;/li&gt;
&lt;li&gt;Test Escrow create with MPT locks only public balance&lt;/li&gt;
&lt;li&gt;Test Escrow finish credits destination public not CB&lt;/li&gt;
&lt;li&gt;Test Confidential send succeeds with active outgoing escrow&lt;/li&gt;
&lt;li&gt;Test Escrow create amount exceeding unlocked public returns tecINSUFFICIENT FUNDS&lt;/li&gt;
&lt;li&gt;Test Check create then cash on privacy MPT does not touch either side CB&lt;/li&gt;
&lt;li&gt;Test Convert amount capped by unlocked public not total owned&lt;/li&gt;
&lt;li&gt;Test Vault create with confidential enabled MPT succeeds&lt;/li&gt;
&lt;li&gt;Test Vault deposit preserves holder confidential state&lt;/li&gt;
&lt;li&gt;Test Vault deposit fails when holder has no public balance&lt;/li&gt;
&lt;li&gt;Test Vault withdraw preserves destination confidential state&lt;/li&gt;
&lt;li&gt;Test Vault pseudo mptoken has no confidential fields after deposit&lt;/li&gt;
&lt;li&gt;Test Vault confidential clawback independent of vault holdings&lt;/li&gt;
&lt;li&gt;Test Send at exactly 10x base fee succeeds&lt;/li&gt;
&lt;li&gt;Test Send at one drop below 10x base fee returns telINSUF FEE P&lt;/li&gt;
&lt;li&gt;Test First convert does not change holder owner count&lt;/li&gt;
&lt;li&gt;Test Issuance create then key register bumps issuer owner count by exactly 1&lt;/li&gt;
&lt;li&gt;Test Five confidential sends drain alice xrp by exactly 5x send fee&lt;/li&gt;
&lt;li&gt;Test Memo on confidential send does not affect proof&lt;/li&gt;
&lt;li&gt;Test Multi sig confidential send at exactly required fee succeeds&lt;/li&gt;
&lt;li&gt;Test Multi sig confidential send at one drop below required returns telINSUF FEE P&lt;/li&gt;
&lt;li&gt;Test Convert does not update sfOutstandingAmount&lt;/li&gt;
&lt;li&gt;Test Convert fee multiplier 10x bounds&lt;/li&gt;
&lt;li&gt;Test Merge inbox fee multiplier 10x bounds&lt;/li&gt;
&lt;li&gt;Test Convert back fee multiplier 10x bounds&lt;/li&gt;
&lt;li&gt;Test Clawback fee multiplier 10x bounds&lt;/li&gt;
&lt;li&gt;Test Send to deposit auth destination without preauth fails&lt;/li&gt;
&lt;li&gt;Test Send to deposit auth destination after direct preauth succeeds&lt;/li&gt;
&lt;li&gt;Test Send to deposit auth destination after unauth fails again&lt;/li&gt;
&lt;li&gt;Test Send to deposit auth destination with matching credential succeeds&lt;/li&gt;
&lt;li&gt;Test Send after credential deleted fails with nonexistent credential&lt;/li&gt;
&lt;li&gt;Test Send with third party credential id fails&lt;/li&gt;
&lt;li&gt;Test Send with unaccepted credential fails&lt;/li&gt;
&lt;li&gt;Test Send with duplicate credential ids fails&lt;/li&gt;
&lt;li&gt;Test Send with credential ids when destination has no deposit auth succeeds&lt;/li&gt;
&lt;li&gt;Test Credential based send with frozen destination fails with lock&lt;/li&gt;
&lt;li&gt;Test Failed credential based send does not credit destination inbox&lt;/li&gt;
&lt;li&gt;Test Credential based send credits all encrypted amounts when auditor present&lt;/li&gt;
&lt;li&gt;Test Issuance set domain id on Issuance without require auth fails&lt;/li&gt;
&lt;li&gt;Test Issuance set nonexistent domain id fails&lt;/li&gt;
&lt;li&gt;Test Confidential send in permissioned domain succeeds&lt;/li&gt;
&lt;li&gt;Test Pd payment to uncredentialed holder blocks funding&lt;/li&gt;
&lt;li&gt;Test Pd send when destination credential revoked blocks send&lt;/li&gt;
&lt;li&gt;Test Pd send when sender credential revoked blocks send&lt;/li&gt;
&lt;li&gt;Test Pd send after domain id added post convert succeeds for credentialed&lt;/li&gt;
&lt;li&gt;Test Pd clear domain id via zero sentinel revokes holder authorization&lt;/li&gt;
&lt;li&gt;Test Pd send with unaccepted destination credential blocks send&lt;/li&gt;
&lt;li&gt;Test Convert with reserve sponsor returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Merge inbox with reserve sponsor returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Send with reserve sponsor returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Convert back with reserve sponsor returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Clawback with reserve sponsor returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Send with fee plus reserve flags returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Send with zero sponsor flags returns temINVALID FLAG&lt;/li&gt;
&lt;li&gt;Test Send with sponsor equal account returns temMALFORMED&lt;/li&gt;
&lt;li&gt;Test Prefunded fee sponsorship for confidential send succeeds&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bug Hunt
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test sum IssuerEncryptedBalance equals coa after multi hop&lt;/li&gt;
&lt;li&gt;Test IssuerEncryptedBalance zero after full clawback&lt;/li&gt;
&lt;li&gt;Test IssuerEncryptedBalance decrypts to expected after partial send&lt;/li&gt;
&lt;li&gt;Test stale version send rejected after intervening send&lt;/li&gt;
&lt;li&gt;Test convertback tampered MPT amount field rejected&lt;/li&gt;
&lt;li&gt;Test send balance commitment all zero bytes rejected&lt;/li&gt;
&lt;li&gt;Test send amount commitment all zero bytes rejected&lt;/li&gt;
&lt;li&gt;Test holder key immutable second convert with new key rejected&lt;/li&gt;
&lt;li&gt;Test convert with holder key equal to issuer key rejected&lt;/li&gt;
&lt;li&gt;Test first convert initializes spending to enczero and version zero&lt;/li&gt;
&lt;li&gt;Test second convert does not mutate spending or version&lt;/li&gt;
&lt;li&gt;Test issuer can re encrypt holder balance under new auditor key off chain&lt;/li&gt;
&lt;li&gt;Test enable auditor after convert send should not tefinternal&lt;/li&gt;
&lt;li&gt;Test mergeinbox on encrypted zero inbox version semantics&lt;/li&gt;
&lt;li&gt;Test stale send proof after clawback rejected&lt;/li&gt;
&lt;li&gt;Test zero amount convert registers key and accepts inbound&lt;/li&gt;
&lt;li&gt;Test send ciphertext under wrong key reaches bad proof not internal&lt;/li&gt;
&lt;li&gt;Test send swap ciphertexts from different amount proof rejected&lt;/li&gt;
&lt;li&gt;Test send to authorized but unconverted holder clean reject&lt;/li&gt;
&lt;li&gt;Test batch ct sends allornothing rolls back version on final failure&lt;/li&gt;
&lt;li&gt;Test freeze and send same ledger ordering is clean&lt;/li&gt;
&lt;li&gt;Test iss enc key reset after full clawback blocked pre reset&lt;/li&gt;
&lt;li&gt;Test convert with holder key not owned by account silent loss&lt;/li&gt;
&lt;li&gt;Test convert at coa boundary rejects cleanly not internal&lt;/li&gt;
&lt;li&gt;Test Add auditor after zero amount convert does not crash next convert&lt;/li&gt;
&lt;li&gt;Test Add auditor after convert convertback roundtrip blocked by gates&lt;/li&gt;
&lt;li&gt;Test Convert back amount within cb s plus cb in but exceeding cb s rejected&lt;/li&gt;
&lt;li&gt;Test Recipient merge between two sender sends does not break sender&lt;/li&gt;
&lt;li&gt;Test Clawback when holder has only unmerged inbox state reset correctly&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>automation</category>
      <category>blockchain</category>
      <category>crypto</category>
      <category>testing</category>
    </item>
    <item>
      <title>Sponsored Fees and Reserves — Performance Test Report</title>
      <dc:creator>Qi Zhao</dc:creator>
      <pubDate>Tue, 22 Sep 2026 15:07:34 +0000</pubDate>
      <link>https://dev.to/ripplexdev/sponsored-fees-and-reserves-performance-test-report-10da</link>
      <guid>https://dev.to/ripplexdev/sponsored-fees-and-reserves-performance-test-report-10da</guid>
      <description>&lt;p&gt;&lt;em&gt;By Hitesh Gandhi(&lt;a class="mentioned-user" href="https://dev.to/hgandhi"&gt;@hgandhi&lt;/a&gt;) and Qi Zhao&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Sponsor&lt;/code&gt; amendment (&lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0068-sponsored-fees-and-reserves" rel="noopener noreferrer"&gt;XLS-68: Sponsored Fees and Reserves&lt;/a&gt;) introduces a way for one XRPL account to pay transaction fees and owner reserves on behalf of another account without taking custody of that account's XRP. This lets exchanges, wallets, token issuers, and applications simplify onboarding by covering network costs for their users while those users retain full control of their keys and accounts.&lt;/p&gt;

&lt;p&gt;XLS-68 supports two sponsorship modes. In &lt;strong&gt;co-signed&lt;/strong&gt; sponsorship, the sponsor's signature is attached to each transaction via the &lt;code&gt;Sponsor&lt;/code&gt; transaction field. In &lt;strong&gt;pre-funded&lt;/strong&gt; sponsorship, the sponsor creates a &lt;code&gt;Sponsorship&lt;/code&gt; ledger object holding a fee pool (&lt;code&gt;FeeAmount&lt;/code&gt;) and a per-transaction ceiling (&lt;code&gt;MaxFee&lt;/code&gt;), so the sponsee can transact without the sponsor co-signing every time. Two new transaction types are added — &lt;code&gt;SponsorshipSet&lt;/code&gt; and &lt;code&gt;SponsorshipTransfer&lt;/code&gt; — and sponsorship applies to both account and object reserves.&lt;/p&gt;

&lt;p&gt;The performance of XLS-68 was evaluated in a private XRPL performance network running production-representative infrastructure. Testing covered mixed-load simulations, stress testing at 2× baseline capacity, endurance runs of up to 5 hours, 2-signer multisign validation, and complex 6-path/8-step pathfinding under sponsorship load.&lt;/p&gt;




&lt;h2&gt;
  
  
  Executive Summary
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Sponsor&lt;/code&gt; amendment introduces no measurable performance degradation to XRPL consensus processing.&lt;/p&gt;

&lt;p&gt;Under the most demanding realistic workload — 12 transaction types including complex 6-path/8-step DEX pathfinding alongside all sponsorship operations — the network sustained &lt;strong&gt;322 TPS aggregate with zero overvalidations&lt;/strong&gt; in the 60-minute flagship run. Under 2× stress, the network delivered &lt;strong&gt;450 TPS sustained&lt;/strong&gt; with a peak burst of &lt;strong&gt;655 TPS&lt;/strong&gt; and zero overvalidations: a &lt;strong&gt;90.9% throughput increase for only a 6.6% increase in close rate&lt;/strong&gt;, demonstrating sublinear consensus overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Performance Metrics at a Glance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Significance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Peak sustained throughput&lt;/td&gt;
&lt;td&gt;450 TPS&lt;/td&gt;
&lt;td&gt;2× baseline with zero overvalidations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg consensus latency&lt;/td&gt;
&lt;td&gt;3.54–3.89 s&lt;/td&gt;
&lt;td&gt;Well within 5-second target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P95 consensus latency&lt;/td&gt;
&lt;td&gt;3.95–4.27 s&lt;/td&gt;
&lt;td&gt;No tail-latency concerns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidation rate&lt;/td&gt;
&lt;td&gt;≤ 0.4% per run&lt;/td&gt;
&lt;td&gt;Negligible across all test phases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validator out-of-sync events&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Perfect consensus alignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2P node out-of-sync events&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Full network stability maintained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error rate (sponsorship TXs)&lt;/td&gt;
&lt;td&gt;≤ 0.23%&lt;/td&gt;
&lt;td&gt;Production-grade reliability&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The results show that XLS-68 is performant, stable, and ready for MainNet activation from a performance perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification reference:&lt;/strong&gt; &lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0068-sponsored-fees-and-reserves" rel="noopener noreferrer"&gt;XLS-0068: Sponsored Fees and Reserves&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Objectives
&lt;/h2&gt;

&lt;p&gt;The primary objective was to validate that sponsored transaction processing does not degrade XRPL consensus health under sustained and burst loads. Specifically, we aimed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate that mixed sponsored and non-sponsored workloads maintain sub-5-second consensus latency under sustained load.&lt;/li&gt;
&lt;li&gt;Stress test at 2× baseline to identify capacity headroom and breaking points.&lt;/li&gt;
&lt;li&gt;Measure per-transaction-type throughput, latency, and error rates across all sponsorship modes (pre-funded, co-signed, multisign).&lt;/li&gt;
&lt;li&gt;Validate endurance stability, confirming no memory leaks, CPU drift, or progressive degradation.&lt;/li&gt;
&lt;li&gt;Confirm that sponsorship transactions coexist safely with the most computationally expensive XRPL operations (6-path/8-step DEX pathfinding).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Testing Methodology
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Capacity Planning
&lt;/h3&gt;

&lt;p&gt;The 5-second consensus latency limit serves as the benchmark for network capacity. Any ledger whose publishing latency exceeds this threshold is counted as an "overvalidation." The methodology targets a load level at which the network sustainably maintains sub-5-second close rates, then pushes to 2× that baseline to characterize stress behavior.&lt;/p&gt;

&lt;p&gt;Throughout this report, &lt;strong&gt;close rate&lt;/strong&gt; refers to ledger publishing latency (the interval at which validated ledgers are published), and &lt;strong&gt;TPS&lt;/strong&gt; refers to aggregate ledger throughput across all transaction types.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Environment
&lt;/h3&gt;

&lt;p&gt;Testing was conducted in a private XRPL environment with 9 nodes, mirroring Ripple's MainNet hardware specifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 nodes function as validator nodes&lt;/li&gt;
&lt;li&gt;4 nodes serve as client P2P nodes, interfacing with load generators&lt;/li&gt;
&lt;li&gt;All nodes are hosted on AWS EC2 &lt;code&gt;z1d.2xlarge&lt;/code&gt; instances: 8 CPU cores, 64 GB RAM, 300 GB NVMe SSD&lt;/li&gt;
&lt;li&gt;All nodes operate within the same AWS region, interconnected via a shared LAN&lt;/li&gt;
&lt;li&gt;4 distributed load generators (ch0–ch3) submit transactions to the 4 P2P nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;xrpld Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The xrpld configuration was sourced from a Ripple MainNet validator, with modifications made only as required for the test environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Data Setup
&lt;/h3&gt;

&lt;p&gt;A dedicated data strategy was developed for XLS-68 testing. At a high level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Account isolation:&lt;/strong&gt; Sponsor and sponsee account pools were provisioned separately from the baseline transaction accounts, so the two workloads could not interfere with one another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balance stability:&lt;/strong&gt; Payment destinations were arranged so that XRP balances remained stable across long-duration runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; Roughly 100,000 sponsor/sponsee account pairs were distributed across the four load generators. Pre-funded sponsorship objects were provisioned with a fee pool and a per-transaction fee ceiling, and multisign scenarios used 8,000 master accounts with a 2-signer quorum, signed client-side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Test Phases and Progression
&lt;/h3&gt;

&lt;p&gt;Testing followed a progressive strategy designed to systematically validate every dimension of sponsorship performance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Objective&lt;/th&gt;
&lt;th&gt;Load Profile&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Phase 1: Mixed Load&lt;/td&gt;
&lt;td&gt;Validate sponsored TX processing alongside baseline payments&lt;/td&gt;
&lt;td&gt;240 TPS (6 TX types)&lt;/td&gt;
&lt;td&gt;3 × 30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 2: Endurance&lt;/td&gt;
&lt;td&gt;Confirm stability under sustained load; detect memory leaks&lt;/td&gt;
&lt;td&gt;240 TPS constant&lt;/td&gt;
&lt;td&gt;2 × 4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 3: Stress (2×)&lt;/td&gt;
&lt;td&gt;Identify breaking points by doubling baseline throughput&lt;/td&gt;
&lt;td&gt;480 TPS constant&lt;/td&gt;
&lt;td&gt;2 × 30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 4: Multisign&lt;/td&gt;
&lt;td&gt;Validate 2-signer multisign overhead and endurance&lt;/td&gt;
&lt;td&gt;80 TPS multisign&lt;/td&gt;
&lt;td&gt;2 × 30 min + 2 × 5 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 5: Full Mixed Load + 6-Path/8-Step&lt;/td&gt;
&lt;td&gt;Production-realistic simulation with complex pathfinding&lt;/td&gt;
&lt;td&gt;322 TPS (12 TX types incl. pathfinding)&lt;/td&gt;
&lt;td&gt;30 min + 30 min + 60 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge Cases&lt;/td&gt;
&lt;td&gt;1:N sponsorship, termination flows&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Transaction Scenarios Under Test
&lt;/h3&gt;

&lt;p&gt;The sponsorship mixed-load model distributes transactions across the following types at 240 TPS aggregate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transaction Type&lt;/th&gt;
&lt;th&gt;Sponsorship Mode&lt;/th&gt;
&lt;th&gt;Target TPS&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Normal XRP Payment&lt;/td&gt;
&lt;td&gt;None (baseline)&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Non-sponsored XRP-to-XRP payment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefund Payment&lt;/td&gt;
&lt;td&gt;Pre-funded fee&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Sponsored payment where sponsor pays fee via &lt;code&gt;Sponsorship&lt;/code&gt; pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cosigned Payment&lt;/td&gt;
&lt;td&gt;Co-signed&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Sponsored payment with dual signature (sponsor + sponsee)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sponsored OfferCreate&lt;/td&gt;
&lt;td&gt;Co-signed&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;DEX offer creation with sponsor covering reserve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipSet + CheckCreate&lt;/td&gt;
&lt;td&gt;Pre-funded&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Create sponsorship pool + sponsored check creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipTransfer (Account)&lt;/td&gt;
&lt;td&gt;Transfer&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Transfer entire account sponsorship to a different sponsor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipTransfer (Object)&lt;/td&gt;
&lt;td&gt;Transfer&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Transfer individual object sponsorship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipSet (Delete)&lt;/td&gt;
&lt;td&gt;Termination&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Terminate sponsorship relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The full mixed load with 6-path/8-step pathfinding extends this to &lt;strong&gt;12 transaction types at a ~334 TPS target&lt;/strong&gt; by adding IOU Direct, 1Path1Step, 3Path3Step, and DEX 6-path/8-step payments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Detailed Performance Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1 — Mixed Load Testing
&lt;/h3&gt;

&lt;p&gt;Three 30-minute mixed load runs were conducted at 240 TPS aggregate, combining sponsored and non-sponsored transactions. All three runs demonstrated highly consistent throughput and latency.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Run 1&lt;/th&gt;
&lt;th&gt;Run 2&lt;/th&gt;
&lt;th&gt;Run 3&lt;/th&gt;
&lt;th&gt;Assessment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ledgers Processed&lt;/td&gt;
&lt;td&gt;511&lt;/td&gt;
&lt;td&gt;544&lt;/td&gt;
&lt;td&gt;545&lt;/td&gt;
&lt;td&gt;Consistent ledger production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;431,247&lt;/td&gt;
&lt;td&gt;437,095&lt;/td&gt;
&lt;td&gt;436,915&lt;/td&gt;
&lt;td&gt;~437K per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;236.03&lt;/td&gt;
&lt;td&gt;236.54&lt;/td&gt;
&lt;td&gt;234.99&lt;/td&gt;
&lt;td&gt;Stable at target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;345.00&lt;/td&gt;
&lt;td&gt;296.33&lt;/td&gt;
&lt;td&gt;299.56&lt;/td&gt;
&lt;td&gt;Healthy burst capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.65&lt;/td&gt;
&lt;td&gt;3.60&lt;/td&gt;
&lt;td&gt;3.59&lt;/td&gt;
&lt;td&gt;Well under 5 s target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Negligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validator out-of-sync&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Perfect sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2P out-of-sync&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Perfect sync&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; Across the three runs, throughput held steady at approximately 235 TPS and consensus latency remained well below the 5-second target. The core sponsorship transaction mix integrates cleanly with baseline XRPL payment processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2 — Endurance Testing
&lt;/h3&gt;

&lt;p&gt;Two independent 4-hour endurance runs validated sustained performance and memory stability under continuous sponsorship load.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Endurance Run 1&lt;/th&gt;
&lt;th&gt;Endurance Run 2&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledgers Processed&lt;/td&gt;
&lt;td&gt;4,041&lt;/td&gt;
&lt;td&gt;4,042&lt;/td&gt;
&lt;td&gt;+0.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;3,209,083&lt;/td&gt;
&lt;td&gt;3,241,171&lt;/td&gt;
&lt;td&gt;+1.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;223.19&lt;/td&gt;
&lt;td&gt;224.97&lt;/td&gt;
&lt;td&gt;+0.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;436.24&lt;/td&gt;
&lt;td&gt;329.83&lt;/td&gt;
&lt;td&gt;Run 1 spike during online delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.61&lt;/td&gt;
&lt;td&gt;3.62&lt;/td&gt;
&lt;td&gt;+0.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Negligible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; The two endurance runs produced virtually identical results, confirming repeatability. The Max TPS spike in Run 1 (436 TPS) correlates with xrpld's periodic online deletion cycle, which temporarily frees resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3 — Stress Testing (2× Baseline)
&lt;/h3&gt;

&lt;p&gt;Load was doubled to 480 TPS aggregate to identify the network's capacity ceiling with sponsored transactions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Baseline (240 TPS)&lt;/th&gt;
&lt;th&gt;Stress (480 TPS)&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ledgers Processed&lt;/td&gt;
&lt;td&gt;511&lt;/td&gt;
&lt;td&gt;504&lt;/td&gt;
&lt;td&gt;−1.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;431,247&lt;/td&gt;
&lt;td&gt;841,494&lt;/td&gt;
&lt;td&gt;+95.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;236.03&lt;/td&gt;
&lt;td&gt;450.54&lt;/td&gt;
&lt;td&gt;+90.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;345.00&lt;/td&gt;
&lt;td&gt;655.45&lt;/td&gt;
&lt;td&gt;+90.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.65&lt;/td&gt;
&lt;td&gt;3.89&lt;/td&gt;
&lt;td&gt;+6.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Improved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validator out-of-sync&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2P out-of-sync&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Zero&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; Doubling the transaction load from 240 to 480 TPS resulted in only a 6.6% increase in average close rate (3.65 s → 3.89 s). The network processed 841K transactions in the stress window — nearly double the baseline — without degradation in consensus health.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4 — Multisign (2-Signer) Testing
&lt;/h3&gt;

&lt;p&gt;Multisign transactions add cryptographic overhead because multiple signatures must be verified. The multisign test used a 2-signer flow with client-side signing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Run 1 (30 min)&lt;/th&gt;
&lt;th&gt;Run 2 (30 min)&lt;/th&gt;
&lt;th&gt;Endurance 1 (5 hr)&lt;/th&gt;
&lt;th&gt;Endurance 2 (5 hr)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;146,880&lt;/td&gt;
&lt;td&gt;146,880&lt;/td&gt;
&lt;td&gt;1,442,880&lt;/td&gt;
&lt;td&gt;1,442,880&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;78.98&lt;/td&gt;
&lt;td&gt;78.40&lt;/td&gt;
&lt;td&gt;80.18&lt;/td&gt;
&lt;td&gt;80.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;103.97&lt;/td&gt;
&lt;td&gt;116.84&lt;/td&gt;
&lt;td&gt;305.43&lt;/td&gt;
&lt;td&gt;106.95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.543&lt;/td&gt;
&lt;td&gt;3.570&lt;/td&gt;
&lt;td&gt;3.546&lt;/td&gt;
&lt;td&gt;3.543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P95 Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.959&lt;/td&gt;
&lt;td&gt;3.947&lt;/td&gt;
&lt;td&gt;3.952&lt;/td&gt;
&lt;td&gt;3.954&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; 2-signer multisign transactions achieved the targeted 80 TPS with the lowest consensus latency of any phase (avg 3.54 s, P95 3.95 s), sustained across two 5-hour endurance runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 5 — Full Mixed Load with Complex Pathfinding
&lt;/h3&gt;

&lt;p&gt;This phase represents the most demanding and production-realistic test scenario, combining all sponsorship transaction types with complex cross-currency pathfinding.&lt;/p&gt;

&lt;h4&gt;
  
  
  Aggregate Results
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Run 1 (30 min)&lt;/th&gt;
&lt;th&gt;Run 2 (30 min)&lt;/th&gt;
&lt;th&gt;Run 3 (60 min)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ledgers Processed&lt;/td&gt;
&lt;td&gt;504&lt;/td&gt;
&lt;td&gt;509&lt;/td&gt;
&lt;td&gt;979&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;614,366&lt;/td&gt;
&lt;td&gt;614,201&lt;/td&gt;
&lt;td&gt;1,183,972&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;329&lt;/td&gt;
&lt;td&gt;330&lt;/td&gt;
&lt;td&gt;322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;464&lt;/td&gt;
&lt;td&gt;419&lt;/td&gt;
&lt;td&gt;416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate (s)&lt;/td&gt;
&lt;td&gt;3.894&lt;/td&gt;
&lt;td&gt;3.852&lt;/td&gt;
&lt;td&gt;3.842&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P95 Close Rate (s)&lt;/td&gt;
&lt;td&gt;4.272&lt;/td&gt;
&lt;td&gt;4.215&lt;/td&gt;
&lt;td&gt;4.158&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Per-Transaction Throughput Breakdown (60-Minute Run)
&lt;/h4&gt;

&lt;p&gt;The 60-minute test (Run 3) provides the most comprehensive view of sustained per-transaction performance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transaction Type&lt;/th&gt;
&lt;th&gt;Samples&lt;/th&gt;
&lt;th&gt;TPS&lt;/th&gt;
&lt;th&gt;Avg Latency (ms)&lt;/th&gt;
&lt;th&gt;P95 (ms)&lt;/th&gt;
&lt;th&gt;P99 (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prefund Payment&lt;/td&gt;
&lt;td&gt;218,156&lt;/td&gt;
&lt;td&gt;59.60&lt;/td&gt;
&lt;td&gt;19.81&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;190&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cosigned Payment&lt;/td&gt;
&lt;td&gt;145,440&lt;/td&gt;
&lt;td&gt;39.74&lt;/td&gt;
&lt;td&gt;20.43&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sponsored OfferCreate&lt;/td&gt;
&lt;td&gt;145,440&lt;/td&gt;
&lt;td&gt;39.74&lt;/td&gt;
&lt;td&gt;22.21&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;196&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipSet + CheckCreate&lt;/td&gt;
&lt;td&gt;33,332&lt;/td&gt;
&lt;td&gt;19.72&lt;/td&gt;
&lt;td&gt;32.87&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;297&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipTransfer (Account)&lt;/td&gt;
&lt;td&gt;72,720&lt;/td&gt;
&lt;td&gt;19.87&lt;/td&gt;
&lt;td&gt;18.79&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipTransfer (Object)&lt;/td&gt;
&lt;td&gt;72,720&lt;/td&gt;
&lt;td&gt;19.87&lt;/td&gt;
&lt;td&gt;18.44&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;193&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SponsorshipSet (Delete)&lt;/td&gt;
&lt;td&gt;9,321&lt;/td&gt;
&lt;td&gt;2.59&lt;/td&gt;
&lt;td&gt;14.62&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;313&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IOU Direct Payment&lt;/td&gt;
&lt;td&gt;109,078&lt;/td&gt;
&lt;td&gt;29.80&lt;/td&gt;
&lt;td&gt;18.30&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1Path1Step&lt;/td&gt;
&lt;td&gt;72,720&lt;/td&gt;
&lt;td&gt;19.87&lt;/td&gt;
&lt;td&gt;18.64&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3Path3Step&lt;/td&gt;
&lt;td&gt;72,720&lt;/td&gt;
&lt;td&gt;19.87&lt;/td&gt;
&lt;td&gt;22.46&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEX 6-Path/8-Step&lt;/td&gt;
&lt;td&gt;14,540&lt;/td&gt;
&lt;td&gt;3.97&lt;/td&gt;
&lt;td&gt;16.59&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; The 60-minute mixed load run processed transactions at 322 TPS aggregate with zero overvalidations. Even the 6-path/8-step DEX payments — the most computationally expensive operation in the mix — held an average latency of 16.59 ms with a P99 of 184 ms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edge Case Testing
&lt;/h3&gt;

&lt;h4&gt;
  
  
  One-to-Many (1:N) Sponsorship
&lt;/h4&gt;

&lt;p&gt;Validated a single sponsor account funding multiple sponsees concurrently:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pattern&lt;/td&gt;
&lt;td&gt;Single sponsor → multiple sponsees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;367,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg TPS&lt;/td&gt;
&lt;td&gt;198.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max TPS&lt;/td&gt;
&lt;td&gt;250.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Close Rate&lt;/td&gt;
&lt;td&gt;3.61 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overvalidations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Sponsorship Termination
&lt;/h4&gt;

&lt;p&gt;Bulk deletion of sponsorship relationships:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sponsorships Deleted&lt;/td&gt;
&lt;td&gt;40,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPS&lt;/td&gt;
&lt;td&gt;229.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observed Errors&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tefPAST_SEQ&lt;/code&gt;, &lt;code&gt;tecNO_ENTRY&lt;/code&gt; (expected under concurrent deletion)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  System Resource Utilization
&lt;/h2&gt;

&lt;p&gt;System-level metrics were monitored continuously via Grafana dashboards across all test phases. The following analysis covers CPU, memory, disk I/O, and network utilization patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  CPU Utilization
&lt;/h3&gt;

&lt;p&gt;CPU utilization on validator nodes tracked linearly with TPS load across all test phases. During the 2× stress test (450 TPS achieved), CPU utilization increased proportionally without approaching saturation. Refer to the Grafana charts below for detailed CPU utilization trends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Utilization
&lt;/h3&gt;

&lt;p&gt;Memory utilization remained flat throughout all test phases, with no indication of memory leaks or unbounded growth in the xrpld process. This was confirmed across both endurance rounds. Memory growth correlated with expected ledger object expansion (new &lt;code&gt;Sponsorship&lt;/code&gt; objects, accounts, and offers) and was consistent with patterns observed in prior XRPL feature performance tests. Refer to the Grafana charts below for detailed memory utilization trends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disk I/O
&lt;/h3&gt;

&lt;p&gt;Disk I/O patterns showed normal activity with periodic spikes correlating to xrpld's online delete cycles and log rotation. One notable observation from the endurance tests: a transient CPU spike was traced to &lt;code&gt;logrotate&lt;/code&gt; compressing xrpld logs, which momentarily saturated disk I/O. This is an operational artifact rather than a feature concern, and is mitigated by scheduling log rotation during off-peak hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network I/O
&lt;/h3&gt;

&lt;p&gt;Network utilization remained stable throughout all test phases, with no congestion or packet-loss events. Transaction propagation between P2P nodes and validators showed consistent sub-millisecond latency within the same-region LAN topology.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Utilization Charts (60-Minute Mixed Load)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  CPU
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8pdpaxeg4v4yka9gxznk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8pdpaxeg4v4yka9gxznk.png" alt="CPU utilization on validator nodes during the 60-minute mixed load run" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Memory
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwevhcpjea2owq9gnf013.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwevhcpjea2owq9gnf013.png" alt="Memory utilization on validator nodes during the 60-minute mixed load run" width="799" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Disk I/O
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo1seo3lgtlxz4h2p87rf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo1seo3lgtlxz4h2p87rf.png" alt="Disk read and write activity on validator nodes during the 60-minute mixed load run" width="799" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Network
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funm3f94boid55hwrfqbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funm3f94boid55hwrfqbt.png" alt="Network throughput on validator nodes during the 60-minute mixed load run" width="799" height="357"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The comprehensive performance evaluation of Sponsored Fees and Reserves (XLS-68) demonstrates that the amendment is ready, delivering high throughput, stable consensus, and efficient resource utilization across all tested scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary of Findings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Throughput.&lt;/strong&gt; Sponsored transactions achieved 235–450 TPS in mixed load configurations, with a peak burst of 655 TPS under 2× stress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consensus stability.&lt;/strong&gt; Average consensus latency ranged from 3.54 s to 3.89 s across all test phases, consistently below the 5-second target. Overvalidations never exceeded 2 ledgers in any single run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endurance.&lt;/strong&gt; Extended runs of 4 and 5 hours confirmed sustained performance with zero validator or P2P sync issues and predictable, bounded memory growth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex pathfinding coexistence.&lt;/strong&gt; The full mixed load with 6-path/8-step pathfinding — the most computationally demanding realistic scenario — achieved 322 TPS with zero overvalidations in the 60-minute run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multisign viability.&lt;/strong&gt; 2-signer multisign transactions sustained 80 TPS with sub-4-second consensus latency across two 5-hour endurance runs, processing 2.88 million transactions in total.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource efficiency.&lt;/strong&gt; CPU utilization remained well within capacity across all test phases including 2× stress, memory growth was bounded with no leaks detected, and no disk or network bottlenecks were observed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation
&lt;/h3&gt;

&lt;p&gt;Based on the results of this comprehensive performance evaluation, the Sponsored Fees and Reserves (XLS-68) amendment is recommended for MainNet activation. All test phases achieved PASS status, with the network demonstrating ample capacity, stable consensus, and production-grade reliability under diverse and demanding workload conditions.&lt;/p&gt;

</description>
      <category>xrpl</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>The XRP Ledger AI Starter Kit, v1.1: Open Standards, Not an Island</title>
      <dc:creator>Ajit Kulkarni</dc:creator>
      <pubDate>Tue, 15 Sep 2026 19:12:13 +0000</pubDate>
      <link>https://dev.to/ripplexdev/the-xrp-ledger-ai-starter-kit-v11-open-standards-not-an-island-358k</link>
      <guid>https://dev.to/ripplexdev/the-xrp-ledger-ai-starter-kit-v11-open-standards-not-an-island-358k</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;In mid-June, we launched the XRPL AI Starter Kit to help developers build agentic payment applications on the XRP Ledger.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Today we're shipping v1.1, adding support for two emerging cross-chain agent standards: the &lt;a href="https://openwallet.sh/" rel="noopener noreferrer"&gt;Open Wallet Standard (OWS)&lt;/a&gt; and &lt;a href="https://stripe.com/blog/machine-payments-protocol" rel="noopener noreferrer"&gt;Tempo and Stripe's Machine Payments Protocol (MPP)&lt;/a&gt;, a new CLI, &lt;code&gt;xrpl-up&lt;/code&gt;, for fast local testing, and a Skill for XRPL DEX trading.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The throughline: XRPL isn't building agentic payments in isolation. It's showing up in the standards the rest of the agent ecosystem is converging on, and giving developers reference implementations for each.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we introduced the &lt;a href="https://xrpl.org/docs/agents/agentic-transactions" rel="noopener noreferrer"&gt;XRPL AI Starter Kit&lt;/a&gt; in June, the goal was narrow and deliberate: give developers the fastest path from zero to a confirmed agent payment on the XRP Ledger, starting with X402 support for XRP and RLUSD. The XRPL has seen &lt;a href="https://xrpl-ai.org/" rel="noopener noreferrer"&gt;5.6M X402&lt;/a&gt; transactions since its inception.&lt;/p&gt;

&lt;p&gt;Since then, the agentic payments landscape has continued to evolve, and a few standards have emerged as genuine points of convergence rather than one-off frameworks. Wallet management is consolidating around shared, local-first interfaces instead of every tool reinventing its own keystore. And machine-to-machine settlement is consolidating around HTTP 402-based protocols that let any agent pay any service without an account or a checkout flow.&lt;/p&gt;

&lt;p&gt;XRPL AI Starter Kit v1.1 is about showing up in both of those places, not just the one we started with.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New in v1.1
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. XRPL support for the Open Wallet Standard (OWS)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://openwallet.sh/" rel="noopener noreferrer"&gt;OWS&lt;/a&gt; is an open specification for local-first, multi-chain wallet storage and agent access to a single encrypted vault and a single interface (CLI, MCP, SDK, or REST) for every chain and every tool an agent might use. Instead of an agent's keys scattered across a dozen tool-specific config files and environment variables, OWS keeps them in a single vault at &lt;code&gt;~/.ows/&lt;/code&gt;, decrypted only long enough to sign, then wiped from memory.&lt;/p&gt;

&lt;p&gt;With v1.1, XRPL is supported as a chain in OWS. A single &lt;code&gt;ows wallet create&lt;/code&gt; command now derives an XRPL address alongside addresses for every other chain OWS supports, and agents can request XRPL signatures through the same policy-gated &lt;code&gt;ows_sign&lt;/code&gt; interface they'd use for any other chain with no XRPL-specific key handling required.&lt;/p&gt;

&lt;p&gt;We're also shipping &lt;a href="https://xrpl.org/docs/agents/xrpl-agent-wallet-skill" rel="noopener noreferrer"&gt;docs&lt;/a&gt; that walk through creating an OWS-backed XRPL wallet, wiring it to an agent, and sending a signed payment, all without the agent ever touching a raw private key.&lt;/p&gt;

&lt;p&gt;Why this matters: Agent frameworks don't want to write custom key management code for each chain. By supporting OWS, XRPL becomes accessible through the same wallet layer that developers are already adopting across other ecosystems.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. XRPL support for Tempo's Machine Payments Protocol (MPP)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stripe.com/blog/machine-payments-protocol" rel="noopener noreferrer"&gt;MPP&lt;/a&gt;, co-authored by Tempo and Stripe, is an open standard for HTTP-native agent payments: a service returns a 402 status with a price, the agent authorizes payment, and the resource is delivered. No accounts, no checkout flows.&lt;/p&gt;

&lt;p&gt;XRPL is now a supported settlement rail for MPP, live today for two payment modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single (charge) payments in XRP, IOU, and MPT.&lt;/strong&gt; An agent hits a 402 challenge, the XRPL payment settles in 3–5 seconds with sub-cent fees, and the resource is delivered. Deterministic finality means the transaction either confirms or it doesn't, with no ambiguous pending state for the agent to poll or retry.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session payments via XRPL Payment Channels for XRP.&lt;/strong&gt; This is MPP's most powerful primitive: instead of settling every API call individually, an agent opens a payment channel once, streams cumulative signed vouchers off-chain as it consumes a service, and the provider settles the total in a single on-chain transaction at the end. XRPL Payment Channels were built for exactly this pattern, where vouchers can be signed at rates exceeding 100,000 per second, verified locally by the provider with no blockchain call required, and the whole session costs just two on-chain transactions: open and close.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stablecoin support for session payments is next. XRPL is adding IOU and MPT support to payment channels (tracked as &lt;a href="https://github.com/XRPLF/XRPL-Standards/discussions/287" rel="noopener noreferrer"&gt;XLS-93d&lt;/a&gt;), so RLUSD-denominated single payments and streaming sessions will follow the same lock-stream-settle mechanics as XRP today.&lt;/p&gt;

&lt;p&gt;For developers, the new &lt;a href="https://github.com/ripple/xrpl-mpp-sdk" rel="noopener noreferrer"&gt;&lt;code&gt;xrpl-mpp-sdk&lt;/code&gt;&lt;/a&gt; handles the full 402 challenge-response flow, credential signing, and session management for both charge and channel modes, namely, XRP, IOUs, and MPTs are all supported today, with demos covering everything from a basic XRP charge to a Claude agent paying per-prompt over a payment channel.&lt;br&gt;&lt;br&gt;
The npm package can be found &lt;a href="http://npmjs.com/package/xrpl-mpp-sdk" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and the &lt;a href="https://mpp.dev/payment-methods/xrpl" rel="noopener noreferrer"&gt;MPP documentation&lt;/a&gt; also shows XRPL support. The npm package is in beta, so we welcome your feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;xrpl-up&lt;/code&gt;: a local CLI for fast developer iteration
&lt;/h3&gt;

&lt;p&gt;Testing agentic payment flows against the public Testnet or Devnet means facing faucet rate limits, ~4-second consensus times, and a shared state you don't control. &lt;a href="https://github.com/ripple/xrpl-up" rel="noopener noreferrer"&gt;&lt;code&gt;xrpl-up&lt;/code&gt;&lt;/a&gt; fixes that with a local sandbox: a one-command xrpld node with instant ledger closes, pre-funded accounts, and a full CLI surface for payments, trust lines, escrows, channels, AMM pools, MPTs, and more.&lt;/p&gt;

&lt;p&gt;It also ships a Claude Code plugin, so a developer can spin up a sandbox, create an AMM pool, or check a balance by describing what they want in plain language rather than having to remember flag syntax.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;xrpl-up&lt;/code&gt; isn't specific to agentic payments; it's a general local testing tool and the fastest way to iterate on any of the flows above (OWS wallets, MPP charges and channels, X402) without touching a public network.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. An XRPL DEX trading Skill
&lt;/h3&gt;

&lt;p&gt;This &lt;a href="https://xrpl.org/docs/agents/getting-started-with-xrpl-trading" rel="noopener noreferrer"&gt;skill&lt;/a&gt; enables autonomous permissionless DEX trading on the XRPL. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters: XRPL Is Not on an Island
&lt;/h2&gt;

&lt;p&gt;The OWS and MPP additions are XRPL showing up within a standard someone else is driving, rather than asking developers to adopt something XRPL-specific. OWS is a chain-agnostic wallet infrastructure with contributors spanning PayPal, Circle, the Solana Foundation, and others. XRPL is one of the chains it now speaks natively. MPP is a rail-agnostic settlement standard co-authored by Tempo and Stripe, and XRPL is one of the rails. X402, which we launched in June, works the same way.&lt;/p&gt;

&lt;p&gt;That pattern matters more than any single integration. The agentic payments ecosystem is still deciding which standards win, and XRPL's bet is to be a first-class citizen in the ones that do by bringing deterministic finality, predictable low fees, and native primitives like Payment Channels that map cleanly onto what these protocols actually need, rather than requiring a smart contract to bolt the behavior on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Building
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wallets:&lt;/strong&gt; Follow the new OWS tutorial to create an XRPL-backed wallet and wire it into an agent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Try the &lt;code&gt;xrpl-mpp-sdk&lt;/code&gt; demos. Start with the basic XRP charge, then the payment-channel session demo to see the streaming pattern end-to-end.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local testing:&lt;/strong&gt; Install &lt;code&gt;xrpl-up&lt;/code&gt;, run &lt;code&gt;xrpl-up start&lt;/code&gt;, and point your scripts at &lt;code&gt;ws://localhost:6006&lt;/code&gt; instead of a public faucet.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still on X402?&lt;/strong&gt; Nothing here changes it, and X402 support for XRP and RLUSD from the original launch is unaffected.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As with V1, this is a milestone in the journey, and not the finish line. Tell us what you're building, what's working, and what standard we should be looking at next.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>blockchain</category>
      <category>crypto</category>
    </item>
    <item>
      <title>Batch V1.1: What Changed and Why It's Ready</title>
      <dc:creator>Mayukha Vadari</dc:creator>
      <pubDate>Mon, 14 Sep 2026 13:52:53 +0000</pubDate>
      <link>https://dev.to/ripplexdev/batch-v11-what-changed-and-why-its-ready-4ek0</link>
      <guid>https://dev.to/ripplexdev/batch-v11-what-changed-and-why-its-ready-4ek0</guid>
      <description>&lt;h1&gt;
  
  
  What is Batch?
&lt;/h1&gt;

&lt;p&gt;Batch (XLS-56) allows multiple XRPL transactions from different accounts to execute atomically in a single ledger close. For example, if any inner transaction fails during the all-or-nothing mode of the feature, the entire batch reverts. This makes various types of atomic operations much easier, and is also foundational infrastructure for multi-party coordination on the XRPL: atomic swaps, coordinated settlements, and any workflow where two or more parties need to move in lockstep without trust assumptions.&lt;/p&gt;

&lt;h1&gt;
  
  
  What happened with the original Batch (v1.0)
&lt;/h1&gt;

&lt;p&gt;On February 19, 2026, security researchers and &lt;a href="https://cantina.xyz/welcome" rel="noopener noreferrer"&gt;Cantina AI&lt;/a&gt; identified a critical logic flaw in the signature-validation routine of the original Batch amendment. The function &lt;code&gt;checkBatchSign&lt;/code&gt;, which validates that each inner-transaction account has authorized the batch, contained an early-return bug: when it encountered a signer whose account did not yet exist on the ledger, it immediately returned success and skipped validation of all remaining signers. This would have allowed an attacker to essentially execute arbitrary transactions on behalf of any victim accounts without their private keys.&lt;/p&gt;

&lt;p&gt;See the full Vulnerability Disclosure Report &lt;a href="https://xrpl.org/blog/2026/vulnerabilitydisclosurereport-bug-feb2026" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The amendment was in its voting phase and had not been activated on Mainnet. No funds were at risk. Within hours of receiving the report, UNL validators were advised to vote "No," Ripple's engineering team reproduced the issue with an independent unit test, and an emergency release was published, marking both &lt;code&gt;Batch&lt;/code&gt; and &lt;code&gt;fixBatchInnerSigs&lt;/code&gt; as "unsupported".&lt;/p&gt;

&lt;h1&gt;
  
  
  What changed in Batch V1.1
&lt;/h1&gt;

&lt;p&gt;Batch V1.1 is a replacement amendment that ships the corrected implementation in &lt;code&gt;xrpld&lt;/code&gt; v3.3.0. The primary focus was on fixing the bug found in February and further hardening the implementation. &lt;/p&gt;

&lt;p&gt;We took the following steps to ensure that the new version is secure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checkpoint&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Root-cause fix (early-return elimination)&lt;/td&gt;
&lt;td&gt;Complete, merged via &lt;a href="https://github.com/XRPLF/rippled/pull/6446" rel="noopener noreferrer"&gt;PR #6446&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review by 4 senior engineers&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://audits.sherlock.xyz/contests/1260" rel="noopener noreferrer"&gt;Sherlock Batch Attackathon contest&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.halborn.com/audits/ripple/batch-re-audit-314089" rel="noopener noreferrer"&gt;Halborn Batch re-assessment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.commonprefix.com/blog/xrp-ledger-batch-transactions-security-audit-report" rel="noopener noreferrer"&gt;Common Prefix Batch audit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-assisted static analysis pipeline (including a Cantina scan)&lt;/td&gt;
&lt;td&gt;Integrated into review and release process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/ripplexdev/batch-transaction-qa-test-report-5g5g"&gt;QA Devnet and testnet regression testing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In addition, we found and fixed the following bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch Transaction Bypasses MPT Validation, Crashes Node
&lt;/li&gt;
&lt;li&gt;Simulate RPC &lt;code&gt;tfInnerBatchTxn&lt;/code&gt; Flag Assertion Crash
&lt;/li&gt;
&lt;li&gt;Path Size Validation Bypass via Batch Transactions
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;preflight2&lt;/code&gt; &lt;code&gt;tfInnerBatchTxn&lt;/code&gt; flag bypasses signature verification in release builds
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;preflight1&lt;/code&gt; batch &lt;code&gt;parentBatchId&lt;/code&gt; invariant — assert-only enforcement with boolean logic error
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkValidity&lt;/code&gt; does not return early for valid inner batch transactions
&lt;/li&gt;
&lt;li&gt;Batch Signatures Miss Outer Account Binding
&lt;/li&gt;
&lt;li&gt;Batch signer ordering not enforced, allowing attacker to control authorization check order
&lt;/li&gt;
&lt;li&gt;Node crash via uncaught &lt;code&gt;std::runtime_error&lt;/code&gt; from &lt;code&gt;Batch::calculateBaseFee&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;buildBatchTxnIds&lt;/code&gt; hashes full inner array pre-count-cap at deserialization
&lt;/li&gt;
&lt;li&gt;Protocol bounds follow hashing and signature verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Why Batch matters for the XRPL
&lt;/h1&gt;

&lt;p&gt;Batch is a prerequisite or accelerant for several high-value XRPL use cases already under contract or in active pipeline, such as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atomic multi-party settlements.&lt;/strong&gt; Institutional workflows (custody transfers, DvP settlement, cross-border payment finalization) require two or more accounts to act simultaneously. Batch removes the need for trust in execution ordering, eliminating a class of race conditions and partial-execution risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer experience and ecosystem growth.&lt;/strong&gt; Batch is one of the most requested features by XRPL application developers and the community broadly. It enables patterns common on programmatic chains (such as multi-call, atomic bundles, and flash loans) natively on XRPL without smart contracts, reducing friction for new builders entering the ecosystem. Batch also enables DEXs, Wallets and Marketplaces to monetise on transactions they process by bundling the base transaction (such as a Payment) with a platform fee. There are many members of the XRPL ecosystem eager to use this feature.&lt;/p&gt;

&lt;h1&gt;
  
  
  Governance context
&lt;/h1&gt;

&lt;p&gt;The original Batch incident demonstrated that the XRPL governance model works. A critical bug was reported, validators responded within hours, and no funds were ever at risk because the amendment had not yet been activated. The v1.1 replacement was given additional scrutiny precisely because of that history: broader code review, AI-assisted auditing, Sherlock contest, a Halborn re-assessment, and a Common Prefix audit on top of the standard internal audit process.&lt;/p&gt;

&lt;p&gt;For validators voting on Batch V1.1 in &lt;code&gt;xrpld&lt;/code&gt; version 3.3.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The root cause is fully understood and publicly documented (vulnerability disclosure report published February 25, 2026).
&lt;/li&gt;
&lt;li&gt;The fix addresses not just the specific bug but the class of vulnerability (early-return in validation loops, signing payload binding).
&lt;/li&gt;
&lt;li&gt;The review process has been expanded with additional tooling and reviewers relative to v1.0.
&lt;/li&gt;
&lt;li&gt;The business case is concrete: named partners, contracted use cases, and protocol-level dependencies are waiting on this capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://xrpl.org/docs/references/protocol/transactions/types/batch" rel="noopener noreferrer"&gt;Try it on Devnet today&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>xrp</category>
      <category>xrpl</category>
    </item>
    <item>
      <title>Batch Transaction - QA Test Report</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Tue, 08 Sep 2026 22:39:39 +0000</pubDate>
      <link>https://dev.to/ripplexdev/batch-transaction-qa-test-report-5g5g</link>
      <guid>https://dev.to/ripplexdev/batch-transaction-qa-test-report-5g5g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Test Report Date&lt;/strong&gt;: 9/8/2026&lt;br&gt;
&lt;strong&gt;Prepared By&lt;/strong&gt;: &lt;a href="https://github.com/sgramkumar" rel="noopener noreferrer"&gt;sgramkumar&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: GitLab CI Runner (nix-debian)&lt;br&gt;
&lt;strong&gt;Network&lt;/strong&gt;: xrpld devnet + private CI network&lt;/p&gt;
&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This report presents the results of QA testing performed on Batch (XLS-56) Transactions across xrpld servers. Coverage targets the  BatchV1_1  amendment, which supersedes the original  Batch  amendment and tightened BatchSigner authorization and signing semantics.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Feature
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Feature Name:&lt;/strong&gt; Batch (Atomic) Transactions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Prior to this feature, an account that needed several operations to succeed or fail together had no way to bind them atomically; each transaction settled independently, leaving the risk of partial completion. Batch allows an account to package up to 8 inner transactions into a single outer &lt;code&gt;Batch&lt;/code&gt; transaction that is processed as one atomic unit. Inner transactions execute under one of four modes — &lt;code&gt;AllOrNothing&lt;/code&gt;, &lt;code&gt;OnlyOne&lt;/code&gt;, &lt;code&gt;UntilFailure&lt;/code&gt;, or &lt;code&gt;Independent&lt;/code&gt; — and may be authorized across multiple accounts (BatchSigners), via delegated authority, via multi-signing, or sequenced by tickets. This unlocks reliable multi-step and multi-party workflows on the XRP Ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification Reference:&lt;/strong&gt; &lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0056-batch" rel="noopener noreferrer"&gt;https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0056-batch&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Test Scope
&lt;/h2&gt;

&lt;p&gt;This report covers the full Batch surface as it stands under the &lt;code&gt;BatchV1_1&lt;/code&gt; amendment (xrpld PRs &lt;a href="https://github.com/XRPLF/rippled/pull/5060" rel="noopener noreferrer"&gt;#5060&lt;/a&gt;, &lt;a href="https://github.com/XRPLF/rippled/pull/6446" rel="noopener noreferrer"&gt;#6446&lt;/a&gt;). Testing focused on ensuring that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All four execution modes (&lt;code&gt;AllOrNothing&lt;/code&gt;, &lt;code&gt;OnlyOne&lt;/code&gt;, &lt;code&gt;UntilFailure&lt;/code&gt;, &lt;code&gt;Independent&lt;/code&gt;) behave per the XLS-56 specification, including correct commit/rollback semantics&lt;/li&gt;
&lt;li&gt;The 2–8 inner-transaction bounds, fee calculation, and &lt;code&gt;tfInnerBatchTxn&lt;/code&gt; rules are enforced&lt;/li&gt;
&lt;li&gt;Multi-account and multi-signed BatchSigner authorization is validated, including canonical signer ordering and the hardened &lt;code&gt;BatchV1_1&lt;/code&gt; signing preimage&lt;/li&gt;
&lt;li&gt;Batch composes correctly with the full range of inner transaction types (Payments, Offers, Checks, Escrow, MPT, Vault/Loan operations, and more), and with the features that have special interaction rules at the batch authorization/sequencing layer — Permission Delegation (inner  Delegate  field), Sponsored Fees &amp;amp; Reserves (outer/inner  Sponsor  rules), Confidential MPT (in-batch proof staleness), and Tickets (inner  TicketSequence)&lt;/li&gt;
&lt;li&gt;Security-critical properties hold under adversarial input, including malformed BatchSigners, stale-proof inner transactions, replay, and structural/serialization attacks&lt;/li&gt;
&lt;li&gt;Inner-transaction metadata (&lt;code&gt;sfParentBatchID&lt;/code&gt;) and same-ledger inclusion are correctly reported&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Types of Testing Conducted
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;Verifying each execution mode, inner-transaction type, fee path, and RPC/metadata surface against the XLS-56 specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression&lt;/td&gt;
&lt;td&gt;Running the full xrpld test suite to confirm Batch changes did not break existing functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial / Security&lt;/td&gt;
&lt;td&gt;Attack-matrix scenarios probing malformed BatchSigners, signature-binding violations, stale-proof inner transactions, replay, over-size batches, and structural/serialization smuggling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature&lt;/td&gt;
&lt;td&gt;Interactions between Batch and Permission Delegation (XLS-75), Sponsored Fees &amp;amp; Reserves, Confidential MPT (XLS-96), and Tickets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End-to-End&lt;/td&gt;
&lt;td&gt;Full flows spanning batch assembly, multi-party signing, submission, atomic commit/rollback, and downstream metadata validation via xrpld&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  4. Test Results Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Total Tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Batch — Core Functional (execution modes, multi-account/multi-sign, tickets/replay/metadata, vault/loan/transaction types, signature &amp;amp; structural validation)&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch — Adversarial / Security&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch — Cross-Feature (Delegation, Sponsorship, Confidential MPT)&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Batch — Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;189&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression — xrpld (full suite)&lt;/td&gt;
&lt;td&gt;5,088&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Testcases: &lt;a href="https://dev.to/ripplexdev/batch-transaction-testcases-1klf"&gt;https://dev.to/ripplexdev/batch-transaction-testcases-1klf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feature commit history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Introduced as  Batch  in PR #5060 (2a61aee562, merged 2025-05-23)
- Disabled in v3.1.1 due to a critical bug discovered in the original implementation
- Replaced by  BatchV1_1  (hardened BatchSigners + signing preimage) in PR #6446 (86d8b244d6, merged 2026-07-01)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Related xrpld changes covered in this round:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/5060" rel="noopener noreferrer"&gt;#5060&lt;/a&gt; — Initial Batch (XLS-56) feature — four execution modes, &lt;code&gt;parentBatchId&lt;/code&gt; propagation&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/6446" rel="noopener noreferrer"&gt;#6446&lt;/a&gt; — BatchV1_1 — supersedes &lt;code&gt;Batch&lt;/code&gt;/&lt;code&gt;fixBatchInnerSigs&lt;/code&gt;, tightens BatchSigner authorization and signing-message construction&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/7736" rel="noopener noreferrer"&gt;#7736&lt;/a&gt; — enforces &lt;code&gt;kMaxBatchTxCount&lt;/code&gt; (rejects &amp;gt;8 inner transactions at STTx construction)&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/7279" rel="noopener noreferrer"&gt;#7279&lt;/a&gt; — delegated Confidential MPT inner-transaction cases inside Batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Related specification change:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XRPL-Standards updated XLS-0056 to align with the BatchV1_1 implementation (BatchSigners sorting/signing payload, &lt;code&gt;tfInnerBatchTxn&lt;/code&gt; common-field semantics)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Bugs Reported
&lt;/h2&gt;

&lt;p&gt;All internal bugs are fixed and there are no Critical Open bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Conclusion
&lt;/h2&gt;

&lt;p&gt;Batch (XLS-56) Transactions have now been exercised across 189 dedicated tests spanning core functional coverage (four execution modes, multi-account/multi-sign authorization, tickets/replay/metadata, and inner transaction-type coverage), adversarial / security scenarios, and cross-feature interactions with Permission Delegation, Sponsored Fees &amp;amp; Reserves, and Confidential MPT. In addition, the full xrpld (5,088) regression suite has been executed to confirm no downstream breakage.&lt;/p&gt;

&lt;p&gt;All security-critical properties documented in XLS-56 have been validated, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct atomic commit/rollback semantics for every execution mode (&lt;code&gt;AllOrNothing&lt;/code&gt; rolls the whole batch back on any inner failure; &lt;code&gt;OnlyOne&lt;/code&gt;, &lt;code&gt;UntilFailure&lt;/code&gt;, and &lt;code&gt;Independent&lt;/code&gt; apply their defined subsets)&lt;/li&gt;
&lt;li&gt;Enforcement of the 2–8 inner-transaction bounds and rejection of over-size batches before preflight work (PR &lt;a href="https://github.com/XRPLF/rippled/pull/7736" rel="noopener noreferrer"&gt;#7736&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correct BatchSigner authorization under the hardened &lt;code&gt;BatchV1_1&lt;/code&gt; signing preimage, including canonical ascending signer ordering and multi-signed BatchSigners&lt;/li&gt;
&lt;li&gt;Correct interaction with delegated authority, sponsorship, tickets, and Confidential MPT inner transactions, including stale-proof rollback under &lt;code&gt;AllOrNothing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Accurate inner-transaction metadata (&lt;code&gt;sfParentBatchID&lt;/code&gt;) and same-ledger inclusion reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feature is considered ready for production use at the tested commit level. Future updates to this report will follow any material additions to the Batch surface.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>softwaredevelopment</category>
      <category>testing</category>
    </item>
    <item>
      <title>Batch Transaction - Testcases</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Tue, 08 Sep 2026 21:40:47 +0000</pubDate>
      <link>https://dev.to/ripplexdev/batch-transaction-testcases-1klf</link>
      <guid>https://dev.to/ripplexdev/batch-transaction-testcases-1klf</guid>
      <description>&lt;p&gt;Automated test coverage for the &lt;strong&gt;Batch&lt;/strong&gt; transaction feature (XLS-56), grouped by the invariant or execution mode each test exercises with &lt;strong&gt;189 tests.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Test Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Execution Modes&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Account &amp;amp; Multi-Sign&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tickets, Replay &amp;amp; Metadata&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vault, Loan &amp;amp; Transaction Types&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature &amp;amp; Structural Validation&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security &amp;amp; Adversarial&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature Interactions&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;189&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Execution Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AllOrNothing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch allornothing all payments succeed&lt;/li&gt;
&lt;li&gt;Test Batch allornothing submit batch multiple times&lt;/li&gt;
&lt;li&gt;Test Batch allornothing one payment fails&lt;/li&gt;
&lt;li&gt;Test Batch allornothing all payments fail&lt;/li&gt;
&lt;li&gt;Test Batch allornothing mixed transaction types&lt;/li&gt;
&lt;li&gt;Test Batch allornothing fee calculation&lt;/li&gt;
&lt;li&gt;Test Batch allornothing max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch allornothing more than max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch allornothing cash same check multiple times&lt;/li&gt;
&lt;li&gt;Test Batch allornothing fail and then succeed&lt;/li&gt;
&lt;li&gt;Test Batch allornothing with tickets&lt;/li&gt;
&lt;li&gt;Test Batch allornothing deep rollback on late inner failure&lt;/li&gt;
&lt;li&gt;Test Batch allornothing value conservation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  OnlyOne
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch onlyone first succeeds&lt;/li&gt;
&lt;li&gt;Test Batch onlyone first fails second succeeds&lt;/li&gt;
&lt;li&gt;Test Batch onlyone all fail&lt;/li&gt;
&lt;li&gt;Test Batch onlyone offer priority&lt;/li&gt;
&lt;li&gt;Test Batch onlyone max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch onlyone more than max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch onlyone cash same check multiple times&lt;/li&gt;
&lt;li&gt;Test Batch onlyone fail and then succeed&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  UntilFailure
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch untilfailure all succeed&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure stops at first&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure stops at second&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure stops at third&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure sequential setup&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure progressive payments&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure mixed success failure pattern&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure more than max inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure cash same check multiple times&lt;/li&gt;
&lt;li&gt;Test Batch untilfailure fail and then succeed&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Independent
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch independent all succeed&lt;/li&gt;
&lt;li&gt;Test Batch independent some fail&lt;/li&gt;
&lt;li&gt;Test Batch independent all fail&lt;/li&gt;
&lt;li&gt;Test Batch independent parallel operations&lt;/li&gt;
&lt;li&gt;Test Batch independent mixed transaction types&lt;/li&gt;
&lt;li&gt;Test Batch independent account setup operations&lt;/li&gt;
&lt;li&gt;Test Batch independent max transactions&lt;/li&gt;
&lt;li&gt;Test Batch independent more than max transactions&lt;/li&gt;
&lt;li&gt;Test Batch independent cash same check multiple times&lt;/li&gt;
&lt;li&gt;Test Batch independent fail and then succeed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Multi-Account &amp;amp; Multi-Sign
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch multiaccount workflow all payments succeed&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount atomic swap xrp for xrp&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount atomic swap xrp for token&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount circular three way swap&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount with submitter not in inner txns&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount without signers&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount with max signers&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount with more than max signers&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount txn1 fails txn2 succeeds&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create check succeeds cash check fails&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete accounts too soon with other account as signer&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete accounts after flag ledger with other account as signer&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete submitting account after flag ledger with no signer&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete submitting account after flag ledger with signer&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount alice creates offer bob creates offer&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create nftokenmint nftokenoffercreate fails reverts nftokenmint&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount exploit steal funds&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount ticket based outer succeeds&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Multi-Sign
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test multisigned outer batch succeeds&lt;/li&gt;
&lt;li&gt;Test multisigned outer with multisigned batch signer succeeds&lt;/li&gt;
&lt;li&gt;Test multisigned outer below quorum rejected tefBAD_QUORUM&lt;/li&gt;
&lt;li&gt;Test multisigned batch signer below quorum rejected tefBAD_QUORUM&lt;/li&gt;
&lt;li&gt;Test multisigned outer with unauthorized signer rejected tefBAD_SIGNATURE&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Tickets, Replay &amp;amp; Metadata
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tickets
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch inner txns consume tickets succeeds&lt;/li&gt;
&lt;li&gt;Test Batch inner tickets used out of order succeeds&lt;/li&gt;
&lt;li&gt;Test Batch inner with sequence and ticket rejected temSEQ_AND_TICKET&lt;/li&gt;
&lt;li&gt;Test Batch duplicate ticket same account rejected temREDUNDANT&lt;/li&gt;
&lt;li&gt;Test Batch nonexistent ticket rolls back allornothing&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Replay
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch resubmission is rejected and pays inner once&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Metadata
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch inner txns carry parent batch id and share ledger&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Vault, Loan &amp;amp; Transaction Types
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single-Asset Vault (SAV)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch with vault create&lt;/li&gt;
&lt;li&gt;Test Batch with vault set&lt;/li&gt;
&lt;li&gt;Test Batch with vault deposit&lt;/li&gt;
&lt;li&gt;Test Batch with vault withdraw&lt;/li&gt;
&lt;li&gt;Test Batch with vault delete&lt;/li&gt;
&lt;li&gt;Test Batch with vault clawback&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  LoanBroker / Loan
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch with loan broker set&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker delete&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover deposit&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover withdraw&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover clawback&lt;/li&gt;
&lt;li&gt;Test Batch with loan set&lt;/li&gt;
&lt;li&gt;Test Batch with loan pay&lt;/li&gt;
&lt;li&gt;Test Batch with loan delete&lt;/li&gt;
&lt;li&gt;Test Batch with loan manage&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Supported Transaction Types
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch transaction type trustset&lt;/li&gt;
&lt;li&gt;Test Batch transaction type offercreate&lt;/li&gt;
&lt;li&gt;Test Batch transaction type account set&lt;/li&gt;
&lt;li&gt;Test Batch transaction type escrow create&lt;/li&gt;
&lt;li&gt;Test Batch transaction type check create&lt;/li&gt;
&lt;li&gt;Test Batch transaction type nftokenmint&lt;/li&gt;
&lt;li&gt;Test Batch with ticket create transaction&lt;/li&gt;
&lt;li&gt;Test Batch transaction type signerlistset&lt;/li&gt;
&lt;li&gt;Test Batch transaction type depositpreauth&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. Signature &amp;amp; Structural Validation (V1.1 Readiness)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Readiness / Preimage
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch v1.1 preimage matches pr1010 single&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 preimage matches pr1010 multi&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 preimage layout&lt;/li&gt;
&lt;li&gt;Test batchsigners signature binds outer account sequence and signer account&lt;/li&gt;
&lt;li&gt;Test Batch signers sorted by account id&lt;/li&gt;
&lt;li&gt;Test sdk encode for signing batch natively binds account and sequence&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Preflight Error Ordering
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch inner tx with negative fee rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Batch inner tx with positive xrp fee rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Batch inner tx with iou fee rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Batch inner tx with zero fee passes fee preflight&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. Security &amp;amp; Adversarial
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Structural / Flag Enforcement
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch empty raw transactions&lt;/li&gt;
&lt;li&gt;Test Batch with one raw transaction&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having no tfInnerBatchTxn flag&lt;/li&gt;
&lt;li&gt;Test Batch with some inner transactions having no tfInnerBatchTxn flag&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having incorrect tfInnerBatchTxn flag&lt;/li&gt;
&lt;li&gt;Test Batch with tfInnerBatchTxn flag set for outer transaction&lt;/li&gt;
&lt;li&gt;Test Batch with no mode set for outer transaction&lt;/li&gt;
&lt;li&gt;Test Batch with invalid mode set for outer transaction&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having no fee field&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having bad fee values&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with SigningPubKey&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with fee and SigningPubKey&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with TxnSignature&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with Signers&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with SponsorSignature&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions with CounterpartySignature&lt;/li&gt;
&lt;li&gt;Test Batch with invalid inner transactions&lt;/li&gt;
&lt;li&gt;Test Batch inside non empty batch&lt;/li&gt;
&lt;li&gt;Test Batch inside empty batch&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence leaves no state change&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with past sequence&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with future not incremental sequences&lt;/li&gt;
&lt;li&gt;Test Batch with account does not exist&lt;/li&gt;
&lt;li&gt;Test Batch with deposit auth on account&lt;/li&gt;
&lt;li&gt;Test Batch with master key disabled on account&lt;/li&gt;
&lt;li&gt;Test Batch all payments with destination account not funded&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adversarial Attack Matrix
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch with single inner tx returns temARRAY_EMPTY&lt;/li&gt;
&lt;li&gt;Test inner tx with non zero fee returns temBAD_FEE&lt;/li&gt;
&lt;li&gt;Test inner tx with non empty signing pubkey returns temBAD_REGKEY&lt;/li&gt;
&lt;li&gt;Test inner tx missing inner batch flag returns temINVALID_FLAG&lt;/li&gt;
&lt;li&gt;Test standalone payment with tfInnerBatchTxn flag rejected&lt;/li&gt;
&lt;li&gt;Test Batch with outer account in BatchSigners rejected&lt;/li&gt;
&lt;li&gt;Test Batch with duplicate BatchSigners rejected&lt;/li&gt;
&lt;li&gt;Test Batch with BatchSigner for unrelated account rejected&lt;/li&gt;
&lt;li&gt;Test Batch BatchSigners signature for different batch rejected&lt;/li&gt;
&lt;li&gt;Test Batch with single inner transaction rejected temARRAY_EMPTY&lt;/li&gt;
&lt;li&gt;Test Batch with nested inner batch rejected&lt;/li&gt;
&lt;li&gt;Test Batch with duplicate inner sequences rejected temREDUNDANT&lt;/li&gt;
&lt;li&gt;Test Batch inner setregularkey succeeds when outer signed by master&lt;/li&gt;
&lt;li&gt;Test Batch innerbatch flag on standalone payment rejected&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 oversized inner array rejected as tem&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 far oversized inner array survives eager hashing&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 far oversized inner array at scale survives eager hashing&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 batchsigner sig bound to outer sequence&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 batchsigner sig bound to outer account&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 unsorted batchsigners rejected&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 standalone tx with inner batch flag rejected&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 standalone oversized path stays tel&lt;/li&gt;
&lt;li&gt;Test Batch v1.1 batchsigners over kmax rejected&lt;/li&gt;
&lt;li&gt;Test non batch tx with raw transactions rejected at construction&lt;/li&gt;
&lt;li&gt;Test non batch raw transactions rejection does not crash server&lt;/li&gt;
&lt;li&gt;Test Batch outer with sfDelegate rejected by notdelegable template&lt;/li&gt;
&lt;li&gt;Test Batch inner notdelegable type with sfDelegate inner rejected&lt;/li&gt;
&lt;li&gt;Test Batch inner delegated without permission grant returns terNO_DELEGATE_PERMISSION&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  7. Cross-Feature Interactions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Delegation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test delegate as outer account executes delegated inner succeeds&lt;/li&gt;
&lt;li&gt;Test delegate as batch signer authorizes delegated inner succeeds&lt;/li&gt;
&lt;li&gt;Test delegated inner without batch signer rejected temBAD_SIGNER&lt;/li&gt;
&lt;li&gt;Test delegated inner signed by account holder rejected temBAD_SIGNER&lt;/li&gt;
&lt;li&gt;Test delegate without permission inner fails and batch rolls back&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Sponsorship
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test outer batch with reserve sponsorship flag rejected temINVALID_FLAG&lt;/li&gt;
&lt;li&gt;Test inner batch txn with fee sponsorship rejected temINVALID_FLAG&lt;/li&gt;
&lt;li&gt;Test inner batch txn with sponsor signature material rejected temBAD_SIGNATURE&lt;/li&gt;
&lt;li&gt;Test prefunded fee sponsored outer batch succeeds&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Confidential MPT
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch confidential mpt two sends with stale proof allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt independent send with one failing&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt convert then merge inbox allornothing&lt;/li&gt;
&lt;li&gt;Test Batch delegated send missing permission allornothing&lt;/li&gt;
&lt;li&gt;Test Batch delegated send with delegate as outer needs no batch signer&lt;/li&gt;
&lt;li&gt;Test Batch delegated send with delegate as outer with batch signer&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt two chained sends same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt send then convert back same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt three chained sends same sender allornothing&lt;/li&gt;
&lt;li&gt;Test Batch confidential mpt chained send wrong predicted ciphertext fails&lt;/li&gt;
&lt;li&gt;Test Batch only one with two valid chained sends executes first only&lt;/li&gt;
&lt;li&gt;Test Batch only one first send to unconverted fails falls through to second&lt;/li&gt;
&lt;li&gt;Test Batch until failure first send commits then stale second fails&lt;/li&gt;
&lt;li&gt;Test Batch allornothing issuer lock then alice send rolls back both&lt;/li&gt;
&lt;li&gt;Test Batch independent three holders converts coa aggregate correct&lt;/li&gt;
&lt;li&gt;Test Batch allornothing inner revokes delegate then later inner uses it rolls back&lt;/li&gt;
&lt;li&gt;Test Batch two chained delegated sends from same delegator both commit&lt;/li&gt;
&lt;li&gt;Test delegated send after delegator loses domain membership fails&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>automation</category>
      <category>security</category>
      <category>software</category>
      <category>testing</category>
    </item>
    <item>
      <title>Ripple’s Recommendation: Withdraw the XChainBridge Amendment (XLS-38)</title>
      <dc:creator>David Fuelling</dc:creator>
      <pubDate>Thu, 27 Aug 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ripplexdev/ripples-recommendation-withdraw-the-xchainbridge-amendment-xls-38-5d51</link>
      <guid>https://dev.to/ripplexdev/ripples-recommendation-withdraw-the-xchainbridge-amendment-xls-38-5d51</guid>
      <description>&lt;p&gt;When we set out to bring cross-chain bridging natively to the XRP Ledger, the &lt;code&gt;XChainBridge&lt;/code&gt; amendment (&lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0038-cross-chain-bridge" rel="noopener noreferrer"&gt;XLS-38&lt;/a&gt;) was our proposed solution. Today, we're recommending that the XRPL community withdraw &lt;code&gt;XChainBridge&lt;/code&gt; along with the related &lt;code&gt;fixXChainRewardRounding&lt;/code&gt; amendment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What XLS-38 Set Out to Do
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0038-cross-chain-bridge" rel="noopener noreferrer"&gt;XLS-38&lt;/a&gt; defined a protocol for native cross-chain bridges on the XRPL to enable custom sidechains. Rather than delegating to third-party bridge operators, it proposed a model where a decentralized network of "witness servers" would observe and attest to transactions across chains, enabling assets to move between XRPL mainnet and any connected sidechain.&lt;/p&gt;

&lt;p&gt;The original vision was compelling: give developers the building blocks to create custom sidechains: private chains, permissioned networks, or experimental environments for features not yet available on mainnet. XLS-38 was also intended to bridge the XRPL EVM Sidechain to mainnet, with XRP as the native gas token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Chose Axelar for the EVM Sidechain
&lt;/h2&gt;

&lt;p&gt;As we prepared to launch the XRPL EVM Sidechain (a collaboration between Peersyst, Ripple, and the broader XRPL community), we conducted a thorough evaluation of bridging options, weighing security, user experience, decentralization, and long-term operational sustainability.&lt;/p&gt;

&lt;p&gt;The XLS-38 witness server model presents inherent trade-offs between security and decentralization that become harder to manage as the value locked in a bridge grows. The architecture places significant trust in a set of witness server operators: the larger and more decentralized that set, the better the security; but also the greater the coordination overhead, the harder the governance, and the more diffuse the accountability. For a bridge securing a public chain's native gas token, these tensions don't have easy resolutions, and Ripple concluded that it wasn't an area where we had the operational expertise to do it well at scale. Building and managing bridges between public blockchains is genuinely specialized work.&lt;/p&gt;

&lt;p&gt;Axelar, on the other hand, is purpose-built for exactly this problem. Its 75+ validators, threshold signature scheme, and key-rotation discipline reflect the kind of operational maturity that takes years to develop, backed by experience bridging across 55+ blockchains. That expertise isn't easy to replicate, and Ripple's team didn't see a need to when a capable partner already existed.&lt;/p&gt;

&lt;p&gt;In June 2024&lt;sup&gt;1&lt;/sup&gt;, we announced the decision to use the Axelar network alongside the XRPL EVM Sidechain launch. At that time, we committed to leaving the XLS-38 amendment available for a vote while Ripple's UNL validator would continue voting &lt;code&gt;No&lt;/code&gt;, and pledged to give the community 12–15 months to demonstrate interest in XLS-38 as a foundation for private sidechain use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Observed
&lt;/h2&gt;

&lt;p&gt;That window has now passed. During this time, we actively engaged with developers, monitored community forums, and looked for concrete projects or proposals that would benefit from an activated XLS-38 bridge on mainnet. We didn't find the level of adoption or developer interest that would justify keeping the amendment moving toward activation.&lt;/p&gt;

&lt;p&gt;A few observations drove our current thinking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The EVM Sidechain bridge is well-served by Axelar.&lt;/em&gt;&lt;/strong&gt; The primary use case that motivated XLS-38's development is fully addressed, and we believe better addressed, by the Axelar integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lack of Demand.&lt;/em&gt;&lt;/strong&gt; No significant private sidechain demand materialized for private sidechains that would use XLS-38 specifically. We wanted to see real developer projects that specifically required a native XLS-38 bridge, but that hasn't emerged at the level we hoped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Maintaining inactive code carries real costs.&lt;/em&gt;&lt;/strong&gt; Keeping the &lt;code&gt;XChainBridge&lt;/code&gt; code in xrpld creates an ongoing maintenance burden and a source of confusion for new contributors, with no corresponding benefit to the network today. We estimate that withdrawing this amendment would let us remove more than 10,000 lines of code from &lt;code&gt;xrpld&lt;/code&gt;, reducing the surface area we maintain and review.&lt;/p&gt;

&lt;p&gt;That said, we want to be clear: &lt;strong&gt;this is a recommendation, not a unilateral decision&lt;/strong&gt;. If there are developers or organizations actively building on XLS-38, or who have concrete plans to do so, we want to hear from you. Ripple controls one vote among many on the XRPL, and we're open to revisiting this assessment if the community presents a strong case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different Problems, Different Tools
&lt;/h2&gt;

&lt;p&gt;The Axelar decision was specific to the EVM Sidechain, which is a public chain bridging XRP to a permissionless EVM environment. XLS-38, by contrast, was meant to support a wider range of use cases: private chains, permissioned networks, experimental environments for features not yet on mainnet. The reality for that wider set is that no single mechanism fits every use case.&lt;/p&gt;

&lt;p&gt;Axelar and Wormhole represent one class of solution (trust-minimized bridging between mature public chains), but the broader space includes ZK-based approaches, L2-style architectures, and early research directions like consensus-within-consensus. Active work is happening across all of these, and the right tool depends on the problem.&lt;/p&gt;

&lt;p&gt;None of these is a drop-in replacement for XLS-38, and none is the right answer for every problem. They're a portfolio. Part of our reason for proposing to withdraw XLS-38 is that, as a single mechanism trying to serve all of these use cases, it was solving too many problems at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Withdrawal Process Would Work
&lt;/h2&gt;

&lt;p&gt;If the community aligns with this direction, the next steps are deliberate and consensus-driven, which is exactly how it should be. Here's how it would unfold:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Step 1: Mark the amendment as Obsolete.&lt;/em&gt;&lt;/strong&gt; Ripple's intended first step is to open a pull request to the &lt;a href="https://github.com/XRPLF/rippled" rel="noopener noreferrer"&gt;&lt;code&gt;xrpld&lt;/code&gt; repository&lt;/a&gt; that sets &lt;code&gt;VoteBehavior::Obsolete&lt;/code&gt; for the &lt;code&gt;XChainBridge&lt;/code&gt; feature. Once this change is merged, &lt;code&gt;xrpld&lt;/code&gt; servers running that version will automatically vote against the amendment and will never vote in favor of it, regardless of operator configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Step 2: Network consensus.&lt;/em&gt;&lt;/strong&gt; As validators update their &lt;code&gt;xrpld&lt;/code&gt; software to versions that include this change, the amendment will gradually lose support across the network. Once all active validators consider the amendment Obsolete, it can be removed from the codebase entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Step 3: Code removal.&lt;/em&gt;&lt;/strong&gt; A subsequent update will fully remove the &lt;code&gt;XChainBridge&lt;/code&gt; and &lt;code&gt;fixXChainRewardRounding&lt;/code&gt; code from xrpld.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for You
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're building on the XRPL EVM Sidechain:&lt;/strong&gt; Nothing changes. The Axelar bridge is your path to and from XRPL mainnet, and it will continue to be supported and improved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a validator:&lt;/strong&gt; When and if you upgrade to the &lt;code&gt;xrpld&lt;/code&gt; version that includes the &lt;code&gt;Obsolete&lt;/code&gt; vote behavior, your node will automatically stop voting for &lt;code&gt;XChainBridge&lt;/code&gt;. No action required on your part beyond the normal upgrade cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you were exploring XLS-38 for a private sidechain:&lt;/strong&gt; This is the most important group we want to hear from. Please reach out on the &lt;a href="https://discord.gg/sfX3ERAMjH" rel="noopener noreferrer"&gt;XRPL developer Discord&lt;/a&gt; or engage on GitHub to share your use case. Concrete plans and active projects are exactly the kind of signal that could change our recommendation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a contributor to &lt;code&gt;xrpld&lt;/code&gt;:&lt;/strong&gt; The PR to mark &lt;code&gt;XChainBridge&lt;/code&gt; as &lt;code&gt;Obsolete&lt;/code&gt; will go through normal open-source review. We welcome technical feedback and discussion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead
&lt;/h2&gt;

&lt;p&gt;This recommendation reflects something broader about how we'd like to think about the XRPL: lean, purposeful, and battle-tested. Carrying unused code paths through years of mainnet evolution has real costs, such as maintenance burden, attack surface, and onboarding complexity for new contributors. XLS-38 is unlikely to be the last withdrawal we propose for those reasons.&lt;/p&gt;

&lt;p&gt;We're grateful to the developers who built witness server tooling, the community members who debated the design over the years, and the validators who weighed in. That work wasn't wasted, but instead sharpened our understanding of bridging trade-offs and shaped how we now think about cross-chain interoperability more generally.&lt;/p&gt;

&lt;p&gt;We'll leave a comment period open before moving forward. If you have feedback, a use case to share, or a reason we should reconsider, please weigh in on &lt;a href="https://github.com/XRPLF/rippled" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or in the &lt;a href="https://discord.gg/sfX3ERAMjH" rel="noopener noreferrer"&gt;XRPL developer Discord&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;[1] &lt;em&gt;For more context, see our June 2024 post on &lt;a href="https://ripple.com/insights/xrpl-evm-sidechain-enhancing-interoperability-with-axelar-bridge/" rel="noopener noreferrer"&gt;XRPL EVM Sidechain: Enhancing Interoperability with Axelar Bridge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>xrp</category>
      <category>xrpl</category>
    </item>
    <item>
      <title>Account Permission Delegation - QA Test Report</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Wed, 26 Aug 2026 19:18:57 +0000</pubDate>
      <link>https://dev.to/ripplexdev/account-permission-delegation-qa-test-report-4ia0</link>
      <guid>https://dev.to/ripplexdev/account-permission-delegation-qa-test-report-4ia0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Test Report Date&lt;/strong&gt;: 8/26/2026&lt;br&gt;
&lt;strong&gt;Prepared By&lt;/strong&gt;: QA Team [&lt;a href="https://github.com/sgramkumar" rel="noopener noreferrer"&gt;sgramkumar&lt;/a&gt;, &lt;a href="https://github.com/mkunasani" rel="noopener noreferrer"&gt;mkunasani&lt;/a&gt;, &lt;a href="https://github.com/manasip-prog" rel="noopener noreferrer"&gt;manasip-prog&lt;/a&gt;]&lt;br&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: GitLab CI Runner (nix-debian)&lt;br&gt;
&lt;strong&gt;Network&lt;/strong&gt;: xrpld devnet + private CI network&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;br&gt;
This report presents the updated results of QA testing performed on Account Permission Delegation across xrpld servers. It supersedes the initial report from May 2025, reflecting the substantial expansion of test coverage that has occurred as the feature evolved through follow-up xrpld changes.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Feature
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Feature Name&lt;/strong&gt;: Account Permission Delegation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Prior to this feature, critical issuer actions — such as authorizing trustlines — required direct control by the account's own keys, hindering operational efficiency and complex use cases. Account Permission Delegation empowers account holders to selectively delegate specific permissions to other accounts, enhancing account usability without compromising security. This mechanism unlocks new possibilities for XRPL applications, including multi-party workflows and advanced account management strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification Reference&lt;/strong&gt;: &lt;a href="https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0075-permission-delegation" rel="noopener noreferrer"&gt;https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0075-permission-delegation&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Test Scope
&lt;/h3&gt;

&lt;p&gt;This report covers the full delegation surface as it stands after the follow-up xrpld changes (PRs &lt;a href="https://github.com/XRPLF/rippled/pull/6126" rel="noopener noreferrer"&gt;#6126&lt;/a&gt;, &lt;a href="https://github.com/XRPLF/rippled/pull/7064" rel="noopener noreferrer"&gt;#7064&lt;/a&gt;, &lt;a href="https://github.com/XRPLF/rippled/pull/7584" rel="noopener noreferrer"&gt;#7584&lt;/a&gt;, &lt;a href="https://github.com/XRPLF/rippled/pull/7640" rel="noopener noreferrer"&gt;#7640&lt;/a&gt;). Testing focused on ensuring that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All specified functionalities behave per the XLS-0075 specification&lt;/li&gt;
&lt;li&gt;The API handles both valid and invalid input gracefully&lt;/li&gt;
&lt;li&gt;Delegated transactions interact correctly with adjacent features (Batch, Confidential MPT, transaction queue, multi-signing)&lt;/li&gt;
&lt;li&gt;Security-critical properties hold under adversarial input, including permission-escalation attempts via flag/field side-channels&lt;/li&gt;
&lt;li&gt;Behavior is consistent across both RPC and WebSocket interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Types of Testing Conducted
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;Verifying each transaction, permission grant, and RPC path against the feature specification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression&lt;/td&gt;
&lt;td&gt;Running full xrpld test suites to confirm delegation changes did not break existing functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial / Security&lt;/td&gt;
&lt;td&gt;Attack-matrix scenarios probing self-delegation, permission-scope escalation, flag/field smuggling, granular-permission union semantics, and revocation edge cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature&lt;/td&gt;
&lt;td&gt;Interactions between Delegation and Batch (XLS-56), Confidential MPT, the transaction queue, and multi-signing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End-to-End&lt;/td&gt;
&lt;td&gt;Full flows spanning delegation setup, delegated submission, revocation, and downstream validation via xrpld&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  4. Test Results Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Testing Type&lt;/th&gt;
&lt;th&gt;Total Tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Permission Delegation — Core Functional&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Delegation — Adversarial / Security&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Delegation — Cross-Feature (Batch, Confidential MPT, TxQ)&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission Delegation — Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;179&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regression — xrpld (full suite)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5,088&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Testcases&lt;/strong&gt;: &lt;a href="https://dev.to/ripplexdev/account-permission-delegation-testcases-3j0b"&gt;https://dev.to/ripplexdev/account-permission-delegation-testcases-3j0b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature commit history:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Introduced as `PermissionDelegation` in PR #5354 (2db2791805, 2025-05-08)
- Marked unsupported (2ae65d2fdb, 2025-09-18) pending security fix
- Renamed to `PermissionDelegationV1_1` with security fix in PR #5825
  (fa69918124, 2025-10-31)
- Re-supported (`Supported::Yes`) in PR #6613 (772ea80a25, 2026-06-17)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related xrpld changes covered in this round:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/5354" rel="noopener noreferrer"&gt;#5354&lt;/a&gt; — Initial &lt;code&gt;PermissionDelegation&lt;/code&gt; feature&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/5650" rel="noopener noreferrer"&gt;#5650&lt;/a&gt; — &lt;code&gt;fixDelegateV1_1&lt;/code&gt; — restrictions on Permission Delegation&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/5825" rel="noopener noreferrer"&gt;#5825&lt;/a&gt; — Security vulnerability fix + rename to &lt;code&gt;PermissionDelegationV1_1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/6126" rel="noopener noreferrer"&gt;#6126&lt;/a&gt; — &lt;code&gt;account_tx&lt;/code&gt; delegate filter parameter&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/6729" rel="noopener noreferrer"&gt;#6729&lt;/a&gt; — Delegation tests for Confidential Transfers&lt;/li&gt;
&lt;li&gt;PR &lt;a href="https://github.com/XRPLF/rippled/pull/6808" rel="noopener noreferrer"&gt;#6808&lt;/a&gt; — Confidential delegation tests with tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Bugs Reported
&lt;/h3&gt;

&lt;p&gt;All Internal bugs are fixed and there are no Critical Open bugs&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Conclusion
&lt;/h3&gt;

&lt;p&gt;Account Permission Delegation has now been exercised across 179 dedicated tests spanning core functional coverage, adversarial / security scenarios, and cross-feature interactions — a substantial expansion from the 66 tests reported at initial feature landing. In addition, the full xrpld (5,088) regression suites have been executed to confirm no downstream breakage.&lt;/p&gt;

&lt;p&gt;All security-critical properties documented in XLS-0075 have been validated, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct rejection of self-delegation, unknown permissions, and NotDelegable transaction types&lt;/li&gt;
&lt;li&gt;Enforcement of granular-permission field/flag restrictions with no side-channel escalation via  SetFlag / ClearFlag  or restricted-field assignment&lt;/li&gt;
&lt;li&gt;Correct interaction with the transaction queue (delegated transactions cannot queue — PR &lt;a href="https://github.com/XRPLF/rippled/pull/7640" rel="noopener noreferrer"&gt;#7640&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Correct  account_tx  attribution semantics under regular-key and multi-sign paths (PR &lt;a href="https://github.com/XRPLF/rippled/pull/6126" rel="noopener noreferrer"&gt;#6126&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Independence of delegation from  asfDisableMaster  (delegated payments continue to work after the master key is disabled)&lt;/li&gt;
&lt;li&gt;The feature is considered ready for production use at the tested commit level. Future updates to this report will follow any material additions to the delegation surface.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>software</category>
      <category>testing</category>
    </item>
    <item>
      <title>Account Permission Delegation - Testcases</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Wed, 26 Aug 2026 19:15:41 +0000</pubDate>
      <link>https://dev.to/ripplexdev/account-permission-delegation-testcases-3j0b</link>
      <guid>https://dev.to/ripplexdev/account-permission-delegation-testcases-3j0b</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Test Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core Functional&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial / Security&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-Feature Interactions&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;179&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Core Functional
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test DelegateSet with permissions field&lt;/li&gt;
&lt;li&gt;Test DelegateSet skipped before payment&lt;/li&gt;
&lt;li&gt;Test DelegateSet without permissions field&lt;/li&gt;
&lt;li&gt;Test DelegateSet with empty list&lt;/li&gt;
&lt;li&gt;Test DelegateSet with permissions as non-JSON&lt;/li&gt;
&lt;li&gt;Test DelegateSet by non-existing account&lt;/li&gt;
&lt;li&gt;Test DelegateSet by non-existing authorize account&lt;/li&gt;
&lt;li&gt;Test DelegateSet by account with deposit auth enabled&lt;/li&gt;
&lt;li&gt;Test DelegateSet and submit different transaction&lt;/li&gt;
&lt;li&gt;Test DelegateSet and submit transaction as original account&lt;/li&gt;
&lt;li&gt;Test DelegateSet with same permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet to self&lt;/li&gt;
&lt;li&gt;Test DelegateSet with invalid permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet with restricted permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet with 10 permissions&lt;/li&gt;
&lt;li&gt;Test DelegateSet with more than 10 permissions&lt;/li&gt;
&lt;li&gt;Test DelegateSet with multiple permissions&lt;/li&gt;
&lt;li&gt;Test DelegateSet and delete delegated account&lt;/li&gt;
&lt;li&gt;Test DelegateSet and delete delegating account&lt;/li&gt;
&lt;li&gt;Test DelegateSet and make pay self&lt;/li&gt;
&lt;li&gt;Test DelegateSet and make pay delegated account without deposit auth&lt;/li&gt;
&lt;li&gt;Test DelegateSet and make pay delegated account with deposit auth&lt;/li&gt;
&lt;li&gt;Test DelegateSet authorize multiple users&lt;/li&gt;
&lt;li&gt;Test DelegateSet and submit AccountSet as original account&lt;/li&gt;
&lt;li&gt;Test DelegateSet and make payment&lt;/li&gt;
&lt;li&gt;Test DelegateSet and offer create&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and cash check&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and cancel check&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and finish escrow&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and cancel escrow&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and claim paychan&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create and fund paychan&lt;/li&gt;
&lt;li&gt;Test DelegateSet and payment on ticket&lt;/li&gt;
&lt;li&gt;Test DelegateSet and create trustline&lt;/li&gt;
&lt;li&gt;Test DelegateSet and clawback&lt;/li&gt;
&lt;li&gt;Test DelegateSet and AMM create&lt;/li&gt;
&lt;li&gt;Test DelegateSet and AMM deposit&lt;/li&gt;
&lt;li&gt;Test DelegateSet multiple times with same permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet remove permission add same permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet change in permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet and update with invalid permission&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission TrustlineAuthorize&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission TrustlineFreeze and TrustlineUnfreeze individual freeze&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission TrustlineFreeze global freeze&lt;/li&gt;
&lt;li&gt;Test DelegateSet and payment with deep freeze&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission AccountDomainSet&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission AccountEmailHashSet&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission AccountMessageKeySet&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission AccountTransferRateSet&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission AccountTickSizeSet&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission PaymentMint&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission PaymentBurn&lt;/li&gt;
&lt;li&gt;Test DelegateSet granular permission MPTokenIssuanceLock and MPTokenIssuanceUnlock&lt;/li&gt;
&lt;li&gt;Test DelegateSet on account with master key disabled&lt;/li&gt;
&lt;li&gt;Test DelegateSet with empty Permissions revokes delegate authority&lt;/li&gt;
&lt;li&gt;Test DelegateSet with NotDelegable permission rejected&lt;/li&gt;
&lt;li&gt;Test DelegateSet with empty Permissions when no existing Delegate object is rejected&lt;/li&gt;
&lt;li&gt;Test Delegate object appears in authorized account's account_objects&lt;/li&gt;
&lt;li&gt;Test Delegated payment with basic permission succeeds&lt;/li&gt;
&lt;li&gt;Test Delegated unauthorized tx type returns terNO_DELEGATE_PERMISSION&lt;/li&gt;
&lt;li&gt;Test Delegated payment consumes delegate fee, not source fee&lt;/li&gt;
&lt;li&gt;Test AccountDelete on authorized account removes Delegate from both directories&lt;/li&gt;
&lt;li&gt;Test Token escrow — delegate create and finish escrow (IOU)&lt;/li&gt;
&lt;li&gt;Test Token escrow — delegate create and finish escrow (MPT)&lt;/li&gt;
&lt;li&gt;Test Circular delegation — positive scenario&lt;/li&gt;
&lt;li&gt;Test Circular delegation — negative scenario&lt;/li&gt;
&lt;li&gt;Test Chain delegation — positive scenario&lt;/li&gt;
&lt;li&gt;Test Chain delegation — negative scenario&lt;/li&gt;
&lt;li&gt;Test Delegated account with multiple signers and master key disabled&lt;/li&gt;
&lt;li&gt;Test Delegated account with multiple signers and master key not disabled&lt;/li&gt;
&lt;li&gt;Test Authorized account with multiple signers and master key disabled&lt;/li&gt;
&lt;li&gt;Test Authorized account with multiple signers and master key not disabled&lt;/li&gt;
&lt;li&gt;Test DelegateSet with base reserve on delegating account&lt;/li&gt;
&lt;li&gt;Test DelegateSet with base reserve on delegated account&lt;/li&gt;
&lt;li&gt;Test DelegateSet with no funds for fee on delegated account&lt;/li&gt;
&lt;li&gt;Test Delegation to Batch tfAllOrNothing — all payments (outer transaction)&lt;/li&gt;
&lt;li&gt;Test Delegation to Batch tfAllOrNothing — all payments (inner transaction)&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet WalletLocator granular permission&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet NFTokenMinter granular permission&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet combined field and flag&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet ClearFlag granular permission&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet SetFlag with granular permission&lt;/li&gt;
&lt;li&gt;Test Delegate granular permission exceeds scope&lt;/li&gt;
&lt;li&gt;Test Delegate multiple granular permissions with no full AccountSet&lt;/li&gt;
&lt;li&gt;Test Delegate AccountSet restricted field returns correct error code&lt;/li&gt;
&lt;li&gt;Test Delegate transaction with fee greater than account balance&lt;/li&gt;
&lt;li&gt;Test Delegate payment amount exceeds balance&lt;/li&gt;
&lt;li&gt;Test Delegate reserve manipulation via trustline creation&lt;/li&gt;
&lt;li&gt;Test Delegate using regular key instead of master&lt;/li&gt;
&lt;li&gt;Test Delegator regular key change during active delegation&lt;/li&gt;
&lt;li&gt;Test Batch tfAllOrNothing with payment and DelegateSet&lt;/li&gt;
&lt;li&gt;Test DelegateSet with Delegate field set&lt;/li&gt;
&lt;li&gt;Test Delegate trustline freeze without permission&lt;/li&gt;
&lt;li&gt;Test Delegate bypass RequireAuth flag&lt;/li&gt;
&lt;li&gt;Test Delegate permission change removes old permission&lt;/li&gt;
&lt;li&gt;Test Delegate payment with deposit auth bypass attempt&lt;/li&gt;
&lt;li&gt;Test Delegate offer crossing with unauthorized account&lt;/li&gt;
&lt;li&gt;Test Delegate conflicting granular permissions&lt;/li&gt;
&lt;li&gt;Test Delegate all granular AccountSet permissions — no flag access&lt;/li&gt;
&lt;li&gt;Test Delegate with zero-amount payment&lt;/li&gt;
&lt;li&gt;Test Delegate multi-signed transaction&lt;/li&gt;
&lt;li&gt;Test Delegate with multi-signers on delegated and authorized account&lt;/li&gt;
&lt;li&gt;Test Payment offline signing&lt;/li&gt;
&lt;li&gt;Test Delegate payment with offline signing&lt;/li&gt;
&lt;li&gt;Test Delegate payment by third party with offline signing&lt;/li&gt;
&lt;li&gt;Test account_tx  delegate_filter=actor  returns delegated txns&lt;/li&gt;
&lt;li&gt;Test account_tx  delegate_filter=authorizer  returns delegated txns&lt;/li&gt;
&lt;li&gt;Test account_tx  counter_party  narrows results&lt;/li&gt;
&lt;li&gt;Test account_tx  delegate_filter=actor  returns empty for authorizer&lt;/li&gt;
&lt;li&gt;Test account_tx  counter_party  no-match returns empty&lt;/li&gt;
&lt;li&gt;Test account_tx with malformed  delegate  returns invalidParams&lt;/li&gt;
&lt;li&gt;Test account_tx with malformed  counter_party  returns actMalformed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Adversarial / Security
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test DelegateSet replaces existing permissions (silently revoking dropped)&lt;/li&gt;
&lt;li&gt;Test DelegateSet to self rejected with temMALFORMED&lt;/li&gt;
&lt;li&gt;Test DelegateSet with duplicate PermissionValues rejected&lt;/li&gt;
&lt;li&gt;Test DelegateSet with eleven permissions rejected&lt;/li&gt;
&lt;li&gt;Test 3.2.0 Vault and Batch tx types are not delegable&lt;/li&gt;
&lt;li&gt;Test 3.2.0 Loan tx types are not delegable&lt;/li&gt;
&lt;li&gt;Test Delegated Batch outer returns terNO_DELEGATE_PERMISSION&lt;/li&gt;
&lt;li&gt;Test Account SignerList cannot authorize delegated tx (returns tefNOT_MULTI_SIGNING)&lt;/li&gt;
&lt;li&gt;Test Delegate SignerList can authorize delegated tx&lt;/li&gt;
&lt;li&gt;Test Delegated tx signed by delegate's master key succeeds&lt;/li&gt;
&lt;li&gt;Test PR #7064 — delegate  sign_for  on own delegated tx returns invalidParams&lt;/li&gt;
&lt;li&gt;Test PR #7064 — delegator can be signer when in delegate's SignerList&lt;/li&gt;
&lt;li&gt;Test Delegate to self rejected with temMALFORMED&lt;/li&gt;
&lt;li&gt;Test DelegateSet with duplicate permission rejected&lt;/li&gt;
&lt;li&gt;Test DelegateSet with unknown PermissionValue rejected&lt;/li&gt;
&lt;li&gt;Test DelegateSet to non-existent account returns tecNO_TARGET&lt;/li&gt;
&lt;li&gt;Test Batch transaction type is not delegable&lt;/li&gt;
&lt;li&gt;Test Delegated tx after revocation returns terNO_DELEGATE_PERMISSION&lt;/li&gt;
&lt;li&gt;Test Delegated payment works after master key disabled&lt;/li&gt;
&lt;li&gt;Test  Delegate  field set to own account rejected with temBAD_SIGNER&lt;/li&gt;
&lt;li&gt;Test Delegated no-op AccountSet rejected&lt;/li&gt;
&lt;li&gt;Test Delegated no-op TrustSet rejected&lt;/li&gt;
&lt;li&gt;Test Delegated SignerListSet rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Delegated SetRegularKey rejected at preflight&lt;/li&gt;
&lt;li&gt;Test AccountSet WalletSize field rejected under granular AccountDomainSet delegate&lt;/li&gt;
&lt;li&gt;Test TrustlineFreeze rejects disallowed flag tfSetNoRipple&lt;/li&gt;
&lt;li&gt;Test TrustlineFreeze rejects disallowed field QualityIn&lt;/li&gt;
&lt;li&gt;Test PaymentBurn rejects disallowed flag tfPartialPayment&lt;/li&gt;
&lt;li&gt;Test PaymentBurn rejects disallowed field Paths&lt;/li&gt;
&lt;li&gt;Test Union of two granular permissions still forbids fields ungranted by either&lt;/li&gt;
&lt;li&gt;Test Union of Freeze and Unfreeze widens allowed flags but not fields&lt;/li&gt;
&lt;li&gt;Test AccountDomainSet delegate cannot smuggle SetFlag asfRequireAuth&lt;/li&gt;
&lt;li&gt;Test AccountDomainSet delegate cannot smuggle SetFlag asfDisableMaster&lt;/li&gt;
&lt;li&gt;Test AccountDomainSet delegate cannot smuggle NFTokenMinter via WalletSize&lt;/li&gt;
&lt;li&gt;Test MPTokenIssuanceLock rejects disallowed field DomainID&lt;/li&gt;
&lt;li&gt;Test MPTokenIssuanceLock rejects unlock flag&lt;/li&gt;
&lt;li&gt;Test PaymentBurn delegate cannot flip issuer to mint&lt;/li&gt;
&lt;li&gt;Test PaymentMint delegate cannot flip issuer to burn&lt;/li&gt;
&lt;li&gt;Test PaymentBurn delegate rejected when holder balance is zero&lt;/li&gt;
&lt;li&gt;Test PaymentMint delegate rejected when destination lacks trustline&lt;/li&gt;
&lt;li&gt;Test Granular Mint/Burn do not authorize XRP payment&lt;/li&gt;
&lt;li&gt;Test DelegateSet rejects truncating PermissionValue&lt;/li&gt;
&lt;li&gt;Test PR #6126 — actor filter ignores regular-key-signed payment&lt;/li&gt;
&lt;li&gt;Test PR #6126 — actor filter ignores multi-sig-signed non-delegated payment&lt;/li&gt;
&lt;li&gt;Test PR #6126 — delegate marker without  delegate  param rejected&lt;/li&gt;
&lt;li&gt;Test PR #6126 — non-delegate marker with  delegate  param rejected&lt;/li&gt;
&lt;li&gt;Test PR #6126 — delegated tx with multi-signed delegatee matches both filters&lt;/li&gt;
&lt;li&gt;Test PR #6126 — delegate actor filter paginates all delegated txns&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cross-Feature Interactions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test Delegate as outer account executes delegated inner (succeeds)&lt;/li&gt;
&lt;li&gt;Test Delegate as BatchSigner authorizes delegated inner (succeeds)&lt;/li&gt;
&lt;li&gt;Test Delegated inner without BatchSigner rejected with temBAD_SIGNER&lt;/li&gt;
&lt;li&gt;Test Delegated inner signed by account holder rejected with temBAD_SIGNER&lt;/li&gt;
&lt;li&gt;Test Delegate without permission — inner fails and Batch rolls back&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTSend — basic&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTSend — missing permission&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTConvert&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTMergeInbox&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTConvertBack&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTClawback by issuer&lt;/li&gt;
&lt;li&gt;Test Delegate — send permission only cannot ConvertBack&lt;/li&gt;
&lt;li&gt;Test Delegate — ConvertBack permission only cannot send&lt;/li&gt;
&lt;li&gt;Test Delegate ConfidentialMPTClawback with non-issuer account rejected at preflight&lt;/li&gt;
&lt;li&gt;Test Delegate — revoked permission blocks subsequent use&lt;/li&gt;
&lt;li&gt;Test Delegate — self-delegation rejected&lt;/li&gt;
&lt;li&gt;Test Delegate — ConfidentialMPTSend with proof over delegate keys rejected&lt;/li&gt;
&lt;li&gt;Test PR #7640 — delegated payment rejected with telCAN_NOT_QUEUE when ledger full&lt;/li&gt;
&lt;li&gt;Test PR #7640 — delegated payment succeeds when paying open ledger fee&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>security</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>UBRI Student Builder Residency Cohort 3.0: A New Frontier for High-Impact XRPL Innovation</title>
      <dc:creator>Emma Nasseri</dc:creator>
      <pubDate>Mon, 29 Jun 2026 14:48:06 +0000</pubDate>
      <link>https://dev.to/ripplexdev/ubri-student-builder-residency-cohort-30-a-new-frontier-for-high-impact-xrpl-innovation-3j18</link>
      <guid>https://dev.to/ripplexdev/ubri-student-builder-residency-cohort-30-a-new-frontier-for-high-impact-xrpl-innovation-3j18</guid>
      <description>&lt;p&gt;This spring marked Cohort 3.0 of the XRPL Student Builder Residency (SBR), a program run by Ripple's &lt;a href="https://ripple.com/impact/ubri/" rel="noopener noreferrer"&gt;University Blockchain Research Initiative (UBRI)&lt;/a&gt; that supports the development of the next generation of blockchain developers through global university partnerships.&lt;/p&gt;

&lt;p&gt;SBR 3.0 brought together an elite cohort of student builders from universities around the world to imagine, build, and ship new use cases on the XRP Ledger.&lt;/p&gt;

&lt;p&gt;The 14 selected students built leveraging Smart Escrows (&lt;a href="https://opensource.ripple.com/docs/xls-100-smart-escrows?__hstc=78174987.a6ed1d40ea7d03f751fd15242a2e11e6.1748562634173.1778076643532.1778516395428.81&amp;amp;__hssc=78174987.1.1778516395428&amp;amp;__hsfp=c8f1fa5b8e461a8c2f0c73758995b293" rel="noopener noreferrer"&gt;XLS-100&lt;/a&gt;), Ripple’s RLUSD stablecoin, interoperability primitives, the new Lending Protocol (&lt;a href="https://xrpl.org/resources/known-amendments#lendingprotocol" rel="noopener noreferrer"&gt;XLS-66&lt;/a&gt;), and more. &lt;/p&gt;

&lt;h3&gt;
  
  
  Project Focus
&lt;/h3&gt;

&lt;p&gt;From lending protocols to cross-border payment rails, here's what the cohort shipped:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlas (Sankara Wigneswaran, ESILV Paris):&lt;/strong&gt; An overcollateralized lending protocol built on the XRP Ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cascrow (Paul Wagner &amp;amp; Jan-Niklas Möller, EBS University):&lt;/strong&gt; An AI-powered verification and escrow platform on XRPL that automates RLUSD payouts once milestone proof is validated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ShipSure (Hassene Ezzeddine, ETH Zurich):&lt;/strong&gt; A trustless cross-chain escrow platform that automatically releases XRP payments to sellers only when real-world FedEx delivery is cryptographically verified on-chain via Flare's Data Connector. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Returnee (Sejal Jain, Cornell Tech)&lt;/strong&gt;: A smart package drop-off box for apartment buildings that gives residents an instant refund the moment the courier verifies their return.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zipp (Antonio Meneses, IE Madrid):&lt;/strong&gt; Automates cross-border supplier payments for Latin American importers using AI invoice extraction and XRPL settlement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TerraSwap (Youssef Jeddi, EPFL-ETHZ):&lt;/strong&gt; A stablecoin DEX on XRPL where compliance is enforced at the protocol level through credential-gated Permissioned Domains. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verix (Sumit Shinde, National University of Singapore):&lt;/strong&gt; A trustless task settlement for AI agents. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidiq - صِدِّيق (Madiha Zafar, University of Birmingham):&lt;/strong&gt; A decentralized interest-free lending protocol on the XRP Ledger, giving underserved communities access to Qard Hasan microloans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UniPay (Junaid Oozeerally, NYU Abu Dhabi):&lt;/strong&gt; A blockchain-based payment and escrow platform on XRPL that enables students across the world to securely and instantly access international educational services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PayTrace (Ranjana K. Kodandaraman, University of Birmingham):&lt;/strong&gt; A real-time cross-border payment intelligence layer for SMEs that provides end-to-end settlement visibility and invoice matching powered by the XRP Ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DropIn (Aaron Zheng, University of Pittsburgh):&lt;/strong&gt; A per-article micropayment platform where readers pay cents to unlock individual articles instead of committing to monthly subscriptions. Publishers set their own prices and receive instant payments directly via the XRPL. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SafiPoints (Enock Mecheo, NYU Abu Dhabi):&lt;/strong&gt; A blockchain-powered loyalty platform where restaurants issue and redeem verifiable loyalty tokens on the XRP Ledger, and customers earn and claim rewards via SMS with no app download and no crypto knowledge required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freeway (Irene del Carmen Gracia Perez, IE University):&lt;/strong&gt; A turnkey API gateway that lets developers monetize their endpoints using XRP prepaid credits. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Beyond the Code: What Four Weeks can Do&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most students came in as XRPL beginners. Four weeks later, nearly all were shipping independently on-chain. According to self-assessments, the students’ developer skills increased by an average of 52% and their knowledge of blockchain technology grew 98%.&lt;/p&gt;

&lt;p&gt;Beyond the numbers, the students shared deeper wins and takeaways. In their own words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Made my first (and not last) project on XRPL." — Youssef&lt;br&gt;&lt;br&gt;
"Built a much stronger introduction to blockchain through a real end-to-end product." — Sejal&lt;br&gt;&lt;br&gt;
"Met with incredibly successful and driven people. It motivated me to work harder and become a better developer." — Junaid&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;92% of participants said they were proud of what they accomplished throughout the residency, and almost all are sure they’ll continue building. Nearly every student noted they hope to support the program in the future through peer mentorship as it continues to grow and create new opportunities for others. &lt;/p&gt;

&lt;p&gt;Beyond generating creative XRPL projects or new use cases, the Student Builder Residency is about supporting young builders developing cutting-edge technology while paving the paths for others to follow them.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Looking To The Future&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Across three cohorts, the Student Builder Residency has produced 40+ high-quality projects built on the XRP Ledger, shipped by students from 28 universities across the globe.&lt;/p&gt;

&lt;p&gt;The next generation of developers is already building solutions for the future of financial technology. Between classes and exams, they’ve been hard at work ideating, innovating, and iterating infrastructure for the internet of value. &lt;/p&gt;

&lt;p&gt;This program could not have been possible without the dedicated mentors Tushar Pardhe (WellArrive), Modupe Diyaolu (meCash), Ashley Rho (Ripple), Sree Sanakkayala (CoverMax), Dhruv Shah (Flare), Filip Koprivec (Flare), and Satyam Singh. &lt;/p&gt;

&lt;p&gt;We are especially grateful for the support of this year’s peer mentors and program alumni Stan Stelcher (SBR 1.0), Alex Salsali (SBR 2.0), and Nischay Rawal (SBR 2.0) who have been integral in shaping the culture and community of the Student Builder Residency across all three cohorts.&lt;/p&gt;

&lt;p&gt;Follow Ripple (&lt;a href="https://www.linkedin.com/company/ripple/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://x.com/Ripple" rel="noopener noreferrer"&gt;X&lt;/a&gt;) on social media for future updates!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>learning</category>
      <category>softwaredevelopment</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
