Entretien du jeton (persistance)
Rien sur ZooBC n’est stocké gratuitement pour toujours, et un jeton utilisateur ne fait pas exception. Un nouveau jeton vit gratuitement pendant une première période ; ensuite, il ne vit qu’aussi longtemps que quelqu’un paie son entretien. Lorsqu’il expire, il disparaît de la chaîne et sa réserve en ZBC revient à ses détenteurs.
La hauteur d’expiration
Un jeton vit jusqu’à sa hauteur d’expiration (persist height) :
persist height = issue height + free period + blocks bought by survival payments
La période gratuite, token_free_persist_blocks, correspond à une période de loyer : 172 800 blocs, soit 30 jours.
Les paiements de survie
Un paiement de survie achète des blocs supplémentaires :
blocks bought = payment × billing period ÷ token_persist_period_cost
Le coût par période, token_persist_period_cost, commence à 0,1 ZBC (10 000 000 unités atomiques) pour une période de facturation de 172 800 blocs. Ainsi, 0,1 ZBC achète 30 jours de plus, et 0,3 ZBC en achète 90.
N’importe qui peut maintenir en vie n’importe quel jeton vivant, pas seulement son émetteur :
- FinanceToken (type 14) n’existe que pour cela, et doit porter un paiement positif ;
- TransferToken, MintToken et BurnToken peuvent aussi porter un paiement de survie.
Un paiement de survie est un débit à part entière, jamais une partie des frais. Il va au fonds de longévité, qui verse une tranche aux nœuds à chaque bloc (voir les fonds).
Le coût par période fait partie des prix sur lesquels votent les nœuds enregistrés (voir les votes de prix). Il est plafonné à 10 ZBC par période et peut être abaissé par vote jusqu’à une seule unité atomique ; sa période suit le cycle d’instantané. GET /api/v1/blockchain/fee-params indique à la fois token_free_persist_blocks et token_persist_period_cost.
Sur le devnet, où les délais sont courts, la période gratuite est de 240 blocs (une heure) et 1 ZBC achète 240 blocs, ce qui permet d’essayer rapidement l’expiration.
Quand un jeton expire
Une fois sa hauteur d’expiration dépassée, un jeton est expiré :
- il est invisible pour tout lecteur, et les vues de l’API cessent de le lister ;
- toute opération sur lui est refusée, et devient une opération nulle payante si un bloc l’inclut tout de même ;
- il ne peut pas être ranimé : un FinanceToken ne peut prolonger qu’un jeton vivant.
Dans le bloc suivant, la réserve en ZBC du jeton, s’il en a une, est versée à ses détenteurs au prorata de leurs unités. Les unités comptent où qu’elles se trouvent : dans les soldes, dans les ordres ouverts sur un marché et dans les offres d’échange ouvertes (au profit de leur auteur), dans les séquestres de jetons en attente (au profit de l’expéditeur du séquestre), dans les transferts programmés en mode acquisition (au profit du propriétaire du programme), dans les flux de paiement (le destinataire est crédité de la part déjà libérée, l’expéditeur du reste) et dans les mises des joueurs assis à une appli. L’émetteur n’est payé que pour les unités qu’il détient lui-même, et ne récupère la réserve que lorsque plus aucun compte ne détient une seule unité.
Les pièces de genèse ont été créées sans date d’expiration : aucun entretien n’est donc dû pour elles. Un FinanceToken sur un jeton qui n’expire jamais est refusé, puisqu’il n’a rien à financer ; si un bloc l’inclut tout de même, il paie ses frais et ne change rien.
Qui paie
Comme n’importe qui peut payer, un jeton ne dépend pas de son émetteur pour rester en vie : un détenteur, ou une appli qui s’appuie sur le jeton, peut envoyer un FinanceToken. Un jeton pour lequel personne ne paie prend fin proprement, et sa réserve revient aux personnes qui le détenaient.