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.
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);
}
}
| Contract | Deployed by | Privacy | Purpose |
| EurDepositToken | BankFR | Public state | ERC-20, 1:1 claim on EUR reserves at BankFR; mint and burn limited to BankFR's HSM-protected ISSUER_ROLE address. |
| SarDepositToken | BankSA | Public state | ERC-20, 1:1 claim on SAR reserves at BankSA; mint and burn limited to BankSA's ISSUER_ROLE address. |
| SilverPvPSettlement | Adhara (network deployer) | Public state | Atomic PvP engine; verifies both banks' EIP-712 signatures and a fresh FX quote. |
| SilverNetting | Adhara | Public state | Accumulates 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. |
| FXOracle | BankES | Public state | EUR/SAR mid, bid and ask quotes signed by BankES's node key, each valid 90 seconds and referenced by ID. |
| ComplianceRegistry | Joint | Tessera private group | Hashes of the Travel Rule Verifiable Credentials for each transaction; full VCs travel through Tessera. |
| ValidatorRegistry | Joint | Public state | Validator-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.
| # | Step | Besu-specific detail | Timing |
| 01 | Instruction | pacs.008 via BankFR's corporate API: Paris IBAN, Riyadh supplier IBAN, EUR amount, value date, beneficiary, LEI, purpose code. | <1 s |
| 02 | Travel Rule | BankFR 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 |
| 03 | FX rate | FXOracle.getLatestQuote("EUR","SAR"). BankES posts signed quotes every 30 seconds; BankFR receives a quote ID and rate (e.g. 4.1287). | <1 s |
| 04 | Signed instruction | BankFR 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 |
| 05 | Mint | EurDepositToken.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 |
| 06 | Allowance | approve(silverPvPSettlement, amount). Production banks pre-approve a working credit line (e.g. €100M) at setup to keep this off the critical path. | 2 s |
| 07 | Atomic PvP | settlePvP 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 |
| 08 | Beneficiary credit | BankSA's integration layer sees PvPSettled with the matching UETR and credits the supplier's local IBAN account. | 1–2 s |
| 09 | Originator status | BankFR 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 |
| 10 | Finality | 2-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 |
| 11 | Audit trail | Transaction 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 |
| 12 | Netting | SilverNetting aggregates PvPSettled events and computes net EUR obligations between each bank pair and net SAR positions. | Every 4 h or on demand |
| 13 | TARGET2 | BankFR and BankES submit the net pacs.009; BankES's bridge writes confirmation back via SilverNetting.confirmRtgsSettlement(cycleId, eurNetSettled). | TARGET2 hours |
| 14 | SARIE | BankSA 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 |
| 15 | Burn | BankFR 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 |
| 16 | Reconciliation | The 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).
| Requirement | Jurisdiction | Handling on Besu |
| AML/CFT screening | EU (AMLD6), SAMA AML | Structured 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, SAMA | Tessera VC exchange at step 2; VC hashes in ComplianceRegistry; IVMS-101 format. |
| Sanctions | EU Sanctions Regulation; UN and Saudi lists | Independent checks on LEI and structured name; the Saudi list is maintained by SAFIU. |
| Transaction reporting | ECB, ACPR, BdE; SAMA | Automated feeds from the regulator observer; SAMA reporting follows Banking Control Law cross-border rules. |
| Data residency | GDPR; SAMA CSF | Personal data only in Tessera payloads at BankFR and BankSA, invisible to BankES and observers. |
| DORA | EU | BankFR and BankES treat the Besu node and SILVER as critical ICT; Adhara is managed as an ICT third-party provider. |
| SAMA Cloud Computing Framework | Saudi Arabia | BankSA'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.
| Layer | Mechanism | Asset | Timing | Finality |
| On-chain (SILVER) | Atomic PvP, QBFT | EUR deposit token (BankFR liability) against SAR deposit token (BankSA liability) | <10 s | Technical finality at block inclusion; legal finality on RTGS confirmation |
| TARGET2 | Intraday net, pacs.009 | ECB reserves | Every 4 h in the TARGET2 window | Final in ECB money |
| SARIE | Intraday net, SARIE format | SAMA reserves | 07:30–16:30 AST | Final 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