Aller au contenu principal

Modèles de transactions crypto Beancount prêts à copier

Des modèles Beancount à remplir, chacun accompagné d'un exemple chargeable, pour les achats, ventes, échanges, transferts, staking, prêts DeFi, mining et airdrops de crypto.

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

Comment lire ces blocs​

Chaque bloc délimité ci-dessous relève de l'une de ces trois catégories, et elles ne sont pas interchangeables :

  • Les modèles contiennent des espaces réservés [ENTRE_CROCHETS] et des dates YYYY-MM-DD. Ils ne se chargeront pas tant que vous n'aurez pas remplacé ces valeurs par des valeurs réelles — les crochets ne font pas partie de la syntaxe Beancount.
  • Les exemples se trouvent directement sous leur modèle, portent des dates et des montants réels, et sont écrits pour se charger. Chacun d'eux a néanmoins besoin que les comptes qu'il touche soient ouverts, ce à quoi sert le Modèle de structure de comptes ci-dessous. La seule exception est le bloc de rapprochement, qui n'affirme que des soldes que votre propre registre peut satisfaire.
  • Le bloc Arbitrage par prêt flash est du pseudocode, et il est étiqueté comme tel là où il apparaît.

Deux conventions traversent l'ensemble :

  • Les comptes de produits portent des crédits, ils sont donc 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:…. Inverser cela est la façon la plus courante de faire échouer l'équilibre d'une écriture crypto.
  • Des frais sont enregistrés une fois en charge et une fois en diminution de trésorerie. Le produit brut va sur le compte de trésorerie, les frais en ressortent, et la différence est ce qui arrive réellement sur votre compte.

Explorez un registre d'exemple crypto en direct :

Ouvrir Registre d'exemple crypto 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 $ US au coût, la vente rapporte 24 000,00 $ US brut, et 30,00 $ US de ce montant vont à la plateforme — ainsi 23 970,00 $ US de trésorerie arrivent et 1 500,00 $ US de gain sont réalisés. Ne compensez pas les frais dans le gain : les frais sont déjà une charge, et les soustraire une seconde fois est ce qui déséquilibre la transaction.

É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 crypto-contre-crypto cède le premier instrument, il réalise donc un gain exactement comme une vente contre trésorerie : 20 ETH acquis à 2 400,00 $ US représentent 48 000,00 $ US de valeur reçue contre 46 000,00 $ US de base du BTC. Les 40,00 $ US de frais sont payés en trésorerie 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, il ne réalise donc rien : le même coût {45000.00 USD} voyage avec les coins 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 passés en charge à ce même coût, ils ne réalisent donc pas de gain non plus — si votre traitement dit le contraire, valorisez les frais avec @ et ajoutez une écriture de gain. Et le compte émetteur doit déjà détenir 1,0005 BTC à ce coût exact, pas 1,0, car les frais proviennent du même lot. Une diminution sans lot correspondant ne s'enregistre pas, quelle que soit la cohérence 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 produit reçu en nature, les deux écritures décrivent donc le même événement des deux côtés : 0,08 ETH arrivent avec une base de 2 600,00 $ US par unité, et les 208,00 $ US de produit correspondants sont un crédit — négatif. Le {2,600.00 USD} est un prix externe que vous devez sourcer 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 $ US constituent également la base de coût de la récompense à partir de maintenant. Lorsque vous vendrez finalement les 0,08 ETH, seule la variation depuis cette date est un gain — les 208,00 $ US ont déjà été imposés comme revenu et ne doivent pas être reconnus deux fois. Le fait que le revenu soit imposable à la réception ou à la cession varie selon la juridiction ; le registre 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 cet échange instrument par instrument : 25 000,00 $ US d'ETH plus 25 000,00 $ US d'USDC sortent, 50 000,00 $ US de jeton LP arrivent, et les frais de gas déplacent 50,00 $ US d'ETH du portefeuille vers une charge. La branche stablecoin porte @ 1.00 USD car elle est détenue sans base de coût — sans l'annotation de prix, sa pondération est de 25 000 USDC, qui ne peut pas annuler des dollars. Dans de nombreuses juridictions, déposer dans un pool constitue en soi une cession des deux jetons ; cette écriture reporte délibérément la base, ajoutez donc 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 font que celle-ci se charge. La branche USDC porte @ 1.00 USD afin que les deux côtés de l'échange se pondèrent dans la même devise — sans cela Beancount voit 10 000,00 $ US de CUSDC apparaître contre 10 000 unités d'USDC qui disparaissent, ce sont des instruments différents et ils ne s'annulent pas. Et le jeton de reçu est CUSDC, pas cUSDC : une première lettre en minuscule est une erreur de lexer à la fois dans un composant de compte et dans un symbole d'instrument, quelle que soit l'orthographe du protocole dans sa propre 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 justifier — 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. Enregistrez un vrai prêt flash comme une seule transaction sans lignes vides (en étiquetant les branches avec des commentaires ; indentés), en supprimant les branches 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é a disparu à la fin du bloc, ce que le registre doit réellement enregistrer est donc le profit et les frais du protocole. L'exemple d'arbitrage dans le guide de suivi de portefeuille montre la forme en une seule transaction.

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 $ US de base sortent, 450,00 $ US de produit brut arrivent, et la différence de 150,00 $ US est une écriture positive sur un compte de charges. 445,00 $ US de trésorerie est ce qui arrive réellement, après les 5,00 $ US de frais.

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 $ US, pas de 9 950,00 $ US : les 50,00 $ US de frais sont déjà enregistrés en charge, les compenser dans le gain les déduirait deux fois. Income:CapitalGains:LongTerm est un compte distinct 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-acquired et holding-period valent la peine d'être conservé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 qu'affichent vos propres écrans de plateforme, et l'assertion échoue tant que vos transactions ne sont pas dans le registre — ce qui est tout l'intérêt. Notez que balance vérifie le solde au début du jour nommé, datez donc l'assertion du jour suivant 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

Pour un registre hébergé, Live Prices peut maintenir automatiquement les prix de valorisation crypto pris en charge. Conservez les prix statiques ci-dessus pour des exemples reproductibles. Les prix gérés ne renseignent pas un prix de transaction, un revenu de staking ou une base de coût d'airdrop ; enregistrez ces valeurs de transaction explicitement.

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 du Beancount valide tant que YYYY-MM-DD et chaque jeton [ENTRE_CROCHETS] n'ont pas disparu — les crochets ne font pas partie de la syntaxe Beancount, et un crochet restant est une erreur d'analyse, pas une valeur silencieusement ignorée. La substitution est mécanique :

    Espace réservéSubstitutExemple
    YYYY-MM-DDla date de la transaction2024-03-20
    [AMOUNT]unités de l'instrument, sans guillemets0.5
    [CRYPTO]le symbole de l'instrument, en majusculesBTC
    [EXCHANGE]le composant de compte de la plateformeCoinbase
    [COST_BASIS]le coût par unité du lot que vous retirez45000.00
    [SALE_PRICE]le prix par unité auquel vous avez vendu48000.00
    [GROSS_PROCEEDS][AMOUNT] × [SALE_PRICE], avant frais24000.00
    [FEE]les frais de la plateforme, dans la devise facturée30.00
    [GAIN][GROSS_PROCEEDS] − [AMOUNT] × [COST_BASIS]1500.00

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

  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 selon les besoins pour le reporting fiscal ou le suivi

  5. Vérifiez les calculs avec bea --file your-file.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 ici 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 soigneusement les transactions complexes
  • 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