Developers

Docs & SDK.

The .agent registry is a native Robinhood Chain program live on mainnet. Interact with it directly using @solana/web3.js — no custom SDK required.

Overview

NEURONS (NeuralNS) is a namespace protocol on Robinhood Chain that assigns persistent, human-readable identities to AI agents. Each name is a Program Derived Address (PDA) storing its owner, resolver, expiry, verified flag, AgentCard NFT mint and metadata URI on chain.

PDA derivation is [ "name", sha256(name) ]. Forward resolution is simply "derive the PDA and read the account" — no indexer needed. All protocol economics (tier prices, payment token, treasury) live in a config PDA [ "config" ] readable by anyone.

Program

The program is deployed on Robinhood Chain:

Program ID5dqCWiZvLWD1Nge15UhXyGCGd2rF8uN6nPigdnLRWCv1
LoaderBPFLoaderUpgradeable
StandardNative Robinhood Chain (no Anchor) + Token-2022 AgentCards

Install

One real dependency — everything else lives in the program repo.

npm install @solana/web3.js

Resolve a name (read on-chain)

Derive the PDA, read the account, decode the fields. This works today against mainnet.

import { Connection, PublicKey } from '@solana/web3.js';
import { createHash } from 'node:crypto';

const PROGRAM_ID = new PublicKey('5dqCWiZvLWD1Nge15UhXyGCGd2rF8uN6nPigdnLRWCv1');
const conn = new Connection('https://api.mainnet-beta.solana.com');

function namePda(name) {
  const hash = createHash('sha256').update(name).digest();
  return PublicKey.findProgramAddressSync(
    [Buffer.from('name'), hash], PROGRAM_ID,
  )[0];
}

const pda = namePda('neuralns.agent');
const acc = await conn.getAccountInfo(pda);
if (!acc) throw new Error('not registered');

const d = acc.data;            // layout below (§ On-chain record)
const owner    = new PublicKey(d.subarray(2, 34));
const resolver = new PublicKey(d.subarray(34, 66));
const expiry   = d.readBigInt64LE(66);     // 0 = permanent
const verified = d[74] === 1;
const cardMint = new PublicKey(d.subarray(75, 107));
const nameLen  = d.readUInt32LE(107);
const name     = d.subarray(111, 111 + nameLen).toString('utf8');
const uriLen   = d.readUInt32LE(111 + nameLen);
const uri      = d.subarray(115 + nameLen, 115 + nameLen + uriLen).toString('utf8');

console.log({ name, owner: owner.toBase58(), verified, expiry, uri });

Register a name (send a tx)

Build the Register instruction (Borsh) and sign it with the payer / connected wallet. The treasury and prices are read from the config PDA.

// Borsh: variant 0 + name(string) + resolver(pubkey) + years(u32) + metadata_uri(string)
function encodeRegister(name, resolver, years, uri) {
  const s = (str) => {
    const b = Buffer.from(str, 'utf8');
    const len = Buffer.alloc(4); len.writeUInt32LE(b.length);
    return Buffer.concat([len, b]);
  };
  const yr = Buffer.alloc(4); yr.writeUInt32LE(years);
  return Buffer.concat([Buffer.from([0]), s(name), resolver.toBuffer(), yr, s(uri)]);
}

const CONFIG = PublicKey.findProgramAddressSync([Buffer.from('config')], PROGRAM_ID)[0];
// treasury = bytes 34..66 of the config account
const cfg = await conn.getAccountInfo(CONFIG);
const TREASURY = new PublicKey(cfg.data.subarray(34, 66));

const ix = new TransactionInstruction({
  programId: PROGRAM_ID,
  keys: [
    { pubkey: payer.publicKey, isSigner: true,  isWritable: true },  // payer
    { pubkey: namePda(name),   isSigner: false, isWritable: true },  // record PDA
    { pubkey: CONFIG,          isSigner: false, isWritable: false }, // config PDA
    { pubkey: TREASURY,        isSigner: false, isWritable: true },  // fee receiver
    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
  ],
  data: encodeRegister(name, payer.publicKey, 1, 'https://neuralns.xyz/api/agent/' + name + '/card.json'),
});
await sendAndConfirmTransaction(conn, new Transaction().add(ix), [payer]);

On-chain record layout

Each name PDA stores exactly these bytes (Borsh):

offset   size field
0        1    version (u8 = 2)
1        1    bump (u8)
2        32   owner (Pubkey)
34       32   resolver (Pubkey)
66       8    expiry (i64, unix seconds; 0 = permanent)
74       1    verified (u8)
75       32   card_mint (Pubkey; zeroes = no AgentCard yet)
107      4+N  name (string: u32 len + utf8 bytes)
111+N    4+M  metadata_uri (string: u32 len + utf8 bytes)

The AgentCard is a Token-2022 NFT minted at PDA [ "card", sha256(name) ] with the token-metadata extension (name, symbol, URI) and an optional non-transferable (soulbound) extension.

Program instructions

IX
Register { name, resolver, years, metadata_uri }
Create the PDA, pay the tiered SOL fee; optional holder discount
IX
RegisterWithToken { … }
Fee paid in $NEURONS — 100% burned on-chain (BurnChecked) in the same tx
IX
UpdateResolver { resolver }
Repoint resolution (owner signs)
IX
Transfer { new_owner }
Change owner (owner signs)
IX
Renew { years }
Extend expiry, pay the tiered fee
IX
UpdateMetadata { uri }
Set the AgentCard manifest URI (owner signs)
IX
MintAgentCard { soulbound }
Mint the AgentCard as a Token-2022 NFT to the owner wallet
IX
Verify
Owner pays the verify fee — verified flag set on-chain
IX
InitConfig / UpdateConfig
Admin-managed economics: prices, payment token, treasury, pause

Data source

Everything on this site is live on-chain data: the REST endpoints (/api/explore, /api/stats, /api/resolve…) are served by an indexer that reads the program's accounts on Robinhood Chain via getProgramAccounts. Forward resolution can also be done trustlessly without our API — derive the PDA and read it (see Resolve above).

Roadmap

NEXT
SDK v1.0 on npm
@neurons-ns/sdk — register, resolve, reverse, discover
NEXT
Integrations
SAID Protocol · SNS cross-resolver · marketplace listings
NEXT
Category namespaces
Community-owned .defi / .security / .oracle namespaces with royalties
NEXT
Security audit
Independent program audit before fee-scale-up