Skip to main contentA-REX Core

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 note

De 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