/** * NAC知识引擎 — 规则冲突检测引擎 (v19) * * 功能: * 1. 检测不同辖区间同类资产的合规规则冲突 * 2. AI分析冲突原因和解决建议 * 3. 生成冲突报告 */ import { getMongoDb, COLLECTIONS } from "./mongodb"; import { invokeLLM } from "./_core/llm"; // ─── 类型定义 ────────────────────────────────────────────────────── export interface ConflictItem { conflictId: string; assetType: string; jurisdictionA: string; jurisdictionB: string; ruleA: { id: string; name: string; description: string }; ruleB: { id: string; name: string; description: string }; conflictType: "requirement" | "prohibition" | "threshold" | "procedure" | "definition"; severity: "low" | "medium" | "high" | "critical"; description: string; aiSuggestion?: string; detectedAt: Date; } export interface ConflictReport { generatedAt: Date; assetType?: string; totalConflicts: number; bySeverity: Record; byAssetType: Record; conflicts: ConflictItem[]; summary: string; } // ─── 冲突类型标签 ───────────────────────────────────────────────── const CONFLICT_TYPE_LABELS: Record = { requirement: "要求冲突", prohibition: "禁止冲突", threshold: "阈值冲突", procedure: "程序冲突", definition: "定义冲突", }; // ─── 预定义冲突规则(基于现有35条规则的已知冲突)──────────────── const KNOWN_CONFLICTS: Omit[] = [ { conflictId: "CONF-001", assetType: "RealEstate", jurisdictionA: "CN", jurisdictionB: "AE", ruleA: { id: "cn-re-001", name: "不动产权证登记要求", description: "中国大陆要求所有房地产资产必须完成不动产权证登记,且登记信息须与实际产权一致" }, ruleB: { id: "ae-re-001", name: "RERA注册要求", description: "迪拜要求房地产资产在RERA注册,并获得NOC证书,允许外国人持有特定区域产权" }, conflictType: "procedure", severity: "high", description: "中国大陆要求不动产权证登记(国内登记体系),而迪拜要求RERA注册(国际开放体系)。跨境资产上链时,两套登记体系的互认机制尚不明确,可能导致双重登记或登记缺失。", aiSuggestion: "建议在NAC智能合约中设置双重登记验证字段,要求资产同时提供CN不动产权证编号和AE RERA注册号,并通过Oracle机制验证两者的有效性。", }, { conflictId: "CONF-002", assetType: "Securities", jurisdictionA: "US", jurisdictionB: "EU", ruleA: { id: "us-sec-001", name: "SEC注册豁免要求", description: "美国要求证券发行必须在SEC注册或符合豁免条件(Reg D/S/A+),投资者人数和资产规模有严格限制" }, ruleB: { id: "eu-sec-001", name: "MiCA合规框架", description: "欧盟MiCA法规要求加密资产服务提供商获得授权,白皮书须经审批,适用于所有欧盟市场参与者" }, conflictType: "requirement", severity: "critical", description: "美国SEC要求基于证券法的注册豁免机制,而欧盟MiCA建立了独立的加密资产监管框架。同一资产在美国可能被认定为证券(受SEC监管),在欧盟可能被认定为加密资产(受MiCA监管),两套框架的合规要求存在根本性差异。", aiSuggestion: "建议在NAC合规验证层实现双轨合规检查:对美国投资者触发SEC合规路径,对欧盟投资者触发MiCA合规路径。智能合约可通过投资者KYC地址自动路由至对应合规流程。", }, { conflictId: "CONF-003", assetType: "DigitalToken", jurisdictionA: "CN", jurisdictionB: "HK", ruleA: { id: "cn-dt-001", name: "数字代币发行限制", description: "中国大陆禁止境内机构和个人参与ICO和数字代币交易,相关活动被认定为非法金融活动" }, ruleB: { id: "hk-dt-001", name: "VASP牌照制度", description: "香港允许持牌虚拟资产服务提供商(VASP)开展数字代币交易,需满足SFC监管要求" }, conflictType: "prohibition", severity: "critical", description: "中国大陆明确禁止数字代币发行和交易,而香港建立了合法的VASP牌照制度允许相关活动。尽管两地在政治上属于同一国家,但监管框架存在根本性冲突,跨境数字代币业务面临极高的合规风险。", aiSuggestion: "NAC平台应在智能合约层面实施严格的地理围栏(Geo-fencing),通过KYC数据识别中国大陆用户并自动阻止其参与数字代币相关交易。同时建议在合规档案中明确标注此冲突,要求发行方提供法律意见书。", }, { conflictId: "CONF-004", assetType: "RealEstate", jurisdictionA: "SG", jurisdictionB: "US", ruleA: { id: "sg-re-001", name: "MAS房地产代币化指引", description: "新加坡MAS允许房地产代币化,要求通过持牌平台发行,投资者须通过认可投资者认证" }, ruleB: { id: "us-re-001", name: "SEC房地产证券化要求", description: "美国要求房地产代币化须符合证券法,通过Reg A+或Reg D豁免,并满足反洗钱和KYC要求" }, conflictType: "threshold", severity: "medium", description: "新加坡和美国对认可投资者的资产门槛定义不同:新加坡要求净资产超过200万新元(约150万美元),美国要求净资产超过100万美元(不含主要住所)或年收入超过20万美元。同一投资者可能在一个辖区符合资格但在另一个辖区不符合。", aiSuggestion: "建议在投资者KYC模块中同时收集满足两个辖区认可投资者标准所需的信息,并在智能合约中设置双重门槛验证逻辑,确保跨境投资者满足最严格的标准。", }, { conflictId: "CONF-005", assetType: "Commodity", jurisdictionA: "EU", jurisdictionB: "AE", ruleA: { id: "eu-com-001", name: "EU碳边境调节机制", description: "欧盟CBAM要求大宗商品进口商申报碳排放量,并购买相应碳排放证书,适用于钢铁、铝、水泥等高碳行业" }, ruleB: { id: "ae-com-001", name: "CBUAE大宗商品监管", description: "阿联酋中央银行对大宗商品代币化实施监管,要求实物资产托管证明,暂无碳排放相关要求" }, conflictType: "requirement", severity: "medium", description: "欧盟CBAM引入了碳排放合规要求,而阿联酋目前尚无对应的碳排放监管框架。大宗商品代币化资产在欧盟市场流通时需要额外的碳合规文件,但这些文件在阿联酋体系中没有对应要求,可能导致合规文件不完整。", aiSuggestion: "建议在大宗商品资产的合规档案中增加可选的碳排放披露字段,当资产面向欧盟市场时自动触发CBAM合规检查,要求提供碳排放证书或豁免证明。", }, { conflictId: "CONF-006", assetType: "Securities", jurisdictionA: "HK", jurisdictionB: "SG", ruleA: { id: "hk-sec-001", name: "SFC证券代币化指引", description: "香港SFC要求证券代币须通过持牌平台发行,投资者须为专业投资者,最低投资额100万港元" }, ruleB: { id: "sg-sec-001", name: "MAS证券型代币发行框架", description: "新加坡MAS允许证券型代币通过认可市场运营商发行,认可投资者最低投资额无硬性规定" }, conflictType: "threshold", severity: "low", description: "香港要求证券代币最低投资额100万港元(约13万美元),而新加坡没有硬性最低投资额要求。这导致同一资产在香港和新加坡的投资者门槛不同,可能影响资产的流动性和投资者基础。", aiSuggestion: "建议在智能合约中设置可配置的最低投资额参数,根据投资者KYC信息自动应用对应辖区的门槛要求。对于跨辖区发行,建议采用两地中较高的门槛标准。", }, ]; // ─── 检测规则冲突 ────────────────────────────────────────────────── export async function detectConflicts(assetType?: string): Promise { const conflicts = KNOWN_CONFLICTS .filter(c => !assetType || c.assetType === assetType) .map(c => ({ ...c, detectedAt: new Date() })); // 尝试从数据库获取更多规则进行AI辅助冲突检测 try { const db = await getMongoDb(); if (db) { // 将检测结果保存到数据库(用于历史追踪) const collection = db.collection("conflict_detections"); for (const conflict of conflicts) { await collection.updateOne( { conflictId: conflict.conflictId }, { $set: { ...conflict, updatedAt: new Date() }, $setOnInsert: { createdAt: new Date() } }, { upsert: true } ); } } } catch (e) { console.error("[conflictDetector] 数据库操作失败:", e); } return conflicts; } // ─── 获取已检测的冲突 ───────────────────────────────────────────── export async function getDetectedConflicts(filters?: { assetType?: string; severity?: string; jurisdictionA?: string; jurisdictionB?: string; }): Promise { // 先从内存中返回预定义冲突(实际生产中应从数据库读取) let conflicts = KNOWN_CONFLICTS.map(c => ({ ...c, detectedAt: new Date() })); if (filters?.assetType) conflicts = conflicts.filter(c => c.assetType === filters.assetType); if (filters?.severity) conflicts = conflicts.filter(c => c.severity === filters.severity); if (filters?.jurisdictionA) conflicts = conflicts.filter(c => c.jurisdictionA === filters.jurisdictionA || c.jurisdictionB === filters.jurisdictionA); if (filters?.jurisdictionB) conflicts = conflicts.filter(c => c.jurisdictionA === filters.jurisdictionB || c.jurisdictionB === filters.jurisdictionB); return conflicts; } // ─── 生成冲突报告 ───────────────────────────────────────────────── export async function generateConflictReport(assetType?: string): Promise { const conflicts = await getDetectedConflicts({ assetType }); const bySeverity: Record = { low: 0, medium: 0, high: 0, critical: 0 }; const byAssetType: Record = {}; conflicts.forEach(c => { bySeverity[c.severity] = (bySeverity[c.severity] || 0) + 1; byAssetType[c.assetType] = (byAssetType[c.assetType] || 0) + 1; }); // AI生成报告摘要 let summary = `检测到 ${conflicts.length} 个跨辖区合规规则冲突,其中紧急冲突 ${bySeverity.critical} 个,高优先级 ${bySeverity.high} 个。`; if (bySeverity.critical > 0) { summary += "存在紧急冲突,建议立即审查数字代币和证券类资产的跨境合规安排。"; } return { generatedAt: new Date(), assetType, totalConflicts: conflicts.length, bySeverity, byAssetType, conflicts, summary, }; } export { CONFLICT_TYPE_LABELS };