Settlement & the chain
Robinhood Chain, the stock registry, and what a settlement transaction looks like.
The chain
Robinhood Chain, id 4663, EVM. Explorer: robinhoodchain.blockscout.com. Runs are paid in USDG (0x5fc5…d168, 6 decimals).
The stocks
The 47 tokenised stocks are ERC-20s (18 decimals) behind a single beacon, 0xe10b…1b00, which holds the shared implementation, the roles and the blocklist. The registry snapshot neurodots reads is served at /api/stocks with each token's address and reference price.
A settlement
The contract is NeuroTreasury: 116 lines, in contracts/src in the repo, with its tests. It does two things and nothing else:
function payRun(bytes32 agentId, uint256 amount, bytes32 runRef) external;
function vestMany(bytes32[] agentIds, address[] builders, address[] tokens, uint256[] units, uint64 weekId) external; // ownerpayRun pulls USDG from the runner and emits RunPaid, which is the receipt the runtime reads back from the chain before it spends anything. vestMany moves units of the tokenised stock to each builder and emits Vested, which is what a ledger row links to. It never prices anything: the split lives in the manifest, and the arithmetic is on /vesting.
The contract is deployed on Robinhood Chain at 0xa54D0126B26Bc1e728985a1Ad04F4D3DE1cE4053. The historical rows shown before it went live are seeded for illustration and labelled as such. Pending rows accrue from real runs and settle on the next Monday the treasury holds enough of the stock to cover them.
Paying for a run
If an agent has a price, the run page can pay it on chain: approve the treasury for the exact amount, call payRun, then send the transaction hash with the run. The server fetches that receipt itself, checks the agent, the amount and that the hash has not already bought a run, and only then calls the model. Without a receipt the run is a usage grant: free, rate-limited, and vesting from the runtime's margin exactly as the manifest says.