One adapter-based API to connect, derive accounts, and sign transactions across every major hardware wallet.
Ledger / Trezor / Keystone / more planned
Package Capabilities
A single package to abstract every hardware wallet behind a unified, capability-aware API.
Unified connect flow across the transport methods each adapter actually supports.
Standard Solana derivation paths with multi-account support.
Sign legacy and versioned transactions with hardware confirmation.
Arbitrary message signing with on-device approval.
Query what each wallet adapter supports at runtime.
Use emulator and vendor bridge runtimes where wallets expose them, without pretending every wallet has one.
Pluggable adapters - add any wallet without changing the API.
Single consistent interface regardless of the underlying wallet.
Wallet Adapters
Ledger is live today. The remaining wallets stay visible as upcoming adapters.
Live Ledger adapter with WebHID and dev-only Speculos support.
Experimental Trezor adapter with Connect-based account derivation and transaction signing.
Experimental Keystone adapter with QR-based connect and signing, plus an adapter-ready React Native QR wrapper for native camera flows.
Experimental SafePal adapter through the official injected Solana provider runtime.
Experimental OneKey adapter with official WebUSB account derivation and signing flows.
Experimental D'CENT adapter with WalletConnect QR connect, single-account access, Solana signing through the D'CENT mobile app, and an adapter-ready React Native WalletConnect wrapper.
Experimental SecuX adapter with WebUSB connect, account derivation, message signing, and serialized Solana transaction signing.
Experimental CoolWallet adapter with Web Bluetooth pairing, account derivation, and Solana signing.
Experimental ELLIPAL adapter with WalletConnect QR connect, single-account access, Solana signing through the ELLIPAL mobile app, and an adapter-ready React Native WalletConnect wrapper.
Experimental Cypherock adapter with WebUSB wallet selection, Solana account derivation, and legacy transaction signing.
Experimental BC Vault adapter through WalletConnect. HWSigner connects to the BC Vault Desktop app while the private key remains on the hardware device; React Native can use the generic WalletConnect wrapper.
Experimental KeyPal path through TokenPocket. HWSigner uses the Solana TokenPocket adapter while the user keeps the account backed by KeyPal hardware.
Experimental GridPlus Lattice1 path through NuFi. HWSigner uses the Solana NuFi adapter while the private key stays on the Lattice1 device.
Experimental Tangem adapter with WalletConnect for the web playground and a React Native NFC runtime for native apps.
Experimental Arculus adapter through WalletConnect. HWSigner connects to Arculus mobile; the user confirms with the NFC card in the Arculus flow. React Native can use the generic WalletConnect wrapper.
Experimental Solflare Shield path through the official Solflare Wallet SDK. HWSigner cannot directly inspect the Shield card; it signs through Solflare and can use the React Native WalletConnect wrapper when a Solana wallet client is injected.
NGRAVE ZERO supports Solana in LIQUID, but we have not found a public web or React Native adapter path that HWSigner can integrate yet.
Interactive Playground
Explore how HWSigner connects, derives, and signs across different wallets and runtimes.
Wallet
Runtime
Live Ledger adapter with WebHID and dev-only Speculos support.
Event Log
No events yet. Start by connecting.
Capability Matrix
A transparent view of what each adapter supports today.
| Wallet | Connect | USB | BLE | NFC | QR | Get Accounts | Sign Tx | Sign V. Tx | Sign Message | Emulator | React | React Native |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Ledger | ||||||||||||
| Trezor | ||||||||||||
| Keystone | ||||||||||||
| SafePal | ||||||||||||
| OneKey | ||||||||||||
| D'CENT | ||||||||||||
| SecuX | ||||||||||||
| CoolWallet | ||||||||||||
| ELLIPAL | ||||||||||||
| Cypherock | ||||||||||||
| BC Vault | ||||||||||||
| KeyPal | ||||||||||||
| GridPlus Lattice1 | ||||||||||||
| Tangem | ||||||||||||
| Arculus | ||||||||||||
| Solflare Shield | ||||||||||||
| NGRAVE |
The matrix reflects what the current HWSigner adapter actually implements in this demo runtime, not every transport a vendor may support on paper.
Package Architecture
A layered adapter architecture that cleanly separates wallet logic from transport runtimes.
Consumer application
Unified API / capability awareness / event system
Ledger / Trezor / QR signers / WalletConnect-backed wallets / vendor SDK adapters
WebHID / WebUSB / Web BLE / WalletConnect / injected providers / emulators / native NFC
Physical wallets / emulators / air-gapped signers
Adapter Guide
HWSigner keeps every hardware wallet behind one adapter contract. New wallets plug into the runtime layer without changing application code.
Start from the real integration path: WebHID, WebUSB, Web BLE, WalletConnect, injected provider, QR, Speculos, React Native WalletConnect, or native React Native NFC.
Keep wallet-specific code inside `src/lib/<wallet>/client.ts`. Normalize addresses, signatures, and Solana transaction objects at the boundary.
Implement the shared `WalletAdapter` methods so app code keeps calling `connect`, `getAccounts`, `signMessage`, and transaction signing consistently.
If the wallet cannot sign messages, versioned transactions, or run in the browser, return a disabled capability or throw `UnsupportedOperationError`.
Register the wallet in `src/data/wallets.ts`, wire the runtime in `PlaygroundSection`, and add focused tests for capabilities and error mapping.
// 1. Add a runtime shape in src/lib/hwsigner/types.tstype HWSignerRuntime = | { kind: 'my-wallet-webusb'; transport: 'webusb' } | ExistingRuntimes; // 2. Implement a small adapter wrapperexport function createMyWalletAdapter( runtime: HWSignerRuntime, onEvent?: HWSignerEventListener,): WalletAdapter { if (runtime.kind !== 'my-wallet-webusb') { throw new UnsupportedOperationError('MyWallet only supports WebUSB.'); } return new MyWalletAdapter(new MyWalletClient(onEvent));} // 3. Keep app code unchangedconst signer = createHWSigner({ walletId: 'my-wallet', runtime: { kind: 'my-wallet-webusb', transport: 'webusb' },}); const connection = await signer.connect();const [account] = await signer.getAccounts({ startIndex: 0, count: 1 });const signed = await signer.signTransaction({ transaction, derivationPath: account.path });Direct Device
Ledger WebHID, OneKey WebUSB, CoolWallet Web BLE
Bridge App
Trezor Connect, BC Vault Desktop, GridPlus via NuFi
Mobile / QR
Keystone QR, D'CENT, ELLIPAL, Arculus, BC Vault, Tangem WalletConnect
React Native Entry
createReactNativeHWSigner -> Tangem NFC, Keystone QR, and injected Solana WalletConnect clients
Adapter checklist
Developer Experience
Clean API, typed responses, and a development-friendly adapter model.
import { Connection, PublicKey, SystemProgram, Transaction } from '@solana/web3.js';import { createHWSigner } from '@/lib/hwsigner/create-signer'; const signer = createHWSigner({ walletId: 'ledger', runtime: { kind: 'real-device', transport: 'webhid' },}); await signer.connect();const [account] = await signer.getAccounts({ startIndex: 0, count: 1 }); const connection = new Connection('https://api.devnet.solana.com', 'confirmed');const { blockhash } = await connection.getLatestBlockhash(); const transaction = new Transaction({ feePayer: new PublicKey(account.address), recentBlockhash: blockhash,}).add( SystemProgram.transfer({ fromPubkey: new PublicKey(account.address), toPubkey: new PublicKey('DRpbCBMxVnDK7maPMoGQfFiRLNGhFM1M7J9sX9g3BJ2j'), lamports: 1500000, }),); const signed = await signer.signTransaction({ derivationPath: account.path, transaction,}); console.log(signed.signature);A single interface for all hardware wallets. No wallet-specific code in your app.
Adapters report supported features at runtime. Build UIs that adapt to each device.
Use emulators and vendor bridge runtimes where wallets expose them, while keeping real-device paths explicit.
Each wallet is a self-contained adapter. Add support for new wallets without touching the core.
Designed as a composable package. Tree-shakeable, typed, and framework-agnostic.
Architecture supports QR, NFC, and BLE transports. New wallets plug in cleanly.