Diagramas · 02
Ciclo de vida del lote
Cómo un lote llega a existir, se mueve, cambia de estado, se convierte en otros lotes y abandona el registro. Los únicos estados fijos son 0 (ACTIVE) y 255 (RETIRED, terminal); todo lo intermedio lo define el emisor.
Estados y transiciones
stateDiagram-v2
[*] --> ACTIVE : createBatch (ISSUER_ROLE)
[*] --> ACTIVE : salida 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 : solo burn
RETIRED --> [*] : totalSupply == 0
note right of RETIRED
Terminal. Sin acuñación, sin transferencia, sin transform.
Las quemas siguen siendo posibles (baja contable, entrega).
end noteDe la precosecha al bien procesado
timeline
title Un lote de trigo, del contrato a plazo a la harina
Precosecha : createBatch con producedAt = 0 (un contrato a plazo o un derecho de cobro sobre la cosecha)
: ExpiryHook puede bloquear las transferencias hasta la cosecha (allowPreHarvest = false)
Cosecha : setBatchMetadata con el hash del documento de cosecha
: producedAt se establece mediante un transform de reagrupación o en la creación
Almacenamiento : AttestationHook exige la atestación del recibo de almacén
: setFrozenTokens para un gravamen; forcedTransfer en caso de incumplimiento
Procesamiento : transform([trigo], [60 t]) → [harina] (45 t) por TRANSFORMER_ROLE
: evento BatchTransformed = TransformationEvent de EPCIS
Entrega : DeliveryHook bloquea las unidades; la liquidación es la transferencia con data = deliveryId
: setBatchStatus(255, "DELIVERED") o burn por parte del receptor