// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.20;
interface IRobinRegistry {
function creatorOf(uint256 robinId) external view returns (address);
}
/// @title RobinNameService
/// @notice Maps human-readable names to Robin agent IDs on Robinhood Chain
/// (e.g. "marketbot" => 42). Registration is gated to the Robin
/// creator to prevent name squatting / front-running.
contract RobinNameService {
// ── Storage ─────────────────────────────────────────────────────────
IRobinRegistry public immutable registry;
mapping(string => uint256) private _nameToId; // name => robinId (0 = unset)
mapping(uint256 => string) private _idToName; // robinId => name
// ── Events ──────────────────────────────────────────────────────────
event NameRegistered(uint256 indexed robinId, bytes32 indexed nameHash, string name);
event NameReleased(uint256 indexed robinId, bytes32 indexed nameHash, string name);
// ── Errors ──────────────────────────────────────────────────────────
error InvalidName();
error NameTaken();
error Unauthorized();
constructor(address registry_) {
registry = IRobinRegistry(registry_);
}
// ── Core ────────────────────────────────────────────────────────────
/// @notice Register a name for a Robin. Caller must be the Robin creator.
/// Reverts if the name is invalid or already taken. If the Robin
/// already had a name, the old name is released first.
function registerName(uint256 robinId, string calldata name) external {
if (msg.sender != registry.creatorOf(robinId)) revert Unauthorized();
if (!_validateName(name)) revert InvalidName();
if (_nameToId[name] != 0) revert NameTaken();
string memory old = _idToName[robinId];
if (bytes(old).length != 0) {
delete _nameToId[old];
emit NameReleased(robinId, keccak256(bytes(old)), old);
}
_nameToId[name] = robinId;
_idToName[robinId] = name;
emit NameRegistered(robinId, keccak256(bytes(name)), name);
}
/// @notice Release the name held by a Robin. Caller must be the creator.
function releaseName(uint256 robinId) external {
if (msg.sender != registry.creatorOf(robinId)) revert Unauthorized();
string memory name = _idToName[robinId];
if (bytes(name).length == 0) return;
delete _nameToId[name];
delete _idToName[robinId];
emit NameReleased(robinId, keccak256(bytes(name)), name);
}
/// @notice Resolve a name to its Robin ID. Returns 0 if not registered.
function resolveName(string calldata name) external view returns (uint256) {
return _nameToId[name];
}
/// @notice Get the name for a Robin ID. Empty string if none.
function nameOf(uint256 robinId) external view returns (string memory) {
return _idToName[robinId];
}
/// @notice Whether a name is valid AND currently unclaimed.
function isNameAvailable(string calldata name) external view returns (bool) {
if (!_validateName(name)) return false;
return _nameToId[name] == 0;
}
/// @notice Whether a Robin has a registered name.
function hasName(uint256 robinId) external view returns (bool) {
return bytes(_idToName[robinId]).length != 0;
}
// ── Validation ──────────────────────────────────────────────────────
/// @dev 3-32 chars, lowercase [a-z0-9] and '-', no leading/trailing hyphen,
/// no consecutive hyphens.
function _validateName(string calldata name) internal pure returns (bool) {
bytes calldata b = bytes(name);
uint256 len = b.length;
if (len < 3 || len > 32) return false;
bool prevHyphen = false;
for (uint256 i = 0; i < len; i++) {
bytes1 c = b[i];
bool isLower = (c >= 0x61 && c <= 0x7a);
bool isDigit = (c >= 0x30 && c <= 0x39);
bool isHyphen = (c == 0x2d);
if (!isLower && !isDigit && !isHyphen) return false;
if (isHyphen) {
if (i == 0 || i == len - 1) return false;
if (prevHyphen) return false;
prevHyphen = true;
} else {
prevHyphen = false;
}
}
return true;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "registry_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "InvalidName",
"type": "error",
"inputs": []
},
{
"name": "NameTaken",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "NameRegistered",
"type": "event",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "nameHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "NameReleased",
"type": "event",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "nameHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "hasName",
"type": "function",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isNameAvailable",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "nameOf",
"type": "function",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "registerName",
"type": "function",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "name",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "registry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IRobinRegistry"
}
],
"stateMutability": "view"
},
{
"name": "releaseName",
"type": "function",
"inputs": [
{
"name": "robinId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "resolveName",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x60a060405234801561001057600080fd5b50604051610d2e380380610d2e83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b608051610c966100986000396000818160c50152818161022101526104740152610c966000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638cf44d211161005b5780638cf44d21146100ff578063bc19bce514610122578063c3f6452314610143578063d6c6cd6b1461015657600080fd5b8063051a26641461008257806348e69e68146100ab5780637b103999146100c0575b600080fd5b6100956100903660046108f5565b610169565b6040516100a29190610932565b60405180910390f35b6100be6100b93660046108f5565b61020b565b005b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a2565b61011261010d3660046109ae565b6103ef565b60405190151581526020016100a2565b6101356101303660046109ae565b610434565b6040519081526020016100a2565b6100be6101513660046109f0565b61045e565b6101126101643660046108f5565b61071b565b600081815260016020526040902080546060919061018690610a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546101b290610a3c565b80156101ff5780601f106101d4576101008083540402835291602001916101ff565b820191906000526020600020905b8154815290600101906020018083116101e257829003601f168201915b50505050509050919050565b60405163589a174360e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063589a174390602401602060405180830381865afa158015610270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102949190610a76565b6001600160a01b0316336001600160a01b0316146102c4576040516282b42960e81b815260040160405180910390fd5b600081815260016020526040812080546102dd90610a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461030990610a3c565b80156103565780601f1061032b57610100808354040283529160200191610356565b820191906000526020600020905b81548152906001019060200180831161033957829003601f168201915b50505050509050805160000361036a575050565b60008160405161037a9190610aa6565b9081526020016040518091039020600090556001600083815260200190815260200160002060006103ab919061089f565b8080519060200120827f3f9f02d5d733e005da5c35bed73799c0b17671c2d2363c80a67a4d7e136a026b836040516103e39190610932565b60405180910390a35050565b60006103fb838361073d565b6104075750600061042e565b60008383604051610419929190610ac2565b90815260200160405180910390205460001490505b92915050565b6000808383604051610447929190610ac2565b908152602001604051809103902054905092915050565b60405163589a174360e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063589a174390602401602060405180830381865afa1580156104c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e79190610a76565b6001600160a01b0316336001600160a01b031614610517576040516282b42960e81b815260040160405180910390fd5b610521828261073d565b61053e5760405163430f13b360e01b815260040160405180910390fd5b60008282604051610550929190610ac2565b90815260200160405180910390205460001461057f57604051639e4b268560e01b815260040160405180910390fd5b6000838152600160205260408120805461059890610a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546105c490610a3c565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b505050505090508051600014610684576000816040516106319190610aa6565b9081526020016040518091039020600090558080519060200120847f3f9f02d5d733e005da5c35bed73799c0b17671c2d2363c80a67a4d7e136a026b8360405161067b9190610932565b60405180910390a35b8360008484604051610697929190610ac2565b90815260408051602092819003830190209290925560008681526001909152206106c2838583610b39565b5082826040516106d3929190610ac2565b6040518091039020847f7d2544d426842d9ff741a467624b59778633d344b06702c36c8f6eb6582230a5858560405161070d929190610bfa565b60405180910390a350505050565b6000818152600160205260408120805461073490610a3c565b15159392505050565b600082828060038110806107515750602081115b15610762576000935050505061042e565b6000805b8281101561089157600085858381811061078257610782610c29565b909101356001600160f81b031916915060009050606160f81b82108015906107b85750603d60f91b6001600160f81b0319831611155b90506000600360fc1b6001600160f81b03198416108015906107e85750603960f81b6001600160f81b0319841611155b9050602d60f81b6001600160f81b031984161482158015610807575081155b8015610811575080155b15610828576000995050505050505050505061042e565b801561087c578415806108445750610841600188610c3f565b85145b1561085b576000995050505050505050505061042e565b8515610873576000995050505050505050505061042e565b60019550610881565b600095505b5050600190920191506107669050565b506001979650505050505050565b5080546108ab90610a3c565b6000825580601f106108bb575050565b601f0160209004906000526020600020908101906108d991906108dc565b50565b5b808211156108f157600081556001016108dd565b5090565b60006020828403121561090757600080fd5b5035919050565b60005b83811015610929578181015183820152602001610911565b50506000910152565b602081526000825180602084015261095181604085016020870161090e565b601f01601f19169190910160400192915050565b60008083601f84011261097757600080fd5b50813567ffffffffffffffff81111561098f57600080fd5b6020830191508360208285010111156109a757600080fd5b9250929050565b600080602083850312156109c157600080fd5b823567ffffffffffffffff8111156109d857600080fd5b6109e485828601610965565b90969095509350505050565b600080600060408486031215610a0557600080fd5b83359250602084013567ffffffffffffffff811115610a2357600080fd5b610a2f86828701610965565b9497909650939450505050565b600181811c90821680610a5057607f821691505b602082108103610a7057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610a8857600080fd5b81516001600160a01b0381168114610a9f57600080fd5b9392505050565b60008251610ab881846020870161090e565b9190910192915050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610b34576000816000526020600020601f850160051c81016020861015610b115750805b601f850160051c820191505b81811015610b3057828155600101610b1d565b5050505b505050565b67ffffffffffffffff831115610b5157610b51610ad2565b610b6583610b5f8354610a3c565b83610ae8565b6000601f841160018114610b995760008515610b815750838201355b600019600387901b1c1916600186901b178355610bf3565b600083815260209020601f19861690835b82811015610bca5786850135825560209485019460019092019101610baa565b5086821015610be75760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561042e57634e487b7160e01b600052601160045260246000fdfea2646970667358221220643b15560a9a4ef9145c5b1279bd7a172607c5e7f70d63e5ead518748722451864736f6c63430008180033000000000000000000000000704d2283667e77a9aef6eb9e30c0c2a705ab9a9e
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638cf44d211161005b5780638cf44d21146100ff578063bc19bce514610122578063c3f6452314610143578063d6c6cd6b1461015657600080fd5b8063051a26641461008257806348e69e68146100ab5780637b103999146100c0575b600080fd5b6100956100903660046108f5565b610169565b6040516100a29190610932565b60405180910390f35b6100be6100b93660046108f5565b61020b565b005b6100e77f000000000000000000000000704d2283667e77a9aef6eb9e30c0c2a705ab9a9e81565b6040516001600160a01b0390911681526020016100a2565b61011261010d3660046109ae565b6103ef565b60405190151581526020016100a2565b6101356101303660046109ae565b610434565b6040519081526020016100a2565b6100be6101513660046109f0565b61045e565b6101126101643660046108f5565b61071b565b600081815260016020526040902080546060919061018690610a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546101b290610a3c565b80156101ff5780601f106101d4576101008083540402835291602001916101ff565b820191906000526020600020905b8154815290600101906020018083116101e257829003601f168201915b50505050509050919050565b60405163589a174360e01b8152600481018290527f000000000000000000000000704d2283667e77a9aef6eb9e30c0c2a705ab9a9e6001600160a01b03169063589a174390602401602060405180830381865afa158015610270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102949190610a76565b6001600160a01b0316336001600160a01b0316146102c4576040516282b42960e81b815260040160405180910390fd5b600081815260016020526040812080546102dd90610a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461030990610a3c565b80156103565780601f1061032b57610100808354040283529160200191610356565b820191906000526020600020905b81548152906001019060200180831161033957829003601f168201915b50505050509050805160000361036a575050565b60008160405161037a9190610aa6565b9081526020016040518091039020600090556001600083815260200190815260200160002060006103ab919061089f565b8080519060200120827f3f9f02d5d733e005da5c35bed73799c0b17671c2d2363c80a67a4d7e136a026b836040516103e39190610932565b60405180910390a35050565b60006103fb838361073d565b6104075750600061042e565b60008383604051610419929190610ac2565b90815260200160405180910390205460001490505b92915050565b6000808383604051610447929190610ac2565b908152602001604051809103902054905092915050565b60405163589a174360e01b8152600481018490527f000000000000000000000000704d2283667e77a9aef6eb9e30c0c2a705ab9a9e6001600160a01b03169063589a174390602401602060405180830381865afa1580156104c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e79190610a76565b6001600160a01b0316336001600160a01b031614610517576040516282b42960e81b815260040160405180910390fd5b610521828261073d565b61053e5760405163430f13b360e01b815260040160405180910390fd5b60008282604051610550929190610ac2565b90815260200160405180910390205460001461057f57604051639e4b268560e01b815260040160405180910390fd5b6000838152600160205260408120805461059890610a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546105c490610a3c565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b505050505090508051600014610684576000816040516106319190610aa6565b9081526020016040518091039020600090558080519060200120847f3f9f02d5d733e005da5c35bed73799c0b17671c2d2363c80a67a4d7e136a026b8360405161067b9190610932565b60405180910390a35b8360008484604051610697929190610ac2565b90815260408051602092819003830190209290925560008681526001909152206106c2838583610b39565b5082826040516106d3929190610ac2565b6040518091039020847f7d2544d426842d9ff741a467624b59778633d344b06702c36c8f6eb6582230a5858560405161070d929190610bfa565b60405180910390a350505050565b6000818152600160205260408120805461073490610a3c565b15159392505050565b600082828060038110806107515750602081115b15610762576000935050505061042e565b6000805b8281101561089157600085858381811061078257610782610c29565b909101356001600160f81b031916915060009050606160f81b82108015906107b85750603d60f91b6001600160f81b0319831611155b90506000600360fc1b6001600160f81b03198416108015906107e85750603960f81b6001600160f81b0319841611155b9050602d60f81b6001600160f81b031984161482158015610807575081155b8015610811575080155b15610828576000995050505050505050505061042e565b801561087c578415806108445750610841600188610c3f565b85145b1561085b576000995050505050505050505061042e565b8515610873576000995050505050505050505061042e565b60019550610881565b600095505b5050600190920191506107669050565b506001979650505050505050565b5080546108ab90610a3c565b6000825580601f106108bb575050565b601f0160209004906000526020600020908101906108d991906108dc565b50565b5b808211156108f157600081556001016108dd565b5090565b60006020828403121561090757600080fd5b5035919050565b60005b83811015610929578181015183820152602001610911565b50506000910152565b602081526000825180602084015261095181604085016020870161090e565b601f01601f19169190910160400192915050565b60008083601f84011261097757600080fd5b50813567ffffffffffffffff81111561098f57600080fd5b6020830191508360208285010111156109a757600080fd5b9250929050565b600080602083850312156109c157600080fd5b823567ffffffffffffffff8111156109d857600080fd5b6109e485828601610965565b90969095509350505050565b600080600060408486031215610a0557600080fd5b83359250602084013567ffffffffffffffff811115610a2357600080fd5b610a2f86828701610965565b9497909650939450505050565b600181811c90821680610a5057607f821691505b602082108103610a7057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610a8857600080fd5b81516001600160a01b0381168114610a9f57600080fd5b9392505050565b60008251610ab881846020870161090e565b9190910192915050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b601f821115610b34576000816000526020600020601f850160051c81016020861015610b115750805b601f850160051c820191505b81811015610b3057828155600101610b1d565b5050505b505050565b67ffffffffffffffff831115610b5157610b51610ad2565b610b6583610b5f8354610a3c565b83610ae8565b6000601f841160018114610b995760008515610b815750838201355b600019600387901b1c1916600186901b178355610bf3565b600083815260209020601f19861690835b82811015610bca5786850135825560209485019460019092019101610baa565b5086821015610be75760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b8181038181111561042e57634e487b7160e01b600052601160045260246000fdfea2646970667358221220643b15560a9a4ef9145c5b1279bd7a172607c5e7f70d63e5ead518748722451864736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000106 | $0 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x3a0fde…af4146 | 35 days agoSat, 11 Jul 2026 22:32:42 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000006 [1] 0xd075002e8f97…08657243 data: 0x000000000000000000…00000000 |
| 0x373607…1d3710 | 35 days agoSat, 11 Jul 2026 19:32:28 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000005 [1] 0x562a28a1a0d7…b2b95c44 data: 0x000000000000000000…00000000 |
| 0xb4cacc…66b6ad | 36 days agoSat, 11 Jul 2026 00:28:48 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000004 [1] 0xe5ca99cf63f4…5d00419e data: 0x000000000000000000…00000000 |
| 0x466c5d…bf6c43 | 36 days agoFri, 10 Jul 2026 18:59:12 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000003 [1] 0x48d4ca3aff44…bf0eebce data: 0x000000000000000000…00000000 |
| 0xa89184…48fe6a | 36 days agoFri, 10 Jul 2026 18:55:34 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000002 [1] 0x6ee4d31d3f81…e1006adf data: 0x000000000000000000…00000000 |
| 0xdd39a7…a4bf21 | 36 days agoFri, 10 Jul 2026 16:45:59 UTC | 0x7d2544…30a5 | [0] 0x000000000000…00000001 [1] 0x41cab718c8e9…9cd8f8e4 data: 0x000000000000000000…00000000 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf5cc814c…a71e7d | Transfer | 19,028,238 | 21 days agoSat, 25 Jul 2026 12:59:23 UTC | 0xcaf7…5d11 | IN | 0xee92…92ef | $0.001 DIH |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x3a0fde…af4146 | registerName | 7,304,935 | 35 days agoSat, 11 Jul 2026 22:32:42 UTC | 0xf58a…fb67 | IN | RobinNameService | $0.000 ETH | 0.00000481 | |
| 0x373607…1d3710 | registerName | 7,196,943 | 35 days agoSat, 11 Jul 2026 19:32:28 UTC | 0x5e27…3bd3 | IN | RobinNameService | $0.000 ETH | 0.00000516 | |
| 0xb4cacc…66b6ad | registerName | 6,511,548 | 36 days agoSat, 11 Jul 2026 00:28:48 UTC | 0xcec6…3e39 | IN | RobinNameService | $0.000 ETH | 0.00000414 | |
| 0x466c5d…bf6c43 | registerName | 6,314,003 | 36 days agoFri, 10 Jul 2026 18:59:12 UTC | 0x07d8…736e | IN | RobinNameService | $0.000 ETH | 0.00002069 | |
| 0xa89184…48fe6a | registerName | 6,311,815 | 36 days agoFri, 10 Jul 2026 18:55:34 UTC | 0xcec6…3e39 | IN | RobinNameService | $0.000 ETH | 0.00002131 | |
| 0xdd39a7…a4bf21 | registerName | 6,234,149 | 36 days agoFri, 10 Jul 2026 16:45:59 UTC | 0xcec6…3e39 | IN | RobinNameService | $0.000 ETH | 0.00002564 |