How Rill works
Rill gives tokenized stocks on Robinhood Chain away on a schedule. A grant is a Sablier Lockup stream: the shares move into Sablier's audited contract when you sign, and the contract releases them to the recipient as the schedule says — never earlier, never to anyone else.
Rill itself is a website. It has no contract, no key, no fee and no server that holds anything. It reads the chain, builds transactions, and your wallet signs them. If this site disappeared tomorrow, every grant would keep vesting and could be claimed from Sablier's own app or any block explorer.
The three shapes
| Shape | How it releases | Sablier function |
|---|---|---|
| Every second | A straight line from start to end. With a cliff, nothing is claimable until the cliff date, then everything that would have vested by then unlocks at once and the line carries on. | createWithDurationsLL |
| Every month | Equal parts on the same calendar day each month (the 31st becomes the last day of shorter months). The last part carries the rounding, so the parts add up to the deposit exactly. | createWithTimestampsLT |
| At a price | Everything unlocks while Robinhood's price for that stock is at or above your target — or at the end date, whatever the price. | createWithTimestampsLPG |
For a cliff, Rill sets Sablier's cliff unlock to deposit × cliff ÷ total, so a four-year grant with a one-year cliff releases exactly a quarter at the cliff and the rest at the same rate as before.
Giving a grant
Pick the stock, who gets it and how much (in dollars or shares), and the shape. The app then lists exactly the transactions it will ask you to sign:
- If you hold fewer shares than the grant needs, it buys exactly the missing shares with USDG through Uniswap's SwapRouter02 (an exact-output swap). It pays at most 0.5% over Uniswap's quote, and refuses if that is more than 1.5% above Robinhood's own price for the stock. You approve only the maximum it can spend.
- It approves Sablier for exactly the grant's shares — not an unlimited allowance.
- It starts the grant. For several people it uses Sablier's own
batch(), so up to 20 grants start in one transaction.
Before your wallet sees any transaction, the app simulates it from your address against the live chain and tells you, in words, why it would fail.
Each grant is an NFT owned by the recipient. Send them the grant's link (/grant?id=…); it's public, so anyone with it can see the grant, but only the recipient can claim.
Claiming
The recipient connects the wallet the grant was given to and presses Claim: Sablier's withdrawMax sends everything vested so far to their wallet. They can claim as often as they like, or once at the end — vested shares wait in the contract.
Sablier can charge a small ETH fee on a claim. On Robinhood Chain it is 0 ETH today; if that changes, the app reads the fee for each grant and pays exactly it.
If the grant is transferable, the recipient can move it to another wallet (withdrawMaxAndTransfer): what has vested is claimed to them first, and the rest keeps vesting for the new wallet.
Cancelling and making permanent
If you left a grant cancellable, you can cancel it at any time before it has fully vested. In the same transaction, every share that hasn't vested returns to you; the shares that have vested stay in the contract for the recipient to claim. Nothing already vested can be taken back.
Make permanent (renounce) turns cancelling off for good. Nobody — you included — can undo it. A grant created with “I can cancel it” unticked is permanent from the start.
Price-unlocked grants
These read Robinhood's own Chainlink-style price feed for the stock, from inside the Sablier contract. The rule, from Sablier's LockupMath: if the end date has passed, or the feed's latest price is at or above the target, the whole grant is claimable; otherwise none of it is.
- It is not a latch. If the price reaches the target and falls back before the recipient claims, the grant locks again until the price returns or the end date arrives. The app says so on the grant page while it is unlocked.
- The target must be above today's price when the grant is made; Sablier refuses one that would unlock at once.
- Feeds pause when markets close. Robinhood publishes stock prices during trading; overnight and at weekends the feed holds its last price.
- 26 of the 42 stocks and funds have a feed; the others can't be granted this way.
Contracts
Rill deploys nothing. These are the contracts it builds transactions for, all already on Robinhood Chain (chain id 4663).
| Contract | Address | What for |
|---|---|---|
| Sablier Lockup v4.0 | 0x548129a58bC230549DF7F9e33f27E77F6779ff0f | Holds every grant and releases it |
| Uniswap SwapRouter02 | 0xCaf681a66D020601342297493863E78C959E5cb2 | Buys missing shares with USDG |
| Uniswap QuoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 | Prices that buy before you sign |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 | The dollars the buy pays with |
The Sablier Lockup at that address is the one listed for Robinhood Chain in Sablier's own deployment list. Its runtime code (24,481 bytes) hashes to 0x814b…de12; Rill's checks refuse to publish the site if that changes. It held 498 streams when this page was built, 0 of them stocks.
What Rill doesn't control
- Robinhood issues the stock tokens and keeps the power to pause them, block addresses and burn tokens. A paused stock can't be claimed until Robinhood unpauses it.
- Sablier's admin can set the claim fee and the NFT's artwork. It cannot move the shares in a grant.
- Rill's website is not audited. Sablier's contracts are; Rill only builds calls to them, and every call is simulated from your address before you sign it.
- Prices move. A grant is a number of shares, not a number of dollars: what it is worth when it vests is up to the market.
How it's tested
An end-to-end run drives this site in a real browser against a simulator: test wallets whose transactions execute on live Robinhood Chain state, with the clock moved forward, and are never broadcast. It gives a grant that has to buy its shares first, claims it as the recipient six months later, gives a monthly grant to two people in one transaction, cancels one, makes the other permanent and makes a price-unlocked grant — and checks every outcome against the chain rather than against the page. Last run: 11/11 stages, 35 checks, 2026-09-24.
Property tests check the page's vesting arithmetic against Sablier's own streamedAmountOf at many moments, for every shape: 10/10 properties, 517 assertions, 2026-09-24.
The tests are graded too: a sweep plants deliberate bugs in a copy of the page's grant code — a cliff that releases half, months that drift off the calendar, a price target a tenth of what was typed, a buy with no price guard — and each must be caught by the property named for it: 17/17 caught, 2026-09-24.