Users deposit permanently-locked veNFTs into the vault and receive a fungible ERC-20 token (llToken) representing their share. The vault claims rewards, swaps them to the underlying token, and locks more into the veNFT — increasing the NAV per token over time.
Default steady-state. USDC is swapped to DUST and locked into the veNFT. totalLocked increases while supply stays constant — NAV per token rises.
When llToken trades below NAV. The vault buys cheap llToken on the DEX and burns it, pushing supply down and price back toward NAV. Intensity scales with discount depth (50-100% buyback).
When llToken trades above 110% of NAV. Vault mints new llToken, sells at premium, compounds all proceeds. Slight dilution, but net accretive because sold above NAV. Capped at 3% supply per epoch with 2-epoch cooldown.
Adding a new veNFT protocol requires only a new adapter implementing IVeNFTAdapter. The core vault stays unchanged. Re-audit scope: ~50 lines.
| Role | Can do | Cannot do | Guardrails |
|---|---|---|---|
| Owner | Set modules, router, keeper, pause, rescue tokens | Mint tokens, move locked DUST, bypass caps | Ownable2Step, future timelock |
| Keeper | executeEpoch, sync | Change config, mint outside epoch, move funds | Price ±10% of reference, mint capped 3%, cooldown, deviation <30% |
| Token | Transfer, approve (ERC-20) | — | Only vault can mint/burn, immutable vault ref |
| Contract | SLOC | Purpose |
|---|---|---|
| VeVault.sol | 263 | Core vault logic (protocol-agnostic) |
| RevenueModule.sol | 129 | Reward processing + fee split |
| OracleModule.sol | 94 | TWAP oracle for regime detection |
| SwapAdapter.sol | 67 | V2/V3 routing wrapper |
| NeverlandAdapter.sol | 59 | Neverland-specific adapter |
| NAVLib.sol | 58 | Pure math (NAV, regime, mint calc) |
| StDustToken.sol | 23 | Minimal ERC-20 wrapper |
| IVeNFTAdapter.sol | 11 | Adapter interface |
| Total | 704 |