Skip to main contentA-REX Core

Whitepaper · 16

Anhänge

Maßgebliche Quellen: contracts/standard/ .sol (CC0) und standard/AREX CORE.md. Schnittstellen IDs werden durch npm run interface ids reproduziert.

uint8-Lebenszykluswert; 0 aktiv, 255 stillgelegt (terminal); 1..254 vom Aussteller definiert.

Anhang A: Schnittstellenreferenz

Maßgebliche Quellen: contracts/standard/*.sol (CC0) und standard/AREX-CORE.md. Schnittstellen-IDs werden durch npm run interface-ids reproduziert.

A.1 Zusammenfassung der Konformität

SchnittstelleERC-165-IDTokenHook
IERC11550xd9b67a26MUSS—
IERC7943MultiToken0x41c4fbadMUSS—
IARexBatch0xe22639e0MUSS—
IARexHookManager0x964f4861MUSS (getHooks)—
IARexAttest0xad603a6cSOLLTE (Token oder Begleiter)—
IARexHook0x332afcbb—MUSS

A.2 IARexBatch

struct BatchInit { bytes32 commodity; bytes32 unit; uint64 producedAt; uint64 expiresAt; bytes32 originRef; bytes32 metadataHash; string uri; }
struct Batch { address issuer; uint64 createdAt; uint8 status; bytes32 commodity; bytes32 unit; uint64 producedAt; uint64 expiresAt; bytes32 originRef; bytes32 metadataHash; string uri; }


event BatchCreated(uint256 indexed id, address indexed issuer, bytes32 indexed commodity, bytes32 unit, uint256 quantity, address to);
event BatchStatusChanged(uint256 indexed id, uint8 previousStatus, uint8 newStatus, bytes32 reason);
event BatchMetadataUpdated(uint256 indexed id, bytes32 metadataHash, string uri);
event BatchTransformed(address indexed operator, uint256[] inputIds, uint256[] inputAmounts, uint256[] outputIds, uint256[] outputAmounts, bytes32 processRef);


error ARexBatchNotFound(uint256 id);
error ARexBatchRetired(uint256 id);
error ARexInvalidBatch(bytes32 reason);
error ARexInvalidStatusTransition(uint256 id, uint8 from, uint8 to);
error ARexLengthMismatch();


function createBatch(BatchInit calldata init, uint256 quantity, address to, bytes calldata data) external returns (uint256 id);
function batchOf(uint256 id) external view returns (Batch memory);
function batchExists(uint256 id) external view returns (bool);
function totalSupply(uint256 id) external view returns (uint256);
function setBatchStatus(uint256 id, uint8 status, bytes32 reason) external;
function setBatchMetadata(uint256 id, bytes32 metadataHash, string calldata uri) external;
function transform(address from, address to, uint256[] calldata inputIds, uint256[] calldata inputAmounts, BatchInit[] calldata outputs, uint256[] calldata outputAmounts, bytes32 processRef) external returns (uint256[] memory outputIds);
function parentsOf(uint256 id) external view returns (uint256[] memory);

A.3 IERC7943MultiToken (ERC-7943, wörtlich)

event ForcedTransfer(address indexed from, address indexed to, uint256 indexed tokenId, uint256 amount);
event Frozen(address indexed account, uint256 indexed tokenId, uint256 amount);
error ERC7943CannotSend(address account);
error ERC7943CannotReceive(address account);
error ERC7943CannotTransfer(address from, address to, uint256 tokenId, uint256 amount);
error ERC7943InsufficientUnfrozenBalance(address account, uint256 tokenId, uint256 amount, uint256 unfrozen);
function forcedTransfer(address from, address to, uint256 tokenId, uint256 amount) external returns (bool result);
function setFrozenTokens(address account, uint256 tokenId, uint256 amount) external returns (bool result);
function canSend(address account) external view returns (bool allowed);
function canReceive(address account) external view returns (bool allowed);
function getFrozenTokens(address account, uint256 tokenId) external view returns (uint256 amount);
function canTransfer(address from, address to, uint256 tokenId, uint256 amount) external view returns (bool allowed);

A.4 IARexHook und IARexHookManager

interface IARexHook is IERC165 {
    error ARexHookRejected(address hook, bytes32 code);
    function hookFlags() external view returns (uint8);
    function check(uint8 op, address operator, address from, address to, uint256 id, uint256 amount, bytes calldata data) external view returns (bytes32 code);
    function onExecuted(uint8 op, address operator, address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
    function canSend(address account) external view returns (bool);
    function canReceive(address account) external view returns (bool);
}
interface IARexHookManager {
    event HookRegistered(address indexed hook, uint8 flags, uint256 position);
    event HookRemoved(address indexed hook);
    error ARexHookAlreadyRegistered(address hook);
    error ARexHookNotRegistered(address hook);
    error ARexInvalidHook(address hook);
    function getHooks() external view returns (address[] memory);
    function hookFlagsOf(address hook) external view returns (uint8);
    function registerHook(address hook) external;
    function removeHook(address hook) external;
}

A.5 IARexAttest

struct Attestation { address issuer; bytes32 ref; uint64 issuedAt; uint64 expiresAt; bool revoked; }
event Attested(uint256 indexed id, bytes32 indexed topic, address indexed issuer, bytes32 ref, uint64 expiresAt);
event AttestationRevoked(uint256 indexed id, bytes32 indexed topic, address indexed issuer, bytes32 reason);
event TrustedIssuerUpdated(bytes32 indexed topic, address indexed issuer, bool trusted);
error ARexUntrustedIssuer(bytes32 topic, address issuer);
error ARexAttestationNotFound(uint256 id, bytes32 topic);
function attest(uint256 id, bytes32 topic, bytes32 ref, uint64 expiresAt) external;
function revokeAttestation(uint256 id, bytes32 topic, bytes32 reason) external;
function getAttestation(uint256 id, bytes32 topic) external view returns (Attestation memory);
function isAttested(uint256 id, bytes32 topic) external view returns (bool);
function isTrustedIssuer(bytes32 topic, address issuer) external view returns (bool);

A.6 Konstanten (ARexCodes)

GruppeWerte
OperationenOP_MINT = 1, OP_TRANSFER = 2, OP_BURN = 3, OP_FORCED_TRANSFER = 4, OP_TRANSFORM = 5
Hook-FlagsHOOK_CHECK = 1, HOOK_EXECUTED = 2, HOOK_ELIGIBILITY = 4
StatusSTATUS_ACTIVE = 0, STATUS_RETIRED = 255
Codes (keccak256("AREX:…"))PAUSED, FROZEN, SENDER_INELIGIBLE, RECEIVER_INELIGIBLE, SANCTIONED, BATCH_NOT_FOUND, BATCH_RETIRED, BATCH_INACTIVE, BATCH_EXPIRED, BATCH_NOT_PRODUCED, LIMIT_EXCEEDED, DOCUMENT_MISSING, SEASON_CLOSED, IN_TRANSIT, ATTESTATION_MISSING
Hilfsfunktionencommodity(scheme, code), unit(code), topic(name), code(namespace, name)

A.7 Rollen der Referenzimplementierung

ISSUER_ROLE, TRANSFORMER_ROLE, STATUS_ROLE, ENFORCER_ROLE, HOOK_ADMIN_ROLE, PAUSER_ROLE, UPGRADER_ROLE, DEFAULT_ADMIN_ROLE bei ARexToken (jeweils keccak256("AREX_<NAME>")); ATTEST_ADMIN_ROLE bei ARexAttestations. Zusätzliche Views: isExpired(id), transferCheck(from, to, id, amount); zusätzliche Funktion: burn(from, id, amount); ERC-7201-Slot 0x8ed599b6be05dec05297c009a1279a71df771ad996fe924d0b5a47326ff60900.

A.8 Referenz-Hooks und Erweiterungen

ContractArtZentrale Funktionen
PerishabilityHookHooksetCommodityDecay, setBatchDecay, valueBps, secondsRemaining, isExpired
SeasonalHookHookaddWindow, clearWindows, windowsOf, isOpen
DeliveryHookHookschedule, pickUp, markInTransit, recordReading, confirmDelivered, cancel, dispute, resolve, getDelivery, lockedUnits
TraceabilityHookHookrecordEvent, eventCount, getEvents; Konstruktor-Flag persist
CommodityPriceOracleErweiterungsubmit, finalizeRound, latestAnswer, getRound, currentRound, isStale, setParameters
CarbonImmobilizationWrapperErweiterungrecordImmobilization, linkToBatch, retire, release, attestBacking, backingOf, linksOf
ParametricInsuranceErweiterungfund, issue, claim, expire, getPolicy, freeCapacity

A.9 Metadatenschema

standard/schema/batch-metadata.schema.json (JSON-Schema 2020-12). Erforderlich: schemaVersion, commodity{scheme, code}, unit, quantity. Bemerkenswerte optionale Gruppen: traceabilityLotCode, gs1{gtin, lgtin, sscc, glnProducer, digitalLink}, production, origin{country, originRef, eudr{ddsReference}, geohashPrecision, geohash}, quality{gradeScheme, grade, measurements[]}, status.table, attestations[], documents[]{type, hash, uri, registry, registryId}, epcis{bizStep, disposition, readPoint, bizLocation}, restricted{uri, hash, accessPolicy}, attributes[]. Beispiel in standard/examples/batch-metadata.example.json.

Anhang B: Glossar

BegriffBedeutung
ChargeEine ERC-1155-Token-ID mit einem Batch-Datensatz: eine Partie eines Rohstoffs in einer Einheit mit gemeinsamer Herkunft und Produktionszeit.
Re-BatchEin transform-Aufruf, dessen Ausgaben denselben Rohstoff und dieselbe Einheit wie die Eingaben haben und dessen Mengen erhalten bleiben (Teilen, Zusammenführen). In der Referenzimplementierung für Inhaber offen.
VerarbeitungEin transform-Aufruf, der Rohstoff, Einheit oder Menge ändert. Erfordert in der Referenzimplementierung TRANSFORMER_ROLE.
AbstammungDer Graph, der aus BatchTransformed-Ereignissen und parentsOf gebildet wird.
HookEin Contract, der IARexHook implementiert, bei einem Token registriert ist und bei jeder Operation der Reihe nach ausgewertet wird.
AblehnungscodeEin bytes32-Wert, den check eines Hooks zurückgibt; 0 bedeutet erlaubt; Konvention keccak256("NAMESPACE:NAME").
BerechtigungBerechtigung auf Kontoebene zum Senden oder Empfangen, beantwortet von Hooks mit dem Flag HOOK_ELIGIBILITY; bereitgestellt als canSend/canReceive von ERC-7943.
Eingefrorener SaldoEinheiten, die ein Konto hält, aber nicht bewegen kann (setFrozenTokens); darf den Saldo übersteigen.
Erzwungener TransferBewegung von Einheiten durch ENFORCER_ROLE ohne Zustimmung des Inhabers (ERC-7943).
Attestierung(batch, topic) → (issuer, reference, validity), erfasst von einem für dieses Thema vertrauenswürdigen Aussteller.
ThemaEin bytes32-Wert, der den Gegenstand einer Attestierung kennzeichnet; offen; lässt sich auf ERC-735-Claim-Themen und EAS-Schema-IDs abbilden.
HerkunftsreferenzoriginRef: ein Hash oder eine Referenz auf Herkunftsnachweise; niemals Koordinaten.
Metadaten-CommitmentmetadataHash, keccak256 des kanonischen Off-Chain-Dokuments unter uri.
Statusuint8-Lebenszykluswert; 0 aktiv, 255 stillgelegt (terminal); 1..254 vom Aussteller definiert.
CTE / KDEKritisches Verfolgungsereignis / Schlüsseldatenelement (FSMA 204).
DDSSorgfaltserklärung (EUDR).
EPCISGS1 Electronic Product Code Information Services, das Ereignisvokabular für die Rückverfolgbarkeit (Version 2.0).
CPR / CPR-eCédula de Produto Rural, die Ernteforderung Brasiliens; elektronische Form, die bei zugelassenen Stellen registriert ist.
EWRElektronischer Lagerschein nach dem U.S. Warehouse Act.
MLETRUNCITRAL-Modellgesetz über elektronische übertragbare Aufzeichnungen.
ERC-7943 (uRWA)Universal-Real-World-Asset-Schnittstelle: Einfrieren, erzwungener Transfer, Berechtigung; Final, Mai 2026.
ERC-3643 (T-REX)Zugangsbeschränkter Token-Standard für Wertpapiere auf ERC-20; Final, Dezember 2023.
ERC-7201Speicherlayout mit Namensräumen für upgradefähige Contracts.

Anhang C: Literaturverzeichnis

Standards und Spezifikationen

  • Radomski, W. et al. „EIP-1155: Multi Token Standard.“ Ethereum Improvement Proposals, 2018.
  • Vogelsteller, F., Buterin, V. „EIP-20: Token Standard.“ 2015.
  • „ERC-165: Standard Interface Detection.“ 2018.
  • „ERC-3643: T-REX — Token for Regulated EXchanges.“ Final, 15. Dezember 2023. https://eips.ethereum.org/EIPS/eip-3643
  • „ERC-7943: uRWA — Universal Real World Asset Interface.“ Final, 27. Mai 2026. https://eips.ethereum.org/EIPS/eip-7943
  • „ERC-7201: Namespaced Storage Layout.“ 2023.
  • „ERC-735: Claim Holder.“ 2017 (Entwurf).
  • Dokumentation des Ethereum Attestation Service.
  • GS1. „EPCIS and CBV Standard 2.0.“ 2022. GS1 US. „EPCIS Recommendations for FSMA 204 Critical Tracking Events.“ 2024.
  • UN/CEFACT. „Recommendation No. 20: Codes for Units of Measure Used in International Trade.“
  • IETF RFC 8785. „JSON Canonicalization Scheme (JCS).“ 2020.
  • Dokumentation von OpenZeppelin Contracts 5.x; Ankündigung der Partnerschaft von OpenZeppelin und T-REX Network, Juli 2026.

Regulierung und Recht

  • FDA. „Requirements for Additional Traceability Records for Certain Foods.“ Final Rule, Federal Register 87(219), 2022; „Compliance Date Extension“, Federal Register, 7. August 2025.
  • Verordnung (EU) 2023/1115 (Entwaldung); Verordnung (EU) 2025/2650 (Änderung); Pressemitteilung des Rates der EU, 18. Dezember 2025.
  • Verordnung (EU) 2023/1114 (MiCA); ESMA-Leitlinien zur Einstufung von Kryptowerten als Finanzinstrumente, Dezember 2024.
  • Europäischer Datenschutzausschuss. „Guidelines 02/2025 on processing of personal data through blockchain technologies“, Version 2.0, 7. Juli 2026.
  • SEC. Release No. 33-11412, 17. März 2026. SEC v. W.J. Howey Co., 328 U.S. 293 (1946).
  • GENIUS Act, Public Law 119-27 (2025); Durchführungsvorschriften, Federal Register, 18. August 2026.
  • Uniform Commercial Code, Änderungen von 2022, Article 12 (Controllable Electronic Records).
  • U.S. Warehouse Act; 7 CFR Part 869 (Electronic Warehouse Receipts).
  • UNCITRAL. „Model Law on Electronic Transferable Records.“ 2017. Vereinigtes Königreich, Electronic Trade Documents Act 2023.
  • Comisión Nacional de Valores (Argentinien). Resolución General 1150/2026. Ley 9.643 (Warrants).
  • Brasilien. Lei 8.929/1994, Lei 13.986/2020 (CPR); Lei 11.076/2004 (CDA/WA); CVM Resolução 88 und Consulta Pública SDM 05/2025.
  • Verra. „Verra Addresses Crypto Instruments and Tokens.“ 2022; VCS Program Guide.
  • Richtlinie (EU) 2024/825 (Stärkung der Verbraucher für den ökologischen Wandel).

Forschung und Industrie

  • Zhang, P., Schmidt, D. C. „Blockchain Applications in Food Supply Chain Management: A Systematic Review.“ Journal of Food Engineering, 279, 2020.
  • Caro, M. P. et al. „Blockchain-based Traceability in Agri-Food Supply Chain Management.“ IEEE, 2018.
  • FAO. „The State of Food and Agriculture.“ 2023.
  • Weltbank. „Future of Food: Harnessing Digital Technologies to Improve Food System Outcomes.“ 2022.
  • ERC3643 Association. „History of ERC-3643“; Ankündigung der Standardisierungsinitiative von ISO TC 307.
  • Chainlink. „Automated Compliance Engine (ACE): Technical Overview.“ 2025–2026.

Anhang D: Vorlagen

D.1 Minimaler Hook

Quelle: contracts/examples/MyHook.sol (importiert ../reference/hooks/ARexHookBase.sol und ../standard/IARexBatch.sol).

contract MyHook is ARexHookBase {
    function hookFlags() public pure override returns (uint8) {
        return ARexCodes.HOOK_CHECK;
    }


    function check(uint8 op, address, address, address, uint256 id, uint256, bytes calldata)
        external
        view
        override
        returns (bytes32)
    {
        if (op != ARexCodes.OP_TRANSFER) return ARexCodes.OK;
        IARexBatch.Batch memory b = IARexBatch(msg.sender).batchOf(id);
        b; // decide from b.commodity, b.producedAt, b.expiresAt, b.status ...
        return ARexCodes.OK;
    }
}

D.2 Deployment (Upgrades-Plugin)

const token = await upgrades.deployProxy(await ethers.getContractFactory("ARexToken"), [admin, baseURI], { kind: "uups" });
const attestations = await (await ethers.getContractFactory("ARexAttestations")).deploy(admin, await token.getAddress());
await token.registerHook(await (await ethers.getContractFactory("EligibilityHook")).deploy(admin));
await token.registerHook(await (await ethers.getContractFactory("ExpiryHook")).deploy(true));

D.3 Metadaten-Gerüst

{ "schemaVersion": "1.0.0", "commodity": { "scheme": "HS", "code": "100199" }, "unit": "KGM", "quantity": 250000,
  "traceabilityLotCode": "…", "production": { "producedAt": "…" }, "origin": { "country": "AR", "originRef": "…" },
  "status": { "table": { "1": "IN_STORAGE" } }, "documents": [ { "type": "warehouse_receipt", "hash": "…", "registryId": "…" } ],
  "restricted": { "uri": "…", "hash": "…", "accessPolicy": "…" } }

Anhang E: FAQ

Ist A-REX ein ERC? Noch nicht. Die Spezifikation ist im ERC-Format verfasst und wird nach einem Deployment im Produktivbetrieb, unabhängigen Implementierungen und einem Audit eingereicht. Es wurde keine Nummer vergeben; Namen im Code verwenden das Präfix ERC nicht.

Muss ARexToken verwendet werden? Nein. Die Schnittstellen können beliebig implementiert werden; die Referenz ist nur ein Weg.

Müssen die Referenz-Hooks verwendet werden? Nein. Sie sind Demonstrationen. Sie können kopiert oder ersetzt werden, oder es werden eigene geschrieben.

Kann ein Hook einen erzwungenen Transfer blockieren? Er kann für OP_FORCED_TRANSFER einen Code zurückgeben, und der Token revertiert dann. Referenz-Hooks tun dies nicht; ein Hook, der die Durchsetzung regelt (z. B. durch Verlangen einer Anordnungsreferenz), darf es.

Wohin gehören Koordinaten? In zugriffsbeschränkten Off-Chain-Speicher, auf den aus den Metadaten verwiesen wird, niemals On-Chain.

Wie wird eine künftige Ernte abgebildet? producedAt = 0; Transfers über ExpiryHook(allowPreHarvestTransfers) steuern.

Bleibt die Menge in transform erhalten? Nicht durch den Standard; die Referenz erlaubt jedem Inhaber ein Re-Batching, wenn sie erhalten bleibt, und verlangt andernfalls TRANSFORMER_ROLE.

Ist der Token ein Wertpapier? Der Standard entscheidet das nicht. Das Angebot entscheidet. Rechtsberatung ist einzuholen; die Durchsetzungsschnittstelle ist unabhängig von der Antwort vorhanden.