Distribute Notes
On this page
fact Every call on this page exists on NoteCore and RollPolicy as deployed on Robinhood Chain testnet (deployment 12). The full developer reference is under Developers; this page is the shortest path for a distribution surface such as a wallet stock page.
The Pattern
A note appears where the user already is: the stock page. Three screens, four contract calls.
| Screen | Call | What it shows |
|---|---|---|
| Discover | roll.openSeriesOf(underlying) | The live series for the stock on screen, with coupon and barrier |
| Terms | core.getSeries(seriesId) | Barrier, coupon, observations, fees, exactly as enforced |
| Subscribe | core.depositCoupon(seriesId, amount) | One signature after the USDG approval. The wallet holds the ERC-1155 leg |
| Hold | core.accruedCoupon(seriesId, owner) | Coupons paid so far; claim any time, redeem at maturity |
The Build on Note page shows this pattern in its integration workbench, under Notes.
Discover
// series in subscription for one stock
uint256[] memory ids = roll.openSeriesOf(underlying);
INoteCore.SeriesView memory v = core.getSeries(ids[0]);
// v.barrierBps, v.autocallBps, v.couponFloorBps, v.couponCapBps, v.refBps,
// v.observations, v.subscriptionEnd,
// v.minTicket, v.status; after strike also v.s0, v.couponBps, v.lastPrice,
// v.couponIndex, v.breached
A series is worth surfacing when status is subscription and subscriptionEnd is in the future. Before strike the coupon is a range: couponFloorBps to couponCapBps, with refBps as the reference the desk quotes around. At strike couponBps is discovered and s0 is set; from then on show those. Everything shown is what the contract enforces, not a projection.
Quote the Terms
Amounts passed to the contracts are raw quote units. With six-decimal USDG, 1 USDG of matched notional is represented by 1,000,000 raw COUPON units. What the user needs to see before signing:
| Field | Source |
|---|---|
| Coupon per observation | v.couponFloorBps to v.couponCapBps before strike (v.refBps reference); v.couponBps after |
| Barrier | v.barrierBps of s0; the strike price v.s0 is set at strike from the feed |
| Observation dates | v.observations, an array of timestamps |
| Autocall level | v.autocallBps of s0 |
| Fees | v.couponFeeBps on coupons, v.notionalFeeBps on matched notional |
| If breached at maturity | Stock delivered at s0: previewRedeem(seriesId, 0, units) reports the stock payout in raw units |
Minimum ticket (v.minTicket) and the deadline (v.subscriptionEnd) come from the series; a deposit after the deadline or below the minimum reverts.
Subscribe
usdg.approve(address(core), amount);
core.depositCoupon(seriesId, amount);
The deposit sits in escrow until strike. If the series is under-matched the unmatched part is refunded (core.refund(seriesId)); the matched part becomes COUPON units in NoteLegs, id (seriesId << 1) | 0. A wallet that wants the user to hold the leg directly simply lets the user’s address be the depositor.
Hold
// claimable now
uint256 owed = core.accruedCoupon(seriesId, owner);
// pays coupons to the caller
core.claim(seriesId);
// principal at autocall or maturity, USDG or stock
core.redeem(seriesId, units);
claim and redeem settle the caller’s position first if strike has happened but settlement has not run for them. Already accrued coupons remain claimable by the sender on transfer. The recipient receives future accrual on the transferred units, not the sender’s past coupons.
For a position card, the three numbers users care about are accruedCoupon, the next observation date and the distance to the barrier (lastPrice ÷ barrierPrice − 1).
SHIELD
SHIELD holders escrow Stock Tokens and prefund the coupons and the notional fee in USDG. COUPON holders deposit USDG notional and receive the net coupons. At a maturity barrier breach, SHIELD receives the USDG notional and delivers stock to COUPON at the strike price; without a breach, SHIELD receives its stock back plus unused prefund. See Subscribe SHIELD for requiredPrefund and depositShield.
Indexing
Events for every step are listed under Events. A stock page needs none of them: the reads above are enough and are bounded per stock.
Keep exploring, or revisit this topic from the navigation.