Skip to main content

Documentation Index

Fetch the complete documentation index at: https://seilabs.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

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.