פיתוח מערכת ציות ל-VASP: מהערכת סיכונים לאוטומציית Travel Rule
עבור VASPs (ספקי שירותי נכסים וירטואליים), מערכת ציות חייבת לכסות את מכלול ההמלצות של FATF ואת הדרישות הספציפיות של תחום השיפוט. בנינו מערכות כאלה מהיום הראשון—מעל 20 פרויקטים עבור בורסות קריפטו, פלטפורמות DeFi ושירותי משמורת. ללא גישה מקיפה, ביקורת רגולטורית תגלה כמעט תמיד פערים: מחישוב סיכון לא מספק ועד להחמצת התחייבויות Travel Rule.
הבעיה היא שרוב הלקוחות מגיעים עם אוטומציה של "טלאים": KYC נפרד, ניטור עסקאות נפרד, Travel Rule דרך Excel. זה לא עובר ביקורות. אנו מציעים ארכיטקטורה מאוחדת שבה כל מודול מחליף נתונים בזמן אמת. קנסות AML על אי-ציות יכולים לעלות על €200,000, ולכן דיוק המערכת הוא קריטי. בנוסף, לאחר יישום מערכת מלאה, לקוחות חוסכים עד $100,000 בשנה בעלויות תפעול על ידי אוטומציה של ניתוח ידני.
מדוע ציות ל-VASP קשה יותר מאשר בבנקאות?
בבנקאות, עסקאות עוברות דרך SWIFT עם מזהי צד שכנגד ברורים. עבור VASPs, ארנקים פסאודונימיים, העברות מיידיות בין תחומי שיפוט ובורסות מבוזרות הם דבר נפוץ. הניטור חייב להתחשב ב:
- שימוש במיקסרים וטמבלרים (למשל, Tornado Cash)
- רצף מהיר: מספר עסקאות בדקה עם פיצול סכומים
- ארנקים לא מאוחסנים: העברות לארנקים אישיים ללא KYC
יישמנו כללים שמנתחים לא רק את הסכום אלא גם את היסטוריית הארנק, תדירות העסקאות וקטגוריית AML (מ-Chainalysis או תיוג מותאם אישית). המערכת שלנו מטפלת בתרחישים אלה פי 240 מהר יותר מפתרונות פנימיים—הוכח בפרויקט עם VASP אסטוני.
כיצד אנו פותרים את בעיית ה-Travel Rule
FATF R16 דורש העברת מידע על השולח והמוטב עבור העברות מעל סף מסוים (בדרך כלל 1000 דולר). עבור VASPs, משמעות הדבר היא אינטגרציה עם פרוטוקולים כמו Notabene או Sygna. אנו מטמיעים שכבת אורקסטרציה אשר:
- קובעת אם ההעברה נופלת תחת Travel Rule
- מזהה את ה-VASP המקבל לפי כתובת הארנק (באמצעות רישום או API)
- שולחת נתוני שולח/מוטב דרך הספק הנבחר
- אם הצד המקבל לא נמצא (ארנק לא מאוחסן), היא מפעילה ניטור מוגבר
קוד שכבת האורקסטרציה (לוגיקת פרויקט אמיתית):
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);
} מה כלול בפיתוח מערכת ציות סוהר?
אנו מספקים לא רק קוד אלא מערכת מוכנה לייצור:
| תוצר | תיאור |
|---|---|
| ארכיטקטורה | ERD, דיאגרמות רצף, תיאור API |
| מודול חישוב סיכון | הערכת סיכון לקוח עם משקלים מותאמים אישית (10 פרמטרים) |
| מנוע ניטור | 20+ כללי TM, אינטגרציה עם Chainalysis/ComplyAdvantage, דיוק של 95% |
| Travel Rule | אינטגרציה עם Notabene/Sygna, שכבת אורקסטרציה |
| KYC/KYB | אינטגרציית Webhook עם Sumsub, תורי אימות |
| שמירת רשומות | אחסון מוצפן עם checksum, שמירה ל-5+ שנים |
| לוח בקרה | פאנל קצין ציות מבוסס React (התראות, SAR, תורים) |
| תיעוד | מדריך מפעיל, תיעוד טכני, תיאורי כללים |
| הדרכה | מפגש לצוות הציות, הוראות |
| תמיכה | 3 חודשי תמיכה לאחר הפרויקט |
כיצד אנו בונים את המערכת: מקרה בוחן
עבור לקוח אחד (VASP מורשה באסטוניה), החלפנו את ה-CRM המותאם אישית שלהם בארכיטקטורה שלנו. בתחילה, היה להם רק KYC בסיסי דרך Jumio ובדיקות עסקאות בדיעבד פעם ביום. פרסנו ניטור בזמן אמת עם 20 כללים, חיברנו Chainalysis KYT ושילבנו Travel Rule דרך Notabene. תוצאה: זמן התגובה לעסקאות חשודות ירד מ-8 שעות ל-2 דקות. ביקורת הרגולטור עברה בניסיון הראשון. בנוסף, הלקוח קיצץ בעלויות תפעול ב-$100,000 בשנה הודות לאוטומציה של בדיקות ידניות.
המלצות FATF עבור VASPs
רשימה מלאה של דרישות FATF R15:
- רישום או מתן רישיון בתחום השיפוט שבו פועלים
- תוכנית AML/CFT (R10-21)
- עמידה ב-Travel Rule (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),
]);
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];
}
} מנוע כללי ניטור עסקאות
כללי ניטור ספציפיים ל-VASPs:
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;
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));
}
} לוח בקרת ציות
עבור קצין הציות, לוח בקרה עם:
- בדיקות KYC ממתינות
- התראות פעילות ופגיעות ניטור עסקאות
- תור SAR
- בדיקות סיכון לקוח שמועדן הגיע
- עדכוני רשימות סנקציות
- מועדי דיווח רגולטוריים
| רכיב | טכנולוגיה |
|---|---|
| מנוע סיכון | Node.js + PostgreSQL |
| כללי TM | מנוע כללים ניתן להגדרה + BullMQ |
| KYC | Sumsub + webhook |
| AML | Chainalysis KYT |
| PEP/סנקציות | ComplyAdvantage |
| Travel Rule | Notabene או Sygna |
| לוח בקרה | React + פאנל ניהול |
מערכת ציות מלאה ל-VASP אורכת 3–4 חודשים לפיתוח. התמחור נקבע באופן אישי.
צרו קשר לייעוץ או בקשו ביקורת על מערכת הציות הנוכחית שלכם. קבלו ניתוח פגיעות חינם.







