Protocol reference
How Velanos works
An agent that wants outside capital posts its own capital first. Every action it takes is an EIP-712 signed intent, checked against an immutable mandate on-chain before any funds move. A rule-breaking intent is never executed — and the agent’s signature on it is cryptographic proof of misconduct that anyone can verify and that slashes its bond to depositors in the same transaction.
Prevent
The mandate is checked before funds move. No arbitrary calls exist.
Prove
A blocked intent still carries a signature. That is the evidence.
Pay
Evidence slashes the bond to depositors, automatically.
01Rulebook
The rulebook
Rules are banded by who is to blame, and the band decides the consequence. This is the most important distinction in the protocol: it is what lets us punish misconduct without punishing an agent for volatility.
Static rules — slashable
These depend only on the intent and the mandate. The agent could have evaluated every one of them before signing, so signing anyway is misconduct and the signature is the evidence. A breach moves the agent’s bond to depositors, whether or not the trade ever executed.
| 101 | Asset not in mandate ASSET_NOT_ALLOWED The traded asset, or the asset being spent, is not one this vault may touch. | Slashable |
| 102 | Venue not in mandate ADAPTER_NOT_ALLOWED The intent routes through a venue the vault never approved. | Slashable |
| 103 | Trade larger than the per-trade cap TRADE_SIZE_EXCEEDED A single buy or position open exceeded the mandate maximum. Sells and closes are never capped. | Slashable |
| 104 | Leverage above the mandate limit LEVERAGE_EXCEEDED Requested leverage is above the cap, or any leverage at all on a spot vault. | Slashable |
| 105 | Signed outside the mandate term OUTSIDE_TERM The intent was signed before the mandate started or after it expired. | Slashable |
| 106 | Signed after the vault was frozen SIGNED_WHILE_FROZEN The agent kept signing after trading had already been halted. | Slashable |
| 107 | Validity window too long VALIDITY_TOO_LONG An intent may stay valid for at most 5 minutes. Longer windows let an agent pre-sign now and fire later under different conditions. | Slashable |
| 108 | Wrong instrument for this vault KIND_NOT_ALLOWED A perpetuals order on a spot vault, or the reverse. | Slashable |
Stateful rules — never slashable
These depend on live vault and market state the agent cannot fully predict. An honest agent trips them. The action is blocked and recorded as a strike; the bond is untouched. Three strikes in a rolling day put the vault in a cooling-off period that clears itself.
| 201 | Would breach the per-asset cap EXPOSURE_EXCEEDED After this trade the vault would hold more of one asset than the mandate allows as a share of NAV. | No slash |
| 202 | Price worse than the slippage limit SLIPPAGE_EXCEEDED The venue quote is further from the oracle fair value than the mandate permits. | No slash |
| 203 | Daily loss budget spent DAILY_LOSS_EXCEEDED NAV per share is below the day open by more than the mandate allows, so new risk pauses. Selling stays open. | No slash |
| 204 | Intent expired before execution DEADLINE_PASSED The intent reached the vault after its own deadline. | No slash |
| 205 | Not enough balance INSUFFICIENT_BALANCE The vault does not hold enough of the asset being spent. | No slash |
| 206 | Vault is not accepting trades VAULT_NOT_ACTIVE The vault is awaiting its bond, cooling off, frozen or settled. | No slash |
| 207 | Venue rejected the order EXECUTION_FAILED The trade was permitted but the venue failed to fill it. Not the agent’s fault. | No slash |
Validity rules — ignored
The intent is not attributable to the agent at all. Nothing is recorded and nothing is slashed.
| 301 | Signature does not match the agent key BAD_SIGNATURE Ignored. The intent cannot be attributed to this agent. | No slash |
| 302 | Nonce already resolved NONCE_USED Ignored. Each nonce is executed, rejected or slashed exactly once. | No slash |
| 303 | Intent is for a different vault or chain WRONG_VAULT_OR_CHAIN Ignored. The EIP-712 domain binds every signature to one vault on one chain. | No slash |
02Deployments
Deployed contracts
Read from the deployment files the deploy scripts write. There is no address literal anywhere else in the codebase.
Nothing deployed yet. Run pnpm contracts:deploy:rh.
03Limitations
Known limitations
Stated plainly, because a loss floor is only worth something if its edges are known.
- Payouts are capped by the bond. If a drawdown is deeper than the bond can cover, depositors keep the remainder of the loss. The fund screen shows that unbacked amount before anyone deposits.
- The oracle is a role-gated test oracle. It exists so the drawdown demo is exact and reproducible. Production replaces it with Chainlink feeds; nothing else changes, because prices are only read through one interface.
- The venue is not a real DEX. Fills come from an oracle-priced pool with a fixed spread and linear depth impact, so the arithmetic in the demo is checkable. Mainnet uses a Uniswap adapter.
- A self-reporting operator can recover the bounty. Bounties are only paid on the reporting path and the agent and operator addresses are excluded, but an operator reporting from an unrelated address it controls keeps that share. The leak is bounded by the bounty rate, and violating is still strictly worse for the agent than not violating.
- Perp NAV is simplified. One position per market, valued as collateral plus unrealised PnL.
- Not audited. Testnet only.