A vesting route: when 99.5% of the supply actually arrives #21

Closed
opened 2026-09-14 13:25:22 +00:00 by grenade · 0 comments
Owner

The network page says 5,669,940 QTC sits in the vesting pot and stops there.
That is the largest economic fact about this chain and the site currently treats
it as a single number.

Why this earns a route rather than a panel

It is the only forward-looking data the observer has. Everything else here
is history — blocks won, notes moved, balances now. A release schedule says what
will happen, and it is exact rather than projected:

// pallets/vesting, vested_amount()
if now < schedule.cliff { return Zero::zero(); }
if now >= schedule.end  { return schedule.total; }
multiply_by_rational_with_rounding(total, now - start, end - start, Rounding::Down)

Zero before the cliff, total from end, linear between. Summing that across
every schedule at a series of instants is an unlock curve computed from chain
state with no assumption in it.

Measured now, decoded from Vesting::Schedules on mainnet:

schedules              48
total scheduled        5,669,940.000 QTC
vesting pot balance    5,669,940.001 QTC   (the 0.001 is ExistentialDeposit exactly)
total claimed                  0.000 QTC
window                 2027-09-09 -> 2030-09-08
largest five           840,000 · 840,000 · 525,000 · 502,438 · 472,500 QTC

It retires a weak claim. "Held in the vesting pot" currently rests on an
eight-byte PalletId spelling qvesting and a type PalletId line read from a
source tree that may not be the deployed commit — the trap CLAUDE.md warns
about. A page where the schedules visibly sum to the pot turns a name-based
inference into a demonstrated fact.

Precedent: /:chain/reversible exists for a feature used zero times. This
is 99.5% of the money.

What it shows

  • Headline: scheduled, claimed, outstanding, share of issuance, first
    claimable date, final date, and whether the schedules still sum to the pot.
  • Release curve: summed vested_amount(t) sampled across the window. Single
    series, one hue, magnitude over time.
  • Per schedule: beneficiary (linked to the account route), total, claimed,
    start/cliff/end, vested now, claimable now.

Constraints

  • Decode through metadata, never by byte offset. The figures above came from
    reading 89 bytes positionally, which happened to sum exactly right and is
    still the shortcut this repository has a rule against. The route uses
    decode_map_value against the declared type.
  • vested_amount goes in blackbeard-core with tests, mirroring the
    pallet's own arithmetic — before the cliff, at the cliff, mid-window, at
    end, past end, and the start < cliff case where a chunk unlocks at once.
    It must not overflow: total × elapsed for a 840,000 QTC grant over a
    three-year window passes 10^28.
  • A snapshot, never a promise. retarget_schedule can change a beneficiary
    and end_schedule can end a grant; the page says so.
  • No identity claims. Beneficiaries are addresses. Nothing on chain calls
    anyone a founder, a team or an investor, so neither does the page.
  • A test pins the schedules' sum against the pot balance, so the association
    that justifies the network page's wording is enforced rather than asserted.

Refs #17.

The network page says 5,669,940 QTC sits in the vesting pot and stops there. That is the largest economic fact about this chain and the site currently treats it as a single number. ## Why this earns a route rather than a panel **It is the only forward-looking data the observer has.** Everything else here is history — blocks won, notes moved, balances now. A release schedule says what *will* happen, and it is exact rather than projected: ```rust // pallets/vesting, vested_amount() if now < schedule.cliff { return Zero::zero(); } if now >= schedule.end { return schedule.total; } multiply_by_rational_with_rounding(total, now - start, end - start, Rounding::Down) ``` Zero before the cliff, `total` from `end`, linear between. Summing that across every schedule at a series of instants is an unlock curve computed from chain state with **no assumption in it**. **Measured now**, decoded from `Vesting::Schedules` on mainnet: ``` schedules 48 total scheduled 5,669,940.000 QTC vesting pot balance 5,669,940.001 QTC (the 0.001 is ExistentialDeposit exactly) total claimed 0.000 QTC window 2027-09-09 -> 2030-09-08 largest five 840,000 · 840,000 · 525,000 · 502,438 · 472,500 QTC ``` **It retires a weak claim.** "Held in the vesting pot" currently rests on an eight-byte `PalletId` spelling `qvesting` and a `type PalletId` line read from a source tree that may not be the deployed commit — the trap `CLAUDE.md` warns about. A page where the schedules visibly sum to the pot turns a name-based inference into a demonstrated fact. **Precedent**: `/:chain/reversible` exists for a feature used zero times. This is 99.5% of the money. ## What it shows - **Headline**: scheduled, claimed, outstanding, share of issuance, first claimable date, final date, and whether the schedules still sum to the pot. - **Release curve**: summed `vested_amount(t)` sampled across the window. Single series, one hue, magnitude over time. - **Per schedule**: beneficiary (linked to the account route), total, claimed, start/cliff/end, vested now, claimable now. ## Constraints - **Decode through metadata, never by byte offset.** The figures above came from reading 89 bytes positionally, which happened to sum exactly right and is still the shortcut this repository has a rule against. The route uses `decode_map_value` against the declared type. - **`vested_amount` goes in `blackbeard-core` with tests**, mirroring the pallet's own arithmetic — before the cliff, at the cliff, mid-window, at `end`, past `end`, and the `start < cliff` case where a chunk unlocks at once. It must not overflow: `total × elapsed` for a 840,000 QTC grant over a three-year window passes 10^28. - **A snapshot, never a promise.** `retarget_schedule` can change a beneficiary and `end_schedule` can end a grant; the page says so. - **No identity claims.** Beneficiaries are addresses. Nothing on chain calls anyone a founder, a team or an investor, so neither does the page. - A test pins the schedules' sum against the pot balance, so the association that justifies the network page's wording is enforced rather than asserted. Refs #17.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: blackbeard/observer#21