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 currency✅GET /xrpl/issuer/:currency⚠️ SDK Only
getAllIssuersGet all active issuers✅GET /xrpl/issuer⚠️ SDK Only
createIssuerAdd new issuer✅POST /xrpl/issuer⚠️ SDK Only
getTrustlinesGet user trustlines✅GET /xrpl/trustlines/:userId⚠️ SDK Only
createTrustlineCreate trustline✅POST /xrpl/trustlines⚠️ SDK Only
initOnrampInitialize XRPL onramp✅POST /xrpl/onramp/init✅ Full Support
getOnrampStatusCheck onramp status✅GET /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
currencystring✅Currency 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
dataobject✅Issuer creation data
data.currency_codestring✅Currency code (e.g., "USDC")
data.issuer_addressstring✅XRPL 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
userIdstring✅User 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
dataobject✅Trustline creation data
data.user_idstring✅User ID
data.currencystring✅Currency code
data.issuer_addressstring✅XRPL 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
dataobject✅Onramp transaction data
data.currency_codestring❌Target currency (default: "USDC")
data.amountnumber❌Direct USDC amount
data.fiat_currencystring❌Source fiat: IDR, SGD, USD, AUD, INR, VND
data.fiat_amountnumber❌Fiat 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
txidstring✅XRPL 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.