ENS v2 subnames for communities.
Every space is a real ENS v2 subname with its own resolver. Its records say who gets in and who is banned. Readers prove they qualify without revealing who they are.
Verify with curl. No install, no key.
Plain eth_calls against a public Sepolia RPC, for the live space ethglobal.space.lortnoctahc.eth.
01addr, resolved through ENS's own UniversalResolver
# UniversalResolver.resolve(dnsName, addr(node)) returns (bytes result, address resolver) curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe","data":"0x9061b923000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002109657468676c6f62616c0573706163650b6c6f72746e6f637461686303657468000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000243b3b57deb6fbb3ad89d32a9704ce43358802d696b448675ceef370f66f3e076650986b3100000000000000000000000000000000000000000000000000000000"},"latest"]}' # owner 0xb9878655b160DcEb27E16C0206b1cFd9426Ae71a, resolver 0x8fe9E85E555c6E4DEAE2033dA1Fbe81415887431
02The rule: text record eth.lortnoc.space.token
# UniversalResolver.resolve(dnsName, text(node, "eth.lortnoc.space.token")) curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe","data":"0x9061b923000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002109657468676c6f62616c0573706163650b6c6f72746e6f6374616863036574680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008459d1d43cb6fbb3ad89d32a9704ce43358802d696b448675ceef370f66f3e076650986b31000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000176574682e6c6f72746e6f632e73706163652e746f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000"},"latest"]}' # eip155:11155111/erc721:0xc85460a6690f8b06fdafd1b7730bdfa6261243f0
03It exists: UniversalHelper.findExactOwner
curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x33f571aa8a160a21b877cf6e0fb8806692b97df5","data":"0x78b8187f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002109657468676c6f62616c0573706163650b6c6f72746e6f6374616863036574680000000000000000000000000000000000000000000000000000000000000000"},"latest"]}'
# the last 20 bytes are the owner: 0xb9878655b160DcEb27E16C0206b1cFd9426Ae71a04The registry tree: LortnocRegistry.getSubregistry("space")
curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x836FEEa0f638b9816a24a7D305bdf0Ee2d0C8b24","data":"0x35af6216000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057370616365000000000000000000000000000000000000000000000000000000"},"latest"]}'
# SpaceRegistry 0x4d19b7bb756125027D8433429D598bB3725E886705Its own resolver, from ENS's canonical factory
# VerifiableFactory.verifyContract(resolver) returns the implementation it was deployed from curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x9e726Eb570beb6BCEb495AB8cdA7df517d4e841C","data":"0x3d200b450000000000000000000000008fe9e85e555c6e4deae2033da1fbe81415887431"},"latest"]}' # PermissionedResolverImpl 0x14f09fd05d4585759e54844dc9b00147131cf243 (ENS's, not ours)
06The whole proof, one command
# read-only: reference addresses from ENS's GitHub, registry tree, ownership, factory, roles
git clone https://github.com/forever8896/lortnoc_tahc && cd lortnoc_tahc
npm ci --prefix scripts/ens
node scripts/ens/prove-v2.mjs ethglobal.space.lortnoctahc.eth
node scripts/ens/preflight.mjs # fails the moment ENS resets Sepolia againOn-chain, end to end.
| Contract | Address |
|---|---|
| LortnocSpaces v2, Ethereum mainnet | 0xd21f911570aad19d39e750fe0aa4e2ad161cbdd5 |
| ENS UniversalResolver | 0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe |
| ENS UniversalHelper | 0x33f571aa8A160a21b877cF6E0Fb8806692b97DF5 |
| ENS VerifiableFactory | 0x9e726Eb570beb6BCEb495AB8cdA7df517d4e841C |
| ENS PermissionedResolverImpl | 0x14F09Fd05d4585759e54844DC9B00147131Cf243 |
LortnocRegistry, lortnoctahc.eth | 0x836FEEa0f638b9816a24a7D305bdf0Ee2d0C8b24 |
SpaceRegistry, space.lortnoctahc.eth | 0x4d19b7bb756125027D8433429D598bB3725E8867 |
| SpaceRegistrar | 0x05dcdfe5b66c5d90507de42ddaa656eec82309f0 |
| LortnocDemoPass | 0xc85460a6690f8b06fdafd1b7730bdfa6261243f0 |
Read the code.
contracts/src/SpaceRegistrar.sol One transaction: resolver, records, roles, self-revoke, registercontracts/src/LortnocSpaces.sol Purchase, early bird, treasury forwardingrelayer/space.mjs POST /space: read the purchase, issue the namegate/ens-spaces.mjs Live ENS reads for existence, collection and bansgate/holders.mjs Does this wallet hold the collectionshared/checks/nft.mjs The holders-of-a-space ruleextension-everywhere/src/shared/ensWrite.ts The owner edits records from the extensionscripts/ens/prove-v2.mjs The keyless proof abovescripts/ens/preflight.mjs Fails the moment ENS resets Sepoliacontracts/test/SpaceRegistrar.t.sol Plus SpaceRegistrar.fork.t.sol, against ENS's real bytecode
Build a gate from any rule that can be proven.
Start with two that work out of the box: ENS v2 subnames for communities, and World ID for verified nationality. Readers prove they qualify without revealing who they are.
Try It Now