This draft defines an off-chain envelope that carries a prepared-but-unsigned transaction, batch, or signature request from the producer that prepared it to the consumer that signs it. Posting it here for community review first.
A producer is anything that prepares a transaction without holding keys - a relayer, DeFi UI, intent solver, multisig coordinator, hardware-wallet companion, or AI agent. A consumer is a wallet, signer, or policy engine. The envelope wraps one of three normative payload kinds - evm-tx, evm-batch, signature - with semantic metadata, producer provenance, origin verification, and a consumer-injected risk slot. Nine further kinds are reserved for forward compatibility.
The envelope composes with EIP-712, ERC-5792, and ERC-6492 (all Final) and integrates non-normatively with ERC-7730, ERC-7715, and ERC-8004 (all Draft). It redefines none of them. The wallet remains the source of truth for keys and signing. evm-batch aligns 1:1 with ERC-5792 calls, atomicRequired, and status codes, with a one-way projection to wallet_sendCalls (§8.4).
Why now
Production stacks that prepare transactions for users already ship at scale - Alchemy’s scoped CLI sessions, Coinbase AgentKit, Crossmint’s GOAT SDK, and agent-commerce extensions from Google, Visa, and Mastercard each define their own ad-hoc producer-to-wallet shape. ERC-5792 standardized calls, but not the surrounding metadata - validity windows, decoder references, counterparty labels, risk hints - that a wallet needs to render a preview a user can actually trust.
The same gap shows up in a recurring class of losses: multisig approvals whose UI diverged from on-chain effect, dormant signed transactions executing long after preparation, blind Permit signing, EIP-7702 authorization-tuple drainers, and address poisoning. Each shares one structural cause - the upstream context that would let a wallet refuse never reached the wallet. This proposal standardizes that context.
Draft
Full RFC plus four worked examples - a single transaction, a Permit2 swap, a Safe delegatecall warning, and an ERC-5792 batch:
Reference implementation - TypeScript types and zod validators, zero runtime dependencies - is published as @txkit/tx-protocol on npm. Source and the runnable examples: mono/packages/tx-protocol at main · txkit/mono · GitHub
Acknowledged input from
This draft benefited from a public exchange on the ERC-8004 thread with Tiago Merlini (@TMerlini), author of a companion proposal on on-chain input trust boundaries for ERC-8004 agents. His production deployment surfaced the consumer-to-producer resolution question in ask 3 below, and the two proposals compose cleanly at that boundary. Beyond that, this builds directly on EIP-712, ERC-5792, ERC-6492, ERC-7730, and CAIP-2 - credit to their authors.
Three things I’d value feedback on
-
Kind taxonomy. Three kinds are normative (
evm-tx,evm-batch,signature); nine are reserved (evm-userop,evm-7702,intent,psbt, and others). Is that the right cut, or shouldevm-userop/evm-7702ship normative in v0.1 rather than reserved? -
Decoder integration. Each
evm-txcarries either adecoderRefURI to an ERC-7730 descriptor or an inlineclearSigningblock for offline wallets that cannot resolve URIs (§5.7). Ledger and the ERC-7730 authors especially - is that the integration shape you want? -
Scope boundary. The envelope is deliberately one-directional: producer to consumer. The reverse path - a consumer reporting an outcome back to a producer (approved / rejected / expired, retry vs abandon) - came up in the exchange above and is currently out of scope. Should v0.1 reserve an appendix note for it, or stay silent and leave it to a companion spec?
I’ll be active in the thread this week and would rather hear hard objections now than after the PR. The ERCs PR follows once this thread can be cited as discussions-to.

