Skip to content

Implementing Transaction Batching

This guide demonstrates how to efficiently batch multiple payments into single transactions using the BSV TypeScript SDK, optimizing for fees, network efficiency, and throughput.

Overview

Transaction batching combines multiple payments into a single transaction, reducing fees and network load. This guide covers various batching strategies from simple multi-output transactions to advanced batch processing systems.

Basic Multi-Output Batching

Simple Batch Payment

The most straightforward batching approach combines multiple payments into one transaction:

import { WalletClient } from '@bsv/sdk'

async function createBatchPayment() {
  const wallet = new WalletClient('auto', 'localhost')

  // Define multiple recipients with proper P2PKH locking scripts
  const recipients = [
    { lockingScript: '76a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688ac', amount: 100, description: 'Payment 1' },
    { lockingScript: '76a91477bde5cfd66c6d1c83b0008b8a6e3579a6e5c6b988ac', amount: 150, description: 'Payment 2' },
    { lockingScript: '76a914c42e7ef92fdb603af844d064faad95db9f7f1e9588ac', amount: 200, description: 'Payment 3' }
  ]

  // Create batch transaction
  const actionResult = await wallet.createAction({
    description: 'Batch payment to multiple recipients',
    outputs: recipients.map(recipient => ({
      satoshis: recipient.amount,
      lockingScript: recipient.lockingScript,
      outputDescription: recipient.description
    })),
  })

  console.log('Batch transaction created:', actionResult.txid)
  return actionResult
}

Batch with Data Outputs

Combine payments with data storage in a single transaction:

async function createBatchWithData() {
  const wallet = new WalletClient('auto', 'localhost')

  const outputs = [
    // Payment outputs
    {
      satoshis: 100,
      lockingScript: '76a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688ac',
      outputDescription: 'Payment 1'
    },
    {
      satoshis: 150,
      lockingScript: '76a91477bde5cfd66c6d1c83b0008b8a6e3579a6e5c6b988ac',
      outputDescription: 'Payment 2'
    },
    // Data outputs (OP_RETURN outputs use 1 satoshi)
    {
      satoshis: 1,
      lockingScript: '006a0c48656c6c6f20576f726c64', // OP_RETURN "Hello World"
      outputDescription: 'Batch metadata'
    },
    {
      satoshis: 1,
      lockingScript: '006a0a42617463682044617461', // OP_RETURN "Batch Data"
      outputDescription: 'Batch identifier'
    }
  ]

  const actionResult = await wallet.createAction({
    description: 'Batch payment with metadata',
    outputs,
  })

  return actionResult
}

UTXO Consolidation Batching

Combine payments with UTXO consolidation for better wallet health:

async function createConsolidationBatch() {
  const wallet = new WalletClient('auto', 'localhost')

  // Note: This example demonstrates the concept but uses simulated data
  // In practice, you would get UTXOs from wallet.listOutputs() with appropriate basket
  console.log('Creating consolidation batch with simulated UTXO data')

  // Create batch with payments only (consolidation would require actual UTXOs)
  const outputs = [
    // Regular payments
    {
      satoshis: 100,
      lockingScript: '76a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688ac',
      outputDescription: 'Batch payment 1'
    },
    {
      satoshis: 150,
      lockingScript: '76a91477bde5cfd66c6d1c83b0008b8a6e3579a6e5c6b988ac',
      outputDescription: 'Batch payment 2'
    },
    // Change output (simulating consolidation)
    {
      satoshis: 500,
      lockingScript: '76a914c42e7ef92fdb603af844d064faad95db9f7f1e9588ac',
      outputDescription: 'Change output'
    }
  ]

  // Let wallet automatically select inputs (no manual input specification)
  const actionResult = await wallet.createAction({
    description: 'Batch payment with change output',
    outputs,
  })

  return actionResult
}

Conclusion

Transaction batching is a powerful technique for optimizing Bitcoin applications.

Understanding of WalletClient usage is essential for implementing these strategies effectively. While the WalletClient provides convenient single-transaction creation, batching multiple operations into fewer transactions can significantly improve efficiency and reduce costs. Integration with WalletClient is straightforward, and the benefits of batching can be substantial.