---
title: For Wallets
category: how-to
---

# How to integrate Clear Signing into your wallet

Integrate Clear Signing into your wallet to provide human-readable transaction information for your users.

> **Note:** **Partner program:** Wallet integration requires enrollment in Ledger's partner program to obtain an `originToken`. <a href="https://tally.so/r/wkqPKj" target="_blank" className="text-orange-400 hover:text-orange-300">Contact the team</a> to discuss integration and receive your token before starting the steps below.

## How it works

Wallet providers implement Clear Signing through Ledger’s Device Management Kit (DMK) and Device Signer Kit (DSK). When a user signs a transaction, the DSK fetches metadata for the target contract from the Clear Signing Registry and sends the human-readable field data to the Ledger signer. The signer’s Secure Screen then displays the formatted transaction details, recipient, amount, approval type, and requesting dApp, rather than the raw calldata.

Both the wallet and the dApp need to support the [ERC-7730](https://eips.ethereum.org/EIPS/eip-7730) standard for the details to be fully displayed. If either side lacks support, the signer falls back to blind signing.

> **Note:** **Why DMK?** The DMK was built with Clear Signing in mind. It provides observable-based patterns, TypeScript-first design, and automatic metadata fetching for all EVM-compatible chains.

## Prerequisites

- A browser environment that supports WebHID
- An `originToken` from Ledger's partner program

## Integrate Clear Signing

### Install the required packages

### npm

```bash
            # Core DMK and transport
npm install @ledgerhq/device-management-kit \
            @ledgerhq/device-transport-kit-web-hid \
            # Ethereum signer for Clear Signing
            @ledgerhq/device-signer-kit-ethereum
```

### yarn

```bash
         # Core DMK and transport
yarn add @ledgerhq/device-management-kit \
         @ledgerhq/device-transport-kit-web-hid \
         # Ethereum signer for Clear Signing
         @ledgerhq/device-signer-kit-ethereum
```

### pnpm

```bash
         # Core DMK and transport
pnpm add @ledgerhq/device-management-kit \
         @ledgerhq/device-transport-kit-web-hid \
         # Ethereum signer for Clear Signing
         @ledgerhq/device-signer-kit-ethereum
```

### Initialize the DMK

```typescript filename="dmk-setup.ts"
import {
  DeviceManagementKitBuilder,
  ConsoleLogger
} from "@ledgerhq/device-management-kit";
import { webHidTransportFactory } from "@ledgerhq/device-transport-kit-web-hid";

const dmk = new DeviceManagementKitBuilder()
  .addLogger(new ConsoleLogger())
  .addTransport(webHidTransportFactory)
  .build();
```

### Connect to the device

This step must be triggered by a user gesture (such as a button click) because browsers require user interaction to open a WebHID device picker.

```typescript filename="device-connection.ts"
// startDiscovering() opens the browser's device picker
const discoveredDevices = await dmk.startDiscovering();

// In practice, present a UI so the user selects their device
const device = discoveredDevices[0];

const sessionId = await dmk.connect({
  deviceId: device.id,
});
```

### Initialize the Ethereum signer with Clear Signing

```typescript filename="signer-setup.ts"
import { SignerEthBuilder } from "@ledgerhq/device-signer-kit-ethereum";

const signerEth = new SignerEthBuilder({
  dmk,
  sessionId,
  originToken: "your-origin-token", // Obtained through Ledger's partner program
}).build();
```

> **Note:** The `originToken` identifies your wallet to the Clear Signing Registry and enables metadata fetching. Store it securely and do not expose it in client-side code. To obtain your token, complete the partner program enrollment at <a href="https://tally.so/r/wkqPKj" target="_blank" className="text-orange-400 hover:text-orange-300">the partner intake form</a>.

### Sign a transaction

```typescript filename="transaction-signing.ts"
// Build your transaction object
const transaction = {
  to: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC contract on Ethereum mainnet
  value: "0x0",
  data: "0xa9059cbb000000000000000000000000...", // ERC-20 transfer calldata
  chainId: 1,
  nonce: 0,
  gasLimit: "0x5208",
  maxFeePerGas: "0x...",
  maxPriorityFeePerGas: "0x...",
};

// Clear Signing is applied automatically when metadata exists for the contract
const signature = await signerEth.signTransaction(transaction);

// The user's signer displays human-readable fields (Recipient, Amount)
// rather than raw hex calldata
```

> **Note:** For complete documentation including device discovery patterns, connection lifecycle management, and advanced configuration options, see the <Link href="../device-interaction/getting-started" className="text-orange-400 hover:text-orange-300">Device Interaction documentation</Link>.

## Implementation checklist

Set up DMK with the WebHID transport

Implement device discovery triggered by a user gesture

Build a device selection UI so users can choose their signer

Configure the signer with your partner program originToken

Implement signTransaction, signMessage, and signTypedData flows

Show users whether Clear Signing is active or whether the transaction will use blind signing

Add error handling for connection failures and signing rejections

Test Clear Signing display on a physical Ledger signer

## Best practices

Secure the origin token
Never expose your originToken in client-side code. Load it from an environment variable or server-side configuration.

Show signing status
Tell users whether Clear Signing is active for a given transaction. When metadata is unavailable, display a clear blind signing warning.

Handle errors gracefully
Device disconnections and user rejections are expected. Implement retry logic and meaningful error messages rather than silent failures.

## Troubleshooting

Clear Signing is not appearing on the signer

Verify that all of the following are true:



Device connection fails or the picker does not appear

Common causes and solutions:



signMessage or signTypedData does not trigger Clear Signing

Clear Signing for EIP-712 messages requires a matching eip712 context in the registry metadata file for the target domain. If no matching file exists, the signer falls back to blind signing.
Ask the protocol team to [add EIP-712 metadata](./for-dapps/get-started) to the registry.

Your wallet is now ready to display Clear Signing information for all contracts that have registered metadata. Users will see human-readable transaction details on their signer for thousands of protocols automatically.

## Resources

[<div className="font-semibold mb-2">DMK Documentation →</div>
<div className="text-sm text-gray-400">Complete API reference and integration examples</div>](https://github.com/LedgerHQ/device-management-kit)

[<div className="font-semibold mb-2">Registry Explorer →</div>
<div className="text-sm text-gray-400">Browse existing metadata implementations</div>](https://github.com/LedgerHQ/clear-signing-erc7730-registry)

Give your users full transparency

With Clear Signing integrated, your wallet automatically displays human-readable transaction details for thousands of protocols, so users know exactly what they are approving. On Ledger touchscreen signers, Clear Signing works alongside Transaction Check for an additional layer of threat detection.
