Files
xrpl-dev-portal/docs/tutorials/how-tos/use-batch-transactions/send-a-single-account-batch-transaction.md
2025-11-03 15:11:10 +00:00

6.4 KiB

seo, metadata, labels
seo metadata labels
description
Send a Batch transaction from a single account.
indexPage
true
Batch
Transactions

Send a Single Account Batch Transaction

A [Batch transaction][] allows you to group multiple transactions together and execute them as a single atomic operation.

This tutorial shows you how to create a Batch transaction where a single account submits multiple transactions that either all succeed together or all fail together.

Goals

By the end of this tutorial, you will be able to:

  • Create a Batch transaction with multiple inner transactions, signed and submitted by a single account.
  • Configure the Batch transaction to ensure atomicity, so that either all inner transactions succeed or they all fail.

Prerequisites

To complete this tutorial, you should:

  • Have a basic understanding of the XRP Ledger.
  • Have an XRP Ledger client library set up in your development environment. This page provides examples for the following:

Source Code

You can find the complete source code for this tutorial's examples in the code samples section of this website's repository.

Steps

The example in this tutorial demonstrates a scenario where an account sends multiple payments that must be processed atomically in one Batch transaction.

1. Install dependencies

{% tabs %} {% tab label="Javascript" %} From the code sample folder, use npm to install dependencies:

npm install xrpl

{% /tab %} {% /tabs %}

2. Set up client and accounts

To get started, import the client library and instantiate a client to connect to the XRPL. For this tutorial you need a funded account for the Batch transaction sender, and two other accounts to receive the payments.

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="import xrpl" before="// Create inner transactions" /%} {% /tab %} {% /tabs %}

3. Prepare inner transactions

Next, prepare the inner transactions that will be included in the batch.

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="// Create inner transactions" to="// Send Batch transaction" /%} {% /tab %} {% /tabs %}

The first transaction sends a payment of 2 XRP from the sender to wallet1, and the second transaction sends 5 XRP from the sender to wallet2. Both transactions must include the tfInnerBatchTxn (0x40000000) flag to indicate that they are inner transactions of a batch.

Inner transactions must have a Fee of 0 and an empty string for the SigningPubKey. The outer Batch transaction handles the overall fee and signing for all inner transactions.

{% admonition type="info" name="Note" %} The Fee and SigningPubKey fields are omitted as the client library's autofill functionality automatically populates these when submitting the Batch transaction.

You typically don't need to set these manually, but if you do, ensure Fee is set to 0 and SigningPubKey is an empty string. {% /admonition %}

4. Prepare Batch transaction

Create the Batch transaction and provide the inner transactions. The key fields to note are:

Field Value
TransactionType The type of transaction, in this case Batch.
Account The wallet address of the account that is sending the Batch transaction.
Flags The flags for the Batch transaction. For this example the transaction is configured with the tfAllOrNothing (0x00010000) flag to ensure that either all inner transactions succeed or they all fail atomically. See Batch Flags for other options.
RawTransactions Contains the list of inner transactions to be applied. There can be up to 8 transactions included. These transactions can come from one account or multiple accounts.

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="// Send Batch transaction" before="// Submit" /%} {% /tab %} {% /tabs %}

5. Submit Batch transaction

Now the sender can submit the Batch transaction:

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="// Submit" before="// Check Batch transaction" /%} {% /tab %} {% /tabs %}

Because autofill is set to true, the client library automatically fills in any missing fields, like the Fee and SigningPubKey, before submitting the batch.

6. Check Batch transaction result

To check the result of the Batch transaction submission:

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="// Check Batch transaction" before="// Verify balances after transaction" /%} {% /tab %} {% /tabs %}

The code checks for a tesSUCCESS result and displays the response details.

{% admonition type="warning" name="Warning" %} A tesSUCCESS result indicates that the Batch transaction was processed successfully, but does not guarantee the inner transactions succeeded.

For example, see the following transaction on the XRPL Explorer. {% /admonition %}

To verify that the inner transactions have been successful, check the account balances to confirm the expected changes.

{% tabs %} {% tab label="Javascript" %} {% code-snippet file="/_code-samples/batch/js/singleAccountBatch.js" language="js" from="// Verify balances after transaction" /%} {% /tab %} {% /tabs %}

Because the Batch transaction is configured with a tfAllOrNothing flag, if any inner transaction fails, all inner transactions wil fail, and only the Batch transaction fee is deducted from the sender.

See Also

{% raw-partial file="/docs/_snippets/common-links.md" /%}