Clear Signing vs Blind Signing: What Your Wallet Can Show

Every signature request is a decoding problem. A wallet either recognizes the structure of what it is being asked to authorize and renders the fields, or it hands you a hex string and asks you to approve it anyway. This guide separates the two, shows what an EIP-712 prompt actually displays, explains why a standard token approval carries no expiry, and gives a rule for refusing a signature you cannot read.

CoinSoso EditorialPublished Article #00060Updated

Cover artwork: CoinSoso · AI-generated, not a photograph of a real venue, product or market capture.

Key takeaways

  • Clear signing means the wallet decoded the request into named fields; blind signing means it did not.
  • eth_sign signs arbitrary bytes under a fixed prefix, so the wallet has no structure to display.
  • EIP-712 typed data can be shown as labeled fields, bound to a chain and a verifying contract, but the standard adds no replay protection.
  • A standard ERC-20 approval has a spender and an amount and no expiry field, and the amount can exceed your balance.
  • An off-chain signature costs no gas and can be submitted later by whoever holds it.

The prompt is a decoder, not a guarantee

A wallet does two things when you sign: it applies your private key to a hash, and it renders the request so you can decide. The first is mechanical and always succeeds. The second depends entirely on whether the wallet recognizes the structure of what it is being asked to sign, and whether the prompt tells you everything the signature can do is a separate question.

That gap between rendering and meaning is where blind signing lives. MetaMask’s signature-phishing page describes off-chain signatures as allowing the dapp collecting one “to use the signed message at a time of their choosing,” and notes that “transaction data is so rarely readable by humans” that a user can be told they are depositing tokens while actually granting an unlimited approval.

What each signature type puts on screen

eth_sign and raw message signing. Ethereum.org’s JSON-RPC documentation defines eth_sign as calculating a signature over keccak256("\x19Ethereum Signed Message:\n" + len(message) + message). The prefix marks the result as an Ethereum-specific message signature, and the page says this “prevents misuse where a malicious dapp can sign arbitrary data (e.g., transaction) and use the signature to impersonate the victim.” The prefix identifies the signature; it does not make the bytes interpretable. EIP-712’s motivation states the underlying problem plainly: signed messages were “an opaque hex string displayed to the user with little context about the items that make up the message.”

EIP-712 typed data. The standard encodes a struct type, a domain and a message, so a wallet that implements it can show the fields. The domain carries a name, a version, a chainId, a verifyingContract and optionally a salt; the specification says the user-agent “should refuse signing if it does not match the currently active chain” and may use the verifying contract for “contract specific phishing prevention.” It also states that the standard “does not include replay protection,” leaving it to the application to reject a repeated signature.

An ERC-20 approval. The token interface lists approve(address _spender, uint256 _value) and allowance(address _owner, address _spender), plus an Approval event. There is no deadline parameter. MetaMask’s approval prompt shows the dapp’s name and URL, offers “verify contract details” for the contract address, lets you edit the cap under “custom spending cap,” and shows the gas cost. The page warns that the cap “can and often does drastically exceed” the amount you actually hold.

Permit-style signatures. MetaMask’s approval page describes the EIP-3009 model, where you sign a permit instead of sending an approval transaction, bundling the approval and the transfer together so the approval costs no gas. The authorization then exists as a signature rather than as a stored allowance.

Request type What the wallet receives What a prompt can show What it cannot show
eth_sign / message raw bytes the bytes, or their hex, and the signing address what those bytes authorize
EIP-712 typed data types, domain, message labeled fields, domain name, chain, verifying contract whether the contract is honest, whether the signature can be replayed
ERC-20 approve recipient, spender, uint256 amount token, spender, amount, gas any expiry, because the interface has none
permit signature a typed message defined by that token whichever fields the wallet decodes the fields it does not decode

Every entry in the third and fourth columns is wallet-dependent. Check your wallet’s current prompt rather than assuming a capability.

A worked example: the same approval, decoded and raw

Take a token with 6 decimals and a balance of 250. A dapp asks for an approval of 1,000,000 tokens.

  • amount in base units = 1,000,000 × 10^6 = 1,000,000,000,000
  • the same number in hex = 0xE8D4A51000
  • zero-padded to the 32-byte argument slot = 0x000000000000000000000000000000000000000000000000000000E8D4A51000
  • full calldata = the approve selector 0x095ea7b3, then the padded spender address, then that padded amount

A wallet that decodes the call can render “allow this spender to move 1,000,000 tokens.” A wallet that does not shows a 138-character hex string in which the only readable parts are the spender’s address and an amount you have to convert by hand.

Now compare the cap with the balance:

  • 1,000,000 − 250 = 999,750 more than you hold
  • 1,000,000 ÷ 250 = 4 complete sweeps of the current balance before the allowance is used up

The allowance is a ceiling on what the spender may take, not a transfer, and it is not limited by your balance. The unlimited case is the same arithmetic at the top of the range: 2^256 − 1 = 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935, which is about 1.16 × 10^77 base units, or 1.16 × 10^71 tokens at 6 decimals. A ceiling that large will never bind.

Nothing in that approval expires. The ERC-20 interface has no deadline argument, and MetaMask’s page describes an approval as applying until the dapp has used the amount, at which point a new approval is needed. A permit signature is different: its fields are whatever the type defines, and the prompt can only show the ones your wallet decodes.

The three parts of an ERC-20 approve call and what each one lets a wallet show selector 4 bytes 0x095ea7b3 spender 32 bytes address, zero-padded amount 32 bytes 1,000,000 → 0xE8D4A51000 decoded: allow this spender to move 1,000,000 tokens raw: the same bytes as a 138-character hex string A decoder shows the fields the calldata carries, not whether the spender is the right contract.
Figure 1The three parts of an ERC-20 approve call for 1,000,000 tokens of a 6-decimal asset: a 4-byte selector, a 32-byte spender address and a 32-byte amount, the last of which is 0xE8D4A51000 padded into its slot. A wallet that decodes all three can name the spender and the amount; one that decodes none shows the same bytes as a hex string, and neither can verify that the spender is the contract you meant.

Where the naive reading goes wrong

“The prompt named the site, so the contract is the right one.” The name and URL at the top of the prompt are what the requester claims. MetaMask puts “verify contract details” next to them precisely because the label is not proof of the contract.

“A signature with no gas fee cannot move anything.” Producing an off-chain signature broadcasts nothing and costs nothing, and that is the point: whoever holds it can submit it later.

“The cap is the most I can lose.” The cap can exceed your balance, and setApprovalForAll grants control of every NFT of a given contract rather than one token amount. Read the function, not just the number.

“An unlimited approval is always an attack.” MetaMask’s approval page notes that many legitimate dapps request essentially unlimited access to avoid repeated approval transactions and their gas costs. The risk sits in the spender and the contract, and an existing approval can be revoked.

“Typed data means verified.” EIP-712 standardizes encoding and domain separation. It states that it does not include replay protection, and the domain fields only help if the wallet checks them.

What the primary sources do and do not say

Ethereum.org’s JSON-RPC page documents what eth_sign computes and asserts that the prefix prevents a class of impersonation. It does not say which wallets enable eth_sign, which block it, or what any prompt displays.

EIP-712 defines the scheme, the domain separator fields and the purpose of displaying structured data for verification. It does not mandate what a wallet must render, and it explicitly leaves replay protection to the application.

The ERC-20 page lists the interface, including approve and allowance; it defines no expiry because the interface has none. The MetaMask pages describe MetaMask’s own prompts and warnings. They say nothing about other wallets, which is why the capability, not the product, is what this article describes.

A rule for refusing a signature

  1. Name the function and every argument. If you cannot say what will be called and with which values, refuse.
  2. Check the chain and the verifying contract. A familiar site name is not a contract address.
  3. Read the approval amount and set your own cap. Assume it will not expire, and treat an amount above your balance as unlimited in practice.
  4. Treat an off-chain request as a transaction that has already been sent. It costs no gas because nothing is broadcast yet, not because nothing can happen.
  5. Revoke approvals you no longer use. The token allowance guide covers how to review and revoke them.

If the prompt is a hex blob and the wallet offers no decoded view, that is the answer to the question you are being asked: you cannot read it, so do not sign it.

How these sources were checked

Ethereum.org, “JSON-RPC API” (eth_sign), retrieved 2026-10-23. EIP-712, “Typed structured data hashing and signing,” retrieved 2026-10-23. Ethereum.org, “ERC-20 token standard,” retrieved 2026-10-23. MetaMask Help Center, “What is a token approval?”, retrieved 2026-10-23. MetaMask Help Center, “Signature phishing,” retrieved 2026-10-23.

Sources

How this was researched. Wallet guides describe how key management works in general. Where an article describes a specific product's behaviour, its sources are listed below.

Primary sources for the factual claims on this page. A date appears only where a human has actually read the source; where it is missing, the check is still outstanding.

  1. Ethereum.org — JSON-RPC API (eth_sign)(read 2026-10-23)
  2. EIP-712: Typed structured data hashing and signing(read 2026-10-23)
  3. Ethereum.org — ERC-20 token standard (approve and allowance)(read 2026-10-23)
  4. MetaMask Help Center — What is a token approval?(read 2026-10-23)
  5. MetaMask Help Center — Signature phishing(read 2026-10-23)

Frequently asked questions

What is blind signing?

Blind signing is approving a signature request whose contents your wallet cannot present as named fields. You see an address, perhaps a value, and a block of hexadecimal, and you authorize the whole thing. The signature is valid whether or not you understood it, which is why the practical rule is to refuse any request whose arguments you cannot name.

Is eth_sign the same as signing a transaction?

No. A transaction signature authorizes a specific transfer of value or a contract call and is broadcast to the network. eth_sign signs a hash of arbitrary bytes under a fixed prefix, so it can authorize a message that a contract later acts on. The Ethereum.org JSON-RPC documentation describes the prefix as marking the signature as an Ethereum-specific message signature.

Does EIP-712 make a signature safe?

It makes the request displayable. The standard defines types, a domain separator with fields such as chainId and verifyingContract, and a way for a wallet to show structured data instead of an opaque string. It does not attest that the contract is honest, and the specification states that it does not include replay protection, so the application has to reject a repeated signature.

Do token approvals expire?

A standard ERC-20 approval does not. The approve function takes a spender and a value, and the allowance remains until it is spent or revoked. MetaMask's help center describes an approval as applying until the dapp has used the amount. Permit-style signatures work differently because the authorization is the signed message itself, and its fields are defined by that type.

Can a signature with no gas fee move my tokens?

Yes, if a contract accepts it. An off-chain signature is not broadcast when you produce it, which is why it costs no gas, but whoever holds it can submit it later. MetaMask's signature-phishing page describes exactly that pattern: a signature collected now and used at a time of the attacker's choosing.

How do I know whether my wallet is clear-signing a request?

Look at the prompt. If it lists the function and each argument in named fields, the wallet recognized the type. If it shows a hex string and no named fields, it did not. Which types a given wallet decodes changes between versions, so check your wallet's current prompt rather than relying on a description of it.

Where to go next

Independent research. Each card shows the platform’s invite code, and its Create Account button is a referral link that may earn us a commission at no extra cost to you. Whether an account can be opened is decided by the platform at sign-up.

Binance

One of the largest global exchanges by traded volume, with a very broad product range.

20% Trading Fee Rebate

Use invite code con888 when signing up to enjoy trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →

OKX

A large global exchange offering spot, derivatives and a self-custody wallet.

20% Trading Fee Rebate

Enter invite code con888 when signing up to check available trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →