---
title: "ERC-4337 UserOperation debugger and paymaster decoder"
canonical: https://wavect.io/tools/erc-4337-useroperation-debugger/
language: en
description: "Decode ERC-4337 UserOperations, packed handleOps calldata, paymasterAndData, and EntryPoint errors for v0.6 through v0.9 entirely in your browser."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

BROWSER-LOCAL ERC-4337 DIAGNOSTICS

# Open the UserOperation before another opaque bundler error sends you spelunking.

Paste JSON, a JSON-RPC envelope, handleOps calldata, or revert data. The doctor separates packed fields, explains AA errors, validates version boundaries, and produces a request you can reproduce yourself.

[Open the doctor](#tool-app) [View source](https://github.com/wavect/erc-4337-useroperation-debugger)

- EntryPoint v0.6 · v0.7 · v0.8 · v0.9
- Inputs JSON · calldata · revert
- Hashing Legacy · packed · EIP-712
- Network No RPC or wallet calls

**USEROP DOCTOR**

ENTRYPOINT v0.9 · CHAIN 1 **paymasterSignature: 65B**

Shape valid · external state not checked

THE USEFUL PART

The doctor turns one opaque object into inspectable fields and a reproducible request. It distinguishes malformed local data from conclusions that require a bundler or on-chain state, and it never sends the operation anywhere.

INSPECT THE ACTUAL OPERATION

## UserOperation doctor

Confirm the EntryPoint version, address, and chain before treating a calculated hash as authoritative. Structural decoding can start immediately.

Nothing is submitted

**ERC-4337 field microscope** Version-aware · browser-local · read-only

Load sample Analyze

EntryPoint versionDetect shapev0.6v0.7v0.8v0.9 Chain ID EntryPoint address

01

### UserOperation, RPC envelope, calldata, or revert

Waiting for input

### Optional account ABI for callData

02

### Deterministic findings

Not analyzed

Analyze the sample or paste your own operation to separate local shape errors from checks that need external state.

03

### Packed anatomy and exports

Decoded fields, byte segments, and a reproducible RPC request appear here.

### Reproduction RPC request

Parsing and hashing stay local No chain or bundler requests Never paste private keys

FROM BLOB TO REPRODUCTION

## Debug the representation before debugging the chain

Many integration failures can be isolated without sending another request or opening a block explorer.

1. 01 - **Paste the failing artifact** - Use the exact UserOperation, RPC envelope, handleOps calldata, or nested revert returned by the bundler.
2. 02 - **Confirm version and domain** - Choose the EntryPoint generation and verify its address and chain ID before relying on a hash.
3. 03 - **Export the reproduction** - Copy normalized fields, a request body, cURL command, or Markdown report into the issue or test that owns the failure.

ACCOUNT ABSTRACTION IN PRODUCTION

## Built for the boundary where wallet, bundler, paymaster, and EntryPoint disagree

Wavect shipped account-abstraction infrastructure and MetaMask integrations against live, partially documented systems. The fastest debugging move is often to freeze the exact representation and prove which layer changed it.

### Version-aware hashing

v0.6 legacy packing, v0.7 packed hashing, and v0.8 or v0.9 EIP-712 domains are kept separate instead of hidden behind one optimistic button.

### Paymaster suffix inspection

v0.9 signature length and magic bytes are separated from signed paymaster data so parallel signing failures are visible.

### External state stays external

The doctor labels checks that require code, nonce state, delegation, deposits, policy, simulation, or signature-specific account logic.

HONEST LIMITS

## A decoder is not a bundler simulation

- The tool validates representation and deterministic hashing. It does not execute validateUserOp, account callData, paymaster policy, or postOp.
- EIP-7702 UserOperation hashing depends on the delegation address. The doctor will not fabricate that state from an incomplete input.
- Account signatures and custom callData can be interpreted only when their scheme or ABI is supplied. A 65-byte value is not proof that a signature is valid.
- Official EntryPoint addresses are convenient defaults. Verify the address and deployed code for the network you are actually using.

## Questions about the UserOperation doctor

### Does the debugger call my bundler or chain?

No. It performs JSON parsing, ABI decoding, packing, and hashing locally. The generated RPC request is text for you to review and run yourself.

### Which EntryPoint versions are supported?

v0.6, v0.7, v0.8, and v0.9. Structural shape can sometimes be inferred, but you must confirm the version before the tool presents a hash as authoritative.

### Can it decode paymasterAndData?

Yes. It separates the paymaster address, verification and postOp gas limits, paymaster data, and the optional v0.9 paymaster signature suffix.

### Why will it not calculate my EIP-7702 hash?

The EntryPoint hash includes the current delegation target. If that state or a complete authorization is absent, a local-only tool cannot produce an authoritative value without guessing.

FREE · OPEN SOURCE · READ-ONLY

## Freeze the UserOperation, split the fields, and give the failure a reproducible shape.

Use the doctor locally, then take the normalized request and findings to the layer that actually failed.

[Return to the doctor](#tool-app) [View the source](https://github.com/wavect/erc-4337-useroperation-debugger)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/tools/erc-4337-useroperation-debugger/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-05",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-05",
      "url": "https://wavect.io/tools/erc-4337-useroperation-debugger/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "applicationCategory": "DeveloperApplication",
  "browserRequirements": "JavaScript and Web Crypto capable browser",
  "codeRepository": "https://github.com/wavect/erc-4337-useroperation-debugger",
  "description": "Decode ERC-4337 UserOperations, packed handleOps calldata, paymasterAndData, and EntryPoint errors for v0.6 through v0.9 entirely in your browser.",
  "isAccessibleForFree": true,
  "name": "ERC-4337 UserOperation Debugger",
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "EUR"
  },
  "operatingSystem": "Any modern browser",
  "url": "https://wavect.io/tools/erc-4337-useroperation-debugger/"
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/",
      "name": "Home",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/tools/",
      "name": "Small tools for jobs that should not stay annoying.",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/tools/erc-4337-useroperation-debugger/",
      "name": "ERC-4337 UserOperation Debugger",
      "position": 3
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. It performs JSON parsing, ABI decoding, packing, and hashing locally. The generated RPC request is text for you to review and run yourself."
      },
      "name": "Does the debugger call my bundler or chain?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "v0.6, v0.7, v0.8, and v0.9. Structural shape can sometimes be inferred, but you must confirm the version before the tool presents a hash as authoritative."
      },
      "name": "Which EntryPoint versions are supported?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes. It separates the paymaster address, verification and postOp gas limits, paymaster data, and the optional v0.9 paymaster signature suffix."
      },
      "name": "Can it decode paymasterAndData?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The EntryPoint hash includes the current delegation target. If that state or a complete authorization is absent, a local-only tool cannot produce an authoritative value without guessing."
      },
      "name": "Why will it not calculate my EIP-7702 hash?"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
