Overview
VELORA is a composable vault protocol built on ERC-4626. You deposit an underlying asset, receive transferable vault shares, and earn yield that is credited directly to the vault's net asset value (NAV). There is no lockup and no separate fee-claim step.
How it works
Each vault tracks its assets in storage rather than reading the raw token balance. This is the core of the design:
- The share price follows
(totalAssets + 1) / (totalSupply + 1). The+1offset makes the first depositor's position immune to the classic inflation attack. - Because
totalAssetsis stored, a direct token donation to the vault does not move the price. It sits as unharvested profit until a keeper callsharvest(). harvest()recognizes the excess balance into NAV. Only the configuredharvesteraddress may call it.skim(to)can sweep the excess above stored totalAssets, but it can never touch the principal backing outstanding shares.
Contracts
The protocol ships three contracts in contracts/src/:
YieldShares— the ERC-4626 vault. Storage-backedtotalAssets,harvest(), cappedsetFee(), and principal-safeskim().VaultFactory— deploys vaults and indexes them by symbol so the app can resolve/app/[symbol].IntentReactor— an intent-based settlement stub powering the/tradesurface.
Fee model
A single performance fee (in basis points) is charged on harvest profit and is hard-capped at 20% via MAX_FEE. Setting the fee above the cap reverts.
Critically, fees accrue to the NAV: they are retained inside the vault and reflected in the share price. There is no claimFees() function and no third-party fee recipient.
Risks
VELORA is unaudited and experimental. Interacting with it can result in total loss of funds. In particular:
- Smart-contract bugs or exploits.
- Impermanent loss where the underlying strategy exposes the vault to liquidity-provider risk.
- Oracle or keeper failures that delay
harvest().
Local development
Run a local chain, deploy the contracts, then start the web app:
# terminal 1 — local chain anvil # terminal 2 — deploy contracts cd contracts forge test # all green forge script script/Deploy.s.sol --rpc-url http://127.0.0.1:8545 --broadcast # terminal 3 — web app cd apps/web npm install npm run dev
Copy the printed addresses into .env.local (see .env.example) to wire the UI to the chain.