rhns.id Docs

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.

ChainRobinhood Chain (ID 4663)
StandardENS-compatible (ENSIP-10, 11, 19)
OwnershipERC-721, no expiry
PricingFixed in USD, paid in ETH

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.id is 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.rh is 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: typing latke.rh and 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.

WhereType thisStatus
RHNS site and applatke.rhWorks
Your name's NFT (card, marketplaces)shows latke.rhWorks
Wallets and apps that resolve ENS nameslatke.rhns.idRequires deployed and verified public resolution
Robinhood Chain dApps that have integrated RHNSlatke.rhRequires 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

  1. Search. Choose 2 to 63 lowercase letters, digits or hyphens, with no leading or trailing hyphen.
  2. Pay once. Prices are fixed in USD and paid in ETH on Robinhood Chain using the live ETH/USD feed. Network gas is additional.
  3. Own your name. Receive an ERC-721 token, set your address records and choose a primary name.
LengthOne-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.

Wallet or appasks ENS for latke.rhns.id
→
Ethereumrhns.id is DNSSEC-signed; ENS hands the lookup to RHNS's resolver
→
Robinhood Chainthe registry answers; the reply is signed and verified on Ethereum

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.

rhns latke.rh latke.rhns.id ROBINHOOD CHAIN · 4663 ERC-721
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, digits 0–9 and 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

NetworkChain IDRPCExplorerCoin type
Robinhood Chain testnet46630https://rpc.testnet.chain.robinhood.comexplorer.testnet.chain.robinhood.com0x8000b626
Robinhood Chain mainnet4663https://rpc.mainnet.chain.robinhood.comrobinhoodchain.blockscout.com0x80001237

Contracts

ContractRoleTestnetMainnet
RegistryNames, owners, resolversdeploying soon—
BaseRegistrarERC-721 names, permanent ownershipdeploying soon—
RegistrarControllerOne-time purchases, pricing, reserved names, referralsdeploying soon—
L2ResolverAddress, text and other recordsdeploying soon—
ReverseRegistrarPrimary names (ENSIP-19)deploying soon—
L1Resolver (Ethereum)Serves *.rhns.id to ENS via CCIP-ReadSepolia, 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.id registered; the .id zone is DNSSEC-signed.
  • Testnet deployment (chain 46630). Next.
  • DNSSEC on rhns.id and the ENS record for the L1 resolver.
  • Registration app.
  • Mainnet deployment with one-time purchases and marketplace trading.
  • .rh inside other dApps, partner by partner.