Robin is the ENS-standard naming layer for Robinhood Chain. It implements the exact ENS interfaces — ERC-137 registry, standard resolver profiles, ENSIP namehash, reverse records, a UniversalResolver — so the ENS tooling you already use works unchanged. Integration is a config line, not an SDK adoption project.
The highest-leverage integration is reverse resolution:
wherever your UI renders 0x71C7…9F2b, render
trader.robin instead.
import { createPublicClient, http } from "viem";
import { robinhoodChainTestnet } from "robin-names"; // ← the one line
const client = createPublicClient({ chain: robinhoodChainTestnet, transport: http() });
// reverse: address → name (do this in your UI)
await client.getEnsName({ address: "0x71C7656EC7ab88b098defB751B7401B5f6d8976F" });
// → "trader.robin"
// forward: name → address (payments, transfers, search)
await client.getEnsAddress({ name: "trader.robin" });
// profile records
await client.getEnsText({ name: "trader.robin", key: "com.twitter" });
await client.getEnsAvatar({ name: "trader.robin" });
With wagmi, pass the chain into your config and use the stock hooks —
useEnsName, useEnsAddress, useEnsText,
useEnsAvatar. Nothing else changes. Already have your own chain
object? Wrap it: withRobin(myChainConfig).
The robin-names SDK lives at
packages/sdk
in the repo.
The SDK is convenience, not dependency. Point any ENS-aware library at Robin's registry and UniversalResolver — addresses below, verified on Blockscout:
import { defineChain } from "viem";
const robinhoodTestnet = defineChain({
id: 46630,
name: "Robinhood Chain Testnet",
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
rpcUrls: { default: { http: ["https://rpc.testnet.chain.robinhood.com"] } },
contracts: {
ensRegistry: { address: "0x8705DEC51223E119C5C9f03121626d086A8eF753" },
ensUniversalResolver: { address: "0x7112730612e4253Ba2e418A86580615A2c3CDB1D" },
multicall3: { address: "0xcA11bde05977b3631167028862bE2a173976CA11" },
},
});
ethers v6:
new JsonRpcProvider(rpc, { chainId: 46630, name: "robinhood-testnet", ensAddress: "0x8705…F753" }).
// Forward-resolve in a contract via the registry (ERC-137):
ENS registry = ENS(0x8705DEC51223E119C5C9f03121626d086A8eF753);
address resolver = registry.resolver(node);
address target = Resolver(resolver).addr(node);
Or call UniversalResolver.resolve(dnsEncodedName, calldata) for
one-call resolution including wildcard support.
getEnsName(address), confirm getEnsAddress(thatName)
returns the same address before displaying it (viem does this for you).normalize from robin-names or
viem/ens) on any user-typed name.For lists and search — names by owner, expiries, activity, auctions — the public GraphQL endpoint serves the chain's naming state:
api.dotrobin.xyz/graphql
curl -s https://api.dotrobin.xyz/graphql \
-H "content-type: application/json" \
-d '{"query":"{ names(orderBy: \"expiresAt\", orderDirection: \"desc\", limit: 20) { items { label owner expiresAt wrapped } totalCount } }"}'
CORS is open — call it straight from your dapp. Schema:
indexer/ponder.schema.ts.
Self-hosting is one command (ponder start) against any
Robinhood Chain RPC.
Robinhood Chain is built for agentic trading. Agents transact, hold funds, and talk to each other — they need what every actor on a chain needs: an addressable, verifiable identity. One parent name per operator; one subname per agent:
bot1.goldfinch.robin → the agent's smart account
goldfinch.robin → wrap it (one click in the
app, or RobinWrapper.wrapETH2LD).
Wrapping turns your name into a parent that can issue subname tokens.
RobinWrapper.setSubnodeOwner(
namehash("goldfinch.robin"),
"bot1",
agentAccount, // the agent's ERC-4337 smart account
0, // fuses — or PARENT_CANNOT_CONTROL to emancipate
0
)
Then point it at the agent:
PublicResolver.setAddr(node, agentAccount).
| key | value |
|---|---|
url | the agent's API / A2A endpoint |
description | what this agent does |
agent.capabilities | comma-separated verbs: swap,lend,rebalance |
agent.model | model / runtime identifier |
agent.operator | goldfinch.robin — walk up to the human |
avatar | image URI |
ReverseRegistrar.setName("bot1.goldfinch.robin") (or use
setNameForAddr while you control it). Every explorer and dapp
that renders reverse resolution now shows the agent's name.
import { createPublicClient, http } from "viem";
import { robinhoodChainTestnet, namehash } from "robin-names";
const client = createPublicClient({ chain: robinhoodChainTestnet, transport: http() });
async function verifyAgent(claimedName, senderAddress) {
const resolved = await client.getEnsAddress({ name: claimedName });
if (resolved?.toLowerCase() !== senderAddress.toLowerCase()) return null;
const operator = claimedName.split(".").slice(1).join(".");
const endpoint = await client.getEnsText({ name: claimedName, key: "url" });
const capabilities = await client.getEnsText({ name: claimedName, key: "agent.capabilities" });
return { operator, endpoint, capabilities };
}
bot1.goldfinch.robin cryptographically
hangs off goldfinch.robin, so counterparties can walk the
namehash chain to the operator. Revocable — keep the parent's control fuses
and you can replace a compromised agent's subname; emancipate it and the
identity is provably the agent's own. Composable — every wallet, explorer,
and agent framework that speaks ENS resolves it with zero custom code.
Tradeable — a wrapped subname (the agent's name, reputation, endpoint) can
change operators atomically.
Robinhood Chain testnet, chainId 46630 — live now, verified on
Blockscout.
Free testnet ETH:
faucet.testnet.chain.robinhood.com.
| contract | address |
|---|---|
| RobinRegistry | 0x8705DEC51223E119C5C9f03121626d086A8eF753 |
| UniversalResolver | 0x7112730612e4253Ba2e418A86580615A2c3CDB1D |
| PublicResolver | 0x293758cf47CE956fbeD160E54259Af2549faa090 |
| ReverseRegistrar | 0x818145E450422484c240a7294de5f71e3A39e4F4 |
| RobinRegistrarController | 0x042C39d404C58528963E691a6befC905511a3Dcb |
| RobinBaseRegistrar | 0x78443cD8242AfCC56F8779a1D9acB8971cD67ac8 |
| RobinWrapper | 0xB1125eb75343054722881F995FE961f93290e1aF |
| RobinPriceOracle | 0x6ab29612665a93682a3C6d64f1523f6991723111 |
| RobinReservedList | 0x0e558E92D0B4B93C450f4a48EB95Ed3f467ce6de |
| RobinMetadata | 0x525c188297509941f6f97Cd0ff639cD3011Cb886 |
Robin on mainnet (chainId 4663) is not yet deployed. Addresses land in contracts/deployments/ — the deploy script's own record, so published addresses can never drift from what's on chain.