Independent Agent Vaults
Every Neuron agent is its own ERC-4626 vault on Robinhood Chain testnet, with its own USDG, its own shares, its own fee settings and its own on-chain track record.
One agent, one vault
Each agent runs out of a dedicated AgentVault contract (contracts/src/AgentVault.sol), built on OpenZeppelin's ERC-4626, Ownable, Pausable and ReentrancyGuard. You deposit USDG, the vault mints you shares, and the vault forwards the money to the agent's strategy module. Nothing is pooled across agents: a vault's value is the USDG it holds plus whatever its own strategy reports, so one agent's results never touch another agent's depositors.
On testnet the asset is a free test USDG (the MockUSDC contract, symbol USDG, 6 decimals). Agents that users create are deployed by the community AgentFactory as VotingAgentVault, which is an AgentVault whose shares also carry voting checkpoints. The house agents run on the same factory today (see Protocol-Owned Agents).
Shares
- Non-transferable. Shares can only be minted (deposit) and burned (withdrawal). Any transfer between two wallets reverts with
SharesNonTransferable. They are receipts, not tradable tokens. - Priced from $1.00. The vault uses a decimals offset of 6, so shares have 12 decimals and one whole share starts out worth 1 USDG. The "Share price" on an agent's deposit panel is
pricePerShare(), the USDG one whole share redeems for. - Named after the agent. Factory vaults are called "Neuron <name>" with the symbol "ai<TICKER>".
- Inflation-resistant. The decimals offset is OpenZeppelin's standard defense against first-depositor share inflation.
What each vault tracks
| On-chain value | What it holds |
|---|---|
agentId | The agent's slug, for example nexi-v2 |
totalAssets() | USDG sitting in the vault plus strategy.totalAssets() |
strategy | The strategy module the vault invests through |
performanceFeeBps | The performance fee, in basis points |
feeRecipient | Where fee shares are minted (the FeeCollector) |
depositCap | Maximum total assets the vault accepts |
minDeposit | Smallest single deposit |
highWaterMark | Highest price per share fees were charged at |
costBasis(wallet) | USDG a wallet put in, reduced pro rata on withdrawals |
Because shares never move between wallets, the on-chain costBasis is exact, and the app shows your profit as current value minus cost basis without needing the indexer.
The strategy module
A vault delegates capital through the IStrategy interface: asset(), vault(), totalAssets(), invest(), withdraw() and withdrawAll(). BaseStrategy binds each strategy to one vault and one asset at deployment (both immutable), and only that vault can move funds through it.
- 1On deposit, the vault sends its idle USDG to the strategy and calls
invest. - 2On withdrawal, the vault pays from its own idle balance first, then asks the strategy to free the rest. If the two together cannot cover the amount, the call reverts with
InsufficientLiquidity. - 3On a strategy change, the vault calls
withdrawAllon the old module and invests everything in the new one, in the same transaction.
Two strategies exist in the repo. SimulatedStrategy is testnet only and models trading results. IdleStrategy just holds funds; the deploy script uses it whenever a real dollar token is configured, "until audited strategy modules are plugged in".
Reports
On testnet, each agent's results reach its vault through SimulatedStrategy.report(pnlBps, note):
- Only the strategy's
operator(the platform's agent wallet) can call it. - The absolute move must be at most
maxReportBps, otherwiseReportTooLarge. - Calls must be at least
minReportIntervalseconds apart, otherwiseReportTooSoon. - The strategy mints or burns test USDG equal to
totalAssets * |pnlBps| / 10,000, so the vault's value moves with the agent's paper results. - It emits
Reported(pnlBps, pnlAssets, totalAssets, note). The note is the agent's public rationale plus its encoded portfolio.
Agents created by the factory get a 60 second minimum interval and a 1,000 bps (10%) cap per report. How the site turns these events into returns is covered in Public PnL & Trade History.
Performance fee
The fee is charged only on gains above the high-water mark, measured as price per share:
- Fees are crystallized before every
deposit,mint,withdrawandredeem, and byharvest(), which anyone can call. - The fee is paid by minting new shares to the
FeeCollector, worth exactly the fee in USDG. Nobody's USDG leaves the vault at that moment. - While the price per share is below the mark, no fee accrues. A losing agent has to recover its losses before it charges again.
- The cap is
MAX_PERFORMANCE_FEE_BPS = 3,000(30%). Agents created from the Create page use 2,000 (20%). House agents use 10% to 20% (set per agent in the original deployment and carried over on each relaunch); each agent's rate is shown in its deposit panel.
Example: 1,000 shares go from $1.00 to $1.10. The gain above the mark is $100, so at 20% the vault mints $20 worth of shares to the FeeCollector, and depositors keep a price per share of about $1.08.
FeeCollector.distribute(vault) is permissionless. It redeems the collector's fee shares and splits the USDG: operatorShareBps to the agent's operator and the rest to the protocol treasury. The factory creates its collector with 5,000 bps and registers each agent's creator as the operator, so creators get half of their agent's performance fees. A vault with no operator set pays everything to the treasury. See Creator Fees & Rewards.
Owner powers and their limits
| Function | What it does | Limit in the contract |
|---|---|---|
setStrategy | Moves all capital to a new strategy module | The new module must use the same asset and name this vault; fees accrue first |
setFeeConfig | Changes the fee recipient and rate | Rate cannot exceed 30%; fees owed at the old rate accrue first |
setDepositLimits | Changes the cap and minimum deposit | None beyond the values themselves |
pause / unpause | Stops new deposits and mints | Withdrawals and redeems stay open while paused |
What the owner cannot do: move your shares, block withdrawals, charge more than 30%, or charge a fee on a loss. What you still trust: setStrategy can point the vault at any module that passes the asset and vault check, and that module then holds the money. Factory vaults and strategies are owned by the factory's owner, a platform account. The repo plans to hand vault ownership to a 48 hour TimelockController before mainnet; that is not done yet, and the contracts are not audited.
Events
- ERC-4626 and ERC-20:
Deposit,Withdraw, andTransfer(mints and burns only). - Vault admin:
StrategyUpdated,FeesAccrued,FeeConfigUpdated,DepositLimitsUpdated,Paused,Unpaused,OwnershipTransferred. VotingAgentVaultaddsDelegateChangedandDelegateVotesChanged. Every holder is self-delegated on first mint.- Strategy:
ReportedandOperatorSet. Fee collector:Distributed.
Community vaults from the AgentFactory
AgentFactory.createAgent (contracts/src/community/AgentFactory.sol) lets anyone deploy a full agent in one transaction: a VotingAgentVault, a SimulatedStrategy, an AgentGovernor holding the starting rules, and a fixed-supply AgentToken on a BondingCurve.
| Factory setting | Default | Bounds in setLimits |
|---|---|---|
| Report interval | 60 seconds | 30 seconds to 1 day |
| Max move per report | 1,000 bps | 1 to 5,000 bps |
| Deposit cap | 100,000 USDG | At least the minimum deposit |
| Minimum deposit | 10 USDG | At least 1 USDG |
New limits apply only to agents created afterwards. Inputs are checked on-chain: the slug is 3 to 32 characters of a-z, 0-9 and -, the name 1 to 40 bytes, the ticker 1 to 12 bytes, the X handle up to 15 bytes and the persona up to 1,024 bytes. The platform's operator wallet runs every agent's trades, and the factory owner keeps admin rights over each vault and strategy.
The bonding-curve token is still deployed with each agent, but the site no longer uses it. Agent tokens now launch on Realm once an agent is up 10% (see Agent Launchpad).
On testnet a vault's value moves because the operator reports paper results, not because the vault holds real positions. The contract caps and rate-limits each report but cannot check that it is true. The contracts have not been audited.
Related
Neuron is on Robinhood Chain testnet. Testnet performance is not evidence of real-money profitability.
