---
title: "ERC-2612 Permit Binding Verifier"
method: POST
path: "/v1/tools/verify_erc2612_permit_binding"
tags: ["TODO_TAGS_REVIEW", "TODO_AP2_EXPORT_REVIEW"]
---

# ERC-2612 Permit Binding Verifier

`POST /v1/tools/verify_erc2612_permit_binding`

## Request

- Base URL: `https://ainumbers.co`
- URL: `https://ainumbers.co/v1/tools/verify_erc2612_permit_binding`
- Auth: none declared

Recomputes the EIP-712 typed-data digest for an ERC-2612 Permit struct (the gasless-approval rail used by USDC and other ERC-2612 tokens) from caller-supplied domain and message fields, recovers the ECDSA signer from a caller-supplied signature, and reports whether the recovered signer binds to the caller-claimed owner or names the diverging field. DAI's legacy permit (holder, spender, nonce, expiry, allowed) is a different struct this node does not verify. All four EIP-712 domain fields (name, version, chainId, verifyingContract) are mandatory inputs and are never defaulted or guessed -- a guessed verifyingContract would defeat domain separation. keccak256 and secp256k1 recovery come from the already-vendored, pinned noble-curves/noble-hashes bundle shared with the sibling art-590/art-591 x402 pair (no new vendoring); the EIP-712/ERC-2612 ABI encoding scheme is implemented directly as public-spec arithmetic on top of it. This node makes no claim about on-chain nonce freshness, current allowance state, or whether deadline has passed relative to now -- it states plainly what it never fetched. Zero network calls; never a facilitator, proxy, or settlement relay. Golden vectors are cross-checked against an independently re-implemented EIP-712 encoding path and real secp256k1 signatures, not round-trip self-tests alone.

**Tool URL:** https://ainumbers.co/chaingraph/art-612-erc2612-permit-binding-verifier.html

## Request body

- object
  - `chainId` unknown, required
  - `deadline` unknown, required
  - `name` unknown, required
  - `nonce` unknown, required
  - `owner` unknown, required
  - `r` unknown, required
  - `s` unknown, required
  - `signature` string, required
  - `spender` unknown, required
  - `v` unknown, required
  - `value` unknown, required
  - `verifyingContract` unknown, required
  - `version` unknown, required
  - `yParity` unknown, required

## Response `200`

Successful tool execution result

- object
  - `digest` string, nullable, required
  - `diverging_field` string, nullable, required
  - `domain` object, required
    - `chain_id` string, nullable, required
    - `name` string, nullable, required
    - `verifying_contract` string, nullable, required
    - `version` string, nullable, required
  - `domain_separator` string, nullable, required
  - `domain_typehash` string, required
  - `permit` object, required
    - `deadline` string, nullable, required
    - `nonce` string, nullable, required
    - `owner` string, nullable, required
    - `spender` string, nullable, required
    - `value` string, nullable, required
  - `permit_typehash` string, required
  - `reasons` string[], required
  - `recovered_signer` string, nullable, required
  - `recovered_signer_matches_owner` boolean, nullable, required
  - `recovery_id` number, nullable, required
  - `recovery_id_source` string, nullable, required
  - `scope_note` string, required
  - `struct_hash` string, nullable, required
  - `verdict` 'BINDS' | 'DOES_NOT_BIND' | 'INDETERMINATE', required

---

[API](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite.md) · [All operations](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/llms.txt) · [OpenAPI document](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/revisions/b462e4f5bb28?raw)
