Диаграммы · 02
Жизненный цикл партии
Как партия возникает, перемещается, меняет статус, становится другими партиями и покидает реестр. Единственные фиксированные статусы — 0 (ACTIVE) и 255 (RETIRED, терминальный); всё, что между ними, определяет эмитент.
Состояния и переходы
stateDiagram-v2
[*] --> ACTIVE : createBatch (ISSUER_ROLE)
[*] --> ACTIVE : выход 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 : только burn
RETIRED --> [*] : totalSupply == 0
note right of RETIRED
Терминальный. Никакой эмиссии, никаких переводов, никаких преобразований.
Сжигание остаётся возможным (списание, доставка).
end noteОт состояния до уборки урожая до переработанного товара
timeline
title Один лот пшеницы: от форвардного контракта до муки
До уборки урожая : createBatch с producedAt = 0 (форвард или дебиторская задолженность по урожаю)
: ExpiryHook может блокировать переводы до уборки урожая (allowPreHarvest = false)
Уборка урожая : setBatchMetadata с хешем документа об уборке урожая
: producedAt задаётся переформированием партий через transform или при создании
Хранение : AttestationHook требует аттестацию складской расписки
: setFrozenTokens для обременения; forcedTransfer при дефолте
Переработка : transform([пшеница], [60 т]) → [мука] (45 т) ролью TRANSFORMER_ROLE
: событие BatchTransformed = EPCIS TransformationEvent
Доставка : DeliveryHook блокирует единицы; расчёт — это перевод с data = deliveryId
: setBatchStatus(255, "DELIVERED") либо burn получателем