Models / Tokenized assets / tokenized_property
Property token
What would this property token pay on these numbers, which cap rate move hits its covenant, and how does a secondary discount compare with waiting in the redemption queue?
Takes a pool of properties with debt: cap rate, debt service cover, LTV, NAV per token, distribution after debt service, reserves and fees. A shock grid of cap rate moves and vacancy, per property. Quarters to get a request through a gate, and the secondary discount that equals waiting. Every number comes from the caller. Not an appraisal, a price or advice.
On these numbers, NAV is 35 per token with a hypothetical 3.2% distribution yield, a 25% request takes 6 quarters under the gate and costs 2.5% in present value with NAV flat, against a 12% secondary discount, and at the sent shock NAV is 20.24 with the worst LTV at 74.64%.
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
35
Value 80,000,000 less debt 45,000,000. Pool cap rate 6.125%.
Pool LTV
watch56.25%
Worst property Office tower A at 60%. At the sent shock: pool 68.98%, Office tower A 74.64%. Covenant 65%.
Debt service cover
1.667x
At the sent shock 1.583x.
Distribution per token
1.12
NOI 4,900,000 less debt service 2,940,000, reserves 490,000, fee 350,000. At the sent shock 1.0471.
Hypothetical distribution yield on NAV
3.2%
At the sent discount it is 3.636% on the secondary price. Amortization of 1.457% of NAV isn't counted in this yield.
Quarters to clear a request
watch6
Gate 5% of tokens outstanding each quarter, request 25%. Average wait 3.19 quarters.
Break-even secondary discount
watch2.504%
At the 3.2% distribution yield with NAV flat. Sent discount 12%. With NAV at the sent shock when paid, 43.63%.
NAV per token at the sent shock
breach20.24
42.18% under NAV now, from a value fall of 18.45%. Cap move 100 bps, vacancy 5%.
What flips it
The value of one input where the outcome changes, with the others held.
cap_rate_shock_bps
16.04bpsnow 100
With vacancy at the sent shock, Office tower A reaches the 65% covenant at this cap rate move, the first property to do so.
cap_rate_shock_bps
59.22bpsnow 100
With vacancy at the sent shock, the pool's LTV as a whole reaches the 65% covenant at this cap rate move.
cap_rate_shock_bps
418.84bpsnow 100
With vacancy at the sent shock, pool equity is gone at this cap rate move: value equals debt and NAV is zero.
vacancy_shock_pct
33.12%now 5
With the cap rate move as sent, the distribution reaches zero at this vacancy.
cap_rate_shock_bps
26.95bpsnow 100
With no vacancy change, at this cap rate move the queue, paid at the NAV that move gives, is worth what a sale now at the sent discount brings. Above it a sale at the sent discount shows the higher present value, if a sale is allowed at all.
Flags
What went past a line, and what to read before you trust the rest.
- breachAt the sent shock Office tower A is at 74.64% LTV, over the 65% covenant, while the pool as a whole is at 68.98%. covenant_at_shock
- watchThe token may trade at any hour, but a 25% request takes 6 quarters under the gate, 3.19 quarters on average. queue_mismatch
- watchThe secondary discount of 12% is 9.5 points over the 2.5% that the queue costs in present value with NAV flat. A cap rate move of 26.9 bps with no vacancy change closes that gap. discount_over_queue_cost
What this leaves out
What the formula leaves out, by name.
- Operating leverage: with fixed costs, NOI falls faster than revenue in a vacancy shock.
- Refinancing and floating debt: a cap rate move usually comes with a rate move, and maturing loans reprice.
- Non-recourse loans: a lender's claim here reaches the whole pool. If a loan can't reach it, a property under water costs less than shown.
- How the pool finds cash for redemptions, and what that does to LTV. Sales, costs and new borrowing are ignored.
- First-in-first-out queues, where a place at the back waits longer than the pro rata figure.
- Appraisal lag and error: value is what was sent.
- Capital spending, leasing costs, and the use of reserves.
- Taxes at the property, the pool or the holder, and transfer costs on a secondary sale.
- Where the secondary market's depth can absorb a sale at the sent discount.
- 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 (8)
What it took as given to get here.
- Debt service for the year = debt * (debt_rate_pct + amort_pct) / 100, with interest on the opening balance.
- The platform fee is a share of NAV, so a lower NAV means a lower fee. Reserves are a share of NOI, held back and not added to NAV. Distribution is what remains. It is floored at zero, and a deficit is flagged.
- Distribution yield is on NAV, not on a secondary price. Amortization builds equity but isn't counted in it.
- The shock moves each property's own cap rate, then sums. Vacancy takes the same share off NOI, with operating costs falling in step. Debt rates stay as sent.
- The covenant is tested per property, and the pool's LTV is shown beside it. Debt is netted across the pool, floored at zero per token.
- The gate is a share of tokens outstanding at the start of each quarter, so it shrinks as the queue is paid. Fills are pro rata and paid at quarter end. The tail stops once under 1 part in 10,000 of the request is left. The count stops at 400 quarters, and anything still unpaid then is given no value in the break-even.
- Break-even discount: a request in the queue earns no distribution, and money out now can earn the pool's distribution yield. Quarterly compounding, NAV flat. If the queue did keep earning the distribution at that same rate, the break-even would be zero.
- Flips on the cap rate hold vacancy at the sent shock. The flip against the secondary discount is the exception: it holds vacancy at zero, so it reads as a pure cap rate move.
- No vacancy change
- Vacancy shock 5%
The data
Properties
| Property | Value | NOI | Cap rate % | Debt | LTV % | Debt service | Cover x | Equity |
|---|---|---|---|---|---|---|---|---|
| Office tower A | 40,000,000 | 2,200,000 | 5.5 | 24,000,000 | 60 | 1,560,000 | 1.41 | 16,000,000 |
| Warehouse B | 30,000,000 | 1,950,000 | 6.5 | 15,000,000 | 50 | 900,000 | 2.167 | 15,000,000 |
| Retail park C | 10,000,000 | 750,000 | 7.5 | 6,000,000 | 60 | 480,000 | 1.563 | 4,000,000 |
Shock grid, per property then summed
| Cap move bps | Vacancy % | Value | NAV | NAV per token | Pool LTV % | Worst LTV % | Cover x | Distribution per token | Flag |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 80,000,000 | 35,000,000 | 35 | 56.25 | 60 | 1.667 | 1.12 | watch |
| 0 | 2.5 | 78,000,000 | 33,000,000 | 33 | 57.69 | 61.54 | 1.625 | 1.0298 | watch |
| 0 | 5 | 76,000,000 | 31,000,000 | 31 | 59.21 | 63.16 | 1.583 | 0.9395 | watch |
| 50 | 0 | 73,898,810 | 28,898,810 | 28.9 | 60.89 | 65.45 | 1.667 | 1.181 | breach |
| 50 | 2.5 | 72,051,339 | 27,051,339 | 27.05 | 62.46 | 67.13 | 1.625 | 1.0892 | breach |
| 50 | 5 | 70,203,869 | 25,203,869 | 25.2 | 64.1 | 68.9 | 1.583 | 0.9975 | breach |
| 100 | 0 | 68,669,683 | 23,669,683 | 23.67 | 65.53 | 70.91 | 1.667 | 1.2333 | breach |
| 100 | 2.5 | 66,952,941 | 21,952,941 | 21.95 | 67.21 | 72.73 | 1.625 | 1.1402 | breach |
| 100 | 5 | 65,236,199 | 20,236,199 | 20.24 | 68.98 | 74.64 | 1.583 | 1.0471 | breach |
| 150 | 0 | 64,136,905 | 19,136,905 | 19.14 | 70.16 | 76.36 | 1.667 | 1.2786 | breach |
| 150 | 2.5 | 62,533,482 | 17,533,482 | 17.53 | 71.96 | 78.32 | 1.625 | 1.1844 | breach |
| 150 | 5 | 60,930,060 | 15,930,060 | 15.93 | 73.86 | 80.38 | 1.583 | 1.0902 | breach |
| 200 | 0 | 60,169,247 | 15,169,247 | 15.17 | 74.79 | 81.82 | 1.667 | 1.3183 | breach |
| 200 | 2.5 | 58,665,015 | 13,665,015 | 13.66 | 76.71 | 83.92 | 1.625 | 1.2231 | breach |
| 200 | 5 | 57,160,784 | 12,160,784 | 12.16 | 78.73 | 86.12 | 1.583 | 1.1279 | breach |
Break-even discount by discount rate, with NAV flat
| Discount rate % | Break-even discount % |
|---|---|
| 3.2 | 2.504 |
| 5.2 | 4.019 |
| 7.2 | 5.497 |
| 11.2 | 8.347 |
The queue
| Quarter | Filled % | Cumulative % | Discount factor |
|---|---|---|---|
| 1 | 20 | 20 | 0.992063 |
| 2 | 19 | 39 | 0.98419 |
| 3 | 18.05 | 57.05 | 0.976379 |
| 4 | 17.15 | 74.2 | 0.96863 |
| 5 | 16.29 | 90.49 | 0.960942 |
| 6 | 9.512 | 100 | 0.953316 |
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_property.md.
# Property 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.** What would this property token pay on these numbers, which cap rate move hits its covenant, and how does a secondary discount compare with waiting in the redemption queue?## MethodCap rate = NOI / value. Debt service = debt * (rate + amort). Cover = NOI / debt service. LTV = debt / value. NAV = value - debt. Distribution = NOI - debt service - reserve - fee. Shocked value per property = NOI * (1 - vacancy) / (cap + shock). Queue fills = min(left, gate * tokens outstanding) each quarter. Break-even discount = 1 - sum(fill_q / (1 + y / 4)^q).## Conventions- Debt service for the year = debt * (debt_rate_pct + amort_pct) / 100, with interest on the opening balance.- The platform fee is a share of NAV, so a lower NAV means a lower fee. Reserves are a share of NOI, held back and not added to NAV. Distribution is what remains. It is floored at zero, and a deficit is flagged.- Distribution yield is on NAV, not on a secondary price. Amortization builds equity but isn't counted in it.- The shock moves each property's own cap rate, then sums. Vacancy takes the same share off NOI, with operating costs falling in step. Debt rates stay as sent.- The covenant is tested per property, and the pool's LTV is shown beside it. Debt is netted across the pool, floored at zero per token.- The gate is a share of tokens outstanding at the start of each quarter, so it shrinks as the queue is paid. Fills are pro rata and paid at quarter end. The tail stops once under 1 part in 10,000 of the request is left. The count stops at 400 quarters, and anything still unpaid then is given no value in the break-even.- Break-even discount: a request in the queue earns no distribution, and money out now can earn the pool's distribution yield. Quarterly compounding, NAV flat. If the queue did keep earning the distribution at that same rate, the break-even would be zero.- Flips on the cap rate hold vacancy at the sent shock. The flip against the secondary discount is the exception: it holds vacancy at zero, so it reads as a pure cap rate move.## 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{ "properties": [ { "name": "Office tower A", "value": 40000000, "noi": 2200000, "debt": 24000000, "debt_rate_pct": 5.5, "amort_pct": 1 }, { "name": "Warehouse B", "value": 30000000, "noi": 1950000, "debt": 15000000, "debt_rate_pct": 5, "amort_pct": 1 }, { "name": "Retail park C", "value": 10000000, "noi": 750000, "debt": 6000000, "debt_rate_pct": 6, "amort_pct": 2 } ], "tokens_outstanding": 1000000, "platform_fee_bps": 100, "reserve_pct_of_noi": 10, "cap_rate_shock_bps": 100, "vacancy_shock_pct": 5, "ltv_covenant_pct": 65, "gate_pct_per_quarter": 5, "redemption_request_pct": 25, "secondary_discount_pct": 12}```Work them out with the method above. Yours should match these within 0.5%.- NAV per token: 35- Pool LTV: 56.25 %- Debt service cover: 1.667 x- Distribution per token: 1.12- Hypothetical distribution yield on NAV: 3.2 %- Quarters to clear a request: 6- Break-even secondary discount: 2.504 %- NAV per token at the sent shock: 20.2362Where the outcome flips, with the other inputs held:- cap_rate_shock_bps at 16.04: With vacancy at the sent shock, Office tower A reaches the 65% covenant at this cap rate move, the first property to do so.- cap_rate_shock_bps at 59.22: With vacancy at the sent shock, the pool's LTV as a whole reaches the 65% covenant at this cap rate move.- cap_rate_shock_bps at 418.84: With vacancy at the sent shock, pool equity is gone at this cap rate move: value equals debt and NAV is zero.- vacancy_shock_pct at 33.1239: With the cap rate move as sent, the distribution reaches zero at this vacancy.- cap_rate_shock_bps at 26.95: With no vacancy change, at this cap rate move the queue, paid at the NAV that move gives, is worth what a sale now at the sent discount brings. Above it a sale at the sent discount shows the higher present value, if a sale is allowed at all.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:- Operating leverage: with fixed costs, NOI falls faster than revenue in a vacancy shock.- Refinancing and floating debt: a cap rate move usually comes with a rate move, and maturing loans reprice.- Non-recourse loans: a lender's claim here reaches the whole pool. If a loan can't reach it, a property under water costs less than shown.- How the pool finds cash for redemptions, and what that does to LTV. Sales, costs and new borrowing are ignored.- First-in-first-out queues, where a place at the back waits longer than the pro rata figure.- Appraisal lag and error: value is what was sent.- Capital spending, leasing costs, and the use of reserves.- Taxes at the property, the pool or the holder, and transfer costs on a secondary sale.- Where the secondary market's depth can absorb a sale at the sent discount.- 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_property/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_property.
curl -s https://hedgefund.md/api/v1/tokenized_property \ -H 'content-type: application/json' \ -d '{"properties":[{"name":"Office tower A","value":40000000,"noi":2200000,"debt":24000000,"debt_rate_pct":5.5,"amort_pct":1},{"name":"Warehouse B","value":30000000,"noi":1950000,"debt":15000000,"debt_rate_pct":5,"amort_pct":1},{"name":"Retail park C","value":10000000,"noi":750000,"debt":6000000,"debt_rate_pct":6,"amort_pct":2}],"tokens_outstanding":1000000,"platform_fee_bps":100,"reserve_pct_of_noi":10,"cap_rate_shock_bps":100,"vacancy_shock_pct":5,"ltv_covenant_pct":65,"gate_pct_per_quarter":5,"redemption_request_pct":25,"secondary_discount_pct":12}' \ | jq '{summary, flags, flips, not_modeled, inputs_hash}'The tool is tokenized_property 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_property","arguments":{"properties":[{"name":"Office tower A","value":40000000,"noi":2200000,"debt":24000000,"debt_rate_pct":5.5,"amort_pct":1},{"name":"Warehouse B","value":30000000,"noi":1950000,"debt":15000000,"debt_rate_pct":5,"amort_pct":1},{"name":"Retail park C","value":10000000,"noi":750000,"debt":6000000,"debt_rate_pct":6,"amort_pct":2}],"tokens_outstanding":1000000,"platform_fee_bps":100,"reserve_pct_of_noi":10,"cap_rate_shock_bps":100,"vacancy_shock_pct":5,"ltv_covenant_pct":65,"gate_pct_per_quarter":5,"redemption_request_pct":25,"secondary_discount_pct":12}}}' \ | 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_property > mine.json # replace every number in itnode hedgefund.mjs run tokenized_property mine.json | jq '{summary, flags, flips, not_modeled, inputs_hash}'Made-up numbers that run as they stand. Replace every one.
{ "properties": [ { "name": "Office tower A", "value": 40000000, "noi": 2200000, "debt": 24000000, "debt_rate_pct": 5.5, "amort_pct": 1 }, { "name": "Warehouse B", "value": 30000000, "noi": 1950000, "debt": 15000000, "debt_rate_pct": 5, "amort_pct": 1 }, { "name": "Retail park C", "value": 10000000, "noi": 750000, "debt": 6000000, "debt_rate_pct": 6, "amort_pct": 2 } ], "tokens_outstanding": 1000000, "platform_fee_bps": 100, "reserve_pct_of_noi": 10, "cap_rate_shock_bps": 100, "vacancy_shock_pct": 5, "ltv_covenant_pct": 65, "gate_pct_per_quarter": 5, "redemption_request_pct": 25, "secondary_discount_pct": 12}Inputs
| Input | Type | Range | Required | What it is |
|---|---|---|---|---|
| properties | array | 1 to 50 items | yes | The properties in the pool. Up to 50. |
| properties[].name | string | yes | A label, such as Office tower A. | |
| properties[].value | number | over 0 to 1000000000000 | yes | Current value. |
| properties[].noi | number | over 0 to 100000000000 | yes | Net operating income a year. The cap rate is noi / value. |
| properties[].debt | number | 0 to 1000000000000 | yes | Debt outstanding. 0 if none. |
| properties[].debt_rate_pct | number | 0 to 50 | yes | Interest rate on the debt. 5 means 5%. |
| properties[].amort_pct | number | 0 to 50 | yes | Principal repaid a year, as a share of the debt. 1 means 1%. |
| tokens_outstanding | number | over 0 to 10000000000000 | yes | Tokens outstanding. |
| platform_fee_bps | number | 0 to 2000 | yes | Platform fee a year on NAV. 100 means 1%. |
| reserve_pct_of_noi | number | 0 to 100 | yes | Share of NOI held back as reserves. 10 means 10%. |
| cap_rate_shock_bps | number | 0 to 2000 | yes | Rise in each property's cap rate in the shock. 100 means 1 point. |
| vacancy_shock_pct | number | 0 to 95 | yes | Fall in NOI from vacancy in the shock. 5 means NOI falls 5%. |
| ltv_covenant_pct | number | over 0 to 200 | yes | Loan covenant: the highest LTV allowed, tested per property. 65 means 65%. |
| gate_pct_per_quarter | number | 0 to 100 | yes | Share of tokens outstanding that can leave each quarter. 0 means redemptions are shut. |
| redemption_request_pct | number | 0 to 100 | yes | Share of all tokens asking out, shared pro rata under the gate. |
| secondary_discount_pct | number | 0 to 100 | yes | The discount to NAV you say a sale would take now. Whether a sale is allowed isn't checked. |
Hypothetical, and on made-up numbers until you replace them. Nobody traded this, and nothing here is on offer.