Getting Started With RippleX Dev Kit

This tutorial helps you start building with RippleX Dev Kit, which provides the tools you need to develop apps on RippleX Platform. With these tools, you can send and receive value within your apps. RippleX Dev Kit supports:

  • PayID - The universal identifier for payments.
  • Interledger - An open protocol suite for sending payments across different ledgers.
  • XRP Ledger - Home of XRP, a digital asset designed to bridge currencies worldwide.

For more information about the design and architecture of RippleX Dev Kit, see RippleX Dev Kit.

RippleX Dev Kit is currently available in the following languages:

For demo projects and additional sample code for each language, see the RippleX Dev Kit Demo .

Install the RippleX Dev Kit library

Follow the instructions for your preferred language and package manager.

Library Language Package Manager
RippleX-JS JavaScript npm
RippleX4j Java
  • Maven - Add following lines to the dependencies object of your pom.xml file.
  • Gradle - Add following line to the dependencies section of your build.gradle file.
RippleXKit Swift
$ npm i xpring-js
<dependency>
  <groupId>io.xpring</groupId>
  <artifactId>xpring4j</artifactId>
  <version>LATEST</version>
</dependency>
io.xpring:xpring4j:latest.release
github "xpring-eng/XpringKit"
pod 'XpringKit'

Get credentials for the XRP Ledger Testnet

You need credentials for the XRP Ledger Testnet to use it with your app. For more information about the Tesnet and Mainnet, see XRP Ledger Parallel Networks .

To generate your Testnet credentials:

  1. Go to RippleX Launchpad .
  2. Log in with your GitHub credentials.
  3. Select the XRP Testnet Wallet card. RippleX Launchpad
  4. Generate a new wallet. Or if you have an existing wallet, enter your seed to access an existing wallet.
  5. Save the generated credentials. You'll use them to generate a wallet in your app.
  6. Fund your account by clicking Next Step then Make it Rain. RippleX Launchpad funds your account with 1000 XRP on the Testnet. You can use these funds to experiment with sending and receiving value on Testnet.

You can also generate a Testnet account with the XRP Testnet Faucet . On this page, you can generate multiple sets of credentials, and use them to test sending and receiving value between different addresses on the Testnet.

You are now ready to build a simple app.

Build a Simple App

You can use RippleX-JS to build a simple JavaScript app that:

  1. Generates a wallet
  2. Connects to the XRP Ledger
  3. Checks your balances
  4. Sends XRP
  5. Checks payment status
  6. Gets the payment history of the wallet

The following sections provide JavaScript code snippets that demonstrate these RippleX Dev Kit capabilities. The Swift and Java libraries contain similar APIs. See the RippleX Dev Kit Demo for complete demo apps and more sample code in each language.

Generate wallet

Build a wallet using the seed (Secret) from the Testnet credentials that you previously obtained.

const { Wallet } = require('xpring-js')

const wallet = Wallet.generateWalletFromSeed(
  "snYP7oArxKepd3GPDcrjMsJYiJeJB" // Enter your seed here.
);
import Foundation
import XpringKit

let seed = "snYP7oArxKepd3GPDcrjMsJYiJeJB";
guard let wallet = Wallet(seed: seed) else {
  print("The given seed is not valid: \(seed)")
  exit(0)
}
package io.xpring.demo;

import io.xpring.common.XrplNetwork;
import io.xpring.xrpl.*;
import io.xpring.xrpl.model.XrpTransaction;

import java.math.BigInteger;
import java.util.List;

public class XrpDemo {
    public static void main(String[] args) throws XrpException {
        // A wallet that exists on Testnet.
        String seed = "snYP7oArxKepd3GPDcrjMsJYiJeJB";
        Wallet wallet = new Wallet(seed);
      }
  }
}

Tip: RippleX Dev Kit also supports Hierarchical Deterministic (HD) Wallets .

Connect to XRP Ledger

To check balances and send test (or real) XRP, your app must connect to the XRP Ledger using gRPC . RippleX-JS provides XrpClient as a simple entry point to the XRP Ledger. Initiate this class by passing in the address of the gRPC port on a rippled server and an enum that specifies the network on which the remote adaptor is running:

const { Wallet, XrpClient, XrplNetwork } = require('xpring-js')

const grpcUrl = "test.xrp.xpring.io:50051";
const xrpClient = new XrpClient(grpcUrl, XrplNetwork.Test);
import Foundation
import XpringKit

// A URL to reach the remote rippled node at.
// Some options:
//     dev.xrp.xpring.io:50051
//     test.xrp.xpring.io:50051
//     main.xrp.xpring.io:50051
let grpcAddress = "test.xrp.xpring.io:50051"

print("\nUsing rippled node located at: \(grpcAddress)\n")
let xrpClient = XRPClient(grpcURL: grpcAddress, network: .test)
package io.xpring.demo;

import io.xpring.common.XrplNetwork;
import io.xpring.xrpl.*;
import io.xpring.xrpl.model.XrpTransaction;

import java.math.BigInteger;
import java.util.List;

public class XrpDemo {
    public static void main(String[] args) throws XrpException {
      // A URL to reach the remote rippled node at.
      // Some options:
      //     dev.xrp.xpring.io:50051
      //     test.xrp.xpring.io:50051
      //     main.xrp.xpring.io:50051
      String grpcAddress = "test.xrp.xpring.io:50051";

      // Instantiate an XrpClient connected to the XRP Ledger Testnet
      System.out.println("\nUsing rippled node located at: " + grpcAddress + "\n");
      XrpClient xrpClient = new XrpClient(grpcAddress, XrplNetwork.TEST);

      }
  }
}

RippleX hosts a gRPC-enabled Testnet server (test.xrp.xpring.io:50051) and the following servers:

  • Devnet: dev.xrp.xpring.io:50051
  • Mainnet: main.xrp.xpring.io:50051

Caution: These environments are provided only for development purposes, without warranty. Do not use them for production purposes.

For production purposes, RippleX recommends setting up your own rippled server (rippled is the C++ reference implementation of XRP Ledger). For more information, see:

  1. Install rippled
  2. Configure gRPC

Check balances

Before sending any XRP, you should check your balance:

const balance = await xrpClient.getBalance(wallet.getAddress());
print("Retrieving balance for \(wallet.address) ..")
let balance = try xrpClient.getBalance(for: wallet.address)

print("Balance was \(balance) drops!\n")
  System.out.println("Retrieving balance for" +  wallet.getAddress() + "..");
  BigInteger balance = xrpClient.getBalance(wallet.getAddress());

  System.out.println("Balance was " + balance + " drops!\n");

Send XRP

To send test XRP, use the wallet you created (wallet) and define:

  • The recipient (recipientAddress). RippleX Dev Kit only supports the X-address format for XRP Ledger accounts .

    You can use the Utils object to encode classic addresses to X-addresses:

    const { Utils } = require('xpring-js')
    
    const rippleClassicAddress = 'rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe'
    const tag = 12345
    
    // Encode an X-Address.
    const xAddress = Utils.encodeXAddress(rippleClassicAddress, tag) // XV5kHfQmzDQjbFNv4jX3FX9Y7ig5QhpKGEFCq4mdLfhdxMq
    
  • The amount to send, in drops (dropsToSend).

const recipientAddress =
  "XV5kHfQmzDQjbFNv4jX3FX9Y7ig5QhpKGEFCq4mdLfhdxMq";
const dropsToSend = "10";
const hash = await xrpClient.send(
    dropsToSend,
    recipientAddress,
    wallet
  )
// A recipient address.
let recipientAddress = "X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4"
let dropsToSend: UInt64 = 10

print("Sending:")
print("- Drops \(dropsToSend)")
print("- To: \(recipientAddress)")
print("- From: \(wallet.address)\n")
let hash = try xrpClient.send(dropsToSend, to: recipientAddress, from: wallet)
// A recipient address.
String recipientAddress = "X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4";
BigInteger dropsToSend = BigInteger.valueOf(10);

// Send XRP
System.out.println("Sending:");
System.out.println("- Drops " + dropsToSend );
System.out.println("- To: " + recipientAddress);
System.out.println("- From: " + wallet.getAddress() + "\n");
String hash = xrpClient.send(dropsToSend, recipientAddress, wallet);

Caution: This code executes the transaction naively: it does not handle any error cases or follow the guidelines of reliable transaction submission for the XRP Ledger. The transaction will succeed (or fail) eventually, as long as the program stays alive. But the program does not save state of the transaction if it does not stay alive. For production systems, you should implement reliable transaction submission.

For more information on this topic, see:

Check payment status

After you send XRP, check the status of the payment:

const status = await xrpClient.getPaymentStatus(hash);
let status = try xrpClient.paymentStatus(for: hash)
print("Result for transaction is:\n\(status)\n");
System.out.println("Hash for transaction:\n" + hash + "\n");

TransactionStatus status = xrpClient.getPaymentStatus(hash);
System.out.println("Result for transaction is:\n" + status + "\n");

Get full payment history

After the payment has been finalized, you can get the full history of the address.

const paymentHistory = await xrpClient.paymentHistory(wallet.getAddress());
const shortPaymentHistory = paymentHistory.slice(0, Math.min(paymentHistory.length, 5))
for (const transaction of shortPaymentHistory) {
  console.log(transaction);
}
print("Payment history for account " + wallet.address + ":\n")
let paymentHistory = try xrpClient.paymentHistory(for: wallet.address)
let shortPaymentHistory = paymentHistory.prefix(5) // limit long output
for payment in shortPaymentHistory {
  print(payment)
}
System.out.println("Payment history for account " + wallet.getAddress() +":\n");
List<XrpTransaction> paymentHistory = xrpClient.paymentHistory(wallet.getAddress());
List<XrpTransaction> shortPaymentHistory = paymentHistory
                                                .subList(0, Integer.min(paymentHistory.size(), 5));
for (XrpTransaction transaction : shortPaymentHistory) {
    System.out.println(transaction);

Putting it all together

Here's what this simple app would look like after a little refactoring:

const { TransactionStatus, Wallet, XrpClient } = require("xpring-js")

// The expected address of the gRPC server.
// Some options:
//     dev.xrp.xpring.io:50051
//     test.xrp.xpring.io:50051
//     main.xrp.xpring.io:50051
const grpcURL = "test.xrp.xpring.io:50051";
const wallet = Wallet.generateWalletFromSeed(
  "snYP7oArxKepd3GPDcrjMsJYiJeJB"
);
const recipientAddress =
  "X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4";
const dropsToSend = "10";

async function main() {
  // Instantiate an XrpClient connected to the XRP Ledger Testnet
  console.log("\nUsing rippled node located at: " + grpcURL + "\n");
  const xrpClient = new XrpClient(grpcURL);

  // Get account balance
  console.log("Retrieving balance for " + wallet.getAddress() + "..");
  const balance = await xrpClient.getBalance(wallet.getAddress());
  console.log("Balance was " + balance + " drops!\n");

  // Send XRP
  console.log("Sending:");
  console.log("- Drops "+ dropsToSend)
  console.log("- To: " + recipientAddress);
  console.log("- From: " + wallet.getAddress() + "\n");
  const hash = await xrpClient.send(
    dropsToSend,
    recipientAddress,
    wallet
  )

  // Check status of the payment
  console.log("Hash for transaction:\n" + hash + "\n");
  const status = await xrpClient.getPaymentStatus(hash);
  console.log("Result for transaction is:\n" + statusCodeToString(status) + "\n");

  // Retrieve full payment history for account
  console.log("Payment history for account " + wallet.getAddress() + ": ");
  const paymentHistory = await xrpClient.paymentHistory(wallet.getAddress());
  const shortPaymentHistory = paymentHistory.slice(0, Math.min(paymentHistory.length, 5))
  for (const transaction of shortPaymentHistory) {
    console.log(transaction);
  }
}

function statusCodeToString(status) {
  switch (status) {
    case TransactionStatus.Succeeded:
      return "SUCCEEDED"
    case TransactionStatus.Failed:
      return "FAILED"
    case TransactionStatus.Pending:
      return "PENDING"
    case TransactionStatus.Unknown:
    default:
      return "UNKNOWN"
  }
}

// Exit with an error code if there is an error.
process.on('unhandledRejection', error => {
  console.log(`Fatal: ${error}`)
  process.exit(1)
});

main()
import Foundation
import XpringKit

// A URL to reach the remote rippled node at.
// Some options:
//     dev.xrp.xpring.io:50051
//     test.xrp.xpring.io:50051
//     main.xrp.xpring.io:50051
let grpcAddress = "test.xrp.xpring.io:50051"

// A wallet that exists on Testnet.
let seed = "snYP7oArxKepd3GPDcrjMsJYiJeJB";
guard let wallet = Wallet(seed: seed) else {
  print("The given seed is not valid: \(seed)")
  exit(0)
}

// A recipient address.
let recipientAddress = "X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4"
let dropsToSend: UInt64 = 10

// Instantiate an XRPClient connected to the XRP Ledger Testnet
print("\nUsing rippled node located at: \(grpcAddress)\n")
let xrpClient = XRPClient(grpcURL: grpcAddress, network: .test)

// Get account balance
print("Retrieving balance for \(wallet.address) ..")
let balance = try xrpClient.getBalance(for: wallet.address)

print("Balance was \(balance) drops!\n")

// Send XRP
print("Sending:")
print("- Drops \(dropsToSend)")
print("- To: \(recipientAddress)")
print("- From: \(wallet.address)\n")
let hash = try xrpClient.send(dropsToSend, to: recipientAddress, from: wallet)

print("Hash for transaction:\n\(hash)\n")

// Check status of the payment
let status = try xrpClient.paymentStatus(for: hash)
print("Result for transaction is:\n\(status)\n");

// Retrieve full payment history for account
print("Payment history for account " + wallet.address + ":\n")
let paymentHistory = try xrpClient.paymentHistory(for: wallet.address)
let shortPaymentHistory = paymentHistory.prefix(5) // limit long output
for payment in shortPaymentHistory {
  print(payment)
}
package io.xpring.demo;

import io.xpring.common.XrplNetwork;
import io.xpring.xrpl.*;
import io.xpring.xrpl.model.XrpTransaction;

import java.math.BigInteger;
import java.util.List;

public class XrpDemo {
    public static void main(String[] args) throws XrpException {
        // A URL to reach the remote rippled node at.
        // Some options:
        //     dev.xrp.xpring.io:50051
        //     test.xrp.xpring.io:50051
        //     main.xrp.xpring.io:50051
        String grpcAddress = "test.xrp.xpring.io:50051";

        // A wallet that exists on Testnet.
        String seed = "snYP7oArxKepd3GPDcrjMsJYiJeJB";
        Wallet wallet = new Wallet(seed);

        // A recipient address.
        String recipientAddress = "X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4";
        BigInteger dropsToSend = BigInteger.valueOf(10);

        // Instantiate an XrpClient connected to the XRP Ledger Testnet
        System.out.println("\nUsing rippled node located at: " + grpcAddress + "\n");
        XrpClient xrpClient = new XrpClient(grpcAddress, XrplNetwork.TEST);

        // Get account balance
        System.out.println("Retrieving balance for" +  wallet.getAddress() + "..");
        BigInteger balance = xrpClient.getBalance(wallet.getAddress());

        System.out.println("Balance was " + balance + " drops!\n");

        // Send XRP
        System.out.println("Sending:");
        System.out.println("- Drops " + dropsToSend );
        System.out.println("- To: " + recipientAddress);
        System.out.println("- From: " + wallet.getAddress() + "\n");
        String hash = xrpClient.send(dropsToSend, recipientAddress, wallet);

        // Check status of the payment
        System.out.println("Hash for transaction:\n" + hash + "\n");

        TransactionStatus status = xrpClient.getPaymentStatus( hash);
        System.out.println("Result for transaction is:\n" + status + "\n");

        // Retrieve full payment history for account
        System.out.println("Payment history for account " + wallet.getAddress() +":\n");
        List<XrpTransaction> paymentHistory = xrpClient.paymentHistory(wallet.getAddress());
        List<XrpTransaction> shortPaymentHistory = paymentHistory
                                                        .subList(0, Integer.min(paymentHistory.size(), 5));
        for (XrpTransaction transaction : shortPaymentHistory) {
            System.out.println(transaction);
        }
    }
}

After running the program, you should see results similar to the following example:

Using rippled node located at: test.xrp.xpring.io:50051

Retrieving balance for XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8..
Balance was 887587593 drops!

Sending:
- Drops 10
- To: X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4
- From: XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8

Hash for transaction:
3D531C8E1D01E84CFD84DA906ECDCCAD734EE248C802E5AC3D74116714598817

Result for transaction is:
SUCCEEDED

Payment history for account XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8:
XrpTransaction {
  hash: '3D531C8E1D01E84CFD84DA906ECDCCAD734EE248C802E5AC3D74116714598817',
  accountTransactionID: undefined,
  fee: '10',
  flags: undefined,
  lastLedgerSequence: 8466356,
  memos: undefined,
  sequence: 24645,
  signers: undefined,
  signingPublicKey: Uint8Array(33) [
      2, 253,  14, 132, 121, 206, 129, 130,
    171, 211,  81,  87, 187,  15, 161, 122,
     70, 154, 242, 125, 203,  18, 181, 221,
    237, 105, 124,  97, 128, 145,  22, 163,
     59
  ],
  sourceXAddress: 'XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8',
  transactionSignature: Uint8Array(70) [
     48,  68,   2,  32, 101,  69,  43, 214, 160, 210, 181, 169,
     65,   4, 219,  93, 194, 239, 219,  94, 210,  96, 189,  93,
    183, 121,  91,  34, 193,   2,  88,  49, 241, 140,  48, 121,
      2,  32,  37, 220,   9, 241, 180,  62,  29, 131, 181, 152,
    142,  78,  61, 222, 123, 234, 161, 206, 209,  39, 247, 218,
     73, 121,  15, 226,  45,  65, 112,  30,   8,  69
  ],
  type: 0,
  paymentFields: XrpPayment {
    amount: XrpCurrencyAmount { drops: '10', issuedCurrency: undefined },
    destinationXAddress: 'X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4',
    deliverMin: undefined,
    invoiceID: undefined,
    paths: undefined,
    sendMax: undefined
  },
  timestamp: 1593583342,
  deliveredAmount: undefined,
  validated: true,
  ledgerIndex: 8466347
}
XrpTransaction {
  hash: '84E3C7EAF4482DB4D82D38B533CB77F83E80B1B55161FBD869DF02844C933C60',
  accountTransactionID: undefined,
  fee: '10',
  flags: undefined,
  lastLedgerSequence: 8466349,
  memos: undefined,
  sequence: 24644,
  signers: undefined,
  signingPublicKey: Uint8Array(33) [
      2, 253,  14, 132, 121, 206, 129, 130,
    171, 211,  81,  87, 187,  15, 161, 122,
     70, 154, 242, 125, 203,  18, 181, 221,
    237, 105, 124,  97, 128, 145,  22, 163,
     59
  ],
  sourceXAddress: 'XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8',
  transactionSignature: Uint8Array(71) [
     48,  69,   2,  33,   0, 230,  78, 177,  12,  86, 197, 179,
    220, 159,  95, 161, 238, 121,  20, 137,  24,  30, 129, 240,
    177, 153, 139, 167, 119, 244, 105, 226, 136, 209,  35, 181,
     22,   2,  32,  79, 157,  16, 169, 225,   3, 190, 241, 229,
     18, 249,  29, 212, 151, 101,  88, 216, 152, 160,   8, 250,
     17, 139, 222,  29, 215, 181, 130, 238,  63, 156, 112
  ],
  type: 0,
  paymentFields: XrpPayment {
    amount: XrpCurrencyAmount { drops: '10', issuedCurrency: undefined },
    destinationXAddress: 'X7cBcY4bdTTzk3LHmrKAK6GyrirkXfLHGFxzke5zTmYMfw4',
    deliverMin: undefined,
    invoiceID: undefined,
    paths: undefined,
    sendMax: undefined
  },
  timestamp: 1593583321,
  deliveredAmount: undefined,
  validated: true,
  ledgerIndex: 8466340
}
XrpTransaction {
  hash: 'A3C35344819F7686FC72E968762DD78B7D4E4F62E18E36E0F0BF5CFF9E975957',
  accountTransactionID: undefined,
  fee: '10',
  flags: undefined,
  lastLedgerSequence: 8466322,
  memos: undefined,
  sequence: 24643,
  signers: undefined,
  signingPublicKey: Uint8Array(33) [
      2, 253,  14, 132, 121, 206, 129, 130,
    171, 211,  81,  87, 187,  15, 161, 122,
     70, 154, 242, 125, 203,  18, 181, 221,
    237, 105, 124,  97, 128, 145,  22, 163,
     59
  ],
  sourceXAddress: 'XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8',
  transactionSignature: Uint8Array(70) [
     48,  68,   2,  32,  53, 122, 143, 173,  75,  78,  95, 102,
    130, 118,   0,  84,  44,  48,  29,  19,  95,   0, 225,  79,
    240, 220, 126, 194,   5,  99, 253,  83, 163,  52,  74, 139,
      2,  32,  72,  62, 220, 184,  13, 130, 173, 236, 229,  28,
    101,  49, 174, 130, 117,  53,  82, 217, 208, 145, 101, 167,
    153,  21, 194, 104,  42,  97,  46, 221,  73,  85
  ],
  type: 0,
  paymentFields: XrpPayment {
    amount: XrpCurrencyAmount { drops: '57', issuedCurrency: undefined },
    destinationXAddress: 'XVBaSqtX9tRVDVPB4eoc2F6nm664PSbQ7UVY8BV61WrtHeL',
    deliverMin: undefined,
    invoiceID: undefined,
    paths: undefined,
    sendMax: undefined
  },
  timestamp: 1593583231,
  deliveredAmount: undefined,
  validated: true,
  ledgerIndex: 8466312
}
XrpTransaction {
  hash: 'F0591BCCE84614EBB91F6EAABD0CB83BF50AA99D7A6AE1A36F36DFE15DDB9246',
  accountTransactionID: undefined,
  fee: '10',
  flags: undefined,
  lastLedgerSequence: 8466312,
  memos: undefined,
  sequence: 24642,
  signers: undefined,
  signingPublicKey: Uint8Array(33) [
      2, 253,  14, 132, 121, 206, 129, 130,
    171, 211,  81,  87, 187,  15, 161, 122,
     70, 154, 242, 125, 203,  18, 181, 221,
    237, 105, 124,  97, 128, 145,  22, 163,
     59
  ],
  sourceXAddress: 'XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8',
  transactionSignature: Uint8Array(71) [
     48,  69,   2,  33,   0, 153, 147,  40, 224,  71,  75, 160,
      6,  69, 101, 160, 216, 249,  96,  28,  99,  56,  96,  94,
    214, 234,   9,  78, 133,  41,  39, 154, 203, 114, 119,  39,
    106,   2,  32, 100,  31,  71,   0, 215,  28,  78, 238,  39,
    188, 186, 179,  47,  81,  37,  85,  44,  63,  85, 136, 221,
    183, 114, 183, 209, 236, 109,  24,  45,  57, 149,  57
  ],
  type: 0,
  paymentFields: XrpPayment {
    amount: XrpCurrencyAmount { drops: '57', issuedCurrency: undefined },
    destinationXAddress: 'XVBaSqtX9tRVDVPB4eoc2F6nm664PSbQ7UVY8BV61WrtHeL',
    deliverMin: undefined,
    invoiceID: undefined,
    paths: undefined,
    sendMax: undefined
  },
  timestamp: 1593583201,
  deliveredAmount: undefined,
  validated: true,
  ledgerIndex: 8466303
}
XrpTransaction {
  hash: '48120D929AAED2BF6A54ACAC2467B012BB2436FA9BFAA8832393C07C03682D31',
  accountTransactionID: undefined,
  fee: '10',
  flags: undefined,
  lastLedgerSequence: 8466295,
  memos: undefined,
  sequence: 24641,
  signers: undefined,
  signingPublicKey: Uint8Array(33) [
      2, 253,  14, 132, 121, 206, 129, 130,
    171, 211,  81,  87, 187,  15, 161, 122,
     70, 154, 242, 125, 203,  18, 181, 221,
    237, 105, 124,  97, 128, 145,  22, 163,
     59
  ],
  sourceXAddress: 'XVnJMYQFqA8EAijpKh5EdjEY5JqyxykMKKSbrUX8uchF6U8',
  transactionSignature: Uint8Array(71) [
     48,  69,   2,  33,   0, 180,  39, 220,  97,  14, 211,  60,
    244,  31,  38, 197,  74, 230, 166,  21,  57,  83,  77,  34,
    244, 238, 218,  16, 118, 223, 109,  92, 164, 123, 215,  44,
     36,   2,  32, 106, 163,  57, 236, 212, 190,  80,  83, 246,
    253,   8, 223, 218,  30, 218,  83, 125, 130,  42, 108, 205,
    173, 150, 102, 175, 108,  39,  34, 112, 117,  91, 101
  ],
  type: 0,
  paymentFields: XrpPayment {
    amount: XrpCurrencyAmount { drops: '52', issuedCurrency: undefined },
    destinationXAddress: 'XVBaSqtX9tRVDVPB4eoc2F6nm664PSbQ7UVY8BV61WrtHeL',
    deliverMin: undefined,
    invoiceID: undefined,
    paths: undefined,
    sendMax: undefined
  },
  timestamp: 1593583142,
  deliveredAmount: undefined,
  validated: true,
  ledgerIndex: 8466286
}

[Done] exited with code=0 in 5.904 seconds

Keep Building

For more examples and an extended demo app, see the RippleX Dev Kit Demo repo .

Protocol Support

In addition to XRP Ledger, RippleX Dev Kit supports other protocols, including Interledger Protocol (ILP) and PayID. The RippleX Dev Kit Demo repo has demo apps for each of these prootocols.

RippleX-JS:

RippleX4j:

RippleXKit:

XpringClient

The XpringClient class provides a unified interface for XRP and PayID.

Utils

The Utils object provides additional useful features:

  • X-Address Encoding and Decoding
  • Address Validation
  • Testing addresses for classic or X-Address format