TokenVesting
Holds the protocol token's initial mint and releases it on a fixed weekly schedule after a cliff. Ownerless — the schedule is set at construction and cannot be changed, accelerated, or bypassed.
Singleton, deployed before the factory so its address can be patched in. No owner, no emergency withdrawal, no admin function of any kind. Token, beneficiary and start time are immutable.
Schedule
| Parameter | Value |
|---|---|
CLIFF_WEEKS | 24 weeks |
TOKENS_PER_WEEK | 240,000 × 10⁹ (240k tokens) |
SECONDS_PER_WEEK | 604,800 |
| Start | block.timestamp at construction |
| Total held | 60,000,000 × 10⁹ (60M) — the protocol token's initial mint |
Nothing is releasable during the cliff. After it, 240,000 × 10⁹ (240k tokens) become releasable per elapsed week, capped by the contract's actual balance.
Functions
release() externalTransfer everything currently releasable to the beneficiary. Anyone can call — the recipient is fixed, so there is nothing to gain by calling it and nothing to lose by someone else doing so.
"nothing to release"— still in the cliff, or already fully released for elapsed weeks
TokensReleased(amount, total_released, timestamp)
View Functions
| Function | Returns |
|---|---|
releasable() -> uint256 | Claimable right now |
vested() -> uint256 | Total vested to date, including already released |
get_total_released() -> uint256 | Cumulative released |
get_balance() -> uint256 | Tokens still held |
weeks_elapsed() -> uint256 | Whole weeks since start |
cliff_remaining() -> uint256 | Seconds until the cliff ends, or 0 |
get_token() -> address | Vested token ($LP24) |
get_beneficiary() -> address | Fixed recipient |
get_start_time() -> uint256 | Construction timestamp |
Beneficiary, start time, total released and current balance are all public. Anyone can confirm the protocol's allocation is subject to this schedule rather than sitting in a wallet, and can reconstruct the full release history from TokensReleased logs.