LogoLogo
  • Welcome
  • XRPL Basics
    • Getting Started
    • Payments
    • Reading and subscribing to Transactions
    • Writing and reading memos
    • Non Fungible Tokens
    • PathFinding
    • Escrow
    • Price Oracles
    • Tickets
    • Multi-Signature
  • Token Issuance and Liquidity
    • Creating Accounts
    • Issuing Tokens
    • Creating an AMM Pool
  • Cyphered Chat on XRPL
    • Set up
    • Set up Keys
    • Cypher the message
    • Set up the memo & send the tx
    • Get the message and decypher it
  • EVM Sidechain
    • Connecting Metamask
    • Bridging Assets
    • Remix
    • Banking App
    • Banking Contract Key Concepts
  • Tools
    • Xaman Setup
    • Metamask Setup
Powered by GitBook
On this page
  • Writing a memo
  • Decoding memos
  • Putting it all together
Export as PDF
  1. XRPL Basics

Writing and reading memos

Memos are available in every transaction and can be quite useful to label your transactions or pass metadata useful to your business logic.

Writing a memo

This is how you would include a json object in the memo field of a transaction.

// Create the JSON object you want to include in the memo
  const memoData = {
      invoice_id: '12345',
      description: 'Coffee and Milk',
      date: '2024-07-02'
  };

  // Convert JSON object to a string and then to hex
  const memoJson = JSON.stringify(memoData);
  const memoHex = Buffer.from(memoJson, 'utf8').toString('hex');

  // Create the Memo field
  const memo = {
      Memo: {
          MemoData: memoHex
      }
  };

  const tx = {
    TransactionType: "Payment",
    Account: wallet1.classicAddress,
    Destination: wallet2.classicAddress,
    Amount: "1234",
    Memos: [memo]
  };

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

Decoding memos

To decode memos from a transaction, we retrieve the memo components and decode the hexadecimal data to a string, and then parse them.

Create this file in your project and import it as needed, when you are processing the transaction data.

parseMemo.ts
export const parseMemo = (memos) => {
  let report = {};
  if (memos && memos.length > 0) {
    for (const memo of memos) {
      if (memo.Memo.MemoData) {
        // Decode the hexadecimal memo data to a string
        const memoDataHex = memo.Memo.MemoData;
        const memoDataJson = Buffer.from(memoDataHex, "hex").toString("utf8");

        // Parse the JSON string into a JavaScript object
        const memoDataObject = JSON.parse(memoDataJson);

        // console.log('Decoded memo data:', memoDataObject)
        report = { ...report, ...memoDataObject };
      } else {
        console.log("No MemoData found.");
      }
    }
    return report;
  } else {
    console.log("No memos found in the transaction.");
  }
};

export default parseMemo

Putting it all together

Here is an example of a fully fledged transaction listener that can parse the memos from the transaction we created above.

replace the wallet address with the destination of the original transaction

index.ts
import xrpl from "xrpl";
import { parseMemo } from "./parseMemo";

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

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);
    const parsedMemos = parseMemo(transaction.transaction.Memos);
    console.log("Parsed memo:", parsedMemos);
  });

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

  // end
  // keep open
  console.log("listening...");
};

main()
PreviousReading and subscribing to TransactionsNextNon Fungible Tokens

Last updated 4 months ago