Cet outil veut vous aider à déclarer vos cryptos aux impôts !
Gardez en tête que la loi n'étant pas encore définie sur tous les points, cet outil peut différer de votre point de vue, c'est pour cela qu'il est en open-source : à vous de modifier (ou faire modifier) à vos besoins.
Gardez aussi en tête le fait qu'il ne supporte pas toutes les plateformes existantes, mais un guide vous est fourni pour vous aider à développer votre propre module.
Tout pull request est le bienvenu, j'essayerai de les intégrer le plus vite possible.
Enfin, le code actuel est en constante évolution, il se peut donc que la documentation ci dessous ne soit pas précise, mais elle vous fournira une bonne base pour utiliser cet outil.
Vous aurez besoin de Go dont voici la doc officelle d'installation.
$ go get -u github.com/fiscafacile/CryptoFiscaFacile
Le binaire de l'outil sera généré sur votre PC, vous pourrez le lancer en ligne de commande (donc dans un terminal) avec les Options nécessaires à vos besoins.
Pour mettre à jour, il suffit de relancer la commande :
$ go get -u github.com/fiscafacile/CryptoFiscaFacile
Cet outil a besoin de "Sources" pour établir une liste de transactions qui constituent votre protefeuille global.
Ces "Sources" peuvent être :
-
des fichiers CSV (souvent exportés depuis une plateforme ou établis manuellement)
-
des fichiers JSON (autre formalisme de données structurées)
-
des API de plateforme
Toutes les APIs utilisées par cet outil sont mis en cache dans des fichiers JSON rangés dans le répertoire Cache
créé à côté de l'exécutable. Vous pouvez donc vérifier/exporter/modifier ces informations pour rendre votre utilisation cohérente. Pensez aussi à supprimer/déplacer/renommer les fichiers de cache si vous voulez récupérer les dernières informations de la plateforme.
Chaque transaction est composée d'une Date
, d'une Note
(donnant des informations pour la comprendre), optionellement d'une liste de frais Fee
, optionellement d'une liste de sources From
et optionellement d'une liste de destinations To
.
Les Fee
, From
et To
sont des "Actifs" composés d'un Code
et d'un montant Amount
.
Tous les montants dans l'outil sont des chiffres décimaux avec précision arbitraire : aucun arrondi n'est fait dans les calculs, seulement à l'affichage à la fin pour plus de clareté.
Une fois toutes les transactions récupérées de toutes les "Sources" que vous avez fournies à l'outil, il va essayer de catégoriser ces TXs.
-
"Dépôts"
Deposits
: ce sont des TXs qui ont un ou plusieursTo
mais n'ont pas deFrom
et possiblement desFee
. -
"Retraits"
Withdrawals
: c'est l'inverse des "Dépôts". -
"Frais"
Fees
: les TXs qui n'ont que desFee
. -
"Echanges"
Exchanges
: des TXs qui ont desFrom
et desTo
, et possiblement desFee
.
Vous pourrez fournir une Source particulière pour rediriger certaines TXs dans des catégories manuelles comme des "Dons" Gifts
et autres AirDrops
.
Vous pourrez aussi activer la détection de Forks
sur certaines cryptos.
Sur certaines plateformes comme Crypto.com il existe aussi des CommercialRebates
(cashback de carte, remboursement Netflix, Pay Checkout Reward et Gift Card Reward), Interests
(intérêts du programme Earn, intérêts de "Stacking") et autres Referrals
. Certaines TXs sont directement catégorisées en CashOut
comme les paiements en crypto.
Pour les sources ETH, il y a d'autres catégories spécifiques : Burns
, Claims
, Selfs
et Swaps
.
Une fois toutes les TXs rangées dans des catégories, l'outil va essayer de rapprocher des TXs de différentes "Sources" pour synthétiser et recatégoriser au niveau du portefeuille global :
-
"Transferts"
Transfers
: par fusion d'unDeposits
avec unWithdrawals
si lesDate
etAmount
correspondent. -
CashIn
etCashOut
: ce sont respectivement desDeposits
etWithdrawals
ou desExchanges
dont l'"Actif" source ou destination sont des Fiats. -
les
Interests
sont transformés enCashIn
et leurs montant global est affiché. -
les
CommercialRebates
sont transformés enCashIn
si aucun "reversal" n'est venu les annuler et leurs montant global est affiché. -
les
Referrals
sont transformés enCashIn
et leurs montant global est affiché.
Vous pouvez utiliser le fichier de configuration config.exemple.yaml
, copiez le en config.yaml
puis mofidiez le a votre guise. Il sera utilisé pour vos options par défaut (c'est à dire que si vous spécifiez une autre valeur d'une option dans la ligne de commande, elle sera prioritaire sur les valeurs du fichier de configuration).
--help
Display all available arguments
Permet d'afficher toutes les options possibles.
--native
Native Currency for consolidation (default "EUR")
Choix de la Fiat pour consolidation. Si vous voulez déclarer aux impôts français, il faut laisser "EUR".
--location
Date Filter Location (default "Europe/Paris")
Permet de choisir le fuseau horaire pour calculer les dates. Si vous voulez déclarer aux impôts français, il faut laisser "Europe/Paris".
--date
Date Filter (default "2021-01-01T00:00:00")
Permet d'afficher votre protefeuille global valorisé en Fiat à une date donnée. Utile pour vérifier l'état du stock et estimer s'il manque des sources.
--stats
Display accounts stats
Permet d'afficher le nombre de transactions par catégorie (toutes cryptos confondues).
--check
Check and Display consistency
Lance des vérifications d'intégrité sur les TXs du portefeuille globale et affiche les TXs KO. Les vérifications sont :
-
tous les
Withdrawals
postérieurs au 1 Janvier 2019 doivent être justifiés, donc catégorisés ailleurs (CashOut
,Gifts
,...). -
tous les
Transfers
doivent avoir une balance nulle (la balance est la somme desTo
moins la somme desFrom
moins la somme desFee
). Note pour pouvoir aditioner ces montant, ils faut qu'ils soient dans la même devise, ce qui est le cas pour lesTransfers
(normalement). -
toutes les TXs doivent avoir des montants positifs. Les montants de
From
et deFee
seront consédérés négativement par l'outil mais ils doivent être enregistré positivement dans leur TX par la "Source" qui les a produites.
--txs-display
Display Transactions By Catergory : Exchanges|Deposits|Withdrawals|CashIn|CashOut|etc
--currency-filter
Currencies to be filtered in Transactions Display (comma separated list)
Affiche toutes les TXs d'une Catégorie (attention ceci peut être très long...).
Vous pouvez afficher toutes les Catégories avec --txs-display Alls
.
Vous pouvez aussi afficher que les TXs concernant certaines cryptos, par exemple pour n'afficher que le BTC et le BCH : --currency-filter BTC,BCH
.
Pour chaque Source, je vous indique le taux de support fourni par l'outil (l'exactitude de l'analyse pour cette Source). Si ce taux de support n'est pas bon, c'est sûrement parce que je n'ai pas assez d'exemples de transactions pour bien les analyser. Vous pouvez ouvrir un Ticket Github pour ajouter votre cas qui ne fontionne pas, j'essayerai de faire évoluer l'outil pour le rendre compatible.
--txs-categ
Transactions Categories CSV file
Il faut fournir un CSV à faire manuellement contenant toutes les transactions que vous voulez catégoriser manuellement (attention les champs dans le CSV doivent être séparés par des virgules, pas des points virgules comme le fait Excel en Français, le plus simple est de le faire dans un editeur de texte simple comme Notepad). Un CSV d'exemple est disponible, essayez --txs-categ Inputs/TXS_Categ_exemple.csv --btc-address Inputs/BTC_Addresses_exemple.csv
.
Ce CSV identifie une TX par son TxID
(identifiant dans la blockchain BTC, ETH, ou autre) et donne un Type
. Les différents Type
supportés sont :
-
IN : va transformer la TX en
CashIn
même si sesFrom
ne sont pas en Fiat. Utile pour simuler des plateformes qui ne proposent pas de CSV (comme DigyCode). -
OUT : va transformer la TX en
CashOut
même si sesTo
ne sont pas en Fiat. Utile pour les achats de bien ou service en crypto. Cela va transformer leTo
avec les infosValue
etCurrency
de ce CSV. -
GIFT : va catégoriser la TX en don
Gifts
. Utile si vous offrez des cryptos à un ami pour lui montrer comment cela fonctionne lors de son anniversaire. -
INT : va catégoriser la TX en intérêt
Interests
. -
AIR : va catégoriser la TX en
AirDrops
. -
FEE : va associer toutes les TXs dont les Hash sont concaténées entre eux avec un point virgule ";" et fournis dans
Description
à la TX dont le Hash est donné dansTXID
. Utile pour faire le ménage dans la catégorieFees
. -
TRANS : va associer la TX dont l'ID est fournis dans
Description
à la TX dont l'ID est donné dansTXID
. Utile pour force l'association d'un dépôt avec un retrait même si l'un des deux a des frais non dissocié du montant. Dans le cas d'un forcage deDeposits
etWithdrawals
enTransfers
avec TRANS, pour respecter la balance nulle hors frais, la différence de montant entre les deux TX initiales sera déduite du montant le plus grand et ajouté en tant queFee
dans la TX deTransfers
résultante. -
SHIT : va ignorer la TX donc aucune catégorisation. Utile si vous avez des Shitcoins dont vous ne voulez pas.
-
CUS : va retrancher une partie du montant de
From
ouTo
comme si vous en aviez la gestion mais qu'ils ne vous appartenaient pas (Custody), ils ne seront donc pas consiédérés dans votre portefeuille global. Utile si vous avez acheté des cryptos pour votre grand-père, mais attention, il devra lui aussi les déclarer.
Les colones du CSV doivent être : TxID,Type,Description,Value,Currency
Par API :
--binance-api-key
Binance API key
--binance-api-secret
Binance API secret
Par CSV :
--binance
Binance CSV file
--binance-extended
Use Binance CSV file extended format
Il faut fournir le fichier CSV récupéré dans Binance (https://www.binance.com/fr/my/wallet/history puis "Générer un relevé complet").
Vous pouvez modifier ce fichier CSV pour ajouter une colone Fee
entre Change
et Remark
, et donc reseigner la part de frais dans les Withdraw
qui ont un Remark
avec Withdraw fee is included
, cela permet de bien fusioner ce Withdrawals
avec un autre Deposits
pour en faire un Transfers
lors de l'analyse des TXs. Dans ce cas, n'oubliez pas de rajouter l'option --binance-extended
. Ces frais seront automatiquement déduits du montant du retrait, veuillez donc ne pas toucher à la valeur Change
.
Les colones du CSV d'origine doivent être : UTC_Time,Account,Operation,Coin,Change,Remark
Les colones du CSV étendu doivent être : UTC_Time,Account,Operation,Coin,Change,Fee,Remark
--bitfinex
Bitfinex CSV file
Il faut fournir le fichier CSV récupéré dans Bitfinex (https://report.bitfinex.com/ledgers puis choisissez les dates et "Export", choisissez Date Format : DD-MM-YY).
Les colones du CSV d'origine doivent être : #,DESCRIPTION,CURRENCY,AMOUNT,BALANCE,DATE,WALLET
--bitstamp
Bittrex CSV file
--bitstamp-api-key
Bittrex API key
--bitstamp-api-secret
Bittrex API secret
Il faut fournir les fichiers CSV récupérés dans Bitstamp.
Les colones du CSV d'origine doivent être : Type,Datetime,Account,Amount,Value,Rate,Fee,Sub Type
--bittrex
Bittrex CSV file
--bittrex-api-key
Bittrex API key
--bittrex-api-secret
Bittrex API secret
Il faut fournir les fichiers CSV récupérés dans Bittrex (https://global.bittrex.com/history puis "Download Order History").
Les colones du CSV d'origine doivent être : Uuid,Exchange,TimeStamp,OrderType,Limit,Quantity,QuantityRemaining,Commission,Price,PricePerUnit,IsConditional,Condition,ConditionTarget,ImmediateOrCancel,Closed,TimeInForceTypeId,TimeInForce
Il est nécessaire de fournir l'API et le CSV car chaque support a son défaut :
- l'API ne retourne pas les transactions liées à des assets délistés.
- le CSV ne comprend pas l'historique de dépot/retrait.
--btc-address
Bitcoin Address
--btc-addresses-csv
Bitcoin Addresses CSV file
--bcd
Detect Bitcoin Diamond Fork
--bch
Detect Bitcoin Cash Fork
--btg
Detect Bitcoin Gold Fork
--lbtc
Detect Lightning Bitcoin Fork
Il faut fournir :
-
soit une ou plusieurs adresses directement dans la ligne de commande :
--btc-address 36BTpmPbZaG2e5DyMpjEfDeEaiwjR8jGUM --btc-address bc1qlmsx8vtk03jwcuafe7vzvddjzg4nsfvflgs4k9
-
soit un CSV à faire manuellement contenant toutes les addresses BTC que vous possédez (attention les champs dans le CSV doivent être séparés par des virgules, pas des points virgules comme le fait Excel en Français, le plus simple est de le faire dans un editeur de texte simple comme Notepad). Un CSV d'exemple est disponible, essayez
--btc-addresses-csv Inputs/BTC_Addresses_exemple.csv
.
L'outil se chargera de récupérer la liste des transactions associées sur Blockstream (pas besoin de API Key).
Vous pouvez aussi demander la detection d'un des Fork de BTC, l'outil vous dira dans quel wallet vous avez un montant dû au Fork et intègrera ces montants à votre portefeuille global.
Les colones du CSV doivent être : Address,Description
--btg-txs
Bitcoin Gold Transactions JSON file
Expériemental.
- App avec CSV:
--cdc-app-crypto
Crypto.com App Crypto Wallet CSV file
Il faut fournir les CSV récupérés dans l'App (celui des Transactions du Portefeuille Crypto).
Les colones du CSV du portefeuille Crypto de l'APP doivent être : Timestamp (UTC),Transaction Description,Currency,Amount,To Currency,To Amount,Native Currency,Native Amount,Native Amount (in USD),Transaction Kind
- Exchange avec JS et JSON:
--cdc-ex-exportjs
Crypto.com Exchange JSON file from json_exporter.js
Il faut fournir le JSON récupéré dans l'Exchange Crypto.com avec la méthode décrite ici
Cette méthode vous permet de récupérer les Deposits
et Withdrawals
, les Interests
du Staking de CRO et Soft Staking, les CommercialRebates
du bonus d'inscription et des Syndicates, les Referrals
du programme de parainage, les Minings
des Superchargers.
- Exchange avec CSV:
--cdc-ex-spot-trade
Crypto.com Exchange Spot Trade CSV file
--cdc-ex-transfer
Crypto.com Exchange Deposit/Withdrawal CSV file
Il faut fournir les CSV récupérés dans l'Exchange Crypto.com.
Préférez la methode JS+JSON ci dessus, elle est plus complète.
Les colones du CSV de l'Exchange Spot Trade doivent être : account_type,order_id,trade_id,create_time_utc,symbol,side,liquditiy_indicator,traded_price,traded_quantity,fee,fee_currency
Les colones du CSV de l'Exchange Transfer doivent être : create_time_utc,currency,amount,fee,address,status
- Exchange avec API:
--cdc-ex-api-key
Crypto.com Exchange API Key
--cdc-ex-secret-key
Crypto.com Exchange Secret Key
Il faut donner le api-key et secret-key que vous pouvez créer dans votre compte.
Il faut activer le droit de "Withdrawal" (si disponible pour vous) si vous voulez récupérer les Withdrawals
et Deposits
(je ne l'ai pas donc je n'ai pas pu tester). Dans le cas contraire, le CSV Transfers ou le JSON permet de les mettre dans l'outil sans l'API.
Par contre les Exchanges
sur le Spot Market seront bien récupérés sans droit particulier (attention tout de même c'est assez long, on ne peut faire qu'une requête par seconde pour récupérer les Trades d'une seule journée, il faut donc de nombreuses requêtes pour remonter au jour du lancement de l'Exchange le 14 Nov 2019).
--coinbase
Coinbase CSV file
Il faut fournir le CSV récupéré sur Coinbase.
Le CSV contient une entête qui sera ignorée par l'outil.
Pour les "Transaction Type" "Send" du CSV, les frais ne sont pas renseignés, l'outil ne pourra donc pas agréger ce Withdrawals
avec le Deposits
d'une autre Source. Vous pouvez l'y aider en retrouvant le Depostis
correspondant à la main et calculant les frais (la différence entre les deux montants) puis en le rajoutant dans la colone EUR Fees
de ce CSV.
Les colones du CSV doivent être : Timestamp,Transaction Type,Asset,Quantity Transacted,EUR Spot Price at Transaction,EUR Subtotal,EUR Total (inclusive of fees),EUR Fees,Notes
--coinbase-pro-account
Coinbase Pro Account CSV file
--coinbase-pro-fills
Coinbase Pro Fills CSV file
Il faut fournir les CSV récupérés sur Coinbase.
Les colones du CSV Account doivent être : portfolio,type,time,amount,balance,amount/balance unit,transfer id,trade id,order id
Les colones du CSV Fills doivent être : portfolio,trade id,product,side,created at,size,size unit,price,fee,total,price/fee/total unit
--eth-address
Ethereum Address
--eth-addresses-csv
Ethereum Addresses CSV file
Il faut fournir :
-
soit une ou plusieurs adresses directement dans la ligne de commande :
--eth-address 0x9302F624d2C35fe880BFce22A36917b5dB5FAFeD --eth-address 0x9302F624d2C35fe880BFce22A36917b5dB5FAFeD
-
soit un CSV à faire manuellement contenant toutes les addresses ETH que vous possédez (attention les champs dans le CSV doivent être séparés par des virgules, pas des points virgules comme le fait Excel en Français, le plus simple est de le faire dans un editeur de texte simple comme Notepad). Un CSV d'exemple est disponible, essayez
--eth-addresses-csv Inputs/ETH_Addresses_exemple.csv
.
L'outil se chargera de récupérer la liste des transactions associées sur Etherscan.io (à une vitesse limitée de 5 requêtes par secondes si vous ne fournissez pas une API Key).
Il détectera aussi les Token ERC20 et ERC721 (NFT) associés.
Les colones du CSV doivent être : Address,Description
- Via API
--hitbtc-api-key
HitBTC API Key
--hitbtc-secret-key
HitBTC Secret Key
L'API est utilisée pour récupérer les transactions du compte Deposits
et Withdrawals
afin de les ajouter à votre portefeuille global.
La clé API doit avoir les droits :
-
Payment information
pour lesDeposits
etWithdrawals
(équivalent du CSV Transactions). -
Orderbook, History, Trading balance
pour lesExchanges
(équivalent du CSV Trades). -
Via CSV
--hitbtc-trades
HitBTC Trades CSV file
--hitbtc-transactions
HitBTC Transactions CSV file
Il faut fournir les fichiers CSV récupérés dans HitBTC (https://hitbtc.com/reports).
Le CSV Transactions ne fournit pas les infos de Fee
, il vaut donc mieux utiliser l'API.
Les colones du CSV Trades doivent être : Email,Date (UTC),Instrument,Trade ID,Order ID,Side,Quantity,Price,Volume,Fee,Rebate,Total,Taker
Les colones du CSV Transactions doivent être : Email,Date (UTC),Operation id,Type,Amount,Transaction hash,Main account balance,Currency
- Via API
--kraken-api-key
Kraken API key
--kraken-api-secret
Kraken API secret
L'API est utilisée pour récupérer l'ensemble des transactions du ledger afin de les ajouter à votre portefeuille global.
- Via CSV
--kraken
Kraken CSV file
Il faut fournir le fichier CSV récupéré dans Kraken (https://www.kraken.com/u/history/export puis sélectionner "Ledgers" et "All fields").
Les colones du CSV d'origine doivent être : txid,refid,time,type,subtype,aclass,asset,amount,fee,balance
--lb-trade
Local Bitcoin Trade CSV file
--lb-transfer
Local Bitcoin Transfer CSV file
Les colones du CSV de Trade doivent être : id,created_at,buyer,seller,trade_type,btc_amount,btc_traded,fee_btc,btc_amount_less_fee,btc_final,fiat_amount,fiat_fee,fiat_per_btc,currency,exchange_rate,transaction_released_at,online_provider,reference
Les colones du CSV de Transfer doivent être : TXID, Created, Received, Sent, TXtype, TXdesc, TXNotes
--ledgerlive
LedgerLive CSV file
Les colones du CSV doivent être : Operation Date,Currency Ticker,Operation Type,Operation Amount,Operation Fees,Operation Hash,Account Name,Account xpub
--monero
Monero Wallet CSV file
Les colones du CSV doivent être : blockHeight,epoch,date,direction,amount,atomicAmount,fee,txid,label,subaddrAccount,paymentId
Vous devriez exporter les clés publiques de votre wallet et utiliser la "Source" BTC.
--mycelium
MyCelium CSV file
Les colones du CSV doivent être : Account,Transaction ID,Destination Address,Timestamp,Value,Currency,Transaction Label
--poloniex-trades
Poloniex Trades CSV file
--poloniex-deposits
Poloniex Deposits CSV file
--poloniex-withdrawals
Poloniex Withdrawals CSV file
--poloniex-distributions
Poloniex Distributions CSV file
Les colones du CSV de Trades doivent être : Date,Market,Category,Type,Price,Amount,Total,Fee,Order Number,Base Total Less Fee,Quote Total Less Fee,Fee Currency,Fee Total
Les colones du CSV de Deposits doivent être : Date,Currency,Amount,Address,Status
Les colones du CSV de Withdrawals doivent être : Date,Currency,Amount,Fee Deducted,Amount - Fee,Address,Status
Les colones du CSV de Distributions doivent être : date,currency,amount,wallet
--revolut
Revolut CSV file
Les colones du CSV doivent être : Completed Date,Description,Paid Out (BTC),Paid In (BTC),Exchange Out, Exchange In, Balance (BTC), Category, Notes
--uphold
Uphold CSV file
Les colones du CSV doivent être : Date,Destination,Destination Amount,Destination Currency,Fee Amount,Fee Currency,Id,Origin,Origin Amount,Origin Currency,Status,Type
Cet outil utilise plusieurs APIs de plateformes pour récupérer soit des taux de changes (CoinGecko, CoinLayer et CoinAPI), soit des transactions sur une blockchain particulière (Blockstream pour BTC et Etherscan pour ETH). Certaines de ces APIs ont besoins d'une clé.
--coinapi-key
CoinAPI Key (https://www.coinapi.io/pricing?apikey)
--coinlayer-key
CoinLayer Key (https://coinlayer.com/product)
--etherscan-apikey
Etherscan API Key (https://etherscan.io/myapikey)
Utilisé pour la Source ETH, si vous ne la fournissez pas les requêtes seront limitées à 5 par secondes.
--2086-display
Display Cerfa 2086
--2086
Export Cerfa 2086 in 2086.xlsx
--cashin-bnc-2019
Convert AirDrops/CommercialRebates/Interests/Minings/Referrals into CashIn for 2019's Txs in 2086
--cashin-bnc-2020
Convert AirDrops/CommercialRebates/Interests/Minings/Referrals into CashIn for 2020's Txs in 2086
Cela vous génère automatiquement le formulaire 2086 !
Il y a deux façons de considérer les AirDrops/CommercialRebates/Interests/Minings/Referrals :
-
soit ils sont ajoutés simplement au portefeuille avec une valeur de 0€
-
soit ils sont ajoutés au portefeuille avec leur valeur du jour en EUR (donc convertis en CashIn), ce qui va accroitre votre Prix Total d'Acquisition et faire baisser votre Plus-Value, mais en contrepartie, il convient de les déclarer en revenus non commerciaux non professionnels (régime déclaratif spécial ou micro BNC) dans la case 5KU/5LU/5MU de votre 2042-C-PRO.
Pour activer la seconde méthode d'intégration, vous pouvez utiliser les options --cashin-bnc-2019
et/ou --cashin-bnc-2020
.
En attendant que la loi soit plus claire à ce sujet, nous vous laissons le choix. Vous pouvez venir demander de l'aide à ce sujet sur le groupe .
--3916
Export Cerfa 3916 in 3916.xlsx
Cela vous génère automatiquement le formulaire 3916 !
--stock
Export stock balances in stock.xlsx
Cela vous génère automatiquement une fiche de stock de tous vos coins !
Si vous voulez faire un don à l'outil (pas à moi), cela permettra d'acheter un nom de domaine et payer un hébergement par exemple :
Si vous avec un problème d'utilisation ou pour le développement d'un module, et que cette doc ne vous apporte pas de réponse, venez me la poser dans le groupe officiel de support sur Telegram
Merci au groupe qui est une mine d'or d'informations pour essayer de comprendre comment cela fonctionne.
Copyright (c) 2021-present FiscaFacile.
Released under the terms of the MIT license. See LICENSE for details.