viem-error-parser
MIT License · TypeScript · Tree-Shakable

Decode Viem & Wagmi
errors effortlessly

Turn deeply-nested Viem and Wagmi error chains into clean, human-readable messages — including custom revert reasons from your own ABIs.

CInpm versionBundle sizeMIT License

Install

pnpmpnpm add viem-error-parser viem
npmnpm install viem-error-parser viem
yarnyarn add viem-error-parser viem
bunbun add viem-error-parser viem

30-second example

From error to message in one line

error-handler.ts
import { forViem } from 'viem-error-parser';

const decoder = forViem(); // ERC20/721/1155, OZ, ERC-2612 built-in

try {
  await walletClient.writeContract({ ... });
} catch (error) {
  const result = decoder.decode(error);
  console.error(result.message);
  // "ERC20InsufficientBalance(sender=0x..., balance=5n, needed=100n)"
  // or "The transaction was rejected by the user."
}

Features

Everything you need, nothing you don't

🔗

Cause Chain Traversal

Walks the deeply-nested error.cause chain and errors[] siblings. Cycle-safe via WeakSet, capped at depth 16.

🔍

Revert Data Extraction

Extracts revert data from data, rawData, returnData, output, or hex embedded in error messages.

📦

Custom ABI Decoding

Register your own contract ABIs. Get named arguments decoded via viem decodeErrorResult.

🧠

Smart Classifier

Classifies non-revert problems: user rejection, gas, network, RPC, EIP-1193 codes, and more.

⚛️

React Hook

useErrorParser hook memoises the decoder — stable across renders, zero unnecessary re-renders.

🌲

Tree-Shakable

Ships ESM + CJS + types with sideEffects: false. Import only what you need — starts at ~6 KB gzipped.

Ready to stop fighting error chains?

Add viem-error-parser and get human-readable errors in minutes.