{"id":"ERC-7751","name":"Wrapping of Bubbled Up Reverts","status":"Draft","chain":"both","category":{"id":"comprehension","name":"Comprehension & Display","description":"Making blockchain data readable to humans"},"journeyStages":[{"id":"reading","name":"Reading & Understanding","description":"Interpreting what you're being asked to do"}],"uxImpact":"Nested contract call failures show full error chain — see exactly which contract in a multi-hop transaction failed and why. Design implications: display error stack traces for complex transactions, show failing contract address and function, preserve original error context through wrapping, visualize call hierarchy. Design decisions: depth of error chain to display (can get verbose), technical vs simplified error presentation, whether to show intermediate contract addresses, integration with block explorers for debugging. Complements ERC-6093 for the same Blanket Warnings problem — preserves error context through nested contract calls so users see 'Swap failed: insufficient liquidity' instead of generic reverts.","hasDetailedContent":true,"content":{"id":"ERC-7751","summary":"ERC-7751 standardizes wrapping of error types, enabling nested errors with full context about what went wrong and why. Instead of \"execution reverted\", users see \"Swap failed: insufficient liquidity in pool (needed 100 ETH, available 50 ETH)\". Errors chain together to tell the complete story.","applicability":{"whenToUse":["Your product addresses: error messages lose context as they propagate.","Your users can't take action on vague errors.","The flow should deliver: full error chain: \"Swap failed → Pool error → Insufficient liquidity\".","You are designing a contextual error display experience with visible states and recovery paths."],"whenToAvoid":["Translate to human-readable: \"Insufficient liquidity\".","Show friendly message + expandable technical details.","Parse error type, suggest specific resolution.","Users never see addresses, amounts, or signing payloads in your UI."]},"designerTakeaways":["You can design UI that delivers full error chain: \"Swap failed → Pool error → Insufficient liquidity\".","You can design UI that delivers \"Approval expired 2 minutes ago, please approve again\".","You can design UI that delivers error shows exact step that failed and why."],"problemsSolved":[{"problem":"Error messages lose context as they propagate","oldWay":"\"execution reverted\" - no idea what failed or why","newWay":"Full error chain: \"Swap failed → Pool error → Insufficient liquidity\"","impact":"critical"},{"problem":"Users can't take action on vague errors","oldWay":"\"Transaction failed\" - what should user do?","newWay":"\"Approval expired 2 minutes ago - please approve again\"","impact":"critical"},{"problem":"Debugging requires guessing what went wrong","oldWay":"Trial and error, check each step manually","newWay":"Error shows exact step that failed and why","impact":"high"},{"problem":"Different contracts return different error formats","oldWay":"Parse error differently for each protocol","newWay":"Standard wrapping format enables consistent parsing","impact":"medium"}],"uxPatterns":[{"name":"Contextual Error Display","description":"Show error with full context chain","mockup":"concept/verify-safety","userFlow":["Transaction fails","Parse wrapped error chain","Display hierarchy of what failed","Extract actionable suggestion","Offer relevant next steps"]},{"name":"Approval Expiry Error","description":"Handle common approval-related failures","mockup":"generic/token-approval","userFlow":["Swap fails with approval error","Parse to find root cause","Show specific approval issue","One-click re-approve action","Suggest prevention for future"]},{"name":"Multi-Step Error Tracing","description":"Show which step in a batch failed","mockup":"generic/token-approval","userFlow":["Multi-step batch fails mid-way","Identify which step failed","Show completed vs failed vs skipped","Explain root cause from error","Offer fix for specific failure"]},{"name":"Developer Debug View","description":"Technical error details for power users","mockup":"concept/verify-safety","userFlow":["User clicks \"Show details\"","Display full technical error chain","Show contract addresses and selectors","Allow copy for bug reports","Link to transaction explorer"]}],"uiComponents":[{"name":"ErrorChainDisplay","description":"Nested display of wrapped errors","states":["collapsed","expanded","highlighted"],"props":["errors[]","onExpand","highlightRoot"]},{"name":"ActionableError","description":"Error with suggested resolution action","states":["error","suggesting","resolving"],"props":["error","suggestion","action","onAction"]},{"name":"BatchStepIndicator","description":"Show progress through batch with failure point","states":["pending","success","failed","skipped"],"props":["steps[]","failedStep","errorDetail"]},{"name":"TechnicalErrorView","description":"Developer-focused error details","states":["collapsed","expanded"],"props":["error","contract","selector","params"]}],"antiPatterns":[{"pattern":"Showing raw error selector codes","why":"\"0x4e487b71\" means nothing to users","instead":"Translate to human-readable: \"Insufficient liquidity\"","severity":"critical"},{"pattern":"Hiding error details entirely","why":"Power users need details for debugging","instead":"Show friendly message + expandable technical details","severity":"high"},{"pattern":"No suggested actions","why":"User sees error but doesn't know what to do","instead":"Parse error type, suggest specific resolution","severity":"high"},{"pattern":"Losing nested error context","why":"Root cause hidden, only surface error shown","instead":"Preserve and display full error chain","severity":"medium"}],"onMonad":[{"aspect":"Error Introspection","ethereum":"Limited error detail available","monad":"Enhanced error introspection in EVM","designImplication":"Can show more detailed error context on Monad"},{"aspect":"Retry Speed","ethereum":"Retry takes 15+ seconds to confirm","monad":"Sub-second retry confirmation","designImplication":"Retry buttons can show instant feedback"},{"aspect":"Simulation","ethereum":"Simulation to check errors is expensive","monad":"Cheap simulation for pre-flight checks","designImplication":"Can simulate before sending, catch errors earlier"},{"aspect":"Reserve-Related Errors","ethereum":"N/A","monad":"New error type: InsufficientSpendableBalance","designImplication":"Handle Monad-specific reserve errors gracefully"}],"keyTakeaways":["Wrapped errors tell the complete story of what went wrong","Always translate technical errors to human-readable messages","Provide specific, actionable suggestions based on error type","Show error chain hierarchy for transparency","On Monad: better error introspection + reserve balance errors"],"technicalNotes":"ERC-7751 defines a WrappedError structure that contains an inner error plus context. Contracts use try/catch to wrap lower-level errors with higher-level context. The standard defines encoding/decoding for error chains. Frontends parse the chain to extract the root cause and each layer of context."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-7751","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-7751","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7751","markdown":"https://www.eipsfordesigners.com/standards/ERC-7751/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7751/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7751","official":"https://eips.ethereum.org/EIPS/eip-7751","discussion":"https://ethereum-magicians.org/search?q=ERC-7751"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}