Skip to main content

XRPL Module

The xrpl module provides XRPL blockchain integration for onramp/offramp operations, trustlines management, and issued currency support.

Import

const xrpl = await brdzSDK.xrpl;

Methods Overview

MethodDescriptionAuth RequiredHTTP EndpointImplementation
getIssuerByCurrencyGet issuer data by currencyGET /xrpl/issuer/:currency⚠️ SDK Only
getAllIssuersGet all active issuersGET /xrpl/issuer⚠️ SDK Only
createIssuerAdd new issuerPOST /xrpl/issuer⚠️ SDK Only
getTrustlinesGet user trustlinesGET /xrpl/trustlines/:userId⚠️ SDK Only
createTrustlineCreate trustlinePOST /xrpl/trustlines⚠️ SDK Only
initOnrampInitialize XRPL onrampPOST /xrpl/onramp/init✅ Full Support
getOnrampStatusCheck onramp statusGET /xrpl/onramp/status/:txid✅ Full Support

getIssuerByCurrency

Get issuer information for a specific currency on XRPL.

Syntax

const result = await xrpl.getIssuerByCurrency(currency);

Parameters

ParameterTypeRequiredDescription
currencystringCurrency code (e.g., "USDC")

Returns

Promise<{
// Response structure based on xrplIssuerModel.getIssuerByCurrency
id?: number;
issuer_address: string;
currency_code: string;
created_at?: string;
updated_at?: string;
}>

Example

try {
const issuer = await xrpl.getIssuerByCurrency('USDC');
console.log('Issuer Address:', issuer.issuer_address);
console.log('Currency:', issuer.currency_code);
} catch (error) {
console.error('Failed to get issuer:', error.message);
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/xrpl/issuer/:currency
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

⚠️ Note: Backend implementation not available. SDK method calls endpoint but may receive 404.


getAllIssuers

Get list of all active currency issuers on XRPL.

Syntax

const result = await xrpl.getAllIssuers();

Parameters

None.

Returns

Promise<Array<{
id: number;
issuer_address: string;
currency_code: string;
created_at: string;
updated_at: string;
}>>

Example

try {
const issuers = await xrpl.getAllIssuers();
console.log('Total Issuers:', issuers.length);

issuers.forEach(issuer => {
console.log(`${issuer.currency_code}: ${issuer.issuer_address}`);
});
} catch (error) {
console.error('Failed to get issuers:', error.message);
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/xrpl/issuer
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

⚠️ Note: Backend implementation not available. SDK method calls endpoint but may receive 404.


createIssuer

Register a new currency issuer on XRPL.

Syntax

const result = await xrpl.createIssuer(data);

Parameters

ParameterTypeRequiredDescription
dataobjectIssuer creation data
data.currency_codestringCurrency code (e.g., "USDC")
data.issuer_addressstringXRPL issuer address

Returns

Promise<{
id: number;
issuer_address: string;
currency_code: string;
created_at: string;
updated_at: string;
}>

Example

try {
const newIssuer = await xrpl.createIssuer({
currency_code: 'USDC',
issuer_address: 'r9wxh8hwJcaQnC4ypWqZqpoYY4MS9Shmos'
});

console.log('Issuer created:', newIssuer.id);
console.log('Address:', newIssuer.issuer_address);
} catch (error) {
console.error('Failed to create issuer:', error.message);
}

HTTP Endpoint

  • Method: POST
  • URL: https://api.brdz.link/api/xrpl/issuer
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

⚠️ Note: Backend implementation not available. SDK method calls endpoint but may receive 404.


getTrustlines

Get all trustlines for a specific user.

Syntax

const result = await xrpl.getTrustlines(userId);

Parameters

ParameterTypeRequiredDescription
userIdstringUser ID to get trustlines for

Returns

Promise<Array<{
id: number;
user_id: number;
xrpl_address: string;
currency_code: string;
issuer_id: number;
trustline_status: string;
created_at: string;
updated_at: string;
}>>

Example

try {
const trustlines = await xrpl.getTrustlines('123');
console.log('User Trustlines:', trustlines.length);

trustlines.forEach(tl => {
console.log(`${tl.currency_code}: ${tl.trustline_status}`);
});
} catch (error) {
console.error('Failed to get trustlines:', error.message);
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/xrpl/trustlines/:userId
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

⚠️ Note: Backend implementation not available. SDK method calls endpoint but may receive 404.


createTrustline

Create a new trustline between user and currency issuer.

Syntax

const result = await xrpl.createTrustline(data);

Parameters

ParameterTypeRequiredDescription
dataobjectTrustline creation data
data.user_idstringUser ID
data.currencystringCurrency code
data.issuer_addressstringXRPL issuer address

Returns

Promise<{
id: number;
user_id: number;
xrpl_address: string;
currency_code: string;
issuer_id: number;
trustline_status: string;
created_at: string;
updated_at: string;
}>

Example

try {
const trustline = await xrpl.createTrustline({
user_id: '123',
currency: 'USDC',
issuer_address: 'r9wxh8hwJcaQnC4ypWqZqpoYY4MS9Shmos'
});

console.log('Trustline created:', trustline.id);
console.log('Status:', trustline.trustline_status);
} catch (error) {
console.error('Failed to create trustline:', error.message);
}

HTTP Endpoint

  • Method: POST
  • URL: https://api.brdz.link/api/xrpl/trustlines
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

⚠️ Note: Backend implementation not available. SDK method calls endpoint but may receive 404.


initOnramp

Initialize XRPL onramp transaction to convert fiat to USDC on XRPL.

Syntax

const result = await xrpl.initOnramp(data);

Parameters

ParameterTypeRequiredDescription
dataobjectOnramp transaction data
data.currency_codestringTarget currency (default: "USDC")
data.amountnumberDirect USDC amount
data.fiat_currencystringSource fiat: IDR, SGD, USD, AUD, INR, VND
data.fiat_amountnumberFiat amount to convert

Returns

Promise<{
message: string;
data: {
xrpl_tx: {
id: number;
user_id: number;
tx_type: string;
tx_hash: string;
source_address: string;
destination_address: string;
currency_code: string;
amount: string;
status: string;
raw_response: string;
created_at: string;
updated_at: string;
};
fx: {
route: string;
usdcIntermediate: number;
result: number;
} | null;
};
}>

Example

try {
// Option 1: Fiat conversion
const onramp1 = await xrpl.initOnramp({
fiat_currency: 'IDR',
fiat_amount: 1500000
});

// Option 2: Direct USDC amount
const onramp2 = await xrpl.initOnramp({
amount: 100.5
});

console.log('Onramp initiated:', onramp1.message);
console.log('TX Hash:', onramp1.data.xrpl_tx.tx_hash);
console.log('FX Route:', onramp1.data.fx?.route);
} catch (error) {
console.error('Onramp failed:', error.message);
}

HTTP Endpoint

  • Method: POST
  • URL: https://api.brdz.link/api/xrpl/onramp/init
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

✅ Full backend support available.


getOnrampStatus

Check the status of an XRPL onramp transaction.

Syntax

const result = await xrpl.getOnrampStatus(txid);

Parameters

ParameterTypeRequiredDescription
txidstringXRPL transaction hash or onramp ID

Returns

Promise<{
txid: string;
status: string;
}>

Example

try {
const status = await xrpl.getOnrampStatus('F3E6D7C8B9A0123456789ABCDEF012345');

console.log('Transaction ID:', status.txid);
console.log('Status:', status.status);
} catch (error) {
console.error('Failed to get status:', error.message);
}

HTTP Endpoint

  • Method: GET
  • URL: https://api.brdz.link/api/xrpl/onramp/status/:txid
  • Headers: Authorization: Bearer <JWT_TOKEN>, x-api-key required

✅ Full backend support available.


Complete XRPL Integration Example

Basic Onramp Flow

class XRPLManager {
constructor(sdk) {
this.sdk = sdk;
}

async performOnramp(fiatCurrency, fiatAmount) {
const xrpl = await this.sdk.xrpl;

try {
// Initialize onramp with fiat conversion
const onramp = await xrpl.initOnramp({
fiat_currency: fiatCurrency,
fiat_amount: fiatAmount
});

console.log('Onramp initiated:', onramp.message);
console.log('USDC Amount:', onramp.data.xrpl_tx.amount);
console.log('FX Route:', onramp.data.fx?.route);

// Monitor transaction status
const txHash = onramp.data.xrpl_tx.tx_hash;
if (txHash) {
await this.monitorTransaction(txHash);
}

return onramp;
} catch (error) {
throw new Error(`Onramp failed: ${error.message}`);
}
}

async monitorTransaction(txHash) {
const xrpl = await this.sdk.xrpl;

const checkStatus = async () => {
try {
const status = await xrpl.getOnrampStatus(txHash);
console.log(`Transaction ${txHash}: ${status.status}`);

if (status.status === 'tesSUCCESS') {
console.log('Transaction completed successfully!');
return true;
} else if (status.status === 'PENDING') {
console.log('Transaction still pending...');
return false;
} else {
console.log('Transaction failed or unknown status');
return true;
}
} catch (error) {
console.error('Status check failed:', error.message);
return false;
}
};

// Poll every 10 seconds
const pollInterval = setInterval(async () => {
const completed = await checkStatus();
if (completed) {
clearInterval(pollInterval);
}
}, 10000);

// Stop polling after 5 minutes
setTimeout(() => {
clearInterval(pollInterval);
console.log('Stopped monitoring transaction');
}, 300000);
}

async getIssuerInfo(currency) {
const xrpl = await this.sdk.xrpl;

try {
const issuer = await xrpl.getIssuerByCurrency(currency);
return issuer;
} catch (error) {
console.warn('Issuer endpoint not implemented on backend');
// Fallback to environment variables for USDC
if (currency === 'USDC') {
return {
currency_code: 'USDC',
issuer_address: 'r9wxh8hwJcaQnC4ypWqZqpoYY4MS9Shmos'
};
}
throw error;
}
}
}

// Usage Example
const xrplManager = new XRPLManager(brdzSDK);

// Perform IDR to USDC onramp
xrplManager.performOnramp('IDR', 1500000)
.then(result => {
console.log('Onramp successful:', result);
})
.catch(error => {
console.error('Onramp failed:', error.message);
});

Network Configuration

XRPL Testnet

Based on project configuration:

SettingValue
WebSocketwss://s.altnet.rippletest.net:51233
RPChttps://s.altnet.rippletest.net:51234
Issuer Addressr9wxh8hwJcaQnC4ypWqZqpoYY4MS9Shmos
BRDZ AddressrUrLo6FbWL4AtnZC1i6buB55VuAXZKVLNh

Supported Currencies

From fxRateService.js SUPPORTED_CURRENCIES:

  • IDR (Indonesian Rupiah)
  • SGD (Singapore Dollar)
  • USD (US Dollar)
  • AUD (Australian Dollar)
  • INR (Indian Rupee)
  • USDC (USD Coin)
  • VND (Vietnamese Dong)

FX Conversion

  • Route: All conversions via USDC (Fiat → USDC → Fiat)
  • Source: Live rates from Coinbase API
  • Precision: 6 decimals for USDC
  • Minimum: 0.000001 USDC

Implementation Status

✅ Fully Implemented (Backend + SDK)

  • initOnramp - XRPL onramp with fiat conversion
  • getOnrampStatus - Transaction status monitoring

⚠️ SDK Only (No Backend Implementation)

  • getIssuerByCurrency - Get issuer by currency
  • getAllIssuers - Get all issuers
  • createIssuer - Create new issuer
  • getTrustlines - Get user trustlines
  • createTrustline - Create trustline

❌ Missing from SDK (Backend Available)

These methods exist in controller but not in SDK modules:

  • initOfframp - XRPL offramp operations
  • getOfframpStatus - Offramp status monitoring
  • getXRPLHistory - Transaction history

Error Handling

Common Errors

ErrorDescriptionSolution
404: Endpoint not foundBackend not implementedUse available endpoints only
400: Invalid parametersWrong parameter formatCheck parameter requirements
400: Currency not supportedUnsupported fiat currencyUse IDR, SGD, USD, AUD, INR, VND
400: Amount too smallBelow minimum USDC precisionIncrease fiat amount
500: Service errorXRPL service issuesRetry or contact support

Error Handling Example

try {
const onramp = await xrpl.initOnramp({
fiat_currency: 'IDR',
fiat_amount: 1500000
});
} catch (error) {
if (error.message.includes('Currency not supported')) {
console.error('Use supported currencies: IDR, SGD, USD, AUD, INR, VND');
} else if (error.message.includes('Amount too small')) {
console.error('Increase fiat amount for minimum USDC precision');
} else if (error.message.includes('Issuer not found')) {
console.error('USDC issuer not configured properly');
} else {
console.error('Onramp failed:', error.message);
}
}

XRPL Testnet

All operations use XRPL Testnet. Addresses and transactions are for testing only.

Implementation Status

Only initOnramp and getOnrampStatus have full backend support. Other methods are SDK placeholders.

FX Rates

All fiat conversions use live Coinbase API rates via USDC intermediate currency.