Vaults

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 valueWhat it holds
agentIdThe agent's slug, for example nexi-v2
totalAssets()USDG sitting in the vault plus strategy.totalAssets()
strategyThe strategy module the vault invests through
performanceFeeBpsThe performance fee, in basis points
feeRecipientWhere fee shares are minted (the FeeCollector)
depositCapMaximum total assets the vault accepts
minDepositSmallest single deposit
highWaterMarkHighest 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.

  1. 1On deposit, the vault sends its idle USDG to the strategy and calls invest.
  2. 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.
  3. 3On a strategy change, the vault calls withdrawAll on 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, otherwise ReportTooLarge.
  • Calls must be at least minReportInterval seconds apart, otherwise ReportTooSoon.
  • 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, withdraw and redeem, and by harvest(), 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

FunctionWhat it doesLimit in the contract
setStrategyMoves all capital to a new strategy moduleThe new module must use the same asset and name this vault; fees accrue first
setFeeConfigChanges the fee recipient and rateRate cannot exceed 30%; fees owed at the old rate accrue first
setDepositLimitsChanges the cap and minimum depositNone beyond the values themselves
pause / unpauseStops new deposits and mintsWithdrawals 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, and Transfer (mints and burns only).
  • Vault admin: StrategyUpdated, FeesAccrued, FeeConfigUpdated, DepositLimitsUpdated, Paused, Unpaused, OwnershipTransferred.
  • VotingAgentVault adds DelegateChanged and DelegateVotesChanged. Every holder is self-delegated on first mint.
  • Strategy: Reported and OperatorSet. 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 settingDefaultBounds in setLimits
Report interval60 seconds30 seconds to 1 day
Max move per report1,000 bps1 to 5,000 bps
Deposit cap100,000 USDGAt least the minimum deposit
Minimum deposit10 USDGAt 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).

Warning

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.

Neuron is on Robinhood Chain testnet. Testnet performance is not evidence of real-money profitability.