> ## Documentation Index
> Fetch the complete documentation index at: https://seilabs-docs-evm-cookbook.mintlify.site/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 shows how to connect a Ledger hardware wallet to Sei EVM and sign transactions with ethers.js.

<Note>
  `@sei-js/ledger` is no longer in the sei-js monorepo. Do not install the deprecated version `1.1.6`, which npm still serves. The package previously handled Cosmos-side Amino signing, and there is no replacement package for that flow. Cosmos SDK signing is deprecated. See [SIP-3](/learn/sip-03-migration) and the [Cosmos SDK deprecation notice](/cosmos-sdk). This page covers EVM transactions only.
</Note>

## Prerequisites

1. **Install the Ledger app**

   Open the **Manager** in Ledger Live. Install either the **Sei** app or the **Ethereum** app on your Ledger device. The Ethereum app supports any EVM chain, including Sei, but the native Sei app may give the best compatibility.

2. **Enable blind signing**

   In the settings of the Ethereum or Sei app on the Ledger device, enable **Blind signing**. This setting lets the device sign arbitrary EVM transactions and contract calls (for example, precompile calls). Without it, the device rejects them.

3. **Set up USB permissions (Linux only)**

   Your process needs a udev rule to communicate with 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/`. Run `sudo udevadm control --reload-rules`. Then disconnect your Ledger and connect it again.

4. **Install dependencies**
   ```bash theme={null}
   npm install ethers @ethers-ext/signer-ledger @ledgerhq/hw-transport-node-hid
   ```

## Connecting your Ledger

```tsx theme={null}
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 that you send through this signer requires physical confirmation on the Ledger device.

## Sending a transfer

This example sends SEI from your Ledger to another address:

```tsx theme={null}
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 make sure that the device stays awake during signing.
* **"Blind signing required" errors:** Check that blind signing is enabled in the app settings on the device itself.
* **Connection failures:** Make sure that no other application, such as Ledger Live, holds the USB connection to your device.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.