Reading and Writing Memos

In this session, we'll demonstrate how to coordinate using the XRPL.

The XRPL is a public ledger, meaning that when you write on-chain, anyone can read it. In this session, we will demonstrate how to subscribe to events as they happen on-chain.

First, we will create a pair of accounts:

import xrpl from "xrpl";

const serverURL = "wss://s.altnet.rippletest.net:51233"; // For testnet

const main = async () => {
  const client = new xrpl.Client(serverURL)
  await client.connect()

  // do something useful
  console.log("lets fund 2 accounts...")
  const { wallet: wallet1, balance: balance1 } = await client.fundWallet()
  const { wallet: wallet2, balance: balance2 } = await client.fundWallet()

  console.log("wallet1", wallet1)
  console.log("wallet2", wallet2)

  console.log({
    balance1,
    address1: wallet1.address, //wallet1.seed
    balance2,
    address2: wallet2.address,
  })

  // end
  client.disconnect()
};

main()

Check the logs to find the seed for both accounts. We will use these later to reuse the accounts deterministically.

Here is how to generate a payment transaction between the two accounts.

import xrpl from "xrpl";

const serverURL = "wss://s.altnet.rippletest.net:51233"; // For testnet

const wallet1 = xrpl.Wallet.fromSeed("sEdVYquTyQbwn7URKzzdbJ6L4tx1n5u");
const wallet2 = xrpl.Wallet.fromSeed("sEdTxX3LJChazh9FDU51nVDd11n5nDQ");

// Call the function to read transactions

const main = async () => {
  const client = new xrpl.Client(serverURL);
  await client.connect();

  // do something useful
  console.log("funding wallet");
  console.log(
    wallet1.classicAddress,
    await client.getBalances(wallet1.classicAddress),
  );
  console.log(
    wallet2.classicAddress,
    await client.getBalances(wallet2.classicAddress),
  );

  const tx = {
    TransactionType: "Payment",
      Account: wallet1.classicAddress,
      Destination: wallet2.classicAddress,
      Amount: "1234",
  }

  const result = await client.submitAndWait(tx, {
    autofill: true,
    wallet: wallet1,
  });
  console.log(result)

  // end
  client.disconnect()
};

main()

One way to retrieve transactions for a given account is to create a request for transactions. Here is an example

// ... define wallet1 before this point
const request = {
  command: 'account_tx',
  account: wallet1.classicAddress,
  ledger_index_min: -1, // To get transactions from all ledgers
  ledger_index_max: -1, // To get transactions up to the most recent ledger
  limit: 10, // Limit the number of transactions (optional)
}
const response = await client.request(request)
console.log('Account Transactions:', response.result.transactions)

Finally, we will demonstrate how to listen for transactions affecting a given account to catch all transactions. You can use this to build a notification bot that alerts you when any activity occurs in your account.

import xrpl from 'xrpl';

const serverURL = 'wss://s.altnet.rippletest.net:51233'; // For testnet
const walletAddress = 'rfwGxAj4B1NkBihbuL83CiGjvsp9BVzrKX'

const main = async () => {
  const client = new xrpl.Client(serverURL)
  await client.connect()

  // do something useful
    const subscriptionRequest = {
      command: 'subscribe',
      accounts: [walletAddress]
    };

    await client.request(subscriptionRequest)
    console.log(`Subscribed to transactions for account: ${walletAddress}`)

    // Event listener for incoming transactions
    client.on('transaction', (transaction) => {
      console.log('Transaction:', transaction);
    })

    // Event listener for errors
    client.on('error', (error) => {
      console.error('Error:', error);
    })

  // end
  // keep open
  console.log('all done')
}

main()
setInterval(() => {
  console.log('One second has passed!');
}, 1000)

Last updated