NAB ISO 8583 0100 Santander 0200 MXN DE55 ICC ARQC TSYS dialect FDY_ERR_NOT_IMPLEMENTED
Paying.co · Foundry · Processor Castings · a living roster

Castings. The processors
built against the mold.

Doc 04 defined the contract — fdy_processor_adapter_vtbl_t, canonical in, canonical out. This doc inventories the processors cast against it, the shared building blocks they lean on, and exactly what it takes to add the next one. The roster is living: new processors join continually, so adapters are tracked by status — shipped in the native C engine, or planned as an aspirational target not yet in the source tree.

roster living shipped NAB · TSYS · Santander · Global Payments · EPX C99 · vtable additive · no engine change
Shipped · live in the C engine

Each adapter is a single authorize() over the canonical transaction, sealed in its own src/<name>/ directory with no shared dependency graph. All are registered in the foundry-processors CMake bundle and reachable through foundry-demo --processor <id>.

NABISO 8583
stub · approves
North American Bancard
Translates canonical → NAB ISO 8583 MTI 0100 → AuthResponse. The casting runs end-to-end and returns a stub APPROVED (response code 00) so the seam is provable; the ISO build/parse and live host send land at the documented TODO. Carries the DE 55 tag list in NAB ICC Data Requirements order.
formatISO 8583 · MTI 0100
currencyUSD (840)
transportNAB host (not yet wired)
coversreversal · advice · partial-auth · pre-auth · completion · refund
pendingreal ISO 8583 build/parse + live NAB host send (returns a stub APPROVED today)
TSYSISO 8583
stub · approves
TSYS
Canonical → TSYS dialect → AuthResponse on the shared vtable. Like NAB, it returns a working stub APPROVED to prove the casting runs, with the processor specifics confined to the build/parse seams so the routing layer never sees them.
formatISO 8583
transportTSYS host (not yet wired)
coverspurchase · refund · void · auth-only · completion
pendingreal ISO 8583 build/parse + live TSYS host send (returns a stub APPROVED today)
SantanderISO 8583 · MX
not yet implemented
Santander · Mexico acquiring
Canonical → Santander ISO 8583 0200 → AuthResponse. authorize() derives the DE 55 view (proving the seam works) then returns FDY_ERR_NOT_IMPLEMENTED pending Santander's host spec and test endpoint — the engine maps this to the error-96 path. Install the mock adapter for integration testing in the meantime. DE 55 tags in Santander cert-guide order.
formatISO 8583 · 0200
currencyUSD (840) · MXN (484)
transportawaiting host spec + test endpoint
coversreversal · advice · pre-auth · completion
pendingSantander host spec + test endpoint — authorize() derives the DE 55 view then returns FDY_ERR_NOT_IMPLEMENTED (error-96 path)
mocktest
shipped
development & integration testing
The reference casting used to exercise the engine and stand in for any adapter whose host isn't wired. It's the default target of foundry-demo and the integration-test stand-in for Santander.
formatin-process
coversfull canonical verb set
Global PaymentsREST · JSON
shipped · full impl
Global Payments · Unified Commerce Platform
A full implementation of the UCP REST API — canonical mapped to structured JSON, no ISO assembly. Sale and refund POST /ucp/transactions; void and capture hang off the prior transaction reference threaded down by the engine. Request build and response parse are complete; the transport rides a caller-supplied fdy_io_engine_t, with foundry_io_curl as the reference desktop engine and a Kotlin HTTP executor on Android.
formatREST · JSON (UCP)
authBearer access token · x-gp-version
transportHTTPS via fdy_io_engine_t (curl · Kotlin)
coverssale · refund · void · capture
pendingcard-present / chip EMV request fields — awaits Global Payments' card-present spec
EPXCustom Pay XML
build/parse · seam
EPX (via NAB)
Builds and parses EPX/NAB "Custom Pay" DETAIL/RESPONSE XML for sale, auth, capture, void, and refund, with a full non-AVS response-code table (epx_response_codes.h) mapped to outcomes. The transport is wired through the same fdy_io_engine_t seam as Global Payments, and --processor epx compiles and runs — but that seam is HTTP-shaped plumbing, not EPX's real link.
formatDETAIL / RESPONSE XML
transportfdy_io_engine_t seam (HTTP-shaped)
coverssale · auth · capture · void · refund
pendingreal socket transport — EPX's host link is a raw TCP+TLS ENQ/ACK/STX/ETX/LRC handshake that one HTTP request/response cannot represent
PorticoXML · POS Gateway
shipped · full impl
Portico (Heartland / Global Payments)
A full implementation of Portico's "Hps.Exchange.PosGateway" XML API — request/response build and parse for sale, auth, capture, void, and refund, with a response-code table (portico_response_codes.h) mapped to outcomes, over the same fdy_io_engine_t seam as Global Payments. Unlike EPX, Portico's real wire protocol genuinely is one HTTPS POST/response per transaction, so this is a faithful transport, not plumbing over an unrepresentable handshake.
formatHps.Exchange.PosGateway XML
authSecretAPIKey in XML body (Header/SecretAPIKey), not an HTTP header
transportHTTPS via fdy_io_engine_t (curl · Kotlin)
coverssale · auth · capture · void · refund
by refvoid, capture, and refund are sent by reference to a prior GatewayTxnId
Planned · aspirational targets, not yet in the source tree

These castings are designed against the same contract but are not present in the current C engine. They represent the direction of the roster — each lands as a sealed src/<name>/ directory when its engagement is funded, following the three-touch add path below.

TransITgateway
planned
TSYS · TransIT Gateway
TSYS's gateway with a manifest/device-token flow. Classic gateway dialect — the processor specifics confined to the build/parse seams so the routing layer never sees them.
authManifest + device token
transportGateway API
EPGgateway
planned
Elavon · Payment Gateway
Elavon's Payment Gateway, chosen over the legacy viaConex platform for the newer integration surface. Standard credit set on the shared vtable, same canonical contract as the rest.
authGateway credentials
transportEPG API
CybersourceISO · VPC
planned
Cybersource · Visa Platform Connect
Cybersource / Visa Platform Connect, targeted for the Bank of America certification path. ISO-format messaging behind the same canonical interface — the dialect never leaks into the engine.
authVPC credentials / key ceremony
transportVPC endpoint
Shared building blocks · what the castings stand on

The shipped adapters don't reimplement common concerns. They lean on engine-level modules so each casting stays thin.

money.hcurrency
exponent-aware minor-unit formatting
Replaced per-adapter local formatters and fixed a real bug where the engine hardcoded currency_exponent = 2 regardless of currency. fdy_money_format_minor() now covers 0-decimal (JPY), 2-decimal (USD/EUR/MXN), and 3-decimal (BHD/KWD) correctly.
API facadeengine
authorize · void · refund · completion
The C facade now exposes fdy_api_void() and fdy_api_refund(), and fdy_api_completion() was rewired to actually invoke the adapter through the engine rather than mirroring. All transaction verbs route to the active casting through one path.
Adding the next casting · the mechanical path

The package was structured so a new processor is additive, never a restructuring. Three touches, no engine change.

1

Create the directory

Add src/<name>/ with the adapter's vtable implementation and its two build/parse seams. The processor dialect lives entirely here.

2

Register in the build

Add one line to the PROCESSORS list. The build picks up the new casting automatically.

3

Expose the header

Add one #include to processors.h. The registry can now resolve the new adapter at runtime.

Verified. The engine test suite runs green under CMake, clean under AddressSanitizer, UndefinedBehaviorSanitizer, and LeakSanitizer. Coverage spans TLV/normalizer/registry semantics, the engine's online/offline/timeout/cancel/error branches with adapter call-count assertions, the view engine, and the end-to-end + API idempotency paths including void, refund (full/partial/over-refund), currency mismatch, and over-capture.
Open items · what is still pending

Stated plainly so the next phase is unambiguous. The roster is a mix now: two castings carry full request/response implementations, three remain at documented seams.

Per-adapter status:
  • NAB and TSYS return a stub APPROVED. The real ISO 8583 build/parse and the live host send are the two remaining TODO seams — pure functions isolated from routing and I/O, safe to upgrade without restructuring.
  • Santander derives its DE 55 view then returns FDY_ERR_NOT_IMPLEMENTED, pending Santander's host spec and test endpoint. Use the mock casting for integration testing meanwhile.
  • Global Payments is a full UCP REST implementation (sale, refund, void, capture) with a working HTTP transport — foundry_io_curl on desktop, a Kotlin executor on Android. The one open item is the card-present / chip EMV request fields, which await Global Payments' card-present spec.
  • EPX has complete Custom Pay XML build/parse and the full response-code table. Its transport seam is HTTP-shaped plumbing only: EPX's real host link is a raw TCP+TLS ENQ/ACK/STX/ETX/LRC socket handshake that a single HTTP request/response cannot represent, so a concrete socket transport still needs to be supplied.
Framework-level:
  • No shared credential / config store or adapter factory yet — each configurable casting (Global Payments, EPX) takes its config explicitly from the caller.
  • Android wiring exists for the shipped castings as APK plugins; the stub/skeleton castings follow the same C status through the JNI bridge.