Розробка системи compliance для VASP
VASP (Virtual Asset Service Provider) — термін FATF для компаній, які надають послуги з віртуальними активами: обмін, передача, зберігання, управління. Система compliance для VASP повинна охоплювати повний набір рекомендацій FATF плюс вимоги конкретної юрисдикції ліцензування.
Рекомендації FATF для VASP
FATF Recommendation 15 (R15) вимагає від VASP:
- Реєстрація або ліцензування в юрисдикції діяльності
- AML/CFT програми (R10-21)
- Travel Rule compliance (R16)
- Скринінг санкцій
- Звітування про підозрілі транзакції
Для технічної системи це означає набір взаємопов'язаних модулів:
Оцінка ризику клієнта
Кожен клієнт отримує оцінку ризику при підключенні та переоцінюється періодично:
class VASPCustomerRiskEngine {
async assessCustomer(customer: CustomerProfile): Promise<RiskAssessment> {
const factors = await Promise.all([
this.assessCountryRisk(customer.residenceCountry, customer.nationality),
this.assessProductRisk(customer.expectedProducts),
this.assessVolumeRisk(customer.expectedMonthlyVolume),
this.checkPEPStatus(customer),
this.checkSanctionsStatus(customer),
this.assessCustomerType(customer.type), // фізична особа vs корпоративна
]);
// Зважена агрегація
const weights = { country: 0.3, product: 0.15, volume: 0.2, pep: 0.2, sanctions: 0.15 };
const weightedScore = factors.reduce((sum, f, i) =>
sum + f.score * Object.values(weights)[i], 0
);
const riskLevel: RiskLevel =
factors.find(f => f.score === 100)?.forceHigh ? RiskLevel.HIGH :
weightedScore >= 70 ? RiskLevel.HIGH :
weightedScore >= 40 ? RiskLevel.MEDIUM :
RiskLevel.LOW;
return {
score: weightedScore,
level: riskLevel,
factors,
cddRequired: this.determineCDDLevel(riskLevel),
reviewFrequency: this.getReviewFrequency(riskLevel), // LOW: 3р, MED: 1р, HIGH: 6м
nextReviewDate: this.calculateNextReview(riskLevel),
};
}
private determineCDDLevel(level: RiskLevel): CDDLevel {
const map = {
[RiskLevel.LOW]: CDDLevel.SIMPLIFIED,
[RiskLevel.MEDIUM]: CDDLevel.STANDARD,
[RiskLevel.HIGH]: CDDLevel.ENHANCED,
};
return map[level];
}
}
Рушій правил моніторингу транзакцій
Правила моніторингу транзакцій характерні для VASP (відрізняються від банківських):
const VASP_TM_RULES: MonitoringRule[] = [
{
id: "VASP-001",
name: "High Value Transaction",
condition: (tx) => tx.usdAmount >= 10000,
alertLevel: AlertLevel.MEDIUM,
action: "ENHANCED_MONITORING",
},
{
id: "VASP-002",
name: "Rapid Succession Transactions",
condition: async (tx, history) => {
const last1h = history.filter(h => Date.now() - h.timestamp < 3600000);
return last1h.length >= 5 && last1h.reduce((s, h) => s + h.usdAmount, 0) >= 5000;
},
alertLevel: AlertLevel.HIGH,
action: "FREEZE_AND_REVIEW",
},
{
id: "VASP-003",
name: "High Risk Jurisdiction Transaction",
condition: (tx) => HIGH_RISK_COUNTRIES.includes(tx.counterpartyCountry),
alertLevel: AlertLevel.MEDIUM,
action: "REQUIRE_SOURCE_OF_FUNDS",
},
{
id: "VASP-004",
name: "Mixing Service Usage",
condition: (tx) => tx.amlCategory === "mixing" || tx.amlCategory === "tumbling",
alertLevel: AlertLevel.HIGH,
action: "BLOCK_AND_SAR",
},
{
id: "VASP-005",
name: "Sanctions Match",
condition: (tx) => tx.sanctionsMatch === true,
alertLevel: AlertLevel.CRITICAL,
action: "FREEZE_AND_REPORT_IMMEDIATELY",
},
];
Ведення записів (FATF R11)
FATF вимагає зберігання записів 5+ років. Система повинна забезпечити:
interface VASPRecord {
customerId: string;
recordType: "KYC" | "TRANSACTION" | "CORRESPONDENCE" | "SAR" | "RISK_ASSESSMENT";
createdAt: Date;
retentionUntil: Date; // createdAt + 5 років (або довше по юрисдикції)
content: encrypted_blob;
checksum: string; // перевірка цілісності
accessLog: AccessLogEntry[];
}
class RecordKeepingService {
async storeRecord(data: any, type: RecordType, customerId: string): Promise<string> {
const encrypted = await this.encrypt(JSON.stringify(data));
const checksum = crypto.createHash("sha256").update(encrypted).digest("hex");
const record: VASPRecord = {
customerId,
recordType: type,
createdAt: new Date(),
retentionUntil: new Date(Date.now() + 5 * 365 * 24 * 60 * 60 * 1000),
content: encrypted,
checksum,
accessLog: [],
};
await this.db.saveRecord(record);
return checksum;
}
// Перевірка цілісності при отриманні
async retrieveRecord(recordId: string): Promise<any> {
const record = await this.db.getRecord(recordId);
const computedChecksum = crypto
.createHash("sha256")
.update(record.content)
.digest("hex");
if (computedChecksum !== record.checksum) {
throw new Error("Record integrity compromised");
}
await this.db.logAccess(recordId, "READ");
return JSON.parse(await this.decrypt(record.content));
}
}
Модуль Travel Rule
FATF R16 вимагає передавати інформацію про відправника та одержувача для переводів вище 1000/3000 доларів США. Детальна реалізація через Notabene або Sygna (окремі сервіси), тут — логіка організації:
async function processVASPTransfer(transfer: OutgoingTransfer): Promise<void> {
const travelRuleRequired = transfer.usdAmount >= TRAVEL_RULE_THRESHOLD;
if (travelRuleRequired) {
// Визначити отримуючий VASP
const receivingVASP = await identifyReceivingVASP(transfer.destinationAddress);
if (!receivingVASP) {
// Unhosted wallet — спрощені вимоги, але потрібен посилений моніторинг
await addEnhancedMonitoring(transfer.userId);
} else {
// Відправити дані Travel Rule через Notabene/Sygna
await travelRuleProvider.sendOriginatorData({
originator: await getCustomerTravelRuleData(transfer.userId),
beneficiary: { vasp: receivingVASP },
transfer: { asset: transfer.asset, amount: transfer.amount, txHash: transfer.txHash },
});
}
}
await executeTransfer(transfer);
}
Панель управління Compliance
Для Compliance Officer — дашборд з:
- Очікуючі перегляди KYC (черга верифікації)
- Активні сповіщення та hits моніторингу транзакцій
- Черга SAR (чернетки + подані)
- Перегляди ризику клієнтів (клієнти для переоцінки)
- Оновлення санкційних списків
- Дедлайни нормативної звітності
| Компонент | Технологія |
|---|---|
| Risk engine | Node.js + PostgreSQL |
| TM rules | Configurable rules engine + BullMQ |
| KYC | Sumsub + webhook |
| AML | Chainalysis KYT |
| PEP/Sanctions | ComplyAdvantage |
| Travel Rule | Notabene або Sygna |
| Dashboard | React + admin panel |
Повна система VASP compliance: 3-4 місяці розробки.







