Skip to content

Use Cases

Real-world integration patterns for Rach Wallet-as-a-Service.


1. Crypto Exchange — Custodial Deposit Wallets

Scenario: A crypto exchange wants to give each user unique deposit addresses across multiple networks for their account.

How:

  • Create a wallet per user at signup
  • Derive addresses for all supported networks upfront
  • Enable monitoring on all addresses
  • Credit user's exchange balance on wallet.deposit.confirmed
  • Use POST /wallet/{id}/transfer to process user withdrawals
javascript
// On user signup
const wallet = await rach.wallet.create({ customerId: user.id });
await secrets.store(`wallet:${user.id}`, wallet.mnemonic);

// Derive all supported networks
const networks = ['BTC', 'ETH', 'BSC', 'TRX', 'SOL', 'POL'];
const addresses = await Promise.all(
  networks.map(network =>
    rach.wallet.deriveAddress(user.id, { network, index: 0, enable_monitoring: true })
  )
);

// Store addresses for display in user dashboard
await db.wallets.upsertAddresses(user.id, addresses);

On deposit webhook:

javascript
if (event === 'wallet.deposit.confirmed') {
  await exchange.credit(data.customer_id, data.amount, data.currency);
}

2. Fintech App — Multi-Currency Savings

Scenario: A savings app lets users hold BTC, ETH, and USDT in a non-custodial wallet. Users can send/receive freely.

How:

  • Create one wallet per user on signup
  • Derive BTC, ETH, TRX addresses (for USDT) with monitoring
  • Show real-time balances via GET /wallet/{id}/addresses?refresh=true
  • Let users send via POST /wallet/{id}/transfer
  • Offer wallet export via POST /wallet/{id}/export-key for advanced users
javascript
// Onboarding
const wallet = await rach.wallet.create({ customerId: userId, word_count: 24 });

const [btc, eth, trx] = await Promise.all([
  rach.wallet.deriveAddress(userId, { network: 'BTC', enable_monitoring: true }),
  rach.wallet.deriveAddress(userId, { network: 'ETH', enable_monitoring: true }),
  rach.wallet.deriveAddress(userId, { network: 'TRX', enable_monitoring: true }), // for USDT
]);

// Show balances
const { addresses } = await rach.wallet.listAddresses(userId, { refresh: true });

3. Payment Processor — High-Volume Merchant Payments

Scenario: A payment processor accepts crypto on behalf of many merchants, routing payments to their respective wallets.

How:

  • Create a wallet per merchant
  • Derive a new address per order (using incrementing index) for perfect payment attribution
  • Monitor all addresses for deposits
  • On confirmation, route payment to merchant's settled balance
javascript
// Per order — new address from same wallet at unique index
const order = await db.orders.create({ merchantId, amount, currency });

const address = await rach.wallet.deriveAddress(merchantId, {
  network: 'BSC',
  index: order.id, // unique index per order
  enable_monitoring: true
});

order.depositAddress = address.address;

4. NFT Marketplace — Creator Royalty Wallets

Scenario: An NFT marketplace wants to automatically distribute royalty payments to NFT creators when their works are sold.

How:

  • Create a wallet for each creator
  • On NFT sale, use POST /wallet/{creatorId}/transfer to push ETH/POL royalty
  • Creators can export their private key to claim funds in any external wallet
javascript
// On NFT sale
const royaltyAmount = salePrice * creatorRoyaltyPercent;
const amountWei = BigInt(royaltyAmount * 1e18).toString(); // convert to wei

await rach.wallet.transfer(creator.id, {
  network: 'ETH',
  currency: 'ETH',
  to_address: creator.walletAddress,
  amount: amountWei,
  index: 0
});

5. Remittance Platform — Stablecoin Corridors

Scenario: A remittance company moves USDT from senders (Europe) to recipients (Africa) using stablecoins for settlement, avoiding SWIFT delays.

How:

  • Sender wallet on ETH or BSC (receives USDT from user)
  • Recipient wallet on TRX (cheaper USDT-TRC20 fees)
  • Monitor sender address → receive USDT → immediately send to recipient TRX address
javascript
// Sender deposits USDT on BSC
await rach.wallet.deriveAddress(senderId, {
  network: 'BSC', currency: 'USDT', enable_monitoring: true
});

// On deposit.confirmed — bridge to cheaper TRX network via internal swap
if (event === 'wallet.deposit.confirmed' && data.currency === 'USDT') {
  const amountSun = BigInt(data.amount * 1e6).toString(); // USDT TRC-20 uses 6 decimals
  await rach.wallet.transfer(recipientId, {
    network: 'TRX',
    currency: 'USDT',
    to_address: recipientTrxAddress,
    amount: amountSun
  });
}

6. DeFi Gateway — Multi-Chain Liquidity

Scenario: A DeFi aggregator gives users wallets to bridge funds into on-chain DeFi protocols across ETH, BSC, and Polygon.

javascript
// Create multi-chain wallet
const wallet = await rach.wallet.create({ customerId: user.id });

// Derive EVM chains (same address across all three)
const chains = ['ETH', 'BSC', 'POL'];
await Promise.all(
  chains.map(network =>
    rach.wallet.deriveAddress(user.id, {
      network,
      index: 0,
      enable_monitoring: true
    })
  )
);

// Estimate gas before transfer
const gas = await rach.wallet.estimateGas({
  network: 'BSC',
  currency: 'USDT',
  from_address: addresses.BSC,
  to_address: defiProtocolAddress,
  amount: depositAmountWei
});

Network Selection Guide

Choose networks based on your use case:

ObjectiveRecommended Networks
Stablecoin payments (cheapest)TRX (USDT-TRC20), POL (USDC-Polygon)
Maximum chain coverageBTC, ETH, BSC, TRX, SOL
DeFi integrationsETH, BSC, POL, SOL
Bitcoin-nativeBTC, LTC, BCH
Low-fee EVMBSC, POL
Solana ecosystemSOL

Rach Payments API