Whitepaper · 10
Casos de Uso
Seis cenários que mostram como as quatro interfaces do A-REX Core, mais os hooks, cobrem as situações que um armazém graneleiro, uma cooperativa, um exportador, um financiador e um regulador realmente enfrentam. Cada cenário nomeia as chamadas envolvidas.
1. Grãos armazenados e recibos de armazém
Situação. Um armazém graneleiro de uma cooperativa recebe 250 t de trigo de um associado, emite um certificado de depósito e, mais tarde, vende o lote em duas partes.
On-chain.
createBatch({commodity: HS:100199, unit: KGM, producedAt: harvest, expiresAt: 0, originRef: hash(certificate #CD-88213), metadataHash, uri}, 250_000, member)— o token referencia o recibo legal; não o substitui até que a jurisdição assim o disponha.setBatchStatus(id, 1 /* IN_STORAGE */, ref("SILO-3"))pelo armazém graneleiro (STATUS_ROLE).transform(member, buyerA, [id], [100_000], [same commodity/unit], [100_000], ref("SALE-1"))— um reagrupamento, sem necessidade de papel;parentsOf(newId) == [id].- A segunda venda é feita da mesma forma; as 50 t restantes permanecem no identificador original.
- Na retirada física das mercadorias, as unidades do comprador são queimadas:
burn(buyerA, newId, 100_000); o armazém dá baixa no lote-pai quando ele fica vazio.
Por que importa. A oferta é exata (totalSupply), a procedência é uma cadeia de eventos BatchTransformed e o registro de recibos continua a ter autoridade.
2. Financiamento pré-colheita (CPR, contrato a termo, warrant sobre safra futura)
Situação. Um produtor brasileiro emite uma CPR eletrônica para 1,000 t de soja a serem colhidas em abril; um financiador adianta recursos contra ela.
On-chain.
createBatch({commodity: HS:120190, unit: TNE, producedAt: 0, expiresAt: 0, originRef: hash(CPR-e registry id), …}, 1000, producer)—producedAt == 0é a representação de um lote futuro no padrão.ExpiryHook(allowPreHarvestTransfers = true)para que o recebível possa ser cedido; um marketplace à vista o implantaria comfalse.- A garantia do financiador:
setFrozenTokens(producer, id, 1000)porENFORCER_ROLE(a plataforma atuando nos termos do contrato de penhor). O produtor mantém a titularidade, mas não pode mover as unidades. - Na colheita:
setBatchMetadatacom o ticket de pesagem;setBatchStatus(id, 2 /* HARVESTED */); a plataforma registraproducedAtnos metadados (o campo on-chain é imutável por projeto; a mudança de status é o fato on-chain). - Quitação:
setFrozenTokens(producer, id, 0). Inadimplemento:forcedTransfer(producer, lender, id, 1000)nos termos do penhor.
Por que importa. Os dois eventos de crédito mais comuns na agricultura — penhor e execução — são duas chamadas, ambas auditáveis, ambas compatíveis com o "controle" do UCC Article 12 e com instrumentos baseados em registro.
3. Exportação de café sob o EUDR
Situação. Um exportador colombiano embarca 20 t de café verde para um torrefador em Hamburgo depois de 30 de dezembro de 2026.
On-chain.
createBatch({commodity: HS:090111, unit: KGM, producedAt: harvest, originRef: hash(DDS reference), …}, 20_000, exporter). Os polígonos das parcelas permanecem no Sistema de Informação da UE e no armazenamento restrito do exportador.- O responsável pela conformidade do exportador é um emissor confiável para o tópico
EUDR:DDS:attest(id, EUDR:DDS, hash(DDS reference), 0). AttestationHook.setRequirement(HS:090111, EUDR:DDS)no token: as transferências de café sem a atestação retornamATTESTATION_MISSING.- Venda:
safeTransferFrom(exporter, roaster, id, 20_000, data); o torrefador, um operador a jusante, guarda a referência da DDS por cinco anos — ela está nos metadados do lote que agora detém. - Torrefação:
transform(roaster, roaster, [id], [20_000], [{commodity: HS:090121, …}], [16_800], ref("ROAST-2027-03"))— os lotes-pai do lote torrado apontam para o lote verde e, por meio dele, para a DDS.
Por que importa. A cadeia de referências do regulamento sobrevive ao processamento, e os dados geoespaciais que o EDPB diz que não devem estar em uma blockchain pública nunca estão.
4. Produtos perecíveis e cadeia de frio
Situação. Um empacotador embarca morangos com 12 dias de vida útil; um desvio de temperatura é registrado durante o trânsito.
On-chain.
createBatch({commodity: GTIN:…, unit: BX, producedAt: packDate, expiresAt: packDate + 12 days, …}, 4_800, packer); os metadados trazem o código de lote de rastreabilidade da FSMA atribuído na embalagem inicial.ExpiryHookbloqueia qualquer transferência apósexpiresAt(BATCH_EXPIRED); as queimas continuam possíveis para baixa por perda.- Um hook de cadeia de frio (
DeliveryHook) retornaIN_TRANSITdurante o transporte e registra pontos de controle emonExecuted. - O desvio é atestado pelo provedor de logística:
attest(id, COLDCHAIN:EXCURSION, hash(sensor log), 0); um hook do lado do comprador pode recusar o recebimento (política decanReceive) ou as partes se acertam off-chain, com a atestação como evidência. - Entrega:
burnpelo destinatário ousetBatchStatus(id, 255 /* RETIRED */, ref("DELIVERED"))pelo empacotador.
Por que importa. Prazo de validade, custódia e incidentes de qualidade são três hooks independentes sobre um único registro de lote; nenhum deles exigiu uma mudança no token.
5. Distribuição cooperativa e acerto com os associados
Situação. Uma cooperativa comercializa um lote agrupado (pool) de 1,000 t e deve repartir os recursos e o grão residual entre 40 associados.
On-chain.
- Os associados entregam ao pool: cada entrega é um
createBatchpara o associado e, depois,transform(member, coop, [ids], [amounts], [pool spec], [amount], ref("POOL-2026"))unindo no lote do pool (reagrupamento, sem necessidade de papel se a commodity e a unidade forem as mesmas). parentsOf(pool)lista cada entrega de associado — a chave de rateio está on-chain.- Venda do pool a um comprador: um único
safeTransferFrom. - Resíduos:
transform(coop, coop, [pool], [remaining], [40 outputs], [per-member amounts], ref("RESIDUAL"))esafeBatchTransferFromaos associados.
Por que importa. A formação e a desagregação de pools, que hoje vivem nos livros das cooperativas, são operações de linhagem com quantidades exatas.
6. Recolhimento
Situação. Um laboratório encontra aflatoxina acima do limite em um lote de milho que já havia sido dividido e parcialmente processado.
On-chain.
- O laboratório (emissor confiável para
LAB:AFLATOXIN) atesta o resultado:attest(id, LAB:AFLATOXIN, hash(report), 0). - A plataforma dá baixa no lote:
setBatchStatus(id, 255, ref("RECALL-2026-07")); as transferências cessam imediatamente (ARexBatchRetired), enquanto as queimas (destruição) continuam possíveis. - Rastreamento para a frente: cada
BatchTransformedcujosinputIdscontenhamidfornece os lotes-filho; recursivamente, os lotes de ração e de alimentos afetados. Rastreamento para trás:parentsOf. - O regulador recebe do log de eventos a lista de ids e de titulares afetados — o requisito de 24 horas é atendido por uma consulta ao indexador, e não por uma busca em registros.
Por que importa. O escopo de um recolhimento é uma consulta em grafo sobre eventos padronizados, que é o que o CTE de transformação da FSMA 204 foi concebido para tornar possível.
O que esses cenários têm em comum
- Quatro interfaces, três hooks de referência e o registro de atestações cobrem os seis cenários; nenhum cenário exigiu uma mudança no padrão.
- Os instrumentos jurídicos (recibos, CPR-e, DDS, laudos de laboratório) são referenciados e identificados por hash, e não reimplementados.
- O enforcement (congelamento, transferência forçada, baixa) está presente em todos os cenários de financiamento e de conformidade e é sempre um evento.
- Dados pessoais nunca aparecem on-chain.