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
-
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.
-
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.
-
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.rulesinto/etc/udev/rules.d/, then runsudo udevadm control --reload-rulesand replug your Ledger. -
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);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.