Whitepaper · 10
Casos de uso
Seis escenarios reales de un centro de acopio, una cooperativa, un exportador, un prestamista y un regulador, resueltos con las cuatro interfaces de A-REX Core y las reglas externas (hooks). Cada escenario indica las llamadas que intervienen.
1. Grano almacenado y certificados de depósito
Situación. Un centro de acopio cooperativo recibe 250 t de trigo de un socio y emite un certificado de depósito. Más adelante vende el lote en dos partes.
En la cadena.
createBatch({commodity: HS:100199, unit: KGM, producedAt: harvest, expiresAt: 0, originRef: hash(certificate #CD-88213), metadataHash, uri}, 250_000, member): el token hace referencia al certificado legal, pero no lo reemplaza mientras la jurisdicción no lo disponga.- El centro de acopio llama a
setBatchStatus(id, 1 /* IN_STORAGE */, ref("SILO-3"))conSTATUS_ROLE. transform(member, buyerA, [id], [100_000], [same commodity/unit], [100_000], ref("SALE-1")): es una reagrupación, así que no requiere rol;parentsOf(newId) == [id].- La segunda venta sigue el mismo camino. Las 50 t restantes quedan en el id original.
- Cuando el comprador retira el grano, se queman sus unidades con
burn(buyerA, newId, 100_000). El centro de acopio da de baja el lote padre cuando queda vacío.
Por qué importa. El suministro total es exacto (totalSupply), la procedencia queda registrada como una cadena de eventos BatchTransformed y el registro de certificados sigue siendo la fuente oficial.
2. Financiamiento antes de la cosecha (CPR, contrato a término, warrant sobre cosecha futura)
Situación. Un productor brasileño emite una CPR electrónica por 1,000 t de soja que cosechará en abril. Un prestamista le adelanta fondos con esa CPR como respaldo.
En la cadena.
createBatch({commodity: HS:120190, unit: TNE, producedAt: 0, expiresAt: 0, originRef: hash(CPR-e registry id), …}, 1000, producer): conproducedAt == 0, el estándar representa un lote futuro.ExpiryHook(allowPreHarvestTransfers = true)permite ceder el derecho de cobro. Un marketplace de entrega inmediata lo desplegaría confalse.- La garantía del prestamista:
ENFORCER_ROLEllama asetFrozenTokens(producer, id, 1000), es decir, la plataforma actúa según el contrato de prenda. El productor sigue siendo el dueño, pero no puede mover las unidades. - En la cosecha:
setBatchMetadatacon la boleta de pesaje y luegosetBatchStatus(id, 2 /* HARVESTED */). La plataforma registraproducedAten los metadatos, porque ese campo en la cadena es inmutable por diseño; el hecho que queda en la cadena es el cambio de estado. - Si el productor paga:
setFrozenTokens(producer, id, 0). Si incumple:forcedTransfer(producer, lender, id, 1000)según la prenda.
Por qué importa. Los dos eventos de crédito más comunes en el agro, la prenda y su ejecución, se resuelven con dos llamadas. Ambas son auditables y compatibles con el concepto de «control» del Artículo 12 del UCC y con los instrumentos que se inscriben en registros.
3. Exportación de café según el EUDR
Situación. Un exportador colombiano envía 20 t de café verde a un tostador de Hamburgo después del 30 de diciembre de 2026.
En la cadena.
createBatch({commodity: HS:090111, unit: KGM, producedAt: harvest, originRef: hash(DDS reference), …}, 20_000, exporter). Los polígonos de las parcelas quedan en el Sistema de Información de la UE y en el almacenamiento restringido del exportador.- El oficial de cumplimiento del exportador es emisor de confianza para el tema
EUDR:DDSy emite la atestación (certificado o constancia verificable):attest(id, EUDR:DDS, hash(DDS reference), 0). - El token tiene
AttestationHook(HS:090111 → EUDR:DDS): toda transferencia de café sin la atestación devuelveATTESTATION_MISSING. - Venta:
safeTransferFrom(exporter, roaster, id, 20_000, data). El tostador, como operador posterior en la cadena de suministro, conserva la referencia de la DDS durante cinco años: la tiene en los metadatos del lote que ahora posee. - Tostado:
transform(roaster, roaster, [id], [20_000], [{commodity: HS:090121, …}], [16_800], ref("ROAST-2027-03")). Los lotes padre del café tostado apuntan al lote verde y, a través de él, a la DDS.
Por qué importa. La cadena de referencias que exige el reglamento se mantiene después del procesamiento. Y los datos geográficos que, según el EDPB, no deben estar en una cadena pública nunca llegan a ella.
4. Productos perecederos y cadena de frío
Situación. Un empacador envía fresas con una vida útil de 12 días. Durante el transporte se registra una desviación de temperatura.
En la cadena.
createBatch({commodity: GTIN:…, unit: BX, producedAt: packDate, expiresAt: packDate + 12 days, …}, 4_800, packer). Los metadatos incluyen el código de lote de trazabilidad de la FSMA asignado en el empaque inicial.ExpiryHookbloquea toda transferencia después deexpiresAt(BATCH_EXPIRED). Las quemas siguen permitidas para dar de baja la mercadería.- Un hook de cadena de frío (
DeliveryHook) devuelveIN_TRANSITdurante el transporte y registra los puntos de control enonExecuted. - El operador logístico atesta la desviación con
attest(id, COLDCHAIN:EXCURSION, hash(sensor log), 0). Un hook del lado del comprador puede rechazar la recepción (política decanReceive), o las partes pueden resolverlo fuera de la cadena con la atestación como evidencia. - Entrega: el receptor ejecuta
burn, o el empacador ejecutasetBatchStatus(id, 255 /* RETIRED */, ref("DELIVERED")).
Por qué importa. La vida útil, la custodia y los incidentes de calidad son tres hooks independientes sobre un mismo registro de lote. Ninguno obligó a modificar el token.
5. Acopio cooperativo y liquidación a los socios
Situación. Una cooperativa comercializa un lote común de 1,000 t y debe repartir entre 40 socios los ingresos y el grano sobrante.
En la cadena.
- Los socios entregan al lote común. Cada entrega es un
createBatcha favor del socio, seguido detransform(member, coop, [ids], [amounts], [pool spec], [amount], ref("POOL-2026")), que la fusiona en el lote común (es una reagrupación y no requiere rol si el producto y la unidad coinciden). parentsOf(pool)lista todas las entregas de los socios, así que la clave de reparto queda en la cadena.- La venta del lote común a un comprador es un solo
safeTransferFrom. - Sobrantes:
transform(coop, coop, [pool], [remaining], [40 outputs], [per-member amounts], ref("RESIDUAL"))y luegosafeBatchTransferFroma los socios.
Por qué importa. Armar y desarmar un lote común, algo que hoy vive en los libros de cada cooperativa, se vuelve una operación de linaje con cantidades exactas.
6. Retiro del mercado
Situación. Un laboratorio detecta aflatoxina por encima del límite en un lote de maíz que ya se dividió y se procesó en parte.
En la cadena.
- El laboratorio, emisor de confianza para
LAB:AFLATOXIN, atesta el resultado conattest(id, LAB:AFLATOXIN, hash(report), 0). - La plataforma da de baja el lote con
setBatchStatus(id, 255, ref("RECALL-2026-07")). Las transferencias se detienen de inmediato (ARexBatchRetired), pero las quemas (destrucción) siguen permitidas. - Rastreo hacia adelante: cada
BatchTransformedcuyosinputIdsincluyeniddevuelve los lotes hijos y, de forma recursiva, los lotes de alimento animal y de alimentos afectados. Rastreo hacia atrás:parentsOf. - El regulador recibe, a partir del registro de eventos, la lista de ids y titulares afectados. El plazo de 24 horas se cumple con una consulta al indexador, no con una búsqueda en archivos.
Por qué importa. El alcance de un retiro del mercado es una consulta sobre un grafo de eventos estandarizados. Para eso se diseñó el CTE de transformación de la FSMA 204.
Qué tienen en común estos escenarios
- Cuatro interfaces, tres hooks de referencia y el registro de atestaciones cubren los seis escenarios; ninguno requirió cambiar el estándar.
- Los instrumentos legales (certificados, CPR-e, DDS, informes de laboratorio) se referencian y se registran por su hash; no se vuelven a implementar.
- Los controles de cumplimiento (congelar, transferencia forzosa, dar de baja) aparecen en todos los escenarios de financiamiento y cumplimiento, y siempre generan un evento.
- Los datos personales nunca aparecen en la cadena.