LayerZeroFault
hardware fallback Updated:

Ledger Blind Signing Auto-Reset & EIP-712 Multicall Revert Fix

VV

Written by

Updated:

Technical Guide

The Ledger Ethereum app error where blind signing auto-resets during EIP-712 typed transactions or multicalls occurs because Ledger OS 2.4+ and Ethereum app v1.11+ enforce safety resets whenever an app is closed, updated, or encounters an unparsed nested struct. When blind signing is silently toggled off, complex DeFi transactions revert with 0x6a80 or UNSUPPORTED_OPERATION. Re-enabling blind signing in device settings and decoding raw calldata restores signing.

Before signing complex transaction payloads, inspect your raw bytes with our interactive ERC-4337 Calldata Decoder Tool. For related hardware execution errors, see our companion guides on Ledger EthAppCommandError 0x6a80 on Arbitrum and Trezor Error 0x6985 on EIP-712 signatures.


Technical Cause 1: Security Policy Firmware Resets

By design, Ledger’s secure operating system (BOLOS) enforces a strict security policy: any modification to the binary firmware image or an application update invalidates and wipes local application configuration state stored in non-volatile flash (NVRAM). This design prevents malicious updates from inheriting compromised permissions. However, it means that whenever you perform an update via Ledger Live:

  1. Blind Signing is automatically toggled from Enabled $\to$ Disabled.
  2. Debug Data is toggled from Enabled $\to$ Disabled.
  3. Nonce Display is toggled back to standard view.

When your wallet sends an APDU command containing arbitrary contract calldata (such as a router swap or Permit2 authorization), the Ledger hardware evaluates:

$$\text{if } (\text{payload.isContractCall} \land \neg\text{Settings.BlindSigningEnabled}) \implies \mathbf{return} \ \texttt{0x6985}$$

Because the setting is disabled, the secure element never presents the transaction details to the user’s screen; it aborts immediately.


Technical Cause 2: Clear Signing Parser Buffer Overflow (0x6a80)

With recent updates, Ledger rolled out Clear Signing for popular protocols. Instead of raw bytecode, the screen displays readable method calls.

However, modern protocols frequently nest complex dynamic arrays inside EIP-712 typed data:

  • Uniswap v4 Hooks: Structs containing nested arrays of fee tiers, tick bounds, and hook data.
  • Permit2 Batch: Multiple token approvals grouped into an array of arbitrary length.
  • Gnosis Safe Multicalls: Arrays of encoded sub-calls.

The Secure Element microcontroller (STMicroelectronics ST31 / ST33) has limited static RAM (typically 16 KB to 32 KB). When an incoming EIP-712 payload has more than 3 levels of recursive nesting or exceeds 4,096 bytes of schema metadata, the hardware parser fails mid-deserialization and throws:

$$\texttt{APDU Status Word: 0x6a80 (INCORRECT_DATA)}$$

Step-by-Step Restoration Protocol

Follow these exact device instructions to re-enable blind signing across different Ledger models:

1. Ledger Nano S Plus & Ledger Nano X

  1. Connect your Ledger to your computer and enter your PIN.
  2. Navigate to and open the Ethereum (ETH) app on your device screen.
  3. Press the right button to navigate to Settings and press both buttons to enter.
  4. The first option displayed will be Blind signing. It will state: Disabled.
  5. Press both buttons to change it to Enabled.
  6. Press the right button to navigate to Back and press both buttons to exit settings.
  7. Keep the Ethereum app open while retrying the transaction.

2. Ledger Stax & Ledger Flex (Touchscreen Interface)

  1. Unlock your device with your PIN and open the Ethereum app.
  2. Tap the Settings icon (gear icon) in the top-right corner.
  3. Locate the Blind Signing toggle.
  4. Tap the switch until it indicates Active / Enabled.
  5. Tap the back arrow to return to the ready screen.

Developer Defense: Catching 0x6985 in Frontend dApps

When a user’s Ledger has blind signing disabled, native Web3 providers throw generic user rejected exceptions, causing users to believe your dApp is broken.

Implement client-side error interception using Viem to display a tailored instructional toast:

// ledger-error-interceptor.ts
import { BaseError } from 'viem';

export function parseLedgerError(error: unknown): {
  isLedgerBlindSignError: boolean;
  userMessage: string;
} {
  if (error instanceof BaseError) {
    const errorString = error.walk()?.message || error.message;

    // Check for 0x6985 status code or condition not satisfied
    if (
      errorString.includes('0x6985') ||
      errorString.includes('CONDITIONS_OF_USE_NOT_SATISFIED') ||
      errorString.includes('Condition of use not satisfied')
    ) {
      return {
        isLedgerBlindSignError: true,
        userMessage:
          'Transaction rejected by hardware. Your Ledger Blind Signing was likely disabled after a recent update. Please open the Ethereum App on your Ledger, go to Settings -> Blind Signing, set to Enabled, and retry.',
      };
    }

    // Check for 0x6a80 buffer overflow
    if (errorString.includes('0x6a80') || errorString.includes('INCORRECT_DATA')) {
      return {
        isLedgerBlindSignError: false,
        userMessage:
          'Payload too large for Ledger memory (0x6a80). Please split your transaction batch or disable debug data on your device.',
      };
    }
  }

  return {
    isLedgerBlindSignError: false,
    userMessage: 'Transaction failed. Please check your wallet connection.',
  };
}

Troubleshooting WebHID & Connection Timeouts

If your device continues to reject connections after enabling blind signing, check for browser-level USB contention:

  1. Close Ledger Live: Ledger Live claims exclusive HID interface locks. If Ledger Live is running in the background, browser requests will hang indefinitely.
  2. Clear Chrome HID Permissions: In Google Chrome, navigate to chrome://settings/content/usbDevices and revoke stale device handles.
  3. Switch from WebHID to WebUSB: If using MetaMask, go to Settings > Advanced > Preferred Ledger Connection Type and toggle between WebHID and Ledger Live Bridge depending on OS compatibility.

By verifying on-device Blind Signing settings following any firmware or app update and properly handling APDU status words 0x6985 and 0x6a80, hardware wallet users and dApp developers can restore uninterrupted, secure transaction signing.

EIP-712 Signature & Hardware Signing Reference Matrix

Cross-reference EIP-712 typed data signing failures, hardware wallet firmware errors, and smart contract verification codes:

Failure Code / PlatformSubsystemRoot CauseResolution Guide
0x6a80 (Ledger)Arbitrum / EVM AppNested struct depth or blind signing disabledLedger EthAppCommandError 6a80 Fix
0x6985 (Trezor)Firmware Clear SigningStruct member overflow or rejected by userTrezor EIP-712 0x6985 Firmware Fix
Blind Signing RevertLedger Live Web3Blind signing turned OFF after app updateLedger Live EIP-712 Blind Signing Revert
Multicall Auto-ResetFirmware SessionFirmware resets blind signing on power cycleLedger Auto-Reset Blind Signing Multicall Fix
Type Hash MismatchViem / TypeScriptNested custom struct alphabetization bugViem EIP-712 Nested Types Hash Mismatch
ERC-7739 ReplaySmart Account / ERC-1271Cross-account signature replay on Permit2ERC-7739 Smart Account Signature Replay Fix

[!TIP] Decode packed EIP-712 structs and inspect UserOperation hashes locally in our client-side /tools/erc4337-calldata-decoder/.

Interactive Diagnostic Sandbox

Local Hardware & Derivation Sandboxes

Simulate BIP derivation paths, check gap limits, and verify BIP-39 checksums in your browser without transmitting sensitive keys.

Companion Diagnostic Guide Ledger EthAppCommandError 6a80 Invalid Data on Arbitrum & L2 Fix →

Resolve Ledger EthAppCommandError 6a80 (Invalid Data) on Arbitrum, Optimism, and Base. Fix blind signing settings, WebHID port locks, and L2 APDU stalls.

Read Guide
Contextual Architecture

Related Diagnostic Guides

View All in Silo →

Related Inquiries

Why does Ledger keep disabling blind signing automatically?

Ledger firmware resets the 'Blind signing' toggle to disabled after every Ethereum app update, OS firmware flash, or when the Ethereum app is closed on the physical device. This security feature prevents unattended malicious contract interactions.

How do I re-enable blind signing on Ledger Nano X and S Plus?

Open the Ethereum application on your Ledger, press both buttons to enter Settings, navigate to 'Blind signing', and press both buttons to toggle it from 'Disabled' to 'Enabled'.

What error appears when blind signing is disabled during an EIP-712 multicall?

Wallets and dApps trigger transport exceptions such as 'EthAppCommandError: 0x6a80', 'UNSUPPORTED_OPERATION', or 'Please enable Blind signing or Contract data in the Ethereum app Settings'.

How can I inspect the raw transaction calldata before approving blind signing?

You can decode and inspect packed multicall calldata and UserOperation parameters offline using our interactive ERC-4337 Calldata Decoder tool.