{"id":"ERC-7820","name":"Access Control Registry","status":"Final","chain":"both","category":{"id":"security","name":"Security & Trust","description":"Helping users verify, control, and protect their assets"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"}],"uxImpact":"ERC-7820 defines a generic Access Control Registry for registering target contracts, assigning an admin, and granting or revoking arbitrary bytes32 roles for accounts. The target contract gives each role its meaning; ERC-7820 does not define NFT role names, per-token roles, or precedence over ERC-721 approvals.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-7820","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-7820","specConstraints":[{"id":"registry-authorization","constraint":"Registry management needs an authorized caller and a registered target contract.","appliesTo":"application","normativity":"security-considerations","specQuote":"Operations are restricted to active contracts, reducing the risk of interacting with deprecated or unregistered contracts.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-7820#security-considerations","designImplication":"Check the target's registration and caller authority before presenting grant or revoke actions. The reference implementation permits the registered contract or its admin; a connected wallet alone has no management authority. Handle missing-contract errors explicitly."}],"summary":"ERC-7820 defines a generic Access Control Registry for registering target contracts, assigning an admin, and granting or revoking arbitrary bytes32 roles for accounts. The target contract gives each role its meaning; ERC-7820 does not define NFT role names, per-token roles, or precedence over ERC-721 approvals.","applicability":{"whenToUse":["Multiple target contracts need a shared registry for arbitrary bytes32 roles.","The target contract documents what each role means and how it consumes registry membership.","The product can show target contract, role bytes32, account, admin, and grant/revoke authority."],"whenToAvoid":["The target contract has no documented meaning for the bytes32 role.","The product needs standardized NFT minter, burner, or transfer roles.","The app cannot show target-contract scope and grant/revoke authority."]},"designerTakeaways":["You can label arbitrary bytes32 roles using the target contract's documentation.","You can show contract scope, role holders, and the target contract's grant/revoke authority.","You can avoid implying that a registry role changes ERC-721 transfer or burn precedence."],"problemsSolved":[{"problem":"Many contracts need a shared role registry","oldWay":"Each contract exposes a bespoke registry and query shape","newWay":"A registry maps target contract, arbitrary bytes32 role, and account","impact":"high"},{"problem":"Role changes are hard to audit across integrations","oldWay":"Grant and revoke operations are scattered","newWay":"Registration, grants, revocations, and status are emitted and queryable","impact":"medium"},{"problem":"Applications need to check scope before acting","oldWay":"A role label is shown without target-contract context","newWay":"The app displays target contract, role bytes32, account, and registry status","impact":"high"},{"problem":"Teams need batched role updates","oldWay":"One transaction per account and target","newWay":"grantRole and revokeRole accept arrays for multiple targets, roles, and accounts","impact":"medium"}],"uxPatterns":[{"name":"Target-Contract Role Dashboard","description":"Show registry roles with target-contract scope and the documentation that defines their effect.","userFlow":["Select a registered target contract","See its arbitrary bytes32 roles and accounts","Read the target contract's role labels and scope","Grant or revoke only through the registry authority","View emitted changes"]},{"name":"Grant Role Flow","description":"Show the target contract, raw bytes32 role, account, and grant authority.","userFlow":["Select a target contract and role bytes32","Read the target contract's documented effect","Enter recipient address","Confirm scope and grant authority","Sign grantRole transaction"]},{"name":"Role-Gated Actions","description":"Explain that a registry membership check does not itself execute or override target-contract authorization.","userFlow":["User selects a target contract","App checks the registry role for the account","Reads the target contract's own authorization logic","Shows enabled actions and scope","Does not infer ERC-721 transfer or burn precedence"]},{"name":"Target Contract Role Admin","description":"Manage roles for one registered target contract.","userFlow":["Admin selects target contract","Sees active state and admin","Reviews role/account pairs","Grants or revokes documented roles","Audits registry events"]}],"uiComponents":[{"name":"RoleBadge","description":"Visual indicator of a target-contract-defined role.","states":["active","pending","revoked"],"props":["roleBytes32","roleLabel","targetContract"]},{"name":"PermissionMatrix","description":"Grid showing effects documented by the target contract for each role.","states":["viewing","editing"],"props":["roles[]","permissions[]","assignments{}"]},{"name":"RoleAssignmentForm","description":"Form for granting roles to addresses","states":["selecting-role","entering-address","confirming","granting"],"props":["availableRoles[]","onGrant"]},{"name":"RoleAuditLog","description":"History of role changes","states":["loading","loaded"],"props":["events[]","filters"]}],"antiPatterns":[{"pattern":"Displaying a standard admin/operator/minter/burner taxonomy","why":"ERC-7820 uses arbitrary bytes32 roles and leaves their meaning to the target contract.","instead":"Use labels supplied by target-contract documentation and show the raw role value.","severity":"critical"},{"pattern":"Treating registry membership as ERC-721 authorization","why":"The registry does not define how target contracts consume a role.","instead":"Check the target contract's authorization logic before enabling an action.","severity":"critical"},{"pattern":"Hiding target-contract scope","why":"The same bytes32 role can mean different things across contracts.","instead":"Always show target contract, role, account, admin, and active state.","severity":"high"}],"keyTakeaways":["ERC-7820 is a generic cross-contract access-control registry.","Roles are arbitrary bytes32 values whose meaning comes from the target contract.","Show target-contract scope and registry admin before granting or revoking.","Do not infer NFT transfer, mint, or burn precedence from registry membership."],"technicalNotes":"ERC-7820 defines registerContract(address admin), unRegisterContract(address), grantRole(targetContracts, roles, accounts), revokeRole(...), getContractInfo(address), and role queries/events. The role key is arbitrary bytes32 and the registry does not prescribe NFT semantics, per-token scope, or ERC-721 approval precedence.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-7820 official specification","url":"https://ercs.ethereum.org/ERCS/erc-7820","type":"official-spec"}],"lastReviewed":"2026-09-18","partialDeployment":{"body":"This guide describes an interface-specific integration. A live deployment has not been verified here. Confirm the target contract, network, and client support before offering these actions; Final describes the specification, not product availability."}},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7820","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-7820","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7820","markdown":"https://www.eipsfordesigners.com/standards/ERC-7820/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7820/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7820","official":"https://ercs.ethereum.org/ERCS/erc-7820","discussion":"https://ethereum-magicians.org/search?q=ERC-7820"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}