Technical Deep-Dive · Hyperledger Besu · Adhara SILVER Pattern · Cross-Border Settlement
A minute-detail walkthrough of how Hyperledger Besu — deployed using the Adhara SILVER (Settlement, Issuance, Liquidity and Velocity Enhancement Rail) pattern proven in Project Khokha 2 and the Euro Cyber Resilience Board sandbox — enables tokenized account-to-account settlement across a three-bank EVM network: a French commercial bank (Paris), a Spanish commercial bank (Madrid), and a Saudi commercial bank (Riyadh). Every layer covered: validator topology, smart-contract architecture, token lifecycle, on-chain FX, privacy via Tessera, ISO 20022 integration, and the applicable regulatory frameworks on both sides of the corridor.
Scenario
A French corporate paying a Riyadh supplier. BankFR (Paris) originates. BankES (Madrid) acts as the EUR liquidity validator and on-chain FX market maker. BankSA (Riyadh) receives and redeems in SAR.
Technology
Permissioned EVM network with three validator nodes plus two non-validator observer nodes. QBFT consensus with instant finality. ERC-20-based deposit-token contracts wrapped by Adhara's SILVER settlement engine. Solidity smart contracts. Tessera for private transactions. ISO 20022 pacs.008 hashed on-chain, encrypted payload off-chain.
Settlement
EUR leg and SAR leg settle atomically within a single EVM transaction via the SILVER PvP contract. Net interbank positions settle in central bank money via TARGET2 (EUR) and SARIE (SAR) at end-of-cycle. No nostro pre-funding required.
Section 01
The EUR–SAR trade corridor is a high-priority cross-border route that has not yet been served by a production tokenized A2A network. EU–Saudi bilateral trade exceeded €80 billion in 2024, dominated by energy, capital goods, infrastructure procurement, and Vision 2030 mega-project financing. Payment volumes are concentrated in transactions large enough that the all-in cost of correspondent banking — typically 150–350 basis points — represents tens of millions of euros in foregone economic value annually for a single mid-sized European exporter book.
The case for tokenized infrastructure on this corridor is structural. European banks operating under MiCA and DORA face mounting compliance costs on legacy payment chains. The Saudi Central Bank (SAMA) has, since 2019, run direct cross-border DLT-based settlement experimentation through Project Aber (with the CBUAE) and is one of the named participants in Project Agorá, the BIS-led wholesale tokenization initiative announced April 2024. Both regulatory environments are compatible with permissioned EVM settlement on a private chain.
Hyperledger Besu is the technically appropriate choice for this three-bank network for four reasons. First, Besu is an Apache 2.0-licensed, EVM-compatible client maintained under the Linux Foundation's Hyperledger umbrella — the same execution semantics as Ethereum mainnet, so the global pool of Solidity developers (~23,000) can build CorDapp-equivalent business logic without learning a new language or VM. Second, Besu's QBFT (Quorum Byzantine Fault Tolerant) consensus delivers instant deterministic finality at the block level — there is no probabilistic finality window as on public Ethereum, which is a precondition for legal payment-system designation. Third, Besu has the deepest production deployment record of any EVM-based permissioned platform in regulated financial infrastructure: the Bank of Thailand's Project Inthanon, the South African Reserve Bank's Project Khokha (1 and 2), the Banque de France's wholesale CBDC experiments, the EU's Eurosystem exploratory work, and Onyx by J.P. Morgan (whose Liink and Coin Systems platforms run on a Besu fork).[1] Fourth, Adhara — a UK fintech that emerged from the ConsenSys/Quorum lineage — provides the SILVER (Settlement, Issuance, Liquidity and Velocity Enhancement Rail) engine, a production-tested smart-contract framework that sits on top of Besu and provides exactly the primitives this network needs: tokenized commercial bank money, on-chain PvP, on-chain liquidity-saving netting, and an oracle/FX layer. Adhara's SILVER engine was the settlement core for Project Khokha 2 (the South African Reserve Bank's wholesale tokenization pilot, completed 2022) and is the commercial engine behind Project Atlas (with Investec, Citi, Standard Bank, and Absa).[7]
On the Khokha 2 precedent
Project Khokha 2 — co-run by the South African Reserve Bank with Absa, FirstRand, Investec, Nedbank, and Standard Bank — used Adhara's SILVER engine on a Besu-derived permissioned network to settle tokenized wholesale CBDC and tokenized debentures with on-chain PvP and DvP. The project demonstrated that intraday liquidity savings of 60–80% versus gross RTGS were achievable, and that on-chain atomic settlement was operationally viable for regulated wholesale flows.[7] This is the most directly relevant precedent for the EUR–SAR architecture described here. SAMA has a parallel familiarity with the underlying technology stack through Project Aber and through its Project Agorá participation.
Section 02
The three-bank network consists of five Besu nodes (three validator nodes — one per bank — plus two non-validator observer/RPC nodes operated jointly), a Tessera private-transaction manager paired with each validator, and bridge connectors to TARGET2 (EUR) and SARIE (SAR) for end-of-cycle net settlement. Each bank operates its own Besu validator inside its own data center or regulated private cloud. No single party controls block production — QBFT requires a 2-of-3 supermajority for finality.
Besu network topology: 3 validators + 2 observers + Adhara SILVER shared contract layer · EUR–SAR corridor
Validator 1 · Originating Bank
French commercial bank. Licensed under the ACPR (Autorité de contrôle prudentiel et de résolution), subject to MiCA as an issuer of e-money tokens under Title III where applicable, and DORA-compliant from January 2025 for all critical ICT services. Operates a Hyperledger Besu 24.x validator node in its Paris data center. Acts as the EUR token issuer in this network: it mints EurDepositToken (ERC-20) against its own fiat reserves on behalf of corporate clients and burns them on redemption.
Validator 2 · Liquidity / FX Oracle
Spanish commercial bank. Licensed under Banco de España, subject to MiCA and DORA. Participates primarily as an EUR liquidity provider and as the FX oracle operator. It does not originate payments in this scenario, but holds surplus EUR token balances that can be used for intraday liquidity provision and operates a signed-data oracle smart contract (FXOracle.sol) that supplies EUR/SAR spot rates to the SILVER PvP engine.
Validator 3 · Receiving Bank
Saudi Arabian commercial bank. Licensed by the Saudi Central Bank (SAMA) under the Banking Control Law (1966) and the Banks Control Law as updated. Subject to SAMA's Open Banking Framework (Phase II in force 2024), the SAMA Cyber Security Framework, and the SAMA Cloud Computing Regulatory Framework. SAMA is a participant in Project Agorá (BIS-led wholesale tokenization initiative, 2024). Acts as the SAR token issuer and redeemer at the receiving end. SAR is pegged to USD at 3.7500.
Consensus · QBFT 2-of-3 + Observer Read Layer
Besu's QBFT (Quorum Byzantine Fault Tolerant) consensus is the consensus mechanism. Each of the three banks runs exactly one validator node; block proposers rotate round-robin each block, and finality requires a 2-of-3 supermajority commit signature on every block. QBFT delivers instant deterministic finality at block N — there is no probabilistic reorg window of the kind that exists on public Ethereum. Block time is configured at 2 seconds, giving end-to-end PvP settlement well under 10 seconds. Two additional non-validator observer nodes are deployed for read-only access: one operated by an independent regulator-facing trust (publishing a permissioned reporting feed to ACPR, Banco de España, and SAMA), and one operated by an independent auditor (Deloitte/PwC pattern, used in Project Khokha 2). Observer nodes can read public-state contract events but have no visibility into Tessera-encrypted private payloads. The validator set itself is governed by an on-chain ValidatorRegistry contract: adding or removing a validator requires a 2-of-3 vote of existing validators plus a 14-day delay window. This is the same pattern proven in Onyx by J.P. Morgan and in Adhara's Khokha 2 deployment.
Section 03
The on-chain logic for this network is organised into three Solidity contract groups. Deposit-token contracts (one per currency, ERC-20-compliant with extensions) issued by the relevant bank. The Adhara SILVER engine (a set of contracts that bundle PvP atomic settlement, liquidity-saving netting, and obligation tracking). And the supporting infrastructure contracts (FX oracle, validator registry, compliance attestation registry). All contracts compile with Solidity 0.8.x, are deployed once via a permissioned deployer key, and are upgraded via an on-chain governance vote (UUPS proxy pattern, 2-of-3 validator approval + 14-day timelock).
Each currency has its own ERC-20 contract, deployed and exclusively minted by the issuing bank. The contract extends standard ERC-20 with a permissioned mint/burn, a freeze function for compliance holds, and a hash-binding to the off-chain ISO 20022 payload:
// 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);
}
}
The same template is deployed by BankSA as SarDepositToken (decimals = 2, conventional for SAR ledger units; or 18 if the network adopts an internal scaling convention).
The SILVER engine's core innovation is its conditional atomic settlement primitive. A single transaction either moves both legs (EUR debit at BankFR address, SAR credit to the Riyadh beneficiary's intermediary) or it reverts entirely. There is no partial-settlement state. The same contract also exposes a netting cycle that allows multiple in-cycle obligations to be netted before final transfer:
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);
}
}
| Contract | Deployed By | Privacy | Purpose |
|---|---|---|---|
EurDepositToken |
BankFR (Paris) | Public-state | ERC-20 deposit token representing a 1:1 claim on EUR reserves at BankFR. Mint and burn restricted to BankFR's HSM-protected ISSUER_ROLE address. |
SarDepositToken |
BankSA (Riyadh) | Public-state | ERC-20 deposit token representing a 1:1 claim on SAR reserves at BankSA. Mint and burn restricted to BankSA's HSM-protected ISSUER_ROLE address. |
SilverPvPSettlement |
Adhara (network deployer) | Public-state | The atomic PvP engine. Settles both currency legs in a single transaction or reverts. Verifies EIP-712 signatures from both bank counterparties and a fresh FX quote. |
SilverNetting |
Adhara (network deployer) | Public-state | Liquidity-saving netting cycle — accumulates obligations during a window (e.g. 4 hours), then computes the multilateral net and triggers PvP for net positions only. Replicates the LSM design from Project Khokha 2. |
FXOracle |
BankES (Madrid) | Public-state | Signed-data oracle. BankES posts EUR/SAR mid-rate quotes (and bid/ask) signed by its node key. Each quote has a 90-second validity window; consumers reference quotes by ID. |
ComplianceRegistry |
Joint deployment | Tessera private group | Stores hashes of Verifiable Credentials exchanged between BankFR and BankSA for each transaction (FATF Travel Rule). Full VC payload travels through Tessera; only the hash is on public state. |
ValidatorRegistry |
Joint deployment | Public-state | On-chain validator-set governance. Adding or removing a validator requires 2-of-3 vote of existing validators plus a 14-day timelock. Mirrors the Onyx / Khokha 2 governance pattern. |
Section 04
A complete EUR→SAR cross-border payment from a Paris corporate client to a Riyadh supplier moves through 16 distinct steps across three Besu validators, the Tessera private-transaction layer, the SILVER smart-contract suite, two RTGS systems, and two core banking integrations. The on-chain portion (steps 1–11) completes in under 30 seconds under normal network conditions — QBFT instant finality at 2-second block intervals makes the PvP transaction final at block inclusion. Steps 12–16 involve off-chain RTGS net settlement, which occurs intraday or end-of-day depending on the configured netting cycle.
Initiation · BankFR Core Banking
The Paris corporate client submits a payment instruction via BankFR's corporate banking API (ISO 20022 pacs.008 format). BankFR's payment gateway validates the instruction against the client's account balance, AML risk score, and transaction limits. The instruction contains: debit account (Paris IBAN), credit account (Riyadh supplier IBAN), amount in EUR, value date, beneficiary details, LEI, and purpose code.
Timing: <1 second · Automated validation · ISO 20022 pacs.008 standard
Pre-Compliance · ComplianceRegistry + Tessera
BankFR's compliance engine performs originator sanctions screening using the structured ISO 20022 name + LEI fields (significantly fewer false positives than legacy MT free-text). BankFR's web3 client then submits a private Tessera transaction containing the full Travel Rule Verifiable Credential (originator LEI, jurisdiction, risk tier, sanctions-clear attestation) addressed only to BankSA's Tessera key. Simultaneously, BankFR calls ComplianceRegistry.recordAttestation(uetr, vcHash) on the public chain, committing the VC hash. BankSA's Tessera node receives and decrypts the VC, validates the LEI against GLEIF, and submits a counter-VC (beneficiary acceptance) the same way. Both hashes are now on-chain, full payloads only at the two parties.
Timing: 1–3 seconds · Tessera point-to-point · VC hash committed on-chain
FX Rate · FXOracle.sol
BankFR's settlement service queries FXOracle.getLatestQuote("EUR","SAR"). BankES, as the designated oracle operator, has been continuously posting signed quotes from its treasury FX feed (Bloomberg/Refinitiv mid-market, plus its own bid/ask) every 30 seconds. Each quote on-chain is cryptographically signed by BankES's node key and time-stamped with the block timestamp; quotes are valid for 90 seconds. BankFR receives the quote ID and the rate (e.g. EUR/SAR = 4.1287). Using a single trusted on-chain oracle eliminates rate disputes — every party reads the same value from the same contract.
Timing: <1 second · On-chain read · Quote validity: 90 seconds
FX Commitment · EIP-712 Signed Settlement Instruction
BankFR constructs a SettlementInstruction struct (UETR, payer = BankFR address, payee = BankSA address, EUR amount, SAR amount derived from the oracle rate, oracle quote ID, validUntil timestamp). It is hashed using EIP-712 and signed with BankFR's HSM-held key. The signed instruction is sent over Tessera to BankSA, which independently re-derives the SAR amount, verifies the oracle quote, and counter-signs the same struct. Both signatures are now ready to be passed into the settlement contract. Neither bank has yet committed any on-chain state change — both parties hold off-chain commitments to settle.
Timing: 1–2 seconds · EIP-712 typed data · No gas yet consumed
Token Minting · BankFR Validator
BankFR submits a transaction calling EurDepositToken.mintForPayment(uetr, beneficiaryAddr, amount, iso20022Hash, kycHash, bankSAaddr). The transaction is signed by BankFR's HSM-held ISSUER_ROLE key. On execution, the contract mints amount EUR tokens to BankFR's working address, records the metadata mapping (binding the ISO 20022 payload hash and KYC VC hash to the UETR), and emits PaymentMinted. This event is visible on the public state of the chain to all three validators and both observers, but the actual ISO 20022 XML never leaves BankFR — only its hash is on-chain.
Timing: 2–4 seconds · 1 block · QBFT 2-of-3 finality at inclusion
Approval · ERC-20 allowance for SILVER engine
BankFR submits an EurDepositToken.approve(silverPvPSettlement, amount) transaction so the SILVER PvP contract can move EUR tokens from BankFR to BankSA in the atomic settlement step. This is the standard ERC-20 allowance pattern. In production, banks typically pre-approve the SILVER engine for a working credit line (e.g. €100M) at contract deployment time to avoid this step appearing on the critical path of every payment.
Timing: 2 seconds · 1 block · Often pre-approved at line-setup time
Atomic PvP · SilverPvPSettlement.settlePvP()
BankFR submits the call to SilverPvPSettlement.settlePvP(instruction, payerSig, payeeSig). In a single EVM transaction, the contract: (a) verifies both EIP-712 signatures match BankFR and BankSA's registered keys; (b) verifies the FX oracle quote is fresh (<90 seconds); (c) verifies the SAR amount equals (EUR amount × oracle rate); (d) calls EurDepositToken.transferFrom(BankFR, BankSA, eurAmount) — the EUR leg; (e) calls SarDepositToken.mintForPayment(...) — the SAR leg. If any step fails, the entire transaction reverts atomically. There is no possible state in which one leg has settled and the other has not. This is the architectural realisation of PvP — it eliminates principal risk by construction.
Timing: 2–4 seconds · 1 block · QBFT instant finality · ~250,000 gas
Notification · Event log to BankSA core banking
BankSA's integration layer subscribes to PvPSettled events from the SILVER contract. On detecting the event with the matching UETR, it triggers an automated debit of its SAR token balance (the freshly minted tokens) and a credit of the equivalent SAR amount to the Riyadh supplier's local IBAN account in BankSA's core banking system. The supplier's account balance updates in real time. The entire on-chain to off-chain workflow on the receiving side completes in seconds.
Timing: 1–2 seconds · Event-driven · Core banking credit posted real-time
Notification · Originator confirmation
BankFR's payment engine, on the same event subscription, generates an ISO 20022 pacs.002 (Payment Status Report) and pushes it to the Paris corporate client via the corporate banking API. The status is ACSC (AcceptedSettlementCompleted) — the strongest positive status code in the ISO 20022 standard. The client's ERP/treasury system updates the payment status from pending to settled in real time, eliminating the multi-day uncertainty window of correspondent banking.
Timing: <1 second · ISO 20022 pacs.002 ACSC
On-chain finality · QBFT supermajority commit
QBFT requires a 2-of-3 supermajority commit signature on every block. Once the block containing the settlePvP transaction is committed by 2 of the 3 validators, finality is deterministic and instant — there is no probabilistic reorg window. This is the core reason a permissioned EVM with QBFT is suitable for legal payment-system designation, where Ethereum mainnet's probabilistic finality (with the post-merge finality gadget delivering ~12-minute economic finality) is not. From the moment the block is signed, the on-chain state is final.
Timing: Instant at block inclusion · Deterministic · No reorg risk
Audit Trail · All Validators + Observer Nodes
All three validators and both observer nodes now have an immutable, timestamped, cryptographically signed record of the transaction. The transaction hash, the ISO 20022 payload hash, the KYC attestation hash, the FX oracle quote ID, and the EIP-712 signatures are permanently associated with the UETR. The regulator-facing observer node generates the relevant cross-border payment reporting feeds for ACPR and Banco de España on the EU side, and for SAMA on the Saudi side. The auditor observer node's audit trail is available for SOC 1/SOC 2 attestation. No post-hoc reconstruction across multiple systems is needed.
Timing: Automated · Immutable audit trail from step 5 forward
Net Position Calculation · SilverNetting Contract
At each netting cycle (configured at every 4 hours, or on-demand for transactions above €50M), the SilverNetting contract aggregates all settled PvPSettled events in the cycle. It computes net EUR obligations between each pair of banks, and the net SAR positions on the Saudi side. These net figures are significantly smaller than the gross transaction flows — Project Khokha 2 documented intraday liquidity savings of 60–80% versus gross RTGS settlement using exactly this pattern.[7] Netting is the core liquidity-efficiency mechanism that replaces nostro pre-funding with just-in-time central bank money settlement.
Timing: Every 4 hours intraday, or on-demand
EUR RTGS Net Settlement · TARGET2
BankFR and BankES submit their net EUR settlement instruction to TARGET2 (the ECB's RTGS system, running on ISO 20022 since the March 2023 T2 migration). The instruction (pacs.009) covers the net position across all on-chain transactions in the cycle. TARGET2 settles in central bank money — claims on the ECB itself, the highest-quality settlement asset available. Once TARGET2 confirms settlement, BankES's RTGS bridge service writes the confirmation back to the chain via SilverNetting.confirmRtgsSettlement(cycleId, eurNetSettled).
Timing: TARGET2 operating hours · ECB central bank money
SAR RTGS Net Settlement · SARIE
BankSA submits its net SAR settlement instruction to SARIE (Saudi Arabian Riyal Interbank Express), the SAMA-operated RTGS for the Saudi banking system. SARIE has been operating since 1997 and was a foundational system for the Project Aber and Project Agorá experiments. The instruction covers the net SAR obligations from all tokenized transactions in the cycle. SARIE processes the instruction and settles in Saudi riyal central bank money — a direct liability of SAMA. This is the final, legal settlement of the SAR obligations. SAMA receives the netting summary directly via the regulator-facing observer node.
Timing: SARIE operating hours (07:30–16:30 AST) · SAMA central bank money
Token Burn · burnForRedemption()
Once RTGS confirmation is received on both sides, BankFR calls EurDepositToken.burnForRedemption(uetr, amount) against the EUR tokens held by BankSA (which BankSA has approved for burn under the cycle settlement workflow). BankSA equivalently burns the SAR tokens that have been redeemed off-chain to the supplier. The burns are recorded on-chain and the on-chain token supply now matches exactly the off-chain RTGS-settled positions. Token supply on-chain always equals the unsettled portion of obligations — a clean, auditable invariant.
Timing: Post-RTGS confirmation · Tokens burned · Cycle complete
Reconciliation · Both Core Banking Systems
BankFR's and BankSA's core banking systems receive the final reconciliation feed from the Besu integration layer. Because the ISO 20022 pacs.008 payload was bound (by hash) to the UETR from step 5 onward and held in Tessera private storage, both banks' systems can perform straight-through reconciliation against outstanding invoices, payments, and nostro positions without manual intervention. The structured remittance information (invoice numbers, purpose codes, LEI identifiers) eliminates the exceptions that legacy MT free-text fields generate. Industry benchmarks from early ISO 20022 adoption cohorts document 20–30% fewer payment exceptions versus MT-based workflows.[3]
Timing: Automated · <2% exception rate · no manual intervention
Section 05
Foreign exchange conversion is the most technically nuanced element of a multi-currency Besu A2A deployment. The EUR/SAR pair is not a freely traded interbank pair with deep liquidity at all hours — the SAR is pegged to the USD at 3.7500, which means EUR/SAR fluctuates with EUR/USD. This creates specific requirements for how rates are sourced, how they are committed on-chain, and how FX risk between origination and settlement is managed.
Besu handles non-deterministic external data (like FX rates) through a signed-data oracle smart contract. In this network, BankES operates the FXOracle contract: it sources EUR/SAR mid-market rates from its treasury FX system (connected to Bloomberg or Refinitiv), constructs a signed quote object, and posts it on-chain via a permissioned postQuote function gated to BankES's HSM-held oracle key. Every consumer reads from the same contract — there is no rate dispute possible because every transaction in a settlement window references a specific oracle quote ID, and the oracle's signature is verifiable by any party.
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);
}
}
In correspondent banking, the FX spread on EUR/SAR conversions is captured by the intermediary correspondent chain — not by BankFR, which has the direct client relationship. On the Besu A2A rail, FX conversion occurs on-chain at the moment of PvP settlement. BankSA applies a spread over the oracle mid-rate (its institutional EUR/SAR dealing rate, typically 10–20 bps for wholesale flows), and this spread is revenue for BankSA — which has the direct Riyadh corporate client relationship. BankFR captures the fee income on the EUR origination leg (typically 5 bps flat). Neither bank pays the correspondent chain. The total FX economics shift from intermediaries to the institutions with direct customer relationships.
In a conventional FX settlement, the EUR leg and the SAR leg settle in different RTGS systems, at different times, creating a principal risk window during which one party has delivered and the other has not. The BIS CPMI has documented that roughly one-third of global FX transactions still settle without PvP arrangements, exposing the market to Herstatt-style risk.[2] The SILVER atomic transaction model makes PvP the architectural default: the EUR token transfer and the SAR token mint are encoded in a single EVM transaction that either succeeds completely or fails completely. The EVM's transactional revert semantics make this absolute — there is no intermediate state observable on-chain. This is the same mechanism CLS Bank achieves for the major currency pairs through its multi-currency cash account structure, but implemented as smart-contract logic on a permissioned chain.
Numerical example
BankFR corporate pays €5,000,000. On-chain oracle EUR/SAR mid: 4.1287 (posted 30 seconds ago, valid for 60 more). BankSA spread: 12 bps over mid → dealing rate: 4.1287 × 1.0012 = 4.1337. SAR credited to Riyadh supplier: SAR 20,668,500. BankSA FX revenue: SAR 24,772 (≈ €6,000 at mid). BankFR fee on the EUR origination leg: €2,500 (5 bps flat). Total corridor cost to the corporate: ~12 bps of transaction value, versus a correspondent banking equivalent of approximately 1.8–3.5% all-in (bank-published EUR/SAR retail-to-wholesale spreads). The economics shift entirely from the correspondent chain to the two originating banks. Annual run-rate at €4 billion of corridor flow: approximately €5–8 million in additional retained margin, split between BankFR and BankSA.
Section 06
The Besu permissioned model has a privacy model fundamentally different from Corda's. By default, every validator sees every transaction in the block. The Adhara SILVER pattern addresses this through three layers: (1) only hashes — never the underlying ISO 20022 XML or KYC VC payload — are committed to public state; (2) the full payloads travel through Tessera, a peer-to-peer encrypted messaging layer that delivers the payload only to the parties named in the transaction; (3) for sensitive use cases, additional zero-knowledge proof patterns (e.g., zk-SNARKs to prove a payment is below a regulatory threshold without revealing the amount) can be layered on top.
This satisfies the GDPR (EU) and SAMA Cyber Security Framework (Saudi Arabia) data residency and confidentiality requirements: personal data (corporate originator name, IBAN, supplier identity, invoice references) never enters the public chain state. Only deterministic hashes — which are non-identifying — are visible to all validators. The full payload exists only on the Tessera nodes of the two parties to the transaction, hosted in those banks' own data centers.
The Tessera architecture is a direct adaptation of the Quorum private-transaction pattern, now also supported in Besu via the deprecated Privacy Group API and the newer GoQuorum-compatible private transactions (with EEA Client Specification compliance). For ongoing greenfield deployments in 2026, the Adhara recommended pattern is hash-binding with full off-chain payload — simpler, more auditable, and aligned with the EBA's December 2024 view that token state should preferably be public-state on permissioned chains with personal data kept off-chain.[4]
A note on the Besu privacy roadmap
The original Hyperledger Besu private-transaction implementation (the "Orion" predecessor and the early Tessera integration) was deprecated in Besu 22.x. Production deployments in 2025–26 use one of three patterns: (1) hash-binding with off-chain payload (the SILVER pattern used here); (2) a Tessera-compatible companion deployment running alongside Besu; or (3) zero-knowledge proof shielding for sensitive fields (Aztec Connect-style designs adapted to permissioned Besu). The hash-binding approach is the most production-mature and is what the Adhara/Khokha 2 pattern uses.
Section 07
One of the most practically important features of this architecture is that the ISO 20022 pacs.008 (Customer Credit Transfer Initiation) payload is hash-bound to the on-chain token state from the moment of minting. The full XML travels through Tessera between BankFR and BankSA. The keccak256 hash of the canonical XML is committed to public state, providing non-repudiation: BankFR cannot later claim a different payload was associated with the UETR, and BankSA cannot deny receipt of the specific payload it acknowledged.
The pacs.008 message can carry: the originator's full legal name, structured postal address, Legal Entity Identifier (LEI), originator account IBAN, purpose code (e.g. TRPT for trade payment, SCTL for securities settlement), structured remittance information (invoice number, line items), regulatory reporting codes, and the payment's Unique End-to-End Transaction Reference (UETR). All of this is present in BankSA's Tessera payload at the moment the token is received, with a verifiable hash binding to the on-chain transaction.
<!-- Abbreviated pacs.008 carried via Tessera; keccak256 hash committed on-chain -->
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<FIToFICstmrCdtTrf>
<GrpHdr>
<MsgId>BANKFR-20260415-00098765</MsgId>
<CreDtTm>2026-04-15T10:14:32Z</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<SttlmInf>
<SttlmMtd>INDA</SttlmMtd>
</SttlmInf>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<InstrId>BANKFR-INSTR-2026-00098765</InstrId>
<EndToEndId>UETR-7c9e6679-7425-40de-944b-e07fc1f90ae7</EndToEndId>
</PmtId>
<IntrBkSttlmAmt Ccy="EUR">5000000.00</IntrBkSttlmAmt>
<Dbtr>
<Nm>Paris Industrial Equipment SAS</Nm>
<PstlAdr>
<StrtNm>Avenue des Champs-Élysées 88</StrtNm>
<TwnNm>Paris</TwnNm>
<Ctry>FR</Ctry>
</PstlAdr>
<Id><OrgId><LEI>969500N1B7PI4F1V2N06</LEI></OrgId></Id>
</Dbtr>
<Cdtr>
<Nm>Riyadh Construction Holdings Ltd</Nm>
<PstlAdr><TwnNm>Riyadh</TwnNm><Ctry>SA</Ctry></PstlAdr>
<Id><OrgId><LEI>5586009OOKK7HZJL8Z51</LEI></OrgId></Id>
</Cdtr>
<Purp><Cd>TRPT</Cd></Purp> <!-- Trade payment -->
<RmtInf>
<Strd>
<CdtrRefInf><Ref>INV-2026-RUH-2287</Ref></CdtrRefInf>
</Strd>
</RmtInf>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
</Document>
# keccak256(canonicalXml) = 0x9a3f4b21d8e7c0a2f6b5e9... (committed on-chain in EurDepositToken.meta[uetr].iso20022Hash)
This payload is validated by BankSA's compliance engine at step 7 of the lifecycle against the pacs.008 XSD schema before BankSA counter-signs the SettlementInstruction. The invoice reference (INV-2026-RUH-2287) feeds directly into BankSA's accounts receivable matching system — the Riyadh supplier's invoice is automatically reconciled without manual intervention. The two LEIs resolve against the GLEIF registry to confirm legal entity names match the KYC records on file at both banks.
Section 08
AML compliance in a cross-jurisdiction Besu network operates at two layers simultaneously: each bank independently meets its own jurisdiction's AML requirements (ACPR/Banco de España for the EU side; SAMA for BankSA), and the network's shared attestation architecture satisfies the FATF Travel Rule requirements that apply when value moves between regulated payment institutions.
The EU's Transfer of Funds Regulation (TFR), in force December 30, 2024 with no grace period, requires that crypto-asset service providers and traditional payment service providers transmit originator and beneficiary identifying information for all transfers regardless of amount. For deposit-token payments on a Besu permissioned network, the relevant parties are BankFR (originating institution) and BankSA (beneficiary institution). Both are regulated entities, but the Travel Rule still applies to the structured data exchange between them. Saudi Arabia's AML/CFT framework, administered by SAMA and the Saudi Financial Investigation Unit (SAFIU), is broadly aligned with FATF standards — Saudi Arabia is a full FATF member since 2019.
The Tessera-based attestation flow handles this. BankFR generates a Verifiable Credential (originator name, address, LEI, risk tier, sanctions-screening status) signed with its node key. The full VC is sent over Tessera to BankSA. BankFR also calls ComplianceRegistry.recordAttestation(uetr, keccak256(vc)) on the public chain, committing the VC hash. BankSA's compliance engine validates the VC signature, checks the originator's LEI against the GLEIF registry, and posts a counter-VC the same way. Both VC hashes are now on-chain and the full payloads only at the two parties — exactly the TFR + GDPR + SAMA Cyber Security Framework data minimisation pattern.
| Compliance Requirement | Jurisdiction | How Handled in This Architecture |
|---|---|---|
| AML/CFT Screening | EU (AMLD6) + Saudi Arabia (SAMA AML) | Structured ISO 20022 name + LEI fields fed to each bank's screening engine at step 1 (originator) and step 7 (beneficiary). Structured data reduces false positives by 30–50% versus MT free-text.[3] |
| Travel Rule (FATF R.16) | EU (TFR, Dec 2024) + Saudi Arabia (SAMA) | Tessera private-payload VC exchange between BankFR and BankSA at step 2. VC hashes recorded on-chain via ComplianceRegistry. IVMS-101 data format used for cross-jurisdictional interoperability. |
| Sanctions Screening | EU (EU Sanctions Regulation) + Saudi (UN + local) | Both banks run independent sanctions checks using structured LEI + structured name from ISO 20022 payload. The LEI resolves to the GLEIF registry — unambiguous legal entity identification. Saudi sanctions list maintained by SAFIU. |
| Transaction Reporting | ECB/ACPR/BdE (EU) + SAMA (Saudi) | Immutable on-chain record + Tessera-stored ISO 20022 payload enables automated regulatory reporting feeds via the regulator-facing observer node. SAMA receives reporting in line with the Banking Control Law cross-border payment reporting requirements. |
| Data Residency | GDPR (EU) + SAMA Cyber Security Framework | Personal data (corporate names, IBANs, invoice refs) held only in Tessera private payloads at BankFR and BankSA — not on the public chain state and never visible to BankES or to observer nodes. Each bank stores Tessera data only in its own regulated data center or cloud zone. |
| DORA (Digital Operational Resilience) | EU — in force Jan 17, 2025 | BankFR and BankES must classify the Besu node as a critical ICT service under DORA. Incident reporting to ACPR/BdE within 4 hours of major incident; resilience testing (TLPT for systemic firms); third-party risk management for Adhara as ICT provider for the SILVER engine. |
| SAMA Cloud Computing Framework | Saudi Arabia | BankSA's Besu node runs in a SAMA-approved cloud zone (typically AWS Bahrain region or local Saudi data center). Cryptographic keys held in HSM under FIPS 140-2 Level 3. SAMA pre-approval required for any cloud deployment processing customer data. |
Section 09
The EUR–SAR Besu network sits at the intersection of two distinct regulatory frameworks. The EU's MiCA regulation (in full effect December 2024) provides a comprehensive crypto-asset framework with specific carve-outs for bank-issued deposit tokens. Saudi Arabia does not have a discrete digital-asset framework analogous to MiCA — instead, SAMA regulates digital settlement infrastructure under the existing Banking Control Law and its updated supervisory rulebooks. SAMA's stated direction (per Project Aber, Project Agorá, and FinTech Saudi initiatives) is to integrate tokenized wholesale payments within the existing banking-supervisory framework rather than create a separate crypto regime.
European Union — MiCA + DORA
Saudi Arabia — SAMA + SAFIU
The key regulatory compatibility finding
MiCA does not strictly apply to bank-issued deposit tokens (the EBA's December 2024 position). Saudi Arabia regulates BankSA's SAR tokenized deposit activity under existing banking law, not under a separate crypto framework. The two regulatory perimeters are therefore mutually compatible without requiring novel cross-border legal mechanisms — both jurisdictions classify the on-chain instrument as a bank deposit liability subject to standard prudential supervision. The regulatory risk for this deployment is materially lower than for a non-bank-issued stablecoin network operating the same corridor. The remaining regulatory risk concentrates in two areas: (1) achieving formal payment-system designation under the EU Settlement Finality Directive in the future (necessary for full legal finality protection); and (2) obtaining SAMA's explicit no-objection letter for ongoing production cross-border tokenized flows beyond the initial sandbox phase.
Section 10
The Besu on-chain layer handles real-time token transfer and atomic PvP settlement. The RTGS layer handles final settlement in central bank money. Understanding how these two layers interact is essential for treasury teams evaluating the liquidity implications of this architecture.
In correspondent banking, a €5M EUR→SAR payment requires €5M (or SAR equivalent) in pre-funded nostro balances at the Paris–Riyadh correspondent chain. In the Besu A2A model, the payment is settled on-chain atomically — the corporate's account is debited immediately and the Riyadh supplier's account is credited within seconds. The RTGS settlement happens later (at the next intraday netting cycle), and settles only the net position between the participating banks across all transactions in the cycle.
If in a given 4-hour cycle BankFR sends €30M to Riyadh suppliers and BankSA sends €18M to Paris corporate clients (in separate transactions), the net EUR obligation is €12M — not €48M gross. This netting is the core capital efficiency mechanism. Project Khokha 2 documented intraday liquidity savings of 60–80% in exactly this configuration.[7] At a 5% rate, the reduction from €48M to €12M in RTGS exposure frees approximately €1.8M in annual foregone yield on what would otherwise have been pre-funded nostro balances on a single 4-hour cycle.
| Settlement Layer | Mechanism | Settlement Asset | Timing | Finality |
|---|---|---|---|---|
| On-chain (Besu / SILVER) | Atomic PvP via SilverPvPSettlement; QBFT instant finality | EUR deposit token (BankFR liability) ↔ SAR deposit token (BankSA liability) | <10 seconds end-to-end | On-chain technical finality at block inclusion (deterministic, no reorg); legal finality on RTGS confirmation |
| EUR RTGS (TARGET2) | Intraday net settlement; ISO 20022 pacs.009 | ECB reserves (central bank money) | Every 4 hours during TARGET2 operating window | Final; ECB central bank money settlement |
| SAR RTGS (SARIE) | Intraday net settlement; SARIE message format | SAMA reserves (central bank money) | Intraday during SARIE operating window (07:30–16:30 AST) | Final; SAMA central bank money settlement |
One operational complexity: TARGET2 operates on Central European Time (CET/CEST) business hours, while SARIE operates on Arabia Standard Time (AST = UTC+3, Saudi Arabia does not observe daylight saving). There is a multi-hour overlap window during which both RTGS systems are simultaneously open (approximately 09:00–14:30 CET / 11:00–16:30 AST). For end-of-day netting cycles, the SILVER netting orchestration must account for this time zone mismatch and may need to queue SARIE settlement instructions for the following AST business day if the cycle falls outside the overlap window. Saudi Arabia also operates on a Sunday–Thursday banking week (with Friday and Saturday as the weekend), while the EU operates on a Monday–Friday week — meaning Friday cycles cannot settle on the SAR leg until Sunday morning AST, and Sunday EUR cycles cannot settle on the EUR leg until Monday morning CET. This is a well-understood operational constraint, handled by configuring intraday cycles to run during the overlap window during the four-day common business overlap (Monday–Thursday).
Section 11
The architecture described is technically sound and has direct precedent in multiple production deployments. The risks that matter most are not technical — they are governance, legal, and operational. Banks evaluating this model for the EUR–SAR corridor should stress-test the following before committing architecture.
Governance Risk
Contour (trade finance), we.trade, and Marco Polo all failed not due to technical shortcomings but because consortium governance — specifically, commercial incentive alignment between competing bank shareholders — proved impossible to sustain. Before any three-bank EUR–SAR network is built, the governance framework must answer: who pays for network maintenance when volumes disappoint in year one? Who controls the upgrade roadmap for the SILVER engine and the deposit-token contracts (UUPS proxy upgrade keys)? What happens if one bank exits? Who is liable for a settlement failure caused by a bug in the shared SILVER contracts? These questions belong in the network participation agreement, not in the technical specification. The Adhara/Khokha 2 model uses a structured legal entity (a Mauritius-based or Luxembourg-based SPV) holding the upgrade keys and the contractual operating model — this is the most common pattern but is not the only viable one.
Legal Finality Risk
When a QBFT block is committed by 2-of-3 validators, the state transitions on the Besu chain are technically irrevocable. But legal finality — the right to retain funds against counterparty insolvency — depends on the legal framework governing the network. In the EU, the Settlement Finality Directive provides legal finality protection for transactions in designated payment systems. Permissioned Besu networks are not (yet) designated payment systems under the SFD. Fnality's Sterling Fnality Payment System (£FnPS) — itself a Besu/Adhara-stack deployment — received Bank of England Settlement Finality Designation in 2024, the first DLT-based payment system to do so. The EUR–SAR network described here would need equivalent regulatory engagement (ECB/ACPR for the EU side, SAMA for the Saudi side) before it could claim full legal finality protection. This is an 18–36 month regulatory process, not a technical one.
HSM Key Management Risk
Two distinct key categories require separate threat models. (1) The HSM that controls BankFR's EurDepositToken.ISSUER_ROLE key and BankSA's SarDepositToken.ISSUER_ROLE key are the mint-authority keys — if either is compromised, an attacker can create unbacked tokens. Multi-signature minting (M-of-N HSM keys split across treasury, compliance, and technology teams) is the standard mitigation. (2) Each validator's QBFT block-signing key is the consensus key — if any single validator key is compromised, the attacker has 1 of 3 votes (insufficient to forge a block on its own) but loses the bank's contribution to consensus. If two validator keys are compromised simultaneously, the attacker can forge blocks. The mitigation is HSM-resident validator keys with physical separation across data centers, plus the on-chain ValidatorRegistry with timelocked rotation. FIPS 140-2 Level 3 is the minimum standard.
Smart Contract Risk
Unlike Corda's JVM-based CorDapps (where contract bugs typically result in transactions failing to verify), Solidity smart contract bugs can — if exploitable — drain or freeze tokens. The SILVER engine and the deposit-token contracts must be: (a) audited by at least two independent firms (e.g. ChainSecurity, OpenZeppelin, Trail of Bits) with formal verification of the PvP atomicity property; (b) covered by a continuous bug-bounty program; (c) deployed under a UUPS proxy with timelocked upgrade authority (14-day delay minimum); (d) covered by an insurance arrangement (the Lloyd's syndicate market for permissioned DLT smart contract cover is small but functional as of 2026). The benefit of Solidity is the much larger developer pool and tooling ecosystem; the cost is a more attack-prone primitive than Kotlin contracts on JVM.
Vendor Concentration Risk
The SILVER engine is Adhara proprietary intellectual property licensed to participating banks. This creates vendor concentration risk: if Adhara fails as a business, support for the SILVER contracts disappears and the network must either fork the codebase or migrate to an alternative settlement engine. Mitigations: (a) source code escrow with a regulated trust service; (b) explicit contractual rights to fork and maintain in the event of Adhara's insolvency or material breach; (c) DORA-compliant ICT third-party risk assessment for the EU-side banks, classifying Adhara as critical ICT provider with associated audit and resilience obligations; (d) gradual migration path to an open-source alternative (e.g. the Hyperledger Cacti or Hyperledger Fabric Token SDK patterns) if commercial terms degrade. This risk is comparable to (but distinct from) the R3 vendor risk in the Corda equivalent network.
Regulatory Sequencing Risk
The correct order of operations for the EU-side banks is: (1) obtain ACPR / Banco de España informal guidance on deposit token infrastructure on Besu; (2) file a DORA ICT risk assessment covering the Besu node and the Adhara SILVER engine; (3) pilot internally with synthetic transactions; (4) seek formal payment system operator authorization or Settlement Finality Directive designation pathway; (5) begin bilateral production transactions with BankSA. For BankSA, the correct sequence is: (1) obtain SAMA no-objection for the Besu architecture under the SAMA Cyber Security Framework and Cloud Computing Framework; (2) complete the FinTech Saudi sandbox phase with synthetic transactions; (3) obtain SAMA explicit approval for production cross-border tokenized SAR settlement; (4) begin production with the European counterparties. Compressing this sequence is the most common error that inflates project timelines by 12–24 months. SAMA's Project Aber and Project Agorá familiarity shortens but does not eliminate the supervisory engagement requirement.