RHNS documentation
RHNS gives you a short name on Robinhood Chain that points to your wallet. It uses ENS-compatible contracts. External wallet resolution depends on the public resolver and gateway deployment, and on each wallet?s support.
You register a label such as latke. Your canonical name is latke.rhns.id, and latke.rh is your short name inside RHNS and in apps that have integrated it. Records (addresses for other chains, avatar, website, text) live on Robinhood Chain and are read from there.
.rh and .rhns.id
Every RHNS name has two spellings for the same thing.
latke.rhns.idis the canonical name. The planned public integration uses DNS and ENS resolution. External wallet compatibility must be verified after that infrastructure is deployed; a local registration does not establish public resolution.latke.rhis the short name. It is what RHNS shows on the site, in the app and on your name's NFT, and it is what the end goal looks like: typinglatke.rhand having it just work.
Why .rh does not work everywhere yet
.rh is the short alias used inside RHNS. External wallets and applications need an RHNS integration to recognize it. Do not assume an app supports this alias until its integration is verified.
So .rh support depends on partnerships. Wallets and applications can add RHNS resolution. This preview does not establish any third-party partnership or integration.
Coming soon .rh working inside other dApps. Use the canonical latke.rhns.id spelling only after public resolution has been deployed and verified for that app.
| Where | Type this | Status |
|---|---|---|
| RHNS site and app | latke.rh | Works |
| Your name's NFT (card, marketplaces) | shows latke.rh | Works |
| Wallets and apps that resolve ENS names | latke.rhns.id | Requires deployed and verified public resolution |
| Robinhood Chain dApps that have integrated RHNS | latke.rh | Requires verified app integration |
Building on Robinhood Chain and want .rh in your app? The integration is covered under For developers; reach us on X at @rhnameservice.
Buying a name
- Search. Choose 2 to 63 lowercase letters, digits or hyphens, with no leading or trailing hyphen.
- Pay once. Prices are fixed in USD and paid in ETH on Robinhood Chain using the live ETH/USD feed. Network gas is additional.
- Own your name. Receive an ERC-721 token, set your address records and choose a primary name.
| Length | One-time price |
|---|---|
| 2 characters | $50 |
| 3 characters | $35 |
| 4 characters or more | $20 |
Names have no expiry and require no annual renewal. These are the complete registration prices before network gas. There is no launch-auction surcharge.
Marketplace and auctions
RHNS deducts a 4% fee from each completed fixed-price sale, accepted offer or auction sale. The seller receives 96% of the agreed price. For a 1 ETH sale, the seller receives 0.96 ETH and the RHNS treasury receives 0.04 ETH.
Buyers pay the listed price, accepted offer or winning bid, plus network gas. Sellers and the treasury can withdraw their proceeds from the marketplace. Cancelled offers and outbid bids are fully refundable through withdrawal, with no RHNS fee. No fee is charged for an auction that ends without a sale.
How resolution works
Names and records are stored in a registry on Robinhood Chain. Anything running there reads them directly. External ENS resolution uses the separate Ethereum resolver and gateway after that deployment is verified.
The intended public architecture requires DNSSEC for rhns.id and an ENS record pointing at RHNS?s resolver contract on Ethereum. This local preview does not establish that this public setup is deployed. When a wallet resolves latke.rhns.id, that contract asks an RHNS gateway for the answer using CCIP-Read (ERC-3668). The gateway reads the Robinhood Chain registry and returns the record with a signature that the resolver checks before passing it to the wallet. A wrong or tampered answer is rejected on-chain.
Primary names follow ENSIP-19: a wallet on Robinhood Chain (coin type 0x80001237) can set a name that apps display in place of its address.
Your name as an NFT
Registering mints an ERC-721 token to your wallet on Robinhood Chain. The token image shows your short name; the canonical name sits under it and is the first attribute, so a buyer on a marketplace sees exactly what the name is.
- name
- latke.rh
- Canonical name
- latke.rhns.id
- Short name
- latke.rh
- Length
- 5
- Chain
- Robinhood Chain
- Registered
- date
- Ownership
- No expiry · no annual renewal
The avatar is generated from the name itself, so it is the same on the site, in the token and wherever the name is shown. Transferring the token transfers the name. If a token changes hands outside the app, the new owner calls reclaim once to take over the registry record. The token ID is keccak256 of the label.
Name rules and policy
Allowed names
- Lowercase
a–z, digits0–9and hyphens; 2 to 63 characters; no leading or trailing hyphen. - No uppercase, accents, emoji or other scripts. This is deliberate: it makes look-alike names (a Cyrillic а for a Latin a) impossible, which matters next to a brokerage brand.
Reserved names
Stock tickers, product names, and words like support, admin and official are withheld from public registration. Contact info@rhns.id about a reserved name.
Who can change what
The contracts have no proxy upgrade mechanism. The admin can manage registration controllers, pricing configuration and reserved names. The configured launch admin and treasury is 0x7ab12fc240e6bb92eb73942679b4726aeff54587. The RHNS marketplace has an immutable 4% fee and treasury recipient.
For developers
Networks
| Network | Chain ID | RPC | Explorer | Coin type |
|---|---|---|---|---|
| Robinhood Chain testnet | 46630 | https://rpc.testnet.chain.robinhood.com | explorer.testnet.chain.robinhood.com | 0x8000b626 |
| Robinhood Chain mainnet | 4663 | https://rpc.mainnet.chain.robinhood.com | robinhoodchain.blockscout.com | 0x80001237 |
Contracts
| Contract | Role | Testnet | Mainnet |
|---|---|---|---|
| Registry | Names, owners, resolvers | deploying soon | — |
| BaseRegistrar | ERC-721 names, permanent ownership | deploying soon | — |
| RegistrarController | One-time purchases, pricing, reserved names, referrals | deploying soon | — |
| L2Resolver | Address, text and other records | deploying soon | — |
| ReverseRegistrar | Primary names (ENSIP-19) | deploying soon | — |
| L1Resolver (Ethereum) | Serves *.rhns.id to ENS via CCIP-Read | Sepolia, soon | — |
Add .rh to your app
Treat .rh as an alias of .rhns.id and resolve through ENS as you already do. That is the whole integration; an SDK that wraps it is on the way.
// Accept both spellings, resolve the canonical one.
export function toCanonical(name) {
return name.endsWith('.rh') ? name.slice(0, -3) + '.rhns.id' : name;
}
// On Ethereum, via ENS (works in any ENS-aware stack; viem shown):
import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
import { normalize } from 'viem/ens';
const eth = createPublicClient({ chain: mainnet, transport: http() });
const address = await eth.getEnsAddress({ name: normalize(toCanonical('latke.rh')) });
On Robinhood Chain itself, skip Ethereum and read the registry directly:
import { namehash } from 'viem/ens';
const node = namehash('latke.rhns.id');
const resolver = await rh.readContract({ address: REGISTRY, abi: registryAbi, functionName: 'resolver', args: [node] });
const address = await rh.readContract({ address: resolver, abi: resolverAbi, functionName: 'addr', args: [node] });
Register from a contract or script
// RegistrarController
function available(string name) view returns (bool);
function valid(string name) view returns (bool);
function rentPrice(string name, uint256 duration) view returns ((uint256 base, uint256 premium));
function registerPrice(string name, uint256 duration) view returns (uint256); // one-time price in wei; duration = 0
function register((string name, address owner, uint256 duration, address resolver,
bytes[] data, bool reverseRecord, address referrer) request) payable;
// Renewal payments are rejected by the permanent-name contracts.
// BaseRegistrar (ERC-721)
function ownerOf(uint256 tokenId) view returns (address); // tokenId = uint256(keccak256(label))
function nameExpires(uint256 tokenId) view returns (uint256);
function reclaim(uint256 tokenId, address owner);
data is a list of resolver calls (for example setAddr(node, you)) applied in the same transaction; reverseRecord makes the name your primary name; referrer receives the referral share, if any. Read a fresh quote immediately before purchase. Excess payment is refunded; an insufficient payment reverts.
FAQ
Is RHNS part of Robinhood?
No. RHNS is an independent project and is not affiliated with, endorsed by, or connected to Robinhood Markets, Inc. It runs on Robinhood Chain the way any third-party app does.
Do I own my name forever?
Yes. A purchased name has no expiry and requires no renewal. You can keep it or transfer it to another wallet.
Can I use my name in MetaMask today?
External-wallet resolution needs the Ethereum resolver, gateway and DNS setup to be deployed and verified. latke.rh works in apps that have integrated RHNS; see .rh and .rhns.id.
Will I receive renewal charges?
No. RHNS uses a one-time purchase with no yearly charges.
Can I sell or transfer my name?
Yes. It is a standard ERC-721, so it can be sent or listed on any marketplace on Robinhood Chain.
Can I have more than one?
As many as you like. One of them can be your primary name, the one apps show for your address.
Status
- Contract implementation and automated tests available. Registry, registrar, controller, resolver, reverse registrar, price oracles, L1 resolver.
- Gateway written; resolution verified end to end on a local chain.
rhns.idregistered; the.idzone is DNSSEC-signed.- Testnet deployment (chain 46630). Next.
- DNSSEC on
rhns.idand the ENS record for the L1 resolver. - Registration app.
- Mainnet deployment with one-time purchases and marketplace trading.
.rhinside other dApps, partner by partner.