Розробка compliance-системи для VASP

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка compliance-системи для VASP
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1306
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1218
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    920
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1147
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    610
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    885

Розробка системи 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 місяці розробки.