Callsign

Callsign docs

Callsign is a name registry on Robinhood Chain (chain id 4663). Each name, like mira.rh, is an ERC-721 token in the Callsign contract. It resolves to an address, can serve as that address's public name, and holds four short text records. A name is bought once and never expires.

Names

Prices and fees

LengthPriceExample
3 characters0.003 ETHabc.rh
4 characters0.001 ETHnvda.rh
5 to 320.0003 ETHmira-k.rh

The price is paid once, at registration. It is forwarded to the treasury in the same transaction, and anything sent above the price is refunded. Each price is capped at 0.05 ETH in the contract (MAX_PRICE). Changing a record or the primary name costs only gas.

Registering

  1. Search a name in the app. It shows whether the name is valid, free and how much it costs.
  2. Choose the address to register it to. By default it is the connected wallet.
  3. Send register(label, to) with the price. The name is minted to to, points at to, and becomes to's primary name if to has none yet.

If two people send a registration for the same name at the same time, the first transaction in the block wins and the second reverts with Taken, refunding everything but gas.

Address and records

The holder can point the name at any address with setAddr(id, address), for example to keep the name in one wallet and receive funds in a cold wallet.

Four text records can be set with setText(id, key, value): x, url, avatar and bio, each up to 160 bytes. Any other key reverts.

Primary name

nameFor(address) returns the address's primary name, but only if that name still points back at the address. This stops anyone from claiming a name they don't control as theirs. An address picks its primary with setPrimary(id); the name must point at it, while holding the token is not required.

Transfers

Names are standard ERC-721 tokens and can be sent or sold on any marketplace that supports Robinhood Chain. On every transfer the name starts pointing at the new holder. The previous holder's primary name stops resolving, because it no longer points back at them. Text records stay until the new holder changes them.

Contract interface

function register(string label, address to) payable returns (uint256 id)
function available(string label) view returns (bool)
function priceOf(string label) view returns (uint256)
function resolve(string name) view returns (address)      // "mira" or "mira.rh"
function nameFor(address a) view returns (string)          // "mira.rh" or ""
function record(string name) view returns (uint256 id, address holder, address target,
                                           uint256 since, string x, string url, string avatar, string bio)
function setAddr(uint256 id, address a)
function setPrimary(uint256 id)
function setText(uint256 id, string key, string value)

event Registered(uint256 indexed id, string name, address indexed owner, uint256 paid)
event AddrSet(uint256 indexed id, address addr)
event PrimarySet(address indexed account, uint256 indexed id)
event TextSet(uint256 indexed id, string key, string value)

tokenURI returns on-chain JSON with an SVG card of the name, so wallets show the name without any server.

What the owner can do

That is all. There is no function to burn, seize, reassign or block a name, and the contract never holds ETH.

Risks

Contracts

ContractAddress
Callsign registrydeploying soon