feat(chain138): ISO20022 gateway, swift-listener, and address inventory sync.
Some checks failed
CI/CD Pipeline / Solidity Contracts (push) Failing after 1m14s
CI/CD Pipeline / Security Scanning (push) Successful in 2m20s
CI/CD Pipeline / Lint and Format (push) Failing after 44s
CI/CD Pipeline / Terraform Validation (push) Failing after 23s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 24s
HYBX OMNL TypeScript & anchor / token-aggregation build + reconcile artifact (push) Failing after 25s
Validation / validate-genesis (push) Successful in 26s
Validation / validate-terraform (push) Failing after 23s
Validation / validate-kubernetes (push) Failing after 8s
Validation / validate-smart-contracts (push) Failing after 9s
Validation / validate-security (push) Failing after 1m13s
Validation / validate-documentation (push) Failing after 17s
Verify Deployment / Verify Deployment (push) Failing after 11m56s

Update checkpoint-core ISO20022 types/hashes, swift-listener canonical mapping, and chain138 address inventory.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
defiQUG
2026-06-19 16:17:18 -07:00
parent dc9ecd8963
commit 55912d1143
46 changed files with 711 additions and 47 deletions

View File

@@ -1,6 +1,6 @@
{
"description": "Reference inventory moved out of smom-dbis-138/.env during dotenv cleanup. These are deployed/inventory addresses, not the minimal runtime env surface.",
"updated": "2026-06-18",
"updated": "2026-06-19",
"chain138Inventory": {
"COMPLIANCE_REGISTRY": "0xbc54fe2b6fda157c59d59826bcfdbcc654ec9ea1",
"COMPLIANCE_REGISTRY_ADDRESS": "0xbc54fe2b6fda157c59d59826bcfdbcc654ec9ea1",

View File

@@ -19,6 +19,7 @@ contract ISO20022IntakeGateway is AccessControl {
bytes32 debtorRefHash;
bytes32 creditorRefHash;
bytes32 purposeHash;
bytes32 authAttestationHash;
uint8 msgTypeCode;
address token;
uint256 amount;
@@ -32,6 +33,7 @@ contract ISO20022IntakeGateway is AccessControl {
bytes32 indexed instructionId,
bytes32 indexed uetr,
bytes32 payloadHash,
bytes32 authAttestationHash,
uint8 msgTypeCode,
address token,
uint256 amount,
@@ -63,6 +65,7 @@ contract ISO20022IntakeGateway is AccessControl {
m.instructionId,
m.uetr,
m.payloadHash,
m.authAttestationHash,
m.msgTypeCode,
m.token,
m.amount,

View File

@@ -0,0 +1,29 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./CompliantFiatTokenV2.sol";
/**
* @title CompliantCWUSDCTokenV2
* @notice cWUSDC transport (public EVM) with ERC-2612 / ERC-3009 for x402 facilitator alignment.
*/
contract CompliantCWUSDCTokenV2 is CompliantFiatTokenV2 {
constructor(
address initialOperator,
address admin,
uint256 initialSupply,
bool forwardCanonical_
)
CompliantFiatTokenV2(
"USD Coin (Compliant Wrapped V2)",
"cWUSDC",
6,
"USD",
"2",
initialOperator,
admin,
initialSupply,
forwardCanonical_
)
{}
}

View File

@@ -0,0 +1,29 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./CompliantFiatTokenV2.sol";
/**
* @title CompliantCWUSDTTokenV2
* @notice cWUSDT transport (public EVM) with ERC-2612 / ERC-3009 for x402 facilitator alignment.
*/
contract CompliantCWUSDTTokenV2 is CompliantFiatTokenV2 {
constructor(
address initialOperator,
address admin,
uint256 initialSupply,
bool forwardCanonical_
)
CompliantFiatTokenV2(
"Tether USD (Compliant Wrapped V2)",
"cWUSDT",
6,
"USD",
"2",
initialOperator,
admin,
initialSupply,
forwardCanonical_
)
{}
}

View File

@@ -3,3 +3,5 @@ export declare function instructionIdFromTxHash(txHash: string): string;
export declare function uetrFromTxHash(txHash: string): string;
export declare function uetrBytes32FromTxHash(txHash: string): string;
export declare function hashShortUtf8(value: string): string;
/** KTT off-chain test-key attestation per SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY §5.3 */
export declare function authAttestationHashFromProof(testKeyProof: string, normalizedBody: string): string;

View File

@@ -5,6 +5,7 @@ exports.instructionIdFromTxHash = instructionIdFromTxHash;
exports.uetrFromTxHash = uetrFromTxHash;
exports.uetrBytes32FromTxHash = uetrBytes32FromTxHash;
exports.hashShortUtf8 = hashShortUtf8;
exports.authAttestationHashFromProof = authAttestationHashFromProof;
const ethers_1 = require("ethers");
function bytes32FromUtf8(label, value) {
return ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`${label}:${value}`));
@@ -25,3 +26,11 @@ function hashShortUtf8(value) {
return ethers_1.ethers.ZeroHash;
return ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(value));
}
/** KTT off-chain test-key attestation per SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY §5.3 */
function authAttestationHashFromProof(testKeyProof, normalizedBody) {
const proof = testKeyProof.trim();
const body = normalizedBody.trim();
if (!proof && !body)
return ethers_1.ethers.ZeroHash;
return ethers_1.ethers.keccak256(ethers_1.ethers.concat([ethers_1.ethers.toUtf8Bytes(proof), ethers_1.ethers.toUtf8Bytes(body)]));
}

View File

@@ -1,15 +1,16 @@
/** ISO 20022 / SWIFT MT-103+ canonical message (off-chain full payload; on-chain hashes). */
export type IsoMessageTypeCode = 0 | 1 | 2 | 3 | 4;
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic (from native tx) */
export type IsoMessageTypeCode = 0 | 1 | 2 | 3 | 4 | 5;
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic, 5=KTT/telex */
export declare const MSG_TYPE: {
readonly UNKNOWN: IsoMessageTypeCode;
readonly MT103: IsoMessageTypeCode;
readonly PACS008: IsoMessageTypeCode;
readonly PAIN001: IsoMessageTypeCode;
readonly CHAIN138_SYNTH: IsoMessageTypeCode;
readonly KTT: IsoMessageTypeCode;
};
export type CanonicalPaymentMessage = {
msgType: 'MT103' | 'pacs.008' | 'pain.001' | 'chain138.synthetic';
msgType: 'MT103' | 'pacs.008' | 'pain.001' | 'chain138.synthetic' | 'KTT' | 'TELEX_KTT';
msgTypeCode: IsoMessageTypeCode;
instructionId: string;
instructionIdBytes32: string;
@@ -30,6 +31,8 @@ export type CanonicalPaymentMessage = {
amountSmallestUnit: string;
tokenAddress?: string;
payloadHash: string;
/** keccak256(testKeyProof || normalizedBody) when KTT test-key verified off-chain */
authAttestationHash?: string;
debtorRefHash: string;
creditorRefHash: string;
purposeHash: string;

View File

@@ -1,11 +1,12 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MSG_TYPE = void 0;
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic (from native tx) */
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic, 5=KTT/telex */
exports.MSG_TYPE = {
UNKNOWN: 0,
MT103: 1,
PACS008: 2,
PAIN001: 3,
CHAIN138_SYNTH: 4,
KTT: 5,
};

View File

@@ -22,3 +22,11 @@ export function hashShortUtf8(value: string): string {
if (!value) return ethers.ZeroHash;
return ethers.keccak256(ethers.toUtf8Bytes(value));
}
/** KTT off-chain test-key attestation per SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY §5.3 */
export function authAttestationHashFromProof(testKeyProof: string, normalizedBody: string): string {
const proof = testKeyProof.trim();
const body = normalizedBody.trim();
if (!proof && !body) return ethers.ZeroHash;
return ethers.keccak256(ethers.concat([ethers.toUtf8Bytes(proof), ethers.toUtf8Bytes(body)]));
}

View File

@@ -1,17 +1,18 @@
/** ISO 20022 / SWIFT MT-103+ canonical message (off-chain full payload; on-chain hashes). */
export type IsoMessageTypeCode = 0 | 1 | 2 | 3 | 4;
export type IsoMessageTypeCode = 0 | 1 | 2 | 3 | 4 | 5;
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic (from native tx) */
/** 0=unknown, 1=MT103, 2=pacs.008, 3=pain.001, 4=chain138 synthetic, 5=KTT/telex */
export const MSG_TYPE = {
UNKNOWN: 0 as IsoMessageTypeCode,
MT103: 1 as IsoMessageTypeCode,
PACS008: 2 as IsoMessageTypeCode,
PAIN001: 3 as IsoMessageTypeCode,
CHAIN138_SYNTH: 4 as IsoMessageTypeCode,
KTT: 5 as IsoMessageTypeCode,
} as const;
export type CanonicalPaymentMessage = {
msgType: 'MT103' | 'pacs.008' | 'pain.001' | 'chain138.synthetic';
msgType: 'MT103' | 'pacs.008' | 'pain.001' | 'chain138.synthetic' | 'KTT' | 'TELEX_KTT';
msgTypeCode: IsoMessageTypeCode;
instructionId: string;
instructionIdBytes32: string;
@@ -32,6 +33,8 @@ export type CanonicalPaymentMessage = {
amountSmallestUnit: string;
tokenAddress?: string;
payloadHash: string;
/** keccak256(testKeyProof || normalizedBody) when KTT test-key verified off-chain */
authAttestationHash?: string;
debtorRefHash: string;
creditorRefHash: string;
purposeHash: string;

View File

@@ -0,0 +1,67 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Script, console} from "forge-std/Script.sol";
import {CompliantCWUSDCTokenV2} from "../../contracts/tokens/CompliantCWUSDCTokenV2.sol";
import {CompliantCWUSDTTokenV2} from "../../contracts/tokens/CompliantCWUSDTTokenV2.sol";
import {CompliantFiatTokenV2} from "../../contracts/tokens/CompliantFiatTokenV2.sol";
/**
* @title DeployCWTransportFiatTokensV2ForChain
* @notice Deploy ERC-3009-capable cWUSDC / cWUSDT transport on a public EVM chain (Base, Polygon, …).
*
* Env:
* PRIVATE_KEY (required)
* CW_BRIDGE_ADDRESS (required) — L2 bridge receiver with MINTER/BURNER
* INITIAL_OPERATOR (optional; default deployer)
* ADMIN / OWNER (optional; default deployer)
* INITIAL_SUPPLY (optional; default 0 — bridge mints)
* FORWARD_CANONICAL (optional; default false for transport)
* CW_TRANSPORT_STRICT_MODE (optional; default 1 — revoke deployer mint/burn after bridge grant)
* DEPLOY_CWUSDT_V2=1 / DEPLOY_CWUSDC_V2=1 (default both 1)
*/
contract DeployCWTransportFiatTokensV2ForChain is Script {
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(pk);
address bridge = vm.envAddress("CW_BRIDGE_ADDRESS");
address initialOperator = vm.envOr("INITIAL_OPERATOR", deployer);
address ownerAlias = vm.envOr("OWNER", deployer);
address admin = vm.envOr("ADMIN", ownerAlias);
uint256 initialSupply = vm.envOr("INITIAL_SUPPLY", uint256(0));
bool forwardCanonical = vm.envOr("FORWARD_CANONICAL", false);
bool strictMode = vm.envOr("CW_TRANSPORT_STRICT_MODE", uint256(1)) != 0;
require(bridge != address(0), "CW_BRIDGE_ADDRESS required");
vm.startBroadcast(pk);
if (vm.envOr("DEPLOY_CWUSDT_V2", uint256(1)) != 0) {
CompliantCWUSDTTokenV2 token =
new CompliantCWUSDTTokenV2(initialOperator, admin, initialSupply, forwardCanonical);
_wireBridge(address(token), bridge, admin, strictMode);
console.log("cWUSDT_V2", address(token));
console.log("cWUSDT_V2_bridge", bridge);
}
if (vm.envOr("DEPLOY_CWUSDC_V2", uint256(1)) != 0) {
CompliantCWUSDCTokenV2 token =
new CompliantCWUSDCTokenV2(initialOperator, admin, initialSupply, forwardCanonical);
_wireBridge(address(token), bridge, admin, strictMode);
console.log("cWUSDC_V2", address(token));
console.log("cWUSDC_V2_bridge", bridge);
}
vm.stopBroadcast();
}
function _wireBridge(address token, address bridge, address admin, bool strictMode) internal {
CompliantFiatTokenV2 t = CompliantFiatTokenV2(token);
t.grantRole(t.MINTER_ROLE(), bridge);
t.grantRole(t.BURNER_ROLE(), bridge);
if (strictMode) {
t.revokeRole(t.MINTER_ROLE(), admin);
t.revokeRole(t.BURNER_ROLE(), admin);
}
}
}

View File

@@ -90,7 +90,17 @@ fi
# Ensure PRIVATE_KEY is exported
if [ -n "$PRIVATE_KEY" ]; then
export PRIVATE_KEY
export RELAYER_PRIVATE_KEY="$PRIVATE_KEY"
if [ "$PROFILE" != "mainnet-link-138" ] || [ -z "${CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY:-}" ]; then
export RELAYER_PRIVATE_KEY="$PRIVATE_KEY"
fi
fi
# Dedicated relayer for mainnet-link-138 (wins over deployer PRIVATE_KEY).
if [ "$PROFILE" = "mainnet-link-138" ] && [ -n "${CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY:-}" ]; then
export RELAYER_PRIVATE_KEY="$CCIP_MAINNET_LINK138_RELAYER_PRIVATE_KEY"
if [ -n "${CCIP_MAINNET_LINK138_RELAYER_ADDRESS:-}" ]; then
export RELAYER_ADDRESS="$CCIP_MAINNET_LINK138_RELAYER_ADDRESS"
fi
fi
# Check if npm is available

View File

@@ -1 +1 @@
{"version":3,"file":"inboundAdapters.d.ts","sourceRoot":"","sources":["../../src/adapters/inboundAdapters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,aAAa,GAC5B,cAAc,EAAE,CA2BlB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAEhE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAmC5B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwC5B"}
{"version":3,"file":"inboundAdapters.d.ts","sourceRoot":"","sources":["../../src/adapters/inboundAdapters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,aAAa,GAC5B,cAAc,EAAE,CA4BlB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAEhE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAmC5B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwC5B"}

View File

@@ -8,7 +8,7 @@ exports.pollFinGatewayMessages = pollFinGatewayMessages;
const fs_1 = require("fs");
const path_1 = require("path");
const inboundParser_1 = require("../parsers/inboundParser");
const INBOX_EXTENSIONS = /\.(fin|swift|xml|txt|json|as4|mx)$/i;
const INBOX_EXTENSIONS = /\.(fin|swift|xml|txt|json|as4|mx|telex|ktt)$/i;
function scanDirectoryInbox(inboxDir, sourcePrefix, defaultFormat) {
const messages = [];
let entries = [];
@@ -33,6 +33,8 @@ function scanDirectoryInbox(inboxDir, sourcePrefix, defaultFormat) {
format = 'iso20022';
if (lower.endsWith('.json'))
format = 'json_broadcast';
if (lower.endsWith('.telex') || lower.endsWith('.ktt'))
format = 'ktt';
messages.push({
source: `${sourcePrefix}:${full}`,
format,

View File

@@ -1 +1 @@
{"version":3,"file":"inboundAdapters.js","sourceRoot":"","sources":["../../src/adapters/inboundAdapters.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"inboundAdapters.js","sourceRoot":"","sources":["../../src/adapters/inboundAdapters.ts"],"names":[],"mappings":"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"}

View File

@@ -1 +1 @@
{"version":3,"file":"mapToCanonical.d.ts","sourceRoot":"","sources":["../../src/canonical/mapToCanonical.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA8B9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAoD5G"}
{"version":3,"file":"mapToCanonical.d.ts","sourceRoot":"","sources":["../../src/canonical/mapToCanonical.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAsC9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAuE5G"}

View File

@@ -4,6 +4,8 @@ exports.mapToCanonical = mapToCanonical;
const ethers_1 = require("ethers");
const checkpoint_core_1 = require("@dbis/checkpoint-core");
function msgTypeCode(parsed) {
if (parsed.format === 'ktt')
return checkpoint_core_1.MSG_TYPE.KTT;
if (parsed.format === 'swift_fin') {
if (parsed.messageType === 'MT103')
return checkpoint_core_1.MSG_TYPE.MT103;
@@ -18,6 +20,8 @@ function msgTypeCode(parsed) {
return checkpoint_core_1.MSG_TYPE.UNKNOWN;
}
function msgTypeLabel(parsed) {
if (parsed.format === 'ktt')
return parsed.messageType;
if (parsed.format === 'swift_fin' && parsed.messageType === 'MT103')
return 'MT103';
if (parsed.format === 'iso20022' && parsed.messageType === 'pacs.008')
@@ -26,6 +30,13 @@ function msgTypeLabel(parsed) {
return 'pain.001';
return 'chain138.synthetic';
}
function settlementMethod(parsed) {
if (parsed.format === 'ktt')
return 'KTT';
if (parsed.format === 'swift_fin')
return 'SWIFT';
return 'ISO20022';
}
function pickString(parsed, ...keys) {
const obj = parsed.parsed;
for (const k of keys) {
@@ -37,13 +48,14 @@ function pickString(parsed, ...keys) {
}
function mapToCanonical(parsed, dedupeKey) {
const instructionId = pickString(parsed, 'instructionId', 'senderReference', 'transactionReference', 'messageId') ||
`SWIFT-${dedupeKey.slice(0, 16)}`;
`KTT-${dedupeKey.slice(0, 16)}`;
const endToEndId = pickString(parsed, 'endToEndId', 'transactionReference', 'senderReference') || instructionId;
const msgId = pickString(parsed, 'messageId', 'senderReference') || instructionId;
const uetr = pickString(parsed, 'uetr') || '';
const debtorId = pickString(parsed, 'orderingCustomer', 'debtor', 'sendingInstitution') || 'UNKNOWN';
const creditorId = pickString(parsed, 'beneficiaryCustomer', 'creditor', 'beneficiaryInstitution') || 'UNKNOWN';
const currencyCode = pickString(parsed, 'currency') || 'USD';
const debtorId = pickString(parsed, 'orderingCustomer', 'debtor', 'sendingInstitution', 'debtorId') || 'UNKNOWN';
const creditorId = pickString(parsed, 'beneficiaryCustomer', 'creditor', 'beneficiaryInstitution', 'creditorId') ||
'UNKNOWN';
const currencyCode = pickString(parsed, 'currency', 'currencyCode') || 'USD';
const amountRaw = pickString(parsed, 'amount') || '0';
const purpose = pickString(parsed, 'remittanceInfo', 'remittance', 'purpose', 'senderToReceiverInfo', 'narrative') ||
`${parsed.format}/${parsed.messageType}`;
@@ -51,6 +63,19 @@ function mapToCanonical(parsed, dedupeKey) {
const uetrBytes32 = uetr
? ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`UETR:${uetr}`))
: ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`UETR:${dedupeKey}`));
let authAttestationHash;
if (parsed.format === 'ktt') {
const fromParsed = pickString(parsed, 'authAttestationHash');
if (fromParsed) {
authAttestationHash = fromParsed.startsWith('0x') ? fromParsed : (0, checkpoint_core_1.hashShortUtf8)(fromParsed);
}
else if (parsed.authAttestationHash) {
authAttestationHash = parsed.authAttestationHash;
}
else if (parsed.testKeyProof && pickString(parsed, 'normalizedBody')) {
authAttestationHash = (0, checkpoint_core_1.authAttestationHashFromProof)(parsed.testKeyProof, pickString(parsed, 'normalizedBody'));
}
}
const base = {
msgType: msgTypeLabel(parsed),
msgTypeCode: msgTypeCode(parsed),
@@ -66,7 +91,7 @@ function mapToCanonical(parsed, dedupeKey) {
debtorId,
creditorId,
purpose,
settlementMethod: parsed.format === 'swift_fin' ? 'SWIFT' : 'ISO20022',
settlementMethod: settlementMethod(parsed),
categoryPurpose: 'CBFF',
currencyCode,
amountRaw,
@@ -76,6 +101,7 @@ function mapToCanonical(parsed, dedupeKey) {
purposeHash: (0, checkpoint_core_1.hashShortUtf8)(purpose),
chain138TxHash: pickString(parsed, 'txId', 'chain138TxHash'),
valueDateIso: pickString(parsed, 'valueDate') || undefined,
...(authAttestationHash ? { authAttestationHash } : {}),
};
const payloadHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(JSON.stringify({ ...base, sourceFormat: parsed.format, messageType: parsed.messageType })));
return { ...base, payloadHash };

View File

@@ -1 +1 @@
{"version":3,"file":"mapToCanonical.js","sourceRoot":"","sources":["../../src/canonical/mapToCanonical.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"mapToCanonical.js","sourceRoot":"","sources":["../../src/canonical/mapToCanonical.ts"],"names":[],"mappings":"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"}

View File

@@ -17,6 +17,7 @@ export declare class SwiftListener {
pollFileInbox(): Promise<SwiftListenerEvent[]>;
pollAs4Inbox(): Promise<SwiftListenerEvent[]>;
pollMailInbox(): Promise<SwiftListenerEvent[]>;
pollTelexInbox(): Promise<SwiftListenerEvent[]>;
pollP2pRail(): Promise<SwiftListenerEvent[]>;
pollFinGateway(): Promise<SwiftListenerEvent[]>;
private trackLastId;

View File

@@ -1 +1 @@
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAExF,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,qBAAa,aAAa;IAUZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IATxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAa;gBAEF,WAAW,EAAE,MAAM;IAM1C,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IA6D7E,OAAO,CAAC,kBAAkB;IA4BpB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAStE,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI9C,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAQ7C,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM9C,WAAW,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe5C,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAmBrD,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,wBAAwB;IA4ChC,OAAO,CAAC,aAAa;IAWf,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA2C7C,GAAG,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D,QAAQ,IAAI,IAAI;CAKjB;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAEtE"}
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../src/listener.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAExF,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,qBAAa,aAAa;IAUZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IATxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAa;gBAEF,WAAW,EAAE,MAAM;IAM1C,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IA6D7E,OAAO,CAAC,kBAAkB;IAmCpB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAStE,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI9C,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAQ7C,aAAa,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM9C,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM/C,WAAW,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe5C,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAmBrD,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,wBAAwB;IA4ChC,OAAO,CAAC,aAAa;IAYf,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA8C7C,GAAG,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D,QAAQ,IAAI,IAAI;CAKjB;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAEtE"}

View File

@@ -96,6 +96,14 @@ class SwiftListener {
// ignore
}
}
if (msg.source.startsWith('telex:') && this.config.adapters.telexInbox?.archiveOnProcess) {
try {
(0, inboundAdapters_1.archiveInboxFile)(filePath, (0, path_1.resolve)(archiveDir, 'telex'));
}
catch {
// ignore
}
}
}
async processBatch(sources) {
const out = [];
@@ -121,6 +129,12 @@ class SwiftListener {
return [];
return this.processBatch((0, inboundAdapters_1.scanDirectoryInbox)((0, path_1.resolve)(this.projectRoot, dir), 'mail'));
}
async pollTelexInbox() {
const dir = this.config.storage.telexInboxDir;
if (!dir)
return [];
return this.processBatch((0, inboundAdapters_1.scanDirectoryInbox)((0, path_1.resolve)(this.projectRoot, dir), 'telex', 'ktt'));
}
async pollP2pRail() {
const cfg = this.config.adapters.p2pRail;
const baseUrl = process.env[cfg.baseUrlEnv] ?? process.env.P2P_BASE_URL ?? '';
@@ -214,6 +228,8 @@ class SwiftListener {
intervals.push(adapters.as4Inbox.pollIntervalSec);
if (adapters.mailAttachmentInbox?.enabled)
intervals.push(adapters.mailAttachmentInbox.pollIntervalSec);
if (adapters.telexInbox?.enabled)
intervals.push(adapters.telexInbox.pollIntervalSec);
return intervals.length ? intervals : [60];
}
async runPollCycle() {
@@ -228,6 +244,9 @@ class SwiftListener {
if (adapters.mailAttachmentInbox?.enabled) {
events.push(...(await this.pollMailInbox()));
}
if (adapters.telexInbox?.enabled) {
events.push(...(await this.pollTelexInbox()));
}
if (adapters.p2pRail.enabled) {
try {
events.push(...(await this.pollP2pRail()));

File diff suppressed because one or more lines are too long

View File

@@ -8,6 +8,7 @@ export declare function buildGatewayMessage(canonical: CanonicalPaymentMessage,
debtorRefHash: string;
creditorRefHash: string;
purposeHash: string;
authAttestationHash: string;
msgTypeCode: import("@dbis/checkpoint-core").IsoMessageTypeCode;
token: string;
amount: bigint;

View File

@@ -1 +1 @@
{"version":3,"file":"intakeGatewayAdapter.d.ts","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA+CjE,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,uBAAuB,EAClC,QAAQ,EAAE,gBAAgB;;;;;;;;;;;;EAe3B;AAYD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAqCrG"}
{"version":3,"file":"intakeGatewayAdapter.d.ts","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA+CjE,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,uBAAuB,EAClC,QAAQ,EAAE,gBAAgB;;;;;;;;;;;;;EAgB3B;AAYD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA6CrG"}

View File

@@ -4,7 +4,7 @@ exports.buildGatewayMessage = buildGatewayMessage;
exports.submitToIntakeGateway = submitToIntakeGateway;
const ethers_1 = require("ethers");
const GATEWAY_ABI = [
'function submitInbound((bytes32 instructionId, bytes32 endToEndIdHash, bytes32 uetr, bytes32 payloadHash, bytes32 debtorRefHash, bytes32 creditorRefHash, bytes32 purposeHash, uint8 msgTypeCode, address token, uint256 amount, bytes3 currencyCode) m) external',
'function submitInbound((bytes32 instructionId, bytes32 endToEndIdHash, bytes32 uetr, bytes32 payloadHash, bytes32 debtorRefHash, bytes32 creditorRefHash, bytes32 purposeHash, bytes32 authAttestationHash, uint8 msgTypeCode, address token, uint256 amount, bytes3 currencyCode) m) external',
'function processedInstructions(bytes32) view returns (bool)',
];
const RPC_TIMEOUT_MS = 15_000;
@@ -51,6 +51,7 @@ function buildGatewayMessage(canonical, registry) {
debtorRefHash: canonical.debtorRefHash,
creditorRefHash: canonical.creditorRefHash,
purposeHash: canonical.purposeHash,
authAttestationHash: canonical.authAttestationHash ?? ethers_1.ethers.ZeroHash,
msgTypeCode: canonical.msgTypeCode,
token: resolveTokenAddress(canonical, registry),
amount: BigInt(canonical.amountSmallestUnit || '0'),
@@ -77,6 +78,11 @@ async function submitToIntakeGateway(config, registry, canonical) {
const pk = process.env[gwCfg.privateKeyEnv] ?? process.env.PRIVATE_KEY ?? '';
const execute = shouldExecuteSubmit(gwCfg);
const message = buildGatewayMessage(canonical, registry);
if (canonical.msgTypeCode === 5 &&
process.env.KTT_REQUIRE_ATTESTATION === '1' &&
(message.authAttestationHash === ethers_1.ethers.ZeroHash || !message.authAttestationHash)) {
return { dryRun: false, gateway, error: 'KTT requires authAttestationHash' };
}
if (!execute) {
return { dryRun: true, gateway, prepared: true };
}

View File

@@ -1 +1 @@
{"version":3,"file":"intakeGatewayAdapter.js","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"intakeGatewayAdapter.js","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":"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"}

View File

@@ -1,7 +1,8 @@
import type { ParsedInbound, ParsedIso20022, ParsedJsonBroadcast, ParsedSwiftFin } from '../types';
import type { ParsedInbound, ParsedIso20022, ParsedJsonBroadcast, ParsedKtt, ParsedSwiftFin } from '../types';
export declare function parseSwiftFin(raw: string): ParsedSwiftFin;
export declare function detectInboundFormat(payload: string): 'swift_fin' | 'iso20022' | 'json_broadcast';
export declare function detectInboundFormat(payload: string): 'swift_fin' | 'iso20022' | 'json_broadcast' | 'ktt';
export declare function parseIso20022(raw: string): ParsedIso20022;
export declare function parseJsonBroadcast(raw: string): ParsedJsonBroadcast;
export declare function parseInbound(payload: string): ParsedInbound;
export declare function parseKtt(raw: string): ParsedKtt;
//# sourceMappingURL=inboundParser.d.ts.map

View File

@@ -1 +1 @@
{"version":3,"file":"inboundParser.d.ts","sourceRoot":"","sources":["../../src/parsers/inboundParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AA6IxH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAmCzD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAchG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAwCzD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAkBnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAK3D"}
{"version":3,"file":"inboundParser.d.ts","sourceRoot":"","sources":["../../src/parsers/inboundParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AA6InI,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAmCzD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,KAAK,CAgCxG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAwCzD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAkBnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAoB3D;AA8BD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAkC/C"}

View File

@@ -5,6 +5,7 @@ exports.detectInboundFormat = detectInboundFormat;
exports.parseIso20022 = parseIso20022;
exports.parseJsonBroadcast = parseJsonBroadcast;
exports.parseInbound = parseInbound;
exports.parseKtt = parseKtt;
function parseSwiftFields(text) {
const fields = {};
let currentField = null;
@@ -179,6 +180,25 @@ function parseSwiftFin(raw) {
}
function detectInboundFormat(payload) {
const t = payload.trim();
if (t.startsWith('{')) {
try {
const obj = JSON.parse(t);
if (obj.format === 'ktt' || obj.messageType === 'KTT' || obj.messageType === 'TELEX_KTT')
return 'ktt';
if (obj.event === 'deposit.submitted')
return 'ktt';
}
catch {
/* continue */
}
}
const upper = t.toUpperCase();
if (upper.includes('TELEX REF') ||
upper.startsWith('ORDERING:') ||
upper.startsWith('BENEFICIARY:') ||
(t.includes(':20:') && t.includes(':32A:') && !t.startsWith('{1:'))) {
return 'ktt';
}
if (t.startsWith('<?xml') || t.startsWith('<Document'))
return 'iso20022';
if (/^\{1:[A-Z0-9]{12}/.test(t) ||
@@ -254,11 +274,91 @@ function parseJsonBroadcast(raw) {
};
}
function parseInbound(payload) {
const trimmed = payload.trim();
if (trimmed.startsWith('{')) {
try {
const obj = JSON.parse(trimmed);
if (obj.format === 'ktt' || obj.messageType === 'KTT' || obj.messageType === 'TELEX_KTT') {
return parseKttEnvelope(trimmed, obj);
}
if (obj.event === 'deposit.submitted' && obj.payload) {
return parseKttEnvelope(trimmed, obj.payload);
}
}
catch {
/* fall through */
}
}
const format = detectInboundFormat(payload);
if (format === 'ktt')
return parseKtt(payload);
if (format === 'swift_fin')
return parseSwiftFin(payload);
if (format === 'iso20022')
return parseIso20022(payload);
return parseJsonBroadcast(payload);
}
function parseKttEnvelope(raw, obj) {
const normalizedBody = String(obj.normalizedBody ?? obj.body ?? '');
const testKeyProof = String(obj.testKeyProof ?? obj.test_key_proof ?? '');
const messageType = String(obj.messageType ?? obj.msgType ?? '') === 'TELEX_KTT' ? 'TELEX_KTT' : 'KTT';
const parsed = {
normalizedBody,
testKeyProof,
instructionId: obj.instructionId ?? obj.instruction_id,
telexRef: obj.telexRef ?? obj.telex_ref,
debtorId: obj.debtorId,
creditorId: obj.creditorId,
amount: obj.amount,
currency: obj.currency ?? obj.currencyCode,
authAttestationHash: obj.authAttestationHash ?? obj.auth_attestation_hash,
...(obj.normalizedFields ?? {}),
};
return {
format: 'ktt',
messageType: messageType,
raw,
parsed,
searchableText: [normalizedBody, JSON.stringify(parsed)].join('\n'),
testKeyProof,
authAttestationHash: obj.authAttestationHash,
};
}
function parseKtt(raw) {
const body = raw.trim();
const messageType = body.includes(':20:') || body.includes(':32A:') ? 'TELEX_KTT' : 'KTT';
const parsed = { normalizedBody: body };
if (messageType === 'TELEX_KTT') {
const fin = parseSwiftFin(body.includes(':20:') ? `{4:\n${body}\n-}` : body);
const p = fin.parsed;
parsed.senderReference = p.senderReference;
parsed.orderingCustomer = p.orderingCustomer;
parsed.beneficiaryCustomer = p.beneficiaryCustomer;
parsed.amount = p.amount;
parsed.currency = p.currency;
}
else {
for (const line of body.split('\n')) {
const upper = line.toUpperCase();
if (upper.startsWith('ORDERING:'))
parsed.orderingCustomer = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('BENEFICIARY:'))
parsed.beneficiaryCustomer = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('AMOUNT:')) {
const parts = line.split(':').slice(1).join(':').trim().split(/\s+/);
if (parts.length >= 2) {
parsed.currency = parts[0];
parsed.amount = parts[1];
}
}
}
}
return {
format: 'ktt',
messageType,
raw,
parsed,
searchableText: body,
};
}
//# sourceMappingURL=inboundParser.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"resourceRegistry.d.ts","sourceRoot":"","sources":["../src/resourceRegistry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAWhE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAKtE;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAwB9D;AAsCD,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,gBAAgB,CAmGnG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAiB9F"}
{"version":3,"file":"resourceRegistry.d.ts","sourceRoot":"","sources":["../src/resourceRegistry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAWhE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAKtE;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAyB9D;AAsCD,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,gBAAgB,CAmGnG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAiB9F"}

View File

@@ -44,6 +44,8 @@ function applyEnvOverrides(config) {
config.adapters.as4Inbox.enabled = true;
if (envFlag('SWIFT_LISTENER_MAIL_INBOX'))
config.adapters.mailAttachmentInbox.enabled = true;
if (envFlag('SWIFT_LISTENER_TELEX_INBOX'))
config.adapters.telexInbox.enabled = true;
config.outbound ??= defaultOutboundConfig();
if (envFlag('SWIFT_LISTENER_OMNL_FORWARD'))
config.outbound.omnlForward.enabled = true;

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,8 @@
import type { CanonicalPaymentMessage } from '@dbis/checkpoint-core';
export type SwiftFinMessageType = 'MT103' | 'MT202' | 'MT910' | 'MT940' | 'MT942' | 'MT950' | 'UNKNOWN';
export type Iso20022MessageType = 'pain.001' | 'pacs.008' | 'pacs.009' | 'pacs.002' | 'camt.052' | 'camt.053' | 'camt.054' | 'unknown';
export type InboundFormat = 'swift_fin' | 'iso20022' | 'json_broadcast';
export type InboundFormat = 'swift_fin' | 'iso20022' | 'json_broadcast' | 'ktt';
export type KttMessageType = 'KTT' | 'TELEX_KTT';
export type ResourceMatchKind = 'chain138_name' | 'chain138_address' | 'chain138_symbol' | 'cw_symbol' | 'cw_address' | 'instruction_prefix' | 'remittance_keyword' | 'contract_ref';
export type ResourceMatch = {
kind: ResourceMatchKind;
@@ -31,7 +32,16 @@ export type ParsedJsonBroadcast = {
parsed: Record<string, unknown>;
searchableText: string;
};
export type ParsedInbound = ParsedSwiftFin | ParsedIso20022 | ParsedJsonBroadcast;
export type ParsedKtt = {
format: 'ktt';
messageType: KttMessageType;
raw: string;
parsed: Record<string, unknown>;
searchableText: string;
testKeyProof?: string;
authAttestationHash?: string;
};
export type ParsedInbound = ParsedSwiftFin | ParsedIso20022 | ParsedJsonBroadcast | ParsedKtt;
export type SwiftListenerEvent = {
id: string;
receivedAt: string;
@@ -84,6 +94,7 @@ export type ListenerConfig = {
archiveDir: string;
as4InboxDir?: string;
mailInboxDir?: string;
telexInboxDir?: string;
};
adapters: {
fileInbox: {
@@ -130,6 +141,11 @@ export type ListenerConfig = {
pollIntervalSec: number;
archiveOnProcess?: boolean;
};
telexInbox: {
enabled: boolean;
pollIntervalSec: number;
archiveOnProcess?: boolean;
};
};
outbound?: {
omnlForward: {

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,7 @@ import { join, dirname } from 'path';
import type { InboundMessage, InboundFormat } from '../types';
import { detectInboundFormat } from '../parsers/inboundParser';
const INBOX_EXTENSIONS = /\.(fin|swift|xml|txt|json|as4|mx)$/i;
const INBOX_EXTENSIONS = /\.(fin|swift|xml|txt|json|as4|mx|telex|ktt)$/i;
export function scanDirectoryInbox(
inboxDir: string,
@@ -28,6 +28,7 @@ export function scanDirectoryInbox(
let format: InboundFormat = defaultFormat ?? detectInboundFormat(payload);
if (lower.endsWith('.xml') || lower.endsWith('.mx') || lower.endsWith('.as4')) format = 'iso20022';
if (lower.endsWith('.json')) format = 'json_broadcast';
if (lower.endsWith('.telex') || lower.endsWith('.ktt')) format = 'ktt';
messages.push({
source: `${sourcePrefix}:${full}`,
format,

View File

@@ -1,8 +1,14 @@
import { ethers } from 'ethers';
import { MSG_TYPE, hashShortUtf8, type CanonicalPaymentMessage } from '@dbis/checkpoint-core';
import {
MSG_TYPE,
authAttestationHashFromProof,
hashShortUtf8,
type CanonicalPaymentMessage,
} from '@dbis/checkpoint-core';
import type { ParsedInbound } from '../types';
function msgTypeCode(parsed: ParsedInbound): CanonicalPaymentMessage['msgTypeCode'] {
if (parsed.format === 'ktt') return MSG_TYPE.KTT;
if (parsed.format === 'swift_fin') {
if (parsed.messageType === 'MT103') return MSG_TYPE.MT103;
return MSG_TYPE.UNKNOWN;
@@ -15,12 +21,19 @@ function msgTypeCode(parsed: ParsedInbound): CanonicalPaymentMessage['msgTypeCod
}
function msgTypeLabel(parsed: ParsedInbound): CanonicalPaymentMessage['msgType'] {
if (parsed.format === 'ktt') return parsed.messageType;
if (parsed.format === 'swift_fin' && parsed.messageType === 'MT103') return 'MT103';
if (parsed.format === 'iso20022' && parsed.messageType === 'pacs.008') return 'pacs.008';
if (parsed.format === 'iso20022' && parsed.messageType === 'pain.001') return 'pain.001';
return 'chain138.synthetic';
}
function settlementMethod(parsed: ParsedInbound): string {
if (parsed.format === 'ktt') return 'KTT';
if (parsed.format === 'swift_fin') return 'SWIFT';
return 'ISO20022';
}
function pickString(parsed: ParsedInbound, ...keys: string[]): string {
const obj = parsed.parsed;
for (const k of keys) {
@@ -33,13 +46,16 @@ function pickString(parsed: ParsedInbound, ...keys: string[]): string {
export function mapToCanonical(parsed: ParsedInbound, dedupeKey: string): CanonicalPaymentMessage | undefined {
const instructionId =
pickString(parsed, 'instructionId', 'senderReference', 'transactionReference', 'messageId') ||
`SWIFT-${dedupeKey.slice(0, 16)}`;
`KTT-${dedupeKey.slice(0, 16)}`;
const endToEndId = pickString(parsed, 'endToEndId', 'transactionReference', 'senderReference') || instructionId;
const msgId = pickString(parsed, 'messageId', 'senderReference') || instructionId;
const uetr = pickString(parsed, 'uetr') || '';
const debtorId = pickString(parsed, 'orderingCustomer', 'debtor', 'sendingInstitution') || 'UNKNOWN';
const creditorId = pickString(parsed, 'beneficiaryCustomer', 'creditor', 'beneficiaryInstitution') || 'UNKNOWN';
const currencyCode = pickString(parsed, 'currency') || 'USD';
const debtorId =
pickString(parsed, 'orderingCustomer', 'debtor', 'sendingInstitution', 'debtorId') || 'UNKNOWN';
const creditorId =
pickString(parsed, 'beneficiaryCustomer', 'creditor', 'beneficiaryInstitution', 'creditorId') ||
'UNKNOWN';
const currencyCode = pickString(parsed, 'currency', 'currencyCode') || 'USD';
const amountRaw = pickString(parsed, 'amount') || '0';
const purpose =
pickString(parsed, 'remittanceInfo', 'remittance', 'purpose', 'senderToReceiverInfo', 'narrative') ||
@@ -50,6 +66,21 @@ export function mapToCanonical(parsed: ParsedInbound, dedupeKey: string): Canoni
? ethers.keccak256(ethers.toUtf8Bytes(`UETR:${uetr}`))
: ethers.keccak256(ethers.toUtf8Bytes(`UETR:${dedupeKey}`));
let authAttestationHash: string | undefined;
if (parsed.format === 'ktt') {
const fromParsed = pickString(parsed, 'authAttestationHash');
if (fromParsed) {
authAttestationHash = fromParsed.startsWith('0x') ? fromParsed : hashShortUtf8(fromParsed);
} else if (parsed.authAttestationHash) {
authAttestationHash = parsed.authAttestationHash;
} else if (parsed.testKeyProof && pickString(parsed, 'normalizedBody')) {
authAttestationHash = authAttestationHashFromProof(
parsed.testKeyProof,
pickString(parsed, 'normalizedBody')
);
}
}
const base: Omit<CanonicalPaymentMessage, 'payloadHash'> = {
msgType: msgTypeLabel(parsed),
msgTypeCode: msgTypeCode(parsed),
@@ -65,7 +96,7 @@ export function mapToCanonical(parsed: ParsedInbound, dedupeKey: string): Canoni
debtorId,
creditorId,
purpose,
settlementMethod: parsed.format === 'swift_fin' ? 'SWIFT' : 'ISO20022',
settlementMethod: settlementMethod(parsed),
categoryPurpose: 'CBFF',
currencyCode,
amountRaw,
@@ -75,6 +106,7 @@ export function mapToCanonical(parsed: ParsedInbound, dedupeKey: string): Canoni
purposeHash: hashShortUtf8(purpose),
chain138TxHash: pickString(parsed, 'txId', 'chain138TxHash'),
valueDateIso: pickString(parsed, 'valueDate') || undefined,
...(authAttestationHash ? { authAttestationHash } : {}),
};
const payloadHash = ethers.keccak256(

View File

@@ -123,6 +123,13 @@ export class SwiftListener {
// ignore
}
}
if (msg.source.startsWith('telex:') && this.config.adapters.telexInbox?.archiveOnProcess) {
try {
archiveInboxFile(filePath, resolve(archiveDir, 'telex'));
} catch {
// ignore
}
}
}
async processBatch(sources: InboundMessage[]): Promise<SwiftListenerEvent[]> {
@@ -152,6 +159,12 @@ export class SwiftListener {
return this.processBatch(scanDirectoryInbox(resolve(this.projectRoot, dir), 'mail'));
}
async pollTelexInbox(): Promise<SwiftListenerEvent[]> {
const dir = this.config.storage.telexInboxDir;
if (!dir) return [];
return this.processBatch(scanDirectoryInbox(resolve(this.projectRoot, dir), 'telex', 'ktt'));
}
async pollP2pRail(): Promise<SwiftListenerEvent[]> {
const cfg = this.config.adapters.p2pRail;
const baseUrl = process.env[cfg.baseUrlEnv] ?? process.env.P2P_BASE_URL ?? '';
@@ -247,6 +260,7 @@ export class SwiftListener {
if (adapters.finGateway?.enabled) intervals.push(adapters.finGateway.pollIntervalSec);
if (adapters.as4Inbox?.enabled) intervals.push(adapters.as4Inbox.pollIntervalSec);
if (adapters.mailAttachmentInbox?.enabled) intervals.push(adapters.mailAttachmentInbox.pollIntervalSec);
if (adapters.telexInbox?.enabled) intervals.push(adapters.telexInbox.pollIntervalSec);
return intervals.length ? intervals : [60];
}
@@ -263,6 +277,9 @@ export class SwiftListener {
if (adapters.mailAttachmentInbox?.enabled) {
events.push(...(await this.pollMailInbox()));
}
if (adapters.telexInbox?.enabled) {
events.push(...(await this.pollTelexInbox()));
}
if (adapters.p2pRail.enabled) {
try {
events.push(...(await this.pollP2pRail()));

View File

@@ -3,7 +3,7 @@ import type { CanonicalPaymentMessage } from '@dbis/checkpoint-core';
import type { ListenerConfig, ResourceRegistry } from '../types';
const GATEWAY_ABI = [
'function submitInbound((bytes32 instructionId, bytes32 endToEndIdHash, bytes32 uetr, bytes32 payloadHash, bytes32 debtorRefHash, bytes32 creditorRefHash, bytes32 purposeHash, uint8 msgTypeCode, address token, uint256 amount, bytes3 currencyCode) m) external',
'function submitInbound((bytes32 instructionId, bytes32 endToEndIdHash, bytes32 uetr, bytes32 payloadHash, bytes32 debtorRefHash, bytes32 creditorRefHash, bytes32 purposeHash, bytes32 authAttestationHash, uint8 msgTypeCode, address token, uint256 amount, bytes3 currencyCode) m) external',
'function processedInstructions(bytes32) view returns (bool)',
];
@@ -59,6 +59,7 @@ export function buildGatewayMessage(
debtorRefHash: canonical.debtorRefHash,
creditorRefHash: canonical.creditorRefHash,
purposeHash: canonical.purposeHash,
authAttestationHash: canonical.authAttestationHash ?? ethers.ZeroHash,
msgTypeCode: canonical.msgTypeCode,
token: resolveTokenAddress(canonical, registry),
amount: BigInt(canonical.amountSmallestUnit || '0'),
@@ -91,6 +92,14 @@ export async function submitToIntakeGateway(
const message = buildGatewayMessage(canonical, registry);
if (
canonical.msgTypeCode === 5 &&
process.env.KTT_REQUIRE_ATTESTATION === '1' &&
(message.authAttestationHash === ethers.ZeroHash || !message.authAttestationHash)
) {
return { dryRun: false, gateway, error: 'KTT requires authAttestationHash' };
}
if (!execute) {
return { dryRun: true, gateway, prepared: true };
}

View File

@@ -1,4 +1,4 @@
import type { ParsedInbound, ParsedIso20022, ParsedJsonBroadcast, ParsedSwiftFin, SwiftFinMessageType } from '../types';
import type { ParsedInbound, ParsedIso20022, ParsedJsonBroadcast, ParsedKtt, ParsedSwiftFin, SwiftFinMessageType } from '../types';
function parseSwiftFields(text: string): Record<string, string> {
const fields: Record<string, string> = {};
@@ -176,8 +176,26 @@ export function parseSwiftFin(raw: string): ParsedSwiftFin {
};
}
export function detectInboundFormat(payload: string): 'swift_fin' | 'iso20022' | 'json_broadcast' {
export function detectInboundFormat(payload: string): 'swift_fin' | 'iso20022' | 'json_broadcast' | 'ktt' {
const t = payload.trim();
if (t.startsWith('{')) {
try {
const obj = JSON.parse(t) as Record<string, unknown>;
if (obj.format === 'ktt' || obj.messageType === 'KTT' || obj.messageType === 'TELEX_KTT') return 'ktt';
if (obj.event === 'deposit.submitted') return 'ktt';
} catch {
/* continue */
}
}
const upper = t.toUpperCase();
if (
upper.includes('TELEX REF') ||
upper.startsWith('ORDERING:') ||
upper.startsWith('BENEFICIARY:') ||
(t.includes(':20:') && t.includes(':32A:') && !t.startsWith('{1:'))
) {
return 'ktt';
}
if (t.startsWith('<?xml') || t.startsWith('<Document')) return 'iso20022';
if (
/^\{1:[A-Z0-9]{12}/.test(t) ||
@@ -255,8 +273,87 @@ export function parseJsonBroadcast(raw: string): ParsedJsonBroadcast {
}
export function parseInbound(payload: string): ParsedInbound {
const trimmed = payload.trim();
if (trimmed.startsWith('{')) {
try {
const obj = JSON.parse(trimmed) as Record<string, unknown>;
if (obj.format === 'ktt' || obj.messageType === 'KTT' || obj.messageType === 'TELEX_KTT') {
return parseKttEnvelope(trimmed, obj);
}
if (obj.event === 'deposit.submitted' && obj.payload) {
return parseKttEnvelope(trimmed, obj.payload as Record<string, unknown>);
}
} catch {
/* fall through */
}
}
const format = detectInboundFormat(payload);
if (format === 'ktt') return parseKtt(payload);
if (format === 'swift_fin') return parseSwiftFin(payload);
if (format === 'iso20022') return parseIso20022(payload);
return parseJsonBroadcast(payload);
}
function parseKttEnvelope(raw: string, obj: Record<string, unknown>): ParsedKtt {
const normalizedBody = String(obj.normalizedBody ?? obj.body ?? '');
const testKeyProof = String(obj.testKeyProof ?? obj.test_key_proof ?? '');
const messageType =
String(obj.messageType ?? obj.msgType ?? '') === 'TELEX_KTT' ? 'TELEX_KTT' : 'KTT';
const parsed: Record<string, unknown> = {
normalizedBody,
testKeyProof,
instructionId: obj.instructionId ?? obj.instruction_id,
telexRef: obj.telexRef ?? obj.telex_ref,
debtorId: obj.debtorId,
creditorId: obj.creditorId,
amount: obj.amount,
currency: obj.currency ?? obj.currencyCode,
authAttestationHash: obj.authAttestationHash ?? obj.auth_attestation_hash,
...((obj.normalizedFields as Record<string, unknown>) ?? {}),
};
return {
format: 'ktt',
messageType: messageType as 'KTT' | 'TELEX_KTT',
raw,
parsed,
searchableText: [normalizedBody, JSON.stringify(parsed)].join('\n'),
testKeyProof,
authAttestationHash: obj.authAttestationHash as string | undefined,
};
}
export function parseKtt(raw: string): ParsedKtt {
const body = raw.trim();
const messageType: 'KTT' | 'TELEX_KTT' =
body.includes(':20:') || body.includes(':32A:') ? 'TELEX_KTT' : 'KTT';
const parsed: Record<string, unknown> = { normalizedBody: body };
if (messageType === 'TELEX_KTT') {
const fin = parseSwiftFin(body.includes(':20:') ? `{4:\n${body}\n-}` : body);
const p = fin.parsed as Record<string, unknown>;
parsed.senderReference = p.senderReference;
parsed.orderingCustomer = p.orderingCustomer;
parsed.beneficiaryCustomer = p.beneficiaryCustomer;
parsed.amount = p.amount;
parsed.currency = p.currency;
} else {
for (const line of body.split('\n')) {
const upper = line.toUpperCase();
if (upper.startsWith('ORDERING:')) parsed.orderingCustomer = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('BENEFICIARY:')) parsed.beneficiaryCustomer = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('AMOUNT:')) {
const parts = line.split(':').slice(1).join(':').trim().split(/\s+/);
if (parts.length >= 2) {
parsed.currency = parts[0];
parsed.amount = parts[1];
}
}
}
}
return {
format: 'ktt',
messageType,
raw,
parsed,
searchableText: body,
};
}

View File

@@ -36,6 +36,7 @@ export function applyEnvOverrides(config: ListenerConfig): void {
if (envFlag('SWIFT_LISTENER_AS4_INBOX')) config.adapters.as4Inbox.enabled = true;
if (envFlag('SWIFT_LISTENER_MAIL_INBOX')) config.adapters.mailAttachmentInbox.enabled = true;
if (envFlag('SWIFT_LISTENER_TELEX_INBOX')) config.adapters.telexInbox.enabled = true;
config.outbound ??= defaultOutboundConfig();

View File

@@ -19,7 +19,9 @@ export type Iso20022MessageType =
| 'camt.054'
| 'unknown';
export type InboundFormat = 'swift_fin' | 'iso20022' | 'json_broadcast';
export type InboundFormat = 'swift_fin' | 'iso20022' | 'json_broadcast' | 'ktt';
export type KttMessageType = 'KTT' | 'TELEX_KTT';
export type ResourceMatchKind =
| 'chain138_name'
@@ -63,7 +65,17 @@ export type ParsedJsonBroadcast = {
searchableText: string;
};
export type ParsedInbound = ParsedSwiftFin | ParsedIso20022 | ParsedJsonBroadcast;
export type ParsedKtt = {
format: 'ktt';
messageType: KttMessageType;
raw: string;
parsed: Record<string, unknown>;
searchableText: string;
testKeyProof?: string;
authAttestationHash?: string;
};
export type ParsedInbound = ParsedSwiftFin | ParsedIso20022 | ParsedJsonBroadcast | ParsedKtt;
export type SwiftListenerEvent = {
id: string;
@@ -114,6 +126,7 @@ export type ListenerConfig = {
archiveDir: string;
as4InboxDir?: string;
mailInboxDir?: string;
telexInboxDir?: string;
};
adapters: {
fileInbox: { enabled: boolean; pollIntervalSec: number; archiveOnProcess?: boolean };
@@ -156,6 +169,11 @@ export type ListenerConfig = {
pollIntervalSec: number;
archiveOnProcess?: boolean;
};
telexInbox: {
enabled: boolean;
pollIntervalSec: number;
archiveOnProcess?: boolean;
};
};
outbound?: {
omnlForward: {

View File

@@ -0,0 +1,11 @@
{
"name": "@dbis/telex-transport-adapter",
"version": "0.1.0",
"private": true,
"type": "module",
"bin": { "telex-transport-adapter": "./dist/cli.js" },
"scripts": {
"build": "tsc -p tsconfig.json",
"dry-run": "node dist/cli.js --dry-run"
}
}

View File

@@ -0,0 +1,53 @@
/**
* Telex transport adapter — dry-run email-to-telex normalization for KTT rail.
* Usage: node dist/cli.js [--dry-run] <raw-file>
*/
import { readFileSync } from 'fs';
function extractTelexFromEmail(payload: string): string {
const text = payload.trim();
if (text.startsWith('{') && text.includes('body')) {
try {
const obj = JSON.parse(text) as Record<string, unknown>;
return String(obj.body ?? obj.text ?? text);
} catch {
/* continue */
}
}
const parts = text.split(/\n\n/);
if (parts.length >= 2 && /^From:/m.test(text)) return parts.slice(1).join('\n\n').trim();
return text;
}
function parseFields(body: string): Record<string, string> {
const fields: Record<string, string> = {};
for (const line of body.split('\n')) {
const upper = line.toUpperCase();
if (upper.startsWith('ORDERING:')) fields.debtorId = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('BENEFICIARY:')) fields.creditorId = line.split(':').slice(1).join(':').trim();
if (upper.startsWith('AMOUNT:')) {
const p = line.split(':').slice(1).join(':').trim().split(/\s+/);
if (p.length >= 2) {
fields.currencyCode = p[0];
fields.amount = p[1];
}
}
}
return fields;
}
const dryRun = process.argv.includes('--dry-run') || process.env.TELEX_TRANSPORT_DRY_RUN === '1';
const file = process.argv.find((a) => !a.startsWith('-') && a !== process.argv[0] && a !== process.argv[1]);
const raw = file ? readFileSync(file, 'utf8') : readFileSync(0, 'utf8');
const normalizedBody = extractTelexFromEmail(raw);
const messageType = normalizedBody.includes(':20:') ? 'TELEX_KTT' : 'KTT';
console.log(
JSON.stringify({
dryRun,
format: 'ktt',
messageType,
normalizedBody,
normalizedFields: parseFields(normalizedBody),
})
);

View File

@@ -0,0 +1,15 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"lib": ["ES2022"],
"outDir": "dist",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"moduleResolution": "node",
"resolveJsonModule": true
},
"include": ["src/**/*"]
}

View File

@@ -3,9 +3,9 @@
"version": {
"major": 1,
"minor": 6,
"patch": 9
"patch": 10
},
"timestamp": "2026-06-13T22:54:22.248Z",
"timestamp": "2026-06-18T18:27:15.134Z",
"keywords": [
"dbis",
"chain138",
@@ -804,6 +804,78 @@
"backing": "native-gas-asset",
"walletClass": "token"
}
},
{
"chainId": 138,
"address": "0x219522c60e83dEe01FC5b0329d6fA8fD84b9D13d",
"name": "USD Coin (Compliant V2)",
"symbol": "cUSDC_V2",
"decimals": 6,
"logoURI": "https://d-bis.org/tokens/cusdc.svg",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru",
"x402"
],
"extensions": {
"category": "gru-emoney",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v2",
"gruFamily": "cUSDC",
"preferredForX402": true,
"x402Ready": true,
"liquiditySourceSymbol": "cUSDC",
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false
}
},
{
"chainId": 138,
"address": "0x9FBfab33882Efe0038DAa608185718b772EE5660",
"name": "Tether USD (Compliant V2)",
"symbol": "cUSDT_V2",
"decimals": 6,
"logoURI": "https://d-bis.org/tokens/cusdt.svg",
"tags": [
"stablecoin",
"defi",
"compliant",
"fiat",
"cash",
"gru",
"x402"
],
"extensions": {
"category": "gru-emoney",
"instrument": "emoney-or-fiat-backed-stablecoin",
"currency": "USD",
"settlement": "fiat",
"cashLike": true,
"backing": "cash,cash-equivalents",
"gruVersion": "v2",
"gruFamily": "cUSDT",
"preferredForX402": true,
"x402Ready": true,
"liquiditySourceSymbol": "cUSDT",
"assetClass": "Cash & Equivalents",
"assetGroup": "MMF / Repo",
"instrumentType": "eMoney",
"underlying": "USD",
"gruLayer": "M1",
"rwaEligible": false
}
}
],
"tags": {