Documentation
$HDFI@_hdfiOpen app

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.

raw AAPL worth S shares ↓ split S PT-AAPL-DEC26 + S YT-AAPL-DEC26 the ex-yield claim the yield strip

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.

shares = rawAmount × uiMultiplier() / 1e18

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.

UnitWhat it isWhere you see it
RawWhat a transfer moves and what balanceOf returns.Your wallet balance, the amount you type in.
SharesRaw 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:

earned per share = 1/previousIndex − 1/currentIndex

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.

you pay 1,000 × 0.9524 = 952.40 shares you receive 1,000 PT at maturity 1,000 PT = 1,000.00 shares return over the tenor 1000 / 952.40 − 1 = 5.00% annualised (1 / 0.9524) ^ (365/180) = 10.40% APY

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.

YT price 1 − 0.9524 = 0.0476 shares spend 100 shares → 100 / 0.0476 = 2,100 YT 2,100 shares of dividend exposure for 100 shares paid = 21× leverage break-even the multiplier must add 0.0476 per share over 180 days = 4.76% annualised = 9.89%

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.

CallDoesWhen
splitDeposit raw stock tokens, take out matching PT and YT.Before maturity, anyone.
mergeBurn PT and YT together, take the stock token back.Any time, anyone holding both.
redeemBurn PT alone for the shares it settles at.At or after maturity.
claimWithdraw the yield your YT has accrued.Any time, forever.
settleFreeze 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.

X(p) = ln( p / (1 − p) ) / rateScalar + rateAnchor price = 1 / X X ≥ 1, so price ≤ 1 — par is a hard ceiling p = the share of the pool held as PT

Two properties fall out of that shape, and both are in your favour as a holder.

  • The curve flattens into expiry. rateScalar grows 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. rateAnchor is 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.

TabDirectionsYou pay / you get
Fixed rateBuy PT · Sell PTStock token ↔ PT
YieldBuy YT · Sell YTStock token ↔ YT
LiquidityAdd · RemoveStock token ↔ LP
VaultSplit · Merge · RedeemNo 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.

ActionToken approvedSpender
Buy PT · Buy YT · Add liquidityStock tokenRouter
Sell PT / Sell YT / RemovePT / YT / LPRouter
SplitStock tokenVault
Merge · Redeem · ClaimNoneBurns 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 expiryCharged at a 0.003 fee root
180 days0.148%
30 days0.025%
At maturity0%

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

ChainRobinhood Chain — id 4663, an Arbitrum Orbit rollup, gas in ETH
RPChttps://rpc.mainnet.chain.robinhood.com
Explorerrobinhoodchain.blockscout.com

Stock tokens

Plain ERC-20 with 18 decimals and the ERC-8056 extension. These are live on mainnet today.

AAPL0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9
TSLA0x322F0929c4625eD5bAd873c95208D54E1c003b2d
NVDA0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC
MSFT0xe93237C50D904957Cf27E7B1133b510C669c2e74
SPY0x117cc2133c37B721F49dE2A7a74833232B3B4C0C

Glossary

PTPrincipal token. The ex-yield claim; settles for a fixed number of shares at maturity.
YTYield token. Collects every share the multiplier adds before maturity, then expires worthless.
RawWhat a transfer moves. Never changes on a corporate action.
SharesRaw times the multiplier. The real exposure, and the unit PT and YT are denominated in.
Implied APYThe annualised rate the PT discount corresponds to, over the remaining tenor.
ParOne share per PT. A hard ceiling on the price, reached exactly at maturity.
MaturityThe shared expiry of a PT/YT pair. After it, PT redeems and YT stops accruing.
Network
Robinhood Chain · chain 4663
Explorer
robinhoodchain.blockscout.com
App
Markets
Site
hdfi