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 noteVon 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