Diagrammes · 02
Cycle de vie d'un lot
Comment un lot vient à exister, circule, change de statut, devient d'autres lots et quitte le registre. Les seuls statuts fixes sont 0 (ACTIVE) et 255 (RETIRED, terminal) ; tout ce qui se situe entre les deux est défini par l'émetteur.
États et transitions
stateDiagram-v2
[*] --> ACTIVE : createBatch (ISSUER_ROLE)
[*] --> ACTIVE : sortie de transform
ACTIVE --> ACTIVE : safeTransferFrom · burn · forcedTransfer
ACTIVE --> Custom : setBatchStatus(1..254) (STATUS_ROLE)
Custom --> Custom : setBatchStatus (STATUS_ROLE)
Custom --> ACTIVE : setBatchStatus(0)
ACTIVE --> RETIRED : setBatchStatus(255, reason)
Custom --> RETIRED : setBatchStatus(255, reason)
RETIRED --> RETIRED : burn uniquement
RETIRED --> [*] : totalSupply == 0
note right of RETIRED
Terminal. Ni émission, ni transfert, ni transform.
Les destructions restent possibles (passage en pertes, livraison).
end noteDe l'avant-récolte au bien transformé
timeline
title Un lot de blé, du contrat à terme à la farine
Avant-récolte : createBatch avec producedAt = 0 (un contrat à terme ou une créance sur récolte)
: ExpiryHook peut bloquer les transferts jusqu'à la récolte (allowPreHarvest = false)
Récolte : setBatchMetadata avec le hash du document de récolte
: producedAt est défini par un transform de réorganisation ou à la création
Stockage : AttestationHook exige l'attestation du récépissé d'entrepôt
: setFrozenTokens pour une sûreté ; forcedTransfer en cas de défaut
Traitement : transform([blé], [60 t]) → [farine] (45 t) par TRANSFORMER_ROLE
: événement BatchTransformed = TransformationEvent d'EPCIS
Livraison : DeliveryHook verrouille les unités ; le règlement est le transfert avec data = deliveryId
: setBatchStatus(255, "DELIVERED") ou burn par le destinataire