npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hwlt/era-connect

v0.9.0

Published

ERA hardware wallet SDK: air-gapped UR/QR account linking and transaction signing for EVM, Bitcoin (+ LTC/DOGE/DASH/BCH), Solana, Tron, TON, Cardano, Sui, Cosmos and XRP

Readme

@hwlt/era-connect

Air-gapped ERA hardware wallet integration for software wallets: account linking and transaction signing over animated QR codes (BC-UR / Keystone-compatible registry), for every chain the device ships — EVM (all networks), Bitcoin (+ Litecoin, Dogecoin, Dash, Bitcoin Cash), Solana, Tron, TON, Cardano, Sui, Cosmos (~35 zones) and XRP.

  • Headless. You render the QR and own the camera; the SDK owns every byte of the protocol. Works in React Native, Expo, browsers, extensions and Node.
  • Every address the export carries. All four Bitcoin script types including taproot, the Bitcoin-like altcoins, the three EVM derivation schemes, all three Solana schemes, 33 Cosmos zones with Ethermint, Cardano base addresses and TON wallet addresses — computed locally from the linked account.
  • Zero I/O. No network calls, ever. No Node built-ins, no BufferUint8Array end-to-end.
  • Verified against the device. Golden vectors are generated by the reference implementation and replayed byte-for-byte in CI; the fountain encoder reproduces the canonical BCR-2020-005 frames bit-for-bit and round-trips against @ngraveio/bc-ur.
  • Hardened where it matters. The scanner refuses hostile QR frames (stream binding needs a second distinct fragment), every reply must echo the request id byte-for-byte, gzip replies inflate under a hard ceiling, and a verify module proves the device signed exactly what you sent.

Install

npm install @hwlt/era-connect

React Native needs a CSPRNG for request ids — install react-native-get-random-values and import it once at app start (or inject your own via randomBytes).

60 seconds to a signature

import { EraConnect, EvmChain, WALLET_UR_TYPES } from '@hwlt/era-connect';

const era = new EraConnect({ origin: 'MyWallet' }); // shown on the device

// 1. LINK — the user shows the device's "connect" QR; you scan it.
// WALLET_UR_TYPES is every UR type a device links with — pin all of them, not
// one literal: TON, for instance, links as a standalone `crypto-hdkey`.
const scanner = era.scanner({ expectedTypes: WALLET_UR_TYPES });
// feed camera frames: scanner.receivePart(text) → { kind: 'complete', ur } when done
const accounts = era.parseAccounts(scanner.result());
const evm = accounts.evm()!;
console.log(evm.deriveAddress(0)); // 0x... — derived locally, device not needed

// 2. SIGN — build the request, render it, scan the reply.
const request = era.evm.generateSignRequest({
  signData: rlpBytes,                       // your unsigned tx, RLP-encoded for signing
  dataType: EvmChain.DataType.transaction,
  path: evm.pathFor(0),
  xfp: evm.xfp,
  chainId: 1,
  address: evm.deriveAddress(0),
});

const animated = request.toAnimated();      // drive nextFrame() at ~8 fps
// render animated.nextFrame() in your QR component every 125 ms

const reply = request.scanner();            // pre-pinned to the right reply types
// feed camera frames: reply.receivePart(text)
const signature = reply.parse();            // typed; request-id echo enforced

// 3. VERIFY (recommended) + broadcast with your own stack.
import { verifyEvmSignature } from '@hwlt/era-connect/verify';
verifyEvmSignature({ signData: rlpBytes, dataType: 1,
  signature: signature.signature, address: evm.deriveAddress(0) });

Chain support

The ERA device is multichain, and the SDK ships a dedicated module for every chain family the current firmware supports.

Dedicated modules:

| Chain | Sign transaction | Sign message | Subpath | |---|---|---|---| | EVM (all chains) | eth-sign-request | personal_sign / EIP-712 | @hwlt/era-connect/evm | | Bitcoin | crypto-psbt (PSBT v0) | BIP-44/49/84 on firmware 2.1.0+ (Taproot refused); legacy P2PKH on older | @hwlt/era-connect/btc | | Solana | sol-sign-request | off-chain messages | @hwlt/era-connect/solana | | Tron | structured envelope (any contract via rawData) | UTF-8 in rawData | @hwlt/era-connect/tron | | TON | ton-sign-request (BoC root-hash signing) | TON Connect proof | @hwlt/era-connect/ton | | Cardano | cardano-sign-request (witness-set replies, soft-derived vkey binding) | — | @hwlt/era-connect/cardano | | Sui | sui-sign-request / hash variant | — | @hwlt/era-connect/sui | | Cosmos (~35 networks incl. Ethermint) | cosmos-sign-request / evm-sign-request | ADR-036 | @hwlt/era-connect/cosmos | | XRP | ur:bytes (XRP Toolkit convention) | — | @hwlt/era-connect/xrp | | Litecoin, Dogecoin, Dash | crypto-psbt-extend (same flow as Bitcoin) | — | @hwlt/era-connect/btc | | Bitcoin Cash | structured envelope (FORKID signing, CashAddr) | — | @hwlt/era-connect/bch |

Every chain the current device firmware ships now has a dedicated module. Two things keep future additions workable: linking already surfaces every account the device exports (unknown chains still carry their path, fingerprint and public key), and the scanner/fountain layer is chain-agnostic — era.raw plus era.scanner({ expectedTypes }) speak any UR type the device learns next.

Documentation

The full guide lives in docs/:

  1. Install & set up
  2. Link the device
  3. Display a sign request
  4. Scan the signature
  5. Verify & broadcast

Per-chain guides, QR tuning, the WalletConnect forwarding model and a migration note from @keystonehq/keystone-sdk are under docs/chains and docs/advanced. The wire specification — what to implement if you cannot use the SDK — is docs/protocol; it walks through EVM, Bitcoin, Solana and Tron in full, and its reference tables cover every UR type the device speaks.

License

Apache-2.0 — see LICENSE and NOTICE.