View Markdown Β· Documentation index (llms.txt)
Feature Specification: FDC3 Post-Trade Cash-Leg Payment Transfer (TraderX β BankerX)
Feature Branch: 016-post-trade-settlement-bankerx
Created: 2026-09-24
Status: Specification Complete & Reference Implemented
State Model: Child state of 014-fdc3-intent-interoperability (014 stays the pristine FDC3 baseline; 016 owns the settlement-specific changes in its own overlay per ADR-002)
Receiver Variants: Local mock receiver (default, offline-reproducible) + BankerX reference adapter (opt-in)
Standards Alignment: FINOS FDC3 3.0 (PR #2204, Issue #444), ISO 20022 CBPR+ (pacs.008, pacs.002), RFC 4122 (UUIDv4 UETR)
Input: Transition delta from 014-fdc3-intent-interoperability
0. Terminology β what this state actually demonstratesβ
Per the maintainer review (finos/traderX #470, Sept 29): the example demonstrates a currency payment transfer β the cash leg of an already executed trade. TraderX sends the settled currency amount owed on the trade to the counterparty over the settlement rail. It does not demonstrate securities delivery-versus-payment (no security leg is delivered in this state β the DvP security leg is out of scope) and it does not demonstrate payment-versus-payment (no simultaneous second-currency leg is exchanged). The UETR keys the payment back to the original trade; the blotter row's status reflects only that the trade's cash obligation settled.
0b. Evidence classification β what an Acsc actually proves hereβ
Per the acceptance review (PR #470): a settlement claim must be matched to the evidence behind it. Statuses reach the blotter over three channels with three different evidence strengths, and the state classifies them honestly instead of presenting all three as on-chain proof:
| Channel | Evidence behind the Acsc | How the UI classifies it |
|---|---|---|
| Solana devnet ledger (Estate rail legs) | On-chain proof. The desk's settlement memo (carrying the row's UETR) exists on an actual devnet transaction to the creditor token account; the blotter's memo watcher (checkOnChainSettlement) reads the ledger itself, records the txSignature, and the desk's own WOTS+ re-derivation verdict rides along (alcoveVerified). | Receipt modal shows the TX SIGNATURE and VERIFICATION: pacs.008 memo verified from the Solana ledger; log lines say ON-CHAIN SETTLED. |
Settlement registry adapter (synaptic-traderx-adapter, demo port 8415) | Counterparty/peer broadcast persisted by a demo adapter. Entries are published and reconciled across browsers (fingerprint + UETR adoption guards prevent wrong-row stamps), but the adapter is file-backed and unauthenticated β it is demo-estate infrastructure, not a source of cryptographic proof. | Row-level state only; treated the same as a broadcast (no tx evidence shown). |
Mock receiver / reference adapter broadcast (synaptic.settlementStatus) | The receiver's own word. In the offline acceptance flow the mock receiver settles on a demo rail and returns no tx hash; validation of asset/amount/counterparties happened at dispatch (validatePaymentContext: ISO 4217 currency, canonical pair+rate, complete debtor/creditor, UUIDv4 UETR) and the receiver page echoes those fields for operator review β but there is no cryptographic attestation behind the acceptance. | Receipt modal VERIFICATION row reads counterparty Acsc β no tx evidence (mock/demo boundary); the blotter log states the broadcast carried no tx evidence; the mock receiver badge marks the settlement simulated settlement β no tx evidence (demo rail). |
Trust boundary, stated plainly: in this state only the Solana-memo/ledger path verifies transaction success; the adapter and mock-receiver paths carry unauthenticated counterparty claims, which is acceptable for a demo estate because the same channels cannot be used to forge money movement β only to mislabel a row. Production settlement would close this boundary with a signed pacs.002 from the settling desk (or the ADR-555 enclave attestation the Estate rail already runs) and amount/counterparty correlation inside the signed envelope; that hardening is out of scope for the reference implementation and is deliberately documented rather than faked.
1. Executive Summaryβ
While TraderX provides institutional-grade pricing awareness, order matching, and trade execution blotters, enterprise capital markets currently suffer from a T+2 settlement latency gap. Trades executed in milliseconds must wait 48 hours to clear across legacy correspondent banking networks due to disconnected post-trade clearing systems.
This specification completes the financial trading lifecycle by bridging TraderX (Front-Office Execution) with BankerX (Post-Trade Clearing & Settlement):
- When an FX trade execution occurs in the TraderX blotter, the trader can raise the standardized FINOS FDC3 3.0 intent:
fdc3.raiseIntent("StartPayment", paymentContext) - The intent routes into BankerX (
synaptic-fx-terminal), carrying the standardizedfdc3.paymentcontext (per FINOS PR #2204). - BankerX executes pre-flight compliance via the ADR-555 Alcove Runtime Guardian (sub-8ms), screen sanctions via in-memory Bloom filters (zero wire leakage), verifies solvency (Ξ β‘ 0), and triggers atomic settlement across the Trilateral Settlement Powerhouse (Solana Token-2022
RequiredMemoTransfers+ XRPL Altnet DENSE-16 SHAMap + SynapticChain L1 SMR) within 400 milliseconds. - Canonical ISO 20022
pacs.008(Credit Transfer Initiation) andpacs.002(Payment Status Report / Receipt withAcscconfirmation) XML receipts are generated and bound to the RFC 4122 UUIDv4 SWIFT UETR.
2. User Storiesβ
- As a spot FX trader, I want to click "Settle Trade" directly from my TraderX execution blotter so that settlement instructions are immediately dispatched to the clearing desk without re-keying amounts, accounts, or currencies.
- As a clearing operations officer, I want BankerX to receive FDC3 payment intents from TraderX, validate them against ISO 20022 CBPR+ schema rules, and screen counterparty identities locally in
sub-8mswithout leaking order book data over external network wires. - As an enterprise compliance auditor, I want every trade settlement to emit immutable ISO 20022
pacs.002.001.10settlement confirmation receipts that cryptographically bind the SWIFT UETR to on-chain transaction hashes. - As a system maintainer, I want the TraderX desktop experience to remain fully operational and graceful if no FDC3 Desktop Agent or post-trade settlement receiver is active.
- As a learner moving from 014 to 016, I want a reproducible request-to-outcome demonstration (offline, via the local mock receiver) so I can understand the settlement lifecycle β correlation, duplicate prevention, rejection/timeout handling, and settlement status as a concept distinct from trade status β without any external service or testnet dependency.
3. Functional Requirementsβ
- FR-01601: TraderX Trade Blotter SHALL provide an action button labelled
SETTLE (BANKERX)on trade rows only whenfdc3.findIntent("StartPayment")resolves to at least one workspace participant. Base TraderX with no post-trade participant (no mock receiver, no BankerX) SHALL render the pristine 014 blotter with no action column; the button appears dynamically when a participant declaringStartPaymentsupport joins the workspace. - FR-01602: Clicking
SETTLE (BANKERX)SHALL raise standard FDC3 3.0 intentStartPaymentwith a fully formedfdc3.paymentpayload per FINOS PR #2204. - FR-01603: The
fdc3.paymentpayload SHALL carry the trade's cash obligation, mapped from the trade by the settlement-instruction module (generation/payment-instruction.mjs; Angular mirror in the trade-blotter overlay) β never the traded instrument verbatim:type:"fdc3.payment"(PR #2204; receivers accept legacy"fdc3.paymentContext"for backward compatibility)amount: the cash amount incurrency's minor units. FX pair trade: the traded base-currency quantity. Equity trade:quantity Γ fill pricerounded to minor units (float drift such as14020.964999999998MUST NOT reach the wire).currency: an active ISO 4217 code β the base leg of an FX pair security, or the venue quote currency (KES) for an equity trade. An instrument symbol (BAC) is never acurrency; the blotter refuses to dispatch, and the receiver validator rejects, any code outside the ISO 4217 set.pair+rate: a coupled OPTIONAL frame, present only on FX cash legs (pair= the traded pair,rate= the execution fill price). Equity settlements are same-currency transfers and carry neither β the blotter holds no FX data for them and none is invented. A lonepairor a lonerateis an invalid instruction.debtor/creditor: party names and settlement accounts following the trade side β the buyer owes the cash (debtor = executing desk on Buys, counterparty desk on Sells).networkRouting: Declared routing preference (Trilateral Powerhouse,Solana Token-2022, orXRPL Altnet) and RFC 4122 UUIDv4uetr
- FR-01604: If the FDC3 Desktop Agent returns an
IntentResolution, TraderX SHALL log the target application ID and resolution status in structured diagnostic logs. - FR-01605: If FDC3 is unavailable, the blotter SHALL remain fully functional (014 baseline behavior; no action column is rendered because intent discovery cannot resolve). If a dispatched
StartPaymentintent fails to raise, TraderX SHALL display a non-blocking toast notification:"FDC3 Desktop Agent unavailable β launching BankerX via direct web dispatch"and provide a fallback URI link tohttps://terminal.synapticchain.xyz. - FR-01606: TraderX SHALL listen for settlement status broadcasts (
synaptic.settlementStatus, carrying the ISO 20022pacs.002status:Acsc,Rjct,Pndg) and flip the dispatched blotter row throughSETTLINGβ¦βSETTLED/REJECTED, correlated strictly by matching UETR. Unmatched status reports SHALL be logged, never applied. - FR-01607: TraderX SHALL prevent duplicate settlement requests per trade row: a row with a settlement in flight (
Pndg) or settled (Acsc) SHALL suppress further dispatches with an explanatory status message; a failed dispatch SHALL revert the row cleanly. - FR-01608: The generated 016 runtime SHALL include the local mock receiver (
generation/mock-receiver/) as the DEFAULT settlement receiver so the request-to-outcome demonstration and tests are reproducible offline. The BankerX settlement terminal SHALL be supported as an opt-in reference adapter via an app-directory URL swap (provider-neutral; no TraderX change). - FR-01609: Settlement dispatch state in TraderX SHALL be session-scoped only (UETR, row correlation, status). No server-side persistence, no schema or migration changes.
4. Architectural Diagram: The Two-Tier Adapter Patternβ
Receiver variants behind the same FDC3 boundary (provider-neutral):
Tier 2a β Local mock receiver (default):generation/mock-receiver/, dependency-free, offline-reproducible; emitssynaptic.settlementStatus(Acsc/Rjct/Pndg).Tier 2b β BankerX reference adapter (opt-in): the live settlement terminal below.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TIER 1: FRONT-OFFICE EXECUTION (TraderX Angular Client) β
β β’ Trade Blotter: Row click -> Settle (BankerX) [findIntent-gated] β
β β’ Dispatches: fdc3.raiseIntent("StartPayment", paymentContext) β
β β’ Runtime: Pure web / FDC3 3.0 container (sub-2ms dispatch, zero crypto) β
ββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
Standard FDC3 Intent Bus / OpenFin / Sail
β
ββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β TIER 2: POST-TRADE SETTLEMENT ENGINE (BankerX / synaptic-fx-terminal) β
β β’ FDC3 Intent Listener captures "StartPayment" context β
β β’ Auto-populates PaymentPanel with Debtor, Creditor, Amount, Pair, UETR β
β β’ Triggers Tier 2 ADR-555 Local Enclave Preflight: β
β 1. ISO 20022 pacs.008 Schema Validation (0.25 ms) β
β 2. In-Memory Merkle Bloom Filter Sanctions Check (0.68 ms) β
β 3. Mantis Invariant 9 Solvency Gate: Gross == Net + TSA Fee (1.85 ms) β
β 4. ADR-062 256-Lane Rendezvous Hash Partitioning (0.75 ms) β
β 5. ADR-062 Gap-Tolerant 256-Bit Sliding Window Nonce (0.40 ms) β
β 6. Dual Ed25519 + 67-Chain WOTS+ Post-Quantum Signing (2.10 ms) β
β β’ Total Enclave Pre-flight Latency: ~6.03 ms (< 8.00 ms Budget) β
ββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
Dispatches Atomic Settlement to Ledger Rails
β
ββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β TIER 3: TRILATERAL SETTLEMENT POWERHOUSE β
β ββ Rail 1: Solana Token-2022 (RequiredMemoTransfers, Error 0x24 on bypass)β
β ββ Rail 2: XRPL Altnet (DENSE-16 SHAMap Native Proof + pacs.002 receipt) β
β ββ Rail 3: SynapticChain L1 (256-Lane SCBFT Consensus & 150M TSA Reserve) β
β β
β Output: Canonical ISO 20022 pacs.002.001.10 Settlement Receipt (Acsc) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
5. Non-Functional Requirements & Performance SLAsβ
- NFR-01601 (Standard Purity): TraderX client codebase MUST NOT import blockchain SDKs (e.g.
@solana/web3.js,xrpl). All ledger logic is strictly encapsulated within the BankerX Tier-2 Enclave. - NFR-01602 (Pre-Flight SLA): Local compliance validation in BankerX must execute in
< 8.00 msbefore any payload leaves the host machine. - NFR-01603 (Settlement SLA): On-chain settlement confirmation must complete in
< 500 mson Solana Token-2022. - NFR-01604 (Auditability): Every settlement must generate a 14-point CBPR+ compliant
pacs.008initiation document and a signedpacs.002settlement receipt.