Une promesse, avec l'horloge incluse
Ce qui se passe dans un coffre, du verrouillage à la réclamation.
La vie d'un coffre
1. Verrouiller
Le financeur dépose le montant complet dans le coffre.
2. Attendre
Rien à faire. Tout le monde voit quoi se débloque quand.
3. Débloquer
Les dates passent, les fonds se débloquent. Sans transaction.
4. Réclamer
La personne bénéficiaire retire le débloqué, quand elle veut.
Trois calendriers, un exemple
Une bourse de 12 000 tUSDC, libérée de trois façons.
À une date
débloqué(t) = t ≥ date ? total : 0
12 000 au jour 365
Paliers mensuels
Tranches égales ; les restes d'arrondi vont à la dernière.
1 000 le même jour chaque mois
En continu, après une attente
Après l'attente : total × (t − début) ÷ (fin − début).
3 000 au mois 3, puis environ 33 par jour
Attente, révocation et réviseurs
- Période d'attente
- Un délai avant tout déblocage.
- Révocation
- Le débloqué reste réclamable ; seule la part verrouillée revient au financeur.
- Approbation des réviseurs
- N réviseurs nommés sur M approuvent avant toute réclamation.
Schéma : révocation au mois 5 d'une bourse de 12 mois. Le débloqué reste à la personne bénéficiaire, le reste revient au financeur.
Pourquoi réclamer plutôt qu'être payé
Un contrat ne déplace pas l'argent de lui-même. Réclamer laisse choisir le moment ; un mois oublié attend, tout simplement.
Le temps sur une blockchain
Un contrat lit l'horodatage du bloc, précis à la seconde. L'horloge de la démo avance ; « Réinitialiser » la ramène à aujourd'hui.
Pour les développeurs
La couche de données de la démo a la forme du contrat : de vrais appels ne toucheraient pas l'interface.
Voir l'interface du contrat
Interface du contrat (esquisse)
interface ITimeVault {
struct Schedule { uint8 kind; uint64 start; uint64 cliff; uint64 end; uint16 steps; }
/// Deploys a vault and pulls `total` of `token` from the funder.
function lock(address recipient, IERC20 token, uint256 total,
Schedule calldata schedule, bool revocable,
address[] calldata reviewers, uint8 required)
external returns (address vault);
function unlocked(uint64 at) external view returns (uint256);
function claimable() external view returns (uint256);
function claim() external; // recipient only
function approve() external; // named reviewers only
function revoke() external; // funder only, if revocable
event Locked(address indexed funder, address indexed recipient, uint256 total);
event Claimed(address indexed recipient, uint256 amount);
event Approved(address indexed reviewer, uint8 count);
event Revoked(uint256 kept, uint256 returned);
}Comment la démo la reproduit
- src/lib/demo/vesting.ts
- unlocked() et claimable(), en fonctions pures.
- src/lib/demo/ops.ts
- Les changements d'état de lock, claim, approve, revoke.
- src/lib/demo/chain.ts
- Portefeuille simulé, attente, confirmation ou annulation.
- src/lib/demo/store.ts
- L'état sauvegardé et l'horloge de démo.