{"id":"ERC-7677","name":"Paymaster Gas Sponsorship","status":"Review","chain":"both","category":{"id":"transaction-friction","name":"Transaction Friction","description":"Reducing clicks, signatures, and mental overhead"},"journeyStages":[{"id":"executing","name":"Executing Transactions","description":"Performing on-chain actions"},{"id":"gas","name":"Gas & Fees","description":"Paying for transactions"}],"uxImpact":"ERC-7677 defines the Paymaster Web Service Capability for EIP-5792. It describes wallet capability discovery and service RPCs such as pm_getPaymasterStubData and pm_getPaymasterData; it is not a universal paymaster contract interface and does not guarantee sponsorship.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-7677","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-7677","sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7677","type":"official-spec"}],"lastReviewed":"2026-09-18","specConstraints":[{"id":"paymaster-gas-fields","constraint":"For EntryPoint v0.7, stub data must include paymasterPostOpGasLimit because the paymaster, not the wallet, pays that post-operation cost.","appliesTo":"infrastructure","normativity":"normative","specQuote":"Furthermore, for EntryPoint v0.7, this method MUST return a value for `paymasterPostOpGasLimit`.","specSection":"Specification / Paymaster Web Service Interface / pm_getPaymasterStubData","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#pm_getpaymasterstubdata","designImplication":"Keep gas sponsorship estimates tied to the detected EntryPoint version and show when a paymaster-provided post-operation limit is part of the sponsored cost."},{"id":"sponsor-display-security","constraint":"Sponsor icons are optional data URIs and wallets must render SVG icons through an img element so untrusted JavaScript cannot execute.","appliesTo":"wallet","normativity":"normative","specQuote":"The `icon` string MUST be a data URI as defined in [RFC-2397]. The image SHOULD be a square with 96x96px minimum resolution. The image format is RECOMMENDED to be either lossless or vector based such as PNG, WebP or SVG to make the image easy to render on the wallet. Since SVG images can execute Javascript, wallets MUST render SVG images using the `<img>` tag to ensure no untrusted Javascript execution can occur.","specSection":"Specification / Paymaster Web Service Interface / pm_getPaymasterStubData","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#pm_getpaymasterstubdata","designImplication":"Treat sponsor name and icon as untrusted optional metadata, validate the URI scheme, preserve the square icon affordance when present, and use a non-executing image surface for SVG."},{"id":"entrypoint-version-fields","constraint":"Paymaster services must detect the account's EntryPoint version and return the corresponding paymaster fields.","appliesTo":"infrastructure","normativity":"normative","specQuote":"Paymaster services MUST detect which entrypoint version the account is using and return the correct fields.","specSection":"Specification / Paymaster Web Service Interface / Paymaster RPC Specifications","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#pm_getpaymasterstubdata-rpc-specification","designImplication":"Keep version detection and field validation in the integration boundary, and make unsupported EntryPoint versions fail visibly instead of showing an apparently valid sponsorship."},{"id":"paymaster-capability-disclosure","constraint":"Wallets that support app-sponsored transactions must advertise paymaster web-service communication through wallet_getCapabilities.","appliesTo":"wallet","normativity":"normative","specQuote":"MUST indicate to apps that they can communicate with paymaster web services via their response to an [EIP-5792](./eip-5792.md) `wallet_getCapabilities` call.","specSection":"Specification / paymasterService Capability / Wallet Implementation","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#wallet-implementation","designImplication":"Only present sponsored-transaction affordances when the wallet advertises support for the target chain, and explain when the capability is unavailable."},{"id":"sponsor-authority-conditional","constraint":"Wallets may choose a different sponsor, and applications must not assume that the paymaster URL supplied by the app ultimately pays the fee.","appliesTo":"application","normativity":"normative","specQuote":"Since there might be cases in which the provided paymaster is ultimately not used—either due to service failure or due to a user selecting a different, wallet-provided paymaster—applications MUST NOT assume that the paymaster it provides to a wallet is the entity that pays for transaction fees.","specSection":"Specification / paymasterService Capability / Wallet Implementation","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#wallet-implementation","designImplication":"Show sponsorship as conditional until the wallet returns final fee-path data, and label wallet-selected or fallback sponsors rather than attributing payment to the app's requested service."},{"id":"chain-id-binding","constraint":"Paymaster requests need a chain identifier so wallets and services agree which network the request is for.","appliesTo":"application","normativity":"rationale","specQuote":"we must specify some constraint so that wallets can communicate with paymaster services about which chain their requests are for.","specSection":"Rationale / Chain ID Parameter","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#chain-id-parameter","designImplication":"Keep the selected chain explicit in paymaster requests and sponsorship confirmation, and do not reuse a service response across networks without matching chain context."},{"id":"stub-data-shape","constraint":"Stub data used for preVerificationGas estimation must match final data length and not contain more zero bytes than the final data.","appliesTo":"infrastructure","normativity":"rationale","specQuote":"To avoid this scenario, a paymaster service MUST return stub data that: 1. Is of the same length as the final data. 2. Has an amount of zero bytes (`0x00`) that is less than or equal to the final data.","specSection":"Rationale / Challenges With Stub Data / preVerificationGas","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#preverificationgas","designImplication":"Keep estimation and final submission data shape-aligned, and communicate an estimation failure when the stub cannot safely stand in for final paymaster data."},{"id":"stub-code-path","constraint":"A paymaster stub must cause simulation to execute the same code path expected for the final user operation.","appliesTo":"infrastructure","normativity":"rationale","specQuote":"Therefore, a paymaster service MUST also return a stub that can result in a simulation executing the same code path compared to what is expected of the final user operation.","specSection":"Rationale / Challenges With Stub Data / Consistent Code Paths","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#consistent-code-paths","designImplication":"Do not present an estimate as reliable when stub and final data take different validation paths; retain a clear re-estimation or rejection state."},{"id":"paymaster-api-key-boundary","constraint":"Paymaster API keys should remain behind an app-controlled backend instead of being passed to wallets.","appliesTo":"application","normativity":"security-considerations","specQuote":"App developers might not want to pass these API keys along to wallets. To remedy this, we recommend that app developers provide a URL to their app's backend, which can then proxy calls to paymaster services.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#security-considerations","designImplication":"Keep provider credentials server-side, proxy only the scoped paymaster request, and show sponsorship validation or policy failures without exposing the provider secret to the wallet."},{"id":"paymaster-gas-estimation","constraint":"Wallets SHOULD use paymaster-provided gas values for UserOperation estimation.","appliesTo":"wallet","normativity":"normative","specSection":"Specification > Paymaster Web Service Interface > pmgetPaymasterStubData","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#pm_getpaymasterstubdata","designImplication":"Label paymaster-provided estimate inputs and retain a visible fallback or re-estimation state when the service does not provide them.","specQuote":"The wallet SHOULD use these provided gas values when submitting the `UserOperation` to a bundler for gas estimation."},{"id":"paymaster-early-validation","constraint":"Paymaster web services SHOULD validate incoming operations during stub-data execution and reject unsupported sponsorship early.","appliesTo":"infrastructure","normativity":"normative","specSection":"Specification > Paymaster Web Service Interface > pmgetPaymasterStubData","specUrl":"https://ercs.ethereum.org/ERCS/erc-7677#pm_getpaymasterstubdata","designImplication":"Show sponsor rejection during estimation as an explicit early failure and keep the wallet's unsponsored fallback recoverable.","specQuote":"Paymaster web services SHOULD do validations on incoming user operations during `pm_getPaymasterStubData` execution and reject the request at this stage if it would not sponsor the operation."}],"lastUpdated":"2026-09-18","summary":"ERC-7677 defines the Paymaster Web Service Capability for EIP-5792. It describes wallet capability discovery and service RPCs such as pm_getPaymasterStubData and pm_getPaymasterData; it is not a universal paymaster contract interface and does not guarantee sponsorship.","partialDeployment":{"body":"ERC-7677 is Review-stage. Treat paymasterService discovery and service RPCs as conditional on the wallet, account, chain, and service returning a compatible response; show the returned fee path and keep user-paid recovery."},"designerTakeaways":["Query the wallet's paymasterService capability for the target chain before offering sponsorship.","Show whether the wallet/service returned sponsorship data, another fee path, or no sponsor.","Keep user-paid fallback and the service's policy or quote visible in the confirmation flow."],"applicability":{"whenToUse":["The selected wallet advertises the paymasterService capability for the target chain.","The connected account, bundler, paymaster service, and network support the requested EIP-5792 call flow.","The product can show the returned sponsor, quote, alternate fee path, and user-paid fallback."],"whenToAvoid":["The wallet or target chain does not advertise the paymasterService capability.","No compatible paymaster service or account infrastructure exists for the target chain.","Regulatory constraints forbid third-party fee payment."]},"prototypeFirst":[{"screen":"Paymaster capability and quote","why":"Show sponsorship only when the wallet returns a supported paymaster service response.","covers":["Capability response","Clear fee copy"],"include":["Sponsor or fee path","Quote validity","User-paid fallback"]},{"screen":"Paymaster service unavailable","why":"ERC-7677 is a Review-stage capability and wallet/service support may be missing or declined.","covers":["No capability","Service or chain mismatch"],"include":["Plain-language reason","Fallback action"]},{"screen":"Quote or sponsorship failure","why":"A service can reject, expire, or return an alternate fee path before signing.","covers":["Quote failure","User-paid retry"],"include":["Retry path","Support context"]},{"screen":"Sponsor and fee disclosure","why":"Users need to understand who pays and which service capability produced the path.","covers":["Paymaster service","Quote and expiry","Alternate fee path"],"include":["Expandable section","Copy buttons","Explorer link"]}],"mentalModel":[{"label":"User operation","description":"The smart account builds an action the user wants. Gas cost would normally require native token in the wallet."},{"label":"Paymaster quote","description":"The wallet may use a paymaster web service and request stub/data through its service RPCs; the app cannot assume a particular paymaster contract or sponsor."},{"label":"Sponsorship decision","description":"Your fee row shows Sponsored, pay-with-token, or user-paid gas. Each path needs distinct copy and fallback."},{"label":"EntryPoint validation","description":"The bundler submits the op only if account and paymaster rules pass. Quote failures belong in product UI before sign."},{"label":"User-visible outcome","description":"Success should confirm who paid and whether sponsorship continues on the next action."}],"statesToDesign":[{"state":"Capability available","trigger":"The wallet reports paymasterService support for the target chain.","userNeed":"Know whether sponsorship is currently available.","designResponse":"Request the stub/data and show the returned sponsor, alternate fee, or user-paid path."},{"state":"Capability unavailable","trigger":"The wallet does not report paymasterService for this chain.","userNeed":"Continue without an unexplained dead end.","designResponse":"Explain that sponsorship is unavailable and offer user-paid gas or another supported path."},{"state":"Service response rejected","trigger":"The paymaster service returns an error, invalid data, or no sponsorship.","userNeed":"Know whether the action can continue and who pays.","designResponse":"Show the reason and offer a user-paid or alternate fee retry."},{"state":"Sponsored path selected","trigger":"The wallet accepts returned paymaster data and the user confirms.","userNeed":"Know the selected sponsor and resulting action.","designResponse":"Show sponsor, fee policy, expiry, and operation status separately."},{"state":"Sponsorship expired or declined","trigger":"The quote expires, policy changes, or the operation fails validation.","userNeed":"Recover without assuming the user is at fault.","designResponse":"Explain the changed fee path and offer refreshed quote, user-paid retry, or cancel."}],"designDecisions":[{"question":"How much protocol detail do users see?","recommendation":"Lead with outcomes; tuck identifiers behind review.","rationale":"Users decide on consequences, not function selectors."},{"question":"What happens when support is missing?","recommendation":"Block with explanation and fallback path.","rationale":"Silent failure feels like a broken product."},{"question":"How do you label Review-stage sponsorship?","recommendation":"Show wallet capability, service response, sponsor scope, quote expiry, and fallback before signing.","rationale":"ERC-7677 defines a service capability, not a universal sponsorship guarantee."}],"problemsSolved":[{"problem":"Wallets and paymaster services need a shared capability exchange","oldWay":"Each integration invents service discovery and quote requests","newWay":"A supporting wallet can use paymasterService and its service RPCs for a selected chain","impact":"high"},{"problem":"Users cannot tell who pays or why sponsorship is unavailable","oldWay":"A generic gas row promises free execution without a capability or service response","newWay":"The UI shows sponsor, quote, alternate fee, and user-paid fallback before signing","impact":"high"},{"problem":"Quote, service, and operation failures are easy to conflate","oldWay":"A generic sponsorship error hides whether the wallet, service, account, or chain failed","newWay":"Mapped capability, quote, validation, and fee fallback states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"Sponsored Fee Row","description":"Clear label when gas is covered by the app.","components":["FeeRow","SponsoredBadge"],"userFlow":["User initiates action","Wallet/service requests paymaster data when the paymasterService capability is available","UI shows Sponsored","User confirms the selected sponsored, pay-with-token, or user-paid path"]},{"name":"Paymaster Fallback","description":"Graceful switch when sponsorship unavailable.","components":["FallbackSelector","ReasonBanner"],"userFlow":["Paymaster rejects","UI explains why","Offers user-paid or alternate token","User continues or cancels"]}],"antiPatterns":[{"pattern":"Promising sponsorship from an empty balance","why":"Wallet and service policy can decline sponsorship or return another fee path.","instead":"Query paymasterService, show the returned quote/path, and keep a user-paid fallback.","severity":"critical"},{"pattern":"Presenting paymasterService as universal sponsorship","why":"The capability is optional and service policy can return no sponsor or another fee path","instead":"Use outcome language with wallet capability, quote, sponsor, and fallback disclosure","severity":"high"},{"pattern":"No fallback when wallet or service lacks support","why":"Review-stage capability and service availability can change per chain and request","instead":"Explain the limitation and offer user-paid gas, alternate fee, retry, or cancel","severity":"high"}],"vocabulary":[{"use":"Sponsored by [name]","avoid":"Gas is free","why":"A service or sponsor may pay under a limited policy; the action is not costless in the system."},{"use":"Sponsorship unavailable","avoid":"Paymaster broken","why":"Name the capability or service state and show a fee fallback."},{"use":"Choose fee option","avoid":"Zero cost","why":"Keep sponsor scope, alternate fee, and user-paid choices explicit."}],"technicalNotes":"ERC-7677 is the Paymaster Web Service Capability for EIP-5792. A wallet advertises paymasterService per chain and may call pm_getPaymasterStubData and pm_getPaymasterData. The wallet/service can select a sponsor, another fee path, or no sponsor; support and sponsorship remain conditional. This service layer is separate from ERC-2771 trusted forwarders and from any specific paymaster contract.","relatedStandards":[{"id":"ERC-4337","relationship":"Paymasters attach to UserOperations"},{"id":"ERC-2771","relationship":"ERC-2771 is a separate trusted-forwarder meta-transaction pattern, not a replacement for the EIP-5792 paymasterService capability."}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7677","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-7677","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7677","markdown":"https://www.eipsfordesigners.com/standards/ERC-7677/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7677/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7677","official":"https://ercs.ethereum.org/ERCS/erc-7677","discussion":"https://ethereum-magicians.org/search?q=ERC-7677"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}