Token upkeep (persistence)
Nothing on ZooBC is stored for free for ever, and a user token is no exception. A new token lives free for a first period; after that it lives only as long as someone pays for its upkeep. When it expires, it disappears from the chain and its ZBC backing goes back to its holders.
The persist height
A token lives until its persist height:
persist height = issue height + free period + blocks bought by survival payments
The free period, token_free_persist_blocks, is one rent period: 172,800 blocks, which is 30 days.
Survival payments
A survival payment buys more blocks:
blocks bought = payment × billing period ÷ token_persist_period_cost
The period cost, token_persist_period_cost, starts at 0.1 ZBC (10,000,000 atomic units) for a billing period of 172,800 blocks. So 0.1 ZBC buys another 30 days, and 0.3 ZBC buys 90.
Anyone can keep any live token alive, not only its issuer:
- FinanceToken (type 14) exists for this alone, and it must carry a positive payment;
- TransferToken, MintToken and BurnToken can carry a survival payment too.
A survival payment is its own debit, never part of the fee. It goes to the longevity pool, which pays the nodes a slice in every block (see pools).
The period cost is one of the prices the registered nodes vote on (see price votes). It has a ceiling of 10 ZBC per period and can be voted down to a single atomic unit, and its period follows the snapshot cycle. GET /api/v1/blockchain/fee-params reports both token_free_persist_blocks and token_persist_period_cost.
On devnet, where the timings are short, the free period is 240 blocks (one hour) and 1 ZBC buys 240 blocks, which makes expiry quick to try out.
When a token expires
Once its persist height has passed, a token is expired:
- it is invisible to every reader, and API views stop listing it;
- every operation on it is refused, and is a paid no-op if a block includes it anyway;
- it cannot be revived: a FinanceToken can extend only a live token.
In the next block, the token's ZBC backing, if it has any, is paid to its holders in proportion to their units. Units count wherever they sit: in balances, in open orders on a market and in open swap offers (credited to their maker), in pending token escrows (credited to the escrow's sender), in vesting schedules (credited to the schedule's owner), in streams (the recipient is credited with what has vested, the sender with the rest) and in the stakes of seated app players. The issuer is paid only for the units it holds itself, and gets the backing back only when no account holds a single unit.
Genesis coins were created without an expiry date, so no upkeep is due for them. A FinanceToken on a token that never expires is refused, since it has nothing to fund; if a block includes one anyway, it pays its fee and changes nothing.
Who pays
Since anyone can pay, a token does not depend on its issuer to stay alive: a holder, or an app that relies on the token, can send a FinanceToken. A token that nobody pays for ends cleanly, with its backing returned to the people who held it.