Diagramas · 02
Ciclo de vida do lote
Como um lote passa a existir, se move, muda de status, se transforma em outros lotes e deixa o livro-razão. Os únicos status fixos são 0 (ACTIVE) e 255 (RETIRED, terminal); tudo o que está entre eles é definido pelo emissor.
Estados e transições
stateDiagram-v2
[*] --> ACTIVE : createBatch (ISSUER_ROLE)
[*] --> ACTIVE : saída 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 : apenas queima
RETIRED --> [*] : totalSupply == 0
note right of RETIRED
Terminal. Sem cunhagem, sem transferência, sem transformação.
Queimas continuam possíveis (baixa por perda, entrega).
end noteDa pré-colheita ao produto processado
timeline
title Um lote de trigo, do contrato a termo à farinha
Pré-colheita : createBatch com producedAt = 0 (um contrato a termo ou um recebível de safra)
: ExpiryHook pode bloquear transferências até a colheita (allowPreHarvest = false)
Colheita : setBatchMetadata com o hash do documento de colheita
: producedAt é definido por uma transform de reagrupamento ou na criação
Armazenagem : AttestationHook exige a atestação do recibo de armazém
: setFrozenTokens para um gravame; forcedTransfer em caso de inadimplemento
Processamento : transform([trigo], [60 t]) → [farinha] (45 t) por TRANSFORMER_ROLE
: evento BatchTransformed = TransformationEvent do EPCIS
Entrega : DeliveryHook trava unidades; a liquidação é a transferência com data = deliveryId
: setBatchStatus(255, "DELIVERED") ou queima pelo destinatário