SmartCheq · Module Specification

CBDC Issuance System

The Issuance Tab is the central bank operator's interface for creating, authorising, and dispatching CVIB (CBDC Voucher in Bearer) batches. It covers the complete lifecycle from draft configuration through governance approval, note minting, vault encryption, and ownership transfer to commercial banks.

Version 1.0
Source UI Mockup — April 2026
Status Production Reference
Scope 54 AU Member Corridors
§1

System Overview

The Issuance system orchestrates the creation of Central Bank Digital Currency notes (CBDCNotes) backed by real central bank reserves locked in the Corridor Ops module. A batch of notes is minted, cryptographically signed with the issuing bank's Ed25519 key, packaged into a vault-encrypted bundle, and transferred to a commercial bank — the "Claiming Institution".

Key Concepts

ConceptDefinitionExample from UI
Draft IssuanceInitial configuration record. Country, central bank, currency, denomination and corridor are selected. Not yet submitted to governance.IA-E0E7A9E144D8-20260407
AuthorizationGovernance-gated approval that links the issuance to a backing liquidity lock. Requires a second operator (Four-Eyes).50d5ed31-f072-4018-b4e5-9fe883004208
MintingThe act of generating individual CBDCNotes with serial numbers, denominations, and issuer signatures within a MintBatch.5 notes, L-XOF
Batch GenerationThe MintBatch record grouping all notes: serial range, asset code, holder ID, issuer key, expiry.70f75f6f-9164-4ae3-ae38-f347732cdc9d
Ownership TransferCryptographically signed handoff of the note bundle from the issuing central bank to the claiming commercial bank via email or SFTP.BANQUE ATLANTIQUE DU BENIN — ATBJBJBJ
ManifestA hash-signed inventory of all notes in the bundle. Used by the receiving institution to verify bundle integrity before accepting notes.Manifest Hash field (empty until generated)

Left Pane — Configuration

  • Issuance config draft
  • Country / Central Bank / Governor
  • Asset code & currency details
  • Corridor identity
  • Denomination selector
  • Refresh / Edit Plan

Middle Pane — Activity

  • Issuance flow stepper (5 stages)
  • Issuance registry activity feed
  • Per-note table with status
  • Refresh / Import Metadata / Download Manifest

Right Pane — Controls

  • Authorization snapshot
  • Governance approval banner
  • Authorize mint batch
  • Transfer destination
  • Transfer readiness checklist
  • Vault authentication
  • Batch configuration
  • Claiming institution
  • Packaging options
  • Transfer Ownership
§2

Data Model

IssuanceDraft

FieldTypeExampleDescription
idstringIA-E0E7A9E144D8-20260407Composite: IA-{hex}-{YYYYMMDD}
countrystringMaliIssuing country (target country of corridor)
central_bankstringBCEAOCentral bank name
governorstringJean-Claude Kassi BrouSigning authority name
citystringCOTONOUCentral bank city
branchstringOptional branch designation
asset_codestringL-XOFPrefixed ISO 4217: L-{currency}
swift_bicstringBCAOBJBJSWIFT/BIC of issuing central bank
symbolstringFCFACurrency symbol
serial_patternstringN11A1Typed segments: N=numeric, A=alpha. Drives serial number generation.
currency_nostring952ISO 4217 numeric code
ibanstringIBAN if applicable
country_codestringMLISO 3166-1 alpha-2
coin_symbolstringcSubunit symbol (centime)
iso_4217stringXOFISO 4217 alphabetic code
coin_namestringcentimeName of subunit
currency_namestringWest African CFA FrancFull currency name
denominationdecimal10,000Face value per note
pieces_per_unitinteger1Notes per unit (usually 1)
denomination_typeenumLinkedDomestic | Linked — determines corridor vs domestic issuance
asset_typestringPopulated from corridor config
statusenumdraftdraft | preview | authorization | generation | minted

IssuanceAuthorization

FieldTypeExampleDescription
authorization_idstringIA-E0E7A9E144D8-20260407Same as draft ID — authorization inherits draft reference
asset_codestringL-XOFAsset being authorized
total_amountdecimal50000.0Total face value of the authorization (denomination × notes)
backing_lock_idstring50d5ed31-f072-4018-b4e5-9fe883004208References LiquidityLock.id from Corridor Ops. Must be ACTIVE.
corridorstringGHA → MLISource and target country of the corridor
approved_bystring(governor operator identity)Doorkeeper token owner who approved
statusenumApprovedpending | approved | rejected
timestamptimestamp2026-04-07Approval timestamp (UTC)

MintBatch

FieldTypeExampleDescription
batch_iduuid70f75f6f-9164-4ae3-ae38-f347732cdc9dUUID generated at batch creation
asset_codestringL-XOFFrom authorization
serial_rangestringL-XOF-00000000001 → L-XOF-00000000005First and last serial in batch
number_of_notesinteger5Total notes in batch
denominationdecimal10,000Face value per note (XOF)
issue_datedate07.04.2026Date notes were minted
expiry_datedateNoneOptional expiry — "None" means perpetual
holder_idstringBank of Ghana (long hash)Initial holder — the issuing central bank
issuer_keystringBank of Ghana — BOG Primary KeyEd25519 key reference used to sign notes
authorization_idstringIA-E0E7A9E144D8-20260407Parent authorization
statusenummintedpending | minted | transferred

CBDCNote

FieldTypeExampleDescription
serial_numberstringL-XOF-00000000001Unique serial. Format: {asset_code}-{serial_pattern}
asset_codestringL-XOFFrom parent batch
denominationdecimal10,000Face value (XOF)
statusenumACTIVEACTIVE | TRANSFERRED | REDEEMED | BURNED
countrystringMaliIssuing country
currency_namestringWest African CFA FrancFull currency name
central_bankstringCentral Bank of West AfricaIssuing institution
issuance_datedatetime07.04.2026 10:28Creation timestamp (UTC)
tenderstringBanknotesTender type designation
denomination_valuestring10000 FCFADisplay value with symbol
denomination_nominalstring10000frNominal display value
holderstringBank of GhanaCurrent holder (changes on transfer)
issuerstringBank of Ghana — BOG Primary KeySigning issuer — never changes

TransferRequest

FieldTypeExampleDescription
target_institutionstringBANQUE ATLANTIQUE DU BENINFull name of claiming commercial bank
bic_swiftstringATBJBJBJSWIFT code of claiming bank
methodenumEmailEmail | SFTP
destinationstringinfo@towerpointgroup.comEmail address or SFTP host for delivery
verification_statusenumPendingPending | Verified | Failed
sftp_hoststringSFTP hostname (if method = SFTP)
sftp_directorystringRemote directory for SFTP delivery
sftp_usernamestringSFTP login username
sftp_passwordstringSFTP password (encrypted at rest)
transfer_statusenumpending | in_progress | completed | failed

Manifest

FieldTypeDescription
manifest_hashstringSHA-256 hash of the bundle contents. Displayed in right pane Manifest Hash field. Empty until batch is generated.
authorization_idstringReferences IssuanceAuthorization
batch_iduuidReferences MintBatch
integrity_statusenumunverified | verified | mismatch
generated_attimestampWhen manifest was created

VaultConfig

FieldTypeDescription
vault_namestringSelected from "Select Vault" dropdown. Vault must be pre-configured.
passwordstringVault encryption password (not stored — used only at runtime)
output_pathstringFilesystem path where encrypted bundle is written
tenderstringAuto-populated from issuance draft
modeenumEncryption mode (e.g. AES-256-GCM)
key_lengthintegerEncryption key size in bits
block_sizestringEncryption block/padding size
§3

Left Pane — Issuance Configuration

Issuance Config Draft section

Read-only display panel populated when a corridor is loaded. Shows the identity of the issuing (target) central bank — in the mockup, Mali / BCEAO — since the CBDC notes are denominated in the target country's currency.

FieldValue (mockup)Source / Validation
CountryMaliResolved from corridor's target_country ISO3 via kIso3Names map
Central banks de l'Afrique de l'Ouest, BCEAOResolved from kCbMap target entry
GovernorJean-Claude Kassi BrouStored in IssuerKey or central bank metadata record
CityCOTONOUCentral bank city from metadata
BranchOptional. Empty if not applicable.
GovernancePopulated with governance approval status after authorization

Asset Code & Currency section

All fields are read-only, derived from the loaded corridor and its target currency. The asset code L-XOF = "Linked" prefix + ISO 4217 code. "Linked" means the issuance is backed by a cross-border corridor lock (as opposed to "Domestic" which would be a single-country issuance).

FieldValueRule
SWIFT/BICBCAOBJBJFrom IssuerKey.swift_bic for the target central bank
SymbolFCFACurrency symbol from currency metadata
Serial patternN11A1Drives SerialAllocationService. N=numeric(11 digits), A=alpha(1 char), 1=literal. Must match corridor config.
Currency no.952ISO 4217 numeric code
IBANOptional — not applicable for XOF
Country codeMLISO 3166-1 alpha-2 of issuing country
Coin symbolcSubunit (centime)
ISO 4217XOFAlphabetic ISO currency code
Coin namecentimeName of the subunit denomination
Currency nameWest African CFA FrancFull English currency name

Corridor Identity section

Mirrors the selected corridor from Corridor Ops. Drives the authorization's backing lock reference.

FieldValueDescription
CountryGhanaSource country of the corridor (the funder)
Central BankBank of GhanaSource central bank
CurrencyGHSSource currency ISO code
GovernorDr. Johnson Pandit AsiamaGovernor of the source central bank
Total auth.50,000 L-XOFTotal authorized issuance amount for this corridor
FX rate1 GHS = 50.5425 XOFExchange rate used to calculate corridor value equivalence. From GET /api/v2/corridors/:id/fx_rate. Used in issuance valuation display only — does not change note denomination.
LiquidityBank of Ghana Reserve PoolWhich reserve pool backs this issuance
Funding lockLOCK-GHA-04208Short reference to the LiquidityLock in Corridor Ops. The full UUID is shown in the Authorization panel on the right (50d5ed31-…). This lock must be ACTIVE for authorization to proceed.

Select count denomination section

ControlValueBehaviour
Domestic / Linked radioLinked (selected)Domestic: notes are backed by local central bank funds only. Linked: notes are backed by a cross-border corridor lock. Linked is required when issuance spans two countries (e.g. GHA funding → MLI notes). Selection changes the asset_code prefix (Domestic = D-, Linked = L-).
Asset typeRead-only. Populated from corridor asset configuration.
Denomination10,000 ×Dropdown of allowed denominations for the currency. Selection determines face value per note. Validation: must be a valid denomination for the ISO 4217 currency.
Pieces/unit1Numeric stepper. How many physical notes per bundle unit. Default 1. Used to calculate total_notes = count × pieces_per_unit.
Active auths🇬🇭 GHA → 🇲🇱 MLI | L-XOF |Read-only chips showing all active authorizations for the current corridor. Clicking an auth chip loads it into the right pane.

Total issuance calculation: total_amount = denomination × pieces_per_unit × note_count. In the mockup: 10,000 × 1 × 5 = 50,000 XOF (matching the Authorization total_amount).

Left Pane Buttons

RefreshLeft Pane
Action
Reloads corridor identity and active authorizations from API. Useful when another operator has updated the corridor since the tab was opened.
API
GET /api/v2/corridors/:id, GET /api/v2/corridors/:id/fx_rate, GET /api/v2/issuance_authorizations/latest
Success
Left pane fields repopulated. Active auths chips refreshed. FX rate updated.
Failure
Toast error if API unreachable. Fields remain at last-known state.
Edit PlanLeft Pane
Action
Opens the issuance draft for editing. Unlocks denomination selector, pieces/unit, and domestic/linked toggle. Only available when status = draft or preview (not after authorization).
Precondition
issuance status must be draft or preview. If status ≥ authorization, button is disabled.
State change
Draft record becomes editable. Save triggers recalculation of total_amount.
§4

Middle Pane — Issuance Activity & Lifecycle

A. Issuance Flow Stepper (top bar)

A horizontal 5-stage pipeline showing the progression of the issuance. Each stage is a card with key identifiers. The active stage is highlighted. Current status shown in top-right corner: Approved (green badge).

StageDisplayEntry ConditionExit ConditionState
DraftIA-E0E7A9E144D8-20260407Corridor selected + denomination configuredOperator submits for previewissuance.status = draft
Preview🇬🇭 GHA → 🇲🇱 MLI / 10,000 × 5 / 50000.0Draft savedSubmitted to authorization queueissuance.status = preview
AuthorizationIA-E0E7A9… / 50d5ed31-… / L-XOF-00000000001 → L-XOF-00000000005 / —Preview reviewedSecond operator approves (Four-Eyes)issuance.status = authorization, auth.status = approved
Generation70f75f6f-9164-… / L-XOF / —Authorization approvedMint batch button clicked and batch createdissuance.status = generation
Minted5 notesBatch generated successfullyTransfer Ownership completedissuance.status = minted

B. Issuance Registry Activity Feed table

Displays all CBDCNotes generated in the current batch. Rows are populated after minting. Each row represents one note.

ColumnSourceExampleNotes
Row #Display index1–5Not a DB field — display row counter
Radio buttonUI onlySingle-select row for note detail view
SerialCBDCNote.serial_numberL-XOF-00000000001Clickable — opens note detail. Format: asset_code + serialized pattern
AssetCBDCNote.asset_codeL-XOFSame for all notes in batch
DenominationCBDCNote.denomination10,000Face value. Sortable.
StatusCBDCNote.status● ACTIVEGreen dot = ACTIVE. Color-coded pill. States: ACTIVE, TRANSFERRED, REDEEMED, BURNED.
CountryCBDCNote.countryMaliIssuing country
Currency NameCBDCNote.currency_nameWest African CFA FrancFull currency name
Central BankCBDCNote.central_bankCentral Bank of We...Truncated for display. Full name on hover/click.
Issuance DateCBDCNote.issuance_date07.04.2026 10:28Format: DD.MM.YYYY HH:MM
TenderCBDCNote.tenderBanknotesTender type — from vault config. Values: Banknotes, Coins, Electronic.
Denomination ValueCBDCNote.denomination_value10000 FCFAAmount with currency symbol
Denomination NominalCBDCNote.denomination_nominal10000frNominal display value with coin symbol

Table interactions

Rows are read-only. No in-table editing.
Radio button on each row enables single-select for note inspection.
Table is populated after MintBatch status = minted. Empty before that stage.
Horizontal scroll enabled — table has more columns than visible area.

C. Middle Pane Buttons

RefreshMiddle Pane
Action
Reloads the registry activity feed table. Fetches latest note statuses from API.
API
GET /api/v2/cvib/batches/:batch_id/notes (or equivalent notes endpoint)
Success
Table rows refreshed. Status pills updated (e.g. ACTIVE → TRANSFERRED after ownership transfer).
Import MetadataMiddle Pane
Action
Opens a file picker. Operator selects a metadata JSON/CSV file previously exported from another system. Populates issuance draft fields from the file.
API
POST /api/v2/cvib/batches/:id/import_metadata with file payload
Validation
File must match expected schema. Corridor and asset code must match current selection. Duplicate serials rejected.
Success
Draft fields pre-populated. Stepper advances to Preview stage.
Failure
Schema mismatch → error dialog listing invalid fields. No partial import.
Download / Verify ManifestMiddle Pane
Action
Downloads the manifest file for the current batch AND verifies its hash. The manifest is a signed inventory of all notes. Button is disabled (greyed out in mockup) until a batch has been generated.
API
GET /api/v2/cvib/batches/:batch_id/manifest → returns manifest file + hash
Verification
System recomputes hash of downloaded manifest. Compares to stored Manifest.manifest_hash. Updates Manifest.integrity_status.
Success
File saved locally. integrity_status → verified. Manifest Hash field on right pane populated.
Failure (mismatch)
integrity_status → mismatch. Transfer Ownership button blocked. Critical alert shown.
Disabled when
issuance.status < generation OR no batch exists
§5

Right Pane — Authorization, Transfer & Controls

A. Authorization Snapshot (top dropdown)

Dropdown at top of right pane reads "Bank of Ghana — BOG Primary Key". Selecting a key loads the authorization snapshot for that issuer key. All fields below are read-only snapshots.

FieldValueDescription
Issuance Authorization IDIA-E0E7A9E144D8-20260407Matches draft ID. Read-only.
Asset CodeL-XOFFrom authorization record
Total Amount50000.0Authorized total face value
Backing Lock ID50d5ed31-f072-4018-b4e5-9fe883004208Full UUID of LiquidityLock from Corridor Ops. Dropdown — selectable if multiple locks available.
Corridor🇬🇭 GHA → 🇲🇱 MLIVisual corridor indicator with flags

B. Governance Approval Banner

Large green "Approved" banner with text "Read-only snapshot of the request". Below it, a locked text area shows the authorization notes (read-only). This banner only shows when auth.status = approved. When pending, it shows a waiting spinner.

C. Authorize mint batch section

Authorize packageRight Pane (disabled)
State in mockup
Greyed out / disabled. Already authorized — cannot re-authorize.
When enabled
Only when issuance.status = preview AND no existing authorization exists for this draft.
Action when clicked
Creates IssuanceAuthorization record with status=pending. Notifies second operator. Stepper advances to Authorization stage.
API
POST /api/v2/issuance_authorizations {corridor_id, draft_id, backing_lock_id, asset_code, total_amount}
Authorize mint batchRight Pane (active)
Preconditions
auth.status = approved. issuance.status = authorization. Backing lock must be ACTIVE. No existing MintBatch for this authorization.
Action
Creates MintBatch record. Generates all CBDCNotes with serial numbers allocated by SerialAllocationService. Signs each note with IssuerKey. Sets issuance.status = generation → minted.
API
POST /api/v2/cvib/batches {authorization_id, issuer_key_id, denomination, note_count, holder_id, expiry_date}
Success
MintBatch created. Notes appear in registry table with status=ACTIVE. Stepper advances to Minted. Export send bundle button enables.
Failure
Lock expired → error "Backing lock is no longer active". Serial collision → "Serial range already allocated". Either blocks minting.
Export send bundleRight Pane
Preconditions
issuance.status = minted. Vault authenticated. Manifest verified. Transfer destination configured. All Transfer Readiness checks green.
Action
Packages all notes into an encrypted vault bundle. Generates manifest. Writes bundle to output_path. Does NOT yet send — staging step before Transfer Ownership.
API
POST /api/v2/cvib/batches/:id/export_bundle {vault_config, output_path}
Success
Bundle file created at output_path. Manifest hash populated in right pane. Ready for Transfer Ownership.

D. Transfer Destination section

Configures where and how the note bundle is delivered to the claiming commercial bank.

FieldValueDescription
Target (read-only)BANQUE ATLANTIQUE DU BENIN - ATBJBJBJPopulated from Claiming Institution selection. Full name + SWIFT code.
BIC/SWIFT (read-only)ATBJBJBJSWIFT code of claiming bank
Method dropdownEmailSelect Email or SFTP. Changes visible sub-fields.
Destination (read-only)info@towerpointgroup.comAuto-populated from claiming institution's registered email
VerificationPending (orange)Status of destination verification. Pending = not yet confirmed reachable. System attempts to verify on bundle export.
Email fieldinfo@towerpointgroup.comEditable if method = Email. Must be valid email format.
Host (SFTP)Select SFTP HostVisible only when method = SFTP
Directory (SFTP)Select DirectoryRemote path — visible when method = SFTP
Username (SFTP)SFTP login — visible when method = SFTP
Password (SFTP)•••••••• (masked)SFTP password — visible when method = SFTP. Stored encrypted.

E. Transfer Readiness Checklist

Four system checks that must all be green before Transfer Ownership is permitted. Each is a checkbox — green tick = passed, empty = not yet checked.

CheckStatus (mockup)System check
Vault Authenticated☐ (unchecked)Vault password entered and validated against vault_name. Vault file accessible at output_path.
Manifest Verified☐ (unchecked)Manifest hash recomputed and matches stored hash. integrity_status = verified.
Target Host Reachable✅ (green)System ping/connectivity test to destination email server or SFTP host succeeded.
Claiming Institution Verified✅ (green)Claiming institution's SWIFT code validated against institution registry. BIC/SWIFT = ATBJBJBJ confirmed.
Transfer Ownership button remains disabled until ALL four checks show green ticks. No partial transfer is permitted.

F. Vault Authentication section

FieldTypeDescription
*PasswordPassword input (masked)Vault encryption password. Required. Used to decrypt/encrypt the vault bundle. NOT stored.
*Confirm PasswordPassword input (masked)Must match Password field. Validation: exact character match.
*Vault NameDropdown "Select Vault"Required. Pre-configured vault identifiers. Selection loads vault metadata (mode, key length, block size).
Output pathText "Select vault above..."Auto-populated from vault config. Filesystem path where bundle is written. Read-only until vault is selected.
*TenderAuto-populated from issuance tender type (Banknotes). Read-only display.
*ModeDropdown "Select Mode"Encryption mode — e.g. AES-256-GCM. Required. Loaded from vault config on vault selection.
*Key LengthDropdown "Select Key Length"Encryption key length in bits — e.g. 256. Required.
*Block SizeDropdown "Select Padding"Block/padding size for the cipher. Required.

When vault name is selected, Mode, Key Length, and Block Size are auto-populated from the vault configuration record. The operator must still enter Password and Confirm Password manually — these are never stored.

G. Batch Configuration section (Authorization Snapshot lower half)

FieldValueDescription
Issuance Authorization IDIA-E0E7A9E144D8-20260407Read-only. Links batch to authorization.
Asset CodeL-XOFRead-only. From authorization.
Backing Lock ID50d5ed31-f072-4018-b4e5-9fe883004208Dropdown. Active Corridor Ops lock selected here — must match authorization's backing_lock_id.
Allocated Serial BlockL-XOF-00000000001 → L-XOF-00000000005Read-only after generation. SerialAllocationService output.
Batch ID70f75f6f-9164-4ae3-ae38-f347732cdc9dRead-only UUID generated when batch is created.
Corridor🇬🇭 GHA → 🇲🇱 MLIRead-only corridor indicator.
Initial HolderBank of GhanaRead-only. The issuing central bank is always the initial holder.
Holder IDBANQUE ATLANTIQUE DU BENIN (long hash)The claiming institution's DID/holder identifier. This is set to the target bank — the holder AFTER transfer. The long hash (3a42dbe76594bf…) is the cryptographic holder identity.
Issuer KeyBank of Ghana — BOG Primary Key (dropdown)Ed25519 key used to sign notes. Must be an active IssuerKey for the source central bank.
Expiry DateNoneOptional note expiry. "None" = perpetual validity.
Authorization IDIA-E0E7A9E144D8-20260407Repeated reference for clarity.
Manifest Hash(empty)Populated after Export send bundle. SHA-256 of bundle contents. Used for integrity verification by claiming institution.

H. Claiming Institution section

FieldValueDescription
Commercial BankBANQUE ATLANTIQUE DU BENIN - ATBJBJBJName and SWIFT of receiving bank. Populated from institution registry.
CityCity of claiming bank. Optional — from registry.
BranchBranch of claiming bank. Optional.
BIC / SWIFT CodeATBJBJBJMachine-readable SWIFT identifier. Used for verification check.
Public key section label"Please use this section to select the public key"Instructional label for key selection
Public keySelect Public Key (dropdown)The claiming institution's Ed25519 public key. Used to encrypt the bundle so only they can decrypt it. Must be selected before Transfer Ownership.

I. Packaging Options section

FieldValueEffect on notes
WatermarkSimulation Only (dropdown)Embeds a visible watermark text on generated note documents. "Simulation Only" marks notes as non-production. Production deployments use "None" or a custom watermark.
MarkingNone (Original) (dropdown)Visual marking applied to note images/PDFs. "None (Original)" = unmodified. Other options may include color overlays or stamps.
Note SizeOriginal (100%) (dropdown)Size scaling of note document output. 100% = full size. Reduced size options for preview/specimen purposes.
Print Barcode checkbox☑ Print barcode on noteWhen checked, a Code 128 barcode encoding the serial number is printed on each note. Used by validation desk for scanning. Barcode is the sole machine-readable identifier — QR codes are not used.

J. Transfer Ownership button

Transfer OwnershipRight Pane — Primary Action
Preconditions (ALL required)
1. issuance.status = minted
2. All 4 Transfer Readiness checks = green
3. Vault authenticated (password + vault name set)
4. Manifest verified (integrity_status = verified)
5. Claiming Institution public key selected
6. Transfer destination configured (email or SFTP credentials)
Step-by-step
1. Client validates all preconditions locally. Shows error for any failed check.
2. Bundle encrypted with vault key + claiming institution's public key.
3. POST /api/v2/cvib/batches/:id/send_bundle_email OR SFTP delivery via sshpass batch file executed in QtConcurrent background thread.
4. On delivery success: all CBDCNotes.holder updated to claiming institution's holder_id.
5. All notes.status → TRANSFERRED.
6. issuance.status → transferred.
7. Corridor Ops linked_outstanding updated.
8. Audit log entry created: transferred_by, transferred_at, target_institution, delivery_method.
Ledger impact
CBDCNote.holder = claiming institution holder_id. CBDCNote.status = TRANSFERRED. Corridor linked_outstanding += total_amount.
Failure: delivery error
Email bounce or SFTP timeout → notes remain ACTIVE, holder unchanged. Error dialog with retry option. issuance.status stays minted.
Failure: vault error
Wrong password → bundle encryption fails. "Vault authentication failed." Notes unchanged.
Failure: mid-transfer
If delivery fails after partial send (network cut): system rolls back CBDCNote status changes. Idempotent retry is safe — delivery_reference prevents double-send.
§6

Button-Level Summary

ButtonPaneEnabled whenAPI callSuccess effect
Refresh (left)LeftAlwaysGET /corridors/:id, GET /fx_rate, GET /issuance_authorizations/latestLeft pane repopulated
Edit PlanLeftstatus ∈ {draft, preview}PATCH /issuance_drafts/:idFields editable, recalculates total
Refresh (middle)MiddleAlwaysGET /cvib/batches/:id/notesRegistry table refreshed
Import MetadataMiddlestatus = draftPOST /cvib/batches/:id/import_metadataDraft pre-populated from file
Download/Verify ManifestMiddlestatus ≥ generationGET /cvib/batches/:id/manifestFile saved, hash verified
Authorize packageRightstatus = preview, no auth existsPOST /issuance_authorizationsAuth created, notifies second operator
Authorize mint batchRightauth.status = approved, status = authorizationPOST /cvib/batchesBatch + notes created, status → minted
Export send bundleRightstatus = minted, vault configuredPOST /cvib/batches/:id/export_bundleBundle written, manifest hash populated
Transfer OwnershipRightAll 4 readiness checks greenPOST /cvib/batches/:id/send_bundle_emailNotes → TRANSFERRED, holder updated
§7

System Rules & Edge Cases

Authorization missing

Authorize mint batch button remains disabled. issuance.status cannot advance past authorization stage.
If authorization expires (no second operator action within TTL): auth.status → expired. Operator must re-submit via Authorize package.

Backing lock insufficient or expired

If the LiquidityLock referenced in backing_lock_id has status != active at the time Authorize mint batch is clicked, the server returns HTTP 422 {code: "lock_insufficient", message: "..."}. Minting is blocked. Operator must return to Corridor Ops and create a new lock.

Duplicate serial numbers

SerialAllocationService maintains a per-corridor sequence counter. Serials are allocated atomically in a DB transaction. Duplicate serial → HTTP 409 Conflict. Batch creation rolled back entirely.
Import Metadata: if uploaded file contains a serial that already exists → entire import rejected. No partial import.

Transfer fails mid-process

Email bounce after send: notes remain ACTIVE. Retry is safe — email delivery uses an idempotent delivery_reference token to prevent double-send.
SFTP connection dropped mid-transfer: sshpass script detects partial upload. Status not updated. Full retry required.

Manifest mismatch

Manifest.integrity_status → mismatch. Transfer Ownership button blocked. Manifest Verified readiness check → unchecked (red).
Operator must re-export bundle (Export send bundle) which regenerates the manifest and recomputes the hash.

Vault authentication failure

Wrong password → "Vault authentication failed." error. Vault Authenticated readiness check → unchecked.
Vault name not found → "Vault not found." error. Output path field remains empty.
Password mismatch (password ≠ confirm password): client-side validation prevents vault authentication attempt.

Simulation vs Production watermark

Packaging Options watermark = "Simulation Only" is the default and safe value. Notes generated with this watermark are visually marked and cannot be mistaken for production notes.
Production deployments must explicitly change watermark to "None" or a custom value. This is a mandatory operator action — no auto-promotion.
§8

End-to-End Flow

Complete walkthrough using the values visible in the mockup: GHA → MLI corridor, 5 × 10,000 XOF notes, claiming institution BANQUE ATLANTIQUE DU BENIN.

Operator creates issuance draft

Selects GHA → MLI corridor. Left pane auto-populates with BCEAO metadata, L-XOF asset code, serial pattern N11A1. Selects "Linked", denomination 10,000, pieces 1. Status = draft.

System generates preview

Operator clicks Edit Plan → saves. Preview stage card shows: 🇬🇭 GHA → 🇲🇱 MLI / 10,000 × 5 / 50000.0. Status = preview.

Authorization submitted

Operator clicks "Authorize package". POST /issuance_authorizations creates auth with status=pending, backing_lock_id=50d5ed31-…. Governor/second operator sees pending item in Governor Desk. Status = authorization.

Authorization approved (Four-Eyes)

Second operator (Dr. Johnson Pandit Asiama) approves in Governor Desk. auth.status → approved. Green "Approved" banner appears in right pane. Stepper authorization card shows IDs. "Authorize mint batch" button enables.

Mint batch created

Operator clicks "Authorize mint batch". POST /cvib/batches. SerialAllocationService allocates L-XOF-00000000001 through L-XOF-00000000005. 5 CBDCNote records created, all status=ACTIVE. Batch ID 70f75f6f-… generated. Registry table populates with 5 rows. Status = minted. Stepper shows "5 notes".

Transfer configured

Operator selects target institution BANQUE ATLANTIQUE DU BENIN, method Email, enters destination info@towerpointgroup.com. Selects Bank of Ghana BOG Primary Key as issuer. Selects vault, enters password. Claiming Institution Verified and Target Host Reachable checks turn green.

Bundle exported and manifest verified

Operator clicks "Export send bundle". Bundle encrypted and written to output path. Manifest hash generated and shown in Manifest Hash field. Operator clicks "Download/Verify Manifest" — integrity_status = verified. Manifest Verified check turns green.

Ownership transferred

All 4 readiness checks green. Operator clicks "Transfer Ownership". Bundle emailed to info@towerpointgroup.com. All 5 notes.holder → BANQUE ATLANTIQUE DU BENIN holder_id. All notes.status → TRANSFERRED. issuance.status → transferred. Corridor linked_outstanding += 50,000. Audit trail written.

End state: 5 TRANSFERRED notes on L-XOF, holder = BANQUE ATLANTIQUE DU BENIN, corridor GHA→MLI linked_outstanding = 50,000 XOF, full audit trail from draft through transfer recorded, manifest verified by claiming institution.
🗑️

Remove Saved Contact?

Contact Name
abc123...xyz789

⚠️ You will need their Cash Code again to send them money in the future.

CBDC Preview
Status Valid
Currency -
Amount -
Serial Number -
Uploading files...
Please wait
💸
Confirm Giving Cash
Check the details below
Amount GHS 0.00
To Cash Code ...
Cash Notes 0
⚠️

Already Transferred

The following CBDC notes have already been transferred and cannot be used again.

📱 Your Digital Cash Code QR

Let others scan this to send you money

How to use: The sender opens "Send Digital Cash" and taps the scan icon to read this QR code.

Trade Claim Submission

Submit verified trade to request cross-border liquidity.

Claiming Institution

Select Country...

Trade Details

Select Corridor first...

Select a corridor to load destination-country institutions.

Beneficiary Information

Supporting Documents

Click to upload or drag and drop

PDF, PNG, or JPG (max 10MB each)

Declarations

Confirm Trade Claim
Please review the details before submitting
Amount
Corridor
Institution
Beneficiary
Invoice Ref
Direction
⚠️

Once submitted, this trade claim will enter the supervisory review queue and cannot be edited. Please verify all details are correct.

Trade Claim Submitted!

Your trade claim has been successfully submitted and is now pending
review for pre-clearance by regulators.

Trade Claim ID:
TC-20260215-000000

An initial pre-clearance review shows your trade appears compliant.
It will now be routed for final approval.

Pre-cleared trade is pending review by regulators for approval.
Beneficiary funds will be held while the trade is being finalized.
Track status any time via the Issuance → Desk section.
📊 Trade Summary:
Trade Amount KES 1,000,000
Trade Direction Import into Nigeria
Beneficiary Kenya Exports Ltd
Help & Docs · Contact Support · Dashboard

Draft Saved!

Your trade claim has been saved as a draft.
You can continue editing it anytime.

Draft Reference:
TC-00000000

Your draft has been saved and can be accessed from your dashboard.
Complete the submission when you're ready.

Draft saved securely to your account.
Continue editing anytime from your dashboard.
Submit when ready via Drafts section.
📋 Draft Summary:
Amount KES 0
Direction -
Status Draft
Help & Docs · Contact Support · Dashboard

Issuance Desk

Manage and review recent cross-border trade claims.

Claim ID
Direction
Destination Corridor
Amount
Status
View

Loading trade claims...

No trade claims found

Showing 0 of 0
Help & Docs · Contact Support · Dashboard
SA
Admin Console v1.2.3

Administrator Console

System management and monitoring dashboard.

Total Corridor Volume
USD Equivalent
Pending Claims
⏳ Pending
Daily Limit Utilization
USD Equivalent
Non-Compliance Alerts
Admin viewed trade claims. Today at

Latest Trade Claim Activity

Read-only monitoring view. No transactional authority.

ID Institution Amount Corridor Status Risk
Loading claims...

Corridor Volume

0

Active Issuance Queue

0 Pending requests

Corridor Quota Limits

Corridor Corridor Limit Remaining Daily Limit Remaining Compliance Status
Loading corridor data...
Admin Console v1.2.3
🔒 System Admin