> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sei.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Ledger Setup (EVM)

> Set up your Ledger hardware wallet for signing EVM transactions on Sei, including device configuration, Ethers.js integration, and a simple transfer example.

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](/evm/sei-js/ledger).

## 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](https://github.com/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**
   ```bash theme={"dark"}
   npm install ethers @ethers-ext/signer-ledger @ledgerhq/hw-transport-node-hid
   ```

## Connecting Your Ledger

```tsx theme={"dark"}
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:

```tsx theme={"dark"}
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);
```

<Info>This signer works with any contract interaction — you can pass it to `ethers.Contract` constructors to sign [precompile](/evm/precompiles) calls, ERC-20 transfers, or any other EVM transaction.</Info>

## 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.
