{"id":"ERC-777","name":"Token Standard","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":"Tokens with hooks notify contracts on send/receive — enables single-transaction deposits but introduces reentrancy risks that have caused major exploits. Design implications: show security warnings for 777 tokens, indicate operator permissions clearly, warn when interacting with contracts that may be vulnerable to 777 reentrancy. Design decisions: largely superseded standard — decide whether to support at all, if supporting must prominently warn users about elevated risk, consider blocking 777 interactions in high-security contexts.","supersededBy":"ERC-1363","hasDetailedContent":true,"content":{"id":"ERC-777","summary":"ERC-777 is an advanced token standard with built-in hooks for sending and receiving. Contracts can automatically react when tokens arrive (no separate notification needed) and users can authorize \"operators\" to manage tokens on their behalf. While powerful, it's largely been superseded by account abstraction (ERC-4337) which achieves similar goals more safely. Understanding ERC-777 matters for legacy integrations and learning hook patterns.","applicability":{"whenToUse":["Your product addresses: contracts can't react to incoming token transfers.","Your users must approve each contract individually.","The flow should deliver: send tokens → Contract's receive hook triggers automatically.","You are designing a automatic deposit on transfer experience with visible states and recovery paths."],"whenToAvoid":["Clear warning: \"This contract can send ALL your tokens\".","Preview hook effects before confirming transfer.","Use ERC-777 features only when hooks genuinely needed.","The flow is a single low-risk transfer where batching adds confusion."]},"designerTakeaways":["You can design UI that delivers send tokens → Contract's receive hook triggers automatically.","You can design UI that delivers authorize an operator once to manage all your tokens.","You can design UI that delivers tokensReceived hook can reject unwanted transfers."],"problemsSolved":[{"problem":"Contracts can't react to incoming token transfers","oldWay":"Approve → Call contract → Contract pulls tokens (3 steps)","newWay":"Send tokens → Contract's receive hook triggers automatically","impact":"high"},{"problem":"Users must approve each contract individually","oldWay":"Approve Uniswap, approve Aave, approve each dApp","newWay":"Authorize an operator once to manage all your tokens","impact":"high"},{"problem":"No way to reject incoming unwanted tokens","oldWay":"Anyone can send you tokens, no way to refuse","newWay":"tokensReceived hook can reject unwanted transfers","impact":"medium"},{"problem":"Token transfers don't carry context","oldWay":"Transfer is just amount, no additional data","newWay":"data and operatorData fields carry context","impact":"medium"},{"problem":"No standard way for users to be notified of sends","oldWay":"Send completes without user-side hook","newWay":"tokensToSend hook runs before tokens leave","impact":"medium"}],"uxPatterns":[{"name":"Automatic Deposit on Transfer","description":"Send tokens to contract, action happens automatically","mockup":"generic/token-approval","userFlow":["User enters stake amount","UI explains auto-deposit feature","Single transaction initiated","Pool's receive hook processes deposit","User is staking without approve step"]},{"name":"Operator Authorization","description":"Grant third party permission to manage tokens","mockup":"concept/agent-task","userFlow":["User views operator dashboard","Sees all authorized operators","Each shows permissions granted","Can revoke any operator","Add new operators with authorization tx"]},{"name":"Receive Hook Notification","description":"Show when receive hooks will trigger","mockup":"generic/token-transfer","userFlow":["Incoming transfer detected","UI shows registered hooks","Explains what each hook will do","Shows final state after hooks","User accepts or could reject"]},{"name":"Send Hook Configuration","description":"Configure pre-send hooks for outgoing transfers","mockup":"generic/token-approval","userFlow":["User opens hook configuration","Sees available send hooks","Toggles hooks on/off","Configures hook parameters","Hooks run on future sends"]}],"uiComponents":[{"name":"OperatorManager","description":"Manage operator authorizations","states":["loading","empty","has-operators","adding"],"props":["operators[]","onAuthorize","onRevoke"]},{"name":"HookPreview","description":"Show what hooks will execute","states":["no-hooks","has-hooks","simulating"],"props":["hooks[]","transfer","outcome"]},{"name":"TransferWithHooks","description":"Transfer UI showing hook involvement","states":["preparing","hooks-running","complete","hook-rejected"],"props":["amount","recipient","activeHooks"]},{"name":"HookRegistry","description":"Register and manage send/receive hooks","states":["viewing","adding","removing","configuring"],"props":["sendHooks[]","receiveHooks[]","onUpdate"]}],"antiPatterns":[{"pattern":"Not warning about operator permissions","why":"Operators have significant power, users may not understand","instead":"Clear warning: \"This contract can send ALL your tokens\"","severity":"critical"},{"pattern":"Hiding hook effects on transfers","why":"Users surprised when hooks change expected outcome","instead":"Preview hook effects before confirming transfer","severity":"high"},{"pattern":"Using ERC-777 where ERC-20 suffices","why":"Added complexity and reentrancy risks without benefit","instead":"Use ERC-777 features only when hooks genuinely needed","severity":"high"},{"pattern":"No dashboard for hook/operator management","why":"Users forget what they've authorized","instead":"Clear management UI showing all hooks and operators","severity":"medium"},{"pattern":"Not mentioning ERC-4337 as modern alternative","why":"ERC-777 has known issues, better patterns exist","instead":"Consider account abstraction for new projects","severity":"medium"}],"onMonad":[{"aspect":"Hook Execution","ethereum":"Hooks add gas cost, reentrancy concerns","monad":"Cheaper execution, but still need reentrancy guards","designImplication":"Can afford more complex hooks, maintain security"},{"aspect":"Operator Updates","ethereum":"Authorizing/revoking operators takes time","monad":"Sub-second operator management","designImplication":"Operator changes feel instant"},{"aspect":"Transfer with Hooks","ethereum":"Complex hook chains may be slow and expensive","monad":"Fast parallel execution helps multi-hook transfers","designImplication":"Can enable more sophisticated hook chains"},{"aspect":"Reserve Balance","ethereum":"Hook failures may leave tx in bad state","monad":"10 MON reserve for async execution safety; hooks execute with guaranteed balance floor","designImplication":"Safer hook execution with guaranteed resources"}],"keyTakeaways":["ERC-777 = tokens with send/receive hooks and operators","Always warn about operator power and hook effects","Preview hook outcomes before transfers","Consider ERC-4337 for new projects (safer patterns)","On Monad: faster hook execution, maintain security practices"],"technicalNotes":"ERC-777 uses hooks (tokensToSend, tokensReceived) registered via ERC-1820 registry. Operators are addresses authorized to send tokens on behalf of holders. The standard is backwards-compatible with ERC-20 but has known reentrancy risks (hooks execute during transfer). Most new projects prefer ERC-4337 account abstraction for similar functionality with better security patterns."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-777","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-777","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-777","markdown":"https://www.eipsfordesigners.com/standards/ERC-777/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-777/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-777","official":"https://eips.ethereum.org/EIPS/eip-777","discussion":"https://ethereum-magicians.org/search?q=ERC-777"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}