Library

A2A on enterprise ledgers

Four reference architectures for tokenized account-to-account settlement between regulated institutions, one per permissioned ledger. Hyperledger Besu, R3 Corda and Hyperledger Fabric each carry a three-bank payment corridor from the euro area to Saudi Arabia or the UAE; Canton links four financial market infrastructures in a single atomic collateral trade. Each section covers topology, contract code, the full transaction lifecycle, FX, privacy, ISO 20022 binding, compliance and regulation. The shared flow is described once, up front.

At a glance

The four ledgers compared

Every cell below comes from the platform sections that follow.

LayerHyperledger BesuCantonR3 CordaHyperledger Fabric
ScenarioBankFR (Paris), BankES (Madrid), BankSA (Riyadh); EUR/SAR paymentClearstream D7, DTCC ComposerX, Broadridge DLR, Euroclear D-FMI; intraday repo and collateral DvPBankFR (Frankfurt), BankNL (Amsterdam), BankAE (Dubai, ADGM); EUR/AED paymentBayerische Handelsbank (Munich), Banque Méridienne (Paris), Bank Al-Madinah (Riyadh); EUR/SAR payment
Privacy modelEvery validator sees public state. Only hashes go on-chain; ISO 20022 and KYC payloads travel through Tessera to named parties. Zero-knowledge proofs optional.Sub-transaction privacy: each participant receives only its encrypted view; the Global Synchronizer orders and confirms without reading content.Point-to-point AMQP: only transaction parties see the states. The notary sees state references only.One corridor channel plus three bilateral channels; Travel Rule data in a private data collection with only its hash on the channel ledger. Amounts visible to channel members (fabtoken).
Consensus and finalityQBFT, one validator per bank, 2-of-3 commit, 2-second blocks, instant deterministic finality.13 Super Validators run Tendermint-style BFT ordering (under 500 ms); mediator runs two-phase commit across participants.BFT notary cluster (BFT-SMaRt variant), 3-of-5 signatures, checks uniqueness of consumed states.Five-node etcd/Raft ordering (crash fault tolerant, quorum 3), 2-of-3 endorsement, MVCC validation. SmartBFT planned for Fabric 3.x.
Token or asset modelERC-20 deposit tokens (EurDepositToken, SarDepositToken), 1:1 claims on bank reserves.Daml contracts as registered digital twins of custodied securities (Treasuries, EUR commercial paper, gilts). Canton Coin pays fees only.Corda Token SDK FungibleToken states, consumed and replaced on each transfer.Fabric Token SDK UTXO notes (fabtoken driver): EUR-CBM and SAR-CBM commercial bank money tokens.
Contract languageSolidity 0.8 on the EVMDaml 3.xKotlin CorDapps on the JVMGo chaincode (contract-api-go)
Identityenode plus X.509 certificate per node; HSM-held ISSUER_ROLE keys; EIP-712 signatures.Daml parties hosted on participant nodes; topology manager publishes party-to-participant mapping.X.509 legal identities (O, L, C) published through the network map service.Per-bank Fabric CA and MSP; X.509 with OU and attribute roles (treasury, gateway, compliance, audit).
Settlement patternAtomic PvP in one EVM transaction (Adhara SILVER); 4-hour netting; TARGET2 and SARIE in central bank money.Atomic DvP across four FMI applications; cash via Fedwire (USD) and TARGET2 (EUR) RTGS.Atomic PvP in one notarised transaction; 4-hour netting; TARGET2 and UAE RTGS.Atomic swap inside one read-write set; daily netting at 17:00 CET; TARGET2 and SARIE.
On-ledger timeSteps 1–11 under 30 seconds; PvP well under 10 secondsAbout 6 seconds to atomic commitSteps 1–11 under 60 secondsUnder 1 second
Shared pattern

The shared A2A pattern

All four designs move value between identified, supervised institutions on a permissioned ledger. Each bank or FMI runs its own node in its own data center or regulated cloud, holds signing keys in FIPS 140-2 Level 3 HSMs, and keeps authoritative control of its own liabilities or asset register. The three payment corridors (Besu, Corda, Fabric) settle tokenized commercial bank money and follow the same ten-stage flow. Canton applies the same atomic-settlement idea to securities and collateral.

  1. Instruction. The corporate client submits an ISO 20022 pacs.008 instruction; the originating bank checks balance, AML risk score and transaction limits.
  2. Screening and Travel Rule. Sanctions screening runs on structured name and LEI fields. Originator and beneficiary banks exchange FATF Recommendation 16 data (IVMS-101 format) as a Verifiable Credential or private payload; only its hash reaches shared state. The beneficiary bank checks the originator LEI against GLEIF.
  3. FX quote. A liquidity bank runs the FX oracle and signs a mid, bid and ask quote from its treasury feed (Bloomberg or Refinitiv) valid for 90 seconds. One signed rate for everyone removes disputes about which rate governs the conversion; the network participation agreement names the oracle.
  4. Atomic exchange. Both currency legs settle in a single ledger transaction that commits completely or reverts completely (payment versus payment). No partial-settlement state can exist, so principal risk is removed by construction.
  5. Credit. The receiving bank's integration layer picks up the ledger event and credits the beneficiary's account in core banking in real time, before the RTGS cycle settles.
  6. Audit trail. Each party holds an immutable, signed, timestamped record that ties the payload hash, KYC attestation hash, FX quote and signatures to the payment reference (UETR). Regulatory reporting is generated from it with no post-hoc reconstruction.
  7. Netting. A netting cycle computes net interbank positions: every 4 hours, or on demand above €50M, in the Besu and Corda designs; once a day at 17:00 CET on Fabric.
  8. RTGS settlement. Net positions settle in central bank money. For EUR that is TARGET2, the ECB's RTGS, on ISO 20022 since the March 2023 T2 migration, with pacs.009 instructions and settlement in claims on the ECB itself. The local leg uses SARIE (SAMA) or UAE RTGS (CBUAE).
  9. Burn. Once both RTGS confirmations arrive, the tokens covering the settled amounts are burned, so on-ledger supply always equals the unsettled portion of obligations.
  10. Reconciliation. The structured ISO 20022 data (invoice references, purpose codes, LEIs) stays bound to the payment, so both banks reconcile straight through. The designs target an exception rate under 2%; early ISO 20022 adoption cohorts report 20–30% fewer payment exceptions than MT workflows.

Why the pattern pays

  • Netting replaces pre-funded nostro balances with just-in-time central bank money settlement.
  • FX conversion happens on the ledger, so the spread moves from the correspondent chain to the banks that hold the client relationships. In the Besu and Corda examples the originating bank earns a flat 5 bp on the EUR leg.
  • BIS CPMI (2022) found roughly one-third of global FX transactions, about $2.2 trillion in daily settlement value, still settle without PvP and so carry Herstatt-style risk. The 1974 Herstatt failure remains the canonical case.
  • Structured ISO 20022 fields let banks screen against legal entity registries instead of free text. SWIFT's ISO 20022 Migration Progress Report (2024) and Accenture's "Transforming Financial Crime Compliance with AI and ISO 20022" (2023) document 30–50% fewer false positives than MT formats, which also shortens manual review queues.

EU rules common to the three payment corridors

RuleEffect on a bank-issued deposit token corridor
EBA Report on Tokenised Deposits (EBA/REP/2024/24, Dec 2024)Distinguishes bearer and non-bearer tokenised deposits. Non-bearer tokens issued by a credit institution stay on its balance sheet and are regulated under CRD/CRR banking law instead of MiCA Title III, so issuance needs no e-money token authorization and avoids the €150M issuance cap and monthly transaction limits for large EMT issuers under MiCA Articles 23–24. The EBA also favours public token state on permissioned chains with personal data kept off-chain.
MiCA (Reg. 2023/1114, full effect Dec 2024)Titles III and IV govern stablecoins from non-bank issuers. Art. 2(4)(a) excludes deposits. MiCA would apply if a bank issued a retail e-money token.
Transfer of Funds Regulation (Reg. 2023/1113)In force 30 December 2024 with no grace period. Originator and beneficiary data must accompany every transfer regardless of amount, including transfers between two regulated banks.
DORA (Reg. 2022/2554, in force 17 Jan 2025)The ledger node is a critical ICT system. Requires resilience testing (TLPT for systemic institutions), major-incident reporting to the supervisor within 4 hours, and third-party risk management that gives the bank contractual resilience guarantees and audit rights over the platform vendor.
AMLD6, EU Sanctions Regulation, GDPREach bank screens independently; personal data stays out of shared ledger state.
Settlement Finality DirectiveLegal finality protection applies only to designated payment systems; none of these corridors is designated yet.

Risks common to every design

  • Consortium governance. Contour (trade finance, built on Corda), we.trade and Marco Polo failed on governance: commercial incentives among competing bank shareholders could not be kept aligned. The participation agreement must say who pays for maintenance when year-one volumes disappoint, who controls the upgrade roadmap, what happens if a bank exits, and who is liable for a settlement failure caused by a bug in shared code.
  • Legal finality. Ledger finality is technical. Legal finality, the right to retain funds against counterparty insolvency, depends on the legal regime. Fnality's Sterling Fnality Payment System (£FnPS) received Bank of England Settlement Finality Designation in 2024, the first DLT-based payment system to do so. Equivalent engagement for these corridors is an 18–36 month regulatory process.
  • Mint-key compromise. Whoever holds the issuer's minting key can create unbacked tokens. The standard mitigation is M-of-N HSM multi-signature minting split across treasury, compliance and technology teams, with disaster recovery for key material tested before production.
  • Regulatory sequencing. EU-side banks should seek informal supervisor guidance, file a DORA ICT risk assessment covering the node, pilot with synthetic transactions, seek payment-system authorization (or a sandbox or SFD designation pathway), and only then go live bilaterally. Compressing this sequence is the most common error and adds 12–24 months.
Shared precedent: Project Aber

The Saudi Central Bank (SAMA) and the Central Bank of the UAE (CBUAE) ran Project Aber (2019; joint report "A Joint Digital Currency and Infrastructure Initiative", 2020) with six commercial banks across both countries, evaluating R3 Corda for cross-border, dual-issued digital currency settlement. It confirmed technical viability and showed that DLT lets central banks operate domestic and cross-border payment systems from the same infrastructure. Aber used a CBDC model; the corridors on this page use deposit tokens issued directly by commercial banks, a related but distinct model. Aber is the supervisory precedent behind the Saudi and UAE legs below.

Background reading: A2A payments overview, the A2A workflow, ISO 20022 in A2A, comparison framework, enterprise blockchain briefing and the glossary.

Shared sources: BIS CPMI, "PvP arrangements and the case for greater adoption", 2022, bis.org/cpmi/publ/d208.htm. SWIFT ISO 20022 and CBPR+, swift.com/standards/iso-20022. ISO 20022 schemas, iso20022.org. EBA/REP/2024/24. FATF Recommendation 16 (Wire Transfers). Bank of England Financial Market Infrastructure Annual Report 2024; fnality.org.

Hyperledger Besu · EUR/SAR

Hyperledger Besu: two European banks and a Saudi bank

A French corporate pays a Riyadh supplier. BankFR (Paris) originates and issues EUR tokens. BankES (Madrid) is the EUR liquidity validator and on-chain FX market maker. BankSA (Riyadh) receives and redeems in SAR. The network uses Besu with the Adhara SILVER (Settlement, Issuance, Liquidity and Velocity Enhancement Rail) pattern proven in Project Khokha 2 and the Euro Cyber Resilience Board sandbox. The ISO 20022 pacs.008 is hashed on-chain with the encrypted payload kept off-chain, and there is no nostro pre-funding.

  • Besu 24.x
  • Adhara SILVER
  • QBFT
  • Solidity 0.8 / EVM
  • Tessera
  • pacs.008
  • MiCA
  • SAMA Open Banking
  • DORA

Why this corridor and this stack

No production tokenized A2A network yet serves EUR/SAR. EU–Saudi bilateral trade exceeded €80 billion in 2024, led by energy, capital goods, infrastructure procurement and Vision 2030 mega-project financing. Payments are large enough that correspondent banking's all-in cost (typically 150–350 bp) costs a single mid-sized European exporter book tens of millions of euros a year. SAMA has run DLT cross-border settlement experiments since 2019 (Project Aber) and participates in Project mBridge, the multi-central-bank wholesale CBDC network.

  • Besu is an Apache 2.0, EVM-compatible client maintained under the Linux Foundation's Hyperledger umbrella since 2019, so the pool of about 23,000 Solidity developers can build on it without a new language or VM.
  • QBFT gives instant deterministic finality per block with no reorg window, a precondition for legal payment-system designation.
  • It has the deepest production record of any permissioned EVM platform in regulated infrastructure: Bank of Thailand's Project Inthanon, SARB's Project Khokha 1 and 2, Banque de France wholesale CBDC experiments, Eurosystem exploratory work, and Onyx by J.P. Morgan, whose Liink and JPM Coin systems run on a Besu-derived stack.
  • Adhara, a UK fintech founded in 2018 from the ConsenSys/Quorum lineage, supplies SILVER: tokenized commercial bank money, on-chain PvP, liquidity-saving netting and an oracle/FX layer. SILVER was the settlement core of Khokha 2 and is the engine behind Project Atlas (Investec, Citi, Standard Bank, Absa). Adhara is also the technology provider for £FnPS.
Khokha 2 precedent

The South African Reserve Bank ran Project Khokha 2 with Absa, FirstRand, Investec, Nedbank and Standard Bank, completing it in 2022. It used SILVER on a Besu-derived network to settle tokenized wholesale CBDC and tokenized debentures with on-chain PvP and DvP, and showed intraday liquidity savings of 60–80% against gross RTGS.

Topology and validators

Five Besu nodes: three validators (one per bank) and two non-validator observer/RPC nodes operated jointly. Each validator is paired with a Tessera private-transaction manager, and bridge connectors link to TARGET2 and SARIE. All contracts sit in a shared Adhara SILVER layer (EurDepositToken, SarDepositToken, PvP settlement, FXOracle, netting).

Validator 1 · originating bank

BankFR · Paris

Licensed by the ACPR; within MiCA where it issues e-money tokens under Title III; DORA-compliant for critical ICT since January 2025. Mints EurDepositToken against its own reserves for corporate clients and burns on redemption.

Identity
enode + X.509 cert
HSM
Thales Luna 7
Privacy
Tessera payload manager
Consensus
Round-robin QBFT proposer, vote weight 1
RTGS
TARGET2 bridge
Validator 2 · liquidity and FX oracle

BankES · Madrid

Licensed by Banco de España; MiCA and DORA. Originates nothing here; holds surplus EUR tokens for intraday liquidity and runs FXOracle.sol, the signed EUR/SAR feed for the PvP engine.

Identity
enode + X.509 cert
HSM
Utimaco SecurityServer
Privacy
Tessera payload manager
RTGS
TARGET2 net settlement
Validator 3 · receiving bank

BankSA · Riyadh

Licensed by SAMA under the Banking Control Law (1966, as updated); subject to the SAMA Open Banking Framework (Phase II in force 2024), Cyber Security Framework and Cloud Computing Regulatory Framework. Issues and redeems SarDepositToken, crediting SAR on-chain at the oracle rate. SAR is pegged to USD at 3.7500.

Identity
enode + X.509 cert
HSM
AWS CloudHSM
Privacy
Tessera payload manager
RTGS
SARIE (SAMA)

QBFT rotates the block proposer round-robin and needs a 2-of-3 commit signature on every block. Block time is 2 seconds, so end-to-end PvP takes well under 10 seconds. One observer belongs to an independent regulator-facing trust that publishes a permissioned reporting feed to the ACPR, Banco de España and SAMA; the other belongs to an independent auditor (the Deloitte/PwC pattern used in Khokha 2). Observers read public-state events through permissioned RPC, produce no blocks and cannot see Tessera payloads. An on-chain ValidatorRegistry governs the validator set: changes need a 2-of-3 vote plus a 14-day delay, the pattern used by Onyx and Khokha 2.

Contracts: deposit tokens, SILVER PvP, FX oracle

Three Solidity 0.8.x contract groups: one ERC-20 deposit token per currency, the SILVER engine (PvP atomic settlement, liquidity-saving netting, obligation tracking), and infrastructure contracts (FX oracle, validator registry, compliance registry). All are deployed once by a permissioned deployer key and upgraded through UUPS proxies with 2-of-3 validator approval and a 14-day timelock. The token adds permissioned mint and burn, a compliance freeze, and a hash binding to the off-chain pacs.008.

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";

contract EurDepositToken is ERC20, AccessControl {
    bytes32 public constant ISSUER_ROLE   = keccak256("ISSUER_ROLE");
    bytes32 public constant COMPLIANCE_ROLE = keccak256("COMPLIANCE_ROLE");

    // Binds each minted batch to its ISO 20022 pacs.008 payload (kept off-chain
    // in Tessera, hash committed on-chain for non-repudiation).
    mapping(bytes32 => PaymentMeta) public meta;
    struct PaymentMeta {
        bytes32 iso20022Hash;     // keccak256 of pacs.008 XML
        bytes32 kycAttestationHash; // keccak256 of Travel Rule VC
        uint256 amount;
        address beneficiaryBank; // e.g. BankSA address
        uint64  uetrTimestamp;   // block timestamp
    }

    event PaymentMinted(bytes32 indexed uetr, uint256 amount, address beneficiary);
    event PaymentBurned(bytes32 indexed uetr, uint256 amount);

    function mintForPayment(
        bytes32 uetr,
        address to,
        uint256 amount,
        bytes32 iso20022Hash,
        bytes32 kycAttestationHash,
        address beneficiaryBank
    ) external onlyRole(ISSUER_ROLE) {
        require(meta[uetr].amount == 0, "UETR exists");
        require(iso20022Hash != bytes32(0), "pacs.008 required");
        require(kycAttestationHash != bytes32(0), "KYC VC required");
        meta[uetr] = PaymentMeta(iso20022Hash, kycAttestationHash, amount,
                                  beneficiaryBank, uint64(block.timestamp));
        _mint(to, amount);
        emit PaymentMinted(uetr, amount, to);
    }

    function burnForRedemption(bytes32 uetr, uint256 amount)
        external onlyRole(ISSUER_ROLE)
    {
        _burn(msg.sender, amount);
        emit PaymentBurned(uetr, amount);
    }
}

BankSA deploys the same template as SarDepositToken with 2 decimals (the SAR ledger convention), or 18 if the network adopts internal scaling. SILVER's core primitive is conditional atomic settlement: one transaction moves both legs or reverts.

contract SilverPvPSettlement is AccessControl, ReentrancyGuard {
    EurDepositToken public immutable eur;
    SarDepositToken public immutable sar;
    FXOracle        public immutable fxOracle;

    struct SettlementInstruction {
        bytes32 uetr;
        address payerBank;          // BankFR address
        address payeeBank;          // BankSA address
        uint256 eurAmount;
        uint256 sarAmount;          // derived from oracle rate * eurAmount
        bytes32 oracleQuoteId;      // signed FX rate reference
        uint64  validUntil;         // e.g. block.timestamp + 90s
    }

    event PvPSettled(bytes32 indexed uetr, uint256 eurAmount,
                       uint256 sarAmount, uint256 rateScaled);

    // Atomic PvP: EUR debit + SAR credit in a single tx; reverts on any failure.
    function settlePvP(
        SettlementInstruction calldata ins,
        bytes calldata payerSig,    // EIP-712 signed by BankFR
        bytes calldata payeeSig     // EIP-712 signed by BankSA
    ) external nonReentrant {
        require(block.timestamp <= ins.validUntil, "Quote expired");
        require(_verifySig(ins, payerSig, ins.payerBank), "Bad payer sig");
        require(_verifySig(ins, payeeSig, ins.payeeBank), "Bad payee sig");

        // Validate the oracle-signed rate matches the instruction
        (uint256 rateScaled, uint64 ts) = fxOracle.getQuote(ins.oracleQuoteId);
        require(block.timestamp - ts <= 90, "Stale FX");
        require(ins.sarAmount == (ins.eurAmount * rateScaled) / 1e8, "Bad SAR calc");

        // Atomic legs: both succeed or whole tx reverts
        eur.transferFrom(ins.payerBank, ins.payeeBank, ins.eurAmount);
        sar.mintForPayment(ins.uetr, ins.payeeBank, ins.sarAmount,
                            /* iso20022Hash */ bytes32(ins.uetr),
                            /* kycHash      */ bytes32(ins.uetr),
                            ins.payeeBank);

        emit PvPSettled(ins.uetr, ins.eurAmount, ins.sarAmount, rateScaled);
    }
}
ContractDeployed byPrivacyPurpose
EurDepositTokenBankFRPublic stateERC-20, 1:1 claim on EUR reserves at BankFR; mint and burn limited to BankFR's HSM-protected ISSUER_ROLE address.
SarDepositTokenBankSAPublic stateERC-20, 1:1 claim on SAR reserves at BankSA; mint and burn limited to BankSA's ISSUER_ROLE address.
SilverPvPSettlementAdhara (network deployer)Public stateAtomic PvP engine; verifies both banks' EIP-712 signatures and a fresh FX quote.
SilverNettingAdharaPublic stateAccumulates obligations over a window (e.g. 4 hours), computes the multilateral net and triggers PvP for net positions only; replicates the Khokha 2 liquidity-saving mechanism.
FXOracleBankESPublic stateEUR/SAR mid, bid and ask quotes signed by BankES's node key, each valid 90 seconds and referenced by ID.
ComplianceRegistryJointTessera private groupHashes of the Travel Rule Verifiable Credentials for each transaction; full VCs travel through Tessera.
ValidatorRegistryJointPublic stateValidator-set governance: 2-of-3 vote plus 14-day timelock (Onyx and Khokha 2 pattern).

Transaction lifecycle: 16 steps

The on-chain portion (steps 1–11) completes in under 30 seconds; with 2-second QBFT blocks the PvP transaction is final at inclusion. Steps 12–16 run intraday or end-of-day depending on the netting cycle.

#StepBesu-specific detailTiming
01Instructionpacs.008 via BankFR's corporate API: Paris IBAN, Riyadh supplier IBAN, EUR amount, value date, beneficiary, LEI, purpose code.<1 s
02Travel RuleBankFR sends the VC (originator LEI, jurisdiction, risk tier, sanctions-clear attestation) as a private Tessera transaction to BankSA's key and calls ComplianceRegistry.recordAttestation(uetr, vcHash). BankSA validates the LEI against GLEIF and returns a counter-VC the same way.1–3 s
03FX rateFXOracle.getLatestQuote("EUR","SAR"). BankES posts signed quotes every 30 seconds; BankFR receives a quote ID and rate (e.g. 4.1287).<1 s
04Signed instructionBankFR builds the SettlementInstruction, hashes it under EIP-712 and signs with its HSM key, then sends it over Tessera. BankSA re-derives the SAR amount, verifies the quote and the pacs.008 against its XSD, and countersigns. No on-chain state change yet.1–2 s, no gas
05MintEurDepositToken.mintForPayment(...) under ISSUER_ROLE records the payload and KYC hashes against the UETR and emits PaymentMinted, visible to all validators and observers. The XML never leaves BankFR.2–4 s, 1 block
06Allowanceapprove(silverPvPSettlement, amount). Production banks pre-approve a working credit line (e.g. €100M) at setup to keep this off the critical path.2 s
07Atomic PvPsettlePvP checks both signatures, quote age under 90 s and SAR = EUR × rate, then runs transferFrom (EUR leg) and mintForPayment (SAR leg). Any failure reverts both.2–4 s, ~250,000 gas
08Beneficiary creditBankSA's integration layer sees PvPSettled with the matching UETR and credits the supplier's local IBAN account.1–2 s
09Originator statusBankFR pushes a pacs.002 with status ACSC (AcceptedSettlementCompleted), the strongest positive ISO 20022 status, and the client's ERP marks the payment settled.<1 s
10Finality2-of-3 QBFT commit makes the block final. Ethereum mainnet's probabilistic finality (about 12 minutes to economic finality after the merge) would not support payment-system designation.At inclusion
11Audit trailTransaction hash, payload hash, KYC hash, quote ID and EIP-712 signatures are bound to the UETR on all five nodes. The regulator observer produces feeds for the ACPR, Banco de España and SAMA; the auditor observer's trail supports SOC 1/SOC 2 attestation.Automated
12NettingSilverNetting aggregates PvPSettled events and computes net EUR obligations between each bank pair and net SAR positions.Every 4 h or on demand
13TARGET2BankFR and BankES submit the net pacs.009; BankES's bridge writes confirmation back via SilverNetting.confirmRtgsSettlement(cycleId, eurNetSettled).TARGET2 hours
14SARIEBankSA settles net SAR through SARIE, operating since 1997, in a direct liability of SAMA. SAMA gets the netting summary from the regulator observer.07:30–16:30 AST
15BurnBankFR calls burnForRedemption(uetr, amount) on the EUR tokens BankSA holds (BankSA approves the burn in the cycle workflow); BankSA burns the SAR tokens redeemed to the supplier.Post-RTGS
16ReconciliationThe Besu integration layer feeds both core banking systems; the Tessera-held pacs.008, hash-bound since step 5, drives matching.<2% exceptions

FX: EUR/SAR on-chain

Because SAR is pegged to USD at 3.7500, EUR/SAR moves with EUR/USD and is thin at some hours, which shapes how rates are sourced and committed. BankES posts quotes through a postQuote function gated to its HSM-held oracle key; every transaction in a window references a quote ID whose signature any party can verify.

contract FXOracle is AccessControl {
    bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE");

    struct Quote {
        bytes32 base;          // "EUR"
        bytes32 quote;         // "SAR"
        uint256 midScaled;     // e.g. 412870000 = 4.1287 * 1e8
        uint256 bidScaled;
        uint256 askScaled;
        uint64  postedAt;      // block.timestamp at posting
        uint64  validUntil;    // postedAt + 90 seconds
        address oracle;        // BankES address (msg.sender)
    }

    mapping(bytes32 => Quote) public quotes;
    bytes32 public latestEurSarQuoteId;

    event QuotePosted(bytes32 indexed id, uint256 midScaled, uint64 postedAt);

    function postQuote(bytes32 base, bytes32 quote,
                       uint256 midScaled, uint256 bidScaled, uint256 askScaled)
        external onlyRole(ORACLE_ROLE)
        returns (bytes32 id)
    {
        id = keccak256(abi.encode(base, quote, block.timestamp, msg.sender));
        quotes[id] = Quote(base, quote, midScaled, bidScaled, askScaled,
                           uint64(block.timestamp), uint64(block.timestamp) + 90,
                           msg.sender);
        if (base == "EUR" && quote == "SAR") latestEurSarQuoteId = id;
        emit QuotePosted(id, midScaled, uint64(block.timestamp));
    }

    function getQuote(bytes32 id) external view
        returns (uint256 midScaled, uint64 postedAt)
    {
        Quote storage q = quotes[id];
        return (q.midScaled, q.postedAt);
    }
}

BankSA charges its institutional dealing spread over the oracle mid (typically 10–20 bp for wholesale flows) and keeps it as revenue; BankFR earns 5 bp flat on origination. The EVM's revert semantics make PvP the default: the same outcome CLS Bank achieves for major currency pairs through multi-currency cash accounts, implemented here as contract logic.

Worked example

A €5,000,000 payment. Oracle mid 4.1287 (posted 30 seconds earlier, valid 60 more). BankSA spread 12 bp gives a dealing rate of 4.1287 × 1.0012 = 4.1337, so the supplier receives SAR 20,668,500. BankSA FX revenue is SAR 24,772 (about €6,000 at mid); BankFR's fee is €2,500. All-in cost to the corporate is about 12 bp, against roughly 1.8–3.5% through correspondents (bank-published EUR/SAR retail-to-wholesale spreads). At €4 billion of annual corridor flow, about €5–8 million of extra margin stays with BankFR and BankSA.

Privacy: Tessera, private state and zero-knowledge options

By default every Besu validator sees every transaction, so SILVER layers privacy: only hashes reach public state; full payloads travel peer-to-peer through Tessera to the named parties; and zero-knowledge proofs (for example a zk-SNARK showing a payment is under a regulatory threshold without revealing the amount) can be added for sensitive cases. Personal data (originator name, IBAN, supplier identity, invoice references) therefore never enters public state, meeting GDPR and SAMA Cyber Security Framework residency and confidentiality rules; payloads sit only on the two parties' Tessera nodes in their own data centers.

Tessera adapts the Quorum private-transaction pattern. Besu's original native private-transaction implementation (the Orion predecessor and early Tessera integration, later the Privacy Group API) was deprecated in Besu 22.x; GoQuorum-compatible private transactions follow the EEA Client Specification v8 (2024), which Besu, GoQuorum and Hyperledger Burrow implement. Production deployments in 2025–26 use one of three patterns: hash-binding with off-chain payload (SILVER, the most mature and the Khokha 2 choice), a Tessera-compatible companion deployment, or zero-knowledge shielding of sensitive fields (Aztec Connect-style designs adapted to permissioned Besu). Adhara recommends hash-binding for greenfield deployments in 2026 as simpler and more auditable, in line with the EBA's December 2024 view.

ISO 20022 binding

The keccak256 hash of the canonical pacs.008 XML is committed to EurDepositToken.meta[uetr].iso20022Hash at mint (example value 0x9a3f4b21d8e7c0a2f6b5e9...) while the XML travels through Tessera. BankFR cannot later claim a different payload belonged to the UETR, and BankSA cannot deny receiving the one it acknowledged. The message carries the originator's full legal name, structured address, LEI, IBAN, purpose code (TRPT for trade, SCTL for securities settlement), structured remittance data, reporting codes and the UETR. The sample message (structure shown in the Fabric section) uses pacs.008.001.08, settlement method INDA, MsgId BANKFR-20260415-00098765, created 2026-04-15T10:14:32Z, UETR 7c9e6679-7425-40de-944b-e07fc1f90ae7, EUR 5,000,000.00 from Paris Industrial Equipment SAS (Avenue des Champs-Élysées 88, Paris; LEI 969500N1B7PI4F1V2N06) to Riyadh Construction Holdings Ltd (LEI 5586009OOKK7HZJL8Z51), invoice INV-2026-RUH-2287, which BankSA's receivables system matches automatically.

KYC, AML and the Travel Rule

Each bank meets its own regime (ACPR and Banco de España; SAMA for BankSA) while the shared attestation flow satisfies the Travel Rule. Saudi AML/CFT is administered by SAMA and the Saudi Financial Investigation Unit (SAFIU) and is broadly FATF-aligned; Saudi Arabia has been a full FATF member since 2019. SAMA requires AML/CFT documentation for cross-border SAR payments above SAR 60,000 (about $16,000).

RequirementJurisdictionHandling on Besu
AML/CFT screeningEU (AMLD6), SAMA AMLStructured name and LEI fed to each bank's engine for the originator (step 1) and the beneficiary (BankSA, before countersigning).
Travel Rule (FATF R.16)EU TFR, SAMATessera VC exchange at step 2; VC hashes in ComplianceRegistry; IVMS-101 format.
SanctionsEU Sanctions Regulation; UN and Saudi listsIndependent checks on LEI and structured name; the Saudi list is maintained by SAFIU.
Transaction reportingECB, ACPR, BdE; SAMAAutomated feeds from the regulator observer; SAMA reporting follows Banking Control Law cross-border rules.
Data residencyGDPR; SAMA CSFPersonal data only in Tessera payloads at BankFR and BankSA, invisible to BankES and observers.
DORAEUBankFR and BankES treat the Besu node and SILVER as critical ICT; Adhara is managed as an ICT third-party provider.
SAMA Cloud Computing FrameworkSaudi ArabiaBankSA's node runs in a SAMA-approved zone (typically AWS Bahrain or a Saudi-resident data center); SAMA pre-approval is needed for any cloud deployment handling customer data.

Regulation: EU and Saudi Arabia

BankFR's token is a bank liability under CRD VI/CRR and the EBA report; DORA, TFR and TARGET2 rules apply as described in the shared pattern, with Adhara owing DORA resilience guarantees and audit rights. Saudi Arabia has no MiCA-style digital-asset regime: SAMA supervises digital settlement under the Banking Control Law and its rulebooks, and its stated direction (Aber, Agorá-related work, FinTech Saudi) is to fold tokenized wholesale payments into existing supervision.

  • Banking Control Law (Royal Decree M/5, 1966, as amended), supplemented by SAMA rulebooks on capital adequacy, liquidity and cross-border activity. BankSA's token activity is deposit-taking: the SAR token represents an existing deposit liability.
  • SAMA Open Banking Framework (Phase II, 2024): API-based interbank data sharing with strong consent and security; SAMA's preference for supervisor-visible architecture matches the observer-node design.
  • SAMA Cyber Security Framework (2017, current version 2023): mandatory for supervised entities; covers the Besu node, Tessera and HSMs. Any new core-banking-adjacent system, including the Besu integration, needs SAMA pre-approval.
  • SAMA Cloud Computing Regulatory Framework (2023): residency rules apply to Tessera payloads.
  • Project Aber and Project Agorá. Agorá, announced by the BIS in April 2024, joins seven central banks (Bank of France for the Eurosystem, Bank of Japan, Bank of Korea, Bank of Mexico, Swiss National Bank, Bank of England, Federal Reserve Bank of New York) with private banks convened by the Institute of International Finance, testing tokenized wholesale central bank money and tokenized deposits on a shared programmable platform with a permissioned EVM-style stack among the candidates. SAMA takes part in adjacent BIS work programmes.
  • Vision 2030 and FinTech Saudi (SAMA with the Capital Market Authority): tokenization is a modernization priority; the FinTech Saudi sandbox and the Regulatory Sandbox for Innovation allow supervised live-money testing. AML/CFT supervision is shared by SAMA, SAFIU and the CMA.
Compatibility finding

Both jurisdictions classify the on-chain instrument as a bank deposit liability under standard prudential supervision, so no novel cross-border legal mechanism is needed and regulatory risk is well below that of a non-bank stablecoin network on the same corridor. Remaining risk sits in future SFD designation and in SAMA's explicit no-objection for production cross-border flows beyond the sandbox.

RTGS net settlement and liquidity

Through correspondents, a €5M EUR→SAR payment needs €5M (or the SAR equivalent) pre-funded in nostros. Here the corporate is debited at once, the supplier is credited within seconds, and RTGS later settles only net positions. If in one 4-hour cycle BankFR sends €30M to Riyadh and BankSA sends €18M to Paris, the net obligation is €12M against €48M gross; at 5%, that frees about €1.8M a year in foregone yield for a single 4-hour cycle.

LayerMechanismAssetTimingFinality
On-chain (SILVER)Atomic PvP, QBFTEUR deposit token (BankFR liability) against SAR deposit token (BankSA liability)<10 sTechnical finality at block inclusion; legal finality on RTGS confirmation
TARGET2Intraday net, pacs.009ECB reservesEvery 4 h in the TARGET2 windowFinal in ECB money
SARIEIntraday net, SARIE formatSAMA reserves07:30–16:30 ASTFinal in SAMA money

TARGET2 runs on CET/CEST and SARIE on Arabia Standard Time (UTC+3, no daylight saving). Both are open roughly 09:00–14:30 CET (11:00–16:30 AST); cycles outside that window queue SARIE instructions for the next AST business day. Saudi banks work Sunday to Thursday, so Friday cycles cannot settle the SAR leg until Sunday morning and Sunday EUR cycles wait for Monday. Intraday cycles are therefore scheduled in the overlap on the four common days, Monday to Thursday.

Besu-specific risks

  • Governance. Beyond the shared questions: who holds the UUPS upgrade keys for SILVER and the token contracts. The Adhara/Khokha 2 model places them, with the operating contract, in a Mauritius- or Luxembourg-based SPV; that is the commonest structure but not the only one.
  • Legal finality. Requires ECB/ACPR engagement on the EU side and SAMA on the Saudi side.
  • Two key classes. A compromised ISSUER_ROLE key mints unbacked tokens. One compromised QBFT validator key gives an attacker 1 of 3 votes, too few to forge a block, but costs the bank its consensus contribution; two compromised keys allow forged blocks. Keep validator keys HSM-resident in physically separate data centers, with timelocked rotation through ValidatorRegistry.
  • Smart-contract bugs. The dominant operational risk: an exploitable Solidity bug can drain or freeze tokens, whereas a bug in a Kotlin CorDapp typically makes transactions fail verification. Require audits by at least two independent firms (e.g. ChainSecurity, OpenZeppelin, Trail of Bits) with formal verification of PvP atomicity, a continuous bug bounty, UUPS upgrades with a 14-day minimum timelock, and insurance (the Lloyd's syndicate market for permissioned DLT contract cover is small but functional as of 2026). Solidity buys a far larger developer pool and toolset at the cost of a more attack-prone primitive.
  • Vendor concentration. SILVER is Adhara proprietary IP. Mitigate with source-code escrow at a regulated trust, contractual rights to fork on insolvency or material breach, DORA critical-ICT classification, and a migration path to open-source options (Hyperledger Cacti or Fabric Token SDK patterns). The exposure resembles R3 vendor risk on Corda.
  • Sequencing for BankSA. SAMA no-objection under the Cyber Security and Cloud Computing Frameworks, the FinTech Saudi sandbox with synthetic transactions, explicit SAMA approval for production cross-border tokenized SAR, then go-live. EU banks follow the shared sequence with ACPR or Banco de España and a DORA assessment covering SILVER. SAMA's Aber and Agorá-related familiarity shortens supervisory engagement without removing it.

Besu sources: besu.hyperledger.org (QBFT documentation); EEA Client Specification v8 (2024); jpmorgan.com/onyx; SARB Project Khokha 2 final report (2022) and adhara.io; BIS Project Agorá; sama.gov.sa; fintechsaudi.com.

Back to comparison
Canton Network · Daml · four FMIs

Canton: four FMIs settled in one atomic transaction

A US asset manager pledges DTCC-custodied tokenized US Treasuries through Broadridge DLR as intraday repo collateral against tokenized euro commercial paper held at Clearstream D7, with end-of-day mobilization into Euroclear's D-FMI for cross-border redeployment. Each FMI runs its own Canton participant node and Daml application. Treasuries, EUR commercial paper, gilts and Eurobonds settle atomically in one Daml transaction spanning all four applications with no bilateral reconciliation; cash legs settle in TARGET2 (EUR) and Fedwire (USD) at end of cycle.

  • Canton Network
  • Daml 3.x
  • Sub-transaction privacy
  • Atomic DvP/PvP
  • ISO 20022 / ISO 11179
  • CSDR / MiCA / DORA
  • SEC Rule 17Ad-22
  • UK FMI rules
  • NBB / FSMA

Why these FMIs and why Canton

These four touch most of the world's settled securities flow. Clearstream and Euroclear together hold roughly EUR 80 trillion in custody; DTCC clears and settles about USD 2.5 quadrillion of US securities transactions a year; Broadridge DLR, live on Canton since June 2021, has processed more than USD 1.5 trillion of intraday repo, with peak days above USD 50 billion. Each has committed production infrastructure to Canton.

Canton's distinguishing property is privacy-preserving atomic composability. One transaction can span independently operated applications, each running its own Daml logic on its own participant, while all sub-transactions commit together or none do and each party sees only what it is authorized to see. A bond settlement at Clearstream and a Treasury delivery at DTCC can settle as one event without either seeing the other's contract. Other enterprise ledgers force a trade-off: a shared global ledger (Ethereum, Besu, Quorum) where everyone sees all data unless zero-knowledge proofs are added at real cost, or bilateral partitioning (Corda) that cannot compose atomically beyond the parties to a single transaction. That is why four institutions whose competitive position depends on confidentiality chose Canton.

The four FMIs also map to four asset classes and regimes. Clearstream's D7 DLT went live in November 2025 issuing EUR debt under the German Electronic Securities Act (eWpG) and EU CSDR. DTCC's ComposerX targets Q2 2026 production for tokenized DTC-custodied Treasuries under SEC Rule 17Ad-22 and CFTC rules. Broadridge DLR is regulated as a US transfer agent and broker-dealer service. Euroclear, a Canton Foundation member and Super Validator, has tokenized gilts, Eurobonds and gold for collateral mobility under NBB supervision and, where applicable, the Luxembourg DLT Pilot Regime. Today, mobilizing Treasury collateral against a euro obligation needs triparty agents, several correspondent legs and hours or days; on Canton it settles in seconds, with each FMI keeping control of its own register.

Topology: participants and the Global Synchronizer

A Canton network is a federation of participant nodes, each owned by a legal entity and storing only contracts on which its hosted parties are stakeholders. Synchronizers order messages and provide finality but only ever handle encrypted payloads addressed to the relevant participants. Regulators (BaFin, SEC, FCA, NBB, ESMA) hold read-only Daml party rights, with a DORA-compliant audit trail and GDPR data minimization.

Participant 1 · EUR debt CSD

Deutsche Börse · Clearstream D7

German CSD supervised by BaFin and the Bundesbank, with ICSD operations under Luxembourg's CSSF. Supplies tokenized EUR commercial paper and short-term debt as collateral and settlement medium. App: ClearstreamD7, Frankfurt/Luxembourg.

Party
clearstream-d7::1220a8f...
Assets
EUR commercial paper, structured notes
Cash leg
TARGET2 / T2S settlement bank
Role
Participant, observer of cross-app DvP
Participant 2 · US securities CSD

DTCC · ComposerX

Central US post-trade FMI: DTC is the national CSD, NSCC the equities CCP, FICC the fixed-income CCP. ComposerX, built with Digital Asset, supplies tokenized Treasuries as high-quality collateral. App: DtccComposerX, Jersey City/Tampa.

Party
dtcc-composerx::1220c4b...
Assets
Treasury notes, bonds, bills
Regulator
SEC (Rule 17Ad-22), CFTC, FRBNY
Cash leg
Fedwire / NSS settlement bank
Role
Participant, Super Validator candidate
Participant 3 · repo platform

Broadridge · Distributed Ledger Repo

NYSE-listed (BR) post-trade processor. Orchestrates the repo itself: agreement template, term, haircut, substitution rights and unwind. App: BroadridgeDLR, New York.

Party
broadridge-dlr::1220e7f...
Regulator
SEC (transfer agent), FINRA
Counterparties
Goldman Sachs, JPMorgan, BNY, Citi and others
Role
Participant, registry for repo terms
Participant 4 · EU/UK collateral CSD

Euroclear · D-FMI

Euroclear Bank (Brussels), the largest ICSD by assets under custody, is supervised by the NBB and FSMA; Euroclear UK & International (formerly CREST) is the UK CSD under FCA and Bank of England oversight. D-FMI tokenizes gilts, Eurobonds and gold. App: EuroclearDFMI.

Party
euroclear-dfmi::12203a2...
Assets
Gilts, Eurobonds, allocated gold
Cash leg
TARGET2, T2S, CHAPS settlement bank
Role
Participant, Super Validator, Foundation member

The Global Synchronizer is run by 13 Super Validators (as of 2026), including Goldman Sachs, DTCC, Broadridge, Euroclear, BNP Paribas, SBI Digital Markets, Tradeweb and Cumberland Labs, under the Global Synchronizer Foundation, a non-profit independent of any participant. It has three components: a sequencer that orders encrypted messages, a mediator that coordinates two-phase commit, and a topology manager that publishes the party-to-participant mapping. Consensus is Tendermint-style BFT with deterministic finality at the sequencer, and a global timestamp. Validator selection, rotation and slashing are governed on-chain through the Canton Coin governance module. An FMI can also run a local synchronizer for intra-application traffic (for example internal D7 settlement) and use the Global Synchronizer only for cross-FMI transactions, keeping control of its own latency, fees and governance.

CounterpartyRoleHosted onFunction
AssetMgrUS LLCUS asset managerGoldman Sachs DAP participantRepo cash provider; pledges nothing, receives EUR commercial paper as a cash equivalent.
EuroDealer SAEuropean broker-dealerBNP Paribas participantCollateral provider; pledges Treasuries (at DTCC) and gilts (at Euroclear) and borrows EUR commercial paper for intraday liquidity.

Daml templates, choices and parties

Solidity describes computation on a replicated state machine and Corda's Kotlin contracts verify state transitions; Daml, created by Digital Asset, describes the rights and obligations of named parties. Each template names signatories (whose authority creates the contract), observers (who see but cannot act) and controllers (who may exercise a given choice). Clauses become choices, signature requirements become signatories, information rights become observer disclosures. At DTCC, UsTreasuryToken is a registered representation of a security that stays in DTC custody under the existing legal structure and the DTCC tokenization rulebook.

-- Daml 3.x: UsTreasuryToken.daml
module DtccComposerX.UsTreasuryToken where

template UsTreasuryToken
  with
    issuer        : Party           -- DTCC
    holder        : Party           -- current beneficial owner
    cusip         : Text            -- CUSIP identifier
    faceAmount    : Decimal         -- USD face value
    maturity      : Date            -- maturity date
    couponRate    : Decimal         -- annualized coupon
    custodian     : Party           -- always DTC
    rulebookHash  : Text            -- SHA-256 of governing rulebook
    regulators    : [Party]         -- SEC, FRBNY observers
  where
    signatory issuer, holder
    observer  custodian, regulators

    key (issuer, cusip, holder) : (Party, Text, Party)
    maintainer key._1

    -- Transfer of beneficial ownership; new holder must authorize
    choice Transfer : ContractId UsTreasuryToken
      with newHolder : Party
      controller holder, newHolder
      do create this with holder = newHolder

    -- Pledge to a Broadridge DLR repo contract; non-consuming so the
    -- token continues to exist but is encumbered by the pledge ref.
    nonconsuming choice PledgeToRepo : ContractId Pledge
      with
        repoCid : ContractId BroadridgeDLR.RepoAgreement
        pledgee : Party
      controller holder
      do create Pledge with
           collateral = self
           pledgor    = holder
           pledgee    = pledgee
           repoRef    = repoCid
           released   = False

Clearstream's template encodes both the security and its issuance and transfer rules under eWpG.

-- ClearstreamD7.EurCommercialPaper.daml
template EurCommercialPaper
  with
    issuer        : Party           -- corporate issuer
    csd           : Party           -- Clearstream Banking AG
    holder        : Party
    isin          : Text            -- ISIN under eWpG registry
    faceAmount    : Decimal         -- EUR face value
    maturity      : Date
    eWpGRegistry  : Text            -- crypto-securities registry ref
    payloadHash   : Text            -- ISO 20022 seev.031 hash
    regulators    : [Party]
  where
    signatory issuer, csd, holder
    observer  regulators

    key (csd, isin, holder) : (Party, Text, Party)
    maintainer key._1

    choice Transfer : ContractId EurCommercialPaper
      with newHolder : Party
      controller holder, csd, newHolder
      do create this with holder = newHolder

    -- Atomic DvP: deliver this CP against a UsTreasuryToken pledge
    -- spans Clearstream + DTCC + Broadridge in a single Daml tx
    choice DeliverAgainstTreasuryPledge : ContractId EurCommercialPaper
      with
        newHolder      : Party
        treasuryPledge : ContractId DtccComposerX.Pledge
        repoAgreement  : ContractId BroadridgeDLR.RepoAgreement
      controller holder, newHolder
      do
        -- exercise verifies the pledge exists and matches the repo
        pledge <- fetch treasuryPledge
        repo   <- fetch repoAgreement
        assertMsg "pledge must back this repo"
          (pledge.repoRef == repoAgreement)
        create this with holder = newHolder

Broadridge holds the repo contract (agreement, term, haircut, repurchase price, substitution and unwind) and references collateral on the other three FMIs by ContractId without copying their state.

-- BroadridgeDLR.RepoAgreement.daml
template RepoAgreement
  with
    cashProvider    : Party         -- AssetMgrUS
    collProvider    : Party         -- EuroDealer SA
    operator        : Party         -- Broadridge
    cashAmount      : Decimal       -- USD cash leg
    cashCurrency    : Text          -- "USD"
    haircut         : Decimal       -- e.g. 0.02 = 2%
    repoRate        : Decimal       -- annualized %
    openTime        : Time
    closeTime       : Time          -- intraday close
    collateralRefs  : [AnyContractId] -- pledged tokens (DTCC, EUC)
    masterAgreement : Text          -- GMRA 2011 reference + hash
    regulators      : [Party]
  where
    signatory cashProvider, collProvider, operator
    observer  regulators

    -- Substitute one collateral piece for another, mid-term
    choice Substitute : ContractId RepoAgreement
      with
        oldRef : AnyContractId
        newRef : AnyContractId
      controller collProvider, operator
      do create this with
           collateralRefs =
             newRef :: filter (/= oldRef) collateralRefs

    -- Unwind: release collateral, return cash + interest
    choice Unwind : ()
      controller cashProvider, collProvider, operator
      do return ()

Euroclear's D-FMI re-pledges a gilt or Eurobond across jurisdictions while the asset record stays on Euroclear's ledger; MobiliseToTriparty does the work.

-- EuroclearDFMI.CollateralMobility.daml
template TokenizedGilt
  with
    csd           : Party           -- Euroclear UK & International
    holder        : Party
    isin          : Text
    faceAmount    : Decimal         -- GBP face value
    maturity      : Date
    regulators    : [Party]         -- FCA, BoE, NBB
  where
    signatory csd, holder
    observer  regulators

    choice MobiliseToTriparty : ContractId TripartyAllocation
      with
        triparty   : Party         -- Euroclear acting as triparty agent
        receiver   : Party         -- collateral receiver
        repoRef    : ContractId BroadridgeDLR.RepoAgreement
      controller holder, triparty
      do create TripartyAllocation with
           gilt = self
           giver    = holder
           receiver = receiver
           agent    = triparty
           repoRef  = repoRef
           releasedAt = None
Authority model

DeliverAgainstTreasuryPledge fetches a contract from the DTCC package. Fetching requires the fetcher to be an observer or stakeholder, and the fetched contract's signatories grant no transitive authority. Cross-FMI atomicity comes from Canton's two-phase commit at the synchronizer, so each FMI's code stays independently auditable and under its own control.

Sub-transaction privacy

When a transaction is submitted, the participant runtime splits it into a tree of sub-transactions, each with its informees (the parties that must see it to validate or be informed). It builds a per-participant view containing only the sub-transactions whose informees it hosts and encrypts each view under the receiving participant's key. The sequencer orders the encrypted blobs and the mediator coordinates commit without decrypting any of them, which is how DTCC, Clearstream and Euroclear settle one operation without seeing each other's books.

Sub-transactionInformeesVisible to participantsHidden from
UsTreasuryToken.PledgeToRepoEuroDealer, Broadridge, DTCC, SEC observerBNP Paribas, Broadridge, DTCCClearstream, Euroclear, AssetMgrUS
RepoAgreement (create)AssetMgrUS, EuroDealer, Broadridge, SEC, FCAGoldman Sachs DAP, BNP Paribas, BroadridgeDTCC, Clearstream, Euroclear (linked refs only)
EurCommercialPaper.DeliverAgainstTreasuryPledgeAssetMgrUS, EuroDealer, Clearstream, BaFin observerGoldman Sachs DAP, BNP Paribas, ClearstreamDTCC, Broadridge, Euroclear (opaque commit only)
TokenizedGilt.MobiliseToTripartyEuroDealer, Euroclear, FCA, BoE, NBB observersBNP Paribas, EuroclearDTCC, Clearstream, Broadridge, AssetMgrUS

Transaction lifecycle: 18 steps

An intraday repo opens in the morning: USD 250 million face of Treasuries pledged through DTCC plus GBP 50 million of gilts mobilized through Euroclear, against EUR 230 million of commercial paper delivered from Clearstream. It unwinds at end of day after a mid-cycle substitution.

#PhaseWhat happensClock
01NegotiationEuroDealer and AssetMgrUS agree terms on Tradeweb: USD 250M cash, 2% haircut, 5.32% annualized, open 09:30 ET, close 15:30 ET, basket of Treasuries and UK gilts; matched and confirmed.T+0s
02NegotiationTradeweb posts an ISO 20022 trea.001 confirmation through its Canton API connector to Broadridge, with the GMRA 2011 reference, economics and Daml party IDs.T+1s
03Pre-settlementBroadridge proposes the RepoAgreement with signatories AssetMgrUS, EuroDealer and Broadridge; Goldman DAP and BNP nodes authorize automatically within pre-set trading limits.T+2s
04Pre-settlementEligibility choice fetches read-only projections of the Treasury and gilt contracts: rating AA or better, maturity 30 years or less, daily price within 0.5% of indicative.T+3s
05Pre-settlementKYC VCs from LSEG Risk Intelligence (US side) and Fenergo (European side) attach as hashes; full VCs travel off-ledger through the Canton Operator API.T+3s
06Atomic settlementBNP's node, for EuroDealer, authors one command with four choices: PledgeToRepo (DTCC), MobiliseToTriparty (Euroclear), DeliverAgainstTreasuryPledge (Clearstream), RepoAgreement.Activate (Broadridge).T+4s
07Atomic settlementBNP splits the transaction into per-informee views, encrypts each under the recipient's TLS-pinned public key and sends one signed message to the sequencer.T+4.1s
08Atomic settlementSequencer assigns a global sequence number and broadcasts; BFT ordering finality in under 500 ms.T+4.5s
09Atomic settlementDTCC, Clearstream, Broadridge and Euroclear decrypt their views and validate in parallel: authorization, haircut math, eligibility, signatures, business rules.T+5s
10Atomic settlementParticipants return signed confirmations to the mediator within the timeout (default 30 s; 5 s here). All positive gives a commit Result; any rejection or timeout rolls everything back.T+5.5s
11Atomic settlementEach participant applies its view: DTCC records the pledge, Clearstream the CP transfer, Euroclear the gilt mobilization, Broadridge the active repo. The four ledgers agree by construction.T+6s
12Cash legAssetMgrUS's custodian BNY Mellon receives an instruction through Broadridge's US payment gateway and sends USD 250M by Fedwire to EuroDealer's USD nostro at JPMorgan Chase; the securities leg is already irrevocable.T+30s
13SubstitutionAt 12:15 ET EuroDealer needs its USD 100M 4.25% 2034 note and exercises Substitute, swapping in USD 102M of the 4.50% 2032 note (post-haircut); one atomic transaction across DTCC and Broadridge.T+2h45m
14UnwindAt 15:30 ET closeTime triggers an unwind proposal that returns the CP, releases the Treasury and gilt pledges, and closes the repo.T+6h
15UnwindSame projection-and-confirm flow across all four ledgers, about 1.5 seconds end to end.T+6h+1.5s
16Cash settleEuroDealer wires USD 250M plus interest (250M × 5.32% × 6/24/365 ≈ USD 9,110) by Fedwire; the GMRA repo is closed operationally and legally.T+6h+30s
17ReportingReports derive from on-ledger events: ESMA SFTR for the European leg via DTCC's GTR, SEC Rule 10c-1a for the US leg.T+6h+5m
18ReconciliationEach FMI reconciles against its legacy DTC, Clearstream, Euroclear and Broadridge books; every change was atomic and signed by all stakeholders, so zero breaks.EOD

The step 06 command composes the four choices into one tree. Either all commit or none do; rollback is at tree level, and no FMI needs to trust another's middleware. Each FMI's Daml package is independently signed and version-pinned in the topology manager, and cross-package fetches require observer status.

-- Authored on BNP's participant on behalf of EuroDealer.
-- Single Daml command, four choices, four FMIs, one atomic commit.
submitMulti [eurodealer, assetMgr] [-- read-as: Broadridge regulators] do

  -- (1) Pledge USD 250M Treasury at DTCC
  pledgeCid <- exerciseCmd treasuryCid PledgeToRepo with
                  repoCid = repoProposalCid
                  pledgee = broadridgeParty

  -- (2) Mobilise GBP 50M gilts at Euroclear
  tripCid   <- exerciseCmd giltCid    MobiliseToTriparty with
                  triparty = euroclearTripartyParty
                  receiver = broadridgeParty
                  repoRef  = repoProposalCid

  -- (3) Deliver EUR 230M CP at Clearstream against the Treasury pledge
  newCpCid  <- exerciseCmd cpCid      DeliverAgainstTreasuryPledge with
                  newHolder      = eurodealer
                  treasuryPledge = pledgeCid
                  repoAgreement  = repoProposalCid

  -- (4) Activate the repo at Broadridge: only signs if 1-3 succeed
  activeRepoCid <- exerciseCmd repoProposalCid Activate with
                      treasuryPledgeRef = pledgeCid
                      giltAllocationRef = tripCid
                      cpDeliveryRef     = newCpCid

  return activeRepoCid

Today the same flow needs a tri-party agent (BNY Mellon or JPMorgan), bilateral SWIFT confirmations among four institutions, several end-of-day reconciliations and a settlement window of hours, with failed substitutions and breaks adding risk and capital cost. Canton compresses it into one atomic operation of about 6 seconds.

Cash leg and Canton Coin

Cash uses conventional RTGS (Fedwire for USD, TARGET2 for EUR) because deposit-token and CBDC infrastructure is still in pilot in both jurisdictions. A dedicated CashToken Daml application on the same network would later make the whole DvP intra-ledger. Canton Coin (CC), the Global Synchronizer's native asset, only meters and pays for sequencing, mediation and storage. Fees are computed deterministically from transaction size and complexity and paid by the submitting participant; Super Validators earn CC for correct validation. The Foundation governs supply on-chain: minting tied to usage growth, burning of unused balances, capped issuance. The FMIs hold CC only as operating reserves for fees, much like a SWIFT membership pre-fund; it is not a settlement asset.

CurrencyToday2026 path2027+ path
USDFedwire RTGS bridgeFedNow API for sub-RTGS valuesWholesale CBDC pilot or tokenized bank deposits as a Daml CashToken
EURTARGET2 RTGS bridgeECB wholesale digital euro pilot (Eurosystem TIPS extension)Tokenized euro deposit token under MiCA Title III, or wholesale CBDC
GBPCHAPS RTGS bridgeBoE RTGS Renewal Programme ISO 20022 linkTokenized sterling (BoE wholesale CBDC pilot, Project Rosalind)

ISO 20022 inside Daml contracts

Each contract stores the SHA-256 hash of a canonicalized ISO 20022 payload held off-ledger in the FMI's message store, so T+1 SFTR, MiFIR and CSDR reporting comes from the same source as the settlement record and the trade-versus-reporting reconciliation disappears.

Daml fieldISO 20022 messagePurpose
RepoAgreement.payloadHashtrea.001 trade confirmationCanonical trade economics for SFTR
UsTreasuryToken.payloadHashseev.031 securities settlementSettlement instruction binding for DTC books
EurCommercialPaper.payloadHashseev.031 + seev.039Settlement and corporate action notification
TripartyAllocation.payloadHashcolr.016 triparty collateralAllocation under the triparty agreement
CashLeg.payloadHashpacs.009 FI-to-FI credit transferRTGS cash settlement instruction

KYC, AML and the Travel Rule

AML duties stay with each FMI: DTCC under the FinCEN Bank Secrecy Act, Clearstream under Germany's GwG and the EU AMLR (in force July 2027), Euroclear under Belgian AML law and the AMLR, Broadridge under FinCEN transfer-agent rules. Each FMI keeps a KycAttestation template signed by its compliance party and the counterparty, held privately on its participant. A cross-FMI proposal exercises the non-consuming VerifyAttestation choice, which returns only a boolean. Travel Rule data moves off-ledger through the Operator API in a Travel Rule Protocol envelope (e.g. TRISA, OpenVASP); its SHA-256 hash is bound to the settlement, and regulators with observer rights can request the envelope through supervision channels and check it against the hash.

Regulation: EU, US, Belgium and the UK

JurisdictionEntitiesRules
European UnionClearstream Banking AG (CSD under CSDR, Reg. 909/2014; BaFin and Bundesbank); D7 runs in the eWpG crypto-securities registry (eWpG of June 2021)CSDR and RTS 2017/389 (settlement discipline, reconciliation, finality); eWpG registry obligations; MiCA only where ARTs or EMTs are touched (pure securities are out of scope); DORA; EU AMLR (2024/1624, July 2027); DLT Pilot Regime sandbox (LU)
United StatesDTC (registered clearing agency under Rule 17Ad-22 and Exchange Act §17A); FICC (Treasury and MBS CCP); Broadridge (SEC transfer agent, SEC/FINRA broker-dealer channels)Rule 17Ad-22 standards including segregation; Treasury clearing mandate (Rule 17ad-22(e)(18), final rule 13 December 2023, phased through 2026); Rule 10c-1a securities loan reporting (compliance January 2026); BSA/FinCEN with SAR filings; OFAC screening at issuance and transfer; Reg SHO where applicable
BelgiumEuroclear Bank (credit institution and CSD; NBB prudential, FSMA conduct)NBB/FSMA prudential rules; CSDR with T+1 from October 2027; Belgian AML Law (2017) until replaced by the AMLR in July 2027; Banking Act (2014) recovery and resolution; DORA
United KingdomGilt leg via Euroclear UK & InternationalBank of England FMI rules; FCA CSDR-equivalent rules retained after Brexit; Uncertificated Securities Regulations 2001 as amended for digital securities; FMI Digital Securities Sandbox; UK MLR 2017; Project Rosalind (BoE/BIS wholesale CBDC API design)

Each regulator holds Daml observer rights over contracts in its perimeter: real-time, read-only, integrity-guaranteed visibility of the same state the supervised entity sees. That is stronger than today's T+1 reporting feeds and answers a long-standing ESMA and SEC concern about post-trade data integrity. No FMI cedes supervisory authority and no party sees data outside its lawful basis.

Governance

BodyDomicileScopeMembers (selected)
Global Synchronizer FoundationSwitzerland (non-profit)Synchronizer protocol, fees, validator slashing13 Super Validators including Goldman, DTCC, Broadridge, Euroclear, BNP, SBI, Tradeweb, Cumberland
Canton FoundationSwitzerlandNetwork standards, Daml package signing, interoperability, Canton Coin parametersGoldman Sachs, DTCC, Broadridge, Euroclear, BNP Paribas, Deutsche Börse, Digital Asset
Per-application governanceEach FMI's homeApplication rulebook, asset registriesClearstream, DTCC, Broadridge, Euroclear

Super Validator selection, parameter changes and protocol upgrades are voted through on-chain governance contracts written in Daml.

Canton-specific risks

  • Synchronizer outage. If BFT quorum is lost (more than f Byzantine failures among the 13), nothing new commits. Local synchronizers keep intra-application flows running; cross-FMI flows pause but cannot half-settle. Foundation SLA target: 99.95% per quarter.
  • Participant compromise. Keys are rotated and revoked through the topology manager with multi-signature approval from the FMI's governance and the Canton Foundation; affected contracts can be quarantined by a choice that needs the regulator observer's signature.
  • Package version skew. Transactions are pinned to package hashes, so every affected participant must install an upgrade before old contracts retire; the Canton Foundation runs the upgrade ceremony.
  • Stuck in flight. A mediator timeout rolls the transaction back; pending items such as pledges can be released by a time-bounded Cancel choice after a 24-hour expiry with no counterparty action.
  • Recovery and resolution. DTCC stays under Title VIII of Dodd-Frank, Clearstream and Euroclear under the EU CCPR/CSDR resolution regime, Broadridge under SEC Reg SCI as a critical service provider. Observer rights give resolution authorities a real-time authoritative book of positions.

Canton sources: Canton institutional partner registry (canton.wiki/learn/canton-institutional-partners) and Foundation member list (canton.network), retrieved April 2026; Broadridge DLR statements and Q4 2025 earnings disclosures; Digital Asset, "Canton Network Architecture Whitepaper" (2024) and Daml documentation (docs.digitalasset.com/build/3.5); Clearstream, "D7 DLT: Clearstream Launches Tokenized Securities Platform", 4 November 2025; Canton Network, "DTCC and Digital Asset Partner to Tokenize DTC-Custodied U.S. Treasury Securities on the Canton Network", 17 December 2025; Digital Asset and Euroclear, "Unlocking Collateral Mobility through Tokenization: Gilts, Eurobonds and Gold" (2024 pilot whitepaper) and "Digital Asset and Euroclear Start First Project Phase", 25 February 2025; Global Synchronizer Foundation governance documentation (2025–2026; Super Validator list as of Q1 2026) and Canton Coin economic specification v1.x (2024–2026). The Daml shown is illustrative and simplified; production code adds substantially more validation, error handling and upgrade scaffolding, and real deployments differ by each FMI's architecture, rulebook and supervisor.

Back to comparison
R3 Corda · EUR/AED

R3 Corda: two European banks and a UAE bank

A German corporate pays a Dubai supplier. BankFR (Frankfurt) originates and issues EUR tokens, BankNL (Amsterdam) is the EUR liquidity node and FX oracle, and BankAE (Dubai, ADGM) receives and redeems in AED. Three participant nodes and a BFT notary cluster run Corda 4.x/5.x Enterprise with Corda Token SDK FungibleToken states, Kotlin CorDapps and AMQP point-to-point messaging, with the pacs.008 carried inside token metadata.

  • Corda Enterprise
  • Corda Token SDK
  • CorDapp / Kotlin
  • pacs.008
  • MiCA
  • CBUAE PTSR
  • ADGM FSRA
  • DORA

Why this corridor and Corda

EUR/AED is one of the largest routes with no production tokenized A2A network. Europe–UAE trade exceeded $50 billion a year as of 2024, concentrated in energy, real estate, logistics and professional services, on correspondent rails that are costly, slow and squeezed by de-risking at both ends. UAE banks have explicit licensing paths for deposit-token infrastructure under the CBUAE Payment Token Services Regulation (PTSR, issued June 2024, in force August 2025) and ADGM FSRA frameworks; the UAE regime is designed around programmable settlement on permissioned ledgers.

  • AMQP point-to-point messaging means each bank sees only the states it is party to. Bilateral privacy is a legal requirement under GDPR and MiCA confidentiality obligations in the EU and ADGM data protection rules in the UAE.
  • Kotlin/JVM CorDapps map onto deposit-token payment semantics: explicit authorization by all signers, deterministic finality once the notary signs, and X.509 legal-entity identity.
  • Corda has the widest documented production record in regulated networks: SIX Digital Exchange, HQLAx, the UK Regulated Liability Network, and wholesale CBDC pilots including Project Aber.
  • R3's European footprint (SDX under the Swiss DLT Act, Euroclear D-FMI, the UK RLN pilot with Barclays, HSBC, Lloyds and others) and its work with CBUAE, ADGM FSRA and DFSA sandboxes shorten approval for new corridors.

Topology and nodes

Four Corda nodes (three participants and a notary cluster), a shared network map service (X.509 identity registry and CorDapp versions), and optional bridges to SWIFT and to TARGET2/UAE RTGS. No bank is hosted by R3 or any single third party.

Node A · originating bank

BankFR · Frankfurt

Licensed by BaFin; within MiCA where it issues e-money tokens under Title III; DORA-compliant since January 2025. Runs Corda Enterprise 4.x in Frankfurt and mints EUR FungibleToken states against its reserves.

X.509
O=BankFR, L=Frankfurt, C=DE
Vault
EUR FungibleToken
HSM
Thales Luna 7
DB
PostgreSQL 14
AMQP
Apache Artemis (in-node)
CorDapps
PaymentInitiatorFlow, AMLComplianceCorDapp
Links
BaFin reporting gateway, TARGET2
Node B · liquidity node

BankNL · Amsterdam

Licensed by De Nederlandsche Bank; MiCA and DORA. Originates nothing here; holds surplus EUR token positions for intraday liquidity and hosts the FX oracle CorDapp.

X.509
O=BankNL, L=Amsterdam, C=NL
Vault
EUR FungibleToken (liquidity pool)
CorDapp
FXOracleResponder (EUR/AED spot)
DB
PostgreSQL 14
Links
ECB/DNB reporting, TARGET2
Node C · receiving bank

BankAE · Dubai (ADGM)

Incorporated in ADGM and licensed by the FSRA as a Deposit-Taking Institution with digital asset permissions; also holds a CBUAE Payment Token Services licence for dirham payment tokens under the PTSR. Issues and redeems AED tokens, crediting AED on-ledger at the spot rate.

X.509
O=BankAE, L=Dubai, C=AE
Vault
AED FungibleToken
HSM
AWS CloudHSM
DB
PostgreSQL 14
CorDapps
PaymentResponderFlow, FXConversionCorDapp
Links
UAE RTGS (CBUAE)

The notary cluster is Corda's only consensus mechanism. It confirms that the input states a transaction consumes are unspent and issues a timestamped signature that makes the transaction irrevocable, seeing only state references and identifiers. Five nodes run a BFT-SMaRt variant with a 3-of-5 quorum, tolerating one Byzantine fault: two in EU-regulated cloud zones, two in UAE zones, one in a neutral location such as Switzerland. The operator must be jurisdictionally neutral or jointly governed, typically a consortium entity (as SDX runs its own notary), a joint venture or a regulated trust service provider.

CorDapp: states, contracts and flows

The payment CorDapp has three modules (states and contracts, workflows, and compliance for KYC attestation checks and ISO 20022 validation), packaged as JVM .jar files deployed identically to every node. A state is an immutable shared fact; it is never modified, only consumed and replaced.

// EUR deposit token: issued by BankFR, owned by BankAE after transfer
data class EurDepositToken(
    override val amount: Amount<IssuedTokenType>,   // e.g. 5,000,000 EUR, issued by BankFR
    override val holder: AbstractParty,              // current holder (changes on transfer)
    val iso20022Payload: String,                     // pacs.008 XML payload (base64 encoded)
    val kycAttestation: SecureHash,                  // hash of originator KYC attestation VC
    val paymentReference: UniqueIdentifier,           // end-to-end payment reference (UETR)
    val settlementCycle: String,                     // "INTRADAY" or "EOD"
    override val participants: List<AbstractParty>
) : FungibleToken

// FX obligation: created when BankAE commits to deliver AED against EUR
data class FxObligationState(
    val eurAmount: Amount<IssuedTokenType>,           // EUR leg
    val aedAmount: Amount<IssuedTokenType>,           // AED leg (calculated from oracle rate)
    val fxRate: BigDecimal,                          // EUR/AED spot rate from oracle
    val rateTimestamp: Instant,                      // when rate was signed by oracle
    val obligor: Party,                               // BankAE (owes AED)
    val beneficiary: Party,                           // BankFR (receives AED equivalent)
    val linearId: UniqueIdentifier,
    override val participants: List<AbstractParty>
) : LinearState

Every node verifies contract rules locally before signing.

class EurDepositTokenContract : Contract {
    companion object { const val ID = "com.postoaklabs.a2a.contracts.EurDepositTokenContract" }

    override fun verify(tx: LedgerTransaction) {
        val cmd = tx.commands.requireSingleCommand<Commands>()
        when (cmd.value) {
            is Commands.Issue -> {
                // Only the issuer bank (BankFR) can mint tokens
                require(tx.inputs.isEmpty()) { "Issue: no inputs" }
                require(tx.outputs.size == 1) { "Issue: exactly one output" }
                val out = tx.outputsOfType<EurDepositToken>().single()
                require(out.amount.quantity > 0) { "Issue: positive amount" }
                require(cmd.signers.contains(out.amount.token.issuer.party.owningKey))
                    { "Issue: signed by issuer" }
                require(out.iso20022Payload.isNotBlank()) { "Issue: pacs.008 payload required" }
                require(out.kycAttestation != SecureHash.zeroHash) { "Issue: KYC attestation required" }
            }
            is Commands.Move -> {
                // Holder signs the move; input and output amounts must balance
                val inputs  = tx.inputsOfType<EurDepositToken>()
                val outputs = tx.outputsOfType<EurDepositToken>()
                require(inputs.sumTokenStateAndRefs() == outputs.sumTokenStates())
                    { "Move: amounts balance" }
                require(cmd.signers.containsAll(inputs.map { it.holder.owningKey }))
                    { "Move: signed by holder" }
            }
            is Commands.Redeem -> {
                // Redemption burns the token; signed by both holder and issuer
                require(tx.outputs.isEmpty()) { "Redeem: no outputs" }
                require(cmd.signers.containsAll(
                    tx.inputsOfType<EurDepositToken>().flatMap {
                        listOf(it.holder.owningKey, it.amount.token.issuer.party.owningKey)
                    }
                )) { "Redeem: signed by holder and issuer" }
            }
        }
    }
    interface Commands : CommandData {
        class Issue   : Commands
        class Move    : Commands
        class Redeem  : Commands
    }
}

Flows orchestrate each protocol over encrypted point-to-point AMQP; no other node sees flow messages.

FlowInitiatorRespondersPurpose
PaymentInitiatorFlowBankFRBankAE, notaryMints EUR token with ISO 20022 payload and KYC attestation; starts transfer to BankAE.
FXOracleQueryFlowBankFRBankNL (oracle)Requests a signed EUR/AED spot rate.
FxObligationCreateFlowBankFRBankAE, notaryCreates the FxObligationState committing BankAE to deliver AED at the oracle rate.
AtomicPvPSettlementFlowBankFRBankAE, notaryOne notary-approved transaction moving EUR (BankFR to BankAE) and AED (BankAE to the beneficiary account).
TokenRedemptionFlowBankAEBankFR (issuer), notaryBurns transferred EUR tokens after RTGS net settlement; BankAE credits local AED.
ComplianceAttestationFlowBankFRBankAEExchanges originator and beneficiary VCs before any token is minted (FATF R.16).
RtgsConfirmationFlowBankNLBankFR, BankAEAnnounces TARGET2 and UAE RTGS confirmations at cycle end; triggers vault cleanup.

Transaction lifecycle: 16 steps

Steps 1–11 complete on-ledger in under 60 seconds; steps 12–16 run intraday or end-of-day.

#StepCorda-specific detailTiming
01Instructionpacs.008 via BankFR's corporate API: Frankfurt debit account, Dubai supplier credit account, EUR amount, value date, beneficiary, purpose code.<1 s
02Travel RuleBankFR's compliance CorDapp screens, then ComplianceAttestationFlow sends a VC (LEI, jurisdiction, risk tier, sanctions-clear) over AMQP; BankAE replies with a beneficiary VC. Satisfies EU TFR and CBUAE AML/CFT.1–3 s
03FX rateFXOracleQueryFlow to BankNL, which builds a signed FXRateState from its Bloomberg/Reuters feed with a 90-second window; BankFR verifies the signature.0.5–2 s
04FX commitmentFxObligationCreateFlow puts an FxObligationState in both vaults; BankAE signs in FxObligationResponderFlow and the notary finalizes. Both banks now hold a binding on-ledger commitment before either leg settles.2–5 s
05MintToken SDK IssueTokens creates EurDepositToken (e.g. EUR 5,000,000; issuer and initial holder BankFR) with the base64 pacs.008 and the VC hash, signed by BankFR's HSM key. The fiat stays in BankFR's reserve account.1–2 s
06ProposalBankFR builds one transaction moving EUR to BankAE and AED from BankAE to the recipient account, sent over AMQP to BankAE only.<1 s
07Counterparty checkBankAE's PaymentResponderFlow runs EurDepositTokenContract and FxObligationContract itself: payload validates against the pacs.008 XSD, KYC hash matches step 2, rate is from the oracle and in window, amounts match the obligation. Then BankAE signs.1–3 s
08NotarisationBankFR submits to the notary, which checks that the EUR token, AED token and FX obligation are unconsumed, seeing only state hashes; 3 of 5 sign in one round of BFT-SMaRt communication.1–4 s
09FinalityBankFR distributes the notarised transaction; both vaults update together (EUR consumed at BankFR, new EUR held by BankAE, AED consumed, obligation settled). Irrevocable.<1 s after signature
10Beneficiary creditCorda RPC delivers the pacs.008 to core banking middleware (e.g. Temenos T24 or Oracle FLEXCUBE), which posts the AED credit directly against the open invoice.1–5 s
11Audit trailPayload, KYC hash, oracle rate and notary signature live in both vaults. BankFR's compliance module reports to BaFin and for ECB statistics; BankAE's to the CBUAE and ADGM FSRA.Automated
12NettingBankNL's liquidity coordination CorDapp nets EUR between BankFR and BankNL and the AED position between BankAE and the EUR-side banks.Every 4 h or on demand
13TARGET2BankFR and BankNL settle net EUR; BankNL's RtgsConfirmationFlow broadcasts the confirmation.TARGET2 hours
14UAE RTGSBankAE settles net AED in dirham central bank money, a direct CBUAE liability; final legal settlement of the AED obligations.UAE RTGS hours
15RedemptionBankFR runs TokenRedemptionFlow on the EUR tokens held by BankAE; states are consumed with no outputs.Post-RTGS
16ReconciliationThe pacs.008 travelled inside the token from step 5, so both core systems match straight through.<2% exceptions

FX: EUR/AED on-ledger

The AED is pegged to USD at 3.6725, so EUR/AED tracks EUR/USD and is not deep at all hours. Corda handles external data through the oracle pattern: BankNL signs the rate, the signature is embedded in the transaction, and any node can verify which rate was attested and when.

// FX Oracle data structure: signed by BankNL
data class SignedFXRate(
    val base: Currency,              // EUR
    val quote: Currency,             // AED
    val mid: BigDecimal,             // e.g. 3.9412 (EUR/AED mid at time of signing)
    val bid: BigDecimal,             // buy side
    val ask: BigDecimal,             // sell side
    val timestamp: Instant,          // oracle signing time (UTC)
    val validUntil: Instant,         // timestamp + 90 seconds validity window
    val oracleSignature: DigitalSignature  // BankNL node key signature over above
)

Conversion happens on-ledger at redemption by BankAE, which keeps its dealing spread over the oracle mid; BankFR keeps the origination fee.

Worked example

A €5,000,000 payment. Oracle mid 3.9412; BankAE spread 15 bp gives 3.9412 × 1.0015 = 3.9471, so the supplier receives AED 19,735,500. BankAE FX revenue is AED 29,250 (about €7,411 at mid); BankFR's fee is €2,500 (5 bp). All-in cost to the corporate is about 12.5 bp against roughly 2.5–3.5% through correspondents.

Notary design for cross-jurisdiction finality

In one country the network operator or a market infrastructure usually runs the notary. Across the EU and UAE, governance must stop either jurisdiction from unilaterally halting or reversing transactions while meeting both legal finality regimes. With 3-of-5 and a 2/2/1 geographic split, one node can be offline, compromised or under a single jurisdiction's order and the other four still reach quorum. Likely operators: a jointly governed consortium vehicle (like SDX's notary for Swiss DLT Act settlements), a trust service provider licensed in both the EU (eIDAS-qualified) and the UAE (ADGM), or R3 notary-as-a-service under agreements stating when a jurisdiction may exercise authority.

Governance constraint

Because the notary sees only state hashes, an order directed at it cannot extract transaction data; at most it can stop the notary signing new transactions. The participation agreement must define what counts as a lawful order to cease operating and what happens to in-flight transactions during an outage. This is legal drafting work and must be settled before deployment.

ISO 20022 inside the token

The pacs.008 travels inside the token state from minting. An MT103 degrades along the correspondent chain and truncates names to 35 characters; here the XML is cryptographically bound to the token and arrives at BankAE intact and machine-readable, already in its vault when the token lands. BankAE validates it against the XSD at step 7 before signing. The sample uses pacs.008.001.08, settlement method INDA (instructed agent), MsgId BANKFR-20260415-00012345, created 2026-04-15T09:32:11Z, UETR 550e8400-e29b-41d4-a716-446655440000, EUR 5,000,000.00 from Frankfurt Machinery GmbH (Mainzer Landstrasse 58, Frankfurt am Main; LEI 5299000CRDX2KFHPD419) to Dubai Trading LLC (LEI 984500E8MRZXBX7V1G62), purpose TRPT, invoice INV-2026-DXB-4471, which feeds BankAE's receivables matching. Both LEIs resolve against GLEIF.

KYC, AML and the Travel Rule

BankFR answers to BaFin and the ECB, BankAE to the ADGM FSRA and CBUAE. ComplianceAttestationFlow uses the W3C Verifiable Credentials model: BankFR's VC (name, address, LEI, risk tier, sanctions status) is signed with its node key; BankAE's ComplianceAttestationResponderFlow checks the signature and the LEI at GLEIF and replies. Both VC hashes sit in the token state, proving Travel Rule data was exchanged before minting.

RequirementJurisdictionHandling on Corda
AML/CFT screeningEU (AMLD6), CBUAE AMLStructured name and LEI screened at step 1 (originator) and step 7 (beneficiary).
Travel RuleEU TFR, CBUAE/ADGMVC exchange at step 2; hashes in token state; IVMS-101.
SanctionsEU Sanctions Regulation; UN and UAE listsIndependent checks on LEI and structured name.
ReportingECB, CBUAEEach bank's compliance module reports from the vault record with the full pacs.008.
Data residencyGDPR, ADGM Data ProtectionPersonal data moves only between BankFR and BankAE; each stores vault data in its own regulated zone.
DORAEUBankFR and BankNL classify the node as critical ICT; R3 must meet DORA ICT third-party requirements.

Regulation: EU and UAE

MiCA and the PTSR are broadly compatible (1:1 reserve backing, at-par redemption, AML/CFT) but differ in implementation details that shape the CorDapp. On the EU side BankFR's token falls under CRD/CRR per the EBA report, with DORA reporting to BaFin or DNB and R3 owing resilience guarantees and audit rights (see shared rules).

  • CBUAE PTSR (June 2024; in force August 2025): only licensed Dirham Payment Tokens may be used for domestic payments in the UAE, outside free zones. BankAE needs a PTSR licence; the rules require 1:1 AED reserves, redemption at par on demand and AML/BSA compliance.
  • ADGM FSRA: BankAE holds digital asset permissions under the Financial Services and Markets Regulations. ADGM applies English common law, giving strong enforceability for CorDapp-governed obligations, and runs the RegLab sandbox, which has worked with blockchain payment infrastructure. A bank in Dubai's DIFC would instead fall under the DFSA, with comparable but distinct requirements; the CBUAE regulates onshore.
  • FX controls: cross-border AED payments need CBUAE authorization and FX reporting. The CBUAE FIT (Financial Infrastructure Transformation) Programme, launched February 2023 and 85% complete by January 2025, includes a wholesale CBDC programme; the first cross-border Digital Dirham payment (AED 50 million via mBridge, with China) took place in January 2024.
  • UAE RTGS: the CBUAE rulebook, Chapter 3 (Cross-Border Payments), requires AML/CFT documentation for every transaction above AED 3,500 (about $950).
Compatibility finding

Both regimes require 1:1 fiat backing, at-par redemption, AML/CFT and prudential supervision. The EUR token is a bank deposit token under EU banking law and BankAE's AED activity is PTSR-licensed, so the design meets all four on both sides, creates no new regulatory category, and falls under no stablecoin regulation.

RTGS net settlement and liquidity

A €5M correspondent payment needs €5M pre-funded along the Frankfurt–Dubai chain. Here the supplier is credited within 60 seconds and RTGS settles only the net. If BankFR sends €20M to Dubai and BankAE sends €12M to Frankfurt in a 4-hour cycle, the net is €8M against €32M gross; at 5%, about €1.2M a year in foregone nostro yield is freed.

LayerMechanismAssetTimingFinality
On-ledger (Corda)Atomic PvP, notary-finalizedEUR deposit token (BankFR liability) against AED deposit token (BankAE liability)<60 sTechnical finality immediately; legal finality on RTGS confirmation
TARGET2Intraday net, pacs.009ECB reservesEvery 4 h in the TARGET2 windowFinal in ECB money
UAE RTGSIntraday net, CBUAE formatCBUAE reservesUAE RTGS windowFinal in CBUAE money

UAE RTGS runs on Gulf Standard Time (UTC+4). The two systems overlap for 3–4 hours (about 07:00–10:00 CET, 10:00–13:00 GST); the settlement CorDapp queues UAE RTGS instructions to the next GST business day when a cycle falls outside it, and intraday cycles are normally scheduled inside the overlap.

Corda-specific risks

  • Governance. The shared questions apply to the payment CorDapp's upgrade roadmap and liability for its bugs.
  • Legal finality. Corda networks are not yet SFD-designated; the corridor needs engagement in both the EU and UAE.
  • Mint key. BankFR's minting HSM is the single highest-value target; physical security at the Frankfurt and Dubai data centers must meet FIPS 140-2 Level 3, and multi-signature minting adds operational complexity.
  • Developer talent. About 2,500 Corda developers have production financial-services experience, against roughly 23,000 EVM/Solidity and 8,000 Fabric developers. Senior Corda engineers cost $150,000–$300,000 a year; a three-bank network needs 3–5 per bank plus 2–3 shared network engineers over a 24–36 month build and stabilization period.
  • Sequencing for BankAE. Confirm the PTSR licence covers AED deposit-token issuance and cross-border tokenized settlement, engage the ADGM FSRA on the CorDapp architecture, complete CBUAE FIT Programme integration, then go live. EU banks follow the shared sequence with BaFin or DNB.

Corda sources: R3 CBDC hub, digital-currencies-hub.r3.com/cbdcs; CBUAE rulebook, rulebook.centralbank.ae; TRM Labs, "Global Crypto Policy Review Outlook 2025/26"; Global Government Finance, "UAE aims to launch retail CBDC this year" (April 2025); Ledger Insights, "UAE to launch CBDC in Q4 2025" (March 2025); Chambers Practice Guides, "Fintech 2025, UAE"; Middle East Briefing, "UAE Fintech 2025 Regulatory Review"; R3 documentation, docs.r3.com; Xoriant, "Understanding Corda Architecture" (March 2026); Corda Token SDK design; R3 on 20+ regulated TradFi networks live with over $10 billion in on-chain RWAs, r3.com/corda (press release February 2025); Brenden, "R3 Corda Settler Tutorial" (2019), github.com/corda/corda-settler, whose XRP settlement reference is adapted here for bank-to-RTGS settlement. Further Corda deployments: HQLAx (backed by BNP Paribas, Goldman Sachs, HSBC, JPMorgan, UBS), the UK RLN pilot (2023), Wells Fargo Coin (internal USD deposit token), Progmat Coin (MUFG, Japan) and the World Bank's 2023 digital bond settled on Corda via Euroclear D-FMI; Blockchainmagazine.com (May 2025) aggregates examples and should be checked against primary sources.

Back to comparison
Hyperledger Fabric · EUR/SAR

Hyperledger Fabric: two European banks and a Saudi bank

A German mid-market maker of precision machine tools pays EUR 4,820,000 to a contracting authority in Riyadh for a desalination project milestone. Its Munich house bank has no direct SAR correspondent account, so it relies on a Paris affiliate that runs a SAR nostro at the Riyadh receiver; all three are members of one permissioned Fabric 2.5 LTS network with a five-node Raft ordering service, four channels, Go chaincode, the Fabric Token SDK, CouchDB world state and FIPS 140-2 HSMs. SAR has been pegged at 3.75 per USD since 1986 and EUR/SAR derives from the ECB euro reference rate against the dollar. At an indicative mid of 4.0825 with a 6 bp spread to the taker, the SAR notional is about SAR 19,683,765.

  • Fabric 2.5 LTS
  • Fabric Token SDK
  • Go chaincode
  • Raft
  • pacs.008
  • MiCA
  • SAMA AML/CFT
  • DORA
  • TFR 2023/1113

Very few EU institutions hold direct riyal accounts and bilateral nostros are costly, so the EU–GCC relationship is structurally underbanked. A permissioned corridor lets a small group of correspondents net continuously and settle once a day without public-network infrastructure and without exposing counterparty identity outside the consortium.

Organizations, peers and orderers

Originator · Org1MSP · Munich

Bayerische Handelsbank AG

House bank of the payer. Holds EUR commercial bank money on-ledger as EUR-CBM tokens, debits the corporate in core banking and submits the proposal.

Identity
Org1MSP · BIC BHDLDE2M
Nodes
peer0.de · peer1.de · ca.de
HSM
Thales Luna 7
RTGS
TARGET2 (Bundesbank)
Reg
BaFin · MiCA · DORA
Liquidity · Org2MSP · Paris

Banque Méridienne SA

Pan-European correspondent. Runs the SAR nostro at the receiver, quotes EUR/SAR into the oracle and endorses both legs as liquidity counterparty.

Identity
Org2MSP · BIC BMRDFRPP
Nodes
peer0.fr · peer1.fr · ca.fr
HSM
Utimaco SecurityServer
RTGS
TARGET2 (Banque de France)
Reg
ACPR · MiCA · DORA
Beneficiary · Org3MSP · Riyadh

Bank Al-Madinah

Issues SAR-CBM tokens backed one-for-one by SAMA settlement balances, credits the beneficiary on final commit and sends the MT/MX confirmation upstream.

Identity
Org3MSP · BIC ALMDSARI
Nodes
peer0.sa · peer1.sa · ca.sa
HSM
IBM Crypto Express CCA
RTGS
SARIE (SAMA)
Reg
SAMA AML/CFT · PSP Regulations

Each bank runs one organization with two endorsing peers (active/standby) and one Fabric CA; peers expose Fabric Gateway over mTLS to the bank's payment hub and keep world state in CouchDB for rich JSON queries on payment metadata. The deployment runs Fabric 2.5.x LTS, maintained by IBM and the Linux Foundation. Container images are pinned by sha256 digest and signed with cosign; chaincode ships as a lifecycle v2 external-builder artefact approved under the channel's lifecycle endorsement policy.

The etcd/Raft ordering cluster has five nodes so no jurisdiction can censor the channel alone: orderer0.de, orderer1.fr and orderer2.sa (one per bank) plus orderer3.tech-fra and orderer4.tech-bah, run by an independent technical operator in a Frankfurt colocation facility and a Bahrain regional data centre. It is configured with quorum 3 (labelled f=1); as a crash-fault protocol, five Raft nodes keep making progress with up to two down. Logs are mirrored to WORM storage at each site. Block cutting: BatchTimeout=200ms, BatchSize.MaxMessageCount=500, BatchSize.AbsoluteMaxBytes=10MB.

Identity and MSP

Every peer, orderer, client and chaincode caller authenticates with an X.509 certificate from an organization's Membership Service Provider. Each bank runs an isolated CA whose root sits in the channel MSP stanza; there is no cross-signed root, and revocations propagate through periodic CRL updates committed by channel admins via UpdateConfig. Identities are partitioned by Organizational Unit, with a custom treasury attribute gating Mint and Redeem and a role=approver attribute driving dual control.

IdentityOU / attributesPermitted actions
peerOU=peerEndorse, gossip, commit blocks
ordererOU=ordererSequence and cut blocks (Raft)
treasury operatorOU=client, treasury=true, role=approverMint, Redeem; second signature on settlement window
payment gatewayOU=client, gateway=trueSubmit Transfer, query world state
compliance officerOU=client, compliance=trueRead the Travel Rule private data collection
auditor (regulator)OU=client, audit=true, jurisdiction=DE/FR/SARead-only on the bank's namespace

Keys live in FIPS 140-2 Level 3 HSMs reached through the PKCS#11 BCCSP. Treasury operators use smart-card-backed certificates valid for 12 hours, reissued by an online enrolment service that checks the bank's identity and access management directory first.

Channels and private data collections

Channels are independent ledgers ordered by the same orderers but isolated at the gossip layer. The shared eursar-corridor channel carries the token, FX oracle and netting contracts. Three bilateral channels (de-fr-bilateral, fr-sa-bilateral, de-sa-bilateral) carry position reconciliation and bilateral repo traffic hidden from the third bank. On the corridor channel, Travel Rule data and the ISO 20022 body sit in a private data collection visible only to the originating and beneficiary banks; its hash goes on the channel ledger so the liquidity bank can verify integrity.

# collections_config.json: registered at chaincode install
[
  {
    "name": "PDC_TR_DE_SA",
    "policy": "OR('Org1MSP.member','Org3MSP.member')",
    "requiredPeerCount": 1,
    "maxPeerCount": 2,
    "blockToLive": 1095,           # ~3 years; AML retention minimum
    "memberOnlyRead": true,
    "memberOnlyWrite": true,
    "endorsementPolicy": {
      "signaturePolicy": "AND('Org1MSP.peer','Org3MSP.peer')"
    }
  }
]

The token contract's endorsement policy is AND(OutOf(2,'Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')): any two of three banks must endorse. The Validation System Chaincode enforces it at commit, after the orderer cuts the block and before peers update world state.

Go chaincode and atomicity

Three chaincodes run on the corridor channel, written in Go on contract-api-go: cbm-token (per-currency commercial bank money), fx-oracle (EUR/SAR mids signed by the liquidity provider) and a2a-router (the atomic construct tying a debit in one currency to a credit in the other).

// cbm-token/contract.go: relevant excerpts

type TokenContract struct { contractapi.Contract }

type Account struct {
    Owner    string  `json:"owner"`     // MSP-id::CN
    Currency string  `json:"ccy"`       // "EUR" | "SAR"
    Balance  uint64  `json:"bal"`       // minor units
    Frozen   bool    `json:"frozen"`
}

func (t *TokenContract) Transfer(
    ctx contractapi.TransactionContextInterface,
    from, to, ccy string, amount uint64, ref string,
) error {

    // 1. caller must own the debit account
    caller, _ := cid.GetID(ctx.GetClientIdentity())
    if caller != from && !hasAttr(ctx, "treasury") {
        return errors.New("unauthorized debit")
    }

    // 2. travel-rule witness must be present in transient map
    tMap, _ := ctx.GetStub().GetTransient()
    trHash, ok := tMap["travel_rule_hash"]
    if !ok { return errors.New("missing travel-rule witness") }

    // 3. atomic debit/credit against world state
    src, _ := getAccount(ctx, from, ccy)
    dst, _ := getAccount(ctx, to,   ccy)
    if src.Frozen || dst.Frozen { return errors.New("frozen") }
    if src.Balance < amount   { return errors.New("insufficient") }
    src.Balance -= amount; dst.Balance += amount
    putAccount(ctx, src); putAccount(ctx, dst)

    // 4. emit event for off-chain payment hub
    ev := TransferEvent{From: from, To: to, Ccy: ccy, Amt: amount,
        Ref: ref, TRHash: hex.EncodeToString(trHash)}
    payload, _ := json.Marshal(ev)
    return ctx.GetStub().SetEvent("Transfer", payload)
}

a2a-router puts a EUR Transfer and a SAR Transfer in one proposal, both conditional on an fx-oracle reading less than 90 seconds old. Fabric applies each transaction atomically against the read-write set from the endorsing peers, so both legs commit or neither does.

Atomicity through MVCC

Fabric runs no two-phase commit. Both writes sit in one transaction's read-write set; if the orderer sequences a conflicting write first, validation marks the transaction MVCC_READ_CONFLICT and discards both legs, and the hub resubmits. Sub-second resubmission succeeds in more than 99.7% of cases at the target 40 TPS per channel.

Token model: Fabric Token SDK

A minimal account model keeps one composite key per (owner, ccy) and serializes all transfers from an account, which becomes a contention bottleneck. The corridor instead uses IBM Research's Fabric Token SDK, a UTXO-style token: each EUR-CBM note is an unspent output bound to its owner by a Pedersen commitment, and transfers consume notes and create new ones. The consortium runs the plaintext fabtoken driver, accepting that amounts are visible to all three members in return for simpler audit; the zkat driver (Idemix and bulletproofs, hiding amounts and owners) is held back for when more banks join and amount confidentiality becomes commercially necessary.

PropertyAccount modelToken SDK (fabtoken)Token SDK (zkat)
State shapeBalance per (owner, ccy)Set of UTXO notesSet of Pedersen-committed notes
ParallelismSerialized per accountParallel across notesParallel across notes
Amount privacyVisible in world stateVisible to all channel membersHidden; balance proven in zero knowledge
AuditabilityDirect readAuditor view via Token SDK roleAuditor view via selective disclosure
Deployed hereNoYes (corridor channel)No (future expansion)

Transaction lifecycle: 16 steps

The on-ledger portion completes in under one second; steps 15–16 are the end-of-day RTGS cycle.

#StepFabric-specific detailClock (CET)
01InstructionSEPA-instant-style instruction through the online portal; IBAN mod-97, BIC ALMDSARI and sanctions checks; internal reference PAY-IN-2026-04-21-887412.10:14:02.118
02Travel Rule witnessHub builds pacs.008.001.10 with originator and beneficiary name, address, account and BIC, and SHA-256-hashes the body into a witness for the transient map, which never lands on the public ledger.10:14:02.244
03FX quoteEvaluateTransaction on fx-oracle returns mid 4.0825 and ask 4.0833 (6 bp), signed by Org2's treasury identity, timestamped by the last block, valid 90 s.10:14:02.281
04ProposalFabric Gateway builds one a2a-router:AtomicSwap proposal with both legs and the quote; the Travel Rule hash rides in the transient map, gossiped only between Org1 and Org3 peers.10:14:02.310
05Endorsementpeer0.de then peer0.sa simulate and return signed read-write sets; Org2 is asked in parallel for resilience, though two endorsements satisfy the policy.10:14:02.387
06Private dataDuring simulation the full pacs.008 is written to PDC_TR_DE_SA; only its SHA-256 enters the block, enough for Org2's nostro reconciliation.10:14:02.388
07OrderingGateway submits over gRPC; the Raft leader (orderer1.fr) appends and replicates to four followers and schedules the entry on quorum (3).10:14:02.401
08Block cutBlock 884,213 cut at 200 ms or 500 transactions, signed by the leader and gossiped to one peer per organization, which fans out.10:14:02.508
09VSCCSignature check, 2-of-3 endorsement check and MVCC check on read versions (under 50 ms per block); both legs marked VALID.10:14:02.531
10CommitCouchDB updates atomically: Org1 EUR −4,820,000.00, Org2 EUR +4,820,000.00, Org2 SAR −19,683,765.00, Org3 SAR +19,683,765.00; block hash to the channel's LevelDB ledger store. Irrevocable.10:14:02.547
11EventsTransfer events reach each hub through the block-listener API; hubs match by reference and move the instruction from SUBMITTED to SETTLED-ON-LEDGER.10:14:02.549
12DebitCore banking debits the corporate EUR account 4,820,000.00 against a suspense account mirroring token holdings; reference PAY-IN-2026-04-21-887412 / FBR-884213.10:14:02.612
13CreditBank Al-Madinah credits SAR 19,683,765.00, reduces its intraday position against Banque Méridienne in the nostro reconciliation tab, and pushes a SARIE-formatted advice to online banking and SMS.10:14:02.681
14Audit trailOrg1 and Org3 hold the record from block 884,213; the pacs.008 is kept in the PDC for three years; BaFin/ACPR and SAMA records generate automatically.Automated
15NettingThe netting chaincode produces a triangular net per pair; for 21 April 2026, Org1 owes Org2 EUR 12,440,118 and Org2 owes Org3 SAR 8,206,040.17:00:00
16RTGS and burnNet amounts settle in TARGET2 and SARIE; after SAMA and Bundesbank confirm, each hub submits a coordinated Burn, restoring each bank's issuance to its net opening position.17:14 / 18:14 AST

Ordering: Raft now, SmartBFT later

Raft tolerates crashes but not Byzantine behaviour: a malicious orderer could withhold or reorder transactions within the batch timeout, though it cannot forge endorsements or alter committed state. Orderers are therefore spread across three bank sites (Munich, Paris, Riyadh) and two independent operators, with WORM-mirrored logs. Fabric 3.x adds the SmartBFT plug-in (SBFT-CHS) for full Byzantine tolerance; the consortium will migrate once Fabric 3.x reaches IBM enterprise support GA and a six-month parallel run on a staging channel completes. Raft is acceptable meanwhile because the threat model assumes Byzantine endorsing peers, and the 2-of-3 bank endorsement policy is the cryptographic anchor.

Caveat: Raft assumes honest orderers

A coordinated take-over of Raft leadership could censor or reorder transactions within BatchTimeout. Mitigations: jurisdictional diversity of operators, cryptographic chain of custody on orderer logs, and a runbook hot-swap that rebuilds a degraded cluster from any majority subset within 30 minutes.

ISO 20022 pacs.008 in chaincode state

The corridor speaks ISO 20022 internally; both sides are moving cross-border traffic to MX ahead of SWIFT's MT discontinuation milestones. The full pacs.008.001.10 lives in the private data collection so compliance and auditors at the two end banks can reconstruct the payment context; the corridor ledger holds only the hash.

<!-- pacs.008.001.10: abbreviated -->
<FIToFICstmrCdtTrf>
  <GrpHdr>
    <MsgId>BHDLDE2M-20260421-887412</MsgId>
    <CreDtTm>2026-04-21T10:14:02.244+02:00</CreDtTm>
    <NbOfTxs>1</NbOfTxs>
    <SttlmInf><SttlmMtd>CLRG</SttlmMtd>
      <ClrSys><Prtry>FABRIC-EURSAR-CORRIDOR</Prtry></ClrSys>
    </SttlmInf>
  </GrpHdr>
  <CdtTrfTxInf>
    <PmtId><EndToEndId>PAY-IN-2026-04-21-887412</EndToEndId>
            <UETR>5e9c4e8a-2f1b-4b3a-9d0e-1c8f4a7b6d52</UETR></PmtId>
    <IntrBkSttlmAmt Ccy="EUR">4820000.00</IntrBkSttlmAmt>
    <ChrgBr>SHAR</ChrgBr>
    <Dbtr><Nm>Präzision Werkzeug GmbH</Nm>
          <PstlAdr><Ctry>DE</Ctry></PstlAdr></Dbtr>
    <DbtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></DbtrAcct>
    <DbtrAgt><FinInstnId><BICFI>BHDLDE2M</BICFI></FinInstnId></DbtrAgt>
    <CdtrAgt><FinInstnId><BICFI>ALMDSARI</BICFI></FinInstnId></CdtrAgt>
    <Cdtr><Nm>Saudi Water Authority</Nm>
          <PstlAdr><Ctry>SA</Ctry></PstlAdr></Cdtr>
    <CdtrAcct><Id><Othr><Id>SA0380000000608010167519</Id></Othr></Id></CdtrAcct>
    <RmtInf><Ustrd>Desalination plant, milestone 3 of 7</Ustrd></RmtInf>
  </CdtTrfTxInf>
</FIToFICstmrCdtTrf>

The hub canonicalizes the XML with W3C Canonical XML 1.1 and hashes it with SHA-256; the 32-byte result is the trHash field of the transfer event. Any dispute is settled by replaying the private data from either bank's PDC and re-canonicalizing; a mismatch flags tampering.

KYC, AML, sanctions and the Travel Rule

Each bank runs KYC and CDD under its home regime (BaFin GwG, ACPR/AMF, SAMA AML/CFT Rules) and keeps identity in its own KYC vault. The ledger guarantees only that an authenticated gateway with a valid MSP identity attested, at submission, that the customer was screened. The Travel Rule, transposed through the TFR and Article 17 of the SAMA AML/CFT Rules, requires originator name, account, address and identifier plus beneficiary name and account; storing the full pacs.008 in the bilateral PDC satisfies it while Org2 sees only the block and the hash. Gateways screen against their own lists (EU Consolidated List, OFAC SDN where applicable, UN Security Council list, SAMA's domestic list) and assert the result in the transient map as a signed JSON Web Token whose subject is the customer's hashed identifier. The chaincode does not validate the JWT, which would mean sharing keys across the consortium, but rejects any transfer missing the witness and preserves it in the PDC.

Regulation: EU and Saudi Arabia

Neither side mandates daily on-ledger reporting, but each bank's auditor identity reads the corridor channel and its bilateral PDC. EU rules common to the corridors are in the shared pattern; Fabric adds:

  • DORA: each bank lists its Fabric node in its register of ICT third-party providers, and IBM as platform vendor signs a DORA-compliant contractual addendum.
  • BaFin: supervises Bayerische Handelsbank under the KWG; the tokenisation activity is notified under §32 KWG following BaFin's 2024 Merkblatt on crypto-securities business (DLT-based financial infrastructure).
  • ACPR: approved the corridor for Banque Méridienne as a service ancillary to credit institution activity under Art. L.311-2 of the Code monétaire et financier.
  • SAMA: Rules for Bank Account Opening (2023) govern onboarding, CDD and beneficial ownership; under the Payment Services Provider Regulations the corridor counts as ancillary to licensed banking rather than a stand-alone PSP service; the AML/CFT Rules' three-year retention matches the PDC's blockToLive; the Open Banking Framework is not invoked, though the gateway API uses OAuth 2.0 / FAPI 2.0 to ease future integration; Aber informs SAMA's view of permissioned ledgers as viable settlement infrastructure; SARIE provides the central bank money leg.

Net settlement against TARGET2 and SARIE

On-ledger tokens are liabilities of the issuing bank and are not legally final until central bank money moves. At 17:00 CET the netting chaincode produces a multilateral position per currency per bank. For 21 April 2026:

PairCurrencyDirectionNet amountVenue
Org1 → Org2EUROrg1 pays Org212,440,118.42TARGET2
Org2 → Org3SAROrg2 pays Org38,206,040.05SARIE
Org3 → Org1EUROrg3 pays Org11,217,330.18TARGET2

Bayerische Handelsbank sends an MT 202 / pacs.009 to the TARGET2-Bundesbank component for Banque Méridienne's PM account, final on Eurosystem books at 17:14 CET. Banque Méridienne instructs its Riyadh nostro provider to settle through SARIE to Bank Al-Madinah's SAMA settlement account, final at 18:14 AST (15:14 UTC). After both confirmations each hub submits a Burn for the settled amounts, and the next cycle starts at 17:00:01 CET. Gross RTGS settlement of each transfer would defeat the corridor: SARIE and TARGET2 fees and the mismatch in operating hours would make small payments uneconomic. Netting keeps on-ledger speed and finality while cutting central bank transactions to one per bank per currency per day.

Fabric-specific risks

  • Orderer compromise: a compromised majority could censor within BatchTimeout; mitigated by five jurisdictionally diverse orderers, WORM logs and the planned SmartBFT move.
  • HSM key compromise: a stolen treasury credential could mint or burn unbacked tokens; mitigated by dual-control endorsement (two approvers), 12-hour treasury certificates and a real-time issuance cap monitored off-chain against core banking.
  • FX oracle staleness: if the oracle stops, swaps fail; if it misprices, the liquidity provider gains or loses. Chaincode rejects quotes older than 90 seconds and a circuit-breaker disables swaps if the oracle drifts more than 25 bp from the ECB reference rate.
  • MVCC contention: heavy traffic on the same keys raises MVCC_READ_CONFLICT; the UTXO Token SDK spreads load across notes.
  • Settlement failure: if a bank's RTGS leg misses cycle close, no Burn is sent and the tokens remain as a visible obligation; per-bank limits cap the build-up and the next day's cycle absorbs the carry.
  • Chaincode upgrades: lifecycle v2 needs per-organization approval; every upgrade soaks 30 days on a sandbox channel and is gated on a notarised release attestation signed by the consortium technical committee.

Fabric sources: Hyperledger Fabric v2.5 LTS documentation, hyperledger-fabric.readthedocs.io; Androulaki et al., "Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains", EuroSys '18; IBM Research, Fabric Token SDK, github.com/hyperledger-labs/fabric-token-sdk; Ongaro and Ousterhout, "In Search of an Understandable Consensus Algorithm (Raft)", USENIX ATC 2014; SAMA AML/CFT Rules and PSP Regulations, sama.gov.sa; BaFin Merkblatt zum Tatbestand des Kryptowertpapiergeschäfts (2024).

Back to comparison

Planning a corridor of your own

Post Oak Labs advises banks and market infrastructures on ledger selection, corridor design and the regulatory sequence. See blockchain advisory, the engagement roadmap and the tokenized money market fund guide, or browse the library.

Talk to us