CrypCool
Récapitulatif fiscal — Revenus 2025
Simulation du ${dateStr}${recipientName ? " · " + recipientName : ""}
Option retenue
✦ ${optLabel}
Impôt total estimé
${fmt2(r.opt)}
Taux effectif
${pct(r.txEff)}
① Données de la simulation
Prix brut des cessions 2025 (avant frais)${fmt2(cession)}
Frais d'exchanges et plateformes (sur les ventes)− ${fmt2(fraisCession)}
Prix net des cessions (base PAMP)${fmt2(cessionNette)}
Montant total investi dans le portefeuille (frais achat inclus)${fmt2(acqTotal)}
Valeur du portefeuille avant cession${fmt2(vPort)}
Moins-values fiscales reportées− ${fmt2(d.moinsValues || 0)}
Revenu net imposable du foyer (hors crypto)${fmt2(rni)}
Quotient familial (nombre de parts)${d.parts} part${d.parts > 1 ? "s" : ""}
② Calcul de la plus-value — Méthode PAMP (Art. 150 VH bis CGI)
Principe
La DGFiP impose d'utiliser la méthode du Prix d'Acquisition Moyen Pondéré (PAMP),
aussi appelée méthode du « portefeuille global ». Contrairement à la méthode FIFO ou à une approche
crypto par crypto, on calcule quelle fraction du coût total d'acquisition correspond à la portion du
portefeuille vendue. Cela évite d'optimiser en choisissant quels actifs ont été vendus.
Déductibilité des frais (BOI-RPPM-PVBMI-70-10-20 §130) : les frais prélevés par les exchanges et plateformes
sur les cessions sont déductibles du prix de cession net servant de base au calcul de la plus-value.
Les frais d'acquisition (à l'achat) doivent être intégrés dans le montant total investi, ce qui majore le coût de revient et réduit mécaniquement la plus-value.
Formule officielle
Prix net de cession = Prix brut − Frais de cession
Coût d'acquisition cédé = Montant investi × (Prix net cession ÷ Valeur portefeuille)
Plus-value = Prix net cession − Coût d'acquisition cédé
Application à votre situation
${fraisCession > 0 ? `
Déduction des frais de cession
${fmt2(cession)} − ${fmt2(fraisCession)} = ${fmt2(cessionNette)}
` : ""}
Ratio de cession (fraction du portefeuille vendue)
${fmt2(cessionNette)} ÷ ${fmt2(vPort)} = ${(ratio * 100).toFixed(4)} %
Coût d'acquisition cédé
${fmt2(acqTotal)} × ${(ratio * 100).toFixed(4)} % = ${fmt2(coutCede)}
Plus-value brute
${fmt2(cessionNette)} − ${fmt2(coutCede)} = ${fmt2(r.pvBrute)}
${+d.moinsValues > 0 ? `
Imputation des moins-values
${fmt2(r.pvBrute)} − ${fmt2(d.moinsValues)} = ${fmt2(r.pvNette)}
` : ""}
➤ Plus-value nette imposable
${fmt2(r.pvImp)}
③ Régime 1 — Flat Tax (Prélèvement Forfaitaire Unique)
Le PFU taxe les plus-values à un taux fixe de 30 %, quelle que soit votre tranche marginale d'imposition.
Il se décompose en deux composantes indépendantes : l'IR forfaitaire et les prélèvements sociaux.
Ce taux s'applique aux revenus 2025 déclarés en 2026 (la hausse des PS à 18,6 % via le PLFSS 2026
ne concerne que les revenus 2026, déclaration 2027).
Flat Tax = Plus-value × 30 %
dont IR forfaitaire (12,8 %) : ${fmt2(r.pvImp)} × 12,8 % = ${fmt2(r.flatIR)}
dont Prél. sociaux (17,2 %) : ${fmt2(r.pvImp)} × 17,2 % = ${fmt2(r.flatPS)}
Total Flat Tax : ${fmt2(r.flatIR)} + ${fmt2(r.flatPS)} = ${fmt2(r.flatTotal)}
④ Régime 2 — Barème progressif de l'IR
Au barème progressif, la plus-value s'ajoute à votre revenu net imposable et est taxée par tranches.
Pour neutraliser l'effet du quotient familial, on compare l'IR avec et sans la plus-value.
Les prélèvements sociaux (17,2 %) restent dus en plus, quel que soit le régime choisi.
Barème 2026 (revenus 2025 — revalorisation +0,9 %)
| Tranche (par part) |
Taux |
Impôt généré par la plus-value |
${baremRows || `| Aucune tranche applicable |
`}
Quotient familial hors crypto : ${fmt2(rni)} ÷ ${d.parts} = ${fmt2(rni / parts)} / part
Quotient familial avec crypto : (${fmt2(rni)} + ${fmt2(r.pvImp)}) ÷ ${d.parts} = ${fmt2((rni + r.pvImp) / parts)} / part
IR généré par la plus-value : ${fmt2(r.irSurPV)}
Prél. sociaux 17,2 % : ${fmt2(r.pvImp)} × 17,2 % = ${fmt2(r.baremPS)}
Total barème : ${fmt2(r.irSurPV)} + ${fmt2(r.baremPS)} = ${fmt2(r.baremTotal)}
⑤ Comparaison et recommandation
Flat Tax 30 %${r.best === "flat" ? '✦ Optimal' : ''}
${fmt2(r.flatTotal)}
IR forfaitaire 12,8 % : ${fmt2(r.flatIR)}
Prél. sociaux 17,2 % : ${fmt2(r.flatPS)}
Barème progressif${r.best === "bareme" ? '✦ Optimal' : ''}
${fmt2(r.baremTotal)}
TMI applicable : ${pct(r.tmi)}
IR progressif sur PV : ${fmt2(r.irSurPV)}
Prél. sociaux 17,2 % : ${fmt2(r.baremPS)}
✦ Option recommandée
${optLabel}
Économie de ${fmt2(r.eco)} vs l'autre option
Impôt total dû
${fmt2(r.opt)}
Taux effectif sur la plus-value : ${pct(r.txEff)}
💡 Pourquoi ce choix ?
${r.best === "flat" ? `Votre tranche marginale d'imposition (TMI) est de ${pct(r.tmi)}. En optant pour le barème progressif,
l'IR sur la plus-value serait de ${pct(r.tmi)} (vs 12,8 % en flat tax), soit ${fmt2(r.irSurPV)} contre
${fmt2(r.flatIR)} au PFU. La flat tax est donc plus économique de ${fmt2(r.eco)}.
Attention : si votre TMI descend en dessous de 12,8 % à l'avenir (ex. retraite), le barème pourrait redevenir avantageux.` : `Votre tranche marginale d'imposition (TMI) est de ${pct(r.tmi)}, inférieure aux 12,8 % de l'IR forfaitaire.
En optant pour le barème progressif, l'IR sur votre plus-value est de ${fmt2(r.irSurPV)} contre ${fmt2(r.flatIR)}
au PFU — une économie de ${fmt2(r.eco)}. Important : l'option barème s'applique à l'ensemble de vos revenus
du capital mobilier (dividendes, intérêts…) — vérifiez que cela reste avantageux globalement.`}
⑥ Prochaines étapes — Déclaration 2026
1
Rassemblez vos justificatifs — Exportez l'historique de toutes vos transactions depuis vos exchanges
(Binance, Coinbase, Kraken, etc.) et wallets. Conservez les preuves d'achat avec les dates et montants en euros.
2
Remplissez le formulaire 2086 — Ce formulaire obligatoire déclare vos cessions d'actifs numériques.
Il est disponible en ligne sur impots.gouv.fr et dans votre espace fiscal personnel.
3
Formulaire 3916-bis si nécessaire — Vous détenez des comptes sur des plateformes étrangères
(non-françaises) ? Ce formulaire est obligatoire même si le solde est nul au 31/12.
${r.best === "bareme" ? `
4
Cochez l'option barème progressif — Lors de votre déclaration en ligne, cochez explicitement
la case « Option pour l'imposition au barème progressif ». Ce choix est irrévocable pour l'année.
` : ""}
${r.best === "bareme" ? "5" : "4"}
Faites valider par un expert CrypCool — Cette simulation est indicative.
Un conseiller CrypCool peut vérifier vos calculs, identifier des optimisations supplémentaires
et vous accompagner dans le remplissage des formulaires.
Document indicatif à titre informatif uniquement. Ne constitue pas un conseil fiscal ou juridique.
Ne prend pas en compte la CEHR (contribution exceptionnelle hauts revenus), les crédits d'impôt, le staking/minage
professionnel (BNC/BIC), ni les situations de non-résidence. Consultez un conseiller fiscal qualifié
pour une analyse personnalisée.
`;
}
/* ─── EXPORT PDF (window.print) ─────────────────────────────────────── */
function exportPDF(d, r, recipientName) {
const html = buildPDFHtml(d, r, recipientName);
const w = window.open("", "_blank");
if (w) {
w.document.write(html);
w.document.close();
w.onload = () => w.print();
}
}
/* ─── SEND EMAIL VIA ANTHROPIC API ──────────────────────────────────── */
/* ─── EMAIL TEMPLATE (100 % client-side — aucune donnée ne quitte le navigateur)
Génération d'un email HTML statique à partir des variables de simulation.
Pour l'envoi réel : transmettez emailSubject + emailHtml à votre backend
(SendGrid / Brevo / Mailjet) via un appel API sécurisé côté serveur.
──────────────────────────────────────────────────────────────────────── */
function buildEmailHtml(d, r, recipientEmail, recipientName) {
const f = n => new Intl.NumberFormat("fr-FR", {
style: "currency",
currency: "EUR",
maximumFractionDigits: 0
}).format(n || 0);
const p = n => `${(n * 100).toFixed(1).replace(".", ",")} %`;
const dateStr = new Date().toLocaleDateString("fr-FR", {
day: "2-digit",
month: "long",
year: "numeric"
});
const optLabel = r.best === "flat" ? "Flat Tax 30 %" : "Barème progressif";
const optColor = r.best === "flat" ? "#FF9900" : "#18A999";
const optImpot = f(r.opt);
const econom = f(r.eco);
const pvImp = f(r.pvImp);
const txEff = p(r.txEff);
const prenom = recipientName ? recipientName.split(" ")[0] : "";
const salutation = prenom ? `Bonjour ${prenom},` : "Bonjour,";
const row = (label, val, highlight = false) => `