Models / Tokenized assets / tokenized_bills
T-bill token
When redemptions outrun a T-bill ladder, when do forced sales start, and what do the holders who stay lose?
Values a token backed by a T-bill ladder and cash, gives gross and net yield, then walks a redemption run day by day: maturities in, redemptions paid after settlement, forced sales at the shocked yield and the spread when cash runs short, and the loss on holders who stay. Every number comes from the caller. Not a price, a rating or advice.
On these numbers, NAV is 0.999432 per token, and at 3% a day forced sales start on day 2, cost holders who stay 19.3 bps of NAV per token, and forced sales begin at 0.0755% a day.
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.
Readings
The numbers, with their units.
NAV per token
0.999432
NAV 99,943,241: bills 98,443,241, cash 1,500,000.
Hypothetical net yield on NAV
4.5709%
Gross on NAV 4.871% with cash at zero. The ladder alone is 4.945%. Fees 0.3%.
Weighted days to maturity
watch108.78days
With cash at zero days. The ladder alone is 110.44 days. After the walk it is 133.62 days, longer because the nearest rungs went first.
First forced sale
breach2
Requests stop on day 20. The walk runs to day 21 to pay them.
Face sold in forced sales
watch44,512,387
Proceeds 44,129,062, carrying value 44,260,350. 54.38% of tokens are left.
Loss per remaining token
breach0.00193181
19.33 bps of starting NAV. Total loss 131,288. A further 0.007113 per token sits unrealized in what is left, at the shocked yields.
No-profit band around NAV
6.2523bps
Fee 5 bps plus carry 1.25 bps. From 0.998808 to 1.000057 per token.
NAV per token at the shocked yields
watch0.993641
57.95 bps under carrying NAV, before spread.
What flips it
The value of one input where the outcome changes, with the others held.
daily_redemption_pct
0.0755%now 3
Forced sales begin above this daily redemption rate. Below it, cash and maturities pay every request.
cash
82,713,909now 1,500,000
With this much starting cash, rungs and tokens as sent, no forced sale happens at the sent redemption rate. Cash is then 45.7% of the pool, and more cash lifts NAV and so the redemptions too.
Flags
What went past a line, and what to read before you trust the rest.
- breachForced sales start on day 2. They raise 44,129,062 from 44,512,387 of face and realize a loss of 131,288. forced_sales
- watchThe token pays out in 1 day. The assets have a weighted maturity of 108.8 days, and cash plus rungs maturing inside settlement are 1.5% of NAV. maturity_mismatch
- watchAt the shocked yields the assets are worth 57.9 bps under carrying NAV, more than the 5 bps fee. A redemption at carrying NAV moves that gap from holders who stay to holders who leave. stale_nav_transfer
What this leaves out
What the formula leaves out, by name.
- New mints during the run, and any gate, pause or credit line the issuer could use.
- Depth: the spread stays the same however much is sold, and one parallel shock hits every rung.
- Reinvestment: cash from a maturity sits until it's paid out.
- A pool that strikes NAV at market yields, where leavers would share the shock and the transfer to them shrinks.
- Where the token itself trades on the secondary market during the run.
- Taxes on the bills or the token.
- Failure of the issuer, the custodian or the system recording the token.
- Whether this holder may acquire, hold, mint, redeem, pledge, sell or transfer this token, or use any pool. Those are legal questions for counsel.
What it took as given (11)
What it took as given to get here.
- Each rung is valued at face / (1 + y * d / 365): simple interest, actual/365. yield_pct is a money-market yield, so convert a bank discount quote first.
- Cash earns nothing. Gross yield on NAV counts it at zero, and the ladder's own yield is shown beside it.
- Fees are a share of NAV a year. They come out of the yield and aren't taken during the walk, so the walk shows the forced sale loss alone.
- Each day runs in this order: rungs maturing that day pay face, the day's request is struck at that day's NAV per token, then payments due that day go out, with forced sales if cash falls short.
- A request is daily_redemption_pct of the tokens left that day, so tokens fall geometrically. Requests stop after stress_days. The walk runs settle_days longer so every request is paid.
- NAV is carried at the original yields the whole way. The shock and the spread reach NAV only when a sale realizes them, so a token leaving at carrying NAV takes no part of a loss not yet realized.
- A forced sale takes the nearest maturity first, in part if needed, at the shocked yield less half of bid_ask_bps, because a sale crosses from mid to bid. Face sold is grossed up so the proceeds meet the need.
- A loss falls on tokens still outstanding after that day's request. Loss per remaining token adds each day's loss per token then outstanding, not the total over the tokens left at the end, because tokens that leave later already shared part of it. A token can't lose more than its NAV.
- The redemption fee goes to the issuer, not the pool, so the pool pays out full NAV per token.
- Band half-width = mint_redeem_fee + net yield * settle_days / 365, to first order. Neither a minter's cash nor a redeemer's claim earns during settlement. Net yield stands in for the cash rate, floored at zero.
- The shadow NAV reprices the whole ladder at the shock on day 0, before spread.
- Start cash plus maturities
- Redemptions due
- Forced sale proceeds
The data
The ladder
| Rung | Days | Face | Yield % | Value | Share of NAV % |
|---|---|---|---|---|---|
| Bill 30d | 30 | 15,000,000 | 4 | 14,950,847 | 14.96 |
| Bill 60d | 60 | 20,000,000 | 4.5 | 19,853,141 | 19.86 |
| Bill 90d | 90 | 25,000,000 | 5 | 24,695,535 | 24.71 |
| Bill 180d | 180 | 40,000,000 | 5.5 | 38,943,718 | 38.97 |
| Cash | 0 | 1,500,000 | 0 | 1,500,000 | 1.5 |
Forced sales
| Day | Rung | Days left | Face sold | Proceeds | Carrying value | Loss |
|---|---|---|---|---|---|---|
| 2 | Bill 30d | 28 | 1,506,342 | 1,498,691 | 1,501,734 | 3,043.19 |
| 3 | Bill 30d | 27 | 2,923,497 | 2,909,124 | 2,914,872 | 5,748.65 |
| 4 | Bill 30d | 26 | 2,835,627 | 2,822,148 | 2,827,571 | 5,422.96 |
| 5 | Bill 30d | 25 | 2,750,316 | 2,737,690 | 2,742,802 | 5,111.41 |
| 6 | Bill 30d | 24 | 2,667,578 | 2,655,767 | 2,660,581 | 4,813.64 |
| 7 | Bill 30d | 23 | 2,316,639 | 2,306,759 | 2,310,814 | 4,055.25 |
| 7 | Bill 60d | 53 | 272,223 | 269,543 | 270,456 | 912.93 |
| 8 | Bill 60d | 52 | 2,523,627 | 2,499,221 | 2,507,551 | 8,329.48 |
| 9 | Bill 60d | 51 | 2,447,683 | 2,424,440 | 2,432,389 | 7,949.01 |
| 10 | Bill 60d | 50 | 2,373,920 | 2,351,792 | 2,359,375 | 7,583.48 |
| 11 | Bill 60d | 49 | 2,302,384 | 2,281,326 | 2,288,559 | 7,232.7 |
| 12 | Bill 60d | 48 | 2,233,009 | 2,212,976 | 2,219,873 | 6,896.13 |
| 13 | Bill 60d | 47 | 2,165,730 | 2,146,680 | 2,153,253 | 6,573.21 |
| 14 | Bill 60d | 46 | 2,100,482 | 2,082,374 | 2,088,637 | 6,263.44 |
| 15 | Bill 60d | 45 | 2,037,205 | 2,019,999 | 2,025,965 | 5,966.32 |
| 16 | Bill 60d | 44 | 1,543,738 | 1,530,970 | 1,535,408 | 4,438.89 |
| 16 | Bill 90d | 74 | 434,826 | 428,527 | 430,462 | 1,935.38 |
| 17 | Bill 90d | 73 | 1,928,387 | 1,900,811 | 1,909,294 | 8,482.61 |
| 18 | Bill 90d | 72 | 1,870,263 | 1,843,867 | 1,851,996 | 8,129.38 |
| 19 | Bill 90d | 71 | 1,813,821 | 1,788,560 | 1,796,349 | 7,789.38 |
| 20 | Bill 90d | 70 | 1,759,085 | 1,734,915 | 1,742,378 | 7,462.45 |
| 21 | Bill 90d | 69 | 1,706,005 | 1,682,883 | 1,690,031 | 7,148.12 |
The hypothetical walk
| Day | Tokens left % | Requested | Paid out | Forced proceeds | Loss | Cash at day end | NAV per token |
|---|---|---|---|---|---|---|---|
| 0 | 100 | 0 | 0 | 0 | 0 | 1,500,000 | 0.999432 |
| 1 | 97 | 2,998,691 | 0 | 0 | 0 | 1,500,000 | 0.999564 |
| 2 | 94.09 | 2,909,124 | 2,998,691 | 1,498,691 | 3,043.19 | 0 | 0.999667 |
| 3 | 91.27 | 2,822,148 | 2,909,124 | 2,909,124 | 5,748.65 | 0 | 0.999741 |
| 4 | 88.53 | 2,737,690 | 2,822,148 | 2,822,148 | 5,422.96 | 0 | 0.999819 |
| 5 | 85.87 | 2,655,767 | 2,737,690 | 2,737,690 | 5,111.41 | 0 | 0.999899 |
| 6 | 83.3 | 2,576,302 | 2,655,767 | 2,655,767 | 4,813.64 | 0 | 0.999981 |
| 7 | 80.8 | 2,499,221 | 2,576,302 | 2,576,302 | 4,968.17 | 0 | 1.0001 |
| 8 | 78.37 | 2,424,440 | 2,499,221 | 2,499,221 | 8,329.48 | 0 | 1.0001 |
| 9 | 76.02 | 2,351,792 | 2,424,440 | 2,424,440 | 7,949.01 | 0 | 1.0001 |
| 10 | 73.74 | 2,281,326 | 2,351,792 | 2,351,792 | 7,583.48 | 0 | 1.0002 |
| 11 | 71.53 | 2,212,976 | 2,281,326 | 2,281,326 | 7,232.7 | 0 | 1.0002 |
| 12 | 69.38 | 2,146,680 | 2,212,976 | 2,212,976 | 6,896.13 | 0 | 1.0003 |
| 13 | 67.3 | 2,082,374 | 2,146,680 | 2,146,680 | 6,573.21 | 0 | 1.0003 |
| 14 | 65.28 | 2,019,999 | 2,082,374 | 2,082,374 | 6,263.44 | 0 | 1.0004 |
| 15 | 63.33 | 1,959,497 | 2,019,999 | 2,019,999 | 5,966.32 | 0 | 1.0004 |
| 16 | 61.43 | 1,900,811 | 1,959,497 | 1,959,497 | 6,374.28 | 0 | 1.0005 |
| 17 | 59.58 | 1,843,867 | 1,900,811 | 1,900,811 | 8,482.61 | 0 | 1.0005 |
| 18 | 57.8 | 1,788,560 | 1,843,867 | 1,843,867 | 8,129.38 | 0 | 1.0005 |
| 19 | 56.06 | 1,734,915 | 1,788,560 | 1,788,560 | 7,789.38 | 0 | 1.0005 |
| 20 | 54.38 | 1,682,883 | 1,734,915 | 1,734,915 | 7,462.45 | 0 | 1.0005 |
| 21 | 54.38 | 0 | 1,682,883 | 1,682,883 | 7,148.12 | 0 | 1.0005 |
Paste it into your agent
No connection needed. This prompt carries the method, the conventions and what this site's engine gives on the made-up numbers, so your agent can check its own work before it touches real ones. Every prompt, with its hash, is listed at /prompts.json. A copy that stays fixed for this version, for a stack to point at: /v/1.0/models/tokenized_bills.md.
# T-bill token: a prompt from hedgefund.mdPaste this into your AI agent. It needs no connection to hedgefund.md. An agent that can run code should write and run it, and shouldn't work a long series by hand.**Question.** When redemptions outrun a T-bill ladder, when do forced sales start, and what do the holders who stay lose?## MethodRung value = face / (1 + y * d / 365). NAV = cash + sum of values. Net yield = sum(value * y) / NAV - fees. Forced sale price per face = (1 - bid_ask / 2) / (1 + (y + shock) * days left / 365). Face sold = cash needed / price. Loss = face * (carrying value per face - price). Loss per remaining token adds each day's loss / tokens outstanding that day. Band half-width = fee + net yield * settle_days / 365.## Conventions- Each rung is valued at face / (1 + y * d / 365): simple interest, actual/365. yield_pct is a money-market yield, so convert a bank discount quote first.- Cash earns nothing. Gross yield on NAV counts it at zero, and the ladder's own yield is shown beside it.- Fees are a share of NAV a year. They come out of the yield and aren't taken during the walk, so the walk shows the forced sale loss alone.- Each day runs in this order: rungs maturing that day pay face, the day's request is struck at that day's NAV per token, then payments due that day go out, with forced sales if cash falls short.- A request is daily_redemption_pct of the tokens left that day, so tokens fall geometrically. Requests stop after stress_days. The walk runs settle_days longer so every request is paid.- NAV is carried at the original yields the whole way. The shock and the spread reach NAV only when a sale realizes them, so a token leaving at carrying NAV takes no part of a loss not yet realized.- A forced sale takes the nearest maturity first, in part if needed, at the shocked yield less half of bid_ask_bps, because a sale crosses from mid to bid. Face sold is grossed up so the proceeds meet the need.- A loss falls on tokens still outstanding after that day's request. Loss per remaining token adds each day's loss per token then outstanding, not the total over the tokens left at the end, because tokens that leave later already shared part of it. A token can't lose more than its NAV.- The redemption fee goes to the issuer, not the pool, so the pool pays out full NAV per token.- Band half-width = mint_redeem_fee + net yield * settle_days / 365, to first order. Neither a minter's cash nor a redeemer's claim earns during settlement. Net yield stands in for the cash rate, floored at zero.- The shadow NAV reprices the whole ladder at the shock on day 0, before spread.## Step 1: check your method on these made-up numbersThe numbers and names below are made up. They aren't market levels, typical values or anyone's real figures.```json{ "rungs": [ { "days": 30, "face": 15000000, "yield_pct": 4 }, { "days": 60, "face": 20000000, "yield_pct": 4.5 }, { "days": 90, "face": 25000000, "yield_pct": 5 }, { "days": 180, "face": 40000000, "yield_pct": 5.5 } ], "cash": 1500000, "tokens_outstanding": 100000000, "mgmt_fee_bps": 20, "admin_custody_bps": 10, "mint_redeem_fee_bps": 5, "settle_days": 1, "daily_redemption_pct": 3, "stress_days": 20, "rate_shock_bps": 200, "bid_ask_bps": 10}```Work them out with the method above. Yours should match these within 0.5%.- NAV per token: 0.999432- Hypothetical net yield on NAV: 4.5709 %- Weighted days to maturity: 108.78 days- First forced sale: 2- Face sold in forced sales: 44512386.78- Loss per remaining token: 0.00193181- No-profit band around NAV: 6.2523 bps- NAV per token at the shocked yields: 0.993641Where the outcome flips, with the other inputs held:- daily_redemption_pct at 0.0755: Forced sales begin above this daily redemption rate. Below it, cash and maturities pay every request.- cash at 82713909.49: With this much starting cash, rungs and tokens as sent, no forced sale happens at the sent redemption rate. Cash is then 45.7% of the pool, and more cash lifts NAV and so the redemptions too.If yours differ, stop and tell the person which ones and by how much. Don't go on to real numbers until they match, or until the person has seen the difference. These values come from one engine and can be wrong too.## Step 2: run it on the person's numbersReplace every input with the person's own. Ask for any number you don't have, and don't invent one.## Step 3: reportGive one sentence beginning "On these numbers,", then the values, then where the outcome flips. Always add what this leaves out:- New mints during the run, and any gate, pause or credit line the issuer could use.- Depth: the spread stays the same however much is sold, and one parallel shock hits every rung.- Reinvestment: cash from a maturity sits until it's paid out.- A pool that strikes NAV at market yields, where leavers would share the shock and the transfer to them shrinks.- Where the token itself trades on the secondary market during the run.- Taxes on the bills or the token.- Failure of the issuer, the custodian or the system recording the token.- Whether this holder may acquire, hold, mint, redeem, pledge, sell or transfer this token, or use any pool. Those are legal questions for counsel.## LimitsResults are hypothetical: arithmetic on the numbers given, prepared with hindsight. Nobody achieved them, and costs and liquidity are only as assumed. They aren't a forecast, a recommendation, an offer or a record of real trading. Don't say what to buy, sell or hold, and don't use them to market an investment. Whether a person may hold or trade an instrument is a legal question for counsel.Provided as is, at your own risk, by hedgefund.md, which is not a fund and isn't anyone's adviser. Version 1.0. Source: https://hedgefund.md/models/tokenized_bills/prompt.md. Terms: https://hedgefund.md/termsCall it
The same code answers on this page, over HTTP, over MCP and on your own machine, and the same inputs give the same bytes. No key, and nothing is stored. Send positions by POST or run the library, because a URL can land in a server log. model.md holds all of this for your agent.
POST the inputs to /api/v1/tokenized_bills.
curl -s https://hedgefund.md/api/v1/tokenized_bills \ -H 'content-type: application/json' \ -d '{"rungs":[{"days":30,"face":15000000,"yield_pct":4},{"days":60,"face":20000000,"yield_pct":4.5},{"days":90,"face":25000000,"yield_pct":5},{"days":180,"face":40000000,"yield_pct":5.5}],"cash":1500000,"tokens_outstanding":100000000,"mgmt_fee_bps":20,"admin_custody_bps":10,"mint_redeem_fee_bps":5,"settle_days":1,"daily_redemption_pct":3,"stress_days":20,"rate_shock_bps":200,"bid_ask_bps":10}' \ | jq '{summary, flags, flips, not_modeled, inputs_hash}'The tool is tokenized_bills on https://hedgefund.md/mcp.
curl -s https://hedgefund.md/mcp \ -H 'content-type: application/json' -H 'accept: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tokenized_bills","arguments":{"rungs":[{"days":30,"face":15000000,"yield_pct":4},{"days":60,"face":20000000,"yield_pct":4.5},{"days":90,"face":25000000,"yield_pct":5},{"days":180,"face":40000000,"yield_pct":5.5}],"cash":1500000,"tokens_outstanding":100000000,"mgmt_fee_bps":20,"admin_custody_bps":10,"mint_redeem_fee_bps":5,"settle_days":1,"daily_redemption_pct":3,"stress_days":20,"rate_shock_bps":200,"bid_ask_bps":10}}}' \ | jq '.result.structuredContent | {summary, flags, flips, not_modeled, inputs_hash}'One file with no dependencies, and nothing is sent anywhere.
curl -fsSL https://hedgefund.md/hedgefund.mjs -o hedgefund.mjs # read it before you run itnode hedgefund.mjs template tokenized_bills > mine.json # replace every number in itnode hedgefund.mjs run tokenized_bills mine.json | jq '{summary, flags, flips, not_modeled, inputs_hash}'Made-up numbers that run as they stand. Replace every one.
{ "rungs": [ { "days": 30, "face": 15000000, "yield_pct": 4 }, { "days": 60, "face": 20000000, "yield_pct": 4.5 }, { "days": 90, "face": 25000000, "yield_pct": 5 }, { "days": 180, "face": 40000000, "yield_pct": 5.5 } ], "cash": 1500000, "tokens_outstanding": 100000000, "mgmt_fee_bps": 20, "admin_custody_bps": 10, "mint_redeem_fee_bps": 5, "settle_days": 1, "daily_redemption_pct": 3, "stress_days": 20, "rate_shock_bps": 200, "bid_ask_bps": 10}Inputs
| Input | Type | Range | Required | What it is |
|---|---|---|---|---|
| rungs | array | 0 to 60 items | yes | The T-bill ladder. Up to 60 rungs. Empty if the pool holds only cash. |
| rungs[].days | whole number | 1 to 730 | yes | Days to maturity. |
| rungs[].face | number | over 0 to 10000000000000 | yes | Face value paid at maturity. |
| rungs[].yield_pct | number | 0 to 50 | yes | Money-market yield, simple, actual/365. 5 means 5%. Not a bank discount rate. |
| cash | number | 0 to 10000000000000 | yes | Cash in the pool. It earns nothing here. |
| tokens_outstanding | number | over 0 to 10000000000000 | yes | Tokens outstanding. |
| mgmt_fee_bps | number | 0 to 1000 | yes | Management fee a year on NAV. 20 means 0.20%. |
| admin_custody_bps | number | 0 to 1000 | yes | Admin and custody cost a year on NAV. 10 means 0.10%. |
| mint_redeem_fee_bps | number | 0 to 1000 | yes | Fee to mint or to redeem, on NAV. 5 means 0.05%. |
| settle_days | whole number | 0 to 60 | yes | Days from a request to its payment. 0 pays the same day. |
| daily_redemption_pct | number | 0 to 100 | yes | Share of the tokens left that ask out each day. 3 means 3%. |
| stress_days | whole number | 1 to 365 | yes | Days on which requests arrive. |
| rate_shock_bps | number | 0 to 5000 | yes | Rise in every rung's yield at a forced sale. 200 means 2 points. |
| bid_ask_bps | number | 0 to 1000 | yes | Full bid-ask width in price. A sale gives up half of it. |
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.