npm install @hwsigner/core

Unified Solana
Hardware Wallet SDK

One adapter-based API to connect, derive accounts, and sign transactions across every major hardware wallet.

Ledger / Trezor / Keystone / more planned

React NativeSolanaHardware WalletsAdapter-based

Package Capabilities

What the SDK provides

A single package to abstract every hardware wallet behind a unified, capability-aware API.

Connect Wallets

Unified connect flow across the transport methods each adapter actually supports.

Derive Accounts

Standard Solana derivation paths with multi-account support.

Sign Transactions

Sign legacy and versioned transactions with hardware confirmation.

Sign Messages

Arbitrary message signing with on-device approval.

Capability Awareness

Query what each wallet adapter supports at runtime.

Emulator Support

Use emulator and vendor bridge runtimes where wallets expose them, without pretending every wallet has one.

Adapter Architecture

Pluggable adapters - add any wallet without changing the API.

One API Surface

Single consistent interface regardless of the underlying wallet.

Wallet Adapters

Supported hardware wallets

Ledger is live today. The remaining wallets stay visible as upcoming adapters.

Live

Ledger

Live Ledger adapter with WebHID and dev-only Speculos support.

USBBLE
Experimental

Trezor

Experimental Trezor adapter with Connect-based account derivation and transaction signing.

USB
Experimental

Keystone

Experimental Keystone adapter with QR-based connect and signing, plus an adapter-ready React Native QR wrapper for native camera flows.

QRUSB
Experimental

SafePal

Experimental SafePal adapter through the official injected Solana provider runtime.

BLEQR
Experimental

OneKey

Experimental OneKey adapter with official WebUSB account derivation and signing flows.

USBBLE
Experimental

D'CENT

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.

QRBLE
Experimental

SecuX

Experimental SecuX adapter with WebUSB connect, account derivation, message signing, and serialized Solana transaction signing.

USB
Experimental

CoolWallet

Experimental CoolWallet adapter with Web Bluetooth pairing, account derivation, and Solana signing.

BLE
Experimental

ELLIPAL

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.

QR
Experimental

Cypherock

Experimental Cypherock adapter with WebUSB wallet selection, Solana account derivation, and legacy transaction signing.

USBNFC
Experimental

BC Vault

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.

USBQR
Experimental

KeyPal

Experimental KeyPal path through TokenPocket. HWSigner uses the Solana TokenPocket adapter while the user keeps the account backed by KeyPal hardware.

Bridge
Experimental

GridPlus Lattice1

Experimental GridPlus Lattice1 path through NuFi. HWSigner uses the Solana NuFi adapter while the private key stays on the Lattice1 device.

Bridge
Experimental

Tangem

Experimental Tangem adapter with WalletConnect for the web playground and a React Native NFC runtime for native apps.

NFCQR
Experimental

Arculus

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.

NFCQR
Experimental

Solflare Shield

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.

NFC
Planned

NGRAVE

NGRAVE ZERO supports Solana in LIQUID, but we have not found a public web or React Native adapter path that HWSigner can integrate yet.

QR

Interactive Playground

Package Playground

Explore how HWSigner connects, derives, and signs across different wallets and runtimes.

hwsigner-playground
disconnected

Wallet

Runtime

Ledger

Live

Live Ledger adapter with WebHID and dev-only Speculos support.

Transport:USBBLE

Event Log

No events yet. Start by connecting.

Capability Matrix

Feature coverage per wallet

A transparent view of what each adapter supports today.

WalletConnectUSBBLENFCQRGet AccountsSign TxSign V. TxSign MessageEmulatorReactReact 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

How it's structured

A layered adapter architecture that cleanly separates wallet logic from transport runtimes.

Your App

Consumer application

HWSigner Core

Unified API / capability awareness / event system

Wallet Adapters

Ledger / Trezor / QR signers / WalletConnect-backed wallets / vendor SDK adapters

Transport Runtimes

WebHID / WebUSB / Web BLE / WalletConnect / injected providers / emulators / native NFC

Hardware Devices

Physical wallets / emulators / air-gapped signers

Adapter Guide

How to add a new wallet

HWSigner keeps every hardware wallet behind one adapter contract. New wallets plug into the runtime layer without changing application code.

1. Choose the Runtime

Start from the real integration path: WebHID, WebUSB, Web BLE, WalletConnect, injected provider, QR, Speculos, React Native WalletConnect, or native React Native NFC.

2. Wrap the Vendor SDK

Keep wallet-specific code inside `src/lib/<wallet>/client.ts`. Normalize addresses, signatures, and Solana transaction objects at the boundary.

3. Expose the Adapter

Implement the shared `WalletAdapter` methods so app code keeps calling `connect`, `getAccounts`, `signMessage`, and transaction signing consistently.

4. Be Honest About Support

If the wallet cannot sign messages, versioned transactions, or run in the browser, return a disabled capability or throw `UnsupportedOperationError`.

5. Add the UI Contract

Register the wallet in `src/data/wallets.ts`, wire the runtime in `PlaygroundSection`, and add focused tests for capabilities and error mapping.

adapter-template.ts
ts
// 1. Add a runtime shape in src/lib/hwsigner/types.ts
type HWSignerRuntime =
| { kind: 'my-wallet-webusb'; transport: 'webusb' }
| ExistingRuntimes;
 
// 2. Implement a small adapter wrapper
export 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 unchanged
const 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

Do not simulate successful hardware operations.
Use native `@solana/web3.js` Transaction and VersionedTransaction inputs.
Map vendor errors into HWSigner errors before they reach the UI.
Keep browser-only SDKs behind dynamic client imports.
Use the React Native entrypoint for native NFC/BLE/USB runtimes and injected Solana WalletConnect clients.
Gate local/dev-only runtimes with explicit env flags.
Prefer one small adapter per wallet instead of global wallet-specific branches.

Developer Experience

Built for developers

Clean API, typed responses, and a development-friendly adapter model.

example.ts
ts
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);

One API Surface

A single interface for all hardware wallets. No wallet-specific code in your app.

Capability-Aware

Adapters report supported features at runtime. Build UIs that adapt to each device.

Emulator-Friendly

Use emulators and vendor bridge runtimes where wallets expose them, while keeping real-device paths explicit.

Adapter Model

Each wallet is a self-contained adapter. Add support for new wallets without touching the core.

Package-First

Designed as a composable package. Tree-shakeable, typed, and framework-agnostic.

Future Extensible

Architecture supports QR, NFC, and BLE transports. New wallets plug in cleanly.