docs
How it works, exactly.
The one-sentence version
You deposit USDG into one contract. In that same transaction it is swapped into five tokenized stocks and placed as concentrated liquidity in each stock's USDG pool on Robinhood Chain. Those positions earn a cut of every trade through the pools. The vault collects that, turns it into USDG, and sends it to the address you named — the charity you picked, through Endaoment on Base. Your principal stays in the basket until you withdraw it.
Routes
A deposit opens a Route: your address as owner, a payoutTo address, a handle label, and a share count. Shares are internal and non-transferable. Every route sits in the same five positions, so harvested yield splits exactly by shares. You can withdraw any fraction of a route's principal or change where its yield goes; either action first gives the charity whatever it is owed. Yield can never be redirected to the depositor.
The basket
| stock | weight | pool fee | pool |
|---|---|---|---|
| 20% | 0.05% | 0xd4EB21209C4D6093f80B5b84f5C45cc093EA14a3 | |
| 20% | 0.05% | 0xAae0d815EE56e4092a5E5C2911E676Fea50B2d6D | |
| 20% | 0.05% | 0x34D0dC122CF9A8Eb296fC5e0D3A233625D7d19b7 | |
| 20% | 0.30% | 0x8AC92DA74AB5F3b1d024Dc1943Ad7e15Dc4179Ef | |
| 20% | 0.30% | 0xeb60bCD1D920ad6E102690CCFC6fB488899E1510 |
Positions sit ±500 ticks (about ±5%) around the price at placement. A position earns only while the price is inside its range; the operator re-centres ranges when they drift out, and the basket page shows each range's status live. Every pool was checked to descend from the canonical Uniswap v3 factory and every stock to answer uiMultiplier(), which the genuine first-party Robinhood tokens do and clones do not. The contract enforces both, with no owner override.
Where the yield comes from
Swap fees, nothing else. Robinhood Chain's stock pools see constant arbitrage keeping the onchain price on the offchain quote, and that flow pays LPs. The vault claims fees with harvest(), swaps the stock half to USDG at an honest price (a pool whose spot is more than ~1% from its 30-second average keeps its stock fees for the next harvest rather than selling into a pushed price), takes the performance fee, and credits every route. A separate flush() sends credited USDG to each route's charity wallet. Both are permissionless; a keeper runs them once a day and tops up freshly paid wallets with a sliver of ETH for gas.
What your principal is
A liquidity position holds both sides, so each 20% slice is roughly half stock, half USDG, in the ratio the range needs at the current price. Your principal therefore moves with the five stocks and can end below what you put in. Concentrated liquidity also underperforms simply holding when prices trend (loss-versus-rebalancing); fee figures here are gross of that. Withdrawing unwinds your slice and swaps the stock back through the same pools — the realised amount is a little below the spot-valued figure the site shows.
How the donation reaches the charity
When a depositor picks a charity, the route records that organisation's EIN. Harvested yield is flushed to the keeper's address as USDG, bridged to Base as USDC through Across (about 0.06%, filled in seconds), and donated by calling donate() on that organisation's own receiving contract. Those contracts are operated by Endaoment, a US 501(c)(3) (EIN 84-4661797) that accepts on-chain gifts for registered nonprofits, converts them and issues the receipt. Endaoment takes 1.5% of a direct organisation donation.
The keeper holds the money only between the bridge and the donation — seconds in the normal case. That hop is unavoidable for a cross-chain gift, and it is the one part of this system that is custodial. Every bridge and donation is a public transaction, and the figures on the site are read from Base rather than from our records.
The charity list
The organisations on this site are generated into data/charities.json by engine/build-charities.mjs, which reads Endaoment's own API and keeps only those it marks compliant and has already deployed on Base. The receiving address comes from that record and is never derived from the EIN: some organisations were deployed with a hyphenated id, so deriving it would silently target the wrong contract. None of them has partnered with or endorsed Yieldfund.
The vault itself accepts any label — the fixed list is a product decision, not a limit in the contract.
Controls and limits
- Performance fee: set by the owner, hard-capped at 20% in bytecode.
- Deposit cap: paced by the owner; withdrawals are never gated by it.
- Owner can rebalance ranges and weights and cannot touch the yield reserve or buffered fee stock.
- Deposits and withdrawals revert while any pool is more than ~1% from its 30-second TWAP.
- Not ERC-4626:
previewWithdrawis a spot estimate and says so. - Unaudited. Read the source before trusting it with anything you cannot lose.
Addresses
- Chain: Robinhood Chain (4663)
- Vault: 0x9a3EC5B60d6337A13869fAeB7a462f4A540E600c
- USDG: 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168