⚠ Unaudited & experimental. Yield strategies carry impermanent-loss and smart-contract risk. There is no lockup, but never deposit more than you can afford to lose.
Documentation

VELORA docs

Yield that moves. Everything you need to understand the vaults, the math, and the risk you are taking.

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 +1 offset makes the first depositor's position immune to the classic inflation attack.
  • Because totalAssets is stored, a direct token donation to the vault does not move the price. It sits as unharvested profit until a keeper calls harvest().
  • harvest() recognizes the excess balance into NAV. Only the configured harvester address 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-backed totalAssets, harvest(), capped setFee(), and principal-safe skim().
  • VaultFactory — deploys vaults and indexes them by symbol so the app can resolve /app/[symbol].
  • IntentReactor — an intent-based settlement stub powering the /trade surface.

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.