Developer Guide

XRPL wallets without seed phrases, via Privy

Privy is a developer wallet SDK that creates and signs XRPL transactions server-side — no seed phrase stored in your code. Human buyers get a wallet via email or social login; AI agents create one programmatically and sign EscrowCreate transactions without ever holding a private key in plaintext.

Two wallet modes, one SDK

For humans

Embedded wallets

Users sign in with email, Google, or Apple. Privy creates and manages their XRPL wallet — no extension, no seed phrase, no friction. Wallet address is ready in seconds.

For agents

Server wallets

Your agent calls Privy's API to create an XRPL wallet server-side, then signs any transaction type — EscrowCreate, Payment, DelegateSet — without storing a seed anywhere in code.

1 XRP base reserve required. Every XRPL account must hold at least 1 XRP on-ledger before it can submit transactions. Fund the address after creation via an exchange, Coinbase, or the fund_xrpl_wallet_via_coinbase MCP tool.

Section 1 — Agent integration (Node.js)
1
Install the SDK
The PrivyWallet class is built into the AgentTrust npm SDK. The xrpl package handles transaction encoding.
npm install @eamwhite1/agenttrust-sdk xrpl
2
Create a wallet
Store PRIVY_APP_ID and PRIVY_APP_SECRET as environment variables — never hardcode them.
Node.js
const { PrivyWallet } = require('@eamwhite1/agenttrust-sdk');

const privy = new PrivyWallet({
  appId:     process.env.PRIVY_APP_ID,
  appSecret: process.env.PRIVY_APP_SECRET,
});

const wallet = await privy.createWallet();
// { id: 'wal_...', address: 'rXXXX...', publicKey: '02...' }

// Fund with 1 XRP before submitting any transactions
console.log('Fund this address:', wallet.address);
3
Sign and submit a transaction
Build the transaction with xrpl.js, sign via Privy, submit to the ledger. No seed phrase in your code.
Node.js
const { Client, xrpToDrops } = require('xrpl');

const xrpl = new Client('wss://xrplcluster.com');
await xrpl.connect();

const tx = await xrpl.autofill({
  TransactionType: 'Payment',
  Account:         wallet.address,
  Destination:     'rDest...',
  Amount:          xrpToDrops('10'),
});

// Sign via Privy — no seed stored
const signedBlob = await privy.signTransaction(
  wallet.id, wallet.address, wallet.publicKey, tx
);

const result = await xrpl.submit(signedBlob);
console.log(result.result.engine_result); // tesSUCCESS

await xrpl.disconnect();
4
Sign an AgentTrust EscrowCreate
hire_and_pay() returns a ready-to-sign transaction dict. Pass it directly to privy.signTransaction().
Node.js
const { AgentTrust } = require('@eamwhite1/agenttrust-sdk');
const at = new AgentTrust();

// Pre-flight check
const check = await at.assessCounterparty({
  workerAddress: workerWallet.address,
  amountXrp: 10,
});
if (!check.proceed) throw new Error(check.reason);

// Create escrow — returns ready-to-sign tx
const escrow = await at.hireAndPay({
  task:          'Write a 500-word blog post about XRPL',
  buyerAddress:  buyerWallet.address,
  amountXrp:     10,
  workerAddress: workerWallet.address,
  escrowId:      `job-${Date.now()}`,
  feeHash:       feeHash,
});

// Sign EscrowCreate with Privy
const signed = await privy.signTransaction(
  buyerWallet.id, buyerWallet.address, buyerWallet.publicKey,
  escrow.tx_dict
);
const txResult = await xrpl.submit(signed);

// Confirm on-chain
await at.confirmEscrow({
  escrowId: escrow.escrow_id,
  txHash:   txResult.result.tx_json.hash,
});

Get 1 XRP into a fresh address

Every XRPL account needs at least 1 XRP on-ledger before it can submit any transaction. Here are the three paths — pick the one that fits your setup.

Option A Coinbase onramp — best for fully autonomous agents

Call fund_xrpl_wallet_via_coinbase (an AgentTrust MCP tool). It buys XRP on Coinbase using the agent's own API key and withdraws it directly to the XRPL address — no human in the loop once set up.

One-time human step: a human must create the Coinbase account and complete KYC (passport/ID) once. After that, the agent can fund itself autonomously using the API key. Store COINBASE_API_KEY and COINBASE_API_SECRET as env vars with wallet:buys:create + wallet:transactions:send permissions.

MCP tool call
// After creating the wallet:
await agentTrust.fundWalletViaCoinbase({
  xrplAddress: wallet.address,
  usdAmount:   5.0,   // buys ~5 USD worth of XRP — covers base reserve + fees
});
Option B Transfer from another XRPL wallet — fastest if you already hold XRP

Send at least 1 XRP from any funded XRPL wallet — your own, an exchange withdrawal, or Xaman. The receiving address activates the moment the Payment lands.

Node.js (xrpl.js)
const { Client, Wallet, xrpToDrops } = require('xrpl');

const client = new Client('wss://xrplcluster.com');
await client.connect();

const funderWallet = Wallet.fromSeed(process.env.FUNDER_SEED);
const prepared = await client.autofill({
  TransactionType: 'Payment',
  Account:         funderWallet.address,
  Destination:     newWallet.address,  // the Privy-created address
  Amount:          xrpToDrops('2'),    // 2 XRP: 1 reserve + buffer for fees
});
const signed  = funderWallet.sign(prepared);
const result  = await client.submitAndWait(signed.tx_blob);
console.log(result.result.meta.TransactionResult); // tesSUCCESS

await client.disconnect();
Option C Swap RLUSD → XRP on the DEX — if your agent holds stablecoins

If your agent has received RLUSD from completed work, it can swap to XRP on the XRPL DEX to cover its own reserve. Use get_rlusd_quote first to check the rate, then submit an OfferCreate.

MCP tool call
// Check live DEX rate
const quote = await agentTrust.getRlusdQuote({
  walletAddress: wallet.address,
  amountRlusd:   2.0,
});
// { xrp_equivalent: 1.84, rate: 0.92, trustline_active: true }

// If rate looks good, submit the swap via your signed OfferCreate tx

The DEX swap requires an active RLUSD trustline on the wallet first (TrustSet transaction). A fresh wallet can't do this until it has the 1 XRP reserve — so Option C only works for top-up funding after the initial activation.

Constrain what a wallet can sign

Privy's policy engine lets you restrict a wallet's signing power at creation time — useful for agent wallets that should only sign specific transaction types or pay specific addresses.

Policy fieldWhat it controlsExample
TransactionTypeRestrict which tx types the wallet can signOnly EscrowCreate, Payment
Payment.DestinationAllowlist or denylist recipient addressesOnly pay AgentTrust escrow address
Payment.Amount.dropsCap XRP payment sizeMax 100 XRP per transaction
OfferCreate.TakerPaysConstrain DEX buy ordersOnly buy RLUSD
TrustSet.LimitAmountRestrict trust line creationOnly trust Gatehub USDC

Wallets can sign any valid XRPL transaction type, but policies only evaluate the types above. Transactions of unsupported types (e.g. DelegateSet) are denied unless a system-level rule allows them — test carefully.

Create a wallet in three clicks

No seed phrase, no browser extension, no crypto knowledge required. Privy creates a real XRPL wallet using your existing email or social login.

1
Go to the dashboard → Wallets
Open app.cryptovault.co.uk and navigate to the Wallets section. You'll see a "Create wallet with Privy" card at the top.
2
Sign in with email, Google, or Apple
Click Create wallet with Privy. You'll sign in with a social account you already have — no new app to download, no seed phrase to write down. Privy generates your XRPL wallet behind the scenes and your address is linked to your AgentTrust account automatically.
3
Fund with 1 XRP to activate
Your wallet address (starting with r) needs at least 1 XRP to go live on the XRPL ledger. Send it from an exchange like Coinbase or Kraken — the dashboard will show your wallet as active once the deposit arrives.
Your keys, your wallet. Privy holds nothing on your behalf — your wallet is a real XRPL account. You can export your private key at any time from your Privy account settings if you ever want to move to a hardware wallet or another app.
Further reading
Privy XRPL docs npm SDK Autonomous Agent XLS-75 Delegation All guides