Разработка compliance-системы для VASP: от оценки рисков до автоматизации Travel Rule
VASP (Virtual Asset Service Provider) — термин FATF, обозначающий компании, работающие с виртуальными активами: обмен, передача, хранение, управление. Compliance-система для VASP должна покрывать полный набор рекомендаций FATF и требования конкретной юрисдикции. Мы строим такие системы с момента основания — за это время реализовали более 20 проектов для крипто-обменников, DeFi-платформ и кастодиальных сервисов. Без комплексного подхода аудит регулятора почти всегда выявляет несоответствия: от недостаточного риск-скоринга до пропущенных обязательств по Travel Rule.
Проблема: большинство заказчиков приходит с «лоскутной» автоматизацией. Отдельно KYC, отдельно мониторинг транзакций, Travel Rule через Excel. Это не проходит аудит. Мы предлагаем единую архитектуру, где каждый модуль обменивается данными в реальном времени. Штрафы за несоблюдение AML могут превышать €200 000, поэтому точность системы критична. Дополнительно, после внедрения полной системы клиенты экономят на операционных расходах до $100 000 в год — за счёт автоматизации ручного анализа.
Почему compliance для VASP сложнее банковского?
В банковской сфере транзакции идут через SWIFT, есть чёткие идентификаторы сторон. У VASP — псевдонимные кошельки, мгновенные переводы между юрисдикциями, децентрализованные биржи. Мониторинг должен учитывать:
- Использование миксеров и тумблеров (например, Tornado Cash)
- Rapid succession — несколько транзакций за минуту с дроблением сумм
- Unhosted wallets — переводы на личные кошельки без KYC
Мы реализовали правила, которые анализируют не только сумму, но и историю кошелька, частоту транзакций и категорию AML (по Chainalysis или собственной разметке). Наша система обрабатывает такие сценарии в 240 раз быстрее по сравнению с самописными решениями — проверено в проекте с эстонским VASP.
Как мы решаем проблему Travel Rule?
FATF R16 требует передавать информацию об отправителе и получателе для переводов выше порога (обычно 1000 USD). Для VASP это означает интеграцию с протоколами вроде Notabene или Sygna. Мы встраиваем orchestration-слой, который:
- Определяет, попадает ли перевод под Travel Rule
- Идентифицирует принимающий VASP по адресу кошелька (через реестр или API)
- Отправляет originator/beneficiary data через выбранного провайдера
- Если принимающая сторона не найдена (unhosted wallet) — включает усиленный мониторинг
Код orchestration-слоя (реальная логика из проекта):
async function processVASPTransfer(transfer: OutgoingTransfer): Promise<void> { const travelRuleRequired = transfer.usdAmount >= TRAVEL_RULE_THRESHOLD; if (travelRuleRequired) { const receivingVASP = await identifyReceivingVASP(transfer.destinationAddress); if (!receivingVASP) { await addEnhancedMonitoring(transfer.userId); } else { 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-системы под ключ?
Мы передаём не просто код, а готовую к эксплуатации систему:
| Deliverable | Описание |
|---|---|
| Архитектура | ERD, sequence-диаграммы, описание API |
| Модуль риск-скоринга | Customer Risk Assessment с кастомными весами (10 параметров) |
| Движок мониторинга | 20+ правил TM, интеграция с Chainalysis/ComplyAdvantage, точность 95% |
| Travel Rule | Интеграция с Notabene/Sygna, orchestration-слой |
| KYC/KYB | Webhook-интеграция с Sumsub, очереди на проверку |
| Record Keeping | Encrypted storage с checksum, retention 5+ лет |
| Dashboard | React-панель для Compliance Officer (алерты, SAR, очереди) |
| Документация | Руководство оператора, техническая документация, описание правил |
| Обучение | Сессия для compliance-отдела, инструкции |
| Поддержка | 3 месяца постапроектного сопровождения |
Как мы строим систему: кейс из практики
Для одного из клиентов (лицензированный VASP в Эстонии) мы заменили их самописную CRM на нашу архитектуру. Исходно у них был только базовый KYC через Jumio и постфактум-проверка транзакций раз в день. Мы внедрили real-time мониторинг с 20 правилами, подключили Chainalysis KYT и Travel Rule через Notabene. Результат — время реагирования на подозрительные транзакции сократилось с 8 часов до 2 минут. Аудит регулятора был пройден с первой попытки. Дополнительно, клиент сократил операционные затраты на $100 000 в год за счёт автоматизации ручных проверок.
FATF Рекомендации для VASP
Полный список требований FATF R15:
- Регистрация или лицензирование в юрисдикции деятельности
- AML/CFT программа (R10-21)
- Travel Rule compliance (R16)
- Sanctions screening
- Reporting suspicious transactions
Для технической системы это означает набор связанных модулей.
Customer Risk Assessment
Каждый клиент получает risk score при onboarding и переоценивается периодически:
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), ]); 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), 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]; } } Transaction Monitoring Rules Engine
Правила мониторинга транзакций специфичны для 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", }, ]; Record Keeping (FATF R11)
FATF требует хранить records 5+ лет. Система должна обеспечить:
interface VASPRecord { customerId: string; recordType: "KYC" | "TRANSACTION" | "CORRESPONDENCE" | "SAR" | "RISK_ASSESSMENT"; createdAt: Date; retentionUntil: Date; 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)); } } Compliance Dashboard
Для Compliance Officer — дашборд с:
- Pending KYC reviews
- Active alerts и transaction monitoring hits
- SAR queue
- Customer risk reviews due
- Sanctions list updates
- Regulatory reporting deadlines
| Компонент | Технология |
|---|---|
| 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 месяца разработки. Стоимость рассчитывается индивидуально.
Свяжитесь с нами для консультации или закажите аудит вашей текущей системы compliance. Получите бесплатный анализ уязвимостей.







