Aller au contenu principal

Modèles et exemples de cryptomonnaies

Modèles Beancount pratiques et exemples concrets pour les scénarios courants de cryptomonnaies, y compris le trading, le minage, le staking, les airdrops et les activités DeFi.

Ce guide fournit des modèles Beancount pratiques et des exemples concrets pour les scénarios courants de cryptomonnaies. Copiez et adaptez ces modèles pour vos propres besoins de comptabilité des cryptomonnaies.

Comment lire ces blocs

Chaque bloc ci-dessous est l'une de trois choses, et ils ne sont pas interchangeables :

  • Modèles contiennent des espaces réservés [ENTRE CROCHETS] et des dates AAAA-MM-JJ. Ils ne se chargeront pas tant que vous n'aurez pas remplacé les valeurs réelles — les crochets ne sont pas la syntaxe de Beancount.
  • Exemples se trouvent directement sous leur modèle, portent des dates et des montants réels, et sont écrits pour se charger. Chacun nécessite encore que les comptes qu'il touche soient ouverts, ce que fournit le Modèle de structure de comptes ci-dessous. La seule exception est le bloc de rapprochement, qui affirme des soldes que seul votre propre grand livre peut satisfaire.
  • Arbitrage de prêt flash est pseudocode, et est étiqueté comme tel là où il apparaît.

Deux conventions s'appliquent à tous :

  • Les comptes de revenus contiennent des crédits, donc ils sont négatifs. Un gain réalisé est une écriture négative sur Income:CapitalGains:… ; une perte réalisée est une écriture positive sur Expenses:CapitalLoss:…. Se tromper dans ce sens est l'erreur la plus courante qui fait échouer l'équilibrage d'une écriture de cryptomonnaie.
  • Des frais sont enregistrés une fois comme dépense et une fois comme réduction d'espèces. Le produit brut va au compte d'espèces, les frais en ressortent, et la différence est ce qui arrive réellement sur votre compte.

Explorez un exemple de grand livre de cryptomonnaies en direct :

Ouvrir Exemple de grand livre de cryptomonnaies dans un nouvel onglet

Modèle de configuration de base

Modèle de structure de comptes

; =============================================================================
; CRYPTOCURRENCY ACCOUNT SETUP TEMPLATE
; =============================================================================
 
; Bank Accounts
1970-01-01 open Assets:Checking
 
; Exchange Accounts
1970-01-01 open Assets:Crypto:Coinbase:USD
1970-01-01 open Assets:Crypto:Coinbase:BTC
1970-01-01 open Assets:Crypto:Coinbase:ETH
1970-01-01 open Assets:Crypto:Binance:USD
1970-01-01 open Assets:Crypto:Binance:BTC
1970-01-01 open Assets:Crypto:Binance:ETH
1970-01-01 open Assets:Crypto:Binance:BNB
1970-01-01 open Assets:Crypto:Binance:ADA
 
; On-Chain and Mining Accounts
1970-01-01 open Assets:Crypto:Ethereum:ETH
1970-01-01 open Assets:Crypto:Polygon:ETH
1970-01-01 open Assets:Crypto:Mining:BTC
 
; Wallet Accounts
1970-01-01 open Assets:Crypto:Wallet:Ledger:BTC
1970-01-01 open Assets:Crypto:Wallet:Ledger:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:USDC
1970-01-01 open Assets:Crypto:Wallet:MetaMask:UNI
 
; DeFi Protocol Accounts
1970-01-01 open Assets:DeFi:Uniswap:ETH-USDC-LP
1970-01-01 open Assets:DeFi:Compound:CUSDC
1970-01-01 open Assets:Staking:Ethereum:ETH
 
; Income Accounts
1970-01-01 open Income:Crypto:Staking:ETH
1970-01-01 open Income:Crypto:Mining:BTC
1970-01-01 open Income:Crypto:Airdrops
1970-01-01 open Income:Crypto:DeFi:Yield
1970-01-01 open Income:CapitalGains:Crypto
1970-01-01 open Income:CapitalGains:LongTerm
 
; Expense Accounts
1970-01-01 open Expenses:Crypto:Fees:Trading
1970-01-01 open Expenses:Crypto:Fees:Network
1970-01-01 open Expenses:Crypto:Fees:Withdrawal
1970-01-01 open Expenses:Crypto:Bridge:Fees
1970-01-01 open Expenses:Crypto:Mining:Electricity
1970-01-01 open Expenses:CapitalLoss:Crypto
 
; Commodity Definitions
1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
 
1970-01-01 commodity USDC
  name: "USD Coin"
  asset-class: "stablecoin"
 
; Compound writes this receipt token "cUSDC", but a Beancount commodity
; and every account component must start with a capital letter or a digit,
; so the ledger spells it CUSDC and keeps the display name in metadata.
1970-01-01 commodity CUSDC
  name: "cUSDC (Compound USD Coin)"
  asset-class: "defi-receipt"

Modèles de trading

Achat de cryptomonnaie de base

; Template: Buy cryptocurrency on exchange
YYYY-MM-DD * "Buy [AMOUNT] [CRYPTO] on [EXCHANGE]"
  Assets:Crypto:[EXCHANGE]:[CRYPTO]     [AMOUNT] [CRYPTO] {[PRICE] USD}
  Assets:Crypto:[EXCHANGE]:USD         -[TOTAL_COST] USD
  Expenses:Crypto:Fees:Trading          [FEE] USD
  Assets:Crypto:[EXCHANGE]:USD         -[FEE] USD
 
; Example: Buy 1 BTC on Coinbase
2024-01-15 * "Buy 1 BTC on Coinbase"
  Assets:Crypto:Coinbase:BTC      1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD  -45000.00 USD
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD

Vente de cryptomonnaie

; Template: Sell cryptocurrency on exchange
YYYY-MM-DD * "Sell [AMOUNT] [CRYPTO] on [EXCHANGE]"
  Assets:Crypto:[EXCHANGE]:[CRYPTO]    -[AMOUNT] [CRYPTO] {[COST_BASIS] USD} @ [SALE_PRICE] USD
  Assets:Crypto:[EXCHANGE]:USD          [GROSS_PROCEEDS] USD
  Expenses:Crypto:Fees:Trading          [FEE] USD
  Assets:Crypto:[EXCHANGE]:USD         -[FEE] USD
  Income:CapitalGains:Crypto           -[GAIN] USD  ; a loss is a positive Expenses:CapitalLoss:Crypto instead
 
; Example: Sell 0.5 BTC with a gain
2024-03-20 * "Sell 0.5 BTC on Coinbase"
  Assets:Crypto:Coinbase:BTC     -0.5 BTC {45000.00 USD} @ 48000.00 USD
  Assets:Crypto:Coinbase:USD   24000.00 USD  ; gross proceeds, 0.5 * 48,000.00
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD  ; the fee leaves the same cash account
  Income:CapitalGains:Crypto   -1500.00 USD  ; 24,000.00 proceeds - 22,500.00 basis

Le lot cédé vaut 22 500,00 $ au coût, la vente rapporte 24 000,00 $ brut, et 30,00 $ de ce montant vont à la plateforme — donc 23 970,00 $ d'espèces arrivent et 1 500,00 $ de gain sont réalisés. Ne compensez pas les frais dans le gain : les frais sont déjà une dépense, et les soustraire une deuxième fois est ce qui rend la transaction déséquilibrée.

Échange de cryptomonnaie à cryptomonnaie

; Template: Trade one crypto for another
YYYY-MM-DD * "Trade [AMOUNT1] [CRYPTO1] for [AMOUNT2] [CRYPTO2]"
  Assets:Crypto:[EXCHANGE]:[CRYPTO1]   -[AMOUNT1] [CRYPTO1] {[COST_BASIS] USD}
  Assets:Crypto:[EXCHANGE]:[CRYPTO2]    [AMOUNT2] [CRYPTO2] {[NEW_PRICE] USD}
  Income:CapitalGains:Crypto           -[GAIN] USD  ; taxable event; a loss is a positive Expenses:CapitalLoss:Crypto
  Expenses:Crypto:Fees:Trading          [FEE] USD
  Assets:Crypto:[EXCHANGE]:USD         -[FEE] USD
 
; Example: Trade BTC for ETH
2024-02-10 * "Trade 1 BTC for 20 ETH on Binance"
  Assets:Crypto:Binance:BTC     -1.0 BTC {46000.00 USD}
  Assets:Crypto:Binance:ETH      20 ETH {2400.00 USD}
  Income:CapitalGains:Crypto  -2000.00 USD  ; 48,000.00 received - 46,000.00 basis
  Expenses:Crypto:Fees:Trading    40.00 USD
  Assets:Crypto:Binance:USD      -40.00 USD

Un échange de cryptomonnaie à cryptomonnaie cède la première commodité, donc il réalise un gain exactement comme une vente contre espèces : 20 ETH acquis à 2 400,00 $ représentent 48 000,00 $ de valeur reçue contre 46 000,00 $ de base BTC. Les 40,00 $ de frais sont payés en espèces et ne modifient pas le gain.

Modèles de transfert

Transfert de plateforme vers portefeuille

; Template: Transfer crypto from exchange to wallet
YYYY-MM-DD * "Transfer [AMOUNT] [CRYPTO] from [EXCHANGE] to [WALLET]"
  Assets:Crypto:[EXCHANGE]:[CRYPTO]      -[AMOUNT] [CRYPTO] {[COST_BASIS] USD}
  Assets:Crypto:Wallet:[WALLET]:[CRYPTO]  [AMOUNT] [CRYPTO] {[COST_BASIS] USD}
  Expenses:Crypto:Fees:Withdrawal         [FEE] [CRYPTO] {[COST_BASIS] USD}
  Assets:Crypto:[EXCHANGE]:[CRYPTO]      -[FEE] [CRYPTO] {[COST_BASIS] USD}
 
; Example: Transfer BTC to Ledger
2024-01-20 * "Transfer 1 BTC from Coinbase to Ledger"
  Assets:Crypto:Coinbase:BTC      -1.0 BTC {45000.00 USD}
  Assets:Crypto:Wallet:Ledger:BTC  1.0 BTC {45000.00 USD}
  Expenses:Crypto:Fees:Withdrawal  0.0005 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:BTC      -0.0005 BTC {45000.00 USD}

Un transfert n'est pas une cession, donc il ne réalise rien : le même coût de {45000.00 USD} voyage avec les pièces et le compte destinataire hérite de la base. Deux conséquences en découlent. Les frais de retrait sont payés en BTC et sont dépensés à ce même coût, donc ils ne réalisent aucun gain non plus — si votre traitement dit le contraire, évaluez les frais avec @ et ajoutez une écriture de gain. Et le compte expéditeur doit déjà détenir 1.0005 BTC à ce coût exact, pas 1,0, car les frais proviennent du même lot. Une réduction sans lot correspondant échoue à l'enregistrement, peu importe la qualité des totaux.

Transfert entre plateformes

; Template: Transfer between exchanges
YYYY-MM-DD * "Transfer [AMOUNT] [CRYPTO] from [EXCHANGE1] to [EXCHANGE2]"
  Assets:Crypto:[EXCHANGE1]:[CRYPTO]  -[AMOUNT] [CRYPTO] {[COST_BASIS] USD}
  Assets:Crypto:[EXCHANGE2]:[CRYPTO]   [AMOUNT] [CRYPTO] {[COST_BASIS] USD}
  Expenses:Crypto:Fees:Network         [FEE] [CRYPTO] {[COST_BASIS] USD}
  Assets:Crypto:[EXCHANGE1]:[CRYPTO]  -[FEE] [CRYPTO] {[COST_BASIS] USD}
 
; Example: Transfer ETH from Coinbase to Binance
2024-02-05 * "Transfer 10 ETH from Coinbase to Binance"
  Assets:Crypto:Coinbase:ETH   -10 ETH {2500.00 USD}
  Assets:Crypto:Binance:ETH     10 ETH {2500.00 USD}
  Expenses:Crypto:Fees:Network  0.01 ETH {2500.00 USD}
  Assets:Crypto:Coinbase:ETH   -0.01 ETH {2500.00 USD}

Modèles de staking

Staking Ethereum

; Template: Stake ETH
YYYY-MM-DD * "Stake [AMOUNT] ETH"
  Assets:Crypto:Wallet:MetaMask:ETH    -[AMOUNT] ETH {[PRICE] USD}
  Assets:Staking:Ethereum:ETH           [AMOUNT] ETH {[PRICE] USD}
  Expenses:Crypto:Fees:Network          [FEE] ETH {[PRICE] USD}
  Assets:Crypto:Wallet:MetaMask:ETH    -[FEE] ETH {[PRICE] USD}
 
; Example: Stake 32 ETH
2024-01-10 * "Stake 32 ETH on Ethereum 2.0"
  Assets:Crypto:Wallet:MetaMask:ETH    -32 ETH {2500.00 USD}
  Assets:Staking:Ethereum:ETH           32 ETH {2500.00 USD}
  Expenses:Crypto:Fees:Network          0.01 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:ETH    -0.01 ETH {2500.00 USD}

Récompenses de staking

; Template: Receive staking rewards
YYYY-MM-DD * "[CRYPTO] Staking Rewards - [PERIOD]"
  Assets:Staking:[PROTOCOL]:[CRYPTO]    [AMOUNT] [CRYPTO] {[PRICE] USD}
  Income:Crypto:Staking:[CRYPTO]       -[VALUE] USD  ; [VALUE] = [AMOUNT] * [PRICE]
 
; Example: ETH staking rewards
2024-02-01 * "ETH Staking Rewards - January"
  Assets:Staking:Ethereum:ETH     0.08 ETH {2600.00 USD}
  Income:Crypto:Staking:ETH     -208.00 USD  ; 0.08 * 2,600.00

Une récompense est un revenu reçu en nature, donc les deux écritures décrivent le même événement des deux côtés : 0,08 ETH arrivent avec une base de 2 600,00 $ par unité, et les 208,00 $ correspondants de revenu sont un crédit — négatif. Le {2,600.00 USD} est un prix externe que vous devez trouver vous-même ; Beancount l'enregistre, il ne le récupère pas. Notez-le depuis la plateforme ou l'indice que vous utilisez réellement, et gardez la même source tout au long de l'année.

Ces 208,00 $ sont aussi la base de coût de la récompense à partir de maintenant. Lorsque vous vendez éventuellement les 0,08 ETH, seul le mouvement depuis cette date est un gain — les 208,00 $ ont déjà été imposés comme revenu et ne doivent pas être reconnus deux fois. Que le revenu soit imposable à la réception ou à la cession dépend de la juridiction ; le grand livre enregistre les faits dans les deux cas.

Modèles DeFi

Fourniture de liquidités Uniswap

; Template: Add liquidity to Uniswap pool
YYYY-MM-DD * "Add liquidity to [TOKEN1]-[TOKEN2] pool"
  Assets:Crypto:Wallet:MetaMask:[TOKEN1]    -[AMOUNT1] [TOKEN1] {[PRICE1] USD}
  Assets:Crypto:Wallet:MetaMask:[TOKEN2]    -[AMOUNT2] [TOKEN2] {[PRICE2] USD}
  Assets:DeFi:Uniswap:[TOKEN1]-[TOKEN2]-LP   [LP_AMOUNT] [LP_TOKEN] {[LP_PRICE] USD}
  Expenses:Crypto:Fees:Network               [FEE] ETH {[ETH_PRICE] USD}
  Assets:Crypto:Wallet:MetaMask:ETH         -[FEE] ETH {[ETH_PRICE] USD}
 
; Example: Add ETH-USDC liquidity
2024-01-15 * "Add liquidity to ETH-USDC pool"
  Assets:Crypto:Wallet:MetaMask:ETH     -10 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:USDC  -25000 USDC @ 1.00 USD
  Assets:DeFi:Uniswap:ETH-USDC-LP        100 UNI-V3-ETH-USDC {500.00 USD}
  Expenses:Crypto:Fees:Network          0.02 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:ETH    -0.02 ETH {2500.00 USD}

Rapprochez cette commodité une à la fois : 25 000,00 $ d'ETH plus 25 000,00 $ d'USDC sortent, 50 000,00 $ de jetons LP arrivent, et les frais de gaz déplacent 50,00 $ d'ETH du portefeuille vers une dépense. La partie en stablecoin porte @ 1.00 USD car elle est détenue sans base de coût — sans l'annotation de prix, son poids est de 25 000 USDC, ce qui ne peut pas annuler des dollars. Dans de nombreuses juridictions, déposer dans une pool est en soi une cession des deux jetons ; cette écriture porte délibérément la base de l'autre côté, donc ajoutez les écritures de gain si votre traitement l'exige.

Prêt Compound

; Template: Supply assets to Compound
YYYY-MM-DD * "Supply [AMOUNT] [TOKEN] to Compound"
  Assets:Crypto:Wallet:MetaMask:[TOKEN]  -[AMOUNT] [TOKEN] @ [TOKEN_PRICE] USD
  Assets:DeFi:Compound:C[TOKEN]           [C_AMOUNT] C[TOKEN] {[C_PRICE] USD}
  Expenses:Crypto:Fees:Network            [FEE] ETH {[ETH_PRICE] USD}
  Assets:Crypto:Wallet:MetaMask:ETH      -[FEE] ETH {[ETH_PRICE] USD}
 
; Example: Supply USDC to Compound
2024-01-20 * "Supply 10000 USDC to Compound"
  Assets:Crypto:Wallet:MetaMask:USDC  -10000 USDC @ 1.00 USD
  Assets:DeFi:Compound:CUSDC             500 CUSDC {20.00 USD}
  Expenses:Crypto:Fees:Network          0.008 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:ETH    -0.008 ETH {2500.00 USD}

Deux choses rendent ce montant particulier. La partie en USDC porte @ 1.00 USD pour que les deux côtés de l'échange pèsent dans la même devise — sans cela, Beancount voit 10 000,00 $ de CUSDC apparaître contre 10 000 unités d'USDC disparaître, qui sont des commodités différentes et ne s'annulent pas. Et le jeton de réception est CUSDC, pas cUSDC : une première lettre minuscule est une erreur de lexer à la fois dans un composant de compte et dans un symbole de commodité, cependant le protocole l'épelle ainsi dans son interface.

Modèles de minage

Récompenses de minage

; Template: Receive mining rewards
YYYY-MM-DD * "[CRYPTO] Mining Reward - [POOL/SOLO]"
  Assets:Crypto:Mining:[CRYPTO]     [AMOUNT] [CRYPTO] {[PRICE] USD}
  Income:Crypto:Mining:[CRYPTO]    -[VALUE] USD  ; [VALUE] = [AMOUNT] * [PRICE]
 
; Example: Bitcoin mining reward
2024-01-15 * "BTC Mining Reward - Slush Pool"
  Assets:Crypto:Mining:BTC    0.01 BTC {45000.00 USD}
  Income:Crypto:Mining:BTC  -450.00 USD  ; 0.01 * 45,000.00

Dépenses de minage

; Template: Mining operational expenses
YYYY-MM-DD * "Mining [EXPENSE_TYPE] - [PERIOD]"
  Expenses:Crypto:Mining:[EXPENSE_TYPE]  [AMOUNT] USD
  Assets:Checking                       -[AMOUNT] USD
 
; Example: Mining electricity costs
2024-01-31 * "Mining Electricity - January"
  Expenses:Crypto:Mining:Electricity  800.00 USD
  Assets:Checking                    -800.00 USD

Modèles d'airdrop

Airdrops de jetons

; Template: Receive token airdrop
YYYY-MM-DD * "[TOKEN] Airdrop from [PROJECT]"
  Assets:Crypto:Wallet:[WALLET]:[TOKEN]  [AMOUNT] [TOKEN] {[PRICE] USD}
  Income:Crypto:Airdrops                -[VALUE] USD  ; [VALUE] = [AMOUNT] * [PRICE]
 
; Example: UNI token airdrop
2024-03-01 * "UNI Airdrop from Uniswap"
  Assets:Crypto:Wallet:MetaMask:UNI   400 UNI {8.00 USD}
  Income:Crypto:Airdrops            -3200.00 USD  ; 400 * 8.00

Comme une récompense de staking, la valeur reconnue de l'airdrop devient sa base de coût. Enregistrez le prix que vous pouvez défendre — la première cotation liquide du jeton, provenant d'une source que vous nommez — plutôt qu'un chiffre rond.

Modèles avancés

Arbitrage de prêt flash

Ce bloc est du pseudocode, pas un modèle. Il esquisse la séquence des mouvements de valeur à l'intérieur d'un prêt flash. Il ne se chargera pas même après avoir remplacé les valeurs, car les lignes vides entre les groupes terminent la transaction — Beancount signale une erreur de syntaxe sur les écritures qui suivent une ligne vide. Enregistrez un vrai prêt flash comme une transaction unique sans lignes vides (en étiquetant les jambes avec des commentaires ; en retrait), en supprimant les jambes intermédiaires qui s'annulent à zéro dans le même bloc.

Pseudocode: flash loan arbitrage
 
  borrow      Assets:Crypto:Temp:FlashLoan       +[LOAN_AMOUNT] [TOKEN]
              Liabilities:DeFi:[PROTOCOL]:Flash  -[LOAN_AMOUNT] [TOKEN]
 
  execute     Assets:Crypto:Temp:FlashLoan       -[LOAN_AMOUNT] [TOKEN]
              Assets:Crypto:Temp:Arbitrage       +[RETURN_AMOUNT] [TOKEN]
 
  repay       Liabilities:DeFi:[PROTOCOL]:Flash  +[LOAN_AMOUNT] [TOKEN]
              Assets:Crypto:Temp:Arbitrage       -[LOAN_PLUS_FEE] [TOKEN]
 
  keep        Assets:Crypto:Wallet:[WALLET]:[TOKEN]  +[PROFIT] [TOKEN]
              Income:Crypto:Arbitrage                -[PROFIT_USD] USD

Tout ce que le prêt a touché est parti à la fin du bloc, donc ce que le grand livre doit réellement enregistrer, c'est le profit et les frais de protocole. L'exemple d'arbitrage dans le guide de suivi de portefeuille montre la forme de transaction unique.

Pont entre chaînes

; Template: Bridge assets across chains
YYYY-MM-DD * "Bridge [AMOUNT] [TOKEN] from [CHAIN1] to [CHAIN2]"
  Assets:Crypto:[CHAIN1]:[TOKEN]     -[AMOUNT] [TOKEN] {[PRICE] USD}
  Assets:Crypto:[CHAIN2]:[TOKEN]      [AMOUNT] [TOKEN] {[PRICE] USD}
  Expenses:Crypto:Bridge:Fees         [FEE] [TOKEN] {[PRICE] USD}
  Assets:Crypto:[CHAIN1]:[TOKEN]     -[FEE] [TOKEN] {[PRICE] USD}
 
; Example: Bridge ETH to Polygon
2024-02-05 * "Bridge 5 ETH from Ethereum to Polygon"
  Assets:Crypto:Ethereum:ETH     -5 ETH {2600.00 USD}
  Assets:Crypto:Polygon:ETH       5 ETH {2600.00 USD}
  Expenses:Crypto:Bridge:Fees    0.01 ETH {2600.00 USD}
  Assets:Crypto:Ethereum:ETH    -0.01 ETH {2600.00 USD}

Modèles optimisés pour les impôts

Récolte de pertes fiscales

; Template: Tax loss harvesting
YYYY-MM-DD * "Tax loss harvesting - Sell [CRYPTO] at loss"
  Assets:Crypto:[EXCHANGE]:[CRYPTO]    -[AMOUNT] [CRYPTO] {[HIGH_COST_BASIS] USD}
  Assets:Crypto:[EXCHANGE]:USD          [PROCEEDS] USD
  Expenses:Crypto:Fees:Trading          [FEE] USD
  Assets:Crypto:[EXCHANGE]:USD         -[FEE] USD
  Expenses:CapitalLoss:Crypto           [LOSS] USD
 
; Example: Harvest ADA loss
2024-12-15 * "Tax loss harvesting - Sell ADA at loss"
  Assets:Crypto:Binance:ADA      -1000 ADA {0.60 USD} @ 0.45 USD
  Assets:Crypto:Binance:USD       450.00 USD  ; gross proceeds, 1,000 * 0.45
  Expenses:Crypto:Fees:Trading      5.00 USD
  Assets:Crypto:Binance:USD        -5.00 USD
  Expenses:CapitalLoss:Crypto     150.00 USD  ; 600.00 basis - 450.00 proceeds

La perte est l'image miroir d'un gain : 600,00 $ de base sortent, 450,00 $ de produit brut arrivent, et la différence de 150,00 $ est une écriture positive sur un compte de dépenses. 445,00 $ d'espèces sont ce qui arrive réellement, après les frais de 5,00 $.

Gains en capital à long terme

; Template: Long-term capital gains sale
YYYY-MM-DD * "Long-term sale - [CRYPTO] held > 1 year"
  date-acquired: "[PURCHASE_DATE]"
  holding-period: "[DAYS] days"
  Assets:Crypto:[EXCHANGE]:[CRYPTO]    -[AMOUNT] [CRYPTO] {[COST_BASIS] USD} @ [SALE_PRICE] USD
  Assets:Crypto:[EXCHANGE]:USD          [GROSS_PROCEEDS] USD
  Expenses:Crypto:Fees:Trading          [FEE] USD
  Assets:Crypto:[EXCHANGE]:USD         -[FEE] USD
  Income:CapitalGains:LongTerm         -[GAIN] USD
 
; Example: Long-term BTC sale
2025-02-01 * "Long-term sale - BTC held 382 days"
  date-acquired: "2024-01-15"
  holding-period: "382 days"
  Assets:Crypto:Coinbase:BTC     -1.0 BTC {45000.00 USD} @ 55000.00 USD
  Assets:Crypto:Coinbase:USD   55000.00 USD
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
  Income:CapitalGains:LongTerm -10000.00 USD  ; 55,000.00 proceeds - 45,000.00 basis

Le gain est de 10 000,00 $, pas 9 950,00 $ : les 50,00 $ de frais sont déjà enregistrés comme dépense, donc les compenser dans le gain les déduirait deux fois. Income:CapitalGains:LongTerm est un compte séparé de Income:CapitalGains:Crypto uniquement pour que la période de détention soit visible dans un rapport — Beancount ne calcule pas les périodes de détention pour vous, c'est pourquoi les métadonnées date-acquise et période-de-détention valent la peine d'être portées.

Modèles de rapprochement

Vérification mensuelle du solde

; Template: Monthly balance assertions
YYYY-MM-DD balance Assets:Crypto:[EXCHANGE]:[CRYPTO]  [EXPECTED_BALANCE] [CRYPTO]
YYYY-MM-DD balance Assets:Crypto:Wallet:[WALLET]:[CRYPTO]  [EXPECTED_BALANCE] [CRYPTO]
 
; Example: January balance verification
2024-01-31 balance Assets:Crypto:Coinbase:BTC    2.5 BTC
2024-01-31 balance Assets:Crypto:Binance:ETH    15.0 ETH
2024-01-31 balance Assets:Crypto:Wallet:Ledger:BTC  1.0 BTC

Contrairement aux autres exemples ici, celui-ci n'est pas autonome par conception : les montants sont ceux que vos propres écrans de plateforme indiquent, et l'affirmation échoue jusqu'à ce que vos transactions soient dans le grand livre — c'est tout l'intérêt. Notez que balance vérifie le solde au début du jour nommé, donc datez l'affirmation le jour après la période que vous clôturez.

Mises à jour des prix

; Template: Daily price updates
YYYY-MM-DD price [CRYPTO] [PRICE] USD
 
; Example: Daily prices
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD
2024-01-15 price ADA 0.50 USD

Instructions d'utilisation

  1. Copiez le modèle pertinent pour votre type de transaction

  2. Remplacez chaque espace réservé. Un modèle n'est pas un Beancount valide tant que AAAA-MM-JJ et chaque jeton [ENTRE CROCHETS] n'ont pas disparu — les crochets ne sont pas la syntaxe de Beancount, et un crochet restant est une erreur d'analyse, pas une valeur ignorée silencieusement. La substitution est mécanique :

    Espace réservéSubstitutExemple
    AAAA-MM-JJla date de la transaction2024-03-20
    [MONTANT]unités de la commodité, sans guillemets0.5
    [CRYPTO]le symbole de la commodité, en majusculesBTC
    [PLATEFORME]le composant de compte pour le lieuCoinbase
    [BASE_DE_COUT]le coût par unité du lot que vous retirez45000.00
    [PRIX_DE_VENTE]le prix par unité auquel vous avez vendu48000.00
    [PRODUIT_BRUT][MONTANT] × [PRIX_DE_VENTE], avant frais24000.00
    [FRAIS]les frais de la plateforme, dans la devise facturée30.00
    [GAIN][PRODUIT_BRUT][MONTANT] × [BASE_DE_COUT]1500.00

    Substituer cette colonne dans le modèle de Vente de cryptomonnaie reproduit l'exemple travaillé imprimé en dessous, ce qui est le moyen le plus rapide de vérifier que vous avez bien lu le modèle.

  3. Ajustez les noms de comptes pour correspondre à votre structure de comptes, et assurez-vous que chacun est ouvert par le Modèle de structure de comptes — un compte jamais ouvert est une erreur de chargement, pas un avertissement

  4. Ajoutez des métadonnées si nécessaire pour le rapport fiscal ou le suivi

  5. Vérifiez les calculs avec bea --file votre-fichier.bean check avant de finaliser les écritures. Une écriture qui ne s'équilibre pas, ou qui réduit un lot que vous ne détenez pas, échoue là plutôt que de produire silencieusement un rapport erroné

Meilleures pratiques

  • Utilisez des conventions de nommage cohérentes
  • Incluez les identifiants de transaction dans les métadonnées
  • Documentez les transactions complexes en profondeur
  • Vérifiez les taux de change et les prix
  • Maintenez des sauvegardes régulières de vos fichiers

Ces modèles fournissent une base solide pour la comptabilité des cryptomonnaies dans Beancount.io. Personnalisez-les en fonction de vos besoins spécifiques et de vos habitudes de trading.

Source : https://beancount.io/fr/docs/Tips/cryptocurrency-templates-examples