Skip to main contentA-REX Core

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.

  1. 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.
  2. setBatchStatus(id, 1 /* IN_STORAGE */, ref("SILO-3")) pelo armazém graneleiro (STATUS_ROLE).
  3. transform(member, buyerA, [id], [100_000], [same commodity/unit], [100_000], ref("SALE-1")) — um reagrupamento, sem necessidade de papel; parentsOf(newId) == [id].
  4. A segunda venda é feita da mesma forma; as 50 t restantes permanecem no identificador original.
  5. 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.

  1. 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.
  2. ExpiryHook(allowPreHarvestTransfers = true) para que o recebível possa ser cedido; um marketplace à vista o implantaria com false.
  3. A garantia do financiador: setFrozenTokens(producer, id, 1000) por ENFORCER_ROLE (a plataforma atuando nos termos do contrato de penhor). O produtor mantém a titularidade, mas não pode mover as unidades.
  4. Na colheita: setBatchMetadata com o ticket de pesagem; setBatchStatus(id, 2 /* HARVESTED */); a plataforma registra producedAt nos metadados (o campo on-chain é imutável por projeto; a mudança de status é o fato on-chain).
  5. 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.

  1. 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.
  2. 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).
  3. AttestationHook.setRequirement(HS:090111, EUDR:DDS) no token: as transferências de café sem a atestação retornam ATTESTATION_MISSING.
  4. 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.
  5. 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.

  1. 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.
  2. ExpiryHook bloqueia qualquer transferência após expiresAt (BATCH_EXPIRED); as queimas continuam possíveis para baixa por perda.
  3. Um hook de cadeia de frio (DeliveryHook) retorna IN_TRANSIT durante o transporte e registra pontos de controle em onExecuted.
  4. 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 de canReceive) ou as partes se acertam off-chain, com a atestação como evidência.
  5. Entrega: burn pelo destinatário ou setBatchStatus(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.

  1. Os associados entregam ao pool: cada entrega é um createBatch para 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).
  2. parentsOf(pool) lista cada entrega de associado — a chave de rateio está on-chain.
  3. Venda do pool a um comprador: um único safeTransferFrom.
  4. Resíduos: transform(coop, coop, [pool], [remaining], [40 outputs], [per-member amounts], ref("RESIDUAL")) e safeBatchTransferFrom aos 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.

  1. O laboratório (emissor confiável para LAB:AFLATOXIN) atesta o resultado: attest(id, LAB:AFLATOXIN, hash(report), 0).
  2. 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.
  3. Rastreamento para a frente: cada BatchTransformed cujos inputIds contenham id fornece os lotes-filho; recursivamente, os lotes de ração e de alimentos afetados. Rastreamento para trás: parentsOf.
  4. 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.