Getting Started
Choose an Integration
Compare the browser extension SDK and the mobile WalletConnect integration, and decide which to support.
Joey runs as a browser extension on desktop and as a mobile app on iOS and Android. They connect to your app in different ways, and most dApps should support both.
| Browser extension | Mobile app | |
|---|---|---|
| Package | @joeywallet/wallet-sdk |
@joey-wallet/wc-client, or any WalletConnect setup |
| Transport | Provider injected into the page (window.xrpl.joey), plus Wallet Standard and CAIP-294 discovery |
WalletConnect v2 relay, via QR code or deep link |
| Setup | Install the package. No keys or backend config. | A Reown project ID |
| Runtime dependencies | None | The WalletConnect stack |
| Where users are | Desktop Chrome and other Chromium browsers | Phones, or desktop users who pair by QR code |
| Signing calls | signTransaction, signAndSubmitTransaction, signTransactionFor, signTransactionBulk, signIn |
xrpl_signTransaction, xrpl_signTransactionFor, xrpl_signTransactionBulk |
| Submitting | Separate sign-only and sign-and-submit methods | submit defaults to true |
| Sign-in | signIn(): a CAIP-122 message, or a challenge transaction for Ledger accounts |
Sign-in challenge v1 in the WalletConnect session |
| Errors | JoeyRpcError with EIP-1193 codes |
WalletConnect and JSON-RPC errors |
Note
The two npm packages have different scopes: @joeywallet/wallet-sdk for the extension and @joey-wallet/wc-client for WalletConnect.
Which should I use?
- Desktop web app: support the extension with the SDK. There's no QR step and nothing to configure.
- Mobile web, or desktop users without the extension: offer WalletConnect.
- Both (recommended): detect the extension first and fall back to WalletConnect.
import { isJoeyAvailable, getJoey } from '@joeywallet/wallet-sdk'
if (isJoeyAvailable()) {
const joey = getJoey()!
await joey.connect()
} else {
// Offer WalletConnect (wc-client's actions.connect()) or an install link
}
Things that differ
- Keys and settings are separate. The extension and the mobile app don't sync. A user who imports the same recovery phrase into both gets the same addresses, but connected sites and settings are separate.
- The extension doesn't speak WalletConnect. Pairing the extension over WalletConnect isn't supported yet.
- Bulk failure details. If a bulk submit partly fails, the extension returns an object with per-entry results, while mobile returns a JSON string with
failedIndexand the signed transactions. OnlyfailedIndexmeans the same thing in both.