<?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>Forem: RippleX Developers</title>
    <description>The latest articles on Forem by RippleX Developers (@ripplexdev).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4275%2Fc928fdb3-3be0-427c-971c-2224f6c6224a.jpeg</url>
      <title>Forem: RippleX Developers</title>
      <link>https://forem.com/ripplexdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ripplexdev"/>
    <language>en</language>
    <item>
      <title>Permissioned DEX: Building the Next Layer of Liquidity on XRPL</title>
      <dc:creator>Antonio Kaplan</dc:creator>
      <pubDate>Wed, 11 Feb 2026 15:48:49 +0000</pubDate>
      <link>https://forem.com/ripplexdev/permissioned-dex-building-the-next-layer-of-liquidity-on-xrpl-22l3</link>
      <guid>https://forem.com/ripplexdev/permissioned-dex-building-the-next-layer-of-liquidity-on-xrpl-22l3</guid>
      <description>&lt;p&gt;The &lt;a href="http://xrpl.org" rel="noopener noreferrer"&gt;XRP Ledger&lt;/a&gt; has always stood apart for its simplicity and resilience. Since 2012, its &lt;a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange" rel="noopener noreferrer"&gt;built-in decentralized exchange (DEX)&lt;/a&gt; has processed trades continuously proving that low-cost, on-ledger markets can operate at scale. Over time, features like AMMs and &lt;a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens" rel="noopener noreferrer"&gt;Multi-Purpose Tokens (MPTs)&lt;/a&gt; have expanded its toolkit, opening new possibilities without sacrificing efficiency or decentralization.&lt;/p&gt;

&lt;p&gt;Now the next major evolution is here: &lt;a href="https://xls.xrpl.org/xls/XLS-0081-permissioned-dex.html" rel="noopener noreferrer"&gt;the Permissioned DEX&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Permissioned DEX Matters
&lt;/h2&gt;

&lt;p&gt;This feature introduces a permissioned DEX system for the XRPL. By integrating permissioning features directly into the DEX protocol, regulated financial institutions can participate in the XRPL's DEX while still adhering to their compliance requirements. This approach avoids the drawbacks of isolated, permissioned tokens or private blockchains, ensuring a vibrant, liquid marketplace that facilitates seamless arbitrage. Ultimately, this permissioned DEX system paves the way for wider institutional adoption of XRPL, fostering a more accessible and efficient financial landscape.&lt;/p&gt;

&lt;p&gt;The open DEX isn’t going anywhere. It will continue to function exactly as it does today, enabling anyone to place and fill offers. Permissioned DEX builds alongside it giving developers and institutions an option to create permissioned order books tied to verified credentials.&lt;/p&gt;

&lt;p&gt;This is key to unlocking real-world financial flows. Most regulated institutions can’t engage on open systems without counterparties being verified. By enabling credential-gated liquidity on the same ledger as open markets, XRPL becomes far more suitable for institutional-grade payments, FX, and settlement use cases.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/184YnbiY9-s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissioned DEX as a Hybrid Innovation
&lt;/h2&gt;

&lt;p&gt;The true novelty of XLS-81 lies in its implementation as the industry’s first permissioned and permissionless hybrid system. Previous institutional DeFi attempts struggled to gain traction because pools of capital were disconnected from the broader market. These walled gardens often suffered from thin liquidity and inefficient pricing, ultimately failing to provide the depth that institutional players require.&lt;/p&gt;

&lt;p&gt;The Permissioned DEX avoids this pitfall by building regulated order books directly into the existing, battle-tested DEX protocol. This creates a symbiotic liquidity engine: because both open and permissioned markets live on the same ledger, market participants can perform seamless arbitrage between them. &lt;/p&gt;

&lt;p&gt;The hybrid model is key to unlocking institutional-grade cross-border payments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared Institutional Liquidity&lt;/strong&gt;: Regulated entities can tap into deep, shared pools of liquidity to move value without fragmenting capital.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Local Payout&lt;/strong&gt;: Institutions achieve near-instant settlement by connecting payment corridors through a unified ledger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Policy Control&lt;/strong&gt;: Issuers maintain the ability to enforce jurisdiction-specific compliance and KYC requirements at the protocol level. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an institutional order book moves out of sync with the global market, the open DEX provides the necessary liquidity to correct it instantly. This relationship ensures that regulated financial flows aren't just compliant. They are efficient, liquid, and deeply integrated into the entire XRPL ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works at the Protocol Level
&lt;/h2&gt;

&lt;p&gt;Delivering an onchain FX and settlement network with shared institutional liquidity, instant local payout, and full policy control on XRPL depends on a small set of core building blocks working together. To understand how this vision comes together, it helps to look at how the individual pieces fit together using the familiar experience of international travel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/resources/known-amendments#credentials" rel="noopener noreferrer"&gt;Credentials (XLS-70)&lt;/a&gt;: &lt;strong&gt;The Digital Passport&lt;/strong&gt;: This acts like your travel documents. These are verifiable proofs of identity or compliance issued by trusted authorities. Just as a passport proves who you are to a foreign official, these credentials allow participants to prove their status on-ledger without revealing sensitive private data.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/resources/known-amendments#permissioneddomains" rel="noopener noreferrer"&gt;Permissioned Domains (XLS-80)&lt;/a&gt;: &lt;strong&gt;The Visa Process&lt;/strong&gt;: Each country sets its own requirements for who may enter its borders. Similarly, Permissioned Domains define the specific entry requirements for a regulated environment on XRPL. This is where an issuer or institution decides which specific credentials (visas) are required for a participant to access their liquidity.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/resources/known-amendments#permissioneddex" rel="noopener noreferrer"&gt;Permissioned DEX (XLS-81)&lt;/a&gt;: &lt;strong&gt;The Transportation Network&lt;/strong&gt;: International travel does not end at the border. Once admitted, travelers use connecting routes and local transportation to reach their final destination. The Permissioned DEX provides these high-speed "routes" via native order books that only accept trades from verified participants. These routes are built into the XRPL itself, ensuring that trades are instant, secure, and fully compliant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these tools create a flexible system: open markets remain fully open, while permissioned markets can operate with credential-based gating. Liquidity isn’t siloed across external venues. It remains on ledger in a trusted, policy-controlled environment designed for financial institutions.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/48PAr7iyE28?start=10"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Applications
&lt;/h2&gt;

&lt;p&gt;For developers and market makers, Permissioned DEX is not about replacing what exists today, it’s about unlocking new flows that currently bypass XRPL altogether.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foreign Exchange&lt;/strong&gt;: Onchain FX and settlement network that uses shared institutional liquidity to power cross-border payments with instant local payout and full policy control on XRPL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B2B and Treasury Payments&lt;/strong&gt;: Corporates converting between stablecoins and fiat-backed assets across regions with compliance features built in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stablecoin Issuers&lt;/strong&gt;: Opportunities to increase liquidity and the adoption of their relevant stablecoin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: Permissioned DEX brings fresh liquidity into XRPL, benefiting the open DEX as well as new permissioned venues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Strengthens the XRPL Ecosystem
&lt;/h2&gt;

&lt;p&gt;Permissioned DEX enables regulated payment and treasury flows to take place directly on the Ledger, rather than being limited to bilateral or externally constrained venues. Compliance-focused order books at the protocol level allow the XRPL to support regulated participation across both fiat-backed and blockchain-native assets.&lt;br&gt;
Instead of pre-funding accounts in every corridor, institutions access shared institutional liquidity on the XRPL where FX and settlement occur atomically. Local payouts are executed via domestic rails only after value has been exchanged on-ledger which reduces settlement and counterparty risk.&lt;/p&gt;

&lt;p&gt;Value is created and captured by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparent Pricing&lt;/strong&gt;: Institutions benefit from the competitive, transparent FX pricing generated by shared liquidity pools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capital Efficiency&lt;/strong&gt;: Lower capital requirements by reducing the need for pre-funding (nostro/vostra accounts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk Mitigation&lt;/strong&gt;: Atomic settlement removes the timing and counterparty risks inherent in traditional multi-day settlement cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Compliance&lt;/strong&gt;: Policy enforcement and transparency are handled by protocol logic, ensuring every trade meets regulatory standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As more regulated flows are executed on-ledger, they contribute to deeper liquidity, broader participation, and increased network usage. This shared liquidity model supports both open DeFi and regulated financial activity on the same ledger, without fragmenting markets across separate systems. &lt;br&gt;
Over time, this dynamic reinforces a positive feedback loop: greater transaction volume attracts more liquidity providers and developers, which in turn improves market depth and utility. This further strengthens the XRPL’s relevance as a global settlement layer, and is a key step towards bringing the financial system onchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Ripple Plans to Utilize The Permissioned DEX
&lt;/h2&gt;

&lt;p&gt;The permissioned DEX provides a compliance-focused on-ledger marketplace for FX and liquidity, enabling institutions to route payments efficiently across currencies. By combining shared liquidity with policy enforcement it delivers lower costs, instant local payout and reduced settlement risk.&lt;br&gt;
Ripple plans to utilize Permissioned DEX as an on-ledger mechanism for asset conversion within payment and treasury workflows, including cross-border payments, B2B transfers, and stablecoin-based settlement.&lt;br&gt;
At a high level, Ripple routes the conversion step of these flows through a permissioned order book, where only verified liquidity providers can participate. Depending on available liquidity and pricing, conversions may execute directly between assets or route across intermediate pairs, settling atomically on XRPL.&lt;br&gt;
For example, in a USD–Colombia corridor, a payment funded in RLUSD can convert on-ledger into a COP-denominated asset via permissioned liquidity, after which the payout partner redeems locally through existing rails. If the pricing were more favorable via an alternative trade route, that path would be executed instead.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Batch Transaction - QA Test Report</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Mon, 09 Feb 2026 20:09:39 +0000</pubDate>
      <link>https://forem.com/ripplexdev/batch-transaction-qa-test-report-17em</link>
      <guid>https://forem.com/ripplexdev/batch-transaction-qa-test-report-17em</guid>
      <description>&lt;p&gt;&lt;strong&gt;Test Report Date&lt;/strong&gt;: 2/6/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;br&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: GitLab CI Runner (Ubuntu 22.04)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;br&gt;
This report presents the results of QA testing performed on &lt;code&gt;Batch&lt;/code&gt; transaction on xrpld network.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Feature
&lt;/h3&gt;

&lt;p&gt;This section provides a brief summary of the feature being tested. The feature under test is designed to deliver specific functionality as defined in the project specifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature Name&lt;/strong&gt;: Batch Transaction&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The proposed Batch amendment to the XRP Ledger (XRPL) protocol allows multiple transactions to be packaged together and executed as a single unit. It's like laying the foundation, building the walls, and raising the roof all in one single secure step, leveraging the existing strengths of the XRP Ledger. If you're unable to afford the roof, you won't even bother laying the foundation.&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;h3&gt;
  
  
  2. Test Scope
&lt;/h3&gt;

&lt;p&gt;This round of testing focuses solely on ensuring that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All specified functionalities are working as expected.&lt;/li&gt;
&lt;li&gt;The API handles valid and invalid input gracefully.&lt;/li&gt;
&lt;li&gt;Integration with other features is functioning correctly.&lt;/li&gt;
&lt;li&gt;Feature validation includes both RPC and WebSockets to ensure consistent behavior across different 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 Testing&lt;/td&gt;
&lt;td&gt;Verifying each endpoint against defined specifications to ensure it behaves as expected.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression Testing&lt;/td&gt;
&lt;td&gt;Running relevant test cases to confirm that recent changes did not break existing functionalities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End to end Testing&lt;/td&gt;
&lt;td&gt;Involves testing the complete flow of a feature confirming that different components of the application, potentially developed by different teams work together as expected.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  4. Test Environment
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Ubuntu 22.04 (LTS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Cores&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;Pytest/Shell script&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  5. 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;Feature Testing&lt;/td&gt;
&lt;td&gt;232&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression Testing&lt;/td&gt;
&lt;td&gt;3356&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Feature commit:&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;commit 2a61aee5620725f8249e3066616ef6e20c99c857
Author: Denis Angell &amp;lt;dangell@transia.co&amp;gt;
Date:   Fri May 23 21:53:53 2025 +0200

    Add Batch feature (XLS-56) (#5060)

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

&lt;/div&gt;



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

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

&lt;p&gt;No new bugs have been reported post-feature commit.&lt;/p&gt;

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

&lt;p&gt;This feature has undergone comprehensive functional, regression, and end to end testing. The majority of the test cases have been executed successfully, with positive outcomes confirming that the core functionalities are working as expected.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>cicd</category>
      <category>testing</category>
      <category>web3</category>
    </item>
    <item>
      <title>Batch Transaction - Testcases</title>
      <dc:creator>Ramkumar SG</dc:creator>
      <pubDate>Mon, 09 Feb 2026 20:09:17 +0000</pubDate>
      <link>https://forem.com/ripplexdev/batch-transaction-testcases-273j</link>
      <guid>https://forem.com/ripplexdev/batch-transaction-testcases-273j</guid>
      <description>&lt;p&gt;&lt;strong&gt;Mode: allornothing&lt;/strong&gt;&lt;/p&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;/ol&gt;

&lt;p&gt;&lt;strong&gt;Mode: onlyone&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Mode: untilfailure&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Mode: independent&lt;/strong&gt;&lt;/p&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;p&gt;&lt;strong&gt;Multi account tests (with signers)&lt;/strong&gt;&lt;/p&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[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete accounts too soon with other account as signer[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete accounts too soon with other account as signer[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount delete accounts too soon with other account as signer[Batch.tfIndependent]&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[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount alice creates offer bob creates offer[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount alice creates offer bob creates offer[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount alice creates offer bob creates offer[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create nftokenmint nftokenoffercreate fails reverts nftokenmint[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create nftokenmint nftokenoffercreate fails reverts nftokenmint[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create nftokenmint nftokenoffercreate fails reverts nftokenmint[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch multiaccount create nftokenmint nftokenoffercreate fails reverts nftokenmint[Batch.tfIndependent]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Batch with Vault transactions&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch with vault create[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault create[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault create[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault create[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with vault set[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault set[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault set[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault set[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with vault deposit[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault deposit[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault deposit[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault deposit[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with vault withdraw[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault withdraw[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault withdraw[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault withdraw[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with vault delete[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault delete[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault delete[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault delete[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with vault clawback[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with vault clawback[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with vault clawback[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with vault clawback[Batch
.tfIndependent]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Batch with LoanBroker/Loan transactions&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch with loan broker set[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker set[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker set[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker set[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker delete[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker delete[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker delete[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker delete[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover deposit[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover deposit[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover deposit[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover deposit[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover withdraw[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover withdraw[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover withdraw[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover withdraw[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover clawback[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover clawback[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover clawback[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan broker cover clawback[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan set[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan set[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan set[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan set[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan pay[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan pay[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan pay[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan pay[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan delete[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan delete[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan delete[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan delete[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with loan manage[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with loan manage[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with loan manage[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with loan manage[Batch
.tfIndependent]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Batch with various transaction types&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch transaction type trustset[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type trustset[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type trustset[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type trustset[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type offercreate[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type offercreate[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type offercreate[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type offercreate[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type account set[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type account set[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type account set[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type account set[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type escrow create[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type escrow create[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type escrow create[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type escrow create[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type check create[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type check create[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type check create[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type check create[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type nftokenmint[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type nftokenmint[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type nftokenmint[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type nftokenmint[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with ticket create transaction&lt;/li&gt;
&lt;li&gt;Test Batch transaction type signerlistset[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type signerlistset[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type signerlistset[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type signerlistset[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type depositpreauth[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type depositpreauth[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type depositpreauth[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch transaction type depositpreauth[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;TODO: Batch transaction with MPT as inner transactions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Miscellaneous tests&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test Batch empty raw transactions[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch empty raw transactions[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch empty raw transactions[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch empty raw transactions[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with one raw transaction[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with one raw transaction[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with one raw transaction[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with one raw transaction[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having no tfInnerBatchTxn flag[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having no tfInnerBatchTxn flag[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having no tfInnerBatchTxn flag[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with all inner transactions having no tfInnerBatchTxn flag[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with some inner transactions having no tfInnerBatchTxn flag[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with some inner transactions having no tfInnerBatchTxn flag[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with some inner transactions having no tfInnerBatchTxn flag[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with some inner transactions having no tfInnerBatchTxn flag[Batch.tfIndependent]&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[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having no fee field[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having no fee field[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having no fee field[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values[-1.5]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values[1.5]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values[fee value3]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having invalid fee values[~!@#$%^&amp;amp;*() -=+[{&amp;lt;&amp;gt;]};&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having bad fee values[-1]&lt;/li&gt;
&lt;li&gt;Test Batch with inner transactions having bad fee values[1]&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 invalid inner transactions[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with invalid inner transactions[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with invalid inner transactions[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with invalid inner transactions[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch inside non empty batch[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch inside non empty batch[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch inside non empty batch[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch inside non empty batch[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch inside empty batch[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch inside empty batch[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch inside empty batch[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch inside empty batch[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with same sequence[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with past sequence[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with past sequence[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with past sequence[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with past sequence[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with future not incremental sequences[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with future not incremental sequences[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with future not incremental sequences[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch inner txns with future not incremental sequences[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with account does not exist[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with account does not exist[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with account does not exist[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with account does not exist[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with deposit auth on account[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with deposit auth on account[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with deposit auth on account[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with deposit auth on account[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch with master key disabled on account[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch with master key disabled on account[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch with master key disabled on account[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch with master key disabled on account[Batch.tfIndependent]&lt;/li&gt;
&lt;li&gt;Test Batch all payments with destination account not funded[Batch.tfAllOrNothing]&lt;/li&gt;
&lt;li&gt;Test Batch all payments with destination account not funded[Batch.tfOnlyOne]&lt;/li&gt;
&lt;li&gt;Test Batch all payments with destination account not funded[Batch.tfUntilFailure]&lt;/li&gt;
&lt;li&gt;Test Batch all payments with destination account not funded[Batch.tfIndependent]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Pending Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TODO: Batch transaction with MPT as inner transactions&lt;/p&gt;

</description>
      <category>backend</category>
      <category>blockchain</category>
      <category>softwaredevelopment</category>
      <category>testing</category>
    </item>
    <item>
      <title>Lending Protocol - QA Test Report</title>
      <dc:creator>Mani Mounika Kunasani</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:23:24 +0000</pubDate>
      <link>https://forem.com/ripplexdev/lending-protocol-qa-test-report-45i5</link>
      <guid>https://forem.com/ripplexdev/lending-protocol-qa-test-report-45i5</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;strong&gt;Test Report Date&lt;/strong&gt;: 01/28/2026&lt;br&gt;
&lt;strong&gt;Prepared By&lt;/strong&gt;: QA Team [&lt;a href="https://github.com/mounikakun" rel="noopener noreferrer"&gt;mounikakun&lt;/a&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 (Ubuntu 22.04)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;br&gt;
This report presents the results of QA testing performed on &lt;code&gt;Lending Protocol&lt;/code&gt; across xrpld network.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Feature&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This section provides a brief summary of the feature being tested. The feature under test is designed to deliver specific functionality as defined in the project specifications. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature Name:&lt;/strong&gt; Lending Protocol&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; &lt;br&gt;
This proposal introduces fundamental primitives for an XRP Ledger-native Lending Protocol. The protocol offers straightforward on-chain uncollateralized fixed-term loans, utilizing pooled funds with pre-set terms for interest-accruing loans. The design relies on off-chain underwriting and risk management to assess the creditworthiness of the borrowers. However, the First-Loss Capital protection scheme absorbs some of the losses in case of a Loan Default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specification Reference&lt;/strong&gt;: &lt;a href="https://github.com/Tapanito/XRPL-Standards/tree/xls-66-lending-protocol/XLS-0066-lending-protocol" rel="noopener noreferrer"&gt;https://github.com/Tapanito/XRPL-Standards/tree/xls-66-lending-protocol/XLS-0066-lending-protocol&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. Test Scope&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This testing phase represents one of our most comprehensive quality assurance efforts, reflecting the inherent complexity and critical nature of the Lending Protocol. Unlike standard updates, this feature required an exhaustive deep dive into cross functional dependencies and multi layered ledger entries.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amortization &amp;amp; Interest Calculations:&lt;/strong&gt; We conducted exhaustive verification of the Standard Amortization formulas, validating precision across varying interest rates and payment schedules. This included testing "Re-amortization" events to confirm that no value was lost or orphaned during mid loan adjustments ensuring that deposits and withdrawals within Vaults synchronize perfectly with loan funding and repayments, maintaining parity between ledger states.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Edge Case Handling:&lt;/strong&gt; Simulated varied conditions, including clawbacks and asset specific freezes, to confirm that the API and ledger entries remain consistent. Every valid and invalid input was mapped against the scenarios to guarantee that the API handles edge cases gracefully without compromising the integrity of the Vault, LoanBroker or Loan ledger entries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security-First Evaluation (Attackathon):&lt;/strong&gt; Successfully completed a specialized Attackathon to identify potential vulnerabilities. All identified bugs and issues were fully addressed and resolved to ensure the protocol's long term security and integrity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Integration:&lt;/strong&gt; Performed rigorous testing across all system components to ensure seamless interaction between core features, while ensuring consistent enforcement of controls and restrictions across the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Interface Validation:&lt;/strong&gt; Executed testing across RPC and WebSockets to guarantee uniform system behavior and data consistency across the supported interfaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3. Types of Testing Conducted&lt;/strong&gt;
&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 Testing&lt;/td&gt;
      &lt;td&gt;Verifying each endpoint against defined specifications to ensure it behaves as expected.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Regression Testing&lt;/td&gt;
      &lt;td&gt;Running relevant test cases to confirm that recent changes did not break existing functionalities.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;End to end Testing&lt;/td&gt;
      &lt;td&gt;Involves testing the complete flow of a feature confirming that different components of the application, potentially developed by different teams work together as expected.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. Test Environment&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; Component &lt;/th&gt;
      &lt;th&gt; Details &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;OS&lt;/td&gt;
      &lt;td&gt;Ubuntu 22.04 (LTS)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;CPU Cores&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; Memory &lt;/td&gt;
      &lt;td&gt; 128 GB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Test Framework&lt;/td&gt;
      &lt;td&gt;Pytest/Shell script&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;5. Test Results Summary&lt;/strong&gt;
&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; Test Count &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Feature Testing&lt;/td&gt;
      &lt;td&gt;796&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Regression Testing&lt;/td&gt;
      &lt;td&gt;2880&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th colspan="2"&gt; Feature Tests &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanBrokerSet&lt;/td&gt;
      &lt;td&gt;132&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanBrokerDelete&lt;/td&gt;
      &lt;td&gt;24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanBrokerCoverDeposit&lt;/td&gt;
      &lt;td&gt;69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanBrokerCoverWithdraw&lt;/td&gt;
      &lt;td&gt;91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanBrokerCoverClawback&lt;/td&gt;
      &lt;td&gt;40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanSet&lt;/td&gt;
      &lt;td&gt;197&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanDelete&lt;/td&gt;
      &lt;td&gt;37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanManage&lt;/td&gt;
      &lt;td&gt;77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;LoanPay&lt;/td&gt;
      &lt;td&gt;129&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Feature Commit:&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;commit 138d6e751b4e58853093eceb27e861af5e39129c
Author: Ed Hennis &amp;lt;ed@ripple.com&amp;gt;

    Implement Lending Protocol (unsupported) (#5270)

    - Spec: XLS-66
    - Introduces amendment "LendingProtocol", but leaves it UNSUPPORTED to
      allow for standalone testing, future development work, and potential
      bug fixes.
    - AccountInfo RPC will indicate the type of pseudo-account when
      appropriate.
    - Refactors and improves several existing classes and functional areas,
      including Number, STAmount, STObject, json_value, Asset, directory
      handling, View helper functions, and unit test helpers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Feature Supported on Commit:&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;commit 919ded66940bbb18173ddee4014312917668b08a
Author: Ed Hennis &amp;lt;ed@ripple.com&amp;gt;

    Change LendingProtocol feature and dependencies to supported (#5632)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Testcases:&lt;/strong&gt; &lt;a href="https://dev.to/mounika_kunasani/lending-protocol-testcases-1ig4"&gt;https://dev.to/mounika_kunasani/lending-protocol-testcases-1ig4&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. Bugs Found&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;All internal bugs identified during the testing phase have been analyzed and resolved. Following the implementation of these fixes, extensive validation was performed, and no new bugs or regressions have been reported.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;7. Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This feature has undergone comprehensive functional, regression, and end to end testing. The majority of the test cases have been executed successfully, with positive outcomes confirming that the core functionalities are working as expected.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>cicd</category>
      <category>testing</category>
      <category>web3</category>
    </item>
    <item>
      <title>Lending Protocol - Testcases</title>
      <dc:creator>Mani Mounika Kunasani</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:22:54 +0000</pubDate>
      <link>https://forem.com/ripplexdev/lending-protocol-testcases-1ig4</link>
      <guid>https://forem.com/ripplexdev/lending-protocol-testcases-1ig4</guid>
      <description>&lt;h2&gt;
  
  
  LoanBrokerSet
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan broker set xrp as vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker set iou as vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker set mpt as vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with only required params[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with only required params[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with only required params[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set xrp low reserve&lt;/li&gt;
&lt;li&gt;Test lending loan broker set xrp as non vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker set as non existent account&lt;/li&gt;
&lt;li&gt;Test lending loan broker set multiple times with same vault id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid vault id[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid vault id[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid vault id[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid vault id[invalid vault id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid vault id[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with malformed vault id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with non existent vault id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with no vault id field&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with malformed data&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid data[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with data more than 256 btyes&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with ManagementFeeRate[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with ManagementFeeRate[5000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with ManagementFeeRate[10000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid ManagementFeeRate[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with ManagementFeeRate more than max&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid DebtMaximum[]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid DebtMaximum[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid DebtMaximum[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid DebtMaximum[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid DebtMaximum[18446744073709551616]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with negative DebtMaximum[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with negative DebtMaximum[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on xrp asset[10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on xrp asset[9223372036854775807]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with fractional DebtMaximum on xrp asset&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on iou asset[10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on iou asset[10.02]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on iou asset[10.06]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on iou asset[10.6]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on iou asset[10.98]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid DebtMaximum on mpt asset&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with fractional DebtMaximum on mpt asset&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with unlimited DebtMaximum followed by loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with DebtMaximum more than vault asset maximum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set DebtMaximum after emptying vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker set DebtMaximum after vault set asset maximum to minimum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set then loan set and vault set reduce asset maximum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set assets available more than debt maximum loan set more debt&lt;/li&gt;
&lt;li&gt;Test lending loan broker set debt maximum more than assets available loan set more debt&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with non zero CoverRateMinimum but no CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with zero CoverRateMinimum but no CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with non zero CoverRateMinimum and same CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with zero CoverRateMinimum and zero CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with zero CoverRateMinimum and non zero CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with no CoverRateMinimum but non zero CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with no CoverRateMinimum but zero CoverRateLiquidation&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid CoverRateMinimum[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid CoverRateMinimum[50000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid CoverRateMinimum[100000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with CoverRateMinimum more than max&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateMinimum[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set CoverRateMinimum less than assets maximum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set CoverRateMinimum after emptying vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker set CoverRateMinimum after vault set asset maximum to minimum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid CoverRateLiquidation[50000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with valid CoverRateLiquidation[100000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with CoverRateLiquidation more than max&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with invalid CoverRateLiquidation[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with invalid loan broker id[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with invalid loan broker id[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with invalid loan broker id[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with invalid loan broker id[invalid loan broker id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with invalid loan broker id[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with loan broker id from diff broker&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with loan broker id and vault id mismatch&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with no vault id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with empty loan broker field&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update with non existent loan broker id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update as third party&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update Data[ABC-]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update Data[ABC-XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update ManagementFeeRate[10000-0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update ManagementFeeRate[0-10000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update DebtMaximum&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update CoverRateMinimum[100000-0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update CoverRateMinimum[0-100000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update CoverRateLiquidation[100000-0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set update CoverRateLiquidation[0-100000]&lt;/li&gt;
&lt;li&gt;Test lending loan broker set on private vault with domain id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set on private vault with no domain id&lt;/li&gt;
&lt;li&gt;Test lending loan broker set on private vault with tfVaultShareNonTransferable flag on private vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with xrp and preauth on broker&lt;/li&gt;
&lt;li&gt;Test lending loan broker set individual freeze on broker and loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set deep freeze on broker and loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set deep freeze on borrower and loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set global freeze on broker and loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set after global freeze&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with mpt and lock on broker&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with no loan and delete broker&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with loan and delete broker&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with CoverRateMinimum do loan set no cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker set loan set then vault withdraw assets&lt;/li&gt;
&lt;li&gt;Test lending loan broker set vault withdraw assets then loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set loan set then vault withdraw shares&lt;/li&gt;
&lt;li&gt;Test lending loan broker set vault withdraw shares then loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with auth and loan set and pay to third party asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker set with auth and loan set with borrower not authorized asset iou&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanBrokerDelete
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan broker delete on asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete on asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete on asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with low reserve&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete by third party&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete by non existent account&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with no loan broker field&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with invalid loan broker id values[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with invalid loan broker id values[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with invalid loan broker id values[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with invalid loan broker id values[invalid loan broker id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with invalid loan broker id values[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with empty loan broker id value&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with loan broker id and vault id mismatch&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete with loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default no clawback&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default and clawback assets&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete multiple times&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete multiple loan broker objects&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete and delete account&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default clawback shares by issuer who is not vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default clawback shares by issuer who is vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default clawback assets by issuer who is vault owner&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete loan default clawback shares by vault owner&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanBrokerCoverDeposit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan broker cover deposit asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with low reserve&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit and loan set asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit and loan set with mpt auth asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit and loan set without mpt auth asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with tfMPTRequireAuth flag and loan set with issuer ack asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with tfMPTRequireAuth flag and loan set with issuer no ack asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with 0 CoverRateMinimum and loan set with cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with 0 CoverRateMinimum and loan set no cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with non 0 CoverRateMinimum and loan set with cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with non 0 CoverRateMinimum and loan set no cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit by third party&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit by non existent account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with no loan broker field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with no amount field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid loan broker id values[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid loan broker id values[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid loan broker id values[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid loan broker id values[invalid loan broker id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid loan broker id values[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with empty loan broker id value&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with loan broker id and vault id mismatch&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset xrp[-10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset xrp[100.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset xrp[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset xrp[invalid amount3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset xrp[#@!#@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset xrp[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset xrp[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset xrp[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset iou[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset iou[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset iou[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset iou[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset iou[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset iou[invalid amount2]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset iou[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset mpt[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset mpt[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with bad amount asset mpt[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset mpt[10.5 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset mpt[10.5 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset mpt[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset mpt[invalid amount3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with invalid amount asset mpt[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit multiple times&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit xrp in iou vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit xrp in mpt vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit iou in xrp vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit invalid issuer asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit different currency asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with deposit auth asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with individual freeze on loan broker asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with deep freeze on loan broker asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with global freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with individual freeze on vault pseudo account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with deep freeze on vault pseudo account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with individual freeze on loan broker pseudo account asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with deep freeze on loan broker pseudo account asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with tfMPTCanLock but loan broker pseudo account not locked asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with loan broker pseudo account locked asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with auth enabled asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with tfMPTLock set asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with insufficient funds after loan set&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with sufficient funds after loan set asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with cover rate minimum multiple loans&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover deposit with sufficient funds after loan set asset iou&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanBrokerCoverWithdraw
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan broker cover withdraw asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with low reserve&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw by third party&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw by non existent account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw by non existent account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw by non existent account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with no loan broker field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with no amount field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid loan broker id values[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid loan broker id values[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid loan broker id values[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid loan broker id values[invalid loan broker id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid loan broker id values[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with empty loan broker id value&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with loan broker id mismatch&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[-10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[100.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[invalid amount4]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset xrp[#@!#@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset iou[-10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset iou[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset iou[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset iou[invalid amount3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset iou[#@!#@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with fraction amount asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[-10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[100.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[invalid amount4]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with invalid amount asset mpt[#@!#@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset xrp[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset xrp[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset xrp[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset iou[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset iou[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset iou[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset mpt[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset mpt[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with bad amount asset mpt[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw invalid issuer asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw multiple times&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw more than cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with CoverRateMinimum set asset xrp[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with CoverRateMinimum set asset xrp[10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw more than available balance with CoverRateMinimum set asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with CoverRateMinimum more than 100 percent&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with CoverRateMinimum set asset iou[0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with CoverRateMinimum set asset iou[10]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with deposit auth asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with deposit auth on destination account asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw after global freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination without trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination after individual freeze without trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination after individual freeze with trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination after deep freeze without trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination after deep freeze with trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination deep freeze loan broker asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with individual freeze on loan broker asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with deep freeze on loan broker asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw no destination with tfMPTLock set on loan broker asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with individual freeze on vault pseudo account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw no destination with tfMPTLock set on loan broker pseudo asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with individual freeze on loan broker pseudo account asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with deep freeze on loan broker pseudo account asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw no destination with tfMPTLock set on vault pseudo asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination without mpt object asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination with mpt object asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with tfMPTRequireAuth flag destination ack asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with tfMPTRequireAuth flag destination no ack asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination tfMPTLock set on broker asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination tfMPTLock set on destination asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination after global freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw without cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with destination account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with non existent destination account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with empty destination account value[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with empty destination account value[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with empty destination account value[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with auth enabled asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with auth enabled destination authorized asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with auth enabled destination authorized but no trustline asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw with auth enabled destination unauthorized asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw xrp in iou vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw xrp in mpt vault&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover withdraw iou in xrp vault&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanBrokerCoverClawback
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan broker cover clawback asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with low reserve&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback by third party&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback by non existent account&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with no loan broker field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with no amount field&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid loan broker id values[-23131]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid loan broker id values[3123]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid loan broker id values[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid loan broker id values[invalid loan broker id3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid loan broker id values[~!@#$%^&amp;amp;*() -=+[{]};:.?'",/]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with empty loan broker id value&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with loan broker id mismatch&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback after cover withdraw&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid amount[-10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid amount[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid amount[58E4CD288]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid amount[invalid amount3]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with invalid amount[#@!#@]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback fraction amount&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with different issuer&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with bad amount[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with bad amount[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback multiple times&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback more than cover available with 0 cover rate minimum&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback more than cover available with non 0 cover rate minimum&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback when cover available is 0&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback 0 amount when cover available is non zero&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with CoverRateMinimum set&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with deposit auth asset xrp&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback after individual freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback after deep freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback after global freeze asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback without cover deposit&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback without AllowTrustLineClawback flag asset iou&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback without MPTCanClawback flag asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback without MPTCanLock flag asset mpt&lt;/li&gt;
&lt;li&gt;Test lending loan broker cover clawback with tfMPTLock set on loan broker asset mpt&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanSet
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan set xrp by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set iou by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set iou by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt by loan broker with no mpt auth on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt by borrower with no mpt auth on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set by third party account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set by third party account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set by third party account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set by non existent account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set by non existent account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set by non existent account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set with no LoanBrokerID&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[loan broker id1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[loan broker id2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[0]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid LoanBrokerID[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with third party LoanBrokerID[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set with third party LoanBrokerID[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set with third party LoanBrokerID[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and same borrower[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and same borrower[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and same borrower[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and different borrower[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and different borrower[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set multiple times with same LoanBrokerID and different borrower[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by same borrower[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by same borrower[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by same borrower[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by different borrowers[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by different borrowers[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set of full vault amount in multiple loans by different borrowers[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set by borrower with base reserve&lt;/li&gt;
&lt;li&gt;Test lending loan set by loan broker with base reserve on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with no CounterpartySignature&lt;/li&gt;
&lt;li&gt;Test lending loan set with no PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[principal requested2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[principal requested3]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[1.5]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[@$&amp;amp;*]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PrincipalRequested values[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[principal requested2]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[principal requested3]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[1.5]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[@$&amp;amp;*]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp asset with invalid PrincipalRequested values[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[principal requested2]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[principal requested3]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[1.5]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[@$&amp;amp;*]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou asset with invalid PrincipalRequested values[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[principal requested2]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[principal requested3]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[1.5]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[@$&amp;amp;*]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt asset with invalid PrincipalRequested values[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with negative PrincipalRequested value&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than vault assets[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than vault assets[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than vault assets[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PrincipalRequested value[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PrincipalRequested value[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PrincipalRequested value[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PrincipalRequested value of auth required iou asset by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with auth required iou asset by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with auth required iou asset by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PrincipalRequested value of auth required mpt asset by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with auth required mpt asset by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with auth required mpt asset by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[payment total1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[payment total2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[2026-01-29]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentTotal[18446744073709551616]&lt;/li&gt;
&lt;li&gt;Test lending loan set with zero PaymentTotal&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid PaymentTotal[1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid PaymentTotal[5]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid PaymentTotal[1000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[payment interval1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[payment interval2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid PaymentInterval[10000000000000000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PaymentInterval less that default[0]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PaymentInterval less that default[59]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid PaymentInterval[60]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid PaymentInterval[1000000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[grace period0]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[grace period1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid GracePeriod[10000000000000000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with GracePeriod less that default[0]&lt;/li&gt;
&lt;li&gt;Test lending loan set with GracePeriod less that default[59]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid GracePeriod[60]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid GracePeriod[100]&lt;/li&gt;
&lt;li&gt;Test lending loan set with GracePeriod greater than PaymentInterval&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[interest rate1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[interest rate2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[10000000000000000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid InterestRate[18446744073709551616]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid InterestRate[100000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[None]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[overpayment interest rate1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[overpayment interest rate2]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[True]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[False]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[10000000000000000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with invalid OverpaymentInterestRate[18446744073709551616]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid OverpaymentInterestRate[0]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid OverpaymentInterestRate[16]&lt;/li&gt;
&lt;li&gt;Test lending loan set with valid OverpaymentInterestRate[100000]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in one loan[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in one loan[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in one loan[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in multiple loans[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in multiple loans[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan set with PrincipalRequested greater than DebtMaximum in multiple loans[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan set and delete the borrower after loan start&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with LoanOriginationFee by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set iou with LoanOriginationFee by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt with LoanOriginationFee by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt with LoanOriginationFee without mpt auth on loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set mpt with LoanOriginationFee without mpt auth on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with LoanOriginationFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set and delete account on completed loan&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[XYZ]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[0xA10]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[123]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[10.5]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[-10 0]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[-10 1]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with invalid data[:#!@]&lt;/li&gt;
&lt;li&gt;Test lending loan set xrp with empty data&lt;/li&gt;
&lt;li&gt;Test lending loan set iou asset with global freeze on issuer&lt;/li&gt;
&lt;li&gt;Test lending loan broker set loan set then vault withdraw assets&lt;/li&gt;
&lt;li&gt;Test lending loan broker set loan set then vault withdraw shares&lt;/li&gt;
&lt;li&gt;Test lending loan set with no trust line on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with no mpt auth on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan set with same loan broker and borrower&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanDelete
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by loan broker[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by loan broker[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by loan broker[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by borrower[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by borrower[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by borrower[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by third party account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by third party account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by third party account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by non existent account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by non existent account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on incomplete loan by non existent account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with no LoanID&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[None]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[loan id1]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[loan id2]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[0]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[True]&lt;/li&gt;
&lt;li&gt;Test lending loan delete with invalid LoanID[False]&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed xrp loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed xrp loan by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed xrp loan by borrower with just base reserve&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed xrp loan by third party account&lt;/li&gt;
&lt;li&gt;Test lending loan delete on mismatched loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed loan multiple times by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed by loan broker and delete loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed by loan broker and delete borrower&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed by loan broker without Loandraw&lt;/li&gt;
&lt;li&gt;Test lending loan delete on completed by loan broker without Loandraw and deposit auth on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete after loan delete&lt;/li&gt;
&lt;li&gt;Test lending loan broker delete before loan delete&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanManage
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan manage by loan broker[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by loan broker[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by loan broker[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by third party account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by third party account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by third party account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by non existent account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by non existent account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage by non existent account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp by no LoanID&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[None]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[loan id1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[loan id2]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[0]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[True]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid LoanID[False]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with mismatched LoanID&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp multiple times on same loanID&lt;/li&gt;
&lt;li&gt;Test lending loan manage by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan manage with flags 0&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[flags0]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[flags1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[True]&lt;/li&gt;
&lt;li&gt;Test lending loan manage xrp with invalid Flags[False]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag before grace period[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag before grace period[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag before grace period[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag on started loan with no payment[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag on started loan with no payment[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanDefault flag on started loan with no payment[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan with no payment[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan with no payment[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanImpair flag on started loan with no payment[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan with no payment[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan with no payment[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan manage with tfLoanUnimpair flag on started loan with no payment[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by loan broker[131072]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by loan broker[65536]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by loan broker[262144]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by borrower[131072]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by borrower[65536]&lt;/li&gt;
&lt;li&gt;Test lending loan manage on completed loan by borrower[262144]&lt;/li&gt;
&lt;li&gt;Test lending loan manage set unimpair flag on active loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag on xrp loan after NextPaymentDueDate and GracePeriod by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag on iou loan after NextPaymentDueDate and GracePeriod by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag on mpt loan after NextPaymentDueDate and GracePeriod by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag before NextPaymentDueDate and GracePeriod by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag and clear flag by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set default flag multiple times by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag on active loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag and clear flag on active loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag on defaulted loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag multiple times by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set unimpair flag and clear flag by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set unimpair flag on defaulted loan by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag and unimpair flag by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set unimpair flag multiple times by loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag and make a payment&lt;/li&gt;
&lt;li&gt;Test lending loan manage set impair flag before NextPaymentDueDate&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  LoanPay
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test lending loan pay xrp by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay by loan broker[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by loan broker[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by loan broker[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by third party account[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by third party account[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by third party account[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by borrower on completed loan[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by borrower on completed loan[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan pay by borrower on completed loan[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp by non existent account&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp by borrower with no LoanID&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[None]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[loan id1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[loan id2]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[0]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[True]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid LoanID[False]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with mismatched LoanID&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp by borrower with no Amount&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[None]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[amount1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[1.1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[malformed input]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[@!#$]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC1A319620091B548FDBBZ]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[A86E82EA1FE334A43D1A4383DF3691A3307E0835C3EC]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[True]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with malformed Amount[False]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid Amount[0]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid Amount[-1]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with invalid Amount[amount2]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with Amount as 100&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate without tfLoanLatePayment LatePaymentFee and InterestRate[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate without tfLoanLatePayment LatePaymentFee and InterestRate[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate without tfLoanLatePayment LatePaymentFee and InterestRate[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate with tfLoanLatePayment without LatePaymentFee and InterestRate[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate with tfLoanLatePayment without LatePaymentFee and InterestRate[IOU]&lt;/li&gt;
&lt;li&gt;Test lending loan pay after NextPaymentDueDate with tfLoanLatePayment without LatePaymentFee and InterestRate[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp after NextPaymentDueDate with LatePaymentFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU after NextPaymentDueDate with LatePaymentFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT after NextPaymentDueDate with LatePaymentFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with InterestRate and do a payment&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU with InterestRate and do a payment&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT with InterestRate and do 10 payments&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp after NextPaymentDueDate with LatePaymentFee InterestRate LateInterestRate by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU after NextPaymentDueDate with LatePaymentFee InterestRate LateInterestRate by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT after NextPaymentDueDate with LatePaymentFee InterestRate LateInterestRate by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp after NextPaymentDueDate with LatePaymentFee InterestRate LateInterestRate of incorrect asset by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp less than required payment before NextPaymentDueDate by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp less than required payment after NextPaymentDueDate by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with LoanServiceFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou with LoanServiceFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt with LoanServiceFee by borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of two payments and pay extra in first payment remaining in second payment with tfLoanOverpayment flag&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of two payments and pay extra in first payment remaining in second payment without tfLoanOverpayment flag&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of three payments and pay extra in first payment remaining of second interval in second payment third interval payment with tfLoanOverpayment flag&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of three payments and pay extra in first payment second interval payment remaining in third interval payment with tfLoanOverpayment flag&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of three payments and pay extra before first payment skip second payment remaining in third interval payment with tfLoanOverpayment flag&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp without tfLoanOverpayment and do an overpayment of two periodic payments&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU without tfLoanOverpayment and do an overpayment of two periodic payments&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT without tfLoanOverpayment and do an overpayment of two periodic payments&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp without tfLoanOverpayment and do a fraction of of periodic payment&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU without tfLoanOverpayment and do a fraction of of periodic payment&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT without tfLoanOverpayment and do a fraction of of periodic payment&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp with tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU with tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT with tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp without tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay IOU without tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay MPT without tfLoanOverpayment and pay more than PrincipalRequested&lt;/li&gt;
&lt;li&gt;Test lending loan pay multiple times before NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay full payment with tfLoanOverpayment before NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp early full payment with close payment fee before NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou early full payment with close payment fee before NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt early full payment with close payment fee before NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay early full payment less than required&lt;/li&gt;
&lt;li&gt;Test lending loan pay of overpayment with tfLoanOverpayment after NextPaymentDueDate&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou by borrower with global freeze&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou with individual freeze on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou with deep freeze on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou on borrower with individual freeze on loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou on borrower with deep freeze on loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of iou asset loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp of mpt loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou of xrp loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay iou of mpt loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt of xrp loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt of iou loan&lt;/li&gt;
&lt;li&gt;Test lending loan pay xrp by borrower and deposit auth on loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt with MPTLocked on borrower&lt;/li&gt;
&lt;li&gt;Test lending loan pay mpt with MPTLocked on loan broker&lt;/li&gt;
&lt;li&gt;Test lending loan set of xrp for self and loan pay&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou for issuer and loan pay&lt;/li&gt;
&lt;li&gt;Test lending loan set of iou for self and loan pay&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt for issuer and loan pay&lt;/li&gt;
&lt;li&gt;Test lending loan set of mpt for self and loan pay&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 unit in one payment[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 unit in one payment[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 unit in multiple payments[MPT]&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 unit in multiple payments[XRP]&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 iou in one payment&lt;/li&gt;
&lt;li&gt;Test lending loan of 1 iou in multiple payments&lt;/li&gt;
&lt;li&gt;Test xrp loan pay of overpayment without tfLoanOverpayment on loan set&lt;/li&gt;
&lt;li&gt;Test xrp loan pay of overpayment with tfLoanOverpayment on loan set&lt;/li&gt;
&lt;li&gt;Test lending loan pay with same account as loan broker and borrower&lt;/li&gt;
&lt;li&gt;Test xrp loan pay of overpayment with mismatched flag on loan pay&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted and delete loan by loan broker&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted and delete loan by borrower&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted and withdraw remaining first loss capital&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted with low cover deposit and withdraw first loss capital&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted and withdraw first loss capital with deep freeze on loan broker&lt;/li&gt;
&lt;li&gt;Test xrp loan defaulted and withdraw first loss capital with freeze on loan broker&lt;/li&gt;
&lt;li&gt;Test xrp pay loan delete loan loan broker objects withdraw remaining funds and delete vault&lt;/li&gt;
&lt;li&gt;Test xrp pay loan delete loan loan broker objects and delete vault before withdrawing remaining funds&lt;/li&gt;
&lt;li&gt;Test xrp pay skip loan delete loan and delete loan broker object&lt;/li&gt;
&lt;li&gt;Test xrp loan delete loan skip deleting loan broker and delete vault objects&lt;/li&gt;
&lt;li&gt;Test xrp pay loan delete loan1 and loan broker object&lt;/li&gt;
&lt;li&gt;Test xrp pay loan delete loan loan broker1 objects and delete vault&lt;/li&gt;
&lt;li&gt;Test delete defaulted xrp loan by deep freeze loan broker and create new loan&lt;/li&gt;
&lt;li&gt;Test xrp loan of whole asset amount default loan and vault withdraw&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Lending Protocol Performance Test Report</title>
      <dc:creator>Qi Zhao</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:22:38 +0000</pubDate>
      <link>https://forem.com/ripplexdev/lending-protocol-performance-test-report-3cjn</link>
      <guid>https://forem.com/ripplexdev/lending-protocol-performance-test-report-3cjn</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Single Asset Vault (SAV, XLS-65)&lt;/strong&gt; and &lt;strong&gt;Lending Protocol (XLS-66)&lt;/strong&gt; together introduce the foundational infrastructure for on-ledger liquidity aggregation and lending within the XRPL ecosystem.&lt;/p&gt;

&lt;p&gt;The SAV enables depositors to aggregate XRP, IOU, or MPT assets into a shared vault represented by Multi-Purpose Token (MPT) ownership shares.&lt;br&gt;&lt;br&gt;
The Lending Protocol, built atop these vaults, allows creation of loans, repayments, and deletions tied to vault liquidity through &lt;code&gt;LoanSet&lt;/code&gt;, &lt;code&gt;LoanPay&lt;/code&gt;, and &lt;code&gt;LoanDelete&lt;/code&gt; transactions.&lt;/p&gt;

&lt;p&gt;This report summarizes a comprehensive performance evaluation of both amendments under high-load scenarios. Tests were executed in RippleX’s private performance network to quantify throughput, consensus latency, CPU/memory utilization, and ledger growth impacts.&lt;/p&gt;

&lt;p&gt;The results demonstrate that the SAV and Lending amendments are performant and stable, with predictable memory growth linked to ledger object expansion, and that both features can be safely activated without compromising the 5-second consensus target.&lt;/p&gt;

&lt;h1&gt;
  
  
  Testing Objectives
&lt;/h1&gt;

&lt;p&gt;The primary objective of this testing was to assess the performance of lending protocol transactions and their impact on consensus processing, particularly under high-load conditions. Specifically, we aimed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate the capacity limits of the XRPL when processing lending protocol transactions alongside existing payment transactions.
&lt;/li&gt;
&lt;li&gt;Validate SAV and Lending transaction throughput across XRP, IOU, and MPT asset types.
&lt;/li&gt;
&lt;li&gt;Measure CPU and memory overhead introduced by new ledger objects (&lt;code&gt;Vault&lt;/code&gt;, &lt;code&gt;Loan&lt;/code&gt;, &lt;code&gt;LoanBroker&lt;/code&gt;, &lt;code&gt;Vault pseudo-account&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Identify potential bottlenecks or performance degradation caused by lending protocol related operations.
&lt;/li&gt;
&lt;li&gt;Ensure that the network maintains a 5-second consensus latency threshold, even under the most demanding scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Testing Methodology
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Capacity Planning
&lt;/h2&gt;

&lt;p&gt;To measure the maximum performance impact of integrating lending protocol transactions, we used the 5-second consensus latency limit as the benchmark for network capacity. This threshold ensures that the network remains in optimal condition while processing a mix of lending protocol, single asset vault and standard payment transactions. During testing, we monitored both ledger and consensus performance to determine whether the network load exceeded this latency criterion. Instances where the network surpassed this limit are referred to as “overvalidation” in the results below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Environment
&lt;/h2&gt;

&lt;p&gt;Our testing infrastructure simulated a private XRPL environment with 9 nodes, matching Ripple's MainNet in terms of hardware specifications. The key features of this environment are the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network Setup&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;5 function as validator nodes
&lt;/li&gt;
&lt;li&gt;4 serve as client P2P nodes, interfacing with load generators
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Uniform System Specifications&lt;/strong&gt;: Each system mirrors the hardware specifications found in Ripple’s MainNet rippled infrastructure. Specifically, they are hosted on AWS's EC2 instance type, z1d.2xlarge, boasting 8 CPU cores, 64GB RAM, and 300GB NVMe SSD storage, dedicated to the rippled database.
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Network Configuration&lt;/strong&gt;: All nodes operate within the same AWS region and are interconnected through a shared LAN.
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Load Submission&lt;/strong&gt;: Between 1 and 4 load servers are actively engaged in transmitting transactions to the 4 P2P nodes.
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Account Setup&lt;/strong&gt;: A total of 250K synthetic accounts were established, built atop a public ledger synchronized from the MainNet as of Mar 11th, 2025. Provisions were made in the simulation logic to ensure the uniqueness of source and destination accounts for every consensus cycle.
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Configuration Continuity&lt;/strong&gt;: The rippled configuration file was sourced directly from a Ripple MainNet validator. While the core configurations remained unchanged, requisite modifications were made to align with the specific needs of our environment.&lt;/li&gt;

&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Permissioned Domain
&lt;/h3&gt;

&lt;p&gt;To simulate the most computationally intensive ledger path, all lending activities were executed within a &lt;strong&gt;permissioned domain&lt;/strong&gt; environment, ensuring every transaction incurred &lt;strong&gt;credential verification&lt;/strong&gt; and &lt;strong&gt;domain access checks&lt;/strong&gt; at runtime.&lt;/p&gt;

&lt;p&gt;A synthetic dataset was constructed to model large-scale permissioned lending behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credential Issuers&lt;/strong&gt; – A pool of domain-authority accounts issued credentials through &lt;code&gt;CredentialCreate&lt;/code&gt; transactions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subjects (Participants)&lt;/strong&gt; – All participating accounts accepted credentials via &lt;code&gt;CredentialAccept&lt;/code&gt;, establishing verified identities under their respective domains.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissioned Domains&lt;/strong&gt; – Domain-owner accounts created &lt;code&gt;PermissionedDomainSet&lt;/code&gt; ledger entries, each configured to authorize &lt;strong&gt;up to 10 unique credentials&lt;/strong&gt; (the protocol’s maximum).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, &lt;strong&gt;every Vault, Broker, and Borrower&lt;/strong&gt; operated under enforced domain constraints. Each loan transaction therefore required on-ledger verification of &lt;code&gt;PermissionedDomain&lt;/code&gt; and &lt;code&gt;Credential&lt;/code&gt; objects, — amplifying computational and I/O load during consensus.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Purpose Token
&lt;/h3&gt;

&lt;p&gt;To support MPT-backed vault testing, the environment was pre-initialized with Multi-Purpose Token (MPT) objects following the XLS-33 specification.&lt;/p&gt;

&lt;p&gt;A subset of accounts acted as MPT issuers, each creating several token issuances with authorization and transfer flags enabled to simulate real-world tokenization complexity. After creation, all remaining accounts were authorized as holders and received distributed token balances through MPT-based &lt;code&gt;Payment&lt;/code&gt; transactions. This process populated the ledger with a large number of active &lt;code&gt;MPTokenIssuance&lt;/code&gt; and &lt;code&gt;MPToken&lt;/code&gt; objects, ensuring realistic token distribution and directory-node activity across the network.&lt;/p&gt;

&lt;p&gt;In summary, MPT generation followed this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select issuer accounts&lt;/strong&gt; to create new MPT issuances (&lt;code&gt;MPTokenIssuanceCreate&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable authorization&lt;/strong&gt; (&lt;code&gt;lsfMPTRequireAuth&lt;/code&gt;) to require holder registration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorize holders&lt;/strong&gt; using &lt;code&gt;MPTokenAuthorize&lt;/code&gt; transactions.
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distribute tokens&lt;/strong&gt; via standard &lt;code&gt;Payment&lt;/code&gt; operations referencing &lt;code&gt;mpt_issuance_id&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Populate ledger&lt;/strong&gt; with MPT balances to be used by vault depositors and borrowers in lending operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Lending Protocol
&lt;/h3&gt;

&lt;p&gt;To comprehensively evaluate the Lending Protocol’s performance, a high-complexity, mixed-role dataset was created to emulate realistic cross-flows between depositors and borrowers.&lt;/p&gt;

&lt;p&gt;The database comprised &lt;strong&gt;250,000 total accounts&lt;/strong&gt;, distributed across four load servers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vault Owners (also LoanBrokers)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8,000&lt;/td&gt;
&lt;td&gt;Each account owns one or more Vaults and acts as the associated LoanBroker.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depositors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;130,000&lt;/td&gt;
&lt;td&gt;Provide liquidity through VaultDeposit; some also serve as borrowers (dual-role).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Borrowers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;130,000&lt;/td&gt;
&lt;td&gt;Create loans via LoanSet and make repayments via LoanPay.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dual-role overlap (Depositor ∩ Borrower)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18,000&lt;/td&gt;
&lt;td&gt;Participate in both sides of lending, creating circular fund flows that increase ledger contention.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each Vault services &lt;strong&gt;15–30 depositors&lt;/strong&gt; and &lt;strong&gt;10–15 borrowers&lt;/strong&gt;, deliberately maximizing DirectoryNode update and SHAMap node insertion.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vault Setup
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Vault Types – Three asset configurations were deployed:
&lt;/li&gt;
&lt;li&gt;XRP-based, IOU-based, and MPT-based Vaults.
&lt;/li&gt;
&lt;li&gt;Privacy – All Vaults were flagged as Private, inheriting the domain’s permission rules.
&lt;/li&gt;
&lt;li&gt;Precision – Asset scales were configured to their spec defaults (&lt;code&gt;scale = 0&lt;/code&gt; for XRP/MPT, &lt;code&gt;scale = 6&lt;/code&gt; for IOU).
&lt;/li&gt;
&lt;li&gt;Liquidity Initialization – Vault owners funded liquidity pools via &lt;code&gt;VaultDeposit&lt;/code&gt;; depositors received MPT share tokens representing proportional ownership.
&lt;/li&gt;
&lt;li&gt;Cross-Vault Distribution – Depositors diversified across vaults to trigger higher inter-vault transaction frequency and hash-tree activity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Loan Setup
&lt;/h4&gt;

&lt;p&gt;To exercise all high-cost code paths in the protocol, loans were generated to reflect the most computation-heavy configuration supported by the spec:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multisign Loan Creation&lt;/strong&gt;
Each loan was established through LoanSet, signed by the &lt;strong&gt;LoanBroker (Vault Owner)&lt;/strong&gt; and &lt;strong&gt;Borrower&lt;/strong&gt;, validating both Credential and domain access permissions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample Complex Loan Terms with overpayment flags&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;InterestRate: 6 %
&lt;/li&gt;
&lt;li&gt;LateInterestRate: 8 %
&lt;/li&gt;
&lt;li&gt;OverpaymentInterestRate: 2 %
&lt;/li&gt;
&lt;li&gt;CloseInterestRate: 1 % (prepayment penalty)
&lt;/li&gt;
&lt;li&gt;OverpaymentFee: 0.1 %
&lt;/li&gt;
&lt;li&gt;ServiceFeeRate: 0.2 %
&lt;/li&gt;
&lt;li&gt;ManagementFeeRate: 15 %
&lt;/li&gt;
&lt;li&gt;PaymentInterval: 10000000
&lt;/li&gt;
&lt;li&gt;PaymentTotal: 1000
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Overpayment Coverage&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;All loans were configured with both &lt;code&gt;lsfLoanOverpayment&lt;/code&gt; (Loan flag) and &lt;code&gt;tfLoanOverpayment&lt;/code&gt; (LoanPay flag) set, forcing every payment to execute the overpayment branch of the protocol.
&lt;/li&gt;
&lt;li&gt;Each transaction recalculates the overpayment interest, deducts fees, applies the remaining amount to principal, and re-amortizes the remaining loan schedule—representing a computationally intensive path in the Lending Protocol.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Load Modeling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  #1 Payment Baseline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A mixed load of standard payment transactions involving both the AMM-based and LOB-based decentralized exchanges (DEX).
&lt;/li&gt;
&lt;li&gt;This scenario establishes a baseline for network performance under typical MainNet conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We integrated a realistic payment distribution, encompassing various transaction types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XRP-XRP Transaction
&lt;/li&gt;
&lt;li&gt;IOU-Direct Transaction
&lt;/li&gt;
&lt;li&gt;LOB 1path1step transaction
&lt;/li&gt;
&lt;li&gt;LOB 3path3step transaction
&lt;/li&gt;
&lt;li&gt;LOB 6path8step transaction&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Payment Mixload&lt;/td&gt;
&lt;td&gt;159.31&lt;/td&gt;
&lt;td&gt;3.96&lt;/td&gt;
&lt;td&gt;9.79&lt;/td&gt;
&lt;td&gt;9 out of 924&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;16/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  #2 Lending Protocol and Single Asset Vault Transactions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This test phase focused on evaluating the end-to-end performance of all core transaction types introduced by the Single Asset Vault (SAV, XLS-65) and Lending Protocol (XLS-66) amendments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  XRP
&lt;/h4&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;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VaultDeposit&lt;/td&gt;
&lt;td&gt;328.35&lt;/td&gt;
&lt;td&gt;3.30&lt;/td&gt;
&lt;td&gt;4.07&lt;/td&gt;
&lt;td&gt;1 out of 925&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;23/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultWithdraw&lt;/td&gt;
&lt;td&gt;303.56&lt;/td&gt;
&lt;td&gt;3.96&lt;/td&gt;
&lt;td&gt;4.21&lt;/td&gt;
&lt;td&gt;1 out of 924&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;23/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultCreate&lt;/td&gt;
&lt;td&gt;255.52&lt;/td&gt;
&lt;td&gt;3.92&lt;/td&gt;
&lt;td&gt;4.56&lt;/td&gt;
&lt;td&gt;1 out of 935&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;24/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanPay&lt;/td&gt;
&lt;td&gt;242.53&lt;/td&gt;
&lt;td&gt;3.90&lt;/td&gt;
&lt;td&gt;3.67&lt;/td&gt;
&lt;td&gt;1 out of 940&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;25/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet&lt;/td&gt;
&lt;td&gt;210.36&lt;/td&gt;
&lt;td&gt;3.98&lt;/td&gt;
&lt;td&gt;5.34&lt;/td&gt;
&lt;td&gt;3 out of 920&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;26/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanDelete&lt;/td&gt;
&lt;td&gt;185.42&lt;/td&gt;
&lt;td&gt;4.02&lt;/td&gt;
&lt;td&gt;5.67&lt;/td&gt;
&lt;td&gt;3 out of 905&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;26/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  IOU
&lt;/h4&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;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VaultDeposit&lt;/td&gt;
&lt;td&gt;268.33&lt;/td&gt;
&lt;td&gt;4.08&lt;/td&gt;
&lt;td&gt;5.36&lt;/td&gt;
&lt;td&gt;9 out of 897&lt;/td&gt;
&lt;td&gt;16.5&lt;/td&gt;
&lt;td&gt;26/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultWithdraw&lt;/td&gt;
&lt;td&gt;238.77&lt;/td&gt;
&lt;td&gt;3.95&lt;/td&gt;
&lt;td&gt;4.64&lt;/td&gt;
&lt;td&gt;4 out of 926&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;27/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultCreate&lt;/td&gt;
&lt;td&gt;230.06&lt;/td&gt;
&lt;td&gt;3.11&lt;/td&gt;
&lt;td&gt;6.51&lt;/td&gt;
&lt;td&gt;4 out of 1176&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;27/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanPay&lt;/td&gt;
&lt;td&gt;170.70&lt;/td&gt;
&lt;td&gt;3.82&lt;/td&gt;
&lt;td&gt;3.63&lt;/td&gt;
&lt;td&gt;1 out of 957&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;26/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet&lt;/td&gt;
&lt;td&gt;166.57&lt;/td&gt;
&lt;td&gt;3.97&lt;/td&gt;
&lt;td&gt;5.59&lt;/td&gt;
&lt;td&gt;9 out of 920&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;28/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanDelete&lt;/td&gt;
&lt;td&gt;150.64&lt;/td&gt;
&lt;td&gt;4.18&lt;/td&gt;
&lt;td&gt;5.88&lt;/td&gt;
&lt;td&gt;5 out of 900&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;27/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  MPT
&lt;/h4&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;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VaultDeposit&lt;/td&gt;
&lt;td&gt;269.98&lt;/td&gt;
&lt;td&gt;4.00&lt;/td&gt;
&lt;td&gt;5.28&lt;/td&gt;
&lt;td&gt;2 out of 914&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;24/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultWithdraw&lt;/td&gt;
&lt;td&gt;205.96&lt;/td&gt;
&lt;td&gt;3.83&lt;/td&gt;
&lt;td&gt;3.94&lt;/td&gt;
&lt;td&gt;2 out of 957&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;25/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VaultCreate&lt;/td&gt;
&lt;td&gt;236.68&lt;/td&gt;
&lt;td&gt;3.94&lt;/td&gt;
&lt;td&gt;4.16&lt;/td&gt;
&lt;td&gt;1 out of 928&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;25/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanPay&lt;/td&gt;
&lt;td&gt;178.12&lt;/td&gt;
&lt;td&gt;3.70&lt;/td&gt;
&lt;td&gt;3.45&lt;/td&gt;
&lt;td&gt;1 out of 987&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;25/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet&lt;/td&gt;
&lt;td&gt;207.51&lt;/td&gt;
&lt;td&gt;3.94&lt;/td&gt;
&lt;td&gt;5.27&lt;/td&gt;
&lt;td&gt;4 out of 928&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;27/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanDelete&lt;/td&gt;
&lt;td&gt;165.21&lt;/td&gt;
&lt;td&gt;4.05&lt;/td&gt;
&lt;td&gt;5.45&lt;/td&gt;
&lt;td&gt;3 out of 910&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;26/64 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  #3 Lending + Payment Mixload capacity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simulated a realistic maximum load scenario combining standard payment and lending protocol transactions.
&lt;/li&gt;
&lt;li&gt;Replaced 60% of baseline payment throughput with lending-heavy operations (LoanSet and LoanPay) across XRP, IOU, and MPT assets.
&lt;/li&gt;
&lt;li&gt;Mixed remaining 40% with payment, AMM, and DEX transactions to emulate mainnet traffic diversity.
&lt;/li&gt;
&lt;li&gt;Conducted 1-hour preliminary testing to benchmark throughput and latency under blended load.
&lt;/li&gt;
&lt;li&gt;Performed extended longevity testing to monitor system stability, CPU utilization, and memory growth trends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Transaction Execution Realistic Percentage:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9.72% XRP-XRP Payment
&lt;/li&gt;
&lt;li&gt;9.72% IOU Direct Payment
&lt;/li&gt;
&lt;li&gt;9.72% AMM/LOB 1path1step Payment
&lt;/li&gt;
&lt;li&gt;0.66% AMM/LOB 3path3step Payment
&lt;/li&gt;
&lt;li&gt;9.89% AMM/LOB 6path8step Payment
&lt;/li&gt;
&lt;li&gt;12.5% AMM/LOB IOU Direct Payment
&lt;/li&gt;
&lt;li&gt;10% XRP LoanSet Transaction
&lt;/li&gt;
&lt;li&gt;10% XRP LoanPay Transaction
&lt;/li&gt;
&lt;li&gt;10% IOU LoanSet Transaction
&lt;/li&gt;
&lt;li&gt;10% IOU LoanPay Transaction
&lt;/li&gt;
&lt;li&gt;10% MPT LoanSet Transaction
&lt;/li&gt;
&lt;li&gt;10% MPT LoanPay Transaction&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lending Mixload  - 1h&lt;/td&gt;
&lt;td&gt;147.99&lt;/td&gt;
&lt;td&gt;3.97&lt;/td&gt;
&lt;td&gt;14.99&lt;/td&gt;
&lt;td&gt;4 out of 921&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;22/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lending Mixload  - 12h&lt;/td&gt;
&lt;td&gt;152.83&lt;/td&gt;
&lt;td&gt;3.92&lt;/td&gt;
&lt;td&gt;12.03&lt;/td&gt;
&lt;td&gt;19 out of 11023&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;26/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lending Mixload - 12h continued&lt;/td&gt;
&lt;td&gt;154.92&lt;/td&gt;
&lt;td&gt;3.87&lt;/td&gt;
&lt;td&gt;10.56&lt;/td&gt;
&lt;td&gt;12 out of 11154&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;32/64GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  #4 LoanSet Mixload capacity
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Ledger throughput per second&lt;/th&gt;
&lt;th&gt;Mean Ledger Publishing Latency (s)&lt;/th&gt;
&lt;th&gt;Response Time (ms)&lt;/th&gt;
&lt;th&gt;Over Validation&lt;/th&gt;
&lt;th&gt;CPU Utilization (%)&lt;/th&gt;
&lt;th&gt;Memory Usage (GB / Total)&lt;/th&gt;
&lt;th&gt;Average Node Memory Growth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 45 TPS&lt;/td&gt;
&lt;td&gt;46.13&lt;/td&gt;
&lt;td&gt;3.56&lt;/td&gt;
&lt;td&gt;3.45&lt;/td&gt;
&lt;td&gt;0 out of 1027&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;19/64GB&lt;/td&gt;
&lt;td&gt;4.43GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 90 TPS&lt;/td&gt;
&lt;td&gt;90.95&lt;/td&gt;
&lt;td&gt;3.62&lt;/td&gt;
&lt;td&gt;3.62&lt;/td&gt;
&lt;td&gt;1 out of 1011&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;21/64GB&lt;/td&gt;
&lt;td&gt;4.95GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 135 TPS&lt;/td&gt;
&lt;td&gt;132.10&lt;/td&gt;
&lt;td&gt;3.67&lt;/td&gt;
&lt;td&gt;2.19&lt;/td&gt;
&lt;td&gt;0 out of 998&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;23/64GB&lt;/td&gt;
&lt;td&gt;5.53GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 180 TPS&lt;/td&gt;
&lt;td&gt;180.83&lt;/td&gt;
&lt;td&gt;3.78&lt;/td&gt;
&lt;td&gt;4.24&lt;/td&gt;
&lt;td&gt;1 out of 968&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;24/64GB&lt;/td&gt;
&lt;td&gt;5.61GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 200 TPS&lt;/td&gt;
&lt;td&gt;193.83&lt;/td&gt;
&lt;td&gt;3.90&lt;/td&gt;
&lt;td&gt;4.97&lt;/td&gt;
&lt;td&gt;1 out of 938&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;24/64GB&lt;/td&gt;
&lt;td&gt;5.77GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoanSet 1h Target 225 TPS&lt;/td&gt;
&lt;td&gt;227.23&lt;/td&gt;
&lt;td&gt;4.16&lt;/td&gt;
&lt;td&gt;5.84&lt;/td&gt;
&lt;td&gt;21 out of 880&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;25/64GB&lt;/td&gt;
&lt;td&gt;6.74GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  LoanSet Memory Growth Graph
&lt;/h4&gt;

&lt;p&gt;The figure below illustrates the &lt;strong&gt;memory growth trend&lt;/strong&gt; observed during continuous &lt;em&gt;LoanSet&lt;/em&gt; transaction execution at increasing throughput targets.&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2F12qn2djkkvuqnj6hiodt.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.amazonaws.com%2Fuploads%2Farticles%2F12qn2djkkvuqnj6hiodt.png" alt="LoanSet Memory Growth Graph" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lending Mixload System Utilization Graph
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CPU Usage
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F7g8lpdka4lyol4r3r1h1.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.amazonaws.com%2Fuploads%2Farticles%2F7g8lpdka4lyol4r3r1h1.png" alt="CPU Usage" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  RAM Usage
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F2vl4se7exebxquuxxmf5.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.amazonaws.com%2Fuploads%2Farticles%2F2vl4se7exebxquuxxmf5.png" alt="RAM Usage" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The performance evaluation of the Lending Protocol (XLS-66) and Single Asset Vault (XLS-65) demonstrates that both amendments deliver high throughput across XRP, IOU, and MPT asset types while consistently maintaining consensus stability within the 5-second ledger target.&lt;/p&gt;

&lt;p&gt;However, memory growth remains the primary long-term risk factor under sustained lending workloads. During extended 24-hour Lending Mixload performance tests, RAM utilization exceeded 30 GB, driven by the cumulative expansion of SHAMap nodes from continuous LoanSet transactions. Although this remains below the 64 GB capacity of our test nodes, it raises potential concerns for validators operating with 32 GB RAM, where prolonged high-volume lending activity could approach system limits.&lt;/p&gt;

&lt;p&gt;To mitigate these risks, SHAMap node optimization and ledger object pruning should be prioritized in future rippled initiatives. These improvements will curb in-memory state growth and enhance long-term sustainability as new high-complexity features are introduced.&lt;/p&gt;

&lt;p&gt;From a deployment perspective, the current Lending Mixload throughput of ~152 TPS is sufficient to support near-term production needs and customer-scale adoption. Continued optimization efforts will further strengthen the ledger’s ability to sustain heavy workloads such as lending, AMM operations, and multi-asset payments.&lt;/p&gt;

</description>
      <category>xrpl</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>The XRPL Lending Protocol (&amp; Why It Matters)</title>
      <dc:creator>Ed Hennis</dc:creator>
      <pubDate>Fri, 19 Dec 2025 23:50:17 +0000</pubDate>
      <link>https://forem.com/ripplexdev/the-xrpl-lending-protocol-why-it-matters-cd</link>
      <guid>https://forem.com/ripplexdev/the-xrpl-lending-protocol-why-it-matters-cd</guid>
      <description>&lt;p&gt;The upcoming XRPL Lending Protocol brings &lt;strong&gt;fixed-term, fixed-rate, underwritten credit&lt;/strong&gt; directly into the XRP Ledger at the protocol level. For the first time, enterprises gain access to predictable, onchain lending designed for institutional use.&lt;/p&gt;

&lt;p&gt;With this upgrade, XRPL evolves from a payments-first ledger into a broader institutional finance platform, supporting capital-efficient credit flows, safer risk management, and new productive roles for XRP and RLUSD.&lt;/p&gt;

&lt;p&gt;It also unlocks a critical new use case for XRP holders: &lt;strong&gt;institutional-grade yield.&lt;/strong&gt; Custodians, exchanges, and large XRP holders can lend XRP into isolated, underwritten credit facilities to create the first scalable yield venue for XRP’s $115B+ market cap.&lt;/p&gt;

&lt;p&gt;Beyond this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Payment Service Providers (PSPs) can instantly pre-fund merchant payouts in RLUSD.&lt;/strong&gt; They borrow RLUSD for 1–3 days to bridge slow card-network and banking settlement windows, reducing capital requirements and enabling instant payouts globally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Market makers can borrow XRP/RLUSD for inventory financing at scale.&lt;/strong&gt; This lets firms run delta-neutral strategies, arbitrage, and cross-venue liquidity provisioning without locking up their own balance sheet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fintech lenders can access on-ledger working capital for SME and invoice financing.&lt;/strong&gt; Underwritten institutional credit (via select partners) allows fintechs to fund short-term loans, seasonal volumes, or treasury gaps with transparent, automated repayment rails.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, this is the first time that protocol-native credit markets have become possible on a global chain.&lt;/p&gt;

&lt;p&gt;And it positions the XRPL as a settlement and credit infrastructure for real institutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Existing Issues&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Crypto lending has grown meaningfully, with the combined lending markets reaching &lt;a href="https://defillama.com/protocols/lending" rel="noopener noreferrer"&gt;$90B in total-value-locked&lt;/a&gt; at their peak.&lt;/p&gt;

&lt;p&gt;Blue-chip DeFi lending protocols have made excellent traction with the crypto-native market, while the broader financial system has been effectively locked out for a few key reasons:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Capital Inefficiency in Existing Crypto Lending Models&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Most DeFi lending protocols rely on overcollateralization, often requiring 120–150% collateral to manage volatility and pseudonymous risk. This model works well for crypto-native markets, but it is capital-inefficient for real businesses, which typically operate with underwritten, unsecured, or partially secured credit facilities.&lt;/p&gt;

&lt;p&gt;Introducing an undercollateralized, institutionally underwritten model on the XRPL complements existing overcollateralized approaches by enabling enterprises to access credit in a form that aligns with how traditional financing is structured in practice.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Variable rates &amp;amp; speculation&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Rates swing wildly because they’re set by retail supply/demand dynamics, not by underwriting, borrower quality, or fundamentals. &lt;/p&gt;

&lt;p&gt;As a result, crypto lending resembles speculative funding markets where credit terms, risk pricing, and liquidity conditions can change overnight. This makes adoption very challenging for any institution that needs predictable financing.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Smart contract risk&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Each DeFi lending protocol:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has its own smart contract risk
&lt;/li&gt;
&lt;li&gt;Requires bespoke integration
&lt;/li&gt;
&lt;li&gt;Provides no real auditability for institutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, blockchain technology offers significant advantages over the traditional system, including 24/7 settlement, instant finality, transparent audit trails, and programmable repayment logic.&lt;/p&gt;

&lt;p&gt;This means that solving existing challenges, such as overcollateralization and others, can unlock cheaper credit, reduce operational risk, and enable lending models that are impossible to run on legacy infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Building Blocks: Single Asset Vaults &amp;amp; The Lending Protocol&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Most blockchain-based lending systems rely on smart contracts deployed on top of a chain. While flexible, this architecture creates institutional friction: every smart contract introduces its own risk surface, audit requirements, and operational variability. For enterprises evaluating credit markets, this lack of standardisation and predictable behaviour makes participation difficult.&lt;/p&gt;

&lt;p&gt;XRPL’s new lending system addresses this by introducing a protocol-native credit primitive through the XLS-66d amendment. Instead of running a separate application layer with bespoke contracts, the core rules of borrowing, repayment, term structure, interest, and authorisation are embedded directly into the protocol itself. This dramatically reduces risk, ensures consistent behaviour, and provides institutions with the reliability they need.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F2tm3k6xa0lf7uril3jpz.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.amazonaws.com%2Fuploads%2Farticles%2F2tm3k6xa0lf7uril3jpz.png" alt="Depiction of a water pump, as Lending Protocol (LP), being attached to a pool of water, as Single Asset Vault (SAV), resulting in a complete system where the Pool admin/Loan broker can oversee lending &amp;amp; borrowing, servicing, fees, etc." width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A water pump is a great analogy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Lending Protocol (LP)&lt;/strong&gt; is the pump: it defines how water flows, how pressure is controlled, and when valves open or close.
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;SAV&lt;/strong&gt; is the water tank: it holds only one type of water (e.g. XRP) in a contained reservoir.
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;pool admin&lt;/strong&gt; is the operator pumping the water: they decide when to open the pipes, who can draw water, and under what terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, the LP + SAV + Pool Admin form a complete institutional lending system, but with the mechanical reliability of infrastructure built directly into the ledger itself.&lt;/p&gt;

&lt;p&gt;The protocol utilizes Single Asset Vaults (SAVs) to house liquidity, where each SAV is dedicated to a specific asset. For example, there will be SAVs for XRP, others for RLUSD, and others for future assets. This isolation ensures that each asset has clean, segregated liquidity and that risk never flows from one vault to another.&lt;/p&gt;

&lt;p&gt;Pool admins act as real-world loan managers: they oversee borrower underwriting, manage repayments, track servicing, and set facility fees. In practice, a single SAV could be established for a specific asset, and the pool admin would manage the entire lifecycle of loans that draw from that vault — from risk assessment to settlement.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fhop51eglxkgi5n3xtovr.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.amazonaws.com%2Fuploads%2Farticles%2Fhop51eglxkgi5n3xtovr.png" alt="Screenshot of a tweet from @RippleXDev: " width="800" height="344"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: &lt;a href="https://x.com/RippleXDev/status/1785751045408260600" rel="noopener noreferrer"&gt;https://x.com/RippleXDev/status/1785751045408260600&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://x.com/RippleXDev/status/1785751045408260600" rel="noopener noreferrer"&gt;XLS-66d amendment&lt;/a&gt; lays the foundation for this architecture, enabling simplicity, direct lending, and a modular design that mirrors institutional credit markets. By embedding these mechanics at the protocol level, XRPL provides a unified, secure, and scalable credit primitive capable of supporting real-world financial institutions at a global scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Risk Is Managed
&lt;/h2&gt;

&lt;p&gt;Building the infrastructure of a new global financial system introduces significant risks.&lt;/p&gt;

&lt;p&gt;The design of the Lending Protocol ensures that several precautions are taken, both at the feature level and in the required participants who will facilitate a credit marketplace.&lt;/p&gt;

&lt;p&gt;These include:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Off-chain underwriting:&lt;/strong&gt; Experienced underwriters evaluate creditworthiness using real credit data, financial statements, and compliance checks.
&lt;/h4&gt;

&lt;p&gt;This mirrors traditional credit workflows and ensures borrowers are vetted long before any onchain loan is issued.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;First-loss capital:&lt;/strong&gt; Underwriters or pool admins supply first-loss capital to absorb defaults.
&lt;/h4&gt;

&lt;p&gt;Underwriters or pool admins supply a first-loss tranche that absorbs defaults before lenders ever take risk. In practice, this functions similarly to a junior tranche in traditional credit structures: the first-loss capital takes any impairment before senior liquidity providers are affected. This alignment ensures that the pool admin has meaningful skin-in-the-game and protects lenders from initial losses.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Isolated risk per borrower:&lt;/strong&gt; Each loan can be placed in its own SAV, and one default cannot impact others.
&lt;/h4&gt;

&lt;p&gt;If a Single Asset Vault (SAV) is permissioned for a single borrower, then any default is contained entirely within that borrower’s vault, even if they have multiple active loans. If a vault is shared by several borrowers or lenders, a default impacts participants proportionally. In practice, the most conservative structure is one borrower–one lender per SAV, providing the strongest risk isolation.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Transparent, immutable records:&lt;/strong&gt; All events live onchain, providing full transparency.
&lt;/h4&gt;

&lt;p&gt;All loan events, such as issuance and repayments, are recorded onchain. This provides real-time auditability, simplifies accounting, strengthens compliance reporting, and enables institutions to track credit performance with complete clarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case Study: Borrowing XRP &amp;amp; RLUSD
&lt;/h2&gt;

&lt;p&gt;There are many ways in which different financial institutions can leverage the XRPL Lending Protocol, depending on their liquidity needs, business model, and credit operations. For instance, market makers can borrow XRP or RLUSD to run capital-efficient liquidity strategies, while PSPs and fintechs can borrow RLUSD to pre-fund merchant payouts and eliminate settlement delays.&lt;/p&gt;

&lt;p&gt;Below, we outline practical examples for XRP and RLUSD—while keeping in mind that because any supported asset can have its own Single Asset Vault (SAV), these use cases only scratch the surface of what becomes possible as the ecosystem expands.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;&lt;em&gt;Market Makers&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Market makers require capital to maintain balanced inventory across multiple exchanges, deepen order books, and respond to price dislocations. &lt;/p&gt;

&lt;p&gt;Borrowing XRP or RLUSD allows them to operate more efficiently without tying up significant proprietary capital. This improves liquidity across the crypto ecosystem and positions XRP/RLUSD as a productive asset within global market-making flows.&lt;/p&gt;

&lt;p&gt;Common uses include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inventory financing:&lt;/strong&gt; Borrow assets to deepen capital inventory on various trading venues.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-exchange arbitrage:&lt;/strong&gt; Use borrowed XRP or RLUSD to capture price gaps across exchanges without deploying locked collateral.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta-neutral strategies:&lt;/strong&gt; Borrow, hedge, and earn funding or spread without taking directional price risk.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidity provisioning:&lt;/strong&gt; Supply borrowed assets to AMM pools or order books, earning fees while staying capital-light.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These strategies all revolve around borrowing an asset at a predictable fixed rate and deploying it into liquidity, arbitrage, or hedged positions that generate a higher return.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;&lt;em&gt;Payment Service Providers (PSPs) &amp;amp; Fintech Payment Rails&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;PSPs routinely face timing mismatches between when merchants must be paid and when banks/card networks settle funds. &lt;/p&gt;

&lt;p&gt;Borrowing RLUSD eliminates settlement lag by providing PSPs with instant, predictable liquidity. This enables “instant payout” experiences while reducing the amount of capital they must keep idle.&lt;/p&gt;

&lt;p&gt;Some exciting applications include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Settlement float replacement:&lt;/strong&gt; Borrow RLUSD for 1–3 days to pre-fund payouts while waiting for bank/card settlement.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant merchant payouts:&lt;/strong&gt; Use borrowed liquidity to deliver real-time payouts, then repay once traditional rails clear.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payout liquidity smoothing:&lt;/strong&gt; Maintain consistent RLUSD liquidity during peak transaction cycles.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-border corridor funding:&lt;/strong&gt; Borrow RLUSD or XRP to pre-fund specific currency routes and eliminate foreign exchange delays.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;&lt;em&gt;Trading Firms&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Professional traders and quant firms rely on flexible leverage to deploy capital into structured trades. &lt;/p&gt;

&lt;p&gt;Borrowing XRP or RLUSD allows them to run hedged, market-neutral plays without locking up their own assets, which is particularly valuable during periods of high funding spreads or basis dislocations.&lt;/p&gt;

&lt;p&gt;A few ways this would play out include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Funding-rate arbitrage:&lt;/strong&gt; Borrow assets to exploit positive funding spreads between spot and perpetual futures.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cash-and-carry trades:&lt;/strong&gt; Borrow the base asset for long-spot/short-futures strategies that lock in a predictable yield.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hedged inventory management:&lt;/strong&gt; Rebalance positions across venues while staying neutral to market drift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;&lt;em&gt;Fintech Lenders &amp;amp; SME Financing Partners&lt;/em&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Fintech lenders serving SMEs operate on tight liquidity cycles, where predictable short-term credit is essential. &lt;/p&gt;

&lt;p&gt;Borrowing RLUSD gives them the capital needed to issue loans, finance invoices, or smooth seasonal working-capital needs. Because the lending protocol supports fixed terms and fixed rates, these firms gain clear repayment timelines (mirroring institutional credit facilities).&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invoice financing:&lt;/strong&gt; Borrow RLUSD to advance cash to businesses against outstanding invoices.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30–90 day working capital:&lt;/strong&gt; Provide short-term liquidity to SMEs with predictable on-ledger repayment.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seasonal financing:&lt;/strong&gt; Support SME cash flow during peak seasons such as holidays, tourism waves, or inventory cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What’s Next?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The introduction of protocol-native lending marks a major evolution for the XRPL. &lt;/p&gt;

&lt;p&gt;For the first time, real institutions can access fixed-term, underwritten credit directly on-ledger, without smart-contract risk, fragmented liquidity, or overcollateralized constraints.&lt;/p&gt;

&lt;p&gt;As SAVs, underwriters, and early pool admins come online, we will see XRP, RLUSD, and future assets take on new roles as productive capital within global payments, market-making, and financing workflows. This unlocks entirely new credit markets, deepens utility for XRP/RLUSD, and positions the XRPL as a foundational settlement and credit infrastructure for institutional finance.&lt;/p&gt;

&lt;p&gt;We anticipate the relevant Lending Protocol amendments to enter the validator voting process in late January, marking the next major milestone toward mainnet activation.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>Smart Escrow Series #3: Security</title>
      <dc:creator>Mayukha Vadari</dc:creator>
      <pubDate>Thu, 18 Dec 2025 18:28:25 +0000</pubDate>
      <link>https://forem.com/ripplexdev/smart-escrow-series-3-security-3e0p</link>
      <guid>https://forem.com/ripplexdev/smart-escrow-series-3-security-3e0p</guid>
      <description>&lt;p&gt;The XRP Ledger (XRPL) is recognized for its &lt;strong&gt;stability, efficiency, and robustness&lt;/strong&gt;. As the XRPL introduces custom on-chain business logic via Smart Escrows and the underlying WebAssembly (WASM) virtual machine, one paramount design objective is to maintain the network's integrity and security.&lt;/p&gt;

&lt;p&gt;The implementation of Smart Escrows relies on a &lt;strong&gt;security-first design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Strict Sandbox: Preventing Unauthorized Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The WASM code is executed in a &lt;strong&gt;secure, sandboxed environment&lt;/strong&gt;. Advanced WASM features are disabled, to limit the surface area for bugs and exploits. The memory limits of the WASM module is also strictly limited.&lt;/p&gt;

&lt;p&gt;The fundamental rule for the WASM code in Smart Escrows is &lt;strong&gt;read-only access, with only very specific write access allowed&lt;/strong&gt;. WASM code has read-only access to all ledger objects and a variety of other on-chain data (such as ledger header information). It only has write access to the Data field in the Escrow that it is attached to. The only influence the WASM code has is updating the Data field and returning whether or not the escrow can be released. This strict limitation ensures that the custom logic cannot negatively affect the integrity of the ledger or the balances of other accounts.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fzh6bsq0ed8t755cbncos.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.amazonaws.com%2Fuploads%2Farticles%2Fzh6bsq0ed8t755cbncos.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guarding the Network: Resource Limits and Gas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A major security concern with introducing programmable code is the potential for denial-of-service (DoS) attacks, where malicious code attempts to create infinite loops or consume excessive resources. To mitigate this, &lt;strong&gt;execution is strictly bounded&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every step of WASM execution consumes "&lt;strong&gt;gas&lt;/strong&gt;". When a user submits an EscrowFinish transaction, they must include a &lt;code&gt;ComputationAllowance&lt;/code&gt; field, which dictates the maximum amount of gas they are willing to pay for the code execution. If the custom code exceeds the gas budget provided in the &lt;code&gt;ComputationAllowance&lt;/code&gt;, the execution is &lt;strong&gt;immediately terminated&lt;/strong&gt; with a deterministic failure. This prevents malicious or buggy code from running infinitely and ensures the execution remains fast and predictable.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fja1iq55yjkxxsj95wl4i.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.amazonaws.com%2Fuploads%2Farticles%2Fja1iq55yjkxxsj95wl4i.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key resource constraints, such as the maximum WASM code size and the maximum computation allowed, are &lt;strong&gt;UNL-adjustable parameters&lt;/strong&gt; controlled via the standard fee-voting process. This allows the network to &lt;strong&gt;dynamically adjust resource usage and pricing&lt;/strong&gt; as network performance changes or if abuse attempts arise, without requiring a separate, full amendment. This also enables a &lt;strong&gt;fast shutdown mechanism&lt;/strong&gt;, with the ability to shut down all usage of WASM code by setting the computation limit to 0.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fujfpjdp4o77wd6vd5504.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.amazonaws.com%2Fuploads%2Farticles%2Fujfpjdp4o77wd6vd5504.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User and Developer Protections&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To mitigate the risk of funds becoming permanently locked (stuck) due to buggy custom code, any escrow containing a FinishFunction &lt;strong&gt;must&lt;/strong&gt; also be cancellable. This mandatory feature ensures that if the custom conditions can never be met (due to a bug in the code or a flaw in the logic), the sender can still recover the funds after the specified CancelAfter time has passed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audits and Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entire implementation is currently undergoing &lt;strong&gt;rigorous testing and multiple security audits&lt;/strong&gt; to confirm that the WASM runtime is securely integrated into rippled and ensure that WASM code cannot violate the assumptions and invariants that have been established.&lt;/p&gt;

&lt;p&gt;Wasmi, the chosen runtime, has also been audited twice previously for blockchain use cases. Those audit reports are available publicly here: &lt;a href="https://github.com/wasmi-labs/wasmi/tree/main/resources" rel="noopener noreferrer"&gt;https://github.com/wasmi-labs/wasmi/tree/main/resources&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This security framework ensures that the flexibility of custom programming is introduced through &lt;strong&gt;small, measured steps&lt;/strong&gt;, leveraging the stability of existing XRPL primitives while &lt;strong&gt;strictly containing the risks associated with user-deployed code&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>TokenEscrowV1: Fixing MPT Escrow Accounting</title>
      <dc:creator>Shashwat Mittal</dc:creator>
      <pubDate>Wed, 17 Dec 2025 19:09:30 +0000</pubDate>
      <link>https://forem.com/ripplexdev/tokenescrowv1-fixing-mpt-escrow-accounting-5adb</link>
      <guid>https://forem.com/ripplexdev/tokenescrowv1-fixing-mpt-escrow-accounting-5adb</guid>
      <description>&lt;p&gt;Escrow is the backbone of the XRPL’s settlement system, but historically it was limited to XRP only. &lt;/p&gt;

&lt;p&gt;Token Escrow (XLS-85) extends this functionality to any issued token, including IOUs and Multi-Purpose Tokens, enabling time-locked or condition-based delivery of assets. This makes it essential for institutional workflows such as scheduled payouts, conditional settlements, and automated treasury operations.&lt;/p&gt;

&lt;p&gt;During internal testing of the original Token Escrow amendment (which was never enabled on mainnet), a bug was discovered in how escrows involving MPTs with transfer fees were handled. &lt;/p&gt;

&lt;p&gt;The TokenEscrowV1 amendment resolves this issue and restores correct accounting behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Multi-Purpose Tokens (MPTs) are an XRPL-native token standard that blends fungible and non-fungible properties, allowing assets to have shared traits while carrying rich, asset-specific metadata directly onchain. They’re essential for institutional tokenization because they enable precise asset representation, embedded compliance rules, and full lifecycle management without relying on external smart contracts.&lt;/p&gt;

&lt;p&gt;However, an existing issue was that when an MPT escrow finished and the MPT had a transfer fee, the ledger applied the fee during unlock.&lt;br&gt;
Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you held 100 tokens in escrow,&lt;/li&gt;
&lt;li&gt;And the transfer fee was 1 token,&lt;/li&gt;
&lt;li&gt;The recipient correctly received 99 tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This behaviour was expected.&lt;/p&gt;

&lt;p&gt;The bug was in the issuer’s accounting:&lt;/p&gt;

&lt;p&gt;The ledger incorrectly reduced the issuer’s LockedAmount by only the net amount (99), even though 100 tokens were initially placed into escrow. This left 1 token permanently stuck in the locked state, causing supply inaccuracies and long-term accounting drift.&lt;/p&gt;

&lt;p&gt;In other words: &lt;strong&gt;Instead of decreasing LockedAmount from 100 → 0, the system went from 100 → 1.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over time, this would have led to various issues, such as changes in the actual supply, ledger inconsistencies, and a lack of trust in the issuer's metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: TokenEscrowV1 Amendment
&lt;/h2&gt;

&lt;p&gt;The fix restores correct behaviour by cleanly separating gross escrow logic from net delivery logic.&lt;/p&gt;

&lt;p&gt;How the fix works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LockedAmount now always decreases by the full escrowed amount (gross).&lt;/strong&gt; For example, if escrow locks 100 tokens, then LockedAmount decreases by 100.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outstanding supply adjusts only by the net difference (reflecting transfer fees).&lt;/strong&gt; For example, if 100 tokens are escrowed and the recipient receives 99 after fees, then Outstanding decreases by 99, with the 1-token fee handled separately through the issuer’s transfer-fee mechanism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This solves all preexisting issues, such as ensuring that no tokens become trapped, that total supply remains accurate, LockedAmount returns precisely to its pre-escrow value, and so forth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; escrowed tokens unlock exactly as they were locked, regardless of transfer fees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validator Voting
&lt;/h2&gt;

&lt;p&gt;The XRP Ledger is governed by validator consensus.&lt;/p&gt;

&lt;p&gt;Because this fix modifies how the ledger processes escrow completions, it must be activated through an amendment vote.&lt;/p&gt;

&lt;p&gt;Validator approval is essential to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure nodes use correct MPT escrow accounting, avoiding supply drift.&lt;/li&gt;
&lt;li&gt;Guarantee consistent balances and ledger behavior across all implementations.&lt;/li&gt;
&lt;li&gt;Give issuers accurate LockedAmount and supply metrics, especially for transfer-fee tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We appreciate the validators’ review and support in enabling TokenEscrowV1, which strengthens the reliability and correctness of MPT-based token flows across the network.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>news</category>
      <category>web3</category>
    </item>
    <item>
      <title>A Formal Verification of the XRP Ledger</title>
      <dc:creator>Vito Tumas</dc:creator>
      <pubDate>Wed, 17 Dec 2025 15:52:43 +0000</pubDate>
      <link>https://forem.com/ripplexdev/a-formal-verification-of-the-xrp-ledger-51e4</link>
      <guid>https://forem.com/ripplexdev/a-formal-verification-of-the-xrp-ledger-51e4</guid>
      <description>&lt;p&gt;&lt;em&gt;Summary&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ripple is working with Common Prefix to specify and formally verify key components (Payment Engine and the Consensus Protocol) of the XRP Ledger. You can read the fresh specification of the Payment Engine on Github:  &lt;a href="https://github.com/commonprefix/payment-system-docs" rel="noopener noreferrer"&gt;XRP Ledger Payment Engine Specification&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;In 2012, when the XRP Ledger first went live, its creators had a singular goal, to make a new, more efficient blockchain, with the limited resources available. There were no teams of researchers, formal specification nor an ecosystem of auditors and academic papers to lean on. The engineers were racing to build a functioning, reliable decentralised ledger. Since those days, XRP Ledger has become one of the longest-running blockchains, operating well over a decade without downtime, powering hundreds of millions of ledger, and transactions[&lt;a href="https://xrpscan.com/ledger/100000000" rel="noopener noreferrer"&gt;1&lt;/a&gt;]. However, for the foundational components, the single C++ implementation, xrpld, has served as the only definitive source of truth, creating fundamental challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The system does not prove that it cannot reach an invalid state. The decade-long track record is a testament to the quality of engineering, however, to prepare the ledger for the next generation of complex features, we must move beyond empirical success to mathematical certainty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The code tells us, in very precise C++ terms, what it does. It does not always tell us why, or, in other words, the code doesn't tell us the intention, making it impossible to distinguish between deliberate and ingrained behaviour.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This "specification debt" in the ledger's core is coming due as the blockchain evolves. The XRP Ledger is a dynamic system with new, highly complex features being continuously proposed and added.&lt;/p&gt;

&lt;p&gt;Consider the recent and upcoming features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/ripplexdev/xrp-ledger-lending-protocol-2pla"&gt;The Lending Protocol&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/ripplexdev/multi-purpose-tokens-mpt-chronology-and-how-to-test-on-devnet-19nj"&gt;Multi-Purpose Token (MPT) DEX&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/ripplexdev/introducing-batch-transactions-on-the-xrp-ledger-more-opportunities-less-friction-50h5"&gt;Batch Transactions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ripple.com/insights/unlocking-institutional-access-to-defi-on-the-xrp-ledger/" rel="noopener noreferrer"&gt;Permissioned DEXes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are intricate amendments that must weave into the decades-old logic of the ledger, but this raises further questions. How does the new Lending Protocol interact with the rules for frozen assets or clawbacks? How do batch transactions affect the ordering and execution logic of the DEX?&lt;/p&gt;

&lt;p&gt;Each new feature that must fit into an already complex, unspecified system creates an exponential increase in possible states and interactions. Relying on human intuition and traditional testing alone is no longer sufficient to guarantee correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Verifiable Source of Truth
&lt;/h2&gt;

&lt;p&gt;Addressing these challenges requires a formal, abstract specification of XRP Ledger’s critical components, that provide a verifiable source of truth to reason about the system’s behaviour, both manually and mechanically. Two distinct, but complementary assets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Human-Readable Specification: A clear, unambiguous document describing the system behaviour, serving as the canonical reference for developers and researchers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Machine-Verifiable Model: A formal, mathematical representation of the specification enabling mechanical proofs of system properties, simulating network behaviour, and verifying that new code changes do not violate core safety guarantees.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Benefits: A Stronger Foundation
&lt;/h2&gt;

&lt;p&gt;Establishing a formal specification builds a stronger foundation that will deliver compounding benefits across the entire XRP Ledger ecosystem.&lt;/p&gt;

&lt;p&gt;But what are formal methods? In simple terms, formal methods are a set of techniques based on applied mathematics and logic, used to specify, design, and verify complex software and hardware systems.&lt;/p&gt;

&lt;p&gt;Instead of relying solely on traditional testing, which can only prove the presence of bugs, formal methods allow us to prove the absence of certain classes of bugs. They help us answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Is it ever possible for this system to enter an invalid state?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Does this new Lending Protocol break any of the core invariants of the payment engine?"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a system with rising complexity, human intuition fails. Formal methods provide tools to model complex interactions, detect edge-case bugs and provide mathematical certainty about the correctness and soundness of protocol designs.&lt;/p&gt;

&lt;p&gt;First and foremost, a formal specification provides clarity and reduces ambiguity. It acts as a single source of truth, eliminating guesswork for developers building the XRP Ledger. This clarity also leads to faster onboarding, as a structured specification significantly accelerates new developers' and researchers' understanding of the protocol's core mechanics.&lt;/p&gt;

&lt;p&gt;This initiative will also lead to more robust testing and auditing. The specification becomes the canonical benchmark against which to measure the implementation, enabling the creation of more comprehensive test suites and allowing auditors to independently verify an implementation's correctness, not just its internal self-consistency.&lt;/p&gt;

&lt;p&gt;Furthermore, a formal model enables safer protocol evolution. Proposed amendments can be modelled and evaluated with mathematical rigour before a single line of code is written, ensuring predictable, more secure upgrades.&lt;/p&gt;

&lt;p&gt;Finally, this work serves as a foundation for advanced technologies. A formal specification is the essential blueprint for building complex, next-generation features like trustless ZK-bridges. It simplifies the design of cryptographic circuits and dramatically reduces the risk of introducing subtle, critical errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Process: From Code to Formal Proof
&lt;/h2&gt;

&lt;p&gt;It's important to understand that turning an existing C++ implementation into a verifiable model is not straightforward. It is an act of modelling and abstraction, not translation. A direct, line-by-line conversion of the C++ codebase into a formal language is not only unfeasible, but it would miss the entire point of the exercise.&lt;/p&gt;

&lt;p&gt;This first stage requires archaeology and engineering, reviewing design documents and code and engaging with core developers to understand the system's intent. The output of this stage is a clear, structured document in plain English that describes the protocol's rules without C++-specific details.&lt;/p&gt;

&lt;p&gt;The second stage demands precise semantics of a formal language, focusing on the areas where the most dangerous bugs hide: concurrency, distributed consensus, and complex state transitions.&lt;/p&gt;

&lt;p&gt;Modelling a system is an iterative process: checking for flaws with tools like &lt;a href="https://lamport.azurewebsites.net/tla/tla.html" rel="noopener noreferrer"&gt;TLA+&lt;/a&gt; and refining the specification based on the results.&lt;/p&gt;

&lt;p&gt;A direct code conversion would inevitably fail for three key reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;State Explosion: The C++ code contains excessive detail. A model that included all of it would have a state space far too large for any computer to analyse effectively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation Bias: A converted model would be a model of the implementation, not the design. A bug in the code would be faithfully reproduced in the model, defeating the purpose of verification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loss of Abstraction: The focus shifts from verifying the high-level correctness of the protocol to checking low-level details such as memory management, losing the crucial design-level insights we aim to gain.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, instead modelling the system as a state machine to express its behaviour and desired system properties, enables using model checkers to  exhaustively search for logical flaws in the design exhaustively, creating a powerful feedback loop that allows finding and fixing ambiguities in the informal spec and logical errors in the formal model, refining both until they are robust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaboration and Focus
&lt;/h2&gt;

&lt;p&gt;To execute this critical work, Ripple is collaborating with Common Prefix, a firm with deep expertise in formal verification and protocol analysis, including a specialized focus on consensus foundations, interoperability, and mathematically proving core properties of distributed ledger protocols.&lt;/p&gt;

&lt;p&gt;The sheer complexity of the XRP Ledger requires a focused approach. It would be prohibitively expensive and time-consuming to specify the entire system at once. Together, we have identified the two most critical and complex components as our starting point: the Payment Engine and the Consensus Protocol.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Payment Engine&lt;/strong&gt; is the system responsible for all value transfer, including complex operations like crossing the decentralised exchange and rippling.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Consensus Protocol&lt;/strong&gt; is the heart of the ledger, enabling nodes to reach consensus on a common state. Its correctness is non-negotiable and underpins the safety and liveness of the entire network. We will create a formal model of the consensus mechanism to mathematically prove its core properties of liveness (the network continues to make progress), safety (the network never reaches an invalid state), and finality (transactions are irreversible once confirmed).&lt;/p&gt;

&lt;p&gt;This initiative marks a crucial step in maturing the XRPL into a platform ready for the next decade of institutional finance and decentralised innovation.&lt;/p&gt;

&lt;p&gt;The shift from code-as-truth to mathematics-as-truth is underway. We invite you to read the &lt;a href="https://github.com/commonprefix/payment-system-docs" rel="noopener noreferrer"&gt;XRP Ledger Payment Engine Specification&lt;/a&gt;. Building on the Payment Engine specification, we’ll begin formal verification of it, and the Consensus Protocol in 2026.&lt;/p&gt;

</description>
      <category>xrpledger</category>
      <category>verification</category>
      <category>safety</category>
    </item>
    <item>
      <title>Smart Escrow Post #2: What is WebAssembly?</title>
      <dc:creator>Mayukha Vadari</dc:creator>
      <pubDate>Fri, 12 Dec 2025 22:04:51 +0000</pubDate>
      <link>https://forem.com/ripplexdev/smart-escrow-post-2-what-is-webassembly-4of3</link>
      <guid>https://forem.com/ripplexdev/smart-escrow-post-2-what-is-webassembly-4of3</guid>
      <description>&lt;p&gt;As the XRPL moves toward permissionless programmability, starting with Smart Escrows, it needs a secure, reliable, and high-performance engine to run custom developer code. The conclusion we came to is that that engine should be &lt;strong&gt;WebAssembly, often abbreviated as WASM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Earlier this year, the RippleX Programmability team surveyed various virtual machine (VM) options, and concluded that WASM was the best choice for the XRPL ecosystem for a few different reasons. Read more here: &lt;a href="https://dev.to/ripplexdev/a-survey-of-vms-for-xrpl-programmability-eoa"&gt;https://dev.to/ripplexdev/a-survey-of-vms-for-xrpl-programmability-eoa&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;WASM is not exclusive to the blockchain world. It’s a &lt;strong&gt;universal, open standard&lt;/strong&gt; that was originally designed to run high-performance applications in web browsers (though now it is used in many other contexts as well). It is intended to support any language on any operating system, and in practice most languages have some level of support. &lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;https://webassembly.org/&lt;/a&gt; &lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fu0k3k0zufo6nhfbm2ixa.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.amazonaws.com%2Fuploads%2Farticles%2Fu0k3k0zufo6nhfbm2ixa.png" alt=" " width="800" height="954"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WASM-based smart contract runtimes are &lt;strong&gt;deterministic, secure, and portable&lt;/strong&gt;. The entire system relies on WebAssembly's &lt;strong&gt;core promise of deterministic execution&lt;/strong&gt;, meaning the code will run identically on all rippled nodes, regardless of operating system or hardware, to ensure consensus is maintained. In addition, WASM promises better performance, and supports many general-purpose programming languages, like Rust, C, and Go (in other words, a Web2 developer may not have to learn a new language). With those benefits, WASM is the most popular smart contract language choice of many of the newer blockchain projects, such as Polkadot, Cosmos, Near, and most recently Soroban on Stellar.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fbhfqv42zua9v0yxge47w.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.amazonaws.com%2Fuploads%2Farticles%2Fbhfqv42zua9v0yxge47w.png" alt=" " width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Functions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To securely access ledger data and improve the efficiency of computation-intensive tasks, the WASM code relies on Host Functions. Think of a Host Function as an &lt;strong&gt;internal API call&lt;/strong&gt;: it is expressed outside the WASM code (in the efficient C++ code that runs the XRPL) and allows the WASM program to securely query data from the ledger state. In EVM terms, this is roughly equivalent to precompiles.&lt;/p&gt;

&lt;p&gt;The fundamental rule for the WASM code in Smart Escrows is &lt;strong&gt;read-only access, with only very specific write access allowed&lt;/strong&gt;. WASM code has read-only access to all ledger objects and a variety of other on-chain data (such as ledger header information). It only has write access to the Data field in the Escrow that it is attached to.  This strict limitation ensures that the custom logic cannot negatively affect the integrity of the ledger or the balances of other accounts.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fg9l59u5xpbp2lxq1mr7m.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.amazonaws.com%2Fuploads%2Farticles%2Fg9l59u5xpbp2lxq1mr7m.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WASM runtime environments are low-level virtual stack machines, like JVM, and can be embedded into any host application (such as rippled). There are several different implementations, with various tradeoffs. We chose &lt;strong&gt;Wasmi&lt;/strong&gt; due to its performance and history of use in other blockchains (Polkadot and Solana also use Wasmi). &lt;a href="https://dev.to/ripplexdev/xrpl-programmability-wasm-runtime-revisit-2ak0"&gt;https://dev.to/ripplexdev/xrpl-programmability-wasm-runtime-revisit-2ak0&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In summary&lt;/strong&gt;, WASM is the secure, high-performance virtual machine that executes the custom release logic for Smart Escrows. It allows developers to deploy complex, conditional rules using familiar programming languages, all while operating within carefully guarded boundaries that ensure the security and stability the XRPL is known for.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>xrp</category>
      <category>blockchain</category>
      <category>webassembly</category>
    </item>
    <item>
      <title>Smart Escrows Post #1: What are Smart Escrows?</title>
      <dc:creator>Mayukha Vadari</dc:creator>
      <pubDate>Thu, 04 Dec 2025 17:35:56 +0000</pubDate>
      <link>https://forem.com/ripplexdev/smart-escrows-post-1-what-are-smart-escrows-34le</link>
      <guid>https://forem.com/ripplexdev/smart-escrows-post-1-what-are-smart-escrows-34le</guid>
      <description>&lt;p&gt;I’m starting a series focusing on different aspects of Smart Escrows. Post #1: &lt;strong&gt;What are Smart Escrows?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The XRP Ledger is built on a foundation of powerful, native features like &lt;a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens" rel="noopener noreferrer"&gt;Tokens/Issued Assets&lt;/a&gt;, &lt;a href="https://xrpl.org/docs/concepts/payment-types/escrow" rel="noopener noreferrer"&gt;Escrow&lt;/a&gt;, the &lt;a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange" rel="noopener noreferrer"&gt;DEX&lt;/a&gt;, and &lt;a href="https://xrpl.org/docs/concepts/payment-types/payment-channels" rel="noopener noreferrer"&gt;Payment Channels&lt;/a&gt;, which are renowned for their security, efficiency, and robustness. While the XRPL’s &lt;a href="https://xrpl.org/docs/concepts/networks-and-servers/amendments" rel="noopener noreferrer"&gt;amendment process&lt;/a&gt; allows for careful, collectively-driven updates and provides a secure approach to introducing widely applicable features, this leaves a gap for developers who need to address the bespoke needs of their business but don’t want to (or can’t) drive broad community adoption for a specific (sometimes niche) use case. To maintain these core strengths while allowing developers greater onchain flexibility, a new vision for permissionless programmability is emerging.&lt;/p&gt;

&lt;p&gt;The first major component of this initiative is the concept of Smart Features. These allow developers some limited customizability, built on top of individual XRPL primitives. Essentially, developers are able to unlock powerful new capabilities while maintaining the simplicity and efficiency the network is known for. The Escrow is the very first primitive to receive this upgrade: enter Smart Escrows.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fgcy7sbeii76gal8jao2p.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.amazonaws.com%2Fuploads%2Farticles%2Fgcy7sbeii76gal8jao2p.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First: a refresher on the &lt;strong&gt;existing state of XRPL Escrows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xrpl.org/docs/concepts/payment-types/escrow" rel="noopener noreferrer"&gt;XRPL Escrows&lt;/a&gt; are essentially onchain contracts that govern the all-or-nothing transfer of funds from one account to another based on pre-agreed terms. Currently, they can only hold XRP, but the TokenEscrow amendment (currently up for voting) will enable holding both IOUs (issued assets) and MPTs (multi-purpose tokens).&lt;/p&gt;

&lt;p&gt;Historically, there were only two ways to release funds held in an Escrow:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time-based: The escrow can be released after a specific, predetermined time has passed.
&lt;/li&gt;
&lt;li&gt;Condition-based: The escrow requires a "password" to be provided during the release transaction (essentially a hash-lock).
&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fwj5e2yw90fft7vys73v4.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.amazonaws.com%2Fuploads%2Farticles%2Fwj5e2yw90fft7vys73v4.png" alt=" " width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Custom Release Function for Escrows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart Escrows introduce a new layer of programmability to the existing Escrow primitive. Instead of being limited to just the time- and condition-based release options, &lt;strong&gt;developers can now write their own custom release conditions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This enhancement allows conditions that go beyond the current time-based or crypto-conditional constraints, significantly expanding the XRPL’s utility. Because Smart Escrows build upon the existing, battle-tested Escrow primitive, developers gain custom functionality without having to reinvent the wheel, such as via a completely separate smart contract.&lt;br&gt;&lt;br&gt;
The custom logic is introduced via &lt;strong&gt;a small, programmable code block that lives directly on the Escrow object&lt;/strong&gt;. When an Escrow is created using an EscrowCreate transaction, the developer uploads this code block (written in compiled WebAssembly or WASM - more on this to come) alongside the standard parameters and the funds to be locked.&lt;/p&gt;

&lt;p&gt;When a user attempts to complete the escrow and release the funds using an EscrowFinish transaction, the FinishFunction is executed on-chain. The function runs, and that custom code determines whether or not the escrow’s funds are released to its destination.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fyv2emxsupzugfpxokwe7.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.amazonaws.com%2Fuploads%2Farticles%2Fyv2emxsupzugfpxokwe7.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By just adding this small bit of programmability, Smart Escrows allow a significant amount of new onchain functionality. Examples include:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notary Escrows: The escrow is structured so that only a specific, trusted account (the "notary") can authorize the release of the asset.
&lt;/li&gt;
&lt;li&gt;Compliance and Temporary Holds: Funds are held until compliance checks or KYC verification is complete. The custom function could check if the destination account holds a specific on-chain credential or NFT issued by a compliance provider before allowing the transfer.
&lt;/li&gt;
&lt;li&gt;Trustless Token Swaps (Delivery vs. Payment): Developers can link two escrows so that the completion of one depends on the creation or completion of the other, ensuring a trustless, atomic exchange of value or assets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to read more about XLS-100, here’s a link to the spec: &lt;a href="https://xls.xrpl.org/xls/XLS-0100-smart-escrows.html" rel="noopener noreferrer"&gt;https://xls.xrpl.org/xls/XLS-0100-smart-escrows.html&lt;/a&gt; &lt;/p&gt;

</description>
      <category>web3</category>
      <category>xrpl</category>
      <category>xrp</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
