---
title: 'Ledger Setup (EVM)'
description: 'Set up your Ledger hardware wallet for signing EVM transactions on Paxeer, including device configuration, Ethers.js integration, and a simple transfer example.'
keywords: ['ledger wallet', 'ethers.js', 'hardware wallet', 'blockchain security', 'paxeer transactions', 'evm']
---

> **For AI agents:** the complete documentation index is at [llms.txt](/llms.txt). Append `.md` to any page URL for its markdown version.

This guide covers connecting a Ledger hardware wallet to Paxeer'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).

## Prerequisites

1. **Ledger App Installation**

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

2. **Enable Blind Signing**

   In the Ledger device's Ethereum or Paxeer 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
   npm install ethers @ethers-ext/signer-ledger @ledgerhq/hw-transport-node-hid
   ```

## Connecting Your Ledger

```tsx
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 HPX from your Ledger to another address:

```tsx
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.
