Skip to main content

vBT Share Price Across the Bond Lifecycle

A Bond Token (bt) is backed 1:1 by publicly traded corporate bonds under regulated custody, each token standing for $100 of face value. It replicates everything a bond does: it pays coupons, can be called or amortized, and matures. A basket Bond Token puts several bonds behind one token; each bond's coupons, calls and maturity reach it at that bond's weight.

Bondi v3 made the Bond Token a full bond primitive onchain. A bond is hard to lend against, though: it pays cash on a calendar, and its supply shrinks as the bond amortizes or when the issuer calls it. In a basket this happens bond by bond, on several calendars at once. The Reinvestment Vault absorbs all of that and issues vBT, a standard ERC-4626 share that lending markets can take as collateral.

For collateral, what matters is how its value is set and what moves it. vBT's value is the vault's net asset value (NAV) per share, and this article covers each event that moves it, from coupons and calls to maturity.

Notation​

All quantities are per share. Totals are recovered by multiplying by NN.

SymbolMeaning
NNvBT shares outstanding
bbBond Tokens per share
ssPending coupons and call proceeds per share, waiting to be reinvested or unwound
PPOracle price of one bt (real-world bond price, in stablecoin)
P′P'Oracle price of one bt after an event
PcallP_{call}Call price paid per bt
PreinvestmentP_{reinvestment}Execution price per bt in a reinvestment swap
PparP_{par}Par (face) value, $100
rrFraction of the vault's bt that is called/amortized, 0 to 1
ccCoupon per bt

Note: Coupon and call amounts are net of commission, unless stated otherwise.

General Formula​

The share price is what the vault holds per share:

NAV0=b P+s\mathrm{NAV}_0 = b\,P + s

Note: ss only exists until coupons are reinvested into bt and call proceeds are unwound. By default s=0s = 0, so NAV0=b P\mathrm{NAV}_0 = b\,P.

Where does the growth come from? Between coupon dates PP rises every day, because the oracle quotes the dirty price and accrued interest builds into it; that daily rise is what lifts NAV. The coupon then takes that accrued value out of PP and puts it into ss, and the reinvestment turns ss into more bt. Each step changes NAV only slightly, as elaborated below; mostly it changes the form of the value, and at the end of it bb is larger. The next period's daily accrual now runs on more bonds per share, and that is the compounding.

Bond Token Lifecycle Events​

Coupon​

The vault receives cc per bt; it lands in ss.

NAVcoupon=b P+s+b c\mathrm{NAV}_{coupon} = b\,P + s + b\,c ΔNAVcoupon=NAVcoupon−NAV0=(b P+s+b c)−(b P+s)=b c\begin{aligned} \Delta\mathrm{NAV}_{coupon} &= \mathrm{NAV}_{coupon} - \mathrm{NAV}_0 \\ &= (b\,P + s + b\,c) - (b\,P + s) \\ &= b\,c \end{aligned}

In practice, the coupon reaches the vault in two steps and Bondi charges a 50 bps commission per coupon.

(cgrossc_{gross} = coupon per bt before commission; cc = after commission.)

1. Coupon date: accrued interest leaves the price, which steps down by cgrossc_{gross} (a repricing, see Repricing below). ΔNAV=− b cgross\Delta\mathrm{NAV} = -\,b\,c_{gross}

2. Settled at the broker and onramped, about five business days later: the net coupon lands in ss, as above. ΔNAV=+ b c\Delta\mathrm{NAV} = +\,b\,c

Net: ΔNAV=− b cgross+b c=− b (cgross−c)\Delta\mathrm{NAV} = -\,b\,c_{gross} + b\,c = -\,b\,(c_{gross} - c)

Result: on the coupon date NAV steps down by the gross coupon per bt; about five business days later it recovers by the net coupon, so the cycle ends b (cgross−c)b\,(c_{gross} - c) lower, the commission.

Cash Out (Supply-reducing events)​

Call, partial call, amortization and a maturity of a constituent in a basket Bond Token: called bt leave the vault, reducing bb.

NAVcash_out=(1−r) b P+s+r b Pcall\mathrm{NAV}_{cash\_out} = (1-r)\,b\,P + s + r\,b\,P_{call} ΔNAVcash_out=NAVcash_out−NAV0=b P−r b P+s+r b Pcall−b P−s=r b (Pcall−P)\begin{aligned} \Delta\mathrm{NAV}_{cash\_out} &= \mathrm{NAV}_{cash\_out} - \mathrm{NAV}_0 \\ &= b\,P - r\,b\,P + s + r\,b\,P_{call} - b\,P - s \\ &= r\,b\,(P_{call} - P) \end{aligned}

NAV rises if the call price (PcallP_{call}) is above the last oracle price (PP), and falls if below.

rrPcallP_{call}Event
1call priceFull call
between 0 and 1call pricePartial call
fraction of principal repaidPparP_{par}Amortization
share of the basket that matures (e.g. a bond that is 20% of the basket: 0.2)PparP_{par}Maturity of a constituent in a basket Bond Token

Repricing​

Oracle update, maturity, extension and default: the bt price moves from PP to P′P'.

NAVrepricing=b P′+s\mathrm{NAV}_{repricing} = b\,P' + s ΔNAVrepricing=NAVrepricing−NAV0=(b P′+s)−(b P+s)=b (P′−P)\begin{aligned} \Delta\mathrm{NAV}_{repricing} &= \mathrm{NAV}_{repricing} - \mathrm{NAV}_0 \\ &= (b\,P' + s) - (b\,P + s) \\ &= b\,(P' - P) \end{aligned}

NAV rises if the new price (P′P') is above the old one (PP), and falls if below.

EventP′P'
Oracle updatenew oracle price
MaturityPparP_{par}
Extensionprice the market sets after the extension
Defaultprice the market sets after the default, expected to converge to R⋅PparR \cdot P_{par} (RR = recovery rate)

Note: While s>0s > 0, the stablecoin part of the share does not move with the bond, so a percentage move in PP moves the share price by less: the bond's percentage move times its weight, b P/(b P+s)b\,P / (b\,P + s).

Reinvestment​

Pending stablecoin (assume all of ss) is swapped into bt at PreinvestmentP_{reinvestment}.

NAVreinvest=(b+sPreinvestment) P\mathrm{NAV}_{reinvest} = \Big(b + \frac{s}{P_{reinvestment}}\Big)\,P ΔNAVreinvest=NAVreinvest−NAV0=b P+s PPreinvestment−b P−s=s (PPreinvestment−1)\begin{aligned} \Delta\mathrm{NAV}_{reinvest} &= \mathrm{NAV}_{reinvest} - \mathrm{NAV}_0 \\ &= b\,P + \frac{s\,P}{P_{reinvestment}} - b\,P - s \\ &= s\,\Big(\frac{P}{P_{reinvestment}} - 1\Big) \end{aligned}

NAV rises if the oracle price (PP) is above the reinvestment price (PreinvestmentP_{reinvestment}), and falls if below. The effect scales with the amount reinvested, not the position, so it is small.

Execution price (PreinvestmentP_{reinvestment})​

When reinvesting, the vault buys bt from a pool, so the execution price can differ from the oracle price. Two numbers describe the gap: dd, how far the quote sits above PP (negative if below), and d′d', the share of quoted bt lost to slippage.

The vault reverts the swap if either exceeds 2.5%.

GuardLimit
Quote vs oracle price (dd)within ±2.5%
Slippage (d′d')up to 2.5%

The quote is P (1+d)P\,(1+d) and the vault receives (1−d′)(1-d') of the quoted bt, so:

Preinvestment=P 1+d1−d′P_{reinvestment} = P\,\frac{1+d}{1-d'}

Substituting into ΔNAVreinvest=s (P/Preinvestment−1)\Delta\mathrm{NAV}_{reinvest} = s\,(P/P_{reinvestment} - 1):

ΔNAVreinvest=s (PP 1+d1−d′−1)=s (1−d′1+d−1)=s (1−d′)−(1+d)1+d=− s d+d′1+d\begin{aligned} \Delta\mathrm{NAV}_{reinvest} &= s\,\Bigg(\dfrac{P}{P\,\dfrac{1+d}{1-d'}} - 1\Bigg) \\ &= s\,\Big(\frac{1-d'}{1+d} - 1\Big) \\ &= s\,\frac{(1-d') - (1+d)}{1+d} \\ &= -\,s\,\frac{d + d'}{1+d} \end{aligned}

Worst case​

Beyond any of the limits above the swap reverts, so the worst execution that goes through is d=d′=2.5%d = d' = 2.5\%:

ΔNAVreinvest=− s 0.025+0.0251.025≈−0.0488 s\Delta\mathrm{NAV}_{reinvest} = -\,s\,\frac{0.025 + 0.025}{1.025} \approx -0.0488\,s

Every reinvestment that goes through therefore costs NAV at most ~4.88% of the amount reinvested.

Vault events​

Deposits and redemptions change NN but not NAV. Unwind changes both NN and NAV.

Deposit and redemption​

A deposit of AA bt is worth A⋅PA \cdot P at the oracle price. In the default state NAV=b P\mathrm{NAV} = b\,P, and at launch each share holds one bt (b=1b = 1), so ΔN=A\Delta N = A.

After the first reinvestment or call this no longer holds: reinvestment adds bt and calls remove bt without changing the number of shares, so bb moves away from 1.

The vault therefore mints shares at the current share price, which gives two cases:

StateOracle priceNew sharesWhy
s=0s = 0 (default)not neededA/bA / beach share holds only bb bt
s>0s > 0 (coupon or call cash pending)needed; rejected if older than 24 hoursA⋅P/NAVA \cdot P / \mathrm{NAV}each share also holds stablecoin

In both cases the depositor receives exactly the value they put in and existing holders are unaffected: ΔNAV=0\Delta\mathrm{NAV} = 0. Redemption is the reverse but never depends on the oracle: the exiting holder takes bb bt per share, and their slice of ss is swapped into bt; if a guard (staleness, oracle deviation, or slippage) blocks that swap, the slice is paid in stablecoin instead, or as Coupon and Principal Tokens without KYC.

Unwind​

Unlike a deposit, an unwind changes NAV. After a call, the proceeds sit in ss earning nothing while borrowers pay interest on the full collateral value. Unwinding is the expected path; what it does to the remaining shares depends on PP against PcallP_{call}, as below. Holders burn up to r⋅Nr \cdot N shares (the called fraction rr of all NN shares), and receive b⋅Pcallb \cdot P_{call} per share burned, plus the share's slice of any coupon still pending.

Start from the state right after a call with nothing else pending, so s=r⋅b⋅Pcalls = r \cdot b \cdot P_{call}. The formulas assume all r⋅Nr \cdot N shares are unwound; a pending coupon would be paid out pro rata alongside and does not change the result.

NAVbefore=(1−r) b P+s=(1−r) b P+r b Pcall\mathrm{NAV}_{before} = (1-r)\,b\,P + s = (1-r)\,b\,P + r\,b\,P_{call} NAVafter=b P\mathrm{NAV}_{after} = b\,P ΔNAVunwind=NAVafter−NAVbefore=b P−(1−r) b P−r b Pcall=b P−b P+r b P−r b Pcall=r b (P−Pcall)\begin{aligned} \Delta\mathrm{NAV}_{unwind} &= \mathrm{NAV}_{after} - \mathrm{NAV}_{before} \\ &= b\,P - (1-r)\,b\,P - r\,b\,P_{call} \\ &= b\,P - b\,P + r\,b\,P - r\,b\,P_{call} \\ &= r\,b\,(P - P_{call}) \end{aligned}

NAV rises if the bond's price (PP) is above the call price (PcallP_{call}), and falls if below.

This reverses the supply reduction: the call's gain or loss leaves with the exiting shares, and the rest return to NAV=b P\mathrm{NAV} = b\,P with s=0s = 0. ss is brought back to zero on purpose, by unwind here and by reinvestment for coupons: idle cash earns nothing while borrowers pay interest on it.

The risk that remains​

Put together, vBT's value comes down to one formula. By default NAV=b P\mathrm{NAV} = b\,P: a share is worth the bonds it holds at the oracle price. Coupons, cash-outs and repricings each move it by a formula known in advance, reinvestment costs at most 4.88% of the amount reinvested, deposits and redemptions leave it unchanged, and an unwind brings it back to b Pb\,P.

What remains for a lending market is the price and credit risk of the bonds behind the token: everything else those bonds do is handled inside the vault. A lender can therefore set terms on vBT from the underlying bonds' price and credit, leaving coupons, calls and KYC to the vault.