Option one
Claim and sell it yourself
Claim, approve, swap, buy back. Every round costs gas, a swap fee and your attention, and every round you skip, the pay just sits there.
- Per payout
- a claim, an approval, a swap and gas, done by you
Savings vault · Robinhood Chain
Deposit a coin that pays its holders. Each payout is sold for more of that same coin and released into your share over six hours. When you leave, you redeem the same coin, at the current rate.
Deposit a coin that pays its holders. Each payout is sold for more of that same coin and released into your share over six hours.
the stash goes up only
That is the share rate: coin per share. It never falls, and it rises when a harvest vests. The coin's own price can still fall, all the way to zero.
fully vested6 h after the harvest
Share rate in the replay: 1.000000000 at the deposit and at the instant of the harvest, 1.247451118 once the harvest has fully vested six hours later.
Replay of a test run on a local fork · 10,000 USDG in, 1 WETH harvested · test sizes, not a yield forecast
local anvil fork · 22 Sep 2026 · nothing broadcast · 6 h in 24 s
reading the chain…
Robinhood Chain · read from your browser
—
eth_blockNumber blocks/s: measuring—
0.01% pool · slot0() · this visit · 0 reads—gwei
eth_gasPrice · paid in ETH—
eth_chainId—
reading config…Why this exists
Some coins pay their holders: trading fees, ETH, a stablecoin, a stock token. What happens next is up to you, and neither usual answer is a good one.
STASH does one thing with the payout, the same way every time: it turns it into more of the coin you deposited. Your number of shares never changes. Each share just holds more coin.
Option one
Claim, approve, swap, buy back. Every round costs gas, a swap fee and your attention, and every round you skip, the pay just sits there.
Option two
The payouts collect in a token you never chose to hold. Your position in the coin you actually picked stays exactly the same size.
What STASH does
A keeper sells each payout for more of your coin and adds it to the vault. It reaches your share rate over six hours. You don't lift a finger.
How it works
You deposit and you redeem. In between, the keeper harvests on its own and the gain arrives in a straight line over six hours. At the instant of a harvest the rate does not move at all, so there is no moment worth being early for.
Deposits and redemptions change how much coin the vault holds, not how much coin one share holds.
diagram · the arrows are the four calls below; green is the part that becomes share rate
Send the coin, get sCOIN. Shares are minted on what actually arrived, so a coin with a transfer tax is counted honestly, and the call reverts rather than mint you fewer shares than you asked for.
deposit(uint256 assets, address receiver, uint256 minSharesOut)selector 0xbc157ac1Shares carry 3 more decimals than the coin · coins under 4 decimals are refused · 1,000 virtual shares
The keeper sells the payout for more of the coin on Uniswap v3. The fee comes off the payout first. A swap below the price floor reverts the whole harvest, and with no price history there is no harvest at all.
harvest(uint256 minAssetsOut)selector 0xddc63262Fee 10% of the payout by default, capped at 30% · floor = 30-min pool average − pool fee − 1% (defaults; window 10 min – 2 h, tolerance ≤ 10%) · at most one harvest per 2 min by default (floor 60 s, never above the vesting window)
The new coin is locked, then released into the rate in a straight line. At the instant of the harvest the rate does not move at all, so there is no moment worth standing in front of.
lockedProfitRemaining()selector 0x0dc3f9cd · view6 h by default, settable from 10 min to 7 days · a lock already running keeps its own end date
Burn sCOIN, get the same coin back at the current rate. No exit fee, no queue. Set a minimum and the call reverts instead of paying you less.
redeem(uint256 shares, address receiver, address owner, uint256 minAssetsOut)selector 0x9f40a7b3Redeem pause: admin only, 72 h at most, then no new pause for 72 h · the guardian can never pause it
exchangeRateRay() = 1000 × 1e27 × (totalAssets() + 1) ÷ (totalSupply() + 1000)
starts at exactly 1e27 · totalAssets() excludes the part still vesting
The share rate
The share rate is how much coin one share is worth. It starts at exactly 1.000000000 when a vault opens, never falls, and rises when a harvest vests. The number below is read from vault #1 by your browser; until a vault exists, it says so.
coin per share · 9 decimals · never lower than the last reading
| What happens | Coin in the vault | Share rate |
|---|---|---|
| You deposit | ↑more | =unchanged |
| A harvest lands | ↑more, locked | =unchanged at that instant |
| The harvest vests | ↑counted as it vests | ↑rises in a straight line |
| You redeem | ↓less | =unchanged |
| The coin's price falls | =same amount | =unchanged |
Rounding always goes in the vault's favour, so a deposit or a redemption can never lower the rate. The rate counts coin, not dollars: a falling price is yours to carry.
At the harvest the vault's balance and its lock rise by the same amount, so the rate does not move. Then the lock runs down in a straight line and every second of it reaches the rate. Drag the time.
Replay of a test run on a local fork · 10,000 USDG in, 1 WETH harvested · test sizes, not a yield forecast
local anvil fork · 22 Sep 2026 · nothing broadcast · each value is the contract's own maths at that second
Why it vests
When a whole harvest lands in one instant, whoever holds the most shares at that instant collects most of it, and the keeper chooses the instant. So nothing lands at once: the gain is locked and released in a straight line over six hours, and a share earns only for the time it is actually held.
The keeper's twelve seconds after its own harvest now earn twelve seconds' worth of a six-hour release.
Safeguards
Every figure here is a constant or a default in the contract source. Where the admin can change a setting, the limit it cannot pass is printed next to it.
10%
10% of each payout goes to the treasury by default. The code caps it at 30%. It is never taken from principal.
DEFAULT_FEE_BPS 1_000 · MAX_FEE_BPS 3_000
6h
Each harvest is released in a straight line over 6 hours by default, settable from 10 minutes to 7 days. A lock already running keeps its own end date.
DEFAULT_VESTING_PERIOD 6 hours · MIN 10 minutes · MAX 7 days
30min
The swap must clear the pool's 30-minute average price, minus the pool fee, minus 1% (defaults; window 10 minutes to 2 hours, tolerance at most 10%). The keeper can only make the floor stricter. No price history, no harvest.
DEFAULT_TWAP_WINDOW 30 minutes · DEFAULT_MAX_SLIPPAGE_BPS 100 · SLIPPAGE_CAP_BPS 1_000
2min
At most one harvest per 2 minutes by default. The floor is 60 seconds, and the interval can never be longer than the vesting window.
DEFAULT_HARVEST_INTERVAL 120 · MIN_HARVEST_INTERVAL 60
72h
Only the admin can pause redemption, for at most 72 hours, and then cannot pause it again for 72 hours. The guardian can pause deposits and harvests, never redemption.
MAX_REDEEM_PAUSE 72 hours · REDEEM_PAUSE_COOLDOWN 72 hours
4roles
The factory refuses to create a vault unless admin, guardian, treasury and keeper are four different non-zero addresses. After that the admin can reassign the guardian, treasury and keeper; only non-zero is checked.
createVault → DuplicateRole · setGuardian / setTreasury / setKeeper
1,000
1,000 virtual shares, and a minSharesOut on every deposit. A donation attack never paid the attacker in a 256-run fuzz; a deposit that would mint too little reverts instead. Every vault is seeded before it opens.
VIRTUAL_SHARES 1_000 · SlippageShares(got, wanted)
4dp
A coin with fewer than 4 decimals cannot get a vault, and every share carries 3 more decimals than its coin.
MIN_ASSET_DECIMALS 4 · DECIMALS_OFFSET 3
0
No mint, no blacklist, no transfer hook, no tax setter, no proxy. The coin, reward, router and fee tier are fixed at creation. The router's allowance is reset to 0 after every harvest, and the rescue function cannot move the coin or the reward.
immutable asset · reward · router · poolFee · CannotRescueCore
Listing rules
The coin's creator points its fee recipient at the vault and signs that change themselves. The transaction goes on Proof.
A vault-shaped test account has to receive 20 payouts from the coin first. Twenty hashes, all on Proof, before any deposit is taken.
Buybacks don't qualify. A buyback pays no holder, so there is no payout for a vault to receive.
No dead coins. A vault needs payouts that keep arriving and a pool to sell them into; the factory refuses a pair with no pool.
20 / 20 payouts
Each square is one payout the coin sends to the test account, each with its own transaction hash. Twenty in a row show the yield is real and repeating, not a one-off.
Vaults
Reading config/addresses.json…
Reading the vault list…
Built to be checked
Every contract claim on this site is either a constant you can read in the source, a test you can run, or a transaction you can open. The chain checks on Proof run in your own browser.
$ forge test --no-match-path 'test/fork/*' Ran 16 test suites in 1.81s (20.34s CPU time): 318 tests passed, 0 failed, 0 skipped (318 total tests)
fork test against live state, 22 Sep 2026
Chain id, contract code, router wiring. Every row turns into a value read from the chain.
The findings, the inflation table and what is still not protected.
Questions
Including the ones that are not good news.
No. The share rate goes up: how much coin one share is worth. The coin itself can fall, all the way to zero, and your share then holds more of a coin that is worth less. STASH does nothing about the price.
Yes. In dollars, whenever the coin falls. In coin, your principal can only be lost through a bug in the contracts, and there is no external audit yet.
The keeper can sell a harvest at the edge of the price floor (about 1% plus the pool fee below the 30-minute average, by default). That costs part of that harvest's gain, never principal.
10% of each payout by default, taken before the swap and sent to the treasury. The code caps it at 30%. There is no deposit fee, no exit fee and no fee on principal. You pay gas in ETH for your own deposit and redeem; the keeper pays the gas for harvests.
You can redeem at any time at the current rate: no exit fee, no queue. The one exception is a redemption pause. Only the admin can set one, it lasts 72 hours at most, and after it the admin cannot pause again for 72 hours. The guardian can never pause redemption.
The guardian or the admin can pause deposits, and can pause harvests. Only the admin can pause redemption, within the 72-hour limit above. Nobody can pause the share rate: it never moves down, and it rises when a harvest vests.
With a coin that charges a transfer tax, the amount that actually arrives is only known after the transfer, so a call that promises an exact amount out would be a lie. deposit and redeem, each with a minimum you set, are the honest pair. This is a deliberate departure from ERC-4626, written into the contract.
No token and no presale. What you receive is a share of one vault, named s plus the coin's ticker (sUSDG for USDG), and it is redeemable for that coin. A token trading under the name STASH is not issued by this project.
Robinhood Chain, chain id 4663. Gas is paid in ETH. The strip at the top of this page reads the chain id straight from the RPC in your browser.
Then nothing is harvested: payouts wait in the vault as they are and the rate stays where it is. Your redeem does not depend on the keeper and keeps working. The admin can appoint a new keeper.
One share. A rate that never falls.
Reading config/addresses.json…