Models / Digital assets / reserve_coverage
Reserve coverage
Do these reserves cover the tokens at par, and on which day does cash run short at this redemption rate?
Tests a reserve against redemptions at par: coverage after haircuts, cash available by day against cumulative redemptions, the first shortfall day and the largest daily redemption rate with no shortfall, plus net income on the reserve yield. All balances and rates come from the caller. Not an audit, an attestation or advice.
On these numbers, reserves cover 101.8% of tokens after haircuts, and at 5% a day cash first runs short on day 24. The largest daily rate with no shortfall over 60 days is 4.0173%.
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.
Coverage after haircuts
101.8%
On the balances sent. It doesn't show the reserves exist.
First shortfall day
breach24day
Shortfall on that day
1,251,098
Largest gap 7,856,445.9, on day 29.
Largest daily rate with no shortfall
breach4.0174%a day
Binding on day 29.
Net income per year
3,885,000
On face of 105,000,000, before any run-off.
Net income over the horizon
203,070
With reserves shrinking in step with tokens.
What flips it
The value of one input where the outcome changes, with the others held.
daily_redemption_pct
4.0174%now 5
The largest daily rate with no shortfall over 60 days. Just above it, cash first runs short on day 29.
Flags
What went past a line, and what to read before you trust the rest.
- breachCoverage is 101.8% and cash still runs short on day 24, because reserves reach cash later than redemptions arrive. shortfall_in_horizon
- watch8.5% of tokens' worth of reserves reach cash after day 60, so coverage counts them and the ladder doesn't. reserves_past_horizon
What this leaves out
What the formula leaves out, by name.
- Haircuts that widen as more is sold, and forced-sale price impact.
- Selling a reserve early for less than the stated haircut, or borrowing against it.
- Any legal claim on the reserves, custody or banking failure, and whether the reserves exist as stated.
- Contract, chain or bridge failures, paused redemptions, gates and redemption fees.
- Weekends and holidays. Every day counts as a settlement day.
- The token's price away from par in a secondary market.
- Taxes.
What it took as given (8)
What it took as given to get here.
- Each day redeems the daily rate of the tokens still outstanding that morning, at par. The redemptions shrink as tokens leave.
- A reserve becomes cash only on its days_to_cash, in full, after its haircut. Unused cash carries forward, so the test compares running totals, not one day's flows.
- A shortfall is a day-end running total of redemptions above the running total of cash. Days are 1 to the horizon.
- Coverage counts every reserve, including any that reach cash after the horizon. The ladder counts only what has reached cash by that day.
- Yield isn't added to the cash ladder. Net income per year is face * (yield - fee), on the reserves as they stand.
- Income over the horizon scales that by the tokens left at the start of each day, over a 365-day year, as if reserves shrink in step with tokens.
- The largest daily rate comes from a bisection between 0 and 100 percent, cut at the tenth digit to a rate that passes when sent back. A shortfall can't get smaller as the rate rises. If no rate up to 100 gives a shortfall, the largest is 100.
- The sleeve is per 100 of tokens. Tail is the haircut loss, liquidity days the last reserve's days to cash, and carry the yearly net income.
- Cash available
- Cumulative redemptions
The data
Reserve ladder
| reserve | amount | haircut_pct | after_haircut | days_to_cash |
|---|---|---|---|---|
| Bank cash | 10,000,000 | 0 | 10,000,000 | 0 |
| Bill 30d | 30,000,000 | 0.5 | 29,850,000 | 3 |
| Bill 90d | 30,000,000 | 1 | 29,700,000 | 5 |
| Loan note | 25,000,000 | 5 | 23,750,000 | 30 |
| Property note | 10,000,000 | 15 | 8,500,000 | 120 |
Cash against redemptions by day
| day | cash_available | cumulative_redemptions | cushion | tokens_left |
|---|---|---|---|---|
| 1 | 10,000,000 | 5,000,000 | 5,000,000 | 95,000,000 |
| 2 | 10,000,000 | 9,750,000 | 250,000 | 90,250,000 |
| 3 | 39,850,000 | 14,262,500 | 25,587,500 | 85,737,500 |
| 4 | 39,850,000 | 18,549,375 | 21,300,625 | 81,450,625 |
| 5 | 69,550,000 | 22,621,906 | 46,928,094 | 77,378,094 |
| 24 | 69,550,000 | 70,801,098 | -1,251,098 | 29,198,902 |
| 29 | 69,550,000 | 77,406,446 | -7,856,446 | 22,593,554 |
| 30 | 93,300,000 | 78,536,124 | 14,763,876 | 21,463,876 |
| 60 | 93,300,000 | 95,393,020 | -2,093,020 | 4,606,980 |
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/reserve_coverage.md.
# Reserve coverage: 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.** Do these reserves cover the tokens at par, and on which day does cash run short at this redemption rate?## MethodCoverage = sum(amount * (1 - haircut)) / tokens. Cumulative redemptions by day t = tokens * (1 - (1 - r)^t), since each day redeems r of what's left. Cash by day t = sum of amount * (1 - haircut) over reserves with days_to_cash <= t. A shortfall is cumulative redemptions above cash on any day. Net income = face * (yield - fee).## Conventions- Each day redeems the daily rate of the tokens still outstanding that morning, at par. The redemptions shrink as tokens leave.- A reserve becomes cash only on its days_to_cash, in full, after its haircut. Unused cash carries forward, so the test compares running totals, not one day's flows.- A shortfall is a day-end running total of redemptions above the running total of cash. Days are 1 to the horizon.- Coverage counts every reserve, including any that reach cash after the horizon. The ladder counts only what has reached cash by that day.- Yield isn't added to the cash ladder. Net income per year is face * (yield - fee), on the reserves as they stand.- Income over the horizon scales that by the tokens left at the start of each day, over a 365-day year, as if reserves shrink in step with tokens.- The largest daily rate comes from a bisection between 0 and 100 percent, cut at the tenth digit to a rate that passes when sent back. A shortfall can't get smaller as the rate rises. If no rate up to 100 gives a shortfall, the largest is 100.- The sleeve is per 100 of tokens. Tail is the haircut loss, liquidity days the last reserve's days to cash, and carry the yearly net income.## 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{ "tokens_outstanding": 100000000, "reserves": [ { "name": "Bank cash", "amount": 10000000, "haircut_pct": 0, "days_to_cash": 0 }, { "name": "Bill 30d", "amount": 30000000, "haircut_pct": 0.5, "days_to_cash": 3 }, { "name": "Bill 90d", "amount": 30000000, "haircut_pct": 1, "days_to_cash": 5 }, { "name": "Loan note", "amount": 25000000, "haircut_pct": 5, "days_to_cash": 30 }, { "name": "Property note", "amount": 10000000, "haircut_pct": 15, "days_to_cash": 120 } ], "daily_redemption_pct": 5, "horizon_days": 60, "reserve_yield_pct": 4, "fee_bps": 30}```Work them out with the method above. Yours should match these within 0.5%.- Coverage after haircuts: 101.8 %- First shortfall day: 24 day- Shortfall on that day: 1251097.566- Largest daily rate with no shortfall: 4.017365659 % a day- Net income per year: 3885000- Net income over the horizon: 203069.525Where the outcome flips, with the other inputs held:- daily_redemption_pct at 4.017365659: The largest daily rate with no shortfall over 60 days. Just above it, cash first runs short on day 29.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:- Haircuts that widen as more is sold, and forced-sale price impact.- Selling a reserve early for less than the stated haircut, or borrowing against it.- Any legal claim on the reserves, custody or banking failure, and whether the reserves exist as stated.- Contract, chain or bridge failures, paused redemptions, gates and redemption fees.- Weekends and holidays. Every day counts as a settlement day.- The token's price away from par in a secondary market.- Taxes.## 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/reserve_coverage/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/reserve_coverage.
curl -s https://hedgefund.md/api/v1/reserve_coverage \ -H 'content-type: application/json' \ -d '{"tokens_outstanding":100000000,"reserves":[{"name":"Bank cash","amount":10000000,"haircut_pct":0,"days_to_cash":0},{"name":"Bill 30d","amount":30000000,"haircut_pct":0.5,"days_to_cash":3},{"name":"Bill 90d","amount":30000000,"haircut_pct":1,"days_to_cash":5},{"name":"Loan note","amount":25000000,"haircut_pct":5,"days_to_cash":30},{"name":"Property note","amount":10000000,"haircut_pct":15,"days_to_cash":120}],"daily_redemption_pct":5,"horizon_days":60,"reserve_yield_pct":4,"fee_bps":30}' \ | jq '{summary, flags, flips, not_modeled, inputs_hash}'The tool is reserve_coverage 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":"reserve_coverage","arguments":{"tokens_outstanding":100000000,"reserves":[{"name":"Bank cash","amount":10000000,"haircut_pct":0,"days_to_cash":0},{"name":"Bill 30d","amount":30000000,"haircut_pct":0.5,"days_to_cash":3},{"name":"Bill 90d","amount":30000000,"haircut_pct":1,"days_to_cash":5},{"name":"Loan note","amount":25000000,"haircut_pct":5,"days_to_cash":30},{"name":"Property note","amount":10000000,"haircut_pct":15,"days_to_cash":120}],"daily_redemption_pct":5,"horizon_days":60,"reserve_yield_pct":4,"fee_bps":30}}}' \ | 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 reserve_coverage > mine.json # replace every number in itnode hedgefund.mjs run reserve_coverage mine.json | jq '{summary, flags, flips, not_modeled, inputs_hash}'Made-up numbers that run as they stand. Replace every one.
{ "tokens_outstanding": 100000000, "reserves": [ { "name": "Bank cash", "amount": 10000000, "haircut_pct": 0, "days_to_cash": 0 }, { "name": "Bill 30d", "amount": 30000000, "haircut_pct": 0.5, "days_to_cash": 3 }, { "name": "Bill 90d", "amount": 30000000, "haircut_pct": 1, "days_to_cash": 5 }, { "name": "Loan note", "amount": 25000000, "haircut_pct": 5, "days_to_cash": 30 }, { "name": "Property note", "amount": 10000000, "haircut_pct": 15, "days_to_cash": 120 } ], "daily_redemption_pct": 5, "horizon_days": 60, "reserve_yield_pct": 4, "fee_bps": 30}Inputs
| Input | Type | Range | Required | What it is |
|---|---|---|---|---|
| tokens_outstanding | number | 0.01 to 100000000000000 | yes | Tokens outstanding, redeemable at par of 1. |
| reserves | array | 1 to 30 items | yes | The reserve ladder. Up to 30 lines. |
| reserves[].name | string | yes | A label, such as Bill 90d. | |
| reserves[].amount | number | 0 to 100000000000000 | yes | Face amount of this reserve. |
| reserves[].haircut_pct | number | 0 to 100 | yes | Loss on turning it into cash. 5 means 5%. |
| reserves[].days_to_cash | whole number | 0 to 3650 | yes | Days until it's cash. 0 means today. |
| daily_redemption_pct | number | 0 to 100 | yes | Share of tokens still outstanding redeemed each day. 2 means 2%. |
| horizon_days | whole number | 1 to 730 | yes | Days to test. |
| reserve_yield_pct | number | -10 to 100 | no | Yearly yield on the reserve's face amount. 4 means 4%. Default 0. |
| fee_bps | number | 0 to 2000 | no | Yearly fee on the reserve's face amount, in basis points. Default 0. |
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.