Skip to Content
EVMLedger Setup (EVM)

Ledger Setup (EVM)

This guide covers connecting a Ledger hardware wallet to Sei’s EVM for signing transactions with Ethers.js. For Cosmos-side signing with the @sei-js/ledger package, see the @sei-js/ledger reference.

Prerequisites

  1. Ledger App Installation

    On your Ledger device, open the Manager in Ledger Live and install either the Sei app or the Ethereum app. The Ethereum app supports any EVM chain (like Sei), but the native Sei app may provide optimal compatibility.

  2. Enable Blind Signing

    In the Ledger device’s Ethereum or Sei app settings, enable “Blind signing”. This permits the device to sign arbitrary EVM transactions and contract calls (e.g. precompiles), which would otherwise be rejected.

  3. USB Permissions (Linux only)

    You’ll need a udev rule so your process can talk to the Ledger over USB/HID. Clone the official rules from LedgerHQ/udev-rules , copy 49-ledger.rules into /etc/udev/rules.d/, then run sudo udevadm control --reload-rules and replug your Ledger.

  4. Install Dependencies

    npm install ethers @ethers-ext/signer-ledger @ledgerhq/hw-transport-node-hid

Connecting Your Ledger

import { LedgerSigner } from '@ethers-ext/signer-ledger'; import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'; import { ethers } from 'ethers'; const rpcUrl = 'https://evm-rpc-testnet.sei-apis.com'; const provider = new ethers.JsonRpcProvider(rpcUrl); const signer = new LedgerSigner(TransportNodeHid, provider); const addr = await signer.getAddress(); console.log('Using Ledger address:', addr);

Every transaction sent through this signer will require physical confirmation on the Ledger device.

Sending a Transfer

A simple example sending SEI from your Ledger to another address:

import { LedgerSigner } from '@ethers-ext/signer-ledger'; import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'; import { ethers } from 'ethers'; const provider = new ethers.JsonRpcProvider('https://evm-rpc-testnet.sei-apis.com'); const signer = new LedgerSigner(TransportNodeHid, provider); const tx = await signer.sendTransaction({ to: '0xRECIPIENT_ADDRESS', value: ethers.parseEther('1.0') }); console.log('TX sent:', tx.hash); const receipt = await tx.wait(); console.log('Confirmed in block:', receipt.blockNumber);
This signer works with any contract interaction — you can pass it to ethers.Contract constructors to sign precompile calls, ERC-20 transfers, or any other EVM transaction.

Troubleshooting

  • Timeouts: If the Ledger times out, increase the HID timeouts or ensure the device stays awake during signing.
  • “Blind signing required” errors: Double-check that blind signing is enabled in the app settings on the device itself.
  • Connection failures: Make sure no other application (e.g. Ledger Live) is holding the USB connection to your device.
Last updated on