- Add Foundry project configuration (foundry.toml, foundry.lock) - Add Solidity contracts (TokenFactory138, BridgeVault138, ComplianceRegistry, etc.) - Add API definitions (OpenAPI, GraphQL, gRPC, AsyncAPI) - Add comprehensive test suite (unit, integration, fuzz, invariants) - Add API services (REST, GraphQL, orchestrator, packet service) - Add documentation (ISO20022 mapping, runbooks, adapter guides) - Add development tools (RBC tool, Swagger UI, mock server) - Update OpenZeppelin submodules to v5.0.0
3.5 KiB
3.5 KiB
ISO-20022 Mapping Handbook
This document provides detailed guidance on ISO-20022 message processing and mapping to canonical formats.
Message Type Overview
| Message Type | Direction | Purpose | Trigger Action |
|---|---|---|---|
pain.001 |
Outbound | Customer Credit Transfer Initiation | validateAndLock() → markSubmitted() |
pacs.008 |
Outbound | FIToFICustomerCreditTransfer | validateAndLock() → markSubmitted() |
pacs.009 |
Outbound | FinancialInstitutionCreditTransfer | validateAndLock() → markSubmitted() |
camt.054 |
Inbound | BankToCustomerDebitCreditNotification | confirmSettled() (mint tokens) |
pacs.002 |
Inbound | Payment Status Report | confirmSettled() or confirmRejected() |
pacs.004 |
Return | Payment Return | confirmRejected() (release escrow) |
camt.056 |
Cancellation | FIToFIPaymentCancellationRequest | confirmCancelled() (release escrow) |
Field Mapping
pain.001 Mapping
instructionId: Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/PmtId/InstrId
endToEndId: Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/PmtId/EndToEndId
amount: Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/Amt/InstdAmt
currency: Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/Amt/InstdAmt/@Ccy
debtorAccount: Document/CstmrCdtTrfInitn/PmtInf/DbtrAcct/Id/Othr/Id
creditorAccount: Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/CdtrAcct/Id/Othr/Id
pacs.008 Mapping
instructionId: Document/FIToFICstmrCdtTrf/GrpHdr/MsgId
endToEndId: Document/FIToFICstmrCdtTrf/CdtTrfTxInf/PmtId/EndToEndId
amount: Document/FIToFICstmrCdtTrf/CdtTrfTxInf/IntrBkSttlmAmt
currency: Document/FIToFICstmrCdtTrf/CdtTrfTxInf/IntrBkSttlmAmt/@Ccy
pacs.002 Status Mapping
| Status Code | Meaning | Action |
|---|---|---|
ACSC |
AcceptedSettlementCompleted | confirmSettled() |
RJCT |
Rejected | confirmRejected() |
PNDG |
Pending | Wait for final status |
CANC |
Cancelled | confirmCancelled() |
Processing Flow
Outbound Flow
- Client submits
pain.001orpacs.008via/v1/iso/outbound - ISO Router normalizes message to canonical format
- Orchestrator creates trigger in
CREATEDstate - Orchestrator validates and locks funds (
VALIDATEDstate) - Adapter submits to rail (
SUBMITTED_TO_RAILstate) - Trigger moves to
PENDINGstate - Rail adapter receives
pacs.002orcamt.054 - Orchestrator confirms settled/rejected (
SETTLED/REJECTEDstate)
Inbound Flow
- Rail adapter receives
camt.054orpacs.002 - Adapter submits via
/v1/iso/inbound(mTLS) - ISO Router normalizes message
- Orchestrator creates trigger
- For
camt.054with credit: mint tokens andconfirmSettled() - For
pacs.002withRJCT:confirmRejected()
Idempotency
All ISO-20022 message submissions are idempotent by instructionId. Duplicate submissions with the same instructionId are rejected.
Payload Storage
- Full ISO-20022 XML payloads stored off-chain
- Only
payloadHashstored on-chain in trigger - Payloads can be retrieved via API for reconciliation
Reconciliation
Use instructionId and endToEndId for end-to-end reconciliation:
GET /v1/triggers?instructionId=0x1234...
GET /v1/triggers?endToEndId=0xabcd...
Error Handling
Invalid ISO-20022 messages trigger confirmRejected() with appropriate reason codes:
- Schema validation errors →
CONFIG_ERROR - Missing required fields →
CONFIG_ERROR - Invalid amounts →
CONFIG_ERROR