Skip to content

Vanilla JavaScript

Integrate XRPL-Connect into your Vanilla JavaScript application.

Basic Setup

Here's a complete example with a single HTML file:

html
<!DOCTYPE html>
<html>
<head>
  <title>XRPL-Connect Example</title>
  <style>
    body {
      font-family: system-ui, -apple-system, sans-serif;
      max-width: 600px;
      margin: 40px auto;
      padding: 20px;
    }
    #account-info {
      margin-top: 20px;
      padding: 15px;
      background: #f5f5f5;
      border-radius: 8px;
      display: none;
    }
  </style>
</head>
<body>
  <h1>XRPL-Connect Demo</h1>
  <xrpl-wallet-connector id="wallet-connector"></xrpl-wallet-connector>

  <div id="account-info">
    <h2>Connected Account</h2>
    <p><strong>Address:</strong> <span id="address">-</span></p>
    <p><strong>Network:</strong> <span id="network">-</span></p>
    <p><strong>Wallet:</strong> <span id="wallet">-</span></p>
    <button id="disconnect-btn">Disconnect</button>
  </div>

  <script type="module">
    import { WalletManager,XamanAdapter,CrossmarkAdapter } from 'xrpl-connect';

    // Initialize WalletManager
    const walletManager = new WalletManager({
      adapters: [
        new XamanAdapter({ apiKey: 'YOUR_API_KEY' }),
        new CrossmarkAdapter(),
      ],
      network: 'testnet',
      autoConnect: true,
    });

    // Get DOM elements
    const connector = document.getElementById('wallet-connector');
    const accountInfo = document.getElementById('account-info');
    const addressEl = document.getElementById('address');
    const networkEl = document.getElementById('network');
    const walletEl = document.getElementById('wallet');
    const disconnectBtn = document.getElementById('disconnect-btn');

    // Connect component to wallet manager
    connector.setWalletManager(walletManager);

    // Handle connection
    walletManager.on('connect', (account) => {
      console.log('Connected:', account.address);
      addressEl.textContent = account.address;
      networkEl.textContent = account.network.name;
      walletEl.textContent = walletManager.wallet.name;
      accountInfo.style.display = 'block';
    });

    // Handle disconnection
    walletManager.on('disconnect', () => {
      console.log('Disconnected');
      accountInfo.style.display = 'none';
    });

    // Handle errors
    walletManager.on('error', (error) => {
      console.error('Error:', error.message);
      alert('Connection error: ' + error.message);
    });

    // Disconnect button
    disconnectBtn.addEventListener('click', async () => {
      await walletManager.disconnect();
    });
  </script>
</body>
</html>

Handling Wallet Events

Listen to wallet events to keep your UI in sync:

javascript
// Connection event
walletManager.on('connect', (account) => {
  console.log('Connected to:', account.address);
  console.log('Network:', account.network.name);
});

// Disconnection event
walletManager.on('disconnect', () => {
  console.log('Disconnected');
});

// Error event
walletManager.on('error', (error) => {
  console.error('Error code:', error.code);
  console.error('Error message:', error.message);
});

// Account change (user switched accounts)
walletManager.on('accountChange', (account) => {
  console.log('Account changed:', account.address);
});

// Network change (user switched networks)
walletManager.on('networkChange', (network) => {
  console.log('Network changed:', network.name);
});

Signing Transactions

Sign and submit transactions to the XRP Ledger:

javascript
// Simple payment transaction
async function sendPayment() {
  try {
    const result = await walletManager.signAndSubmit({
      TransactionType: 'Payment',
      Account: walletManager.account.address,
      Destination: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfXoQT',
      Amount: '1000000',  // 1 XRP in drops
    });

    console.log('Transaction submitted:', result.hash);
    alert('Payment sent! Hash: ' + result.hash);
  } catch (error) {
    console.error('Transaction failed:', error.message);
    alert('Transaction failed: ' + error.message);
  }
}

Signing Messages

Sign messages with the connected wallet:

javascript
async function signMessage() {
  try {
    const result = await walletManager.signMessage('Hello XRPL');

    console.log('Message signed:', result.signature);
    console.log('Signed message:', result.message);
  } catch (error) {
    console.error('Sign failed:', error.message);
  }
}

Checking Connection Status

Check if a wallet is connected and access account information:

javascript
// Check connection
if (walletManager.connected) {
  console.log('Wallet address:', walletManager.account.address);
  console.log('Network:', walletManager.account.network.name);
  console.log('Wallet name:', walletManager.wallet.name);
} else {
  console.log('No wallet connected');
}

// Access current state
const { connected, account, wallet } = walletManager;

Multiple Wallet Adapters

Give users choice by supporting multiple wallets:

javascript
import { WalletManager,XamanAdapter,WalletConnectAdapter,GemWalletAdapter;CrossmarkAdapter } from 'xrpl-connect';


const walletManager = new WalletManager({
  adapters: [
    new XamanAdapter({ apiKey: 'YOUR_API_KEY' }),
    new CrossmarkAdapter(),
    new GemWalletAdapter(),
    new WalletConnectAdapter({ projectId: 'YOUR_PROJECT_ID' }),
  ],
  network: 'testnet',
  autoConnect: true,
});

Now users will see all four wallets in the connection modal!

Error Handling

Always handle errors gracefully:

javascript
walletManager.on('error', (error) => {
  console.error('Error code:', error.code);
  console.error('Error message:', error.message);
  console.error('Error details:', error.details);

  // Handle specific errors
  switch (error.code) {
    case 'WALLET_NOT_FOUND':
      alert('Please install a wallet to continue');
      break;
    case 'CONNECTION_FAILED':
      alert('Failed to connect. Please try again.');
      break;
    case 'SIGN_FAILED':
      alert('You rejected the transaction');
      break;
    default:
      alert('An error occurred: ' + error.message);
  }
});

Or use try-catch with promise-based methods:

javascript
try {
  const result = await walletManager.signAndSubmit(transaction);
  console.log('Success:', result);
} catch (error) {
  if (error.code === 'SIGN_FAILED') {
    console.error('User rejected the transaction');
  } else if (error.code === 'NETWORK_ERROR') {
    console.error('Network problem:', error.message);
  } else {
    console.error('Unexpected error:', error);
  }
}

Web Component Attributes

Customize the component with attributes:

html
<!-- Feature a specific wallet -->
<xrpl-wallet-connector
  id="wallet-connector"
  primary-wallet="xaman"
></xrpl-wallet-connector>

<!-- Show only specific wallets -->
<xrpl-wallet-connector
  id="wallet-connector"
  wallets="xaman,crossmark"
></xrpl-wallet-connector>

<!-- Customize styling -->
<xrpl-wallet-connector
  id="wallet-connector"
  style="
    --xc-primary-color: #667eea;
    --xc-background-color: #1a202c;
    --xc-text-color: #ffffff;
  "
></xrpl-wallet-connector>

Component Methods

The component has useful methods you can call:

javascript
const connector = document.getElementById('wallet-connector');

// Open wallet selection modal
await connector.open();

// Close any open modals
connector.close();

Best Practices

  1. Initialize Once - Create the WalletManager at app startup, not in loops or event handlers

  2. Use Event Listeners - Listen to events to keep UI in sync with wallet state

  3. Handle Errors - Always have error handlers for wallet operations

  4. Validate Transactions - Check transaction parameters before signing

  5. Check Connection - Always verify walletManager.connected before accessing account info

  6. Support Multiple Wallets - Include at least Xaman and Crossmark for good UX

  7. Test Thoroughly - Test with different wallets and networks

  8. Use TypeScript - Consider migrating to TypeScript for better type safety

Complete Example with TypeScript

If you want to add TypeScript:

typescript
import { WalletManager, Account, WalletError, XamanAdapter} from 'xrpl-connect';

const walletManager: WalletManager = new WalletManager({
  adapters: [new XamanAdapter({ apiKey: 'YOUR_API_KEY' })],
  network: 'testnet',
  autoConnect: true,
});

walletManager.on('connect', (account: Account) => {
  console.log('Connected:', account.address);
});

walletManager.on('error', (error: WalletError) => {
  console.error('Error:', error.message);
});

Released under the MIT License.