Share ENS names like a folder.
Share a name with a team, and the team can manage every name under it — including names added later, and names in the folders below. Built into ENSv2's own access control, replacing nothing.
ENSv2 already built it. Every name can have its own registry, so names nest like folders: orbit-dao.eth › protocol › vault. But every folder is a separate registry with its own permission list — so a team's access multiplies with every folder.
Missing. Permissions are granted one address on one name. There's no way to share a folder with a group.
A web3 org's team of 5 managing 20 names across 3 folders: 300 grants, and 60 revokes when someone leaves. (ENSv2's registry-wide grants cut it to 15 — but every join or leave still touches every folder. A worked example.)
With Cascade, a permission layer on ENSv2's own access control using relationship-based access control (ReBAC): a name trusts a team, the team's members inherit, and sharing flows down the tree — checked live, nothing copied.
Like sharing each file with each person.
Every ENS permission is one address on one name. Two people, three names: six separate grants. A new name needs new grants for everyone; someone leaving means finding and revoking each one — in every registry of the tree.
Like sharing the folder with a group.
One grant covers every name under the folder, today's and tomorrow's, and flows into the folders below. Joining or leaving is one change to the team. Everything ENSv2's access control already does keeps working exactly as before.
Share a folder, and everything below follows.
The setup: protocol is shared with core-devs, and orbit-dao.eth — the folder above — with security-council, which includes auditors. Two shares, made once. Everything below is just who's in which team.
- vaultvault.protocol.orbit-dao.eth…
- oracleoracle.protocol.orbit-dao.eth…
- bridgebridge.protocol.orbit-dao.eth…
In ENS terms: folders = names with their own registries (orbit-dao.eth, protocol.orbit-dao.eth) · file = a subname · groups = team contracts (security-council is a NestedTeam containing auditors) · “can edit” = the SET_SUBREGISTRY role, granted to core-devs on protocol and to security-council on orbit-dao.eth · the switch = CascadeSubregistryV2.setDepth(2 / 1). Every action is a real transaction on the ENSv2 beta (Sepolia).
One new registry. ENS's own check.
ENS Drive's permission layer is Cascade. ENS's own code still decides every write; Cascade changes the answer to the one question it asks — “does this account have this role here?” — by walking up the folders and asking each shared team about the caller.
Scroll sideways inside the diagram to see the teams →
An ordinary PermissionedRegistry, unmodified.
- ·the name protocol (its files live in CascadeSubregistryV2)
- ·the grant: core-devs can edit on protocol
- ·above it, the .eth registry holds security-council's grant on orbit-dao
The registry for protocol.orbit-dao.eth — ENS's own PermissionedRegistry, with the role lookup overridden.
- ·the files vault, oracle, bridge
- ·its teams: core-devs, security-council (up to 4)
- ·how many folders up sharing flows (depth 1–3)
Rosters. core-devs and auditors are TeamRegistry; security-council is a NestedTeam that includes auditors.
- ·one bit per person: member on / off
- ·security-council: its sub-teams (auditors)
- ·Hats / Safe adapters fit the same one-function interface
- 1Alex callsCascadeSubregistryV2.setSubregistry(vault)
- 2ENS checksthe name exists and hasn't expired, then asks for the role
- 3Own roles?none stored for Alex — keep going (owners stop here)
- 4Level 1 · protocolorbit-dao registry points back down ✓ · core-devs' grant: can edit · is Alex in core-devs? no
- 5Level 2 · orbit-dao.eth.eth registry points back down ✓ · security-council's grant: can edit · is Alex in security-council? → auditors: yes
- 6Resultcovered → stop and allow · nothing covers it → reverted by ENS's own check
Steps 3–5 are Cascade. Every outside call is read-only and gas-capped; if any fails, it counts as “no”. A team is only asked about membership if its grant could help, and the walk stops as soon as the role is covered.
ENS's functions are unchanged. Because the lookup is virtual, every check inside ENS's code runs Cascade's version, which runs ENS's own first and only ever adds roles — never admin roles, never registry-wide roles. Proven with a symbolic checker for all inputs, and fuzzed against a full recomputation.
Also live: the one-folder version (CascadeSubregistry on devops.acme-corp.eth) — the “One folder” tab above. The .eth registry: 0x1d7883…