Skip to content
ecdsa.com
viem (TypeScript)Web3 wallets and signatures

Error message

invalid signature length

Also printed as

  • Error: invalid signature length

viem (TypeScript) — recoverMessageAddress / recoverAddress / recoverTypedDataAddress / recoverPublicKey

What it means

viem's recovery functions accept a hex or byte signature of exactly 65 bytes (r‖s‖v) and stop with this plain `Error` for any other length — including the 64-byte EIP-2098 compact form, which viem supports only through explicit conversion helpers. Nothing was recovered; the signature is in a different format, or it is not an EOA signature at all.

Why it happens

How to fix it

  1. 1.

    Convert compact signatures before recovering

    `parseCompactSignature` plus `compactSignatureToSignature` turns the 64-byte form into the 65-byte one.

    ts
    import { compactSignatureToSignature, parseCompactSignature, recoverMessageAddress, serializeSignature, size } from "viem";
    
    const sig = size(signature) === 64
      ? serializeSignature(compactSignatureToSignature(parseCompactSignature(signature)))
      : signature;
    const signer = await recoverMessageAddress({ message, signature: sig });
  2. 2.

    Use publicClient.verifyMessage for wallets in general

    A public client verifies EOA signatures locally and smart-account signatures through ERC-1271/ERC-6492, so the same code works for every wallet type.

    ts
    import { createPublicClient, http } from "viem";
    import { mainnet } from "viem/chains";
    
    // Handles EOAs, ERC-1271 smart accounts and ERC-6492 (undeployed) accounts.
    const client = createPublicClient({ chain: mainnet, transport: http(process.env.RPC_URL) });
    const valid = await client.verifyMessage({ address, message, signature });

Related errors

Browse the full signature error database