Livre blanc · 10
Cas d'usage
Six scénarios montrant comment les quatre interfaces d'A-REX Core, avec les hooks, couvrent les situations que rencontrent réellement un silo collecteur, une coopérative, un exportateur, un prêteur et un régulateur. Chaque scénario nomme les appels concernés.
1. Grains stockés et récépissés d'entrepôt
Situation. Un silo coopératif reçoit 250 t de blé d'un membre, émet un certificat de dépôt, puis vend ensuite le lot en deux parties.
On-chain.
createBatch({commodity: HS:100199, unit: KGM, producedAt: harvest, expiresAt: 0, originRef: hash(certificate #CD-88213), metadataHash, uri}, 250_000, member)— le jeton référence le récépissé juridique ; il ne le remplace pas tant que la juridiction ne le prévoit pas.setBatchStatus(id, 1 /* IN_STORAGE */, ref("SILO-3"))par le silo (STATUS_ROLE).transform(member, buyerA, [id], [100_000], [same commodity/unit], [100_000], ref("SALE-1"))— une réorganisation de lots, aucun rôle nécessaire ;parentsOf(newId) == [id].- La seconde vente se déroule de même ; les 50 t restantes demeurent dans l'identifiant d'origine.
- Lors du retrait physique, les unités de l'acheteur sont détruites :
burn(buyerA, newId, 100_000); le silo retire le lot parent lorsqu'il est vide.
Pourquoi c'est important. L'offre est exacte (totalSupply), la provenance est une chaîne d'événements BatchTransformed, et le registre des récépissés reste la référence faisant foi.
2. Financement avant récolte (CPR, contrat à terme, warrant sur récolte future)
Situation. Un producteur brésilien émet une CPR électronique portant sur 1,000 t de soja à récolter en avril ; un prêteur avance des fonds en contrepartie.
On-chain.
createBatch({commodity: HS:120190, unit: TNE, producedAt: 0, expiresAt: 0, originRef: hash(CPR-e registry id), …}, 1000, producer)—producedAt == 0est la représentation d'un lot futur dans le standard.ExpiryHook(allowPreHarvestTransfers = true)afin que la créance puisse être cédée ; une place de marché au comptant le déploierait avecfalse.- La sûreté du prêteur :
setFrozenTokens(producer, id, 1000)parENFORCER_ROLE(la plateforme agissant en vertu du contrat de nantissement). Le producteur conserve la propriété mais ne peut pas déplacer les unités. - À la récolte :
setBatchMetadataavec le ticket de pesée ;setBatchStatus(id, 2 /* HARVESTED */); la plateforme consigneproducedAtdans les métadonnées (le champ on-chain est immuable par conception ; le changement de statut est le fait on-chain). - Remboursement :
setFrozenTokens(producer, id, 0). Défaut :forcedTransfer(producer, lender, id, 1000)en vertu du nantissement.
Pourquoi c'est important. Les deux événements de crédit les plus courants en agriculture — le nantissement et l'exécution — sont deux appels, tous deux auditables, tous deux compatibles avec le « contrôle » de l'UCC Article 12 et avec les instruments fondés sur un registre.
3. Exportation de café sous l'EUDR
Situation. Un exportateur colombien expédie 20 t de café vert à un torréfacteur de Hambourg après le 30 décembre 2026.
On-chain.
createBatch({commodity: HS:090111, unit: KGM, producedAt: harvest, originRef: hash(DDS reference), …}, 20_000, exporter). Les polygones de parcelles restent dans le système d'information de l'UE et dans le stockage restreint de l'exportateur.- Le responsable conformité de l'exportateur est un émetteur de confiance pour le thème
EUDR:DDS:attest(id, EUDR:DDS, hash(DDS reference), 0). AttestationHook.setRequirement(HS:090111, EUDR:DDS)sur le jeton : les transferts de café sans l'attestation renvoientATTESTATION_MISSING.- Vente :
safeTransferFrom(exporter, roaster, id, 20_000, data); le torréfacteur, opérateur en aval, conserve la référence DDS pendant cinq ans — elle figure dans les métadonnées du lot qu'il détient désormais. - Torréfaction :
transform(roaster, roaster, [id], [20_000], [{commodity: HS:090121, …}], [16_800], ref("ROAST-2027-03"))— les parents du lot torréfié pointent vers le lot de café vert et, à travers lui, vers la DDS.
Pourquoi c'est important. La chaîne de références du règlement survit à la transformation, et les données géographiques dont l'EDPB indique qu'elles ne doivent pas figurer sur une chaîne publique n'y figurent jamais.
4. Produits périssables et chaîne du froid
Situation. Un conditionneur expédie des fraises d'une durée de conservation de 12 jours ; une excursion de température est enregistrée pendant le transport.
On-chain.
createBatch({commodity: GTIN:…, unit: BX, producedAt: packDate, expiresAt: packDate + 12 days, …}, 4_800, packer); les métadonnées portent le code de lot de traçabilité FSMA attribué lors du conditionnement initial.ExpiryHookbloque tout transfert aprèsexpiresAt(BATCH_EXPIRED) ; les destructions restent possibles pour un passage en pertes.- Un hook de chaîne du froid (
DeliveryHook) renvoieIN_TRANSITpendant le transport et consigne des points de contrôle dansonExecuted. - L'excursion est attestée par le prestataire logistique :
attest(id, COLDCHAIN:EXCURSION, hash(sensor log), 0); un hook côté acheteur peut refuser la réception (politiquecanReceive) ou les parties règlent la question off-chain avec l'attestation comme preuve. - Livraison :
burnpar le destinataire, ousetBatchStatus(id, 255 /* RETIRED */, ref("DELIVERED"))par le conditionneur.
Pourquoi c'est important. La durée de conservation, la garde et les incidents de qualité sont trois hooks indépendants sur un même enregistrement de lot ; aucun n'a exigé de modification du jeton.
5. Distribution coopérative et règlement des membres
Situation. Une coopérative commercialise un lot mutualisé de 1,000 t et doit répartir le produit de la vente et le grain résiduel entre 40 membres.
On-chain.
- Les membres livrent dans le pool : chaque livraison est un
createBatchau profit du membre, puistransform(member, coop, [ids], [amounts], [pool spec], [amount], ref("POOL-2026"))fusionne dans le lot du pool (réorganisation de lots, aucun rôle nécessaire si la denrée et l'unité sont identiques). parentsOf(pool)énumère chaque livraison de membre — la clé de répartition est on-chain.- Vente du pool à un acheteur : un seul
safeTransferFrom. - Résidus :
transform(coop, coop, [pool], [remaining], [40 outputs], [per-member amounts], ref("RESIDUAL"))puissafeBatchTransferFromvers les membres.
Pourquoi c'est important. La mutualisation et la démutualisation, qui résident aujourd'hui dans les registres des coopératives, sont des opérations de filiation avec des quantités exactes.
6. Rappel
Situation. Un laboratoire détecte de l'aflatoxine au-delà de la limite dans un lot de maïs déjà fractionné et en partie transformé.
On-chain.
- Le laboratoire (émetteur de confiance pour
LAB:AFLATOXIN) atteste le résultat :attest(id, LAB:AFLATOXIN, hash(report), 0). - La plateforme retire le lot :
setBatchStatus(id, 255, ref("RECALL-2026-07")); les transferts s'arrêtent immédiatement (ARexBatchRetired), les destructions restent possibles. - Traçage aval : chaque événement
BatchTransformeddont lesinputIdscontiennentidfournit les lots enfants ; récursivement, les lots d'aliments pour animaux et de denrées alimentaires affectés. Traçage amont :parentsOf. - Le régulateur reçoit la liste des identifiants et des détenteurs concernés à partir du journal d'événements — l'exigence des 24 heures est satisfaite par une requête d'indexeur, et non par une recherche dans des archives.
Pourquoi c'est important. La portée d'un rappel est une requête de graphe sur des événements standardisés, ce que le CTE de transformation de FSMA 204 a été conçu pour rendre possible.
Ce que ces scénarios ont en commun
- Quatre interfaces, trois hooks de référence et le registre d'attestations couvrent les six ; aucun scénario n'a exigé de modification du standard.
- Les instruments juridiques (récépissés, CPR-e, DDS, rapports de laboratoire) sont référencés et hachés, non réimplémentés.
- La mise en application (gel, transfert forcé, retrait) est présente dans chaque scénario de financement et de conformité et constitue toujours un événement.
- Les données personnelles n'apparaissent jamais on-chain.