ERC-7677: Paymaster Web Service Capability
ERC-7677 standardises the wallet ↔ paymaster handshake for ERC-4337 account abstraction. The wallet asks a paymaster service "will you sponsor this UserOperation?"; the paymaster returns sponsorship parameters (signature, deadline, fees) that the wallet then includes in the UserOp. Without 7677, every wallet had to know each paymaster's idiosyncratic API; with 7677, paymasters expose a standardised JSON-RPC method (pm_getPaymasterStubData / pm_getPaymasterData) that any 7677-compliant wallet can call.
This is the missing piece between the on-chain ERC-4337 paymaster contract and the off-chain wallet UX. It's not on-chain — the wallet queries the paymaster service over HTTPS, then submits a UserOp that the on-chain paymaster contract validates.
Required Methods (JSON-RPC, off-chain)
// Wallet → Paymaster Service
pm_getPaymasterStubData(userOp, entryPoint, chainId, context)
→ { paymaster, paymasterData, paymasterVerificationGasLimit, paymasterPostOpGasLimit }
pm_getPaymasterData(userOp, entryPoint, chainId, context)
→ { paymaster, paymasterData, paymasterVerificationGasLimit, paymasterPostOpGasLimit }Stub returns enough fake data for the wallet to estimate gas; getPaymasterData returns the real signature for execution.
The on-chain paymaster contract (separate, not part of 7677) verifies the data when the bundler submits the UserOp.
Neo Equivalent: Sponsor Relayer + Signed Gas-Budget Pattern
Neo's account abstraction story is different from Ethereum's: every Neo account is already a contract (no UserOp shape), and gas sponsorship is just a different relayer signing the transaction. The wallet UX question is the same — "will you sponsor my transaction?" — but the mechanics map to Neo's witness model.
// Wallet → Sponsor Service
sponsor_quote(transactionScript, signers, requestedFee, expirySeconds)
→ { sponsor: address, signedScript: bytes, expiresAt: number, attribution: string }
sponsor_finalize(transactionScript, signers, sponsorshipQuoteId)
→ { signedTransaction: bytes }| ERC-7677 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
pm_getPaymasterStubData (estimation) | sponsor_quote returning a price + sponsor address | Pre-signing handshake |
pm_getPaymasterData (final signature) | sponsor_finalize returning the sponsor's tx witness | Bundles sponsor signature |
paymaster contract address | Sponsor account that signs the tx as a co-signer | Sponsor's witness scope covers the system fee |
paymasterData opaque blob | Sponsor's witness in the transaction's witness array | Same affordance, native shape |
| Bundler submits UserOp | Wallet (or sponsor) submits the signed transaction | No bundler needed |
| EntryPoint validates paymaster | Network validates witnesses (consensus rule) | No application-level validation |
Why The Neo Story is Simpler
Ethereum's ERC-4337 separates "the user's signature" from "the paymaster's signature" because EOAs can only sign one transaction at a time. Neo transactions natively support multiple signers with different witness scopes, so adding a sponsor's signature is just "add another signer with a Global witness scope and let them sign". No EntryPoint contract, no bundler, no UserOp envelope.
The 7677 web-service surface still applies: sponsor services need a way to quote and sign sponsorships, and wallets need a uniform API to ask. The mirror page formalises that shape for Neo without inventing on-chain machinery.
Composition
- ERC-4337 — account abstraction. ERC-7677 fills in the paymaster handshake on top.
- ERC-2771 — trusted forwarder. Neo's witness model already covers the gasless meta-tx case; sponsorship is a strict superset (sponsor pays GAS, not just relays).
- ERC-3009 — transfer with authorization. Off-chain signed authorization for token transfers, often paired with sponsor- paid relays.
Reference Sponsor Service Shape
// HTTP POST /sponsor/quote
// body: { script: hex, signers: [...], maxFee: int, expirySeconds: int }
// response: { quoteId, sponsorAddress, sponsorWitness, totalFee }
//
// HTTP POST /sponsor/finalize
// body: { quoteId, walletWitness }
// response: { signedTransaction: hex }
//
// Wallet flow:
// 1. Build script for the user's intended action.
// 2. Compute attached signers (user + sponsor).
// 3. POST to /sponsor/quote → receive sponsor signature stub.
// 4. Sign the transaction with the user's key.
// 5. POST to /sponsor/finalize with the user signature.
// 6. Broadcast the fully-signed transaction.The sponsor service is the off-chain equivalent of an Ethereum paymaster operator. The on-chain footprint is zero new contracts — sponsorship rides on Neo's native witness model.
