Docs
What hdfi does to a stock token, what you get back, and every way it can lose you money.
01 — Start here
One share, priced twice
hdfi takes a Robinhood Chain stock token and splits it into two claims with a shared expiry. One is the share you will hold at maturity. The other is everything the token earns before then.
PT + YT = 1 share, always. That identity is what makes the two prices add up: PT trades at a discount to a share, and YT is exactly that discount, bought on its own.
- Buying PT is taking a fixed rate. You pay less than a share now and receive exactly one share at maturity. The gap is your return, and it is locked the moment you buy.
- Buying YT is betting dividends beat that rate. You pay only the discount and collect whatever the multiplier adds until expiry. If it adds more than you paid, you win.
- Providing liquidity is taking neither side. You hold PT against the stock token and earn the fee on trades between them.
Everything else on this page follows from those three sentences and from one fact about the tokens themselves.
02 — The multiplier
Stock tokens pay no dividend
A Robinhood Chain stock token never sends you a cash payment. Dividends — and stock splits with them — are folded into an on-chain multiplier, the ERC-8056 scaled-UI extension.
balanceOf and totalSupply are raw and never move on a corporate action. Only the multiplier moves. A dividend does not give you more tokens; it makes each token you already hold worth more shares.
Two units, kept apart on purpose
This is the single easiest thing to get wrong, so the protocol names it everywhere and so does the app.
| Unit | What it is | Where you see it |
|---|---|---|
| Raw | What a transfer moves and what balanceOf returns. | Your wallet balance, the amount you type in. |
| Shares | Raw times the multiplier — the real economic exposure. | PT and YT amounts, every price the pool quotes. |
So a PT balance of 1,000 means a claim on 1,000 shares, and what that costs in raw tokens depends on the multiplier at the moment you convert.
Why the yield is an index, not a payment
There is nothing to distribute, so nothing is distributed. What one share earned between two multipliers is the raw it no longer needs as backing:
That is exactly what falls out of the vault as the principal claim shrinks. The two sides are complementary by construction, which is why the vault stays solvent without any distribution accounting at all. Your YT balance accrues against that index and you withdraw it whenever you like.
Worth knowing
Every YT balance change settles both parties first. Splitting late gives you no retroactive claim, merging out keeps what you already earned, and transferring YT moves future yield without touching past yield.
03 — PT
Taking a fixed rate
A principal token is a synthetic forward on the stock. It settles for a fixed number of shares at maturity and is worth at most one share before then, so it always trades at a discount. That discount is the rate.
A worked example
Say PT trades at 0.9524 shares with 180 days to maturity. You buy 1,000 PT.
That 10.40% is what the app shows as implied APY. It does not change while you hold. The pool may requote PT at any price in the meantime, and it makes no difference to what you settle for — the only thing that matters is that you hold to maturity.
What PT is not
- Not a bet on the stock. PT settles in shares, not dollars. A PT position tracks the stock price one for one. If AAPL halves, your 1,000 shares are worth half as much — you fixed the rate, not the price.
- Not leveraged and not liquidatable. There is no borrowing here, no collateral ratio and no liquidation. The worst case is the stock falling, which would have happened holding the token anyway.
- Not locked. You can sell PT back into the pool at any time. You would take whatever the pool quotes then, which is how you can lose money on PT: exiting early at a worse rate than you entered.
Held to maturity, the only ways PT underperforms simply holding the token are the yield you gave up and a multiplier that falls. Both are covered below.
04 — YT
The yield strip
A yield token collects every share the multiplier adds to one share of exposure, from the moment you hold it until expiry. Then it is worth nothing — all of its value is the stream, and the stream ends.
The same example, from the other side
With PT at 0.9524, YT costs the complement.
So YT is a levered position on the dividend stream. Above roughly 9.9% a year in accrual you make money; below it you lose, and at zero accrual you lose everything you paid. The leverage is not borrowed — it comes from paying only the discount rather than the whole share — so there is nothing to liquidate.
How buying YT actually works
Pools only ever hold PT and the stock token, never YT. The router reaches it through the vault inside a single transaction: the pool pays out the proceeds of selling PT that does not exist yet, the router tops that up from you, splits it into the PT the pool is owed and the YT you wanted, and repays. You pay only the gap between one share and the PT price.
Claim it, do not wait for it
Yield accrues to your YT continuously but stays in the vault until you call claim. It is claimable any time, forever — including long after maturity, and including on yield accrued before you sold the YT.
05 — Liquidity
Providing liquidity
An LP holds PT against the stock token and earns the trading fee on everything that changes hands between them. Entering from a single asset is the normal path: the router buys the PT leg for you and deposits both.
What you are exposed to
- The fee, on every trade, proportional to your share of the pool.
- Divergence, but shrinking. The curve flattens as expiry approaches and the pool converges to par, so the gap between holding LP and holding the underlying narrows on its own toward maturity — unlike a constant product pool, where it does not.
- The stock. Both legs are denominated in the same stock, so an LP position is still fully exposed to the stock price.
Burning LP always works, including after expiry, so liquidity is never trapped.
06 — The vault
Custody and settlement
The vault is what actually holds your stock tokens and mints the two legs. You can use it directly, without touching the pool at all.
| Call | Does | When |
|---|---|---|
| split | Deposit raw stock tokens, take out matching PT and YT. | Before maturity, anyone. |
| merge | Burn PT and YT together, take the stock token back. | Any time, anyone holding both. |
| redeem | Burn PT alone for the shares it settles at. | At or after maturity. |
| claim | Withdraw the yield your YT has accrued. | Any time, forever. |
| settle | Freeze the settlement index at maturity. | At or after maturity, anyone. |
Splitting and merging are always priced at one-for-one in shares — there is no fee and no curve involved. Only trading touches the pool.
07 — The pool
A curve over the rate
A PT is worth at most one share and converges to exactly one at maturity. A constant-product curve is the wrong shape for that: it would happily quote PT above par and bleed the pool to arbitrage as expiry approaches. So the curve is defined over the interest rate instead, and the price is its inverse.
Two properties fall out of that shape, and both are in your favour as a holder.
- The curve flattens into expiry.
rateScalargrows without bound as time runs out, so the same trade moves the price less and less, until every trade prices at par. - The rate persists, not the price.
rateAnchoris re-pinned from the last implied rate before every trade, so an untouched pool pulls toward par on its own as time passes instead of standing still waiting to be arbitraged.
The pool also publishes a time-weighted read of the rate rather than the price. Averaging the price would lag by construction, since PT drifts toward par whether or not anyone trades.
Not a stock oracle
The pool prices the PT-to-share rate. What a share is worth in dollars comes from a price feed whose numbers already include the multiplier — do not apply it twice.
08 — Using the app
What each control does
Pick a market from the rail at the top, then a tab. Every tab has its own directions.
| Tab | Directions | You pay / you get |
|---|---|---|
| Fixed rate | Buy PT · Sell PT | Stock token ↔ PT |
| Yield | Buy YT · Sell YT | Stock token ↔ YT |
| Liquidity | Add · Remove | Stock token ↔ LP |
| Vault | Split · Merge · Redeem | No pool, no fee |
Quotes are computed twice
While you type, the number you see comes from a local port of the curve — instant, with no network round trip. When you press the button, the exact amount is fetched from the on-chain lens, which solves the same bisection the contract itself would, and that is the number that gets signed. The local model never decides what you sign.
Slippage and deadline
Your slippage choice becomes a hard bound in the transaction: a floor on what you receive, or a ceiling on what you pay. If the pool moves past it before your transaction lands, the call reverts and you keep your funds. Every transaction also carries a 20-minute deadline.
Approvals
Approvals follow the contracts rather than a blanket rule, so you are never asked for one you do not need.
| Action | Token approved | Spender |
|---|---|---|
| Buy PT · Buy YT · Add liquidity | Stock token | Router |
| Sell PT / Sell YT / Remove | PT / YT / LP | Router |
| Split | Stock token | Vault |
| Merge · Redeem · Claim | None | Burns from you directly |
The app approves the exact amount rather than an unlimited allowance, so a stale approval cannot be drained later.
09 — Fees
What is charged
Only trading is charged. Splitting, merging, redeeming and claiming are free — the vault takes nothing.
The trading fee is a multiplicative haircut on the exchange rate that decays to nothing at expiry, so the last trades before settlement are not taxed for a risk that no longer exists.
| Time to expiry | Charged at a 0.003 fee root |
|---|---|
| 180 days | 0.148% |
| 30 days | 0.025% |
| At maturity | 0% |
Most of the fee goes to the liquidity providers who took the other side. A share of it can be routed to the treasury, capped at 50% and set by governance in one place for every market at once.
10 — Risks
What can go wrong
These are the real ones, stated the way the protocol states them to itself rather than the way a marketing page would.
A multiplier cut is a real loss
Nothing in the token forbids the multiplier falling, and a reverse split is a legitimate reason for it to. The vault refuses to follow it down, which keeps it solvent — and the loss lands in share terms on PT holders, the position that bears price risk anyway. Because the token announces changes ahead of their effective date, governance can see one coming and pause new splits.
The index only banks what it observes
The vault tracks the high-water mark of multiplier values it has actually seen. A multiplier that spikes and falls back before anyone touches the vault is never banked, and the yield it briefly implied goes to nobody. Accrual is permissionless precisely so that observing one needs no permission.
Settlement wants a prompt call
Until settle() is called at maturity, a multiplier still rising after expiry keeps lifting the settlement index — quietly moving yield from YT to PT. Anyone can call it, and someone should.
Selling early is a market price
A fixed rate is only fixed if you hold to maturity. Exiting through the pool means taking whatever it quotes then, which may be worse than what you paid.
Stray transfers are absorbed
Tokens sent directly to the vault are not recoverable. With lazy yield accrual there is no way to tell a stray token from an unsettled claim, and taking the second by accident would be far worse than stranding the first.
Smart contract risk
The contracts are covered by unit tests and by stateful fuzzing — 128,000 randomised calls per invariant, with time crossing maturity and the multiplier moving both ways — and the vault is at 100% line and function coverage. That is evidence, not a guarantee. Assume the residual risk is real and size accordingly.
11 — Reference
Addresses and glossary
Network
| Chain | Robinhood Chain — id 4663, an Arbitrum Orbit rollup, gas in ETH |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | robinhoodchain.blockscout.com |
Stock tokens
Plain ERC-20 with 18 decimals and the ERC-8056 extension. These are live on mainnet today.
Glossary
| PT | Principal token. The ex-yield claim; settles for a fixed number of shares at maturity. |
| YT | Yield token. Collects every share the multiplier adds before maturity, then expires worthless. |
| Raw | What a transfer moves. Never changes on a corporate action. |
| Shares | Raw times the multiplier. The real exposure, and the unit PT and YT are denominated in. |
| Implied APY | The annualised rate the PT discount corresponds to, over the remaining tenor. |
| Par | One share per PT. A hard ceiling on the price, reached exactly at maturity. |
| Maturity | The shared expiry of a PT/YT pair. After it, PT redeems and YT stops accruing. |