Workspace IndexDev Notes › Gasless is two infrastructure services

#35PoC

Gasless is two infrastructure services

An ERC-4337 user operation can be valid on-chain and still be rejected by a bundler or denied by a paymaster. "Gasless" is therefore an availability and policy promise, not a wallet property.

Send the same UserOperation through two bundlers under two sponsorship policies, classify every failure separately — RPC compatibility, simulation, reputation policy, quota, expired sponsorship, paymaster deposit, inclusion timeout, execution revert — then retry unsponsored with user funds.

Why

Bundlers pay gas up front and paymasters remain liable even when execution fails, so both apply local risk controls. The application must expose those service decisions instead of rendering every rejection as "transaction failed."

An ERC-4337 smart account does not send a normal transaction. A bundler simulates and submits its UserOperation, and a paymaster may decide to sponsor the gas. Both services can reject an operation that the EntryPoint contract would accept.

How it works

Send the same UserOperation through two bundlers and two sponsorship policies; classify simulation, policy, quota, deposit, inclusion, and execution failures; and define a user-funded fallback.

PoC

Send the same UserOperation to two bundlers under two paymaster policies. Record failures separately for RPC compatibility, simulation, reputation policy, quota, expired sponsorship, insufficient paymaster deposit, inclusion timeout, and execution revert. Then retry without sponsorship using user funds.

What it proves

"Gasless" is an application promise assembled from two off-chain services and one on-chain contract. Portability means more than changing an endpoint: error classification, EntryPoint version, sponsorship data, and fallback funding must also work.

References: ERC-4337 bundlers, paymaster security.

Review clarification

Validity is not availability

The EntryPoint contract is the only trustless party in this stack: give it a well-formed UserOperation and it will accept it. But between the user and the EntryPoint stand two services that each spend their own money before they are sure — the bundler fronts the gas to land the bundle, and the paymaster stays liable even if the call reverts. Because they pay before they know, they run local risk controls, and either can refuse an operation the chain would have accepted. So "gasless" is an availability-and-policy claim, not a wallet property — the same shape as rpc-view-not-consensus (an RPC answer is one node's view, not consensus) and receipt-is-not-settlement (a success response is not money moved). This is the account-abstraction member of that family: the happy path hides a service decision.

Follow the money — why each service rejects

Every failure class maps to one of the two services protecting its capital, or to the contract itself:

Failure Who raises it What it is protecting
RPC compatibility bundler does it even speak your EntryPoint version
Simulation bundler validation must not touch banned opcodes / others' storage (anti-griefing)
Reputation / throttling bundler ERC-7562: accounts/paymasters that waste simulations get throttled or banned
Inclusion timeout bundler simulated fine, never landed
Policy paymaster will I sponsor this caller / action
Quota paymaster you have spent your allowance
Expired sponsorship paymaster the signed sponsorship data timed out
Insufficient deposit paymaster it is broke or under-staked in the EntryPoint
Execution revert EntryPoint validation passed, the actual call failed

The griefing rules in the reference are the why behind the why: reputation and simulation exist because a malicious account can make a bundler burn gas on ops that pass validation then behave differently. The taxonomy is the surface of that adversarial design, not bureaucracy.

The taxonomy is the deliverable, because the classes demand opposite responses

Eight causes currently collapse into one useless "transaction failed" — yet the correct reaction is different, sometimes opposite, for each:

Failure Correct response
Quota / deposit exhausted fall back to user-funded
Expired sponsorship re-request a signature, retry sponsored
Reputation ban switch bundler
Inclusion timeout resubmit, possibly another bundler
Execution revert stop — retrying is pointless and, unsponsored, costs the user real gas

This is the same retry-classification discipline as x402-settlement-retry, and the fallback state machine it implies — survive, retry the right way, wait, and stay visible — is exactly what temporal-durable-execution is for.

Portability is the sharp business point — and EntryPoint version is the trap

"Send the same UserOperation through two bundlers" sounds like an endpoint swap; it is not. EntryPoint v0.6 vs v0.7/0.8 changed the UserOp struct and the paymasterAndData layout, so the "same" op is not byte-identical across stacks. Sponsorship-data format, error codes, and the fallback funding path all differ per provider. Multi-bundler resilience is therefore real engineering, and a gasless product that cannot degrade or switch providers has a single point of failure it is not advertising.

The fallback is a UX confession

"Retry unsponsored with user funds" quietly admits gasless is best-effort. That is the honest design — but it means the account must actually hold a gas asset for the degraded path, and the app must decide when to spend the user's own money without a fresh consent. Silently switching from sponsored to user-paid is a policy decision a user might want to veto — which is where this card touches embedded-wallet-policy and agentic-intent-veto.

← All Dev Notes · Workspace Index · Top ↑

가스리스는 두 개의 인프라 서비스다

ERC-4337 UserOperation 은 온체인에서는 유효해도 번들러에게 거절되거나 페이마스터에게 거부될 수 있습니다. 그러므로 "가스리스"는 지갑의 속성이 아니라 가용성과 정책의 약속입니다.

같은 UserOperation 을 두 번들러, 두 스폰서십 정책으로 보내고, 실패를 전부 따로 분류합니다 — RPC 호환성, 시뮬레이션, 평판 정책, 할당량, 만료된 스폰서십, 페이마스터 예치금, 포함 타임아웃, 실행 revert. 그다음 후원 없이 사용자 자금으로 재시도합니다.

번들러는 가스를 선지불하고 페이마스터는 실행이 실패해도 책임을 지므로, 둘 다 자체 리스크 통제를 적용합니다. 애플리케이션은 모든 거절을 "트랜잭션 실패"로 뭉뚱그리지 말고 그 서비스들의 결정을 드러내야 합니다.

ERC-4337 스마트 계정은 일반 트랜잭션을 보내지 않습니다. 번들러가 UserOperation 을 시뮬레이션하고 제출하며, 페이마스터가 가스비 후원 여부를 결정할 수 있습니다. EntryPoint 컨트랙트가 받아들일 동작도 이 두 서비스가 거절할 수 있습니다.

동작 방식

같은 UserOperation 을 두 번들러와 두 스폰서십 정책으로 보내고, 시뮬레이션·정책·할당량·예치금·포함·실행 실패를 분류하며, 사용자 자금 fallback 을 정의합니다.

PoC

같은 UserOperation 을 두 번들러에 보내고 두 가지 페이마스터 정책을 적용합니다. RPC 호환성, 시뮬레이션, 평판 정책, 할당량, 만료된 스폰서십, 부족한 페이마스터 예치금, 포함 타임아웃, 실행 revert 를 서로 다른 실패로 기록합니다. 그다음 후원 없이 사용자 자금으로 재시도합니다.

무엇을 증명하나

"가스리스"는 두 오프체인 서비스와 하나의 온체인 컨트랙트로 조립된 애플리케이션 약속입니다. 이식성은 엔드포인트만 바꾸는 것이 아닙니다: 오류 분류, EntryPoint 버전, 스폰서십 데이터, 대체 자금 경로까지 함께 동작해야 합니다.

참고: ERC-4337 bundlers, paymaster security.

검토 후 보완

유효성은 가용성이 아니다

이 스택에서 유일하게 신뢰가 필요 없는 당사자는 EntryPoint 컨트랙트입니다 — 잘 만든 UserOperation 을 주면 받아들입니다. 하지만 사용자와 EntryPoint 사이에 자기 돈을 먼저 쓰는 두 서비스가 있습니다. 번들러는 번들을 올리려 가스를 선지불하고, 페이마스터는 호출이 revert 돼도 책임을 집니다. 확신 전에 지불하므로 로컬 리스크 통제를 걸고, 둘 중 누구든 체인이 받아줬을 op 를 거부할 수 있습니다. 그래서 "가스리스"는 지갑의 속성이 아니라 가용성·정책 주장입니다 — rpc-view-not-consensus(RPC 응답은 노드 하나의 관점), receipt-is-not-settlement(성공 응답이 곧 송금은 아님)과 같은 계열, 그 계정 추상화 버전입니다. 해피 패스가 서비스 결정을 숨깁니다.

돈을 따라가라 — 왜 각 서비스가 거부하나

모든 실패 유형은 두 서비스가 자본을 지키는 행위, 또는 컨트랙트 자체로 매핑됩니다:

실패 누가 일으키나 무엇을 지키나
RPC 호환 번들러 당신 EntryPoint 버전을 말하기는 하나
시뮬레이션 번들러 검증은 금지 opcode·타 계정 스토리지 금지(그리핑 방지)
평판/스로틀링 번들러 ERC-7562: 시뮬 낭비하는 계정/페이마스터는 스로틀·밴
포함 타임아웃 번들러 시뮬은 통과, 안 올라감
정책 페이마스터 이 호출자/행위를 후원할까
할당량 페이마스터 한도 소진
만료된 후원 페이마스터 서명된 후원 데이터 시간 초과
예치금 부족 페이마스터 EntryPoint 예치·스테이크 부족
실행 revert EntryPoint 검증 통과, 실제 호출 실패

레퍼런스의 그리핑 규칙이 이유의 이유입니다 — 평판·시뮬레이션은 악성 계정이 번들러에게 헛가스를 태우게 만들 수 있어서 존재합니다. 분류표는 요식이 아니라 그 적대적 설계의 표면입니다.

진짜 산출물은 분류표다 — 유형마다 대응이 정반대이기 때문

여덟 원인이 지금은 쓸모없는 "transaction failed" 하나로 뭉개지지만, 올바른 반응은 유형마다 다르고 때로는 정반대입니다:

실패 올바른 대응
할당량/예치금 소진 사용자 자금 폴백
만료된 후원 서명 재요청 후 후원 재시도
평판 밴 번들러 교체
포함 타임아웃 재제출, 필요 시 다른 번들러
실행 revert 중단 — 재시도는 무의미, 비후원이면 사용자 실제 가스만 태움

x402-settlement-retry 의 재시도 분류 규율과 같고, 이때 필요한 폴백 상태기계 — 생존, 올바른 방식의 재시도, 대기, 가시성 유지 — 가 바로 temporal-durable-execution 이 다루는 것입니다.

이식성이 날카로운 사업 포인트 — 그리고 EntryPoint 버전이 함정

"같은 UserOperation 을 두 번들러로"는 엔드포인트 교체처럼 들리지만 아닙니다. EntryPoint v0.6 대 v0.7/0.8 은 UserOp 구조와 paymasterAndData 레이아웃이 달라, "같은" op 가 스택 간 바이트 동일이 아닙니다. 후원 데이터 포맷·에러 코드·폴백 자금 경로도 제공자마다 다릅니다. 그래서 멀티 번들러 복원력은 진짜 엔지니어링이고, 열화나 제공자 전환을 못 하는 가스리스 제품은 광고하지 않는 단일 장애점을 안고 있습니다.

폴백은 UX 의 고백

"비후원으로 사용자 자금 재시도"는 가스리스가 최선노력(best-effort)임을 조용히 인정합니다. 정직한 설계지만 — 계정이 열화 경로용 가스 자산을 실제로 보유해야 하고, 앱은 새 동의 없이 사용자 돈을 언제 쓸지 정해야 합니다. 후원→사용자 지불로의 무단 전환은 사용자가 거부(veto)하고 싶을 정책 결정입니다 — 이 카드가 embedded-wallet-policyagentic-intent-veto 에 닿는 지점입니다.

← 전체 개발 노트 · 워크스페이스 인덱스 · 맨 위 ↑