Ce que ce document est : un cas rejouable de criblage, avec sa piste d'audit (cas_pratique_vasp_audit.csv, 16 colonnes, une ligne par correspondance). Ce qu'il n'est pas : un avis juridique, ni une preuve de blanchiment. Une correspondance est un signal à vérifier ; un non-résultat ne blanchit personne.
Un VASP fictif, un index réel
Sahel Pay SARL est un prestataire de services sur actifs virtuels fictif (dépôt et retrait, Niamey et Abidjan). Chaque mois, le responsable conformité soumet son registre à l'index : les adresses qui ont reçu ou émis des fonds, et les noms déclarés au KYC. Le registre compte 12 entrées ; l'index de référence est le relevé OFAC SDN + liste consolidée ONU du 12/10/2026 13:35 UTC — 20 426 désignations, 43 282 noms et alias, 505 adresses publiées par les autorités.
Deux choses seulement sont réelles ici : les adresses désignées et l'index. Le VASP, ses dépôts et les deux adresses de test sont des constructions pédagogiques, marquées comme telles dans le fichier d'entrée. Un non-résultat sur une chaîne inventée ne prouve rien, ni dans un sens ni dans l'autre.
Les 12 valeurs soumises
| # | Valeur criblée | Détecté | Rôle | Lignes | Correspondances |
|---|---|---|---|---|---|
| 1 | 3Lpoy53K625zVeE47ZasiG5jGkAxJ27kh1 | address | Depot recu le 2026-10-03 | 1 | GARANTEX EUROPE OU entity XBT |
| 2 | 0x7FF9cFad3877F21d41Da833E2F775dB0569eE3D9 | address | Meme contrepartie, reseau Ethereum | 1 | GARANTEX EUROPE OU entity ETH |
| 3 | 0xd882cfc20f52f2599d84b8e8d58c7fb62cfe344b | address | Reglement fournisseur | 2 | KARASAVIDI, Dmitrii individual ETH KARASAVIDI, Dmitrii individual ETC |
| 4 | 12HQDsicffSBaYdJ6BhnE22sfjTESmmzKx | address | Contrepartie SUEX OTC | 1 | SUEX OTC, S.R.O. entity XBT |
| 5 | 3E7YbpXuhh3CWFks1jmvWoV8y5DvsfzE6n | address | Contrepartie CHATEX | 1 | CHATEX entity XBT |
| 6 | 3K4rjdh8A5yi6LWvft2rbmyZvqEbPSSSX4 | address | Contrepartie HYDRA MARKET | 1 | HYDRA MARKET entity XBT |
| 7 | 0x5aF00dC0FFEE0000000000000000000000000000 | address | Portefeuille chaud (test) | — | aucune correspondance |
| 8 | 1SaheLPayTestAddressNoWaLLetAbc12 | address | Adresse de retrait (test) | — | aucune correspondance |
| 9 | Garantex | name | Nom a cribler | 1 | GARANTEX EUROPE OU entity |
| 10 | Sahel Pay SARL | name | Nom a cribler | 8 | NEGIN KISH INTERNATIONAL SAHEL AND FARASAHEL DEVELOPMENT entity NEGIN SAHEL ROYAL INVESTMENT COMPANY entity OMRAN SAHEL entity OMRAN SAHEL entity RAH SAHEL entity RAH SAHEL INSTITUTE entity SAHEL CONSULTANT ENGINEERS entity SAHEL CONSULTANT ENGINEERS entity |
| 11 | TFwjPScaJRCbSWVAywE1S1WgaU | name | Annexe — TRON tronquee | — | aucune correspondance |
| 12 | 1h939dom7i4wdlckygbxup3fs9cstnrzgl | name | Annexe — hors base58 | — | aucune correspondance |
Bloc A : registre interne (6 contreparties réelles). Bloc B : chaînes de test sans portefeuille. Bloc C : noms. Bloc D : deux chaînes publiées que le filtre de format ne reconnaît pas comme des adresses — traitées au §5.3.
Ce que le moteur répond
12 entrées criblées, 8 avec au moins une correspondance, 4 sans. Les six adresses de contreparties du bloc A ressortent toutes, sur 5 entités désignées distinctes. Le nom « Garantex » ressort en correspondance exacte d'alias. Les deux adresses de test ne ressortent pas — ce qui ne démontre rien. Les deux noms du bloc C produisent à eux seuls 9 lignes : c'est le piège du §5.2.
Le CSV d'audit _vpsdata/cas_pratique_vasp_audit.csv reprend le schéma de l'export de la page (16 colonnes), une ligne par correspondance, plus une ligne « NO MATCH » par entrée sans résultat.
Trois décisions, dans cet ordre
1. Geler et déclarer (bloc A)
Les 6 adresses de contreparties correspondent, sur 5 entités : Garantex Europe OU (deux actifs), Karasavidi Dmitrii, SUEX OTC, Chatex, Hydra Market. Gel des fonds, déclaration de soupçon à la CENTIF/ANIF, sans informer la contrepartie (tipping-off). La pièce conservée est le CSV avec son empreinte d'index : c'est elle qui rend le criblage opposable six mois plus tard.
2. Écarter les faux positifs de nom (bloc C)
« Sahel Pay SARL », le VASP lui-même, ressort en 8 correspondances partielles : toutes des entités iraniennes dont le nom contient « SAHEL ». Le score 1.0 mesure un recouvrement de tokens, pas une identité. Pas de gel, mais une ligne de registre qui dit pourquoi le signal a été écarté.
3. Ne rien conclure des non-résultats
Les adresses de test sont inventées ; et les deux chaînes de l'annexe sortent « rien trouvé » alors qu'elles sont dans l'index (§5.3). Un non-résultat n'est ni un blanchiment de conformité, ni une preuve d'absence.
Trois pièges que ce cas démontre
Une adresse, deux actifs
0xd882cfc20f52f2599d84b8e8d58c7fb62cfe344b est publiée sous ETH et ETC : deux lignes pour une seule entité. Compter les lignes n'est pas compter les entités.
Un mot commun, 8 « correspondances »
Le criblage partiel bascule sur un recouvrement de tokens dès qu'aucune similarité n'atteint 0.88 : un nom d'entreprise contenant un mot géographique courant remplit l'écran. La parade n'est pas de baisser le seuil, c'est de lire les identifiants et de consigner le rejet.
Deux chaînes publiées passent sous le filtre de format
Une adresse TRON incomplète et une chaîne hors alphabet base58 partent au criblage de noms : elles ne peuvent pas rencontrer une adresse. L'audit les retrouve par recherche exacte dans l'index — la parade, à défaut d'une correction à la source.
| Chaîne criblée | Détectée | Verdict | Dans l'index | Entité(s) | Pourquoi le filtre la rate |
|---|---|---|---|---|---|
| TFwjPScaJRCbSWVAywE1S1WgaU | name | NO MATCH | oui · TRX | GARANTEX EUROPE OU (OFAC/36025) | 26 caracteres : chaine TRON tronquee (34 attendus), aucune famille d'adresse du moteur ne la reconnait |
| 1h939dom7i4wdlckygbxup3fs9cstnrzgl | name | NO MATCH | oui · XBT | KHATIBI AGHADA, Ahmad (OFAC/38419); NIKAEEN RAVARI, Amir Hossein (OFAC/38420) | 34 caracteres dont un « l » minuscule : hors alphabet base58, donc non reconnue comme adresse |
Une commande, trois artefacts
cd _vpsdata python sanctions_screen.py --file cas_pratique_vasp_wallets.txt # 12 criblés, 8 avec correspondance, code 2 python build_cas_pratique_vasp.py # audit JSON/CSV + note + cette page node _test_page_cas.js # vérifie cette page contre l'audit
Le code de sortie suit la convention de grep : 0 = aucune correspondance, 2 = au moins une. Il peut servir de verrou dans un script de conformité, à condition de traiter séparément les correspondances partielles de nom.
Côté interface, le même fichier se colle dans l'onglet Sanctions de blockchain_tracer.html, puis « Export results (CSV) ». La colonne index_fingerprint doit valoir 531f8b9694d3465e1e17fea4cc2f3ac2… de part et d'autre : c'est le seul contrôle qui prouve que la page et le CLI ont criblé le même index.
Ce que ce cas n'établit pas
- Il ne date pas la décision. L'index est un relevé du 12/10/2026 13:35 UTC : il vieillit, une radiation peut être intervenue. On refait le criblage avant de geler, pas après.
- Il n'est pas exhaustif. L'Union européenne est absente (point d'accès en erreur au build) ; les listes nationales africaines ne sont pas agrégées.
- Il ne couvre pas le risque africain par les adresses. 868 entrées sont rattachées à des régimes africains, mais aucune ne comporte d'adresse publiée.
- Il n'identifie personne. Une correspondance de nom est un signal à vérifier (homonymie, translittération) ; une adresse prouve qu'une chaîne figure sur une liste, pas qui la contrôle.
- Il ne valide pas le moteur : les adresses de test montrent seulement qu'un « non trouvé » sur une chaîne inventée ne démontre rien.
Empreintes des fichiers sources
| Fichier | Octets | SHA-256 |
|---|---|---|
| OFAC_SDN | 5 727 333 | 64be7a7991059f59a2ebb43bc5dcc7e2951e1e27cbed8cbe41b0231b3a161946 |
| OFAC_ALT | 1 063 323 | ff6075fc9635c5034475fa49c0c2e0e03300e1c9375771d75f99c4d4bf799c1b |
| OFAC_ADD | 1 685 926 | 26a6030ede37402ba759ce0a8eb9dc08381099a7447ff287b29b227c7826f9a0 |
| UN_CONSOLIDATED | 2 186 496 | 0687d6d9b6c631d81a6f02579594236912dd655c8bd0e1e25628b2b9babad546 |
Empreinte de l'index (sha256 des lignes key|sha256|bytes) : 531f8b9694d3465e1e17fea4cc2f3ac2abead9d40c2f87f1e38a0b49c7a54dc5
Empreinte du fichier d'adresses servi à la page : bccea8f88dd0ab5e407836a9c3ffd528b21a237a932243f409338d4bb034173b