{"id":"ERC-7715","name":"Session Keys","status":"Draft","chain":"both","category":{"id":"transaction-friction","name":"Transaction Friction","description":"Reducing clicks, signatures, and mental overhead"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"},{"id":"executing","name":"Executing Transactions","description":"Performing on-chain actions"}],"uxImpact":"Users pre-authorize a scope of actions so they don't sign every interaction — 'approve once, interact freely' for gaming, trading, and social apps. Design implications: design session key creation flows with clear scope display (which actions, spending limits, duration), show active session indicators, add session revocation UI, display remaining session budget/time. Design decisions: balance between permissiveness (fewer prompts) and security (tighter scopes), how to visualize session boundaries to users, whether to auto-expire sessions or require manual revocation. Primary solution to Signing Fatigue (High severity). MetaMask Delegation Toolkit and Viem implementing.","hasDetailedContent":true,"content":{"id":"ERC-7715","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7715","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Users pre-authorize a scope of actions so they don't sign every interaction — 'approve once, interact freely' for gaming, trading, and social apps.","designerTakeaways":["You can show session scope as a plain-language permission card before approval.","Your app can display active session badge with remaining budget and time.","You can offer one-tap revoke-all in settings for peace of mind."],"applicability":{"whenToUse":["High-frequency interactions cause signing fatigue.","Actions fit clear scopes like in-game moves or limit orders.","Users understand upfront what the app can do without prompts."],"whenToAvoid":["Every action is high-value and needs individual confirmation.","Wallet or chain lacks session key support.","Scopes cannot be explained simply to non-technical users."]},"prototypeFirst":[{"screen":"Primary happy path","why":"Prove the core user promise before edge cases.","covers":["Success state","Clear outcome copy"],"include":["Primary CTA","Confirmation feedback","Next step"]},{"screen":"Blocked or unsupported state","why":"Users discover limits when wallets or chains lack support.","covers":["Unsupported wallet","Wrong network"],"include":["Plain-language reason","Fallback action"]},{"screen":"Failure recovery","why":"Trust breaks when errors look like bugs.","covers":["User rejection","Transaction revert"],"include":["Retry path","Support context"]},{"screen":"Advanced disclosure","why":"Power users need technical detail without cluttering the default path.","covers":["Contract address","Token ID","Raw status"],"include":["Expandable section","Copy buttons","Explorer link"]}],"mentalModel":[{"label":"Scope request","description":"The app asks for a bounded permission: allowed actions, spend cap, and duration. Frame it like app permissions, not cryptographic jargon."},{"label":"User approval","description":"One signature creates a session key within those limits. The permission card must list every capability in plain language."},{"label":"Silent actions","description":"Within scope, the app executes without per-action wallet popups. Show an active session badge so silent actions never feel hidden."},{"label":"Limit enforcement","description":"When spend or time limits are hit, the app must re-prompt or stop. Never let the UI imply unlimited authority."},{"label":"Revoke","description":"Users can end the session from settings or the badge. Revoke all should be one tap for peace of mind."}],"statesToDesign":[{"state":"Ready","trigger":"Prerequisites met.","userNeed":"Understand what happens next.","designResponse":"Enable primary action with plain-language preview."},{"state":"Awaiting signature","trigger":"Wallet prompt open.","userNeed":"Know what they are approving.","designResponse":"Mirror human-readable summary in app and wallet."},{"state":"Pending","trigger":"Transaction submitted.","userNeed":"Confidence it is progressing.","designResponse":"Show status strip with explorer link."},{"state":"Succeeded","trigger":"On-chain confirmation.","userNeed":"See updated ownership or balance.","designResponse":"Celebrate outcome and show new state clearly."},{"state":"Failed or reverted","trigger":"Validation or execution failed.","userNeed":"Fix or retry without guessing.","designResponse":"Name the failed constraint and offer a concrete next step."}],"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 restricted assets?","recommendation":"Use persistent badges for non-transferable, locked, or expiring states.","rationale":"Hidden restrictions cause rage-quits at transfer time."}],"problemsSolved":[{"problem":"Inconsistent behavior across apps","oldWay":"Each team reinvents copy and edge cases","newWay":"Shared standard gives predictable UX patterns","impact":"high"},{"problem":"Users surprised by on-chain rules","oldWay":"Generic transfer UI fails at submit time","newWay":"Standard-aware UI sets expectations upfront","impact":"high"},{"problem":"Support burden from opaque errors","oldWay":"Raw revert reasons in toasts","newWay":"Mapped states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"Session Permission Card","description":"Plain-language scope before one-time approval.","mockup":"concept/permit-approval","components":["ScopeList","SpendCap","ExpiryTimer"],"userFlow":["App requests session","User reviews scope","Approves once","Actions proceed silently within limits"]},{"name":"Active Session Badge","description":"Persistent indicator of ongoing authorization.","mockup":"eip-7702/session-permissions","components":["SessionBadge","RevokeButton"],"userFlow":["Session active","Badge shows limits","User can revoke anytime","App returns to per-action signing"]}],"seenInTheWild":[{"app":"MetaMask Delegation Toolkit","url":"https://docs.metamask.io/delegation-toolkit/","note":"Session key implementation reference for wallet teams."},{"app":"Viem","url":"https://viem.sh/","note":"Developer tooling for session permission patterns."},{"app":"Parallel","url":"https://parallel.life/","note":"Games benefit from reduced signing friction during gameplay."}],"antiPatterns":[{"pattern":"Hiding standard-imposed restrictions until submit","why":"Users feel tricked when actions fail at the last step","instead":"Show eligibility and badges before the primary CTA","severity":"critical"},{"pattern":"Protocol jargon in user-facing copy","why":"Non-technical users cannot consent informedly","instead":"Use outcome language with optional technical disclosure","severity":"high"},{"pattern":"No fallback when wallet lacks support","why":"Dead-end flows increase churn","instead":"Explain limitation and offer alternate path or network","severity":"high"}],"vocabulary":[{"use":"Your balance / Your item","avoid":"Token ID / Token contract","why":"Ownership language matches mental models."},{"use":"Cannot transfer yet","avoid":"Transfer reverted","why":"Explain restriction without EVM vocabulary."},{"use":"Confirm in wallet","avoid":"Sign transaction","why":"Matches wallet UX users already know."}],"onMonad":[{"aspect":"Confirmation speed","ethereum":"Multi-step flows can feel slow between signatures","monad":"Sub-second finality tightens feedback loops","designImplication":"Prefer inline status over long pending modals on Monad."},{"aspect":"Transaction cost","ethereum":"Gas can discourage exploratory actions","monad":"Lower fees enable lighter-weight interactions","designImplication":"Safe to offer preview retries and social actions more freely."}],"technicalNotes":"ERC-7715 session keys require clear scope UI — balance permissiveness with security.","relatedStandards":[{"id":"EIP-7702","relationship":"EOA delegation enables session patterns"},{"id":"ERC-4337","relationship":"Smart accounts can hold session keys"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7715","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-7715","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7715","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7715","markdown":"https://www.eipsfordesigners.com/standards/ERC-7715/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7715/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7715","official":"https://eips.ethereum.org/EIPS/erc-7715","discussion":"https://ethereum-magicians.org/search?q=ERC-7715"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}