Diagramas · 02
Ciclo de vida del lote
Cómo nace un lote, se mueve, cambia de estado, se convierte en otros lotes y sale del registro. Los únicos estados fijos son 0 (ACTIVE) y 255 (RETIRED, final); los estados intermedios los 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
Estado final. No admite acuñación, transferencia ni transform.
Las quemas siguen permitidas (baja contable, entrega).
end noteDe la precosecha al producto procesado
timeline
title Un lote de trigo, del contrato a término a la harina
Precosecha : createBatch con producedAt = 0 (un contrato a término 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 fija con un transform de reagrupación o al crear el lote
Almacenamiento : AttestationHook exige la atestación del certificado de depósito
: setFrozenTokens para un gravamen; forcedTransfer si hay 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 del receptor