Market Module 3.0 — Simulation Report
Terra Classic · October 20, 2026 · simulator sim_mm3.py (spec v0.2), fuzz fuzz_mm3.py
What this report shows
The mechanism specified in Market Module 3.0 — Technical Specification v0.2 was implemented as a daily simulator and run against eight scenarios, a genesis-size sweep and 3,000 randomized trajectories with the spec’s invariants checked every epoch. The result in one sentence: the module never mints LUNC, never lets TCB spiral, never lowers the floor, and defends the floor when TCB capital is comparable to USTC liabilities; when it cannot defend, it stops and USTC floats as it does today.
Two design flaws were found by the simulation and fixed in the spec before this report: a per-epoch TCB cap that compounded into unbounded dilution (fixed with a cumulative budget per floor level) and a ratchet whose solvency bar could never be reached (fixed with a trailing ratchet that covers only the floor increment). A third change, selling reserve inventory through on-chain auctions instead of a bridge call, came from design review.
Model
-
One epoch = one day; 365 epochs per run.
-
USTC market: speculative capital
D(US$) divided by supply gives the price; a secondary market of fixed depth absorbs unredeemed selling. -
TCB market: a constant-product pool with external liquidity equal to a fraction of genesis value; replenished slowly up to its original depth; unbonded holders may sell.
-
Module: floor at launch market price, band, three routes, per-epoch cap measured against supply at epoch start, cumulative budget per floor level, quadratic spread, reserve lots sold by auction against USDC bid capacity, pause states per epoch, breaker, TWAP with staleness, bonded TCB with 21-day unbonding, genesis by burn, burn-tax slice, revenue split and trailing ratchet.
-
Fixed assumptions (parameters at the top of
sim_mm3.py): LUNC at US$ 0.00005, USTC supply 5.6B at US$ 0.005 (US$ 28M), burn tax US$ 10k/day, USDC bid capacity US$ 100k/day, 30% of genesis participants unbond at claim.
Spec parameters used
band 15% · seigniorage 1.0% · TCB-route spread 1% · contraction spread 0.5%→2% · TCB cap 2.5%/epoch · cumulative budget 100% per floor level · redeem cap 1%/epoch · solvency 2× on the increment · reserve target 2% · ratchet step 10% after 30 epochs above the band · breaker 30% · unbonding 21 days · burn-tax slice 20% for 12 months · auction discount 2%→5%
Scenario results (12 months)
| Scenario | Lowest USTC | USTC at end | TCB at end | TCB supply × | USTC minted / burned | LUNC burned | Floor steps | Reserve at end | Floor restored |
|---|---|---|---|---|---|---|---|---|---|
| Launch at market, no demand change | US$ 0.0050 | US$ 0.0050 | US$ 0.0025 | 1.00 | 0.00B / 0.00B | 51B | 0 | US$ 0.62M | — |
| Demand growth | US$ 0.0050 | US$ 0.0057 | US$ 0.0025 | 1.00 | 2.42B / 0.00B | 329B | 0 | US$ 0.85M | — |
| Run with small TCB | US$ 0.0038 | US$ 0.0039 | US$ 0.0008 | 2.00 | 0.00B / 0.33B | 50B | 0 | US$ 0.21M | not within the year |
| Run with large TCB | US$ 0.0049 | US$ 0.0050 | US$ 0.0376 | 1.16 | 0.00B / 1.46B | 1001B | 0 | US$ 0.46M | day 92 |
| Run plus TCB holder flight | US$ 0.0046 | US$ 0.0050 | US$ 0.0245 | 1.28 | 0.00B / 1.46B | 1001B | 0 | US$ 0.46M | day 98 |
| Oracle outage during the run | US$ 0.0038 | US$ 0.0039 | US$ 0.0008 | 2.00 | 0.00B / 0.33B | 50B | 0 | US$ 0.21M | not within the year |
| Full 12-month cycle | US$ 0.0050 | US$ 0.0070 | US$ 0.0050 | 1.60 | 8.14B / 1.20B | 1326B | 2 | US$ 0.59M | — |
| Run then recovery | US$ 0.0049 | US$ 0.0062 | US$ 0.0379 | 1.15 | 0.53B / 1.42B | 1055B | 1 | US$ 0.57M | day 92 |
Floor at launch: US$ 0.0050. “Floor restored” is the first day after the run (day 90) with USTC back at the floor. LUNC burned includes the genesis burn.
Reading the scenarios
-
Launch at market. Nothing is minted all year. The reserve grows only by the burn-tax slice. Nobody is diluted.
-
Demand growth. Every USTC above the band is minted by burning LUNC: 2.4B USTC minted, about 330B LUNC burned, seigniorage to the reserve. TCB untouched.
-
Run with small TCB. With US$ 2.5M of TCB against US$ 28M of USTC the module cannot defend. It mints TCB up to the cumulative budget (2× supply), then stops. USTC floats at US$ 0.0039, which is where the market put it. No LUNC minted, TCB not driven to zero.
-
Run with large TCB. With US$ 50M of TCB, USTC never falls more than 2% below the floor and is back at the floor two days after the run ends. TCB is diluted 16% and loses a quarter of its price: the absorber absorbed.
-
Holder flight. Unbonded TCB holders selling 5%/day deepen the TCB drop (−50%) and the USTC dip (−8%), but bonded TCB cannot flee and the floor is restored eight days after the run.
-
Oracle outage. All routes close for the five stale days and reopen on a fresh sample; the outcome equals the same run without the outage.
-
Full cycle. Growth, a 35% run and a slow recovery: the floor steps up during the growth phase, bends during the run and is defended by TCB and the reserve; LUNC burn resumes with the recovery.
-
Run then recovery. Demand returns after the run; expansions resume, the TCB route recomposes supply burned in the contraction, and the floor steps up once demand has been above the band for 30 days.
Genesis size decides what the module can do
| Genesis (LUNC burned) | TCB capital | Lowest USTC in a −30% run (% of floor) | Floor steps in year one (demand +10%/month ×5) | LUNC burned in year one |
|---|---|---|---|---|
| 50B | US$ 2M | 76% | 0 | 329B |
| 100B | US$ 5M | 79% | 0 | 379B |
| 200B | US$ 10M | 85% | 1 | 407B |
| 300B | US$ 15M | 89% | 2 | 451B |
| 500B | US$ 25M | 94% | 2 | 651B |
| 1000B | US$ 50M | 97% | 2 | 1151B |
A 10% floor step costs about US$ 5.6M of cover at the current USTC supply (2 × supply × increment). Defense of the floor in a 30% run needs TCB capital of roughly the USTC liability. Both numbers scale with the genesis burn, which is the community’s decision.
Randomized testing (fuzz)
3000 trajectories were generated with random demand regimes (growth, flat, run, crash of up to 8%/day), random TCB holder selling, oracle outages, genesis between 20B and 2T LUNC, TCB liquidity, burn tax and module parameters. Every epoch the following invariants were checked:
-
LUNC supply never increases.
-
TCB minted per epoch ≤ cap, and cumulative TCB minted per floor level ≤ budget.
-
The floor never decreases.
-
Reserve balances never go negative.
-
Bonded and free TCB never go negative.
-
No route executes while the oracle is stale.
Result: 0 violations in 3000 runs (1,095,000 epochs). TCB ended below 5% of its genesis price in 1 runs. Maximum TCB supply multiple observed: 3.9× (several floor steps each resetting the budget, all backed by demand at the time).
| 60-day demand shock | TCB capital < liabilities | TCB capital ≥ liabilities |
|---|---|---|
| ≤25% | 152/192 held (79%) | 95/112 held (85%) |
| 25–40% | 2/96 held (2%) | 8/36 held (22%) |
| >40% | 0/1634 held (0%) | 31/930 held (3%) |
“Held” means USTC never fell below 90% of the floor during the whole year, a strict criterion. The random generator is harsh (most trajectories include a shock above 40%); what matters is that in none of them did the floor breaking turn into damage to another token.
Pessimistic scenarios requested in community review
Two cases the first version did not model, run after review (sim_mm3.py with arb_depth_frac=0.02 and arb_premium set from revenue):
| Case | Setup | Result |
|---|---|---|
| TCB with near-zero listed liquidity | External TCB liquidity = 2% of genesis value; −30% run; genesis 200B and 1T | USTC bottoms at US$ 0.0037–0.0038, the same as having no module. The contraction mints TCB up to the 2× budget for almost no price support and TCB's price collapses. Expansion is unaffected: 407B–1,151B LUNC burned under demand growth. |
| TCB priced by expected revenue, not by belief | TCB market value = 10 × annual module revenue (≈US$ 6M under demand growth, ≈US$ 1M at rest) | A −30% run bottoms at US$ 0.0041 (US$ 6M) or US$ 0.0038 (US$ 1M). The ratchet still steps under demand growth because the trailing rule covers only the increment, but there is no meaningful floor defense. |
Conclusion: until TCB has a liquid market, the contraction route must stay closed (the spec’s min_oracle_sources / arb_min_depth gate), and the module should be presented as expansion-only at launch. Floor defense is a capability that grows with TCB markets and the reserve; it does not exist on day one. The third case raised in review, USTC demand once the repeg upside is capped, cannot be simulated and is the first question for the community.
What the simulation changed in the spec
| Finding | Change (spec v0.2) |
|---|---|
| A 2.5%/day TCB cap compounds to ≈1,500× in a year of persistent gap | Cumulative mint budget per floor level (arb_mint_budget, 100% of supply), reset only on a floor step |
| Solvency on the whole liability (2 × US$ 28M) is unreachable in year one | Trailing ratchet: step only after 30 epochs above the band, step ≤ band, cover 2× the increment, reserve on the increment |
Sticky RESERVE_EMPTY delayed recovery by months | Pause states are per epoch; the TCB route reopens at rollover while the budget lasts |
| A 10% reserve target is unreachable from fees (≈US$ 0.1M per billion USTC minted) | Target 2%; burn-tax slice is the main source in year one |
| Reserve conversion depended on a bridge call | Reserve inventory sold in on-chain auctions against USDC already on the chain |
Limitations
-
LUNC price is fixed; burning hundreds of billions would move it, which makes the LUNC-burn figures upper bounds and the TCB-genesis dollar values lower bounds.
-
USTC demand is modeled as capital divided by supply; real order books have more structure.
-
TCB liquidity is a fraction of genesis value; the real TCB market will be whatever DEXs list it.
-
The USDC bid capacity for reserve auctions (US$ 100k/day) is an assumption; the reserve grows no faster than USDC arrives on the chain.
-
The simulator is a model of the spec, not the chain. The next step is porting the eight scenarios to Go test tables and running them against the module on a testnet, comparing events epoch by epoch.
Reproduce
python3 sim_mm3.py # eight scenarios
python3 fuzz_mm3.py 3000 # randomized invariants check (~20 s)
python3 report_mm3.py # this report and its figures






