Overview
Earnfolio is a vault that supplies liquidity to the tokenized stock markets on Robinhood Chain. Depositors put in USDG; the vault holds concentrated Uniswap v3 positions in stock/USDG pools; traders pay a swap fee to those positions; depositors own the fees.
There is no borrower and no emission. The yield is a share of trading that happens whether or not the vault is there, which is why it is described as yield from activity rather than from interest.
Chain and addresses
This chain hosts many contracts whose only product is a misleading name — several are called UniswapV3Factory and several tokens share a ticker with a genuine one. The factory above is the one that holds the real first-party pools, identified by its bytecode size, its owner and its tick spacings rather than by its name.
Pools
A pool can only be registered if it passes three checks in the contract, none of which the operator can disable:
- The canonical factory reports it, so the pool cannot be an impostor with matching storage.
- One side is exactly the USDG address the vault was constructed with.
- The other side answers
uiMultiplier(). Genuine first-party Robinhood tokens implement it; clones revert. This is the rule that keeps Earnfolio to tokenized stocks.
At most eight positions can be held at once. Redemption gas is linear in the position count, and a redemption that will not fit in a block is a vault nobody can leave.
Shares
The vault is a plain ERC-20 share token, not an ERC-4626 vault, and that is deliberate. ERC-4626 promises that previewRedeem never overstates what a redemption pays. Redeeming here burns concentrated liquidity and swaps the stock leg back through the same pool, so the realised amount depends on price impact in that moment. Rather than claim the standard and bend its one load-bearing guarantee, the interface is explicit:
Both write paths take a caller-supplied bound. previewRedeem is a spot-valued estimate that ignores the cost of unwinding, and is labelled as such everywhere it appears.
totalAssets() is idle USDG plus, for each position, the USDG and stock its liquidity is worth at the current price, plus amounts the pool has already checkpointed as owed. Fee growth the pool has not yet checkpointed is excluded, which cannot misprice a share because both write paths harvest before any share arithmetic runs.
Range width and what you actually earn
The rate on the front page is a pool-level figure: fees paid divided by all the liquidity in that pool. A depositor only earns it if the vault’s capital is as concentrated as the liquidity already sitting there. Spread it wider and it earns strictly less, because a Uniswap v3 position only collects fees while the price is inside its range and only in proportion to its share of the liquidity at that price.
This was measured against the real NVDA pool rather than modelled — a $50,000 stake at four range widths, with $640,000 of round-trip flow driven through the pool on a mainnet fork:
The last column is the honest one. At ±2000 ticks the same money earns a quarter of the quoted rate; at ±500 it earns about 95% of it; tighter than that it beats the pool average because it is doing more of the work.
The vault targets ±500 ticks. Roughly the pool-level rate the site quotes, in a band wide enough to survive an ordinary day's move without going idle. Tighter earns more per dollar but leaves the range sooner and takes more loss-versus-rebalancing. A narrower band earns more per dollar but leaves the range sooner, stops earning entirely while it is outside, and takes more loss-versus-rebalancing on the way. Measured 2026-09-04.
The price guard
Because the vault values its stock legs at the pool price, a manipulated pool would be a mispriced share — push the price, deposit or redeem, push it back. Before any deposit or redemption, every position’s pool is checked:
An attacker has to hold a dislocated price for the entire averaging window against arbitrage flow that runs at several swaps a second. A genuine user is blocked only while the pool is genuinely dislocated, which on these pools is a block or two. The oracle depth needed for that window is checked when a pool is registered, and anybody can pay to deepen a pool’s oracle.
Rebalancing
An operator key moves liquidity between registered pools using four primitives — remove, swap, mint and range changes — sequenced off-chain and submitted as one transaction. The contract decides nothing; it enforces the price guard, the caller’s slippage bounds and the pool registry.
What the operator cannot do:
- withdraw depositor funds, by any path
- register a pool that fails the genuine-stock or canonical-factory checks
- raise the performance fee above 20%
- move a position’s range while it still holds liquidity
- remove a pool that still holds liquidity
Harvesting is permissionless. Anyone can collect the vault’s accrued fees back into its positions.
Fees
The performance fee is taken in kind at harvest, so paying the operator never requires a swap and never moves a pool price. The pool protocol fee is not Earnfolio’s and is deducted from every rate shown on this site.
Risk
Supplying liquidity is not lending, and it carries two costs that a lending rate does not.
- Price exposure. Deployed USDG is partly stock. If the stock falls, the position falls, regardless of fees earned.
- Loss-versus-rebalancing. When a price moves, the pool sells the appreciating side and buys the depreciating one on the way through. The fee income and this cost come from the same flow, and the cost can be larger.
Every rate on this site is a measured trailing figure gross of both. The test suite contains a test that asserts this mechanism rather than hiding it.
Status
Deployed on Robinhood Chain. The address is above and in the footer. Unaudited either way. Pool figures were last measured on 4 Sept 2026.