Skip to main contentA-REX Core

Diagramme · 02

Lebenszyklus einer Charge

Wie eine Charge entsteht, sich bewegt, den Status wechselt, zu anderen Chargen wird und das Ledger verlässt. Die einzigen festen Status sind 0 (ACTIVE) und 255 (RETIRED, terminal); alles dazwischen wird vom Aussteller definiert.

Zustände und Übergänge

stateDiagram-v2
    [*] --> ACTIVE : createBatch (ISSUER_ROLE)
    [*] --> ACTIVE : Ausgabe von 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 : nur burn
    RETIRED --> [*] : totalSupply == 0
    note right of RETIRED
        Terminal. Kein Mint, kein Transfer, kein transform.
        Burns bleiben möglich (Abschreibung, Lieferung).
    end note

Von der Vorernte zum verarbeiteten Gut

timeline
    title Eine Weizencharge, vom Terminkontrakt bis zum Mehl
    Vorernte : createBatch mit producedAt = 0 (ein Terminkontrakt oder eine Ernteforderung)
             : ExpiryHook kann Transfers bis zur Ernte blockieren (allowPreHarvest = false)
    Ernte : setBatchMetadata mit dem Hash des Erntedokuments
          : producedAt wird durch eine Re-Batch-Transformation oder bei der Erstellung gesetzt
    Lagerung : AttestationHook verlangt die Attestierung des Lagerscheins
             : setFrozenTokens für ein Pfandrecht; forcedTransfer bei Zahlungsausfall
    Verarbeitung : transform([wheat], [60 t]) → [flour] (45 t) durch TRANSFORMER_ROLE
                 : BatchTransformed-Ereignis = EPCIS-TransformationEvent
    Lieferung : DeliveryHook sperrt Einheiten; die Abwicklung ist der Transfer mit data = deliveryId
              : setBatchStatus(255, "DELIVERED") oder Burn durch den Empfänger