Lortnoc Tahc Try It Now
ENS
A gate that works out of the box

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.

Scripts

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: 0xb9878655b160DcEb27E16C0206b1cFd9426Ae71a

04The 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 0x4d19b7bb756125027D8433429D598bB3725E8867

05Its 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 again
Contracts

On-chain, end to end.

ContractAddress
LortnocSpaces v2, Ethereum mainnet0xd21f911570aad19d39e750fe0aa4e2ad161cbdd5
ENS UniversalResolver0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe
ENS UniversalHelper0x33f571aa8A160a21b877cF6E0Fb8806692b97DF5
ENS VerifiableFactory0x9e726Eb570beb6BCEb495AB8cdA7df517d4e841C
ENS PermissionedResolverImpl0x14F09Fd05d4585759e54844DC9B00147131Cf243
LortnocRegistry, lortnoctahc.eth0x836FEEa0f638b9816a24a7D305bdf0Ee2d0C8b24
SpaceRegistry, space.lortnoctahc.eth0x4d19b7bb756125027D8433429D598bB3725E8867
SpaceRegistrar0x05dcdfe5b66c5d90507de42ddaa656eec82309f0
LortnocDemoPass0xc85460a6690f8b06fdafd1b7730bdfa6261243f0
Code

Read the code.

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.