{"id":"EIP-7702","name":"Set Code for EOAs","status":"Final","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"}],"uxImpact":"EOAs gain smart contract capabilities without migrating to new wallets — users keep existing addresses. Design implications: enable transaction batching UI (approve+swap in one click), show sponsored transaction options where dApps pay gas, add session key management for limited permissions (e.g., 'allow spending up to $100/day'). Design decisions: balance power vs complexity — advanced features need progressive disclosure, must clearly distinguish temporary delegations from permanent changes, consider how to surface 'who's paying for this' when sponsors are involved. 🟢 LIVE on mainnet — 9 wallets, 12.9M accounts, 117M authorizations. Bridges from EOAs to smart accounts while native AA (EIP-8141) is in draft. Addresses Gas Hurdle (Critical), Key Management (High), and Protocol Design sections.","hasDetailedContent":true,"content":{"id":"EIP-7702","summary":"EIP-7702 lets existing wallets temporarily act like smart wallets. Users keep their address but gain batching, sponsored gas, and session keys. It is the bridge that brings smart wallet UX to everyone without forcing migration.","designerTakeaways":["You can combine approve + swap into one confirmation instead of stacked wallet popups.","Your onboarding can sponsor the first transaction so new users never need ETH upfront.","Games can use a one-time permission screen, then play without a signature on every action."],"applicability":{"whenToUse":["Existing EOAs need batching, sponsorship, or session keys without a new address.","You want one signature for approve + action flows on supported networks.","Games or apps need low-friction repeat actions after an upfront authorization."],"whenToAvoid":["The wallet or chain does not support 7702-style delegation yet.","A full smart account (ERC-4337) already covers your requirements with clearer status UX.","Users only perform single low-risk transfers where delegation adds confusion."]},"designDecisions":[{"question":"When do you ask users to enable smart features?","recommendation":"Offer upgrade after value is clear, not as a gate on first connect.","rationale":"Forced delegation at onboarding creates drop-off before users see benefit."},{"question":"How do you preview batched actions?","recommendation":"Show every step with outcomes before one signature.","rationale":"Hidden batch steps feel like blind signing when something unexpected executes."},{"question":"What limits apply to session keys?","recommendation":"Require spend cap, allowed actions, and expiration with a revoke-all control.","rationale":"Unbounded session keys turn a game UX bug into a full wallet drain."},{"question":"How do you label sponsorship?","recommendation":"Use honest \"Sponsored\" copy and state when the user will pay gas again.","rationale":"Surprise fees after \"free\" transactions break trust on the next action."}],"statesToDesign":[{"state":"Delegation not enabled","trigger":"EOA has not authorized 7702 code for this session.","userNeed":"Understand optional upgrade path.","designResponse":"Benefit-led CTA; keep core flows working without delegation."},{"state":"Batch preview","trigger":"User initiates multi-step action.","userNeed":"See all consequences in order.","designResponse":"Checklist of steps with combined outcome before sign."},{"state":"Session active","trigger":"Session key authorized within limits.","userNeed":"Know what the app can still do without prompts.","designResponse":"Session badge with limits, expiry, and revoke in settings."},{"state":"Sponsored gas","trigger":"Paymaster or sponsor covers fees.","userNeed":"Know cost is covered now and later.","designResponse":"Sponsored label on fee row; note when user-paid gas returns."},{"state":"Delegation revoked","trigger":"User revokes session or delegation expires.","userNeed":"Confirm the app can no longer act silently.","designResponse":"Toast plus return to per-action signatures."}],"mentalModel":[{"label":"Existing EOA","description":"The user keeps the same address and seed phrase. Delegation adds capabilities without migration or a new receive address."},{"label":"Delegation code","description":"A type-0x04 transaction temporarily attaches smart wallet logic to the EOA. Your UI explains this as \"enable smart features,\" not delegate or authorization."},{"label":"Batched execution","description":"Multiple contract calls run in one atomic sequence after a single signature. Preview every step before the wallet prompt."},{"label":"Session keys","description":"A scoped permission lets the app act within spend and time limits without per-action popups. Always show limits and a revoke path."},{"label":"Gas sponsorship","description":"A paymaster or sponsor can cover fees for the delegated transaction. Label sponsored fees honestly and note when the user pays again."}],"problemsSolved":[{"problem":"Users must sign every transaction individually","oldWay":"Approve token, wait, confirm, swap, wait, confirm (multiple popups)","newWay":"Sign once, all steps execute atomically","impact":"critical"},{"problem":"New users need ETH before they can do anything","oldWay":"Buy ETH on exchange, transfer to wallet, wait, then interact","newWay":"App sponsors first transaction, user starts immediately","impact":"critical"},{"problem":"Games interrupted by constant signature requests","oldWay":"Sign for every sword swing, every loot pickup","newWay":"Session key pre-authorized for game actions","impact":"high"},{"problem":"Switching to smart wallet means new address","oldWay":"Deploy new contract wallet, transfer all assets, update everywhere","newWay":"Same address gains smart wallet powers instantly","impact":"high"},{"problem":"Complex DeFi operations require multiple transactions","oldWay":"Unstake, claim rewards, swap, restake (4 separate transactions)","newWay":"One batched transaction does everything","impact":"medium"}],"uxPatterns":[{"name":"One-Click Multi-Step","description":"Combine approve and action into a single user interaction.","mockup":"one-click-swap","components":["Batch preview","Step checklist","One-click button"],"userFlow":["User enters swap amount","UI shows combined preview of all steps","Single Swap button click","Wallet shows single signature request","All steps execute atomically","Success state shown"]},{"name":"Sponsored First Transaction","description":"New users transact without holding ETH.","mockup":"sponsored-claim","components":["Sponsored badge","Gas display","Claim button"],"userFlow":["New user connects wallet","App detects empty wallet (no ETH)","Shows Sponsored badge on gas fee","User clicks claim","App paymaster covers gas","User receives NFT without spending anything"]},{"name":"Session Keys for Gaming","description":"Pre-authorize game actions without per-action signatures.","mockup":"session-permissions","components":["Permission checklist","Time limit","Spend limit"],"userFlow":["User starts game","Permission selection UI shown","User configures limits","Single signature creates session key","Game plays without interruption","Session auto-expires"]}],"seenInTheWild":[{"app":"MetaMask","url":"https://metamask.io/","note":"Supports EIP-7702 delegation for batch transactions and smart account features on supported networks."},{"app":"Ambire Wallet","url":"https://www.ambire.com/","note":"Uses 7702-style delegation to batch approve + swap flows behind a single signature."},{"app":"Biconomy","url":"https://www.biconomy.io/","note":"SDK layer for gas sponsorship and batched calls that pairs with 7702-enabled accounts."},{"app":"Coinbase Smart Wallet","url":"https://www.coinbase.com/wallet/smart-wallet","note":"Smart account flows with sponsored first transactions and batched operations for new users."}],"antiPatterns":[{"pattern":"Forcing users to enable 7702 before basic actions","why":"Creates friction at worst moment (new user onboarding)","instead":"Make it optional, show benefits, let them upgrade later","severity":"critical"},{"pattern":"Hiding what batch transaction will do","why":"Users sign blind, lose trust if something unexpected happens","instead":"Show clear preview of ALL steps before signing","severity":"critical"},{"pattern":"Session keys with no limits","why":"Compromised session key drains wallet","instead":"Require spend limits and expiration times","severity":"critical"},{"pattern":"No way to revoke session keys","why":"Users feel trapped, cannot secure their account","instead":"Prominent Revoke All Sessions button in settings","severity":"high"},{"pattern":"Using technical terms like \"delegate\" or \"authorization\"","why":"Users do not understand what they are agreeing to","instead":"Say \"Enable smart features\" or \"Start gaming session\"","severity":"high"},{"pattern":"Not showing sponsored gas clearly","why":"Users confused when gas suddenly costs money","instead":"Show Sponsored badge AND explain when sponsorship ends","severity":"medium"}],"onMonad":[{"aspect":"Reserve Balance","ethereum":"Delegated code can spend entire balance","monad":"Delegated accounts enforce 10 MON reserve strictly","designImplication":"Show spendable balance vs total balance; delegated wallets have stricter constraints"},{"aspect":"Transaction Speed","ethereum":"Batch transactions may take 15+ seconds","monad":"Sub-second finality for all operations","designImplication":"Show real-time feedback, skip waiting states"},{"aspect":"Gas Costs","ethereum":"Batching saves ~21k gas per eliminated tx","monad":"Already cheap, savings less dramatic","designImplication":"Emphasize convenience over cost savings"}],"technicalNotes":"EIP-7702 adds a new transaction type (0x04) that sets an EOA's code to point to a contract. The EOA can then execute the contract's logic while maintaining its address. Delegation is per-transaction and explicitly authorized. Works with ERC-4337 paymasters for gas sponsorship."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-7702","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-7702","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-7702","markdown":"https://www.eipsfordesigners.com/standards/EIP-7702/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-7702/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-7702","official":"https://eips.ethereum.org/EIPS/eip-7702","discussion":"https://ethereum-magicians.org/search?q=EIP-7702"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}