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
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:
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
29
contracts/tokens/CompliantCWUSDCTokenV2.sol
Normal file
29
contracts/tokens/CompliantCWUSDCTokenV2.sol
Normal 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_
|
||||
)
|
||||
{}
|
||||
}
|
||||
29
contracts/tokens/CompliantCWUSDTTokenV2.sol
Normal file
29
contracts/tokens/CompliantCWUSDTTokenV2.sol
Normal 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_
|
||||
)
|
||||
{}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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)]));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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)]));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
67
script/deploy/DeployCWTransportFiatTokensV2ForChain.s.sol
Normal file
67
script/deploy/DeployCWTransportFiatTokensV2ForChain.s.sol
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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"}
|
||||
@@ -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,
|
||||
|
||||
@@ -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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"}
|
||||
@@ -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"}
|
||||
@@ -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 };
|
||||
|
||||
@@ -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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"}
|
||||
1
services/swift-listener/dist/listener.d.ts
vendored
1
services/swift-listener/dist/listener.d.ts
vendored
@@ -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;
|
||||
|
||||
@@ -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"}
|
||||
19
services/swift-listener/dist/listener.js
vendored
19
services/swift-listener/dist/listener.js
vendored
@@ -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()));
|
||||
|
||||
2
services/swift-listener/dist/listener.js.map
vendored
2
services/swift-listener/dist/listener.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
|
||||
@@ -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"}
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"intakeGatewayAdapter.js","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":";;AAiDA,kDAiBC;AAYD,sDAyCC;AAvHD,mCAAgC;AAIhC,MAAM,WAAW,GAAG;IAClB,mQAAmQ;IACnQ,6DAA6D;CAC9D,CAAC;AAEF,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,KAAK,UAAU,cAAc,CAAI,KAAa,EAAE,EAAoB;IAClE,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,EAAE,EAAE;YACJ,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,cAAc,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAC9G,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,eAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAkC,EAClC,QAA0B;IAE1B,IAAI,SAAS,CAAC,YAAY,IAAI,eAAM,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,OAAO,eAAM,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBAC7E,OAAO,eAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,eAAM,CAAC,WAAW,CAAC;AAC5B,CAAC;AAED,SAAgB,mBAAmB,CACjC,SAAkC,EAClC,QAA0B;IAE1B,OAAO;QACL,aAAa,EAAE,SAAS,CAAC,oBAAoB;QAC7C,cAAc,EAAE,SAAS,CAAC,cAAc;QACxC,IAAI,EAAE,SAAS,CAAC,WAAW;QAC3B,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,KAAK,EAAE,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,IAAI,GAAG,CAAC;QACnD,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,IAAI,KAAK,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+D;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,KAAK,CAAC,yBAAyB,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,QAA0B,EAC1B,SAAkC;IAElC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACrF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,uBAAuB,CAAC;IAC/F,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,uBAAuB,EAAE,GAAG,EAAE,CACjE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,aAAa,CAAC,CACtD,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAqC,CAAC;QACvG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}
|
||||
{"version":3,"file":"intakeGatewayAdapter.js","sourceRoot":"","sources":["../../src/outbound/intakeGatewayAdapter.ts"],"names":[],"mappings":"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"}
|
||||
@@ -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
|
||||
@@ -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"}
|
||||
@@ -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
@@ -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"}
|
||||
@@ -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
20
services/swift-listener/dist/types.d.ts
vendored
20
services/swift-listener/dist/types.d.ts
vendored
@@ -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: {
|
||||
|
||||
2
services/swift-listener/dist/types.d.ts.map
vendored
2
services/swift-listener/dist/types.d.ts.map
vendored
File diff suppressed because one or more lines are too long
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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: {
|
||||
|
||||
11
services/telex-transport-adapter/package.json
Normal file
11
services/telex-transport-adapter/package.json
Normal 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"
|
||||
}
|
||||
}
|
||||
53
services/telex-transport-adapter/src/cli.ts
Normal file
53
services/telex-transport-adapter/src/cli.ts
Normal 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),
|
||||
})
|
||||
);
|
||||
15
services/telex-transport-adapter/tsconfig.json
Normal file
15
services/telex-transport-adapter/tsconfig.json
Normal 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/**/*"]
|
||||
}
|
||||
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user